diff options
author | Heikki Krogerus <heikki.krogerus@linux.intel.com> | 2013-10-16 06:53:43 -0400 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2013-10-28 10:05:25 -0400 |
commit | ef91ffaa033001c2ba65d3c9659f1a75886d0aa3 (patch) | |
tree | f858ccc0b4b4c5eefe18cfbb79414bdfda85518c /net/rfkill | |
parent | 262c91ee5e524238d4dabf908c88f8518ed334ce (diff) |
net: rfkill: gpio: add ACPI support
Including ACPI ID for Broadcom GPS receiver BCM4752.
Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Acked-by: Rhyland Klein <rklein@nvidia.com>
Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/rfkill')
-rw-r--r-- | net/rfkill/rfkill-gpio.c | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/net/rfkill/rfkill-gpio.c b/net/rfkill/rfkill-gpio.c index 2dd78c628d86..5620d3c07479 100644 --- a/net/rfkill/rfkill-gpio.c +++ b/net/rfkill/rfkill-gpio.c | |||
@@ -24,6 +24,8 @@ | |||
24 | #include <linux/platform_device.h> | 24 | #include <linux/platform_device.h> |
25 | #include <linux/clk.h> | 25 | #include <linux/clk.h> |
26 | #include <linux/slab.h> | 26 | #include <linux/slab.h> |
27 | #include <linux/acpi.h> | ||
28 | #include <linux/acpi_gpio.h> | ||
27 | 29 | ||
28 | #include <linux/rfkill-gpio.h> | 30 | #include <linux/rfkill-gpio.h> |
29 | 31 | ||
@@ -70,6 +72,23 @@ static const struct rfkill_ops rfkill_gpio_ops = { | |||
70 | .set_block = rfkill_gpio_set_power, | 72 | .set_block = rfkill_gpio_set_power, |
71 | }; | 73 | }; |
72 | 74 | ||
75 | static int rfkill_gpio_acpi_probe(struct device *dev, | ||
76 | struct rfkill_gpio_data *rfkill) | ||
77 | { | ||
78 | const struct acpi_device_id *id; | ||
79 | |||
80 | id = acpi_match_device(dev->driver->acpi_match_table, dev); | ||
81 | if (!id) | ||
82 | return -ENODEV; | ||
83 | |||
84 | rfkill->name = dev_name(dev); | ||
85 | rfkill->type = (unsigned)id->driver_data; | ||
86 | rfkill->reset_gpio = acpi_get_gpio_by_index(dev, 0, NULL); | ||
87 | rfkill->shutdown_gpio = acpi_get_gpio_by_index(dev, 1, NULL); | ||
88 | |||
89 | return 0; | ||
90 | } | ||
91 | |||
73 | static int rfkill_gpio_probe(struct platform_device *pdev) | 92 | static int rfkill_gpio_probe(struct platform_device *pdev) |
74 | { | 93 | { |
75 | struct rfkill_gpio_platform_data *pdata = pdev->dev.platform_data; | 94 | struct rfkill_gpio_platform_data *pdata = pdev->dev.platform_data; |
@@ -82,7 +101,11 @@ static int rfkill_gpio_probe(struct platform_device *pdev) | |||
82 | if (!rfkill) | 101 | if (!rfkill) |
83 | return -ENOMEM; | 102 | return -ENOMEM; |
84 | 103 | ||
85 | if (pdata) { | 104 | if (ACPI_HANDLE(&pdev->dev)) { |
105 | ret = rfkill_gpio_acpi_probe(&pdev->dev, rfkill); | ||
106 | if (ret) | ||
107 | return ret; | ||
108 | } else if (pdata) { | ||
86 | clk_name = pdata->power_clk_name; | 109 | clk_name = pdata->power_clk_name; |
87 | rfkill->name = pdata->name; | 110 | rfkill->name = pdata->name; |
88 | rfkill->type = pdata->type; | 111 | rfkill->type = pdata->type; |
@@ -170,12 +193,18 @@ static int rfkill_gpio_remove(struct platform_device *pdev) | |||
170 | return 0; | 193 | return 0; |
171 | } | 194 | } |
172 | 195 | ||
196 | static const struct acpi_device_id rfkill_acpi_match[] = { | ||
197 | { "BCM4752", RFKILL_TYPE_GPS }, | ||
198 | { }, | ||
199 | }; | ||
200 | |||
173 | static struct platform_driver rfkill_gpio_driver = { | 201 | static struct platform_driver rfkill_gpio_driver = { |
174 | .probe = rfkill_gpio_probe, | 202 | .probe = rfkill_gpio_probe, |
175 | .remove = rfkill_gpio_remove, | 203 | .remove = rfkill_gpio_remove, |
176 | .driver = { | 204 | .driver = { |
177 | .name = "rfkill_gpio", | 205 | .name = "rfkill_gpio", |
178 | .owner = THIS_MODULE, | 206 | .owner = THIS_MODULE, |
207 | .acpi_match_table = ACPI_PTR(rfkill_acpi_match), | ||
179 | }, | 208 | }, |
180 | }; | 209 | }; |
181 | 210 | ||