Return-path: Received: from mailout-de.gmx.net ([213.165.64.23]:44963 "HELO mailout-de.gmx.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1753888Ab2BERUB (ORCPT ); Sun, 5 Feb 2012 12:20:01 -0500 From: Marc Dietrich To: linux-tegra@vger.kernel.org Cc: Stephen Warren , Colin Cross , Olof Johansson , linux-wireless@vger.kernel.org, "John W. Linville" , Johannes Berg , Rhyland Klein Subject: [PATCH 1/3] net: rfkill-gpio: add device tree support Date: Sun, 5 Feb 2012 18:18:40 +0100 Message-Id: <215249735783e9fe35db1c594d901f591725de50.1328461986.git.marvin24@gmx.de> (sfid-20120205_182015_712339_4AF88BC9) Sender: linux-wireless-owner@vger.kernel.org List-ID: 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" Cc: Johannes Berg Cc: Rhyland Klein Signed-off-by: Marc Dietrich --- include/linux/rfkill-gpio.h | 2 +- net/rfkill/rfkill-gpio.c | 60 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 60 insertions(+), 2 deletions(-) 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 #include #include +#include #include #include #include @@ -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, }, }; -- 1.7.5.4