Message ID | 20210731173842.19643-1-digetx@gmail.com |
---|---|
Headers | show |
Series | Add OTG mode support to Tegra USB PHY, SMB347 and Nexus 7 | expand |
Hi, On Sat, Jul 31, 2021 at 08:38:36PM +0300, Dmitry Osipenko wrote: > The smb347_set_writable() is used by interrupt handler and outside of it. > The interrupt should be disabled when the function is used outside of > interrupt handler in order to prevent racing with the interrupt context. > Add new parameter to smb347_set_writable() that allows to disable IRQ. > > Signed-off-by: Dmitry Osipenko <digetx@gmail.com> > --- Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.com> -- Sebastian > drivers/power/supply/smb347-charger.c | 30 +++++++++++++++++++-------- > 1 file changed, 21 insertions(+), 9 deletions(-) > > diff --git a/drivers/power/supply/smb347-charger.c b/drivers/power/supply/smb347-charger.c > index df240420f2de..db1378b41f80 100644 > --- a/drivers/power/supply/smb347-charger.c > +++ b/drivers/power/supply/smb347-charger.c > @@ -671,10 +671,22 @@ static int smb347_set_temp_limits(struct smb347_charger *smb) > * > * Returns %0 on success and negative errno in case of failure. > */ > -static int smb347_set_writable(struct smb347_charger *smb, bool writable) > +static int smb347_set_writable(struct smb347_charger *smb, bool writable, > + bool irq_toggle) > { > - return regmap_update_bits(smb->regmap, CMD_A, CMD_A_ALLOW_WRITE, > - writable ? CMD_A_ALLOW_WRITE : 0); > + struct i2c_client *client = to_i2c_client(smb->dev); > + int ret; > + > + if (writable && irq_toggle && !smb->irq_unsupported) > + disable_irq(client->irq); > + > + ret = regmap_update_bits(smb->regmap, CMD_A, CMD_A_ALLOW_WRITE, > + writable ? CMD_A_ALLOW_WRITE : 0); > + > + if ((!writable || ret) && irq_toggle && !smb->irq_unsupported) > + enable_irq(client->irq); > + > + return ret; > } > > static int smb347_hw_init(struct smb347_charger *smb) > @@ -682,7 +694,7 @@ static int smb347_hw_init(struct smb347_charger *smb) > unsigned int val; > int ret; > > - ret = smb347_set_writable(smb, true); > + ret = smb347_set_writable(smb, true, false); > if (ret < 0) > return ret; > > @@ -758,7 +770,7 @@ static int smb347_hw_init(struct smb347_charger *smb) > ret = smb347_start_stop_charging(smb); > > fail: > - smb347_set_writable(smb, false); > + smb347_set_writable(smb, false, false); > return ret; > } > > @@ -866,7 +878,7 @@ static int smb347_irq_set(struct smb347_charger *smb, bool enable) > if (smb->irq_unsupported) > return 0; > > - ret = smb347_set_writable(smb, true); > + ret = smb347_set_writable(smb, true, true); > if (ret < 0) > return ret; > > @@ -891,7 +903,7 @@ static int smb347_irq_set(struct smb347_charger *smb, bool enable) > ret = regmap_update_bits(smb->regmap, CFG_PIN, CFG_PIN_EN_CHARGER_ERROR, > enable ? CFG_PIN_EN_CHARGER_ERROR : 0); > fail: > - smb347_set_writable(smb, false); > + smb347_set_writable(smb, false, true); > return ret; > } > > @@ -919,7 +931,7 @@ static int smb347_irq_init(struct smb347_charger *smb, > if (!client->irq) > return 0; > > - ret = smb347_set_writable(smb, true); > + ret = smb347_set_writable(smb, true, false); > if (ret < 0) > return ret; > > @@ -931,7 +943,7 @@ static int smb347_irq_init(struct smb347_charger *smb, > CFG_STAT_ACTIVE_HIGH | CFG_STAT_DISABLED, > CFG_STAT_DISABLED); > > - smb347_set_writable(smb, false); > + smb347_set_writable(smb, false, false); > > if (ret < 0) { > dev_warn(smb->dev, "failed to initialize IRQ: %d\n", ret); > -- > 2.32.0 >
Hi, On Sat, Jul 31, 2021 at 08:38:37PM +0300, Dmitry Osipenko wrote: > Utilize generic regmap caching in order to avoid unnecessary slow I2C > accesses to all constant registers each time the supply status updated > and remove local caching of charger state to make code cleaner. > > Signed-off-by: Dmitry Osipenko <digetx@gmail.com> > --- Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.com> -- Sebastian > drivers/power/supply/smb347-charger.c | 16 ++++------------ > 1 file changed, 4 insertions(+), 12 deletions(-) > > diff --git a/drivers/power/supply/smb347-charger.c b/drivers/power/supply/smb347-charger.c > index db1378b41f80..27254e6efdde 100644 > --- a/drivers/power/supply/smb347-charger.c > +++ b/drivers/power/supply/smb347-charger.c > @@ -135,7 +135,6 @@ > * @id: SMB charger ID > * @mains_online: is AC/DC input connected > * @usb_online: is USB input connected > - * @charging_enabled: is charging enabled > * @irq_unsupported: is interrupt unsupported by SMB hardware > * @max_charge_current: maximum current (in uA) the battery can be charged > * @max_charge_voltage: maximum voltage (in uV) the battery can be charged > @@ -192,7 +191,6 @@ struct smb347_charger { > unsigned int id; > bool mains_online; > bool usb_online; > - bool charging_enabled; > bool irq_unsupported; > > unsigned int max_charge_current; > @@ -358,21 +356,13 @@ static int smb347_charging_status(struct smb347_charger *smb) > > static int smb347_charging_set(struct smb347_charger *smb, bool enable) > { > - int ret = 0; > - > if (smb->enable_control != SMB3XX_CHG_ENABLE_SW) { > dev_dbg(smb->dev, "charging enable/disable in SW disabled\n"); > return 0; > } > > - if (smb->charging_enabled != enable) { > - ret = regmap_update_bits(smb->regmap, CMD_A, CMD_A_CHG_ENABLED, > - enable ? CMD_A_CHG_ENABLED : 0); > - if (!ret) > - smb->charging_enabled = enable; > - } > - > - return ret; > + return regmap_update_bits(smb->regmap, CMD_A, CMD_A_CHG_ENABLED, > + enable ? CMD_A_CHG_ENABLED : 0); > } > > static inline int smb347_charging_enable(struct smb347_charger *smb) > @@ -1310,6 +1300,8 @@ static const struct regmap_config smb347_regmap = { > .max_register = SMB347_MAX_REGISTER, > .volatile_reg = smb347_volatile_reg, > .readable_reg = smb347_readable_reg, > + .cache_type = REGCACHE_FLAT, > + .num_reg_defaults_raw = SMB347_MAX_REGISTER, > }; > > static const struct power_supply_desc smb347_mains_desc = { > -- > 2.32.0 >
31.07.2021 20:38, Dmitry Osipenko пишет: > Support programming USB PHY into OTG mode. > > Signed-off-by: Dmitry Osipenko <digetx@gmail.com> > --- > drivers/usb/phy/phy-tegra-usb.c | 197 +++++++++++++++++++++++++++++- > include/linux/usb/tegra_usb_phy.h | 5 + > 2 files changed, 197 insertions(+), 5 deletions(-) Greg/Felipe, could you please ack this patch? This series should go via tegra tree since patches are interdependent.