From 9d2273b8d986c0979a2768f40c4eb5d34de59877 Mon Sep 17 00:00:00 2001 From: Ryan Lattrel Date: Wed, 6 Nov 2019 11:35:24 -0600 Subject: [PATCH] p938x_charger: replace atomics with bits Replace all atomic flags with bits, and ensure that no one can call __pm_stay_awake twice with out a __pm_relax first. Change-Id: Ibabbd2991b7db3b3e4a08bfee621f8465f01c0bb Signed-off-by: Ryan Lattrel Reviewed-on: https://gerrit.mot.com/1450299 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Cesar Augusto Marcelino dos Santos Reviewed-by: Ling Jin Submit-Approved: Jira Key --- drivers/power/p938x_charger/p938x_charger.c | 61 +++++++++++++++------ 1 file changed, 45 insertions(+), 16 deletions(-) diff --git a/drivers/power/p938x_charger/p938x_charger.c b/drivers/power/p938x_charger/p938x_charger.c index 3c96253ba4cb..a40876ec6cbb 100644 --- a/drivers/power/p938x_charger/p938x_charger.c +++ b/drivers/power/p938x_charger/p938x_charger.c @@ -243,13 +243,16 @@ struct p938x_charger { char fw_name[NAME_MAX]; int program_fw_stat; - atomic_t tx_attached; - atomic_t boost_enabled; + unsigned long flags; struct wakeup_source wls_wake_source; bool epp_mode; }; +#define WLS_FLAG_BOOST_ENABLED 0 +#define WLS_FLAG_TX_ATTACHED 1 +#define WLS_FLAG_KEEP_AWAKE 2 + /* Send our notications to the battery */ static char *pm_wls_supplied_to[] = { "battery", @@ -262,8 +265,8 @@ static char *pm_wls_supplied_from[] = { static inline int p938x_is_chip_on(struct p938x_charger *chip) { - return (atomic_read(&chip->boost_enabled) || - atomic_read(&chip->tx_attached)); + return (test_bit(WLS_FLAG_BOOST_ENABLED, &chip->flags) || + test_bit(WLS_FLAG_TX_ATTACHED, &chip->flags)); } static inline int p938x_is_tx_connected(struct p938x_charger *chip) @@ -299,10 +302,21 @@ static void p938x_reset(struct p938x_charger *chip) msleep(100); } +static void p938x_pm_set_awake(struct p938x_charger *chip, int awake) +{ + if(!test_bit(WLS_FLAG_KEEP_AWAKE, &chip->flags) && awake) { + __pm_stay_awake(&chip->wls_wake_source); + set_bit(WLS_FLAG_KEEP_AWAKE, &chip->flags); + } else if(test_bit(WLS_FLAG_KEEP_AWAKE, &chip->flags) && !awake) { + __pm_relax(&chip->wls_wake_source); + clear_bit(WLS_FLAG_KEEP_AWAKE, &chip->flags); + } +} + static void p938x_handle_wls_removal(struct p938x_charger *chip) { - if(atomic_read(&chip->tx_attached)) { - atomic_set(&chip->tx_attached, 0); + if(test_bit(WLS_FLAG_TX_ATTACHED, &chip->flags)) { + clear_bit(WLS_FLAG_TX_ATTACHED, &chip->flags); power_supply_changed(chip->wls_psy); cancel_delayed_work(&chip->heartbeat_work); @@ -310,8 +324,8 @@ static void p938x_handle_wls_removal(struct p938x_charger *chip) * don't want to end up in a broken state if we triggered disconnect * accidentally */ - if (!atomic_read(&chip->boost_enabled)) { - __pm_relax(&chip->wls_wake_source); + if (!test_bit(WLS_FLAG_BOOST_ENABLED, &chip->flags)) { + p938x_pm_set_awake(chip, 0); p938x_reset(chip); } @@ -643,16 +657,18 @@ disable_vreg: return rc; } + + static inline void p938x_set_boost(struct p938x_charger *chip, int val) { /* Assume if we turned the boost on we want to stay awake */ - if (val) - __pm_stay_awake(&chip->wls_wake_source); - else - __pm_relax(&chip->wls_wake_source); - + p938x_pm_set_awake(chip, !!val); gpio_set_value(chip->wchg_boost.gpio, !!val); - atomic_set(&chip->boost_enabled, !!val); + + if(val) + set_bit(WLS_FLAG_BOOST_ENABLED, &chip->flags); + else + clear_bit(WLS_FLAG_BOOST_ENABLED, &chip->flags); } static inline int p938x_get_boost(struct p938x_charger *chip) @@ -1096,8 +1112,8 @@ static void p938x_check_status(struct p938x_charger *chip) } if (irq_status & ST_VRECT_ON) { p938x_dbg(chip, PR_INTERRUPT, "IRQ: ST_VRECT_ON\n"); - __pm_stay_awake(&chip->wls_wake_source); - atomic_set(&chip->tx_attached, 1); + p938x_pm_set_awake(chip, 1); + set_bit(WLS_FLAG_TX_ATTACHED, &chip->flags); cancel_delayed_work(&chip->heartbeat_work); schedule_delayed_work(&chip->heartbeat_work, msecs_to_jiffies(2000)); @@ -1316,6 +1332,17 @@ static struct attribute *p938x_attrs[] = { ATTRIBUTE_GROUPS(p938x); +static void show_dump_flags(struct seq_file *m, + struct p938x_charger *chip) +{ + seq_printf(m, "WLS_FLAG_BOOST_ENABLED: %d\n", + test_bit(WLS_FLAG_BOOST_ENABLED, &chip->flags)); + seq_printf(m, "WLS_FLAG_KEEP_AWAKE: %d\n", + test_bit(WLS_FLAG_KEEP_AWAKE, &chip->flags)); + seq_printf(m, "WLS_FLAG_TX_ATTACHED: %d\n", + test_bit(WLS_FLAG_TX_ATTACHED, &chip->flags)); +} + static int show_dump_regs(struct seq_file *m, void *data) { struct p938x_charger *chip = m->private; @@ -1364,6 +1391,8 @@ static int show_dump_regs(struct seq_file *m, void *data) p938x_read_reg(chip, SYS_MODE_REG, &buf[0]); seq_printf(m, "SYS_MODE: 0x%02x\n", buf[0]); + show_dump_flags(m, chip); + return 0; }