diff options
author | Phil Reid <preid@electromag.com.au> | 2017-05-01 04:49:58 -0400 |
---|---|---|
committer | Sebastian Reichel <sre@kernel.org> | 2017-05-01 08:28:19 -0400 |
commit | cda3b01368391b48728b7edbbac0ca873b514367 (patch) | |
tree | 61030f202f70adace342d72283ddc073016d8e3f | |
parent | cad87f097ca2d56093145c4becd487f5c186a612 (diff) |
power: supply: sbs-battery: Add alert callback
To simplify the sbs-manager code and notification of battery removal
use the i2c alert callback to notify the sbs-battery driver that an
event has occurred.
Signed-off-by: Phil Reid <preid@electromag.com.au>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
-rw-r--r-- | drivers/power/supply/sbs-battery.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/drivers/power/supply/sbs-battery.c b/drivers/power/supply/sbs-battery.c index 171c701a2d49..e3a114e60f1a 100644 --- a/drivers/power/supply/sbs-battery.c +++ b/drivers/power/supply/sbs-battery.c | |||
@@ -701,21 +701,30 @@ done: | |||
701 | return 0; | 701 | return 0; |
702 | } | 702 | } |
703 | 703 | ||
704 | static irqreturn_t sbs_irq(int irq, void *devid) | 704 | static void sbs_supply_changed(struct sbs_info *chip) |
705 | { | 705 | { |
706 | struct sbs_info *chip = devid; | ||
707 | struct power_supply *battery = chip->power_supply; | 706 | struct power_supply *battery = chip->power_supply; |
708 | int ret; | 707 | int ret; |
709 | 708 | ||
710 | ret = gpiod_get_value_cansleep(chip->gpio_detect); | 709 | ret = gpiod_get_value_cansleep(chip->gpio_detect); |
711 | if (ret < 0) | 710 | if (ret < 0) |
712 | return ret; | 711 | return; |
713 | chip->is_present = ret; | 712 | chip->is_present = ret; |
714 | power_supply_changed(battery); | 713 | power_supply_changed(battery); |
714 | } | ||
715 | 715 | ||
716 | static irqreturn_t sbs_irq(int irq, void *devid) | ||
717 | { | ||
718 | sbs_supply_changed(devid); | ||
716 | return IRQ_HANDLED; | 719 | return IRQ_HANDLED; |
717 | } | 720 | } |
718 | 721 | ||
722 | static void sbs_alert(struct i2c_client *client, enum i2c_alert_protocol prot, | ||
723 | unsigned int data) | ||
724 | { | ||
725 | sbs_supply_changed(i2c_get_clientdata(client)); | ||
726 | } | ||
727 | |||
719 | static void sbs_external_power_changed(struct power_supply *psy) | 728 | static void sbs_external_power_changed(struct power_supply *psy) |
720 | { | 729 | { |
721 | struct sbs_info *chip = power_supply_get_drvdata(psy); | 730 | struct sbs_info *chip = power_supply_get_drvdata(psy); |
@@ -936,6 +945,7 @@ MODULE_DEVICE_TABLE(of, sbs_dt_ids); | |||
936 | static struct i2c_driver sbs_battery_driver = { | 945 | static struct i2c_driver sbs_battery_driver = { |
937 | .probe = sbs_probe, | 946 | .probe = sbs_probe, |
938 | .remove = sbs_remove, | 947 | .remove = sbs_remove, |
948 | .alert = sbs_alert, | ||
939 | .id_table = sbs_id, | 949 | .id_table = sbs_id, |
940 | .driver = { | 950 | .driver = { |
941 | .name = "sbs-battery", | 951 | .name = "sbs-battery", |