devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] hwmon: kirkwood: Add DT bindings to gpio-fan for DNS-32[05]
@ 2012-09-07 16:34 Jamie Lentin
  2012-09-07 16:34 ` [PATCH 1/2] hwmon: Add devicetree bindings to gpio-fan Jamie Lentin
                   ` (2 more replies)
  0 siblings, 3 replies; 16+ messages in thread
From: Jamie Lentin @ 2012-09-07 16:34 UTC (permalink / raw)
  To: Grant Likely, Rob Herring, Jean Delvare, Guenter Roeck,
	Jason Cooper, Andrew Lunn
  Cc: devicetree-discuss, Jamie Lentin, linux-arm-kernel

This is an attempt at getting DT support into gpio-fan, in a similar
fashion to gpio-leds and gpio-keys. I guess the most contentious bit is
going to be the bindings.

Tested on a D-Link DNS-320.

Feedback appreciated!

Jamie Lentin (2):
  hwmon: Add devicetree bindings to gpio-fan
  ARM: kirkwood: Use devicetree to define DNS-32[05] fan

 .../devicetree/bindings/gpio/gpio-fan.txt          |   25 +++++
 arch/arm/boot/dts/kirkwood-dnskw.dtsi              |   10 ++
 arch/arm/mach-kirkwood/board-dnskw.c               |   25 -----
 drivers/hwmon/gpio-fan.c                           |  111 ++++++++++++++++++++
 4 files changed, 146 insertions(+), 25 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/gpio/gpio-fan.txt

-- 
1.7.10.4

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH 1/2] hwmon: Add devicetree bindings to gpio-fan
  2012-09-07 16:34 [PATCH 0/2] hwmon: kirkwood: Add DT bindings to gpio-fan for DNS-32[05] Jamie Lentin
@ 2012-09-07 16:34 ` Jamie Lentin
  2012-09-07 18:36   ` Guenter Roeck
       [not found]   ` <1347035675-23907-2-git-send-email-jm-Pj/HzkgeCk7QXOPxS62xeg@public.gmane.org>
  2012-09-07 16:34 ` [PATCH 2/2] ARM: kirkwood: Use devicetree to define DNS-32[05] fan Jamie Lentin
       [not found] ` <1347035675-23907-1-git-send-email-jm-Pj/HzkgeCk7QXOPxS62xeg@public.gmane.org>
  2 siblings, 2 replies; 16+ messages in thread
From: Jamie Lentin @ 2012-09-07 16:34 UTC (permalink / raw)
  To: Grant Likely, Rob Herring, Jean Delvare, Guenter Roeck,
	Jason Cooper, Andrew Lunn
  Cc: devicetree-discuss, Jamie Lentin, linux-arm-kernel

Allow a gpio-fan to be defined in devicetree, see binding documentation
for details.

Signed-off-by: Jamie Lentin <jm@lentin.co.uk>
---
 .../devicetree/bindings/gpio/gpio-fan.txt          |   25 +++++
 drivers/hwmon/gpio-fan.c                           |  111 ++++++++++++++++++++
 2 files changed, 136 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/gpio/gpio-fan.txt

diff --git a/Documentation/devicetree/bindings/gpio/gpio-fan.txt b/Documentation/devicetree/bindings/gpio/gpio-fan.txt
new file mode 100644
index 0000000..2dd457a
--- /dev/null
+++ b/Documentation/devicetree/bindings/gpio/gpio-fan.txt
@@ -0,0 +1,25 @@
+Bindings for fan connected to GPIO lines
+
+Required properties:
+- compatible : "gpio-fan"
+- gpios: Specifies the pins that map to bits in the control value,
+  ordered MSB-->LSB.
+- gpio-fan,speed-map: A mapping of possible fan RPM speeds and the
+  control value that should be set to achieve them. This array
+  must have the RPM values in ascending order.
+
+Optional properties:
+- alarm-gpios: This pin going active indicates something is wrong with
+  the fan, and a udev event will be fired.
+
+Examples:
+
+	gpio_fan {
+		compatible = "gpio-fan";
+		gpios = <&gpio1 14 1
+			 &gpio1 13 1>;
+		gpio-fan,speed-map = <0    0
+				      3000 1
+				      6000 2>;
+		alarm-gpios = <&gpio1 15 1>;
+	};
diff --git a/drivers/hwmon/gpio-fan.c b/drivers/hwmon/gpio-fan.c
index 2f4b01b..876ce41 100644
--- a/drivers/hwmon/gpio-fan.c
+++ b/drivers/hwmon/gpio-fan.c
@@ -31,6 +31,8 @@
 #include <linux/hwmon.h>
 #include <linux/gpio.h>
 #include <linux/gpio-fan.h>
+#include <linux/of_platform.h>
+#include <linux/of_gpio.h>
 
 struct gpio_fan_data {
 	struct platform_device	*pdev;
@@ -400,12 +402,120 @@ static ssize_t show_name(struct device *dev,
 
 static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
 
+
+#ifdef CONFIG_OF
+/*
+ * Translate OpenFirmware node properties into platform_data
+ */
+static int gpio_fan_get_of_pdata(struct device *dev,
+			    struct gpio_fan_platform_data *pdata)
+{
+	struct device_node *node;
+	struct gpio_fan_speed  *speed;
+	unsigned *ctrl;
+	unsigned i;
+	u32 u;
+	struct property *prop;
+	const __be32 *p;
+
+	node = dev->of_node;
+
+	/* Fill GPIO pin array */
+	pdata->num_ctrl = of_gpio_count(node);
+	ctrl = devm_kzalloc(dev, pdata->num_ctrl * sizeof(unsigned),
+				GFP_KERNEL);
+	if (!ctrl)
+		return -ENOMEM;
+	for (i = 0; i < of_gpio_count(node); i++) {
+		int val;
+
+		val = of_get_gpio(node, i);
+		if (val >= 0)
+			ctrl[i] = val;
+		else
+			return -EINVAL;
+	}
+	pdata->ctrl = ctrl;
+
+	/* Get speed map array size */
+	i = 0;
+	of_property_for_each_u32(node, "gpio-fan,speed-map", prop, p, u)
+		i++;
+	if (i & 1) {
+		dev_err(dev, "gpio-fan,speed-map contains odd number of entries");
+		return -ENODEV;
+	}
+	pdata->num_speed = i >> 1;
+	speed = devm_kzalloc(dev,
+			pdata->num_speed * sizeof(struct gpio_fan_speed),
+			GFP_KERNEL);
+	if (!speed)
+		return -ENOMEM;
+
+	/* Populate speed map */
+	i = 0;
+	of_property_for_each_u32(node, "gpio-fan,speed-map", prop, p, u) {
+		if (i & 1)
+			speed[i >> 1].ctrl_val = (int)u;
+		else
+			speed[i >> 1].rpm = (int)u;
+		i++;
+	}
+	pdata->speed = speed;
+
+	/* Alarm GPIO if one exists */
+	if (of_gpio_named_count(node, "alarm-gpios")) {
+		struct gpio_fan_alarm *alarm;
+		int val;
+		enum of_gpio_flags flags;
+
+		alarm = devm_kzalloc(dev, sizeof(struct gpio_fan_alarm),
+					GFP_KERNEL);
+		if (!alarm)
+			return -ENOMEM;
+
+		val = of_get_named_gpio_flags(node, "alarm-gpios", 0, &flags);
+		if (val >= 0) {
+			alarm->gpio = val;
+			alarm->active_low = flags & OF_GPIO_ACTIVE_LOW;
+		} else
+			return -EINVAL;
+
+		pdata->alarm = alarm;
+	}
+
+	return 0;
+}
+
+static const struct of_device_id of_gpio_fan_match[] = {
+	{ .compatible = "gpio-fan", },
+	{},
+};
+#endif /* CONFIG_OF_GPIO */
+
 static int __devinit gpio_fan_probe(struct platform_device *pdev)
 {
 	int err;
 	struct gpio_fan_data *fan_data;
 	struct gpio_fan_platform_data *pdata = pdev->dev.platform_data;
 
+#ifdef CONFIG_OF
+	if (!pdata) {
+		struct gpio_fan_platform_data *alt_pdata;
+
+		alt_pdata = devm_kzalloc(&pdev->dev,
+					sizeof(struct gpio_fan_platform_data),
+					GFP_KERNEL);
+		if (!alt_pdata)
+			return -ENOMEM;
+
+		err = gpio_fan_get_of_pdata(&pdev->dev, alt_pdata);
+		if (err)
+			return err;
+		pdata = alt_pdata;
+	}
+#endif /* CONFIG_OF_GPIO */
+
 	if (!pdata)
 		return -EINVAL;
 
@@ -511,6 +621,7 @@ static struct platform_driver gpio_fan_driver = {
 	.driver	= {
 		.name	= "gpio-fan",
 		.pm	= GPIO_FAN_PM,
+		.of_match_table = of_match_ptr(of_gpio_fan_match),
 	},
 };
 
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 2/2] ARM: kirkwood: Use devicetree to define DNS-32[05] fan
  2012-09-07 16:34 [PATCH 0/2] hwmon: kirkwood: Add DT bindings to gpio-fan for DNS-32[05] Jamie Lentin
  2012-09-07 16:34 ` [PATCH 1/2] hwmon: Add devicetree bindings to gpio-fan Jamie Lentin
