ARM: pxa: magician: Fix and add charging detection functions

This patch fixes the charging detection functions for pda_power driver
(according to newly discovered EGPIOs) and add NiCd backup accumulator
charging support.

Signed-off-by: Petr Cvek <petr.cvek@tul.cz>
Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr>
This commit is contained in:
Petr Cvek 2015-09-28 23:33:02 +02:00 committed by Robert Jarzmik
parent e7b97a4ce7
commit eac2eacc30

View file

@ -518,18 +518,59 @@ static struct platform_device gpio_vbus = {
* External power * External power
*/ */
static int power_supply_init(struct device *dev) static int magician_supply_init(struct device *dev)
{ {
return gpio_request(EGPIO_MAGICIAN_CABLE_TYPE, "Cable USB/AC type"); int ret = -1;
ret = gpio_request(EGPIO_MAGICIAN_CABLE_TYPE, "Cable is AC charger");
if (ret) {
pr_err("Cannot request AC/USB charger GPIO (%i)\n", ret);
goto err_ac;
}
ret = gpio_request(EGPIO_MAGICIAN_CABLE_INSERTED, "Cable inserted");
if (ret) {
pr_err("Cannot request cable detection GPIO (%i)\n", ret);
goto err_usb;
}
return 0;
err_usb:
gpio_free(EGPIO_MAGICIAN_CABLE_TYPE);
err_ac:
return ret;
}
static void magician_set_charge(int flags)
{
if (flags & PDA_POWER_CHARGE_AC) {
pr_debug("Charging from AC\n");
gpio_set_value(EGPIO_MAGICIAN_NICD_CHARGE, 1);
} else if (flags & PDA_POWER_CHARGE_USB) {
pr_debug("Charging from USB\n");
gpio_set_value(EGPIO_MAGICIAN_NICD_CHARGE, 1);
} else {
pr_debug("Charging disabled\n");
gpio_set_value(EGPIO_MAGICIAN_NICD_CHARGE, 0);
}
} }
static int magician_is_ac_online(void) static int magician_is_ac_online(void)
{ {
return gpio_get_value(EGPIO_MAGICIAN_CABLE_TYPE); return gpio_get_value(EGPIO_MAGICIAN_CABLE_INSERTED) &&
gpio_get_value(EGPIO_MAGICIAN_CABLE_TYPE); /* AC=1 */
} }
static void power_supply_exit(struct device *dev) static int magician_is_usb_online(void)
{ {
return gpio_get_value(EGPIO_MAGICIAN_CABLE_INSERTED) &&
(!gpio_get_value(EGPIO_MAGICIAN_CABLE_TYPE)); /* USB=0 */
}
static void magician_supply_exit(struct device *dev)
{
gpio_free(EGPIO_MAGICIAN_CABLE_INSERTED);
gpio_free(EGPIO_MAGICIAN_CABLE_TYPE); gpio_free(EGPIO_MAGICIAN_CABLE_TYPE);
} }
@ -538,9 +579,11 @@ static char *magician_supplicants[] = {
}; };
static struct pda_power_pdata power_supply_info = { static struct pda_power_pdata power_supply_info = {
.init = power_supply_init, .init = magician_supply_init,
.exit = magician_supply_exit,
.is_ac_online = magician_is_ac_online, .is_ac_online = magician_is_ac_online,
.exit = power_supply_exit, .is_usb_online = magician_is_usb_online,
.set_charge = magician_set_charge,
.supplied_to = magician_supplicants, .supplied_to = magician_supplicants,
.num_supplicants = ARRAY_SIZE(magician_supplicants), .num_supplicants = ARRAY_SIZE(magician_supplicants),
}; };
@ -605,7 +648,7 @@ static struct gpio_regulator_config bq24022_info = {
.enable_gpio = GPIO30_MAGICIAN_BQ24022_nCHARGE_EN, .enable_gpio = GPIO30_MAGICIAN_BQ24022_nCHARGE_EN,
.enable_high = 0, .enable_high = 0,
.enabled_at_boot = 0, .enabled_at_boot = 1,
.gpios = bq24022_gpios, .gpios = bq24022_gpios,
.nr_gpios = ARRAY_SIZE(bq24022_gpios), .nr_gpios = ARRAY_SIZE(bq24022_gpios),