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 /drivers/power | |
| 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>
Diffstat (limited to 'drivers/power')
| -rw-r--r-- | drivers/power/supply/bq27xxx_battery.c | 38 |
1 files changed, 37 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); |
