diff options
author | Matt Ranostay | 2016-09-19 20:43:02 -0700 |
---|---|---|
committer | Sebastian Reichel | 2016-09-21 02:08:04 +0200 |
commit | 1d72706f0485b58e151b5a7584c4c65d66670587 (patch) | |
tree | d659a552d21d1e4262e8fe5938197d995749f91c | |
parent | 389958bb6be8b08c9f6d350dcaa9fc127123eada (diff) |
power: supply: bq27xxx_battery: allow kernel poll_interval parameter runtime update
Fix issue with poll_interval being not updated till the previous
interval expired.
Cc: Tony Lindgren <tony@atomide.com>
Cc: Liam Breck <liam@networkimprov.net>
Signed-off-by: Matt Ranostay <matt@ranostay.consulting>
Signed-off-by: Sebastian Reichel <sre@kernel.org>
-rw-r--r-- | drivers/power/supply/bq27xxx_battery.c | 38 | ||||
-rw-r--r-- | include/linux/power/bq27xxx_battery.h | 1 |
2 files changed, 38 insertions, 1 deletions
diff --git a/drivers/power/supply/bq27xxx_battery.c b/drivers/power/supply/bq27xxx_battery.c index 3f57dd54803a..3b0dbc689d72 100644 --- a/drivers/power/supply/bq27xxx_battery.c +++ b/drivers/power/supply/bq27xxx_battery.c @@ -39,6 +39,7 @@ #include <linux/device.h> #include <linux/module.h> +#include <linux/mutex.h> #include <linux/param.h> #include <linux/jiffies.h> #include <linux/workqueue.h> @@ -390,8 +391,35 @@ static struct { BQ27XXX_PROP(BQ27421, bq27421_battery_props), }; +static DEFINE_MUTEX(bq27xxx_list_lock); +static LIST_HEAD(bq27xxx_battery_devices); + +static int poll_interval_param_set(const char *val, const struct kernel_param *kp) +{ + struct bq27xxx_device_info *di; + int ret; + + ret = param_set_uint(val, kp); + if (ret < 0) + return ret; + + mutex_lock(&bq27xxx_list_lock); + list_for_each_entry(di, &bq27xxx_battery_devices, list) { + cancel_delayed_work_sync(&di->work); + schedule_delayed_work(&di->work, 0); + } + mutex_unlock(&bq27xxx_list_lock); + + return ret; +} + +static const struct kernel_param_ops param_ops_poll_interval = { + .get = param_get_uint, + .set = poll_interval_param_set, +}; + static unsigned int poll_interval = 360; -module_param(poll_interval, uint, 0644); +module_param_cb(poll_interval, ¶m_ops_poll_interval, &poll_interval, 0644); MODULE_PARM_DESC(poll_interval, "battery poll interval in seconds - 0 disables polling"); @@ -972,6 +1000,10 @@ int bq27xxx_battery_setup(struct bq27xxx_device_info *di) bq27xxx_battery_update(di); + mutex_lock(&bq27xxx_list_lock); + list_add(&di->list, &bq27xxx_battery_devices); + mutex_unlock(&bq27xxx_list_lock); + return 0; } EXPORT_SYMBOL_GPL(bq27xxx_battery_setup); @@ -990,6 +1022,10 @@ void bq27xxx_battery_teardown(struct bq27xxx_device_info *di) power_supply_unregister(di->bat); + mutex_lock(&bq27xxx_list_lock); + list_del(&di->list); + mutex_unlock(&bq27xxx_list_lock); + mutex_destroy(&di->lock); } EXPORT_SYMBOL_GPL(bq27xxx_battery_teardown); diff --git a/include/linux/power/bq27xxx_battery.h b/include/linux/power/bq27xxx_battery.h index b50c0492629d..e30deb046156 100644 --- a/include/linux/power/bq27xxx_battery.h +++ b/include/linux/power/bq27xxx_battery.h @@ -58,6 +58,7 @@ struct bq27xxx_device_info { unsigned long last_update; struct delayed_work work; struct power_supply *bat; + struct list_head list; struct mutex lock; u8 *regs; }; |