diff mbox

[1/3] net: rfkill-gpio: add device tree support

Message ID 215249735783e9fe35db1c594d901f591725de50.1328461986.git.marvin24@gmx.de
State Superseded, archived
Headers show

Commit Message

Marc Dietrich Feb. 5, 2012, 5:18 p.m. UTC
This adds device tree support for rfkill-gpio. The optional platform
paramters gpio_runtime_close and gpio_runtime_setup are not implemented.

Cc: linux-wireless@vger.kernel.org
Cc: "John W. Linville" <linville@tuxdriver.com>
Cc: Johannes Berg <johannes@sipsolutions.net>
Cc: Rhyland Klein <rklein@nvidia.com>
Signed-off-by: Marc Dietrich <marvin24@gmx.de>
---
 include/linux/rfkill-gpio.h |    2 +-
 net/rfkill/rfkill-gpio.c    |   60 ++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 60 insertions(+), 2 deletions(-)

Comments

Thierry Reding Feb. 5, 2012, 7:59 p.m. UTC | #1
* Marc Dietrich wrote:
> +#ifdef CONFIG_OF
[...]
> +#else
[...]
> +#define of_rfkill_gpio_match NULL

This can be dropped, see below.

> +#endif
> +
>  static int rfkill_gpio_probe(struct platform_device *pdev)
>  {
>  	struct rfkill_gpio_data *rfkill;
>  	struct rfkill_gpio_platform_data *pdata = pdev->dev.platform_data;
> +	struct device_node *np = pdev->dev.of_node;
>  	int ret = 0;
>  	int len = 0;
>  
> +	if (np)
> +		pdata = rfkill_gpio_parse_pdata(pdev);
> +
>  	if (!pdata) {
>  		pr_warn("%s: No platform data specified\n", __func__);
>  		return -EINVAL;
> @@ -210,13 +268,13 @@ static int rfkill_gpio_remove(struct platform_device *pdev)
>  
>  	return 0;
>  }
> -

Are you removing this line on purpose?

>  static struct platform_driver rfkill_gpio_driver = {
>  	.probe = rfkill_gpio_probe,
>  	.remove = __devexit_p(rfkill_gpio_remove),
>  	.driver = {
>  		   .name = "rfkill_gpio",
>  		   .owner = THIS_MODULE,
> +		   .of_match_table = of_rfkill_gpio_match,

I think the canonical way to do this is of_match_ptr() and leave out the
definition to NULL in the !CONFIG_OF above.

Thierry
Marc Dietrich Feb. 6, 2012, 10:25 a.m. UTC | #2
Am Sonntag, 5. Februar 2012, 20:59:24 schrieb Thierry Reding:
> * Marc Dietrich wrote:
> > +#ifdef CONFIG_OF
> 
> [...]
> 
> > +#else
> 
> [...]
> 
> > +#define of_rfkill_gpio_match NULL
> 
> This can be dropped, see below.
> 
> > +#endif
> > +
> > 
> >  static int rfkill_gpio_probe(struct platform_device *pdev)
> >  {
> >  
> >  	struct rfkill_gpio_data *rfkill;
> >  	struct rfkill_gpio_platform_data *pdata = pdev->dev.platform_data;
> > 
> > +	struct device_node *np = pdev->dev.of_node;
> > 
> >  	int ret = 0;
> >  	int len = 0;
> > 
> > +	if (np)
> > +		pdata = rfkill_gpio_parse_pdata(pdev);
> > +
> > 
> >  	if (!pdata) {
> >  	
> >  		pr_warn("%s: No platform data specified\n", __func__);
> >  		return -EINVAL;
> > 
> > @@ -210,13 +268,13 @@ static int rfkill_gpio_remove(struct platform_device
> > *pdev)> 
> >  	return 0;
> >  
> >  }
> > 
> > -
> 
> Are you removing this line on purpose?

of course not ;-)

> >  static struct platform_driver rfkill_gpio_driver = {
> >  
> >  	.probe = rfkill_gpio_probe,
> >  	.remove = __devexit_p(rfkill_gpio_remove),
> >  	.driver = {
> >  	
> >  		   .name = "rfkill_gpio",
> >  		   .owner = THIS_MODULE,
> > 
> > +		   .of_match_table = of_rfkill_gpio_match,
> 
> I think the canonical way to do this is of_match_ptr() and leave out the
> definition to NULL in the !CONFIG_OF above.

yes, the OF api is changing in such a fast way, that it is getting hard to track it, 
especially if there are many drivers which use different generations of it. 

I'll fix it up in the next iteration.

Thanks

Marc

--
To unsubscribe from this list: send the line "unsubscribe linux-tegra" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/include/linux/rfkill-gpio.h b/include/linux/rfkill-gpio.h
index 4d09f6e..76a9674 100644
--- a/include/linux/rfkill-gpio.h
+++ b/include/linux/rfkill-gpio.h
@@ -35,7 +35,7 @@ 
  */
 
 struct rfkill_gpio_platform_data {
-	char			*name;
+	const char		*name;
 	int			reset_gpio;
 	int			shutdown_gpio;
 	const char		*power_clk_name;
diff --git a/net/rfkill/rfkill-gpio.c b/net/rfkill/rfkill-gpio.c
index 865adb6..6b4c5e8 100644
--- a/net/rfkill/rfkill-gpio.c
+++ b/net/rfkill/rfkill-gpio.c
@@ -21,6 +21,7 @@ 
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/rfkill.h>
+#include <linux/of_gpio.h>
 #include <linux/platform_device.h>
 #include <linux/clk.h>
 #include <linux/slab.h>
@@ -77,13 +78,70 @@  static const struct rfkill_ops rfkill_gpio_ops = {
 	.set_block = rfkill_gpio_set_power,
 };
 
+#ifdef CONFIG_OF
+static struct rfkill_gpio_platform_data * __devinit
+			rfkill_gpio_parse_pdata(struct platform_device *pdev)
+{
+	struct rfkill_gpio_platform_data *pdata, *rfkill;
+	struct device_node *np = pdev->dev.of_node, *child;
+	int count = 0;
+
+	for_each_child_of_node(np, child)
+		count++;
+	if (!count)
+		return NULL;
+
+	pdata = devm_kzalloc(&pdev->dev,
+				sizeof(struct rfkill_gpio_platform_data) *
+				count, GFP_KERNEL);
+	if (!pdata)
+		return NULL;
+
+	rfkill = pdata;
+
+	for_each_child_of_node(np, child) {
+		of_property_read_string(child, "label", &rfkill->name);
+		if (!rfkill->name)
+			rfkill->name = child->name;
+		rfkill->reset_gpio = of_get_named_gpio(child, "reset-gpio", 0);
+		rfkill->shutdown_gpio = of_get_named_gpio(child,
+							  "shutdown-gpio", 0);
+		of_property_read_u32(child, "type", &rfkill->type);
+		of_property_read_string(child, "clock",
+					&rfkill->power_clk_name);
+
+		rfkill += sizeof(struct rfkill_gpio_platform_data);
+	}
+
+	return pdata;
+}
+
+static const struct of_device_id of_rfkill_gpio_match[] = {
+	{ .compatible = "rfkill-gpio", },
+	{},
+};
+
+#else
+static inline struct rfkill_gpio_platform_data
+			*rfkill_gpio_parse_pdata(struct platform_device *pdev)
+{
+	return NULL;
+}
+
+#define of_rfkill_gpio_match NULL
+#endif
+
 static int rfkill_gpio_probe(struct platform_device *pdev)
 {
 	struct rfkill_gpio_data *rfkill;
 	struct rfkill_gpio_platform_data *pdata = pdev->dev.platform_data;
+	struct device_node *np = pdev->dev.of_node;
 	int ret = 0;
 	int len = 0;
 
+	if (np)
+		pdata = rfkill_gpio_parse_pdata(pdev);
+
 	if (!pdata) {
 		pr_warn("%s: No platform data specified\n", __func__);
 		return -EINVAL;
@@ -210,13 +268,13 @@  static int rfkill_gpio_remove(struct platform_device *pdev)
 
 	return 0;
 }
-
 static struct platform_driver rfkill_gpio_driver = {
 	.probe = rfkill_gpio_probe,
 	.remove = __devexit_p(rfkill_gpio_remove),
 	.driver = {
 		   .name = "rfkill_gpio",
 		   .owner = THIS_MODULE,
+		   .of_match_table = of_rfkill_gpio_match,
 	},
 };