diff options
author | Matt Ranostay <mranostay@gmail.com> | 2016-09-19 23:43:02 -0400 |
---|---|---|
committer | Sebastian Reichel <sre@kernel.org> | 2016-09-20 20:08:04 -0400 |
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 @@ | |||
39 | 39 | ||
40 | #include <linux/device.h> | 40 | #include <linux/device.h> |
41 | #include <linux/module.h> | 41 | #include <linux/module.h> |
42 | #include <linux/mutex.h> | ||
42 | #include <linux/param.h> | 43 | #include <linux/param.h> |
43 | #include <linux/jiffies.h> | 44 | #include <linux/jiffies.h> |
44 | #include <linux/workqueue.h> | 45 | #include <linux/workqueue.h> |
@@ -390,8 +391,35 @@ static struct { | |||
390 | BQ27XXX_PROP(BQ27421, bq27421_battery_props), | 391 | BQ27XXX_PROP(BQ27421, bq27421_battery_props), |
391 | }; | 392 | }; |
392 | 393 | ||
394 | static DEFINE_MUTEX(bq27xxx_list_lock); | ||
395 | static LIST_HEAD(bq27xxx_battery_devices); | ||
396 | |||
397 | static int poll_interval_param_set(const char *val, const struct kernel_param *kp) | ||
398 | { | ||
399 | struct bq27xxx_device_info *di; | ||
400 | int ret; | ||
401 | |||
402 | ret = param_set_uint(val, kp); | ||
403 | if (ret < 0) | ||
404 | return ret; | ||
405 | |||
406 | mutex_lock(&bq27xxx_list_lock); | ||
407 | list_for_each_entry(di, &bq27xxx_battery_devices, list) { | ||
408 | cancel_delayed_work_sync(&di->work); | ||
409 | schedule_delayed_work(&di->work, 0); | ||
410 | } | ||
411 | mutex_unlock(&bq27xxx_list_lock); | ||
412 | |||
413 | return ret; | ||
414 | } | ||
415 | |||
416 | static const struct kernel_param_ops param_ops_poll_interval = { | ||
417 | .get = param_get_uint, | ||
418 | .set = poll_interval_param_set, | ||
419 | }; | ||
420 | |||
393 | static unsigned int poll_interval = 360; | 421 | static unsigned int poll_interval = 360; |
394 | module_param(poll_interval, uint, 0644); | 422 | module_param_cb(poll_interval, ¶m_ops_poll_interval, &poll_interval, 0644); |
395 | MODULE_PARM_DESC(poll_interval, | 423 | MODULE_PARM_DESC(poll_interval, |
396 | "battery poll interval in seconds - 0 disables polling"); | 424 | "battery poll interval in seconds - 0 disables polling"); |
397 | 425 | ||
@@ -972,6 +1000,10 @@ int bq27xxx_battery_setup(struct bq27xxx_device_info *di) | |||
972 | 1000 | ||
973 | bq27xxx_battery_update(di); | 1001 | bq27xxx_battery_update(di); |
974 | 1002 | ||
1003 | mutex_lock(&bq27xxx_list_lock); | ||
1004 | list_add(&di->list, &bq27xxx_battery_devices); | ||
1005 | mutex_unlock(&bq27xxx_list_lock); | ||
1006 | |||
975 | return 0; | 1007 | return 0; |
976 | } | 1008 | } |
977 | EXPORT_SYMBOL_GPL(bq27xxx_battery_setup); | 1009 | EXPORT_SYMBOL_GPL(bq27xxx_battery_setup); |
@@ -990,6 +1022,10 @@ void bq27xxx_battery_teardown(struct bq27xxx_device_info *di) | |||
990 | 1022 | ||
991 | power_supply_unregister(di->bat); | 1023 | power_supply_unregister(di->bat); |
992 | 1024 | ||
1025 | mutex_lock(&bq27xxx_list_lock); | ||
1026 | list_del(&di->list); | ||
1027 | mutex_unlock(&bq27xxx_list_lock); | ||
1028 | |||
993 | mutex_destroy(&di->lock); | 1029 | mutex_destroy(&di->lock); |
994 | } | 1030 | } |
995 | EXPORT_SYMBOL_GPL(bq27xxx_battery_teardown); | 1031 | 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 { | |||
58 | unsigned long last_update; | 58 | unsigned long last_update; |
59 | struct delayed_work work; | 59 | struct delayed_work work; |
60 | struct power_supply *bat; | 60 | struct power_supply *bat; |
61 | struct list_head list; | ||
61 | struct mutex lock; | 62 | struct mutex lock; |
62 | u8 *regs; | 63 | u8 *regs; |
63 | }; | 64 | }; |