diff options
author | Chris Lapa <chris@lapa.com.au> | 2016-06-23 22:26:09 -0400 |
---|---|---|
committer | Sebastian Reichel <sre@kernel.org> | 2016-06-28 14:05:41 -0400 |
commit | 88a469bbb2012448db266f3783448c673be7208a (patch) | |
tree | 3818c7b4d0d5cb4c188fb2ea524c06af9b6c47db /drivers/power | |
parent | cbf9077e586b9c0db1a1ce5690552ae268c15848 (diff) |
max8903: adds requesting of gpios.
This change ensures all gpios are available for the driver to use and also
splits off gpio setup into its own function for readability.
Signed-off-by: Chris Lapa <chris@lapa.com.au>
Reviewed-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
Signed-off-by: Sebastian Reichel <sre@kernel.org>
Diffstat (limited to 'drivers/power')
-rw-r--r-- | drivers/power/max8903_charger.c | 136 |
1 files changed, 102 insertions, 34 deletions
diff --git a/drivers/power/max8903_charger.c b/drivers/power/max8903_charger.c index 6ec705f7a9d9..3f35593443b3 100644 --- a/drivers/power/max8903_charger.c +++ b/drivers/power/max8903_charger.c | |||
@@ -179,39 +179,27 @@ static irqreturn_t max8903_fault(int irq, void *_data) | |||
179 | return IRQ_HANDLED; | 179 | return IRQ_HANDLED; |
180 | } | 180 | } |
181 | 181 | ||
182 | static int max8903_probe(struct platform_device *pdev) | 182 | static int max8903_setup_gpios(struct platform_device *pdev) |
183 | { | 183 | { |
184 | struct max8903_data *data; | 184 | struct max8903_data *data = platform_get_drvdata(pdev); |
185 | struct device *dev = &pdev->dev; | 185 | struct device *dev = &pdev->dev; |
186 | struct max8903_pdata *pdata = pdev->dev.platform_data; | 186 | struct max8903_pdata *pdata = pdev->dev.platform_data; |
187 | struct power_supply_config psy_cfg = {}; | ||
188 | int ret = 0; | 187 | int ret = 0; |
189 | int gpio; | 188 | int gpio; |
190 | int ta_in = 0; | 189 | int ta_in = 0; |
191 | int usb_in = 0; | 190 | int usb_in = 0; |
192 | 191 | ||
193 | if (pdata == NULL) { | ||
194 | dev_err(dev, "No platform data.\n"); | ||
195 | return -EINVAL; | ||
196 | } | ||
197 | |||
198 | data = devm_kzalloc(dev, sizeof(struct max8903_data), GFP_KERNEL); | ||
199 | if (data == NULL) { | ||
200 | dev_err(dev, "Cannot allocate memory.\n"); | ||
201 | return -ENOMEM; | ||
202 | } | ||
203 | |||
204 | data->pdata = pdev->dev.platform_data; | ||
205 | data->dev = dev; | ||
206 | platform_set_drvdata(pdev, data); | ||
207 | |||
208 | if (pdata->dc_valid == false && pdata->usb_valid == false) { | ||
209 | dev_err(dev, "No valid power sources.\n"); | ||
210 | return -EINVAL; | ||
211 | } | ||
212 | |||
213 | if (pdata->dc_valid) { | 192 | if (pdata->dc_valid) { |
214 | if (pdata->dok && gpio_is_valid(pdata->dok)) { | 193 | if (pdata->dok && gpio_is_valid(pdata->dok)) { |
194 | ret = devm_gpio_request(dev, pdata->dok, | ||
195 | data->psy_desc.name); | ||
196 | if (ret) { | ||
197 | dev_err(dev, | ||
198 | "Failed GPIO request for dok: %d err %d\n", | ||
199 | pdata->dok, ret); | ||
200 | return ret; | ||
201 | } | ||
202 | |||
215 | gpio = pdata->dok; /* PULL_UPed Interrupt */ | 203 | gpio = pdata->dok; /* PULL_UPed Interrupt */ |
216 | ta_in = gpio_get_value(gpio) ? 0 : 1; | 204 | ta_in = gpio_get_value(gpio) ? 0 : 1; |
217 | } else { | 205 | } else { |
@@ -222,6 +210,15 @@ static int max8903_probe(struct platform_device *pdev) | |||
222 | 210 | ||
223 | if (pdata->dcm) { | 211 | if (pdata->dcm) { |
224 | if (gpio_is_valid(pdata->dcm)) { | 212 | if (gpio_is_valid(pdata->dcm)) { |
213 | ret = devm_gpio_request(dev, pdata->dcm, | ||
214 | data->psy_desc.name); | ||
215 | if (ret) { | ||
216 | dev_err(dev, | ||
217 | "Failed GPIO request for dcm: %d err %d\n", | ||
218 | pdata->dcm, ret); | ||
219 | return ret; | ||
220 | } | ||
221 | |||
225 | gpio = pdata->dcm; /* Output */ | 222 | gpio = pdata->dcm; /* Output */ |
226 | gpio_set_value(gpio, ta_in); | 223 | gpio_set_value(gpio, ta_in); |
227 | } else { | 224 | } else { |
@@ -232,6 +229,15 @@ static int max8903_probe(struct platform_device *pdev) | |||
232 | 229 | ||
233 | if (pdata->usb_valid) { | 230 | if (pdata->usb_valid) { |
234 | if (pdata->uok && gpio_is_valid(pdata->uok)) { | 231 | if (pdata->uok && gpio_is_valid(pdata->uok)) { |
232 | ret = devm_gpio_request(dev, pdata->uok, | ||
233 | data->psy_desc.name); | ||
234 | if (ret) { | ||
235 | dev_err(dev, | ||
236 | "Failed GPIO request for uok: %d err %d\n", | ||
237 | pdata->uok, ret); | ||
238 | return ret; | ||
239 | } | ||
240 | |||
235 | gpio = pdata->uok; | 241 | gpio = pdata->uok; |
236 | usb_in = gpio_get_value(gpio) ? 0 : 1; | 242 | usb_in = gpio_get_value(gpio) ? 0 : 1; |
237 | } else { | 243 | } else { |
@@ -243,6 +249,15 @@ static int max8903_probe(struct platform_device *pdev) | |||
243 | 249 | ||
244 | if (pdata->cen) { | 250 | if (pdata->cen) { |
245 | if (gpio_is_valid(pdata->cen)) { | 251 | if (gpio_is_valid(pdata->cen)) { |
252 | ret = devm_gpio_request(dev, pdata->cen, | ||
253 | data->psy_desc.name); | ||
254 | if (ret) { | ||
255 | dev_err(dev, | ||
256 | "Failed GPIO request for cen: %d err %d\n", | ||
257 | pdata->cen, ret); | ||
258 | return ret; | ||
259 | } | ||
260 | |||
246 | gpio_set_value(pdata->cen, (ta_in || usb_in) ? 0 : 1); | 261 | gpio_set_value(pdata->cen, (ta_in || usb_in) ? 0 : 1); |
247 | } else { | 262 | } else { |
248 | dev_err(dev, "Invalid pin: cen.\n"); | 263 | dev_err(dev, "Invalid pin: cen.\n"); |
@@ -251,23 +266,41 @@ static int max8903_probe(struct platform_device *pdev) | |||
251 | } | 266 | } |
252 | 267 | ||
253 | if (pdata->chg) { | 268 | if (pdata->chg) { |
254 | if (!gpio_is_valid(pdata->chg)) { | 269 | if (gpio_is_valid(pdata->chg)) { |
255 | dev_err(dev, "Invalid pin: chg.\n"); | 270 | ret = devm_gpio_request(dev, pdata->chg, |
256 | return -EINVAL; | 271 | data->psy_desc.name); |
272 | if (ret) { | ||
273 | dev_err(dev, | ||
274 | "Failed GPIO request for chg: %d err %d\n", | ||
275 | pdata->chg, ret); | ||
276 | return ret; | ||
277 | } | ||
257 | } | 278 | } |
258 | } | 279 | } |
259 | 280 | ||
260 | if (pdata->flt) { | 281 | if (pdata->flt) { |
261 | if (!gpio_is_valid(pdata->flt)) { | 282 | if (gpio_is_valid(pdata->flt)) { |
262 | dev_err(dev, "Invalid pin: flt.\n"); | 283 | ret = devm_gpio_request(dev, pdata->flt, |
263 | return -EINVAL; | 284 | data->psy_desc.name); |
285 | if (ret) { | ||
286 | dev_err(dev, | ||
287 | "Failed GPIO request for flt: %d err %d\n", | ||
288 | pdata->flt, ret); | ||
289 | return ret; | ||
290 | } | ||
264 | } | 291 | } |
265 | } | 292 | } |
266 | 293 | ||
267 | if (pdata->usus) { | 294 | if (pdata->usus) { |
268 | if (!gpio_is_valid(pdata->usus)) { | 295 | if (gpio_is_valid(pdata->usus)) { |
269 | dev_err(dev, "Invalid pin: usus.\n"); | 296 | ret = devm_gpio_request(dev, pdata->usus, |
270 | return -EINVAL; | 297 | data->psy_desc.name); |
298 | if (ret) { | ||
299 | dev_err(dev, | ||
300 | "Failed GPIO request for usus: %d err %d\n", | ||
301 | pdata->usus, ret); | ||
302 | return ret; | ||
303 | } | ||
271 | } | 304 | } |
272 | } | 305 | } |
273 | 306 | ||
@@ -275,9 +308,44 @@ static int max8903_probe(struct platform_device *pdev) | |||
275 | data->ta_in = ta_in; | 308 | data->ta_in = ta_in; |
276 | data->usb_in = usb_in; | 309 | data->usb_in = usb_in; |
277 | 310 | ||
311 | return 0; | ||
312 | } | ||
313 | |||
314 | static int max8903_probe(struct platform_device *pdev) | ||
315 | { | ||
316 | struct max8903_data *data; | ||
317 | struct device *dev = &pdev->dev; | ||
318 | struct max8903_pdata *pdata = pdev->dev.platform_data; | ||
319 | struct power_supply_config psy_cfg = {}; | ||
320 | int ret = 0; | ||
321 | |||
322 | if (pdata == NULL) { | ||
323 | dev_err(dev, "No platform data.\n"); | ||
324 | return -EINVAL; | ||
325 | } | ||
326 | |||
327 | data = devm_kzalloc(dev, sizeof(struct max8903_data), GFP_KERNEL); | ||
328 | if (data == NULL) { | ||
329 | dev_err(dev, "Cannot allocate memory.\n"); | ||
330 | return -ENOMEM; | ||
331 | } | ||
332 | |||
333 | data->pdata = pdev->dev.platform_data; | ||
334 | data->dev = dev; | ||
335 | platform_set_drvdata(pdev, data); | ||
336 | |||
337 | if (pdata->dc_valid == false && pdata->usb_valid == false) { | ||
338 | dev_err(dev, "No valid power sources.\n"); | ||
339 | return -EINVAL; | ||
340 | } | ||
341 | |||
342 | ret = max8903_setup_gpios(pdev); | ||
343 | if (ret) | ||
344 | return ret; | ||
345 | |||
278 | data->psy_desc.name = "max8903_charger"; | 346 | data->psy_desc.name = "max8903_charger"; |
279 | data->psy_desc.type = (ta_in) ? POWER_SUPPLY_TYPE_MAINS : | 347 | data->psy_desc.type = (data->ta_in) ? POWER_SUPPLY_TYPE_MAINS : |
280 | ((usb_in) ? POWER_SUPPLY_TYPE_USB : | 348 | ((data->usb_in) ? POWER_SUPPLY_TYPE_USB : |
281 | POWER_SUPPLY_TYPE_BATTERY); | 349 | POWER_SUPPLY_TYPE_BATTERY); |
282 | data->psy_desc.get_property = max8903_get_property; | 350 | data->psy_desc.get_property = max8903_get_property; |
283 | data->psy_desc.properties = max8903_charger_props; | 351 | data->psy_desc.properties = max8903_charger_props; |