diff options
author | Heikki Krogerus <heikki.krogerus@linux.intel.com> | 2013-11-26 05:05:46 -0500 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2014-01-07 12:45:20 -0500 |
commit | 2111cad655e32d0ab39d440d26c3e2ce5ba5b802 (patch) | |
tree | 10cf3077025ec7ad188081cc54bee1a42d207341 /net/rfkill | |
parent | 224feb33a645a953634f64fe9092b9ee7dd72541 (diff) |
net: rfkill: gpio: convert to descriptor-based GPIO interface
Convert to the safer gpiod_* family of API functions.
Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Tested-by: Stephen Warren <swarren@nvidia.com>
Acked-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'net/rfkill')
-rw-r--r-- | net/rfkill/rfkill-gpio.c | 77 |
1 files changed, 34 insertions, 43 deletions
diff --git a/net/rfkill/rfkill-gpio.c b/net/rfkill/rfkill-gpio.c index 5620d3c07479..bd2a5b90400c 100644 --- a/net/rfkill/rfkill-gpio.c +++ b/net/rfkill/rfkill-gpio.c | |||
@@ -25,15 +25,15 @@ | |||
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> | 27 | #include <linux/acpi.h> |
28 | #include <linux/acpi_gpio.h> | 28 | #include <linux/gpio/consumer.h> |
29 | 29 | ||
30 | #include <linux/rfkill-gpio.h> | 30 | #include <linux/rfkill-gpio.h> |
31 | 31 | ||
32 | struct rfkill_gpio_data { | 32 | struct rfkill_gpio_data { |
33 | const char *name; | 33 | const char *name; |
34 | enum rfkill_type type; | 34 | enum rfkill_type type; |
35 | int reset_gpio; | 35 | struct gpio_desc *reset_gpio; |
36 | int shutdown_gpio; | 36 | struct gpio_desc *shutdown_gpio; |
37 | 37 | ||
38 | struct rfkill *rfkill_dev; | 38 | struct rfkill *rfkill_dev; |
39 | char *reset_name; | 39 | char *reset_name; |
@@ -48,19 +48,15 @@ static int rfkill_gpio_set_power(void *data, bool blocked) | |||
48 | struct rfkill_gpio_data *rfkill = data; | 48 | struct rfkill_gpio_data *rfkill = data; |
49 | 49 | ||
50 | if (blocked) { | 50 | if (blocked) { |
51 | if (gpio_is_valid(rfkill->shutdown_gpio)) | 51 | gpiod_set_value(rfkill->shutdown_gpio, 0); |
52 | gpio_set_value(rfkill->shutdown_gpio, 0); | 52 | gpiod_set_value(rfkill->reset_gpio, 0); |
53 | if (gpio_is_valid(rfkill->reset_gpio)) | ||
54 | gpio_set_value(rfkill->reset_gpio, 0); | ||
55 | if (!IS_ERR(rfkill->clk) && rfkill->clk_enabled) | 53 | if (!IS_ERR(rfkill->clk) && rfkill->clk_enabled) |
56 | clk_disable(rfkill->clk); | 54 | clk_disable(rfkill->clk); |
57 | } else { | 55 | } else { |
58 | if (!IS_ERR(rfkill->clk) && !rfkill->clk_enabled) | 56 | if (!IS_ERR(rfkill->clk) && !rfkill->clk_enabled) |
59 | clk_enable(rfkill->clk); | 57 | clk_enable(rfkill->clk); |
60 | if (gpio_is_valid(rfkill->reset_gpio)) | 58 | gpiod_set_value(rfkill->reset_gpio, 1); |
61 | gpio_set_value(rfkill->reset_gpio, 1); | 59 | gpiod_set_value(rfkill->shutdown_gpio, 1); |
62 | if (gpio_is_valid(rfkill->shutdown_gpio)) | ||
63 | gpio_set_value(rfkill->shutdown_gpio, 1); | ||
64 | } | 60 | } |
65 | 61 | ||
66 | rfkill->clk_enabled = blocked; | 62 | rfkill->clk_enabled = blocked; |
@@ -83,8 +79,6 @@ static int rfkill_gpio_acpi_probe(struct device *dev, | |||
83 | 79 | ||
84 | rfkill->name = dev_name(dev); | 80 | rfkill->name = dev_name(dev); |
85 | rfkill->type = (unsigned)id->driver_data; | 81 | 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 | 82 | ||
89 | return 0; | 83 | return 0; |
90 | } | 84 | } |
@@ -94,8 +88,9 @@ static int rfkill_gpio_probe(struct platform_device *pdev) | |||
94 | struct rfkill_gpio_platform_data *pdata = pdev->dev.platform_data; | 88 | struct rfkill_gpio_platform_data *pdata = pdev->dev.platform_data; |
95 | struct rfkill_gpio_data *rfkill; | 89 | struct rfkill_gpio_data *rfkill; |
96 | const char *clk_name = NULL; | 90 | const char *clk_name = NULL; |
97 | int ret = 0; | 91 | struct gpio_desc *gpio; |
98 | int len = 0; | 92 | int ret; |
93 | int len; | ||
99 | 94 | ||
100 | rfkill = devm_kzalloc(&pdev->dev, sizeof(*rfkill), GFP_KERNEL); | 95 | rfkill = devm_kzalloc(&pdev->dev, sizeof(*rfkill), GFP_KERNEL); |
101 | if (!rfkill) | 96 | if (!rfkill) |
@@ -109,28 +104,10 @@ static int rfkill_gpio_probe(struct platform_device *pdev) | |||
109 | clk_name = pdata->power_clk_name; | 104 | clk_name = pdata->power_clk_name; |
110 | rfkill->name = pdata->name; | 105 | rfkill->name = pdata->name; |
111 | rfkill->type = pdata->type; | 106 | rfkill->type = pdata->type; |
112 | rfkill->reset_gpio = pdata->reset_gpio; | ||
113 | rfkill->shutdown_gpio = pdata->shutdown_gpio; | ||
114 | } else { | 107 | } else { |
115 | return -ENODEV; | 108 | return -ENODEV; |
116 | } | 109 | } |
117 | 110 | ||
118 | /* make sure at-least one of the GPIO is defined and that | ||
119 | * a name is specified for this instance */ | ||
120 | if ((!gpio_is_valid(rfkill->reset_gpio) && | ||
121 | !gpio_is_valid(rfkill->shutdown_gpio)) || !rfkill->name) { | ||
122 | pr_warn("%s: invalid platform data\n", __func__); | ||
123 | return -EINVAL; | ||
124 | } | ||
125 | |||
126 | if (pdata && pdata->gpio_runtime_setup) { | ||
127 | ret = pdata->gpio_runtime_setup(pdev); | ||
128 | if (ret) { | ||
129 | pr_warn("%s: can't set up gpio\n", __func__); | ||
130 | return ret; | ||
131 | } | ||
132 | } | ||
133 | |||
134 | len = strlen(rfkill->name); | 111 | len = strlen(rfkill->name); |
135 | rfkill->reset_name = devm_kzalloc(&pdev->dev, len + 7, GFP_KERNEL); | 112 | rfkill->reset_name = devm_kzalloc(&pdev->dev, len + 7, GFP_KERNEL); |
136 | if (!rfkill->reset_name) | 113 | if (!rfkill->reset_name) |
@@ -145,20 +122,34 @@ static int rfkill_gpio_probe(struct platform_device *pdev) | |||
145 | 122 | ||
146 | rfkill->clk = devm_clk_get(&pdev->dev, clk_name); | 123 | rfkill->clk = devm_clk_get(&pdev->dev, clk_name); |
147 | 124 | ||
148 | if (gpio_is_valid(rfkill->reset_gpio)) { | 125 | gpio = devm_gpiod_get_index(&pdev->dev, rfkill->reset_name, 0); |
149 | ret = devm_gpio_request_one(&pdev->dev, rfkill->reset_gpio, | 126 | if (!IS_ERR(gpio)) { |
150 | 0, rfkill->reset_name); | 127 | ret = gpiod_direction_output(gpio, 0); |
151 | if (ret) { | 128 | if (ret) |
152 | pr_warn("%s: failed to get reset gpio.\n", __func__); | ||
153 | return ret; | 129 | return ret; |
154 | } | 130 | rfkill->reset_gpio = gpio; |
131 | } | ||
132 | |||
133 | gpio = devm_gpiod_get_index(&pdev->dev, rfkill->shutdown_name, 1); | ||
134 | if (!IS_ERR(gpio)) { | ||
135 | ret = gpiod_direction_output(gpio, 0); | ||
136 | if (ret) | ||
137 | return ret; | ||
138 | rfkill->shutdown_gpio = gpio; | ||
155 | } | 139 | } |
156 | 140 | ||
157 | if (gpio_is_valid(rfkill->shutdown_gpio)) { | 141 | /* Make sure at-least one of the GPIO is defined and that |
158 | ret = devm_gpio_request_one(&pdev->dev, rfkill->shutdown_gpio, | 142 | * a name is specified for this instance |
159 | 0, rfkill->shutdown_name); | 143 | */ |
144 | if ((!rfkill->reset_gpio && !rfkill->shutdown_gpio) || !rfkill->name) { | ||
145 | dev_err(&pdev->dev, "invalid platform data\n"); | ||
146 | return -EINVAL; | ||
147 | } | ||
148 | |||
149 | if (pdata && pdata->gpio_runtime_setup) { | ||
150 | ret = pdata->gpio_runtime_setup(pdev); | ||
160 | if (ret) { | 151 | if (ret) { |
161 | pr_warn("%s: failed to get shutdown gpio.\n", __func__); | 152 | dev_err(&pdev->dev, "can't set up gpio\n"); |
162 | return ret; | 153 | return ret; |
163 | } | 154 | } |
164 | } | 155 | } |