Lines Matching refs:gpio_charger
25 struct gpio_charger { struct
51 static inline struct gpio_charger *psy_to_gpio_charger(struct power_supply *psy) in psy_to_gpio_charger() argument
56 static int set_charge_current_limit(struct gpio_charger *gpio_charger, int val) in set_charge_current_limit() argument
59 int ndescs = gpio_charger->current_limit_gpios->ndescs; in set_charge_current_limit()
60 struct gpio_desc **gpios = gpio_charger->current_limit_gpios->desc; in set_charge_current_limit()
63 if (!gpio_charger->current_limit_map_size) in set_charge_current_limit()
66 for (i = 0; i < gpio_charger->current_limit_map_size; i++) { in set_charge_current_limit()
67 if (gpio_charger->current_limit_map[i].limit_ua <= val) in set_charge_current_limit()
75 if (i >= gpio_charger->current_limit_map_size) in set_charge_current_limit()
76 i = gpio_charger->current_limit_map_size - 1; in set_charge_current_limit()
78 mapping = gpio_charger->current_limit_map[i]; in set_charge_current_limit()
85 gpio_charger->charge_current_limit = mapping.limit_ua; in set_charge_current_limit()
87 dev_dbg(gpio_charger->dev, "set charge current limit to %d (requested: %d)\n", in set_charge_current_limit()
88 gpio_charger->charge_current_limit, val); in set_charge_current_limit()
96 struct gpio_charger *gpio_charger = psy_to_gpio_charger(psy); in gpio_charger_get_property() local
100 val->intval = gpiod_get_value_cansleep(gpio_charger->gpiod); in gpio_charger_get_property()
103 if (gpiod_get_value_cansleep(gpio_charger->charge_status)) in gpio_charger_get_property()
109 val->intval = gpio_charger->charge_current_limit; in gpio_charger_get_property()
121 struct gpio_charger *gpio_charger = psy_to_gpio_charger(psy); in gpio_charger_set_property() local
125 return set_charge_current_limit(gpio_charger, val->intval); in gpio_charger_set_property()
194 struct gpio_charger *gpio_charger) in init_charge_current_limit() argument
201 gpio_charger->current_limit_gpios = devm_gpiod_get_array_optional(dev, in init_charge_current_limit()
203 if (IS_ERR(gpio_charger->current_limit_gpios)) { in init_charge_current_limit()
205 return PTR_ERR(gpio_charger->current_limit_gpios); in init_charge_current_limit()
208 if (!gpio_charger->current_limit_gpios) in init_charge_current_limit()
221 gpio_charger->current_limit_map = devm_kmalloc_array(dev, in init_charge_current_limit()
222 len / 2, sizeof(*gpio_charger->current_limit_map), GFP_KERNEL); in init_charge_current_limit()
223 if (!gpio_charger->current_limit_map) in init_charge_current_limit()
226 gpio_charger->current_limit_map_size = len / 2; in init_charge_current_limit()
229 (u32*) gpio_charger->current_limit_map, len); in init_charge_current_limit()
236 for (i=0; i < gpio_charger->current_limit_map_size; i++) { in init_charge_current_limit()
237 if (gpio_charger->current_limit_map[i].limit_ua > cur_limit) { in init_charge_current_limit()
242 cur_limit = gpio_charger->current_limit_map[i].limit_ua; in init_charge_current_limit()
244 set_charge_current_limit(gpio_charger, cur_limit); in init_charge_current_limit()
254 len = gpio_charger->current_limit_map_size - 1; in init_charge_current_limit()
255 set_charge_current_limit(gpio_charger, in init_charge_current_limit()
256 gpio_charger->current_limit_map[len].limit_ua); in init_charge_current_limit()
277 struct gpio_charger *gpio_charger; in gpio_charger_probe() local
289 gpio_charger = devm_kzalloc(dev, sizeof(*gpio_charger), GFP_KERNEL); in gpio_charger_probe()
290 if (!gpio_charger) in gpio_charger_probe()
292 gpio_charger->dev = dev; in gpio_charger_probe()
298 gpio_charger->gpiod = devm_gpiod_get_optional(dev, NULL, GPIOD_IN); in gpio_charger_probe()
299 if (IS_ERR(gpio_charger->gpiod)) { in gpio_charger_probe()
301 return dev_err_probe(dev, PTR_ERR(gpio_charger->gpiod), in gpio_charger_probe()
305 if (gpio_charger->gpiod) { in gpio_charger_probe()
314 gpio_charger->charge_status = charge_status; in gpio_charger_probe()
319 ret = init_charge_current_limit(dev, gpio_charger); in gpio_charger_probe()
322 if (gpio_charger->current_limit_map) { in gpio_charger_probe()
328 charger_desc = &gpio_charger->charger_desc; in gpio_charger_probe()
337 psy_cfg.drv_data = gpio_charger; in gpio_charger_probe()
352 gpio_charger->charger = devm_power_supply_register(dev, charger_desc, in gpio_charger_probe()
354 if (IS_ERR(gpio_charger->charger)) { in gpio_charger_probe()
355 ret = PTR_ERR(gpio_charger->charger); in gpio_charger_probe()
360 gpio_charger->irq = gpio_charger_get_irq(dev, gpio_charger->charger, in gpio_charger_probe()
361 gpio_charger->gpiod); in gpio_charger_probe()
363 charge_status_irq = gpio_charger_get_irq(dev, gpio_charger->charger, in gpio_charger_probe()
364 gpio_charger->charge_status); in gpio_charger_probe()
365 gpio_charger->charge_status_irq = charge_status_irq; in gpio_charger_probe()
367 platform_set_drvdata(pdev, gpio_charger); in gpio_charger_probe()
377 struct gpio_charger *gpio_charger = dev_get_drvdata(dev); in gpio_charger_suspend() local
380 gpio_charger->wakeup_enabled = in gpio_charger_suspend()
381 !enable_irq_wake(gpio_charger->irq); in gpio_charger_suspend()
388 struct gpio_charger *gpio_charger = dev_get_drvdata(dev); in gpio_charger_resume() local
390 if (device_may_wakeup(dev) && gpio_charger->wakeup_enabled) in gpio_charger_resume()
391 disable_irq_wake(gpio_charger->irq); in gpio_charger_resume()
392 power_supply_changed(gpio_charger->charger); in gpio_charger_resume()