aboutsummaryrefslogtreecommitdiffstats
path: root/net/rfkill
diff options
context:
space:
mode:
authorHeikki Krogerus <heikki.krogerus@linux.intel.com>2013-10-16 06:53:42 -0400
committerJohannes Berg <johannes.berg@intel.com>2013-10-28 10:05:25 -0400
commit262c91ee5e524238d4dabf908c88f8518ed334ce (patch)
treedac63459b5f69a8628a8f3dd49e28f7b05f851b8 /net/rfkill
parent0be81727a48cc28c1219395f32da8ccc99d6c6d0 (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.c92
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
30struct rfkill_gpio_data { 30struct 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
39static int rfkill_gpio_set_power(void *data, bool blocked) 44static 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
68static int rfkill_gpio_probe(struct platform_device *pdev) 73static 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