On Sun, Jun 19, 2022 at 5:40 AM Aidan MacDonald <aidanmacdonald.0x0@xxxxxxxxx> wrote: > > The AXP192 is mostly the same as the AXP202 but has a different > current limit. > > Acked-by: Sebastian Reichel <sebastian.reichel@xxxxxxxxxxxxx> > Signed-off-by: Aidan MacDonald <aidanmacdonald.0x0@xxxxxxxxx> > --- > drivers/power/supply/axp20x_usb_power.c | 80 +++++++++++++++++++++---- > 1 file changed, 69 insertions(+), 11 deletions(-) > > diff --git a/drivers/power/supply/axp20x_usb_power.c b/drivers/power/supply/axp20x_usb_power.c > index a1e6d1d44808..03145374ae72 100644 > --- a/drivers/power/supply/axp20x_usb_power.c > +++ b/drivers/power/supply/axp20x_usb_power.c > @@ -48,6 +48,9 @@ > #define AXP813_VBUS_CLIMIT_2000mA 2 > #define AXP813_VBUS_CLIMIT_2500mA 3 > > +#define AXP192_VBUS_CLIMIT_EN BIT(1) > +#define AXP192_VBUS_CLIMIT_100mA BIT(0) > + > #define AXP20X_ADC_EN1_VBUS_CURR BIT(2) > #define AXP20X_ADC_EN1_VBUS_VOLT BIT(3) > > @@ -121,6 +124,24 @@ static void axp20x_usb_power_poll_vbus(struct work_struct *work) > mod_delayed_work(system_power_efficient_wq, &power->vbus_detect, DEBOUNCE_TIME); > } > > +static int axp192_get_current_max(struct axp20x_usb_power *power, int *val) > +{ > + unsigned int v; > + int ret = regmap_read(power->regmap, AXP20X_VBUS_IPSOUT_MGMT, &v); > + > + if (ret) > + return ret; > + > + if (!(v & AXP192_VBUS_CLIMIT_EN)) > + *val = -1; > + else if (v & AXP192_VBUS_CLIMIT_100mA) > + *val = 100000; > + else > + *val = 500000; > + > + return 0; > +} > + > static int axp20x_get_current_max(struct axp20x_usb_power *power, int *val) > { > unsigned int v; > @@ -179,7 +200,7 @@ static int axp20x_usb_power_get_property(struct power_supply *psy, > enum power_supply_property psp, union power_supply_propval *val) > { > struct axp20x_usb_power *power = power_supply_get_drvdata(psy); > - unsigned int input, v; > + unsigned int input, v, reg; > int ret; > > switch (psp) { > @@ -215,6 +236,8 @@ static int axp20x_usb_power_get_property(struct power_supply *psy, > case POWER_SUPPLY_PROP_CURRENT_MAX: > if (power->axp20x_id == AXP813_ID) > return axp813_get_current_max(power, &val->intval); > + else if (power->axp20x_id == AXP192_ID) > + return axp192_get_current_max(power, &val->intval); > return axp20x_get_current_max(power, &val->intval); > case POWER_SUPPLY_PROP_CURRENT_NOW: > if (IS_ENABLED(CONFIG_AXP20X_ADC)) { > @@ -256,16 +279,20 @@ static int axp20x_usb_power_get_property(struct power_supply *psy, > > val->intval = POWER_SUPPLY_HEALTH_GOOD; > > - if (power->axp20x_id == AXP202_ID) { > - ret = regmap_read(power->regmap, > - AXP20X_USB_OTG_STATUS, &v); > - if (ret) > - return ret; > + if (power->axp20x_id == AXP192_ID) > + reg = AXP192_USB_OTG_STATUS; > + else if (power->axp20x_id == AXP202_ID) > + reg = AXP20X_USB_OTG_STATUS; > + else > + /* Other chips do not have an OTG status register */ > + break; Nit: put the comment on the same line as the break, trailing it. Otherwise, Reviewed-by: Chen-Yu Tsai <wens@xxxxxxxx>