diff options
Diffstat (limited to 'drivers/power/tosa_battery.c')
| -rw-r--r-- | drivers/power/tosa_battery.c | 100 | 
1 files changed, 30 insertions, 70 deletions
diff --git a/drivers/power/tosa_battery.c b/drivers/power/tosa_battery.c index ee04936b2db..f4d80df627c 100644 --- a/drivers/power/tosa_battery.c +++ b/drivers/power/tosa_battery.c @@ -150,7 +150,7 @@ static void tosa_bat_external_power_changed(struct power_supply *psy)  static irqreturn_t tosa_bat_gpio_isr(int irq, void *data)  { -	pr_info("tosa_bat_gpio irq: %d\n", gpio_get_value(irq_to_gpio(irq))); +	pr_info("tosa_bat_gpio irq\n");  	schedule_work(&bat_work);  	return IRQ_HANDLED;  } @@ -307,32 +307,27 @@ static struct tosa_bat tosa_bat_bu = {  	.adc_temp_divider = -1,  }; -static struct { -	int gpio; -	char *name; -	bool output; -	int value; -} gpios[] = { -	{ TOSA_GPIO_CHARGE_OFF,		"main charge off",	1, 1 }, -	{ TOSA_GPIO_CHARGE_OFF_JC,	"jacket charge off",	1, 1 }, -	{ TOSA_GPIO_BAT_SW_ON,		"battery switch",	1, 0 }, -	{ TOSA_GPIO_BAT0_V_ON,		"main battery",		1, 0 }, -	{ TOSA_GPIO_BAT1_V_ON,		"jacket battery",	1, 0 }, -	{ TOSA_GPIO_BAT1_TH_ON,		"main battery temp",	1, 0 }, -	{ TOSA_GPIO_BAT0_TH_ON,		"jacket battery temp",	1, 0 }, -	{ TOSA_GPIO_BU_CHRG_ON,		"backup battery",	1, 0 }, -	{ TOSA_GPIO_BAT0_CRG,		"main battery full",	0, 0 }, -	{ TOSA_GPIO_BAT1_CRG,		"jacket battery full",	0, 0 }, -	{ TOSA_GPIO_BAT0_LOW,		"main battery low",	0, 0 }, -	{ TOSA_GPIO_BAT1_LOW,		"jacket battery low",	0, 0 }, -	{ TOSA_GPIO_JACKET_DETECT,	"jacket detect",	0, 0 }, +static struct gpio tosa_bat_gpios[] = { +	{ TOSA_GPIO_CHARGE_OFF,	   GPIOF_OUT_INIT_HIGH, "main charge off" }, +	{ TOSA_GPIO_CHARGE_OFF_JC, GPIOF_OUT_INIT_HIGH, "jacket charge off" }, +	{ TOSA_GPIO_BAT_SW_ON,	   GPIOF_OUT_INIT_LOW,	"battery switch" }, +	{ TOSA_GPIO_BAT0_V_ON,	   GPIOF_OUT_INIT_LOW,	"main battery" }, +	{ TOSA_GPIO_BAT1_V_ON,	   GPIOF_OUT_INIT_LOW,	"jacket battery" }, +	{ TOSA_GPIO_BAT1_TH_ON,	   GPIOF_OUT_INIT_LOW,	"main battery temp" }, +	{ TOSA_GPIO_BAT0_TH_ON,	   GPIOF_OUT_INIT_LOW,	"jacket battery temp" }, +	{ TOSA_GPIO_BU_CHRG_ON,	   GPIOF_OUT_INIT_LOW,	"backup battery" }, +	{ TOSA_GPIO_BAT0_CRG,	   GPIOF_IN,		"main battery full" }, +	{ TOSA_GPIO_BAT1_CRG,	   GPIOF_IN,		"jacket battery full" }, +	{ TOSA_GPIO_BAT0_LOW,	   GPIOF_IN,		"main battery low" }, +	{ TOSA_GPIO_BAT1_LOW,	   GPIOF_IN,		"jacket battery low" }, +	{ TOSA_GPIO_JACKET_DETECT, GPIOF_IN,		"jacket detect" },  };  #ifdef CONFIG_PM  static int tosa_bat_suspend(struct platform_device *dev, pm_message_t state)  {  	/* flush all pending status updates */ -	flush_scheduled_work(); +	flush_work(&bat_work);  	return 0;  } @@ -347,30 +342,16 @@ static int tosa_bat_resume(struct platform_device *dev)  #define tosa_bat_resume NULL  #endif -static int __devinit tosa_bat_probe(struct platform_device *dev) +static int tosa_bat_probe(struct platform_device *dev)  {  	int ret; -	int i;  	if (!machine_is_tosa())  		return -ENODEV; -	for (i = 0; i < ARRAY_SIZE(gpios); i++) { -		ret = gpio_request(gpios[i].gpio, gpios[i].name); -		if (ret) { -			i--; -			goto err_gpio; -		} - -		if (gpios[i].output) -			ret = gpio_direction_output(gpios[i].gpio, -					gpios[i].value); -		else -			ret = gpio_direction_input(gpios[i].gpio); - -		if (ret) -			goto err_gpio; -	} +	ret = gpio_request_array(tosa_bat_gpios, ARRAY_SIZE(tosa_bat_gpios)); +	if (ret) +		return ret;  	mutex_init(&tosa_bat_main.work_lock);  	mutex_init(&tosa_bat_jacket.work_lock); @@ -422,20 +403,14 @@ err_psy_reg_jacket:  err_psy_reg_main:  	/* see comment in tosa_bat_remove */ -	flush_scheduled_work(); - -	i--; -err_gpio: -	for (; i >= 0; i--) -		gpio_free(gpios[i].gpio); +	cancel_work_sync(&bat_work); +	gpio_free_array(tosa_bat_gpios, ARRAY_SIZE(tosa_bat_gpios));  	return ret;  } -static int __devexit tosa_bat_remove(struct platform_device *dev) +static int tosa_bat_remove(struct platform_device *dev)  { -	int i; -  	free_irq(gpio_to_irq(TOSA_GPIO_JACKET_DETECT), &tosa_bat_jacket);  	free_irq(gpio_to_irq(TOSA_GPIO_BAT1_CRG), &tosa_bat_jacket);  	free_irq(gpio_to_irq(TOSA_GPIO_BAT0_CRG), &tosa_bat_main); @@ -445,16 +420,12 @@ static int __devexit tosa_bat_remove(struct platform_device *dev)  	power_supply_unregister(&tosa_bat_main.psy);  	/* -	 * now flush all pending work. -	 * we won't get any more schedules, since all -	 * sources (isr and external_power_changed) -	 * are unregistered now. +	 * Now cancel the bat_work.  We won't get any more schedules, +	 * since all sources (isr and external_power_changed) are +	 * unregistered now.  	 */ -	flush_scheduled_work(); - -	for (i = ARRAY_SIZE(gpios) - 1; i >= 0; i--) -		gpio_free(gpios[i].gpio); - +	cancel_work_sync(&bat_work); +	gpio_free_array(tosa_bat_gpios, ARRAY_SIZE(tosa_bat_gpios));  	return 0;  } @@ -462,23 +433,12 @@ static struct platform_driver tosa_bat_driver = {  	.driver.name	= "wm97xx-battery",  	.driver.owner	= THIS_MODULE,  	.probe		= tosa_bat_probe, -	.remove		= __devexit_p(tosa_bat_remove), +	.remove		= tosa_bat_remove,  	.suspend	= tosa_bat_suspend,  	.resume		= tosa_bat_resume,  }; -static int __init tosa_bat_init(void) -{ -	return platform_driver_register(&tosa_bat_driver); -} - -static void __exit tosa_bat_exit(void) -{ -	platform_driver_unregister(&tosa_bat_driver); -} - -module_init(tosa_bat_init); -module_exit(tosa_bat_exit); +module_platform_driver(tosa_bat_driver);  MODULE_LICENSE("GPL");  MODULE_AUTHOR("Dmitry Baryshkov");  | 