@ 2012-09-07 16:34 ` Jamie Lentin
       [not found]   ` <1347035675-23907-3-git-send-email-jm-Pj/HzkgeCk7QXOPxS62xeg@public.gmane.org>
       [not found] ` <1347035675-23907-1-git-send-email-jm-Pj/HzkgeCk7QXOPxS62xeg@public.gmane.org>
  2 siblings, 1 reply; 16+ messages in thread
From: Jamie Lentin @ 2012-09-07 16:34 UTC (permalink / raw)
  To: Grant Likely, Rob Herring, Jean Delvare, Guenter Roeck,
	Jason Cooper, Andrew Lunn
  Cc: devicetree-discuss, Jamie Lentin, linux-arm-kernel

Remove more board-specific code by using devicetree to define the fan
attached to both boards.

Signed-off-by: Jamie Lentin <jm@lentin.co.uk>
---
 arch/arm/boot/dts/kirkwood-dnskw.dtsi |   10 ++++++++++
 arch/arm/mach-kirkwood/board-dnskw.c  |   25 -------------------------
 2 files changed, 10 insertions(+), 25 deletions(-)

diff --git a/arch/arm/boot/dts/kirkwood-dnskw.dtsi b/arch/arm/boot/dts/kirkwood-dnskw.dtsi
index 7408655..9b32d02 100644
--- a/arch/arm/boot/dts/kirkwood-dnskw.dtsi
+++ b/arch/arm/boot/dts/kirkwood-dnskw.dtsi
@@ -25,6 +25,16 @@
 		};
 	};
 
+	gpio_fan {
+		/* Fan: ADDA AD045HB-G73 40mm 6000rpm@5v */
+		compatible = "gpio-fan";
+		gpios = <&gpio1 14 1
+			 &gpio1 13 1>;
+		gpio-fan,speed-map = <0    0
+				      3000 1
+				      6000 2>;
+	};
+
 	ocp@f1000000 {
 		sata@80000 {
 			status = "okay";
diff --git a/arch/arm/mach-kirkwood/board-dnskw.c b/arch/arm/mach-kirkwood/board-dnskw.c
index 4ab3506..e202a07 100644
--- a/arch/arm/mach-kirkwood/board-dnskw.c
+++ b/arch/arm/mach-kirkwood/board-dnskw.c
@@ -67,29 +67,6 @@ static unsigned int dnskw_mpp_config[] __initdata = {
 	0
 };
 
-/* Fan: ADDA AD045HB-G73 40mm 6000rpm@5v */
-static struct gpio_fan_speed dnskw_fan_speed[] = {
-	{    0,  0 },
-	{ 3000,	 1 },
-	{ 6000,	 2 },
-};
-static unsigned dnskw_fan_pins[] = {46, 45};
-
-static struct gpio_fan_platform_data dnskw_fan_data = {
-	.num_ctrl	= ARRAY_SIZE(dnskw_fan_pins),
-	.ctrl		= dnskw_fan_pins,
-	.num_speed	= ARRAY_SIZE(dnskw_fan_speed),
-	.speed		= dnskw_fan_speed,
-};
-
-static struct platform_device dnskw_fan_device = {
-	.name	= "gpio-fan",
-	.id	= -1,
-	.dev	= {
-		.platform_data	= &dnskw_fan_data,
-	},
-};
-
 static void dnskw_power_off(void)
 {
 	gpio_set_value(36, 1);
@@ -114,8 +91,6 @@ void __init dnskw_init(void)
 	kirkwood_ehci_init();
 	kirkwood_ge00_init(&dnskw_ge00_data);
 
-	platform_device_register(&dnskw_fan_device);
-
 	/* Register power-off GPIO. */
 	if (gpio_request(36, "dnskw:power:off") == 0
 	    && gpio_direction_output(36, 0) == 0)
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [PATCH 1/2] hwmon: Add devicetree bindings to gpio-fan
  2012-09-07 16:34 ` [PATCH 1/2] hwmon: Add devicetree bindings to gpio-fan Jamie Lentin
@ 2012-09-07 18:36   ` Guenter Roeck
       [not found]   ` <1347035675-23907-2-git-send-email-jm-Pj/HzkgeCk7QXOPxS62xeg@public.gmane.org>
  1 sibling, 0 replies; 16+ messages in thread
From: Guenter Roeck @ 2012-09-07 18:36 UTC (permalink / raw)
  To: Jamie Lentin
  Cc: Andrew Lunn, Jason Cooper, devicetree-discuss, Rob Herring,
	Grant Likely, Jean Delvare, linux-arm-kernel

On Fri, Sep 07, 2012 at 05:34:34PM +0100, Jamie Lentin wrote:
> Allow a gpio-fan to be defined in devicetree, see binding documentation
> for details.
> 
> Signed-off-by: Jamie Lentin <jm@lentin.co.uk>
> ---
>  .../devicetree/bindings/gpio/gpio-fan.txt          |   25 +++++
>  drivers/hwmon/gpio-fan.c                           |  111 ++++++++++++++++++++
>  2 files changed, 136 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/gpio/gpio-fan.txt
> 
> diff --git a/Documentation/devicetree/bindings/gpio/gpio-fan.txt b/Documentation/devicetree/bindings/gpio/gpio-fan.txt
> new file mode 100644
> index 0000000..2dd457a
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/gpio/gpio-fan.txt
> @@ -0,0 +1,25 @@
> +Bindings for fan connected to GPIO lines
> +
> +Required properties:
> +- compatible : "gpio-fan"
> +- gpios: Specifies the pins that map to bits in the control value,
> +  ordered MSB-->LSB.
> +- gpio-fan,speed-map: A mapping of possible fan RPM speeds and the
> +  control value that should be set to achieve them. This array
> +  must have the RPM values in ascending order.
> +
> +Optional properties:
> +- alarm-gpios: This pin going active indicates something is wrong with
> +  the fan, and a udev event will be fired.
> +
> +Examples:
> +
> +	gpio_fan {
> +		compatible = "gpio-fan";
> +		gpios = <&gpio1 14 1
> +			 &gpio1 13 1>;
> +		gpio-fan,speed-map = <0    0
> +				      3000 1
> +				      6000 2>;
> +		alarm-gpios = <&gpio1 15 1>;
> +	};
> diff --git a/drivers/hwmon/gpio-fan.c b/drivers/hwmon/gpio-fan.c
> index 2f4b01b..876ce41 100644
> --- a/drivers/hwmon/gpio-fan.c
> +++ b/drivers/hwmon/gpio-fan.c
> @@ -31,6 +31,8 @@
>  #include <linux/hwmon.h>
>  #include <linux/gpio.h>
>  #include <linux/gpio-fan.h>
> +#include <linux/of_platform.h>
> +#include <linux/of_gpio.h>
>  
>  struct gpio_fan_data {
>  	struct platform_device	*pdev;
> @@ -400,12 +402,120 @@ static ssize_t show_name(struct device *dev,
>  
>  static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
>  
> +
> +#ifdef CONFIG_OF
> +/*
> + * Translate OpenFirmware node properties into platform_data
> + */
> +static int gpio_fan_get_of_pdata(struct device *dev,
> +			    struct gpio_fan_platform_data *pdata)
> +{
> +	struct device_node *node;
> +	struct gpio_fan_speed  *speed;
> +	unsigned *ctrl;
> +	unsigned i;
> +	u32 u;
> +	struct property *prop;
> +	const __be32 *p;
> +
> +	node = dev->of_node;
> +
> +	/* Fill GPIO pin array */
> +	pdata->num_ctrl = of_gpio_count(node);
> +	ctrl = devm_kzalloc(dev, pdata->num_ctrl * sizeof(unsigned),
> +				GFP_KERNEL);
> +	if (!ctrl)
> +		return -ENOMEM;
> +	for (i = 0; i < of_gpio_count(node); i++) {
> +		int val;
> +
> +		val = of_get_gpio(node, i);
> +		if (val >= 0)
> +			ctrl[i] = val;
> +		else
> +			return -EINVAL;

I very much prefer not to hide the error code and reverse the logic.

		if (val < 0)
			return val;
		ctrl[i] = val;

> +	}
> +	pdata->ctrl = ctrl;
> +
> +	/* Get speed map array size */
> +	i = 0;
> +	of_property_for_each_u32(node, "gpio-fan,speed-map", prop, p, u)
> +		i++;

Looking through the of code, isn't there a function which returns the
number of elements ?

Something like
	int length;
	struct property *prop;
	
	prop = of_find_property(node, "gpio-fan,speed-map", &length);

> +	if (i & 1) {
> +		dev_err(dev, "gpio-fan,speed-map contains odd number of entries");
> +		return -ENODEV;
> +	}

How about i == 0 ?

> +	pdata->num_speed = i >> 1;
> +	speed = devm_kzalloc(dev,
> +			pdata->num_speed * sizeof(struct gpio_fan_speed),
> +			GFP_KERNEL);
> +	if (!speed)
> +		return -ENOMEM;
> +
> +	/* Populate speed map */
> +	i = 0;
> +	of_property_for_each_u32(node, "gpio-fan,speed-map", prop, p, u) {
> +		if (i & 1)
> +			speed[i >> 1].ctrl_val = (int)u;
> +		else
> +			speed[i >> 1].rpm = (int)u;

Are those type casts necessary ?

> +		i++;
> +	}
> +	pdata->speed = speed;
> +
> +	/* Alarm GPIO if one exists */
> +	if (of_gpio_named_count(node, "alarm-gpios")) {
> +		struct gpio_fan_alarm *alarm;
> +		int val;
> +		enum of_gpio_flags flags;
> +
> +		alarm = devm_kzalloc(dev, sizeof(struct gpio_fan_alarm),
> +					GFP_KERNEL);
> +		if (!alarm)
> +			return -ENOMEM;
> +
> +		val = of_get_named_gpio_flags(node, "alarm-gpios", 0, &flags);
> +		if (val >= 0) {
> +			alarm->gpio = val;
> +			alarm->active_low = flags & OF_GPIO_ACTIVE_LOW;
> +		} else
> +			return -EINVAL;
> +
How about
		if (val < 0)
			return val;
		alarm->gpio = val;
		alarm->active_low = flags & OF_GPIO_ACTIVE_LOW;

> +		pdata->alarm = alarm;
> +	}
> +
> +	return 0;
> +}
> +
> +static const struct of_device_id of_gpio_fan_match[] = {
> +	{ .compatible = "gpio-fan", },
> +	{},
> +};
> +#endif /* CONFIG_OF_GPIO */
> +
>  static int __devinit gpio_fan_probe(struct platform_device *pdev)
>  {
>  	int err;
>  	struct gpio_fan_data *fan_data;
>  	struct gpio_fan_platform_data *pdata = pdev->dev.platform_data;
>  
> +#ifdef CONFIG_OF
> +	if (!pdata) {
> +		struct gpio_fan_platform_data *alt_pdata;
> +
Why not just use pdata ? I don't really see a reason for introducing
a second variable. After all, we know here that pdata is NULL, and that it won't
be used.

> +		alt_pdata = devm_kzalloc(&pdev->dev,
> +					sizeof(struct gpio_fan_platform_data),
> +					GFP_KERNEL);
> +		if (!alt_pdata)
> +			return -ENOMEM;
> +
> +		err = gpio_fan_get_of_pdata(&pdev->dev, alt_pdata);
> +		if (err)
> +			return err;
> +		pdata = alt_pdata;
> +	}
> +#endif /* CONFIG_OF_GPIO */
> +
>  	if (!pdata)
>  		return -EINVAL;

#else case, maybe ?

>  
> @@ -511,6 +621,7 @@ static struct platform_driver gpio_fan_driver = {
>  	.driver	= {
>  		.name	= "gpio-fan",
>  		.pm	= GPIO_FAN_PM,
> +		.of_match_table = of_match_ptr(of_gpio_fan_match),
>  	},
>  };
>  
> -- 
> 1.7.10.4
> 
> 

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 2/2] ARM: kirkwood: Use devicetree to define DNS-32[05] fan
       [not found]   ` <1347035675-23907-3-git-send-email-jm-Pj/HzkgeCk7QXOPxS62xeg@public.gmane.org>
@ 2012-09-07 21:23     ` Andrew Lunn
  0 siblings, 0 replies; 16+ messages in thread
From: Andrew Lunn @ 2012-09-07 21:23 UTC (permalink / raw)
  To: Jamie Lentin
  Cc: Andrew Lunn, Jason Cooper,
	devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Rob Herring,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Jean Delvare,
	Guenter Roeck

> diff --git a/arch/arm/mach-kirkwood/board-dnskw.c b/arch/arm/mach-kirkwood/board-dnskw.c
> index 4ab3506..e202a07 100644
> --- a/arch/arm/mach-kirkwood/board-dnskw.c
> +++ b/arch/arm/mach-kirkwood/board-dnskw.c
> @@ -67,29 +67,6 @@ static unsigned int dnskw_mpp_config[] __initdata = {
>  	0
>  };
>  
> -/* Fan: ADDA AD045HB-G73 40mm 6000rpm@5v */
> -static struct gpio_fan_speed dnskw_fan_speed[] = {
> -	{    0,  0 },
> -	{ 3000,	 1 },
> -	{ 6000,	 2 },
> -};
> -static unsigned dnskw_fan_pins[] = {46, 45};
> -
> -static struct gpio_fan_platform_data dnskw_fan_data = {
> -	.num_ctrl	= ARRAY_SIZE(dnskw_fan_pins),
> -	.ctrl		= dnskw_fan_pins,
> -	.num_speed	= ARRAY_SIZE(dnskw_fan_speed),
> -	.speed		= dnskw_fan_speed,
> -};
> -
> -static struct platform_device dnskw_fan_device = {
> -	.name	= "gpio-fan",
> -	.id	= -1,
> -	.dev	= {
> -		.platform_data	= &dnskw_fan_data,
> -	},
> -};
> -
>  static void dnskw_power_off(void)
>  {
>  	gpio_set_value(36, 1);
> @@ -114,8 +91,6 @@ void __init dnskw_init(void)
>  	kirkwood_ehci_init();
>  	kirkwood_ge00_init(&dnskw_ge00_data);
>  
> -	platform_device_register(&dnskw_fan_device);
> -
>  	/* Register power-off GPIO. */
>  	if (gpio_request(36, "dnskw:power:off") == 0
>  	    && gpio_direction_output(36, 0) == 0)
> -- 
> 1.7.10.4
> 

Hi Jamie

Minor point. I expect you can remove the header file gpio-fan.h.

There are also a few other headers files which can be removed, but i
suggest you do this in a separate cleanup patch. I think
ata_platform.h, input.h, leds.h, map.h, bridge-regs.h and maybe also
kirkwood.h are no longer needed.

  Andrew

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 1/2] hwmon: Add devicetree bindings to gpio-fan
       [not found]   ` <1347035675-23907-2-git-send-email-jm-Pj/HzkgeCk7QXOPxS62xeg@public.gmane.org>
@ 2012-09-08  7:32     ` Andrew Lunn
  0 siblings, 0 replies; 16+ messages in thread
From: Andrew Lunn @ 2012-09-08  7:32 UTC (permalink / raw)
  To: Jamie Lentin
  Cc: Andrew Lunn, Jason Cooper,
	devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Rob Herring,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Jean Delvare,
	Guenter Roeck

Hi Jamie

> +static int gpio_fan_get_of_pdata(struct device *dev,
> +			    struct gpio_fan_platform_data *pdata)
> +{
> +	struct device_node *node;
> +	struct gpio_fan_speed  *speed;
> +	unsigned *ctrl;
> +	unsigned i;
> +	u32 u;
> +	struct property *prop;
> +	const __be32 *p;
> +
> +	node = dev->of_node;
> +
> +	/* Fill GPIO pin array */
> +	pdata->num_ctrl = of_gpio_count(node);
> +	ctrl = devm_kzalloc(dev, pdata->num_ctrl * sizeof(unsigned),
> +				GFP_KERNEL);
> +	if (!ctrl)
> +		return -ENOMEM;
> +	for (i = 0; i < of_gpio_count(node); i++) {


It seems unlikely the number of gpio pins is going to change while
inside this loop. So just use pdata->num_ctrl instead of counting them
every iteration.

> +		int val;
> +
> +		val = of_get_gpio(node, i);
> +		if (val >= 0)
> +			ctrl[i] = val;
> +		else
> +			return -EINVAL;
> +	}
> +	pdata->ctrl = ctrl;
> +
> +	/* Get speed map array size */
> +	i = 0;
> +	of_property_for_each_u32(node, "gpio-fan,speed-map", prop, p, u)
> +		i++;
> +	if (i & 1) {
> +		dev_err(dev, "gpio-fan,speed-map contains odd number of entries");
> +		return -ENODEV;
> +	}

This is not so clear on the first reading. i is the number of numbers
in the speed-map, and each entry needs two numbers, hence the (i & 1).
Maybe a comment to explain this? Or see if there is an of_ function
which returns records instead of individual properties?

> +static const struct of_device_id of_gpio_fan_match[] = {
> +	{ .compatible = "gpio-fan", },
> +	{},
> +};

This should probably have an __devinitdata attribute.

     Andrew

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH V2 0/2] hwmon: kirkwood: Add DT bindings to gpio-fan for DNS-32[05]
       [not found] ` <1347035675-23907-1-git-send-email-jm-Pj/HzkgeCk7QXOPxS62xeg@public.gmane.org>
@ 2012-09-10 13:51   ` Jamie Lentin
       [not found]     ` <1347285112-13542-1-git-send-email-jm-Pj/HzkgeCk7QXOPxS62xeg@public.gmane.org>
  0 siblings, 1 reply; 16+ messages in thread
From: Jamie Lentin @ 2012-09-10 13:51 UTC (permalink / raw)
  To: Grant Likely, Rob Herring, Jean Delvare, Guenter Roeck,
	Jason Cooper, Andrew Lunn
  Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Jamie Lentin,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r

Thanks to Guenter & Andrew---all the feedback made sense, and hopefully
this patchset addresses everything.

This is an attempt at getting DT support into gpio-fan, in a similar
fashion to gpio-leds and gpio-keys. I guess the most contentious bit is
going to be the bindings.

Tested on a D-Link DNS-320.

Changes since V1:-

* Don't hide return codes [Guenter Roeck]
* Remove typecast noise [Guenter Roeck]
* Use of_find_property instead of counting u32s [Guenter Roeck]
* Don't count GPIOs twice [Andrew Lunn]
* Use of_prop_next_u32 to get records in a more obvious fashion
* Use CONFIG_OF_GPIO instead of CONFIG_OF
* Apply __devinitdata to of_gpio_fan_match [Andrew Lunn]

* Remove useless gpio-fan.h [Andrew Lunn]

Feedback appreciated!

Jamie Lentin (2):
  hwmon: Add devicetree bindings to gpio-fan
  ARM: kirkwood: Use devicetree to define DNS-32[05] fan

 .../devicetree/bindings/gpio/gpio-fan.txt          |   25 +++++
 arch/arm/boot/dts/kirkwood-dnskw.dtsi              |   10 ++
 arch/arm/mach-kirkwood/board-dnskw.c               |   26 -----
 drivers/hwmon/gpio-fan.c                           |  116 ++++++++++++++++++++
 4 files changed, 151 insertions(+), 26 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/gpio/gpio-fan.txt

-- 
1.7.10.4

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH V2 1/2] hwmon: Add devicetree bindings to gpio-fan
       [not found]     ` <1347285112-13542-1-git-send-email-jm-Pj/HzkgeCk7QXOPxS62xeg@public.gmane.org>
@ 2012-09-10 13:51       ` Jamie Lentin
       [not found]         ` <1347285112-13542-2-git-send-email-jm-Pj/HzkgeCk7QXOPxS62xeg@public.gmane.org>
  2012-09-10 18:49         ` Guenter Roeck
  2012-09-10 13:51       ` [PATCH V2 2/2] ARM: kirkwood: Use devicetree to define DNS-32[05] fan Jamie Lentin
  1 sibling, 2 replies; 16+ messages in thread
From: Jamie Lentin @ 2012-09-10 13:51 UTC (permalink / raw)
  To: Grant Likely, Rob Herring, Jean Delvare, Guenter Roeck,
	Jason Cooper, Andrew Lunn
  Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Jamie Lentin,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r

Allow a gpio-fan to be defined in devicetree, see binding documentation
for details.

Changes since V1:-
* Don't hide return codes [Guenter Roeck]
* Remove typecast noise [Guenter Roeck]
* Use of_find_property instead of counting u32s [Guenter Roeck]
* Don't count GPIOs twice [Andrew Lunn]
* Use of_prop_next_u32 to get records in a more obvious fashion
* Use CONFIG_OF_GPIO instead of CONFIG_OF
* Apply __devinitdata to of_gpio_fan_match [Andrew Lunn]

Signed-off-by: Jamie Lentin <jm-Pj/HzkgeCk7QXOPxS62xeg@public.gmane.org>
---
 .../devicetree/bindings/gpio/gpio-fan.txt          |   25 +++++
 drivers/hwmon/gpio-fan.c                           |  116 ++++++++++++++++++++
 2 files changed, 141 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/gpio/gpio-fan.txt

diff --git a/Documentation/devicetree/bindings/gpio/gpio-fan.txt b/Documentation/devicetree/bindings/gpio/gpio-fan.txt
new file mode 100644
index 0000000..2dd457a
--- /dev/null
+++ b/Documentation/devicetree/bindings/gpio/gpio-fan.txt
@@ -0,0 +1,25 @@
+Bindings for fan connected to GPIO lines
+
+Required properties:
+- compatible : "gpio-fan"
+- gpios: Specifies the pins that map to bits in the control value,
+  ordered MSB-->LSB.
+- gpio-fan,speed-map: A mapping of possible fan RPM speeds and the
+  control value that should be set to achieve them. This array
+  must have the RPM values in ascending order.
+
+Optional properties:
+- alarm-gpios: This pin going active indicates something is wrong with
+  the fan, and a udev event will be fired.
+
+Examples:
+
+	gpio_fan {
+		compatible = "gpio-fan";
+		gpios = <&gpio1 14 1
+			 &gpio1 13 1>;
+		gpio-fan,speed-map = <0    0
+				      3000 1
+				      6000 2>;
+		alarm-gpios = <&gpio1 15 1>;
+	};
diff --git a/drivers/hwmon/gpio-fan.c b/drivers/hwmon/gpio-fan.c
index 2f4b01b..f0a803b 100644
--- a/drivers/hwmon/gpio-fan.c
+++ b/drivers/hwmon/gpio-fan.c
@@ -31,6 +31,8 @@
 #include <linux/hwmon.h>
 #include <linux/gpio.h>
 #include <linux/gpio-fan.h>
+#include <linux/of_platform.h>
+#include <linux/of_gpio.h>
 
 struct gpio_fan_data {
 	struct platform_device	*pdev;
@@ -400,14 +402,127 @@ static ssize_t show_name(struct device *dev,
 
 static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
 
+
+#ifdef CONFIG_OF_GPIO
+/*
+ * Translate OpenFirmware node properties into platform_data
+ */
+static int gpio_fan_get_of_pdata(struct device *dev,
+			    struct gpio_fan_platform_data *pdata)
+{
+	struct device_node *node;
+	struct gpio_fan_speed  *speed;
+	unsigned *ctrl;
+	unsigned i;
+	u32 u;
+	struct property *prop;
+	const __be32 *p;
+
+	node = dev->of_node;
+
+	/* Fill GPIO pin array */
+	pdata->num_ctrl = of_gpio_count(node);
+	ctrl = devm_kzalloc(dev, pdata->num_ctrl * sizeof(unsigned),
+				GFP_KERNEL);
+	if (!ctrl)
+		return -ENOMEM;
+	for (i = 0; i < pdata->num_ctrl; i++) {
+		int val;
+
+		val = of_get_gpio(node, i);
+		if (val < 0)
+			return val;
+		ctrl[i] = val;
+	}
+	pdata->ctrl = ctrl;
+
+	/* Get number of RPM/ctrl_val pairs in speed map */
+	prop = of_find_property(node, "gpio-fan,speed-map", &i);
+	if (!prop) {
+		dev_err(dev, "gpio-fan,speed-map node missing from DT");
+		return -ENODEV;
+	}
+	i = i / sizeof(u32);
+	if (i == 0 || i & 1) {
+		dev_err(dev, "gpio-fan,speed-map contains zero/odd number of entries");
+		return -ENODEV;
+	}
+	pdata->num_speed = i / 2;
+
+	/*
+	 * Populate speed map
+	 * Speed map is in the form <RPM ctrl_val RPM ctrl_val ...>
+	 * this needs splitting into pairs to create gpio_fan_speed structs
+	 */
+	speed = devm_kzalloc(dev,
+			pdata->num_speed * sizeof(struct gpio_fan_speed),
+			GFP_KERNEL);
+	if (!speed)
+		return -ENOMEM;
+	p = NULL;
+	for (i = 0; i < pdata->num_speed; i++) {
+		p = of_prop_next_u32(prop, p, &u);
+		if (!p)
+			return -ENODEV;
+		speed[i].rpm = u;
+		p = of_prop_next_u32(prop, p, &u);
+		if (!p)
+			return -ENODEV;
+		speed[i].ctrl_val = u;
+	}
+	pdata->speed = speed;
+
+	/* Alarm GPIO if one exists */
+	if (of_gpio_named_count(node, "alarm-gpios")) {
+		struct gpio_fan_alarm *alarm;
+		int val;
+		enum of_gpio_flags flags;
+
+		alarm = devm_kzalloc(dev, sizeof(struct gpio_fan_alarm),
+					GFP_KERNEL);
+		if (!alarm)
+			return -ENOMEM;
+
+		val = of_get_named_gpio_flags(node, "alarm-gpios", 0, &flags);
+		if (val < 0)
+			return val;
+		alarm->gpio = val;
+		alarm->active_low = flags & OF_GPIO_ACTIVE_LOW;
+
+		pdata->alarm = alarm;
+	}
+
+	return 0;
+}
+
+static struct of_device_id of_gpio_fan_match[] __devinitdata = {
+	{ .compatible = "gpio-fan", },
+	{},
+};
+#endif /* CONFIG_OF_GPIO */
+
 static int __devinit gpio_fan_probe(struct platform_device *pdev)
 {
 	int err;
 	struct gpio_fan_data *fan_data;
 	struct gpio_fan_platform_data *pdata = pdev->dev.platform_data;
 
+#ifdef CONFIG_OF_GPIO
+	if (!pdata) {
+		pdata = devm_kzalloc(&pdev->dev,
+					sizeof(struct gpio_fan_platform_data),
+					GFP_KERNEL);
+		if (!pdata)
+			return -ENOMEM;
+
+		err = gpio_fan_get_of_pdata(&pdev->dev, pdata);
+		if (err)
+			return err;
+	}
+#else /* CONFIG_OF_GPIO */
 	if (!pdata)
 		return -EINVAL;
+#endif /* CONFIG_OF_GPIO */
 
 	fan_data = devm_kzalloc(&pdev->dev, sizeof(struct gpio_fan_data),
 				GFP_KERNEL);
@@ -511,6 +626,7 @@ static struct platform_driver gpio_fan_driver = {
 	.driver	= {
 		.name	= "gpio-fan",
 		.pm	= GPIO_FAN_PM,
+		.of_match_table = of_match_ptr(of_gpio_fan_match),
 	},
 };
 
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH V2 2/2] ARM: kirkwood: Use devicetree to define DNS-32[05] fan
       [not found]     ` <1347285112-13542-1-git-send-email-jm-Pj/HzkgeCk7QXOPxS62xeg@public.gmane.org>
  2012-09-10 13:51       ` [PATCH V2 1/2] hwmon: Add devicetree bindings to gpio-fan Jamie Lentin
@ 2012-09-10 13:51       ` Jamie Lentin
  1 sibling, 0 replies; 16+ messages in thread
From: Jamie Lentin @ 2012-09-10 13:51 UTC (permalink / raw)
  To: Grant Likely, Rob Herring, Jean Delvare, Guenter Roeck,
	Jason Cooper, Andrew Lunn
  Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Jamie Lentin,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r

Remove more board-specific code by using devicetree to define the fan
attached to both boards.

Changes since V1:-
* Remove now-useless gpio-fan.h [Andrew Lunn]

Signed-off-by: Jamie Lentin <jm-Pj/HzkgeCk7QXOPxS62xeg@public.gmane.org>
---
 arch/arm/boot/dts/kirkwood-dnskw.dtsi |   10 ++++++++++
 arch/arm/mach-kirkwood/board-dnskw.c  |   26 --------------------------
 2 files changed, 10 insertions(+), 26 deletions(-)

diff --git a/arch/arm/boot/dts/kirkwood-dnskw.dtsi b/arch/arm/boot/dts/kirkwood-dnskw.dtsi
index 7408655..9b32d02 100644
--- a/arch/arm/boot/dts/kirkwood-dnskw.dtsi
+++ b/arch/arm/boot/dts/kirkwood-dnskw.dtsi
@@ -25,6 +25,16 @@
 		};
 	};
 
+	gpio_fan {
+		/* Fan: ADDA AD045HB-G73 40mm 6000rpm@5v */
+		compatible = "gpio-fan";
+		gpios = <&gpio1 14 1
+			 &gpio1 13 1>;
+		gpio-fan,speed-map = <0    0
+				      3000 1
+				      6000 2>;
+	};
+
 	ocp@f1000000 {
 		sata@80000 {
 			status = "okay";
diff --git a/arch/arm/mach-kirkwood/board-dnskw.c b/arch/arm/mach-kirkwood/board-dnskw.c
index 4ab3506..6ac7a8d 100644
--- a/arch/arm/mach-kirkwood/board-dnskw.c
+++ b/arch/arm/mach-kirkwood/board-dnskw.c
@@ -19,7 +19,6 @@
 #include <linux/of.h>
 #include <linux/gpio.h>
 #include <linux/input.h>
-#include <linux/gpio-fan.h>
 #include <linux/leds.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
@@ -67,29 +66,6 @@ static unsigned int dnskw_mpp_config[] __initdata = {
 	0
 };
 
-/* Fan: ADDA AD045HB-G73 40mm 6000rpm@5v */
-static struct gpio_fan_speed dnskw_fan_speed[] = {
-	{    0,  0 },
-	{ 3000,	 1 },
-	{ 6000,	 2 },
-};
-static unsigned dnskw_fan_pins[] = {46, 45};
-
-static struct gpio_fan_platform_data dnskw_fan_data = {
-	.num_ctrl	= ARRAY_SIZE(dnskw_fan_pins),
-	.ctrl		= dnskw_fan_pins,
-	.num_speed	= ARRAY_SIZE(dnskw_fan_speed),
-	.speed		= dnskw_fan_speed,
-};
-
-static struct platform_device dnskw_fan_device = {
-	.name	= "gpio-fan",
-	.id	= -1,
-	.dev	= {
-		.platform_data	= &dnskw_fan_data,
-	},
-};
-
 static void dnskw_power_off(void)
 {
 	gpio_set_value(36, 1);
@@ -114,8 +90,6 @@ void __init dnskw_init(void)
 	kirkwood_ehci_init();
 	kirkwood_ge00_init(&dnskw_ge00_data);
 
-	platform_device_register(&dnskw_fan_device);
-
 	/* Register power-off GPIO. */
 	if (gpio_request(36, "dnskw:power:off") == 0
 	    && gpio_direction_output(36, 0) == 0)
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [PATCH V2 1/2] hwmon: Add devicetree bindings to gpio-fan
       [not found]         ` <1347285112-13542-2-git-send-email-jm-Pj/HzkgeCk7QXOPxS62xeg@public.gmane.org>
@ 2012-09-10 15:28           ` Andrew Lunn
       [not found]             ` <20120910152814.GA6050-g2DYL2Zd6BY@public.gmane.org>
  0 siblings, 1 reply; 16+ messages in thread
From: Andrew Lunn @ 2012-09-10 15:28 UTC (permalink / raw)
  To: Jamie Lentin
  Cc: Andrew Lunn, Jason Cooper,
	devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Rob Herring,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Jean Delvare,
	Guenter Roeck

On Mon, Sep 10, 2012 at 02:51:51PM +0100, Jamie Lentin wrote:
> Allow a gpio-fan to be defined in devicetree, see binding documentation
> for details.
> 
> Changes since V1:-
> * Don't hide return codes [Guenter Roeck]
> * Remove typecast noise [Guenter Roeck]
> * Use of_find_property instead of counting u32s [Guenter Roeck]
> * Don't count GPIOs twice [Andrew Lunn]
> * Use of_prop_next_u32 to get records in a more obvious fashion
> * Use CONFIG_OF_GPIO instead of CONFIG_OF
> * Apply __devinitdata to of_gpio_fan_match [Andrew Lunn]
> 
> Signed-off-by: Jamie Lentin <jm-Pj/HzkgeCk7QXOPxS62xeg@public.gmane.org>
> ---
>  .../devicetree/bindings/gpio/gpio-fan.txt          |   25 +++++
>  drivers/hwmon/gpio-fan.c                           |  116 ++++++++++++++++++++
>  2 files changed, 141 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/gpio/gpio-fan.txt

Hi Jamie

Thanks for addressing all the issues raised. However...

Anything before the --- ends up in the changelog entry. Anything
afterwards does not.

The changes you made to address review comments is not something for
the changelog, so Changes since V1:- should be after the --- .

There is more detail in Documentation/SubmittingPatches

      Andrew

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH V2 1/2] hwmon: Add devicetree bindings to gpio-fan
       [not found]             ` <20120910152814.GA6050-g2DYL2Zd6BY@public.gmane.org>
@ 2012-09-10 16:04               ` Jamie Lentin
       [not found]                 ` <alpine.DEB.2.00.1209101656120.10589-5X291BYdrx55rAo4AelP/Ydd74u8MsAO@public.gmane.org>
  0 siblings, 1 reply; 16+ messages in thread
From: Jamie Lentin @ 2012-09-10 16:04 UTC (permalink / raw)
  To: Andrew Lunn
  Cc: Jason Cooper, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ,
	Rob Herring, Guenter Roeck, Jean Delvare,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r

On Mon, 10 Sep 2012, Andrew Lunn wrote:

> On Mon, Sep 10, 2012 at 02:51:51PM +0100, Jamie Lentin wrote:
>> Allow a gpio-fan to be defined in devicetree, see binding documentation
>> for details.
>>
>> Changes since V1:-
>> * Don't hide return codes [Guenter Roeck]
>> * Remove typecast noise [Guenter Roeck]
>> * Use of_find_property instead of counting u32s [Guenter Roeck]
>> * Don't count GPIOs twice [Andrew Lunn]
>> * Use of_prop_next_u32 to get records in a more obvious fashion
>> * Use CONFIG_OF_GPIO instead of CONFIG_OF
>> * Apply __devinitdata to of_gpio_fan_match [Andrew Lunn]
>>
>> Signed-off-by: Jamie Lentin <jm-Pj/HzkgeCk7QXOPxS62xeg@public.gmane.org>
>> ---
>>  .../devicetree/bindings/gpio/gpio-fan.txt          |   25 +++++
>>  drivers/hwmon/gpio-fan.c                           |  116 ++++++++++++++++++++
>>  2 files changed, 141 insertions(+)
>>  create mode 100644 Documentation/devicetree/bindings/gpio/gpio-fan.txt
>
> Hi Jamie
>
> Thanks for addressing all the issues raised. However...
>
> Anything before the --- ends up in the changelog entry. Anything
> afterwards does not.
>
> The changes you made to address review comments is not something for
> the changelog, so Changes since V1:- should be after the --- .

Okay, whilst I was submitting the initial DT support it was suggested by 
Grant Likely they should be above the '---'. I think I prefer this also, 
but I'll go with whatever is more likely to get patches accepted :)

Can resend with the content jiggled if you want, but will put them after 
the '---' in future.

>
> There is more detail in Documentation/SubmittingPatches
>
>      Andrew
>

-- 
Jamie Lentin

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH V2 1/2] hwmon: Add devicetree bindings to gpio-fan
       [not found]                 ` <alpine.DEB.2.00.1209101656120.10589-5X291BYdrx55rAo4AelP/Ydd74u8MsAO@public.gmane.org>
@ 2012-09-10 18:15                   ` Jason Cooper
  0 siblings, 0 replies; 16+ messages in thread
From: Jason Cooper @ 2012-09-10 18:15 UTC (permalink / raw)
  To: Jamie Lentin
  Cc: Andrew Lunn, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ,
	Rob Herring, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	Jean Delvare, Guenter Roeck

On Mon, Sep 10, 2012 at 05:04:26PM +0100, Jamie Lentin wrote:
> On Mon, 10 Sep 2012, Andrew Lunn wrote:
> 
> >On Mon, Sep 10, 2012 at 02:51:51PM +0100, Jamie Lentin wrote:
> >>Allow a gpio-fan to be defined in devicetree, see binding documentation
> >>for details.
> >>
> >>Changes since V1:-
> >>* Don't hide return codes [Guenter Roeck]
> >>* Remove typecast noise [Guenter Roeck]
> >>* Use of_find_property instead of counting u32s [Guenter Roeck]
> >>* Don't count GPIOs twice [Andrew Lunn]
> >>* Use of_prop_next_u32 to get records in a more obvious fashion
> >>* Use CONFIG_OF_GPIO instead of CONFIG_OF
> >>* Apply __devinitdata to of_gpio_fan_match [Andrew Lunn]
> >>
> >>Signed-off-by: Jamie Lentin <jm-Pj/HzkgeCk7QXOPxS62xeg@public.gmane.org>
> >>---
> >> .../devicetree/bindings/gpio/gpio-fan.txt          |   25 +++++
> >> drivers/hwmon/gpio-fan.c                           |  116 ++++++++++++++++++++
> >> 2 files changed, 141 insertions(+)
> >> create mode 100644 Documentation/devicetree/bindings/gpio/gpio-fan.txt
> >
> >Hi Jamie
> >
> >Thanks for addressing all the issues raised. However...
> >
> >Anything before the --- ends up in the changelog entry. Anything
> >afterwards does not.
> >
> >The changes you made to address review comments is not something for
> >the changelog, so Changes since V1:- should be after the --- .
> 
> Okay, whilst I was submitting the initial DT support it was
> suggested by Grant Likely they should be above the '---'. I think I
> prefer this also, but I'll go with whatever is more likely to get
> patches accepted :)
> 
> Can resend with the content jiggled if you want, but will put them
> after the '---' in future.

There's no need to resend if this is the only issue.  I'll just clean it
up when I pull it in.  In the future, though, please do as Andrew
suggested.

thx,

Jason.

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH V2 1/2] hwmon: Add devicetree bindings to gpio-fan
  2012-09-10 13:51       ` [PATCH V2 1/2] hwmon: Add devicetree bindings to gpio-fan Jamie Lentin
       [not found]         ` <1347285112-13542-2-git-send-email-jm-Pj/HzkgeCk7QXOPxS62xeg@public.gmane.org>
@ 2012-09-10 18:49         ` Guenter Roeck
       [not found]           ` <20120910184919.GA30872-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org>
  1 sibling, 1 reply; 16+ messages in thread
From: Guenter Roeck @ 2012-09-10 18:49 UTC (permalink / raw)
  To: Jamie Lentin
  Cc: Andrew Lunn, Jason Cooper, devicetree-discuss, Rob Herring,
	Grant Likely, Jean Delvare, linux-arm-kernel

On Mon, Sep 10, 2012 at 02:51:51PM +0100, Jamie Lentin wrote:
> Allow a gpio-fan to be defined in devicetree, see binding documentation
> for details.
> 
> Changes since V1:-
> * Don't hide return codes [Guenter Roeck]
> * Remove typecast noise [Guenter Roeck]
> * Use of_find_property instead of counting u32s [Guenter Roeck]
> * Don't count GPIOs twice [Andrew Lunn]
> * Use of_prop_next_u32 to get records in a more obvious fashion
> * Use CONFIG_OF_GPIO instead of CONFIG_OF
> * Apply __devinitdata to of_gpio_fan_match [Andrew Lunn]
> 

Jamie,

As suggested by others, after ---, please

> Signed-off-by: Jamie Lentin <jm@lentin.co.uk>
> ---
>  .../devicetree/bindings/gpio/gpio-fan.txt          |   25 +++++
>  drivers/hwmon/gpio-fan.c                           |  116 ++++++++++++++++++++
>  2 files changed, 141 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/gpio/gpio-fan.txt
> 
> diff --git a/Documentation/devicetree/bindings/gpio/gpio-fan.txt b/Documentation/devicetree/bindings/gpio/gpio-fan.txt
> new file mode 100644
> index 0000000..2dd457a
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/gpio/gpio-fan.txt
> @@ -0,0 +1,25 @@
> +Bindings for fan connected to GPIO lines
> +
> +Required properties:
> +- compatible : "gpio-fan"
> +- gpios: Specifies the pins that map to bits in the control value,
> +  ordered MSB-->LSB.
> +- gpio-fan,speed-map: A mapping of possible fan RPM speeds and the
> +  control value that should be set to achieve them. This array
> +  must have the RPM values in ascending order.
> +
> +Optional properties:
> +- alarm-gpios: This pin going active indicates something is wrong with
> +  the fan, and a udev event will be fired.
> +
> +Examples:
> +
> +	gpio_fan {
> +		compatible = "gpio-fan";
> +		gpios = <&gpio1 14 1
> +			 &gpio1 13 1>;
> +		gpio-fan,speed-map = <0    0
> +				      3000 1
> +				      6000 2>;
> +		alarm-gpios = <&gpio1 15 1>;
> +	};
> diff --git a/drivers/hwmon/gpio-fan.c b/drivers/hwmon/gpio-fan.c
> index 2f4b01b..f0a803b 100644
> --- a/drivers/hwmon/gpio-fan.c
> +++ b/drivers/hwmon/gpio-fan.c
> @@ -31,6 +31,8 @@
>  #include <linux/hwmon.h>
>  #include <linux/gpio.h>
>  #include <linux/gpio-fan.h>
> +#include <linux/of_platform.h>
> +#include <linux/of_gpio.h>
>  
>  struct gpio_fan_data {
>  	struct platform_device	*pdev;
> @@ -400,14 +402,127 @@ static ssize_t show_name(struct device *dev,
>  
>  static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
>  
> +
> +#ifdef CONFIG_OF_GPIO
> +/*
> + * Translate OpenFirmware node properties into platform_data
> + */
> +static int gpio_fan_get_of_pdata(struct device *dev,
> +			    struct gpio_fan_platform_data *pdata)
> +{
> +	struct device_node *node;
> +	struct gpio_fan_speed  *speed;

s/  / /

> +	unsigned *ctrl;
> +	unsigned i;
> +	u32 u;
> +	struct property *prop;
> +	const __be32 *p;
> +
> +	node = dev->of_node;
> +
> +	/* Fill GPIO pin array */
> +	pdata->num_ctrl = of_gpio_count(node);

All other callers of this function check if the result is > 0.

Thanks,
Guenter

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH V3 1/2] hwmon: Add devicetree bindings to gpio-fan
       [not found]           ` <20120910184919.GA30872-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org>
@ 2012-09-14 16:07             ` Jamie Lentin
  2012-09-15  2:28               ` Guenter Roeck
  0 siblings, 1 reply; 16+ messages in thread
From: Jamie Lentin @ 2012-09-14 16:07 UTC (permalink / raw)
  To: Grant Likely, Rob Herring, Jean Delvare, Guenter Roeck,
	Jason Cooper, Andrew Lunn
  Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Jamie Lentin,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r

Allow a gpio-fan to be defined in devicetree, see binding documentation
for details.

Signed-off-by: Jamie Lentin <jm-Pj/HzkgeCk7QXOPxS62xeg@public.gmane.org>
Acked-by: Andrew Lunn <andrew-g2DYL2Zd6BY@public.gmane.org>
---
Changes since V2:-
* Correct error message terminology
* Check of_gpio_count returns some GPIOs [Guenter Roeck]
* Whitespace fix [Guenter Roeck]

Changes since V1:-
* Don't hide return codes [Guenter Roeck]
* Remove typecast noise [Guenter Roeck]
* Use of_find_property instead of counting u32s [Guenter Roeck]
* Don't count GPIOs twice [Andrew Lunn]
* Use of_prop_next_u32 to get records in a more obvious fashion
* Use CONFIG_OF_GPIO instead of CONFIG_OF
* Apply __devinitdata to of_gpio_fan_match [Andrew Lunn]
---
 .../devicetree/bindings/gpio/gpio-fan.txt          |   25 ++++
 drivers/hwmon/gpio-fan.c                           |  120 ++++++++++++++++++++
 2 files changed, 145 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/gpio/gpio-fan.txt

diff --git a/Documentation/devicetree/bindings/gpio/gpio-fan.txt b/Documentation/devicetree/bindings/gpio/gpio-fan.txt
new file mode 100644
index 0000000..2dd457a
--- /dev/null
+++ b/Documentation/devicetree/bindings/gpio/gpio-fan.txt
@@ -0,0 +1,25 @@
+Bindings for fan connected to GPIO lines
+
+Required properties:
+- compatible : "gpio-fan"
+- gpios: Specifies the pins that map to bits in the control value,
+  ordered MSB-->LSB.
+- gpio-fan,speed-map: A mapping of possible fan RPM speeds and the
+  control value that should be set to achieve them. This array
+  must have the RPM values in ascending order.
+
+Optional properties:
+- alarm-gpios: This pin going active indicates something is wrong with
+  the fan, and a udev event will be fired.
+
+Examples:
+
+	gpio_fan {
+		compatible = "gpio-fan";
+		gpios = <&gpio1 14 1
+			 &gpio1 13 1>;
+		gpio-fan,speed-map = <0    0
+				      3000 1
+				      6000 2>;
+		alarm-gpios = <&gpio1 15 1>;
+	};
diff --git a/drivers/hwmon/gpio-fan.c b/drivers/hwmon/gpio-fan.c
index 2f4b01b..36509ae 100644
--- a/drivers/hwmon/gpio-fan.c
+++ b/drivers/hwmon/gpio-fan.c
@@ -31,6 +31,8 @@
 #include <linux/hwmon.h>
 #include <linux/gpio.h>
 #include <linux/gpio-fan.h>
+#include <linux/of_platform.h>
+#include <linux/of_gpio.h>
 
 struct gpio_fan_data {
 	struct platform_device	*pdev;
@@ -400,14 +402,131 @@ static ssize_t show_name(struct device *dev,
 
 static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
 
+
+#ifdef CONFIG_OF_GPIO
+/*
+ * Translate OpenFirmware node properties into platform_data
+ */
+static int gpio_fan_get_of_pdata(struct device *dev,
+			    struct gpio_fan_platform_data *pdata)
+{
+	struct device_node *node;
+	struct gpio_fan_speed *speed;
+	unsigned *ctrl;
+	unsigned i;
+	u32 u;
+	struct property *prop;
+	const __be32 *p;
+
+	node = dev->of_node;
+
+	/* Fill GPIO pin array */
+	pdata->num_ctrl = of_gpio_count(node);
+	if (!pdata->num_ctrl) {
+		dev_err(dev, "gpios DT property empty / missing");
+		return -ENODEV;
+	}
+	ctrl = devm_kzalloc(dev, pdata->num_ctrl * sizeof(unsigned),
+				GFP_KERNEL);
+	if (!ctrl)
+		return -ENOMEM;
+	for (i = 0; i < pdata->num_ctrl; i++) {
+		int val;
+
+		val = of_get_gpio(node, i);
+		if (val < 0)
+			return val;
+		ctrl[i] = val;
+	}
+	pdata->ctrl = ctrl;
+
+	/* Get number of RPM/ctrl_val pairs in speed map */
+	prop = of_find_property(node, "gpio-fan,speed-map", &i);
+	if (!prop) {
+		dev_err(dev, "gpio-fan,speed-map DT property missing");
+		return -ENODEV;
+	}
+	i = i / sizeof(u32);
+	if (i == 0 || i & 1) {
+		dev_err(dev, "gpio-fan,speed-map contains zero/odd number of entries");
+		return -ENODEV;
+	}
+	pdata->num_speed = i / 2;
+
+	/*
+	 * Populate speed map
+	 * Speed map is in the form <RPM ctrl_val RPM ctrl_val ...>
+	 * this needs splitting into pairs to create gpio_fan_speed structs
+	 */
+	speed = devm_kzalloc(dev,
+			pdata->num_speed * sizeof(struct gpio_fan_speed),
+			GFP_KERNEL);
+	if (!speed)
+		return -ENOMEM;
+	p = NULL;
+	for (i = 0; i < pdata->num_speed; i++) {
+		p = of_prop_next_u32(prop, p, &u);
+		if (!p)
+			return -ENODEV;
+		speed[i].rpm = u;
+		p = of_prop_next_u32(prop, p, &u);
+		if (!p)
+			return -ENODEV;
+		speed[i].ctrl_val = u;
+	}
+	pdata->speed = speed;
+
+	/* Alarm GPIO if one exists */
+	if (of_gpio_named_count(node, "alarm-gpios")) {
+		struct gpio_fan_alarm *alarm;
+		int val;
+		enum of_gpio_flags flags;
+
+		alarm = devm_kzalloc(dev, sizeof(struct gpio_fan_alarm),
+					GFP_KERNEL);
+		if (!alarm)
+			return -ENOMEM;
+
+		val = of_get_named_gpio_flags(node, "alarm-gpios", 0, &flags);
+		if (val < 0)
+			return val;
+		alarm->gpio = val;
+		alarm->active_low = flags & OF_GPIO_ACTIVE_LOW;
+
+		pdata->alarm = alarm;
+	}
+
+	return 0;
+}
+
+static struct of_device_id of_gpio_fan_match[] __devinitdata = {
+	{ .compatible = "gpio-fan", },
+	{},
+};
+#endif /* CONFIG_OF_GPIO */
+
 static int __devinit gpio_fan_probe(struct platform_device *pdev)
 {
 	int err;
 	struct gpio_fan_data *fan_data;
 	struct gpio_fan_platform_data *pdata = pdev->dev.platform_data;
 
+#ifdef CONFIG_OF_GPIO
+	if (!pdata) {
+		pdata = devm_kzalloc(&pdev->dev,
+					sizeof(struct gpio_fan_platform_data),
+					GFP_KERNEL);
+		if (!pdata)
+			return -ENOMEM;
+
+		err = gpio_fan_get_of_pdata(&pdev->dev, pdata);
+		if (err)
+			return err;
+	}
+#else /* CONFIG_OF_GPIO */
 	if (!pdata)
 		return -EINVAL;
+#endif /* CONFIG_OF_GPIO */
 
 	fan_data = devm_kzalloc(&pdev->dev, sizeof(struct gpio_fan_data),
 				GFP_KERNEL);
@@ -511,6 +630,7 @@ static struct platform_driver gpio_fan_driver = {
 	.driver	= {
 		.name	= "gpio-fan",
 		.pm	= GPIO_FAN_PM,
+		.of_match_table = of_match_ptr(of_gpio_fan_match),
 	},
 };
 
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [PATCH V3 1/2] hwmon: Add devicetree bindings to gpio-fan
  2012-09-14 16:07             ` [PATCH V3 " Jamie Lentin
@ 2012-09-15  2:28               ` Guenter Roeck
       [not found]                 ` <20120915022833.GA20375-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org>
  0 siblings, 1 reply; 16+ messages in thread
From: Guenter Roeck @ 2012-09-15  2:28 UTC (permalink / raw)
  To: Jamie Lentin
  Cc: Andrew Lunn, Jason Cooper, devicetree-discuss, Rob Herring,
	Grant Likely, Jean Delvare, linux-arm-kernel

On Fri, Sep 14, 2012 at 05:07:06PM +0100, Jamie Lentin wrote:
> Allow a gpio-fan to be defined in devicetree, see binding documentation
> for details.
> 
> Signed-off-by: Jamie Lentin <jm@lentin.co.uk>
> Acked-by: Andrew Lunn <andrew@lunn.ch>

Acked-by: Guenter Roeck <linux@roeck-us.net>

I take it this will go through the arm tree ?

Guenter

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH V3 1/2] hwmon: Add devicetree bindings to gpio-fan
       [not found]                 ` <20120915022833.GA20375-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org>
@ 2012-09-15  3:16                   ` Jason Cooper
  0 siblings, 0 replies; 16+ messages in thread
From: Jason Cooper @ 2012-09-15  3:16 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: Andrew Lunn, Jamie Lentin, Rob Herring, Jean Delvare,
	devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r

On Fri, Sep 14, 2012 at 07:28:33PM -0700, Guenter Roeck wrote:
> On Fri, Sep 14, 2012 at 05:07:06PM +0100, Jamie Lentin wrote:
> > Allow a gpio-fan to be defined in devicetree, see binding documentation
> > for details.
> > 
> > Signed-off-by: Jamie Lentin <jm-Pj/HzkgeCk7QXOPxS62xeg@public.gmane.org>
> > Acked-by: Andrew Lunn <andrew-g2DYL2Zd6BY@public.gmane.org>
> 
> Acked-by: Guenter Roeck <linux-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org>
> 
> I take it this will go through the arm tree ?

Yes, unless there is an objection.

thx,

Jason.

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2012-09-15  3:16 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-09-07 16:34 [PATCH 0/2] hwmon: kirkwood: Add DT bindings to gpio-fan for DNS-32[05] Jamie Lentin
2012-09-07 16:34 ` [PATCH 1/2] hwmon: Add devicetree bindings to gpio-fan Jamie Lentin
2012-09-07 18:36   ` Guenter Roeck
     [not found]   ` <1347035675-23907-2-git-send-email-jm-Pj/HzkgeCk7QXOPxS62xeg@public.gmane.org>
2012-09-08  7:32     ` Andrew Lunn
2012-09-07 16:34 ` [PATCH 2/2] ARM: kirkwood: Use devicetree to define DNS-32[05] fan Jamie Lentin
     [not found]   ` <1347035675-23907-3-git-send-email-jm-Pj/HzkgeCk7QXOPxS62xeg@public.gmane.org>
2012-09-07 21:23     ` Andrew Lunn
     [not found] ` <1347035675-23907-1-git-send-email-jm-Pj/HzkgeCk7QXOPxS62xeg@public.gmane.org>
2012-09-10 13:51   ` [PATCH V2 0/2] hwmon: kirkwood: Add DT bindings to gpio-fan for DNS-32[05] Jamie Lentin
     [not found]     ` <1347285112-13542-1-git-send-email-jm-Pj/HzkgeCk7QXOPxS62xeg@public.gmane.org>
2012-09-10 13:51       ` [PATCH V2 1/2] hwmon: Add devicetree bindings to gpio-fan Jamie Lentin
     [not found]         ` <1347285112-13542-2-git-send-email-jm-Pj/HzkgeCk7QXOPxS62xeg@public.gmane.org>
2012-09-10 15:28           ` Andrew Lunn
     [not found]             ` <20120910152814.GA6050-g2DYL2Zd6BY@public.gmane.org>
2012-09-10 16:04               ` Jamie Lentin
     [not found]                 ` <alpine.DEB.2.00.1209101656120.10589-5X291BYdrx55rAo4AelP/Ydd74u8MsAO@public.gmane.org>
2012-09-10 18:15                   ` Jason Cooper
2012-09-10 18:49         ` Guenter Roeck
     [not found]           ` <20120910184919.GA30872-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org>
2012-09-14 16:07             ` [PATCH V3 " Jamie Lentin
2012-09-15  2:28               ` Guenter Roeck
     [not found]                 ` <20120915022833.GA20375-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org>
2012-09-15  3:16                   ` Jason Cooper
2012-09-10 13:51       ` [PATCH V2 2/2] ARM: kirkwood: Use devicetree to define DNS-32[05] fan Jamie Lentin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).