diff options
author | Heikki Krogerus <heikki.krogerus@linux.intel.com> | 2013-10-16 06:53:42 -0400 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2013-10-28 10:05:25 -0400 |
commit | 262c91ee5e524238d4dabf908c88f8518ed334ce (patch) | |
tree | dac63459b5f69a8628a8f3dd49e28f7b05f851b8 /net/rfkill | |
parent | 0be81727a48cc28c1219395f32da8ccc99d6c6d0 (diff) |
net: rfkill: gpio: prepare for DT and ACPI support
This will add the relevant values like the gpios and the
type in rfkill_gpio_platform_data to the rfkill_gpio_data
structure. It will allow those values to be easily picked
from DT and ACPI tables later.
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>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/rfkill')
-rw-r--r-- | net/rfkill/rfkill-gpio.c | 92 |
1 files changed, 51 insertions, 41 deletions
diff --git a/net/rfkill/rfkill-gpio.c b/net/rfkill/rfkill-gpio.c index aa4ac108c330..2dd78c628d86 100644 --- a/net/rfkill/rfkill-gpio.c +++ b/net/rfkill/rfkill-gpio.c | |||
@@ -28,12 +28,17 @@ | |||
28 | #include <linux/rfkill-gpio.h> | 28 | #include <linux/rfkill-gpio.h> |
29 | 29 | ||
30 | struct rfkill_gpio_data { | 30 | struct rfkill_gpio_data { |
31 | struct rfkill_gpio_platform_data *pdata; | 31 | const char *name; |
32 | struct rfkill *rfkill_dev; | 32 | enum rfkill_type type; |
33 | char *reset_name; | 33 | int reset_gpio; |
34 | char *shutdown_name; | 34 | int shutdown_gpio; |
35 | struct clk *clk; | 35 | |
36 | bool clk_enabled; | 36 | struct rfkill *rfkill_dev; |
37 | char *reset_name; | ||
38 | char *shutdown_name; | ||
39 | struct clk *clk; | ||
40 | |||
41 | bool clk_enabled; | ||
37 | }; | 42 | }; |
38 | 43 | ||
39 | static int rfkill_gpio_set_power(void *data, bool blocked) | 44 | static int rfkill_gpio_set_power(void *data, bool blocked) |
@@ -41,19 +46,19 @@ static int rfkill_gpio_set_power(void *data, bool blocked) | |||
41 | struct rfkill_gpio_data *rfkill = data; | 46 | struct rfkill_gpio_data *rfkill = data; |
42 | 47 | ||
43 | if (blocked) { | 48 | if (blocked) { |
44 | if (gpio_is_valid(rfkill->pdata->shutdown_gpio)) | 49 | if (gpio_is_valid(rfkill->shutdown_gpio)) |
45 | gpio_set_value(rfkill->pdata->shutdown_gpio, 0); | 50 | gpio_set_value(rfkill->shutdown_gpio, 0); |
46 | if (gpio_is_valid(rfkill->pdata->reset_gpio)) | 51 | if (gpio_is_valid(rfkill->reset_gpio)) |
47 | gpio_set_value(rfkill->pdata->reset_gpio, 0); | 52 | gpio_set_value(rfkill->reset_gpio, 0); |
48 | if (!IS_ERR(rfkill->clk) && rfkill->clk_enabled) | 53 | if (!IS_ERR(rfkill->clk) && rfkill->clk_enabled) |
49 | clk_disable(rfkill->clk); | 54 | clk_disable(rfkill->clk); |
50 | } else { | 55 | } else { |
51 | if (!IS_ERR(rfkill->clk) && !rfkill->clk_enabled) | 56 | if (!IS_ERR(rfkill->clk) && !rfkill->clk_enabled) |
52 | clk_enable(rfkill->clk); | 57 | clk_enable(rfkill->clk); |
53 | if (gpio_is_valid(rfkill->pdata->reset_gpio)) | 58 | if (gpio_is_valid(rfkill->reset_gpio)) |
54 | gpio_set_value(rfkill->pdata->reset_gpio, 1); | 59 | gpio_set_value(rfkill->reset_gpio, 1); |
55 | if (gpio_is_valid(rfkill->pdata->shutdown_gpio)) | 60 | if (gpio_is_valid(rfkill->shutdown_gpio)) |
56 | gpio_set_value(rfkill->pdata->shutdown_gpio, 1); | 61 | gpio_set_value(rfkill->shutdown_gpio, 1); |
57 | } | 62 | } |
58 | 63 | ||
59 | rfkill->clk_enabled = blocked; | 64 | rfkill->clk_enabled = blocked; |
@@ -67,29 +72,35 @@ static const struct rfkill_ops rfkill_gpio_ops = { | |||
67 | 72 | ||
68 | static int rfkill_gpio_probe(struct platform_device *pdev) | 73 | static int rfkill_gpio_probe(struct platform_device *pdev) |
69 | { | 74 | { |
70 | struct rfkill_gpio_data *rfkill; | ||
71 | struct rfkill_gpio_platform_data *pdata = pdev->dev.platform_data; | 75 | struct rfkill_gpio_platform_data *pdata = pdev->dev.platform_data; |
76 | struct rfkill_gpio_data *rfkill; | ||
77 | const char *clk_name = NULL; | ||
72 | int ret = 0; | 78 | int ret = 0; |
73 | int len = 0; | 79 | int len = 0; |
74 | 80 | ||
75 | if (!pdata) { | 81 | rfkill = devm_kzalloc(&pdev->dev, sizeof(*rfkill), GFP_KERNEL); |
76 | pr_warn("%s: No platform data specified\n", __func__); | 82 | if (!rfkill) |
77 | return -EINVAL; | 83 | return -ENOMEM; |
84 | |||
85 | if (pdata) { | ||
86 | clk_name = pdata->power_clk_name; | ||
87 | rfkill->name = pdata->name; | ||
88 | rfkill->type = pdata->type; | ||
89 | rfkill->reset_gpio = pdata->reset_gpio; | ||
90 | rfkill->shutdown_gpio = pdata->shutdown_gpio; | ||
91 | } else { | ||
92 | return -ENODEV; | ||
78 | } | 93 | } |
79 | 94 | ||
80 | /* make sure at-least one of the GPIO is defined and that | 95 | /* make sure at-least one of the GPIO is defined and that |
81 | * a name is specified for this instance */ | 96 | * a name is specified for this instance */ |
82 | if (!pdata->name || (!gpio_is_valid(pdata->reset_gpio) && | 97 | if ((!gpio_is_valid(rfkill->reset_gpio) && |
83 | !gpio_is_valid(pdata->shutdown_gpio))) { | 98 | !gpio_is_valid(rfkill->shutdown_gpio)) || !rfkill->name) { |
84 | pr_warn("%s: invalid platform data\n", __func__); | 99 | pr_warn("%s: invalid platform data\n", __func__); |
85 | return -EINVAL; | 100 | return -EINVAL; |
86 | } | 101 | } |
87 | 102 | ||
88 | rfkill = devm_kzalloc(&pdev->dev, sizeof(*rfkill), GFP_KERNEL); | 103 | if (pdata && pdata->gpio_runtime_setup) { |
89 | if (!rfkill) | ||
90 | return -ENOMEM; | ||
91 | |||
92 | if (pdata->gpio_runtime_setup) { | ||
93 | ret = pdata->gpio_runtime_setup(pdev); | 104 | ret = pdata->gpio_runtime_setup(pdev); |
94 | if (ret) { | 105 | if (ret) { |
95 | pr_warn("%s: can't set up gpio\n", __func__); | 106 | pr_warn("%s: can't set up gpio\n", __func__); |
@@ -97,9 +108,7 @@ static int rfkill_gpio_probe(struct platform_device *pdev) | |||
97 | } | 108 | } |
98 | } | 109 | } |
99 | 110 | ||
100 | rfkill->pdata = pdata; | 111 | len = strlen(rfkill->name); |
101 | |||
102 | len = strlen(pdata->name); | ||
103 | rfkill->reset_name = devm_kzalloc(&pdev->dev, len + 7, GFP_KERNEL); | 112 | rfkill->reset_name = devm_kzalloc(&pdev->dev, len + 7, GFP_KERNEL); |
104 | if (!rfkill->reset_name) | 113 | if (!rfkill->reset_name) |
105 | return -ENOMEM; | 114 | return -ENOMEM; |
@@ -108,13 +117,13 @@ static int rfkill_gpio_probe(struct platform_device *pdev) | |||
108 | if (!rfkill->shutdown_name) | 117 | if (!rfkill->shutdown_name) |
109 | return -ENOMEM; | 118 | return -ENOMEM; |
110 | 119 | ||
111 | snprintf(rfkill->reset_name, len + 6 , "%s_reset", pdata->name); | 120 | snprintf(rfkill->reset_name, len + 6 , "%s_reset", rfkill->name); |
112 | snprintf(rfkill->shutdown_name, len + 9, "%s_shutdown", pdata->name); | 121 | snprintf(rfkill->shutdown_name, len + 9, "%s_shutdown", rfkill->name); |
113 | 122 | ||
114 | rfkill->clk = devm_clk_get(&pdev->dev, pdata->power_clk_name); | 123 | rfkill->clk = devm_clk_get(&pdev->dev, clk_name); |
115 | 124 | ||
116 | if (gpio_is_valid(pdata->reset_gpio)) { | 125 | if (gpio_is_valid(rfkill->reset_gpio)) { |
117 | ret = devm_gpio_request_one(&pdev->dev, pdata->reset_gpio, | 126 | ret = devm_gpio_request_one(&pdev->dev, rfkill->reset_gpio, |
118 | 0, rfkill->reset_name); | 127 | 0, rfkill->reset_name); |
119 | if (ret) { | 128 | if (ret) { |
120 | pr_warn("%s: failed to get reset gpio.\n", __func__); | 129 | pr_warn("%s: failed to get reset gpio.\n", __func__); |
@@ -122,8 +131,8 @@ static int rfkill_gpio_probe(struct platform_device *pdev) | |||
122 | } | 131 | } |
123 | } | 132 | } |
124 | 133 | ||
125 | if (gpio_is_valid(pdata->shutdown_gpio)) { | 134 | if (gpio_is_valid(rfkill->shutdown_gpio)) { |
126 | ret = devm_gpio_request_one(&pdev->dev, pdata->shutdown_gpio, | 135 | ret = devm_gpio_request_one(&pdev->dev, rfkill->shutdown_gpio, |
127 | 0, rfkill->shutdown_name); | 136 | 0, rfkill->shutdown_name); |
128 | if (ret) { | 137 | if (ret) { |
129 | pr_warn("%s: failed to get shutdown gpio.\n", __func__); | 138 | pr_warn("%s: failed to get shutdown gpio.\n", __func__); |
@@ -131,8 +140,9 @@ static int rfkill_gpio_probe(struct platform_device *pdev) | |||
131 | } | 140 | } |
132 | } | 141 | } |
133 | 142 | ||
134 | rfkill->rfkill_dev = rfkill_alloc(pdata->name, &pdev->dev, pdata->type, | 143 | rfkill->rfkill_dev = rfkill_alloc(rfkill->name, &pdev->dev, |
135 | &rfkill_gpio_ops, rfkill); | 144 | rfkill->type, &rfkill_gpio_ops, |
145 | rfkill); | ||
136 | if (!rfkill->rfkill_dev) | 146 | if (!rfkill->rfkill_dev) |
137 | return -ENOMEM; | 147 | return -ENOMEM; |
138 | 148 | ||
@@ -142,7 +152,7 @@ static int rfkill_gpio_probe(struct platform_device *pdev) | |||
142 | 152 | ||
143 | platform_set_drvdata(pdev, rfkill); | 153 | platform_set_drvdata(pdev, rfkill); |
144 | 154 | ||
145 | dev_info(&pdev->dev, "%s device registered.\n", pdata->name); | 155 | dev_info(&pdev->dev, "%s device registered.\n", rfkill->name); |
146 | 156 | ||
147 | return 0; | 157 | return 0; |
148 | } | 158 | } |
@@ -152,7 +162,7 @@ static int rfkill_gpio_remove(struct platform_device *pdev) | |||
152 | struct rfkill_gpio_data *rfkill = platform_get_drvdata(pdev); | 162 | struct rfkill_gpio_data *rfkill = platform_get_drvdata(pdev); |
153 | struct rfkill_gpio_platform_data *pdata = pdev->dev.platform_data; | 163 | struct rfkill_gpio_platform_data *pdata = pdev->dev.platform_data; |
154 | 164 | ||
155 | if (pdata->gpio_runtime_close) | 165 | if (pdata && pdata->gpio_runtime_close) |
156 | pdata->gpio_runtime_close(pdev); | 166 | pdata->gpio_runtime_close(pdev); |
157 | rfkill_unregister(rfkill->rfkill_dev); | 167 | rfkill_unregister(rfkill->rfkill_dev); |
158 | rfkill_destroy(rfkill->rfkill_dev); | 168 | rfkill_destroy(rfkill->rfkill_dev); |
@@ -164,8 +174,8 @@ static struct platform_driver rfkill_gpio_driver = { | |||
164 | .probe = rfkill_gpio_probe, | 174 | .probe = rfkill_gpio_probe, |
165 | .remove = rfkill_gpio_remove, | 175 | .remove = rfkill_gpio_remove, |
166 | .driver = { | 176 | .driver = { |
167 | .name = "rfkill_gpio", | 177 | .name = "rfkill_gpio", |
168 | .owner = THIS_MODULE, | 178 | .owner = THIS_MODULE, |
169 | }, | 179 | }, |
170 | }; | 180 | }; |
171 | 181 | ||