Re: [PATCH 07/13] twl4030_charger: distinguish between USB current and 'AC' current
On Fri, 7 Aug 2015 07:13:09 +0200 Sebastian Reichel wrote: > Hi, > > This actually slipped through my review. IMHO madc should be > accessed through IIO, as already done for twl4030-madc-battery > and rx51-battery. That way the custom API can be removed at > some point. > > Anyway, I queued the below patch with Tony's ACK to fix the build > issue in next. > OK, thanks. I'll try to figure out are more proper approach ... might be a week or so though. Thanks, NeilBrown pgpDmsQwOgnXj.pgp Description: OpenPGP digital signature
Re: [PATCH 07/13] twl4030_charger: distinguish between USB current and 'AC' current
Hi, This actually slipped through my review. IMHO madc should be accessed through IIO, as already done for twl4030-madc-battery and rx51-battery. That way the custom API can be removed at some point. Anyway, I queued the below patch with Tony's ACK to fix the build issue in next. On Fri, Aug 07, 2015 at 01:45:25PM +1000, NeilBrown wrote: > From: NeilBrown > Date: Fri, 7 Aug 2015 13:44:37 +1000 > Subject: [PATCH] twl4030_charger: fix compile error when TWL4030_MADC not > available. > > We can only use the madc to check for 'ac' availability > if the madc has been compiled in. > If not: assume always using USB. > > Reported-by: Tony Lindgren > Signed-off-by: NeilBrown > > diff --git a/drivers/power/twl4030_charger.c b/drivers/power/twl4030_charger.c > index c7432f532a83..265fd236f4c0 100644 > --- a/drivers/power/twl4030_charger.c > +++ b/drivers/power/twl4030_charger.c > @@ -91,6 +91,21 @@ > #define TWL4030_MSTATEC_COMPLETE10x0b > #define TWL4030_MSTATEC_COMPLETE40x0e > > +#if IS_ENABLED(CONFIG_TWL4030_MADC) > +/* > + * If AC (Accessory Charger) voltage exceeds 4.5V (MADC 11) > + * then AC is available. > + */ > +static inline int ac_available(void) > +{ > + return twl4030_get_madc_conversion(11) > 4500; > +} > +#else > +static inline int ac_available(void) > +{ > + return 0; > +} > +#endif > static bool allow_usb; > module_param(allow_usb, bool, 0644); > MODULE_PARM_DESC(allow_usb, "Allow USB charge drawing default current"); > @@ -263,7 +278,7 @@ static int twl4030_charger_update_current(struct > twl4030_bci *bci) >* If AC (Accessory Charger) voltage exceeds 4.5V (MADC 11) >* and AC is enabled, set current for 'ac' >*/ > - if (twl4030_get_madc_conversion(11) > 4500) { > + if (ac_available()) { > cur = bci->ac_cur; > bci->ac_is_active = true; > } else { -- Sebastian signature.asc Description: Digital signature
Re: [PATCH 07/13] twl4030_charger: distinguish between USB current and 'AC' current
* NeilBrown [150806 20:48]: > > Thanks, I did get notified about that by Fengguang's test robot, but > it's still on my list > > I guess making CHARGER_TWL4030 auto-select TWL4030_MADC would not be > acceptable? That would pull in IIO (it didn't use to...). > > If this OK? Looks OK to me thanks: Acked-by: Tony Lindgren -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 07/13] twl4030_charger: distinguish between USB current and 'AC' current
On Thu, 6 Aug 2015 20:11:16 -0700 Tony Lindgren wrote: > * NeilBrown [150729 17:28]: > > --- a/drivers/power/twl4030_charger.c > > +++ b/drivers/power/twl4030_charger.c > > static int twl4030_charger_update_current(struct twl4030_bci *bci) > > { > > int status; > > + int cur; > > unsigned reg, cur_reg; > > u8 bcictl1, oldreg, fullreg; > > bool cgain = false; > > u8 boot_bci; > > > > + /* > > +* If AC (Accessory Charger) voltage exceeds 4.5V (MADC 11) > > +* and AC is enabled, set current for 'ac' > > +*/ > > + if (twl4030_get_madc_conversion(11) > 4500) { > > + cur = bci->ac_cur; > > + bci->ac_is_active = true; > > + } else { > > + cur = bci->usb_cur; > > + bci->ac_is_active = false; > > + } > > + > > /* First, check thresholds and see if cgain is needed */ > > if (bci->ichg_eoc >= 20) > > cgain = true; > > Neil, you need a stub or something for twl4030_get_madc_conversion > if madc is not selected. Now at least omap2plus_defconfig and > ARM allmodconfig fails in Linux next. > > Regards, > > Tony Thanks, I did get notified about that by Fengguang's test robot, but it's still on my list I guess making CHARGER_TWL4030 auto-select TWL4030_MADC would not be acceptable? That would pull in IIO (it didn't use to...). If this OK? Thanks, NeilBrown From: NeilBrown Date: Fri, 7 Aug 2015 13:44:37 +1000 Subject: [PATCH] twl4030_charger: fix compile error when TWL4030_MADC not available. We can only use the madc to check for 'ac' availability if the madc has been compiled in. If not: assume always using USB. Reported-by: Tony Lindgren Signed-off-by: NeilBrown diff --git a/drivers/power/twl4030_charger.c b/drivers/power/twl4030_charger.c index c7432f532a83..265fd236f4c0 100644 --- a/drivers/power/twl4030_charger.c +++ b/drivers/power/twl4030_charger.c @@ -91,6 +91,21 @@ #define TWL4030_MSTATEC_COMPLETE1 0x0b #define TWL4030_MSTATEC_COMPLETE4 0x0e +#if IS_ENABLED(CONFIG_TWL4030_MADC) +/* + * If AC (Accessory Charger) voltage exceeds 4.5V (MADC 11) + * then AC is available. + */ +static inline int ac_available(void) +{ + return twl4030_get_madc_conversion(11) > 4500; +} +#else +static inline int ac_available(void) +{ + return 0; +} +#endif static bool allow_usb; module_param(allow_usb, bool, 0644); MODULE_PARM_DESC(allow_usb, "Allow USB charge drawing default current"); @@ -263,7 +278,7 @@ static int twl4030_charger_update_current(struct twl4030_bci *bci) * If AC (Accessory Charger) voltage exceeds 4.5V (MADC 11) * and AC is enabled, set current for 'ac' */ - if (twl4030_get_madc_conversion(11) > 4500) { + if (ac_available()) { cur = bci->ac_cur; bci->ac_is_active = true; } else { -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 07/13] twl4030_charger: distinguish between USB current and 'AC' current
* NeilBrown [150729 17:28]: > --- a/drivers/power/twl4030_charger.c > +++ b/drivers/power/twl4030_charger.c > static int twl4030_charger_update_current(struct twl4030_bci *bci) > { > int status; > + int cur; > unsigned reg, cur_reg; > u8 bcictl1, oldreg, fullreg; > bool cgain = false; > u8 boot_bci; > > + /* > + * If AC (Accessory Charger) voltage exceeds 4.5V (MADC 11) > + * and AC is enabled, set current for 'ac' > + */ > + if (twl4030_get_madc_conversion(11) > 4500) { > + cur = bci->ac_cur; > + bci->ac_is_active = true; > + } else { > + cur = bci->usb_cur; > + bci->ac_is_active = false; > + } > + > /* First, check thresholds and see if cgain is needed */ > if (bci->ichg_eoc >= 20) > cgain = true; Neil, you need a stub or something for twl4030_get_madc_conversion if madc is not selected. Now at least omap2plus_defconfig and ARM allmodconfig fails in Linux next. Regards, Tony -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH 07/13] twl4030_charger: distinguish between USB current and 'AC' current
The twl4030 charger has two current sources, 'USB' and 'AC' (presumably "Accessory Charger" because it isn't Alternating Current). If 'AC' is providing current, we should set the current limit differently to when it isn't (and so USB is used). So split 'cur' into 'usb_cur' and 'ac_cur' and use accordingly. Now we must review the current setting on any interrupt or USB event which might indicate that the charger-source has changed. Acked-by: Pavel Machek Signed-off-by: NeilBrown --- drivers/power/twl4030_charger.c | 36 +--- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/drivers/power/twl4030_charger.c b/drivers/power/twl4030_charger.c index 3b7cc631bb8a..982675df21b7 100644 --- a/drivers/power/twl4030_charger.c +++ b/drivers/power/twl4030_charger.c @@ -22,6 +22,7 @@ #include #include #include +#include #define TWL4030_BCIMSTATEC 0x02 #define TWL4030_BCIICHG0x08 @@ -101,10 +102,13 @@ struct twl4030_bci { int usb_enabled; /* -* ichg values in uA. If any are 'large', we set CGAIN to -* '1' which doubles the range for half the precision. +* ichg_* and *_cur values in uA. If any are 'large', we set +* CGAIN to '1' which doubles the range for half the +* precision. */ - unsigned intichg_eoc, ichg_lo, ichg_hi, cur; + unsigned intichg_eoc, ichg_lo, ichg_hi; + unsigned intusb_cur, ac_cur; + boolac_is_active; unsigned long event; }; @@ -225,11 +229,24 @@ static int ua2regval(int ua, bool cgain) static int twl4030_charger_update_current(struct twl4030_bci *bci) { int status; + int cur; unsigned reg, cur_reg; u8 bcictl1, oldreg, fullreg; bool cgain = false; u8 boot_bci; + /* +* If AC (Accessory Charger) voltage exceeds 4.5V (MADC 11) +* and AC is enabled, set current for 'ac' +*/ + if (twl4030_get_madc_conversion(11) > 4500) { + cur = bci->ac_cur; + bci->ac_is_active = true; + } else { + cur = bci->usb_cur; + bci->ac_is_active = false; + } + /* First, check thresholds and see if cgain is needed */ if (bci->ichg_eoc >= 20) cgain = true; @@ -237,7 +254,7 @@ static int twl4030_charger_update_current(struct twl4030_bci *bci) cgain = true; if (bci->ichg_hi >= 82) cgain = true; - if (bci->cur > 852000) + if (cur > 852000) cgain = true; status = twl4030_bci_read(TWL4030_BCICTL1, &bcictl1); @@ -318,7 +335,7 @@ static int twl4030_charger_update_current(struct twl4030_bci *bci) * And finally, set the current. This is stored in * two registers. */ - reg = ua2regval(bci->cur, cgain); + reg = ua2regval(cur, cgain); /* we have only 10 bits */ if (reg > 0x3ff) reg = 0x3ff; @@ -371,6 +388,8 @@ static int twl4030_charger_enable_usb(struct twl4030_bci *bci, bool enable) if (enable && !IS_ERR_OR_NULL(bci->transceiver)) { + twl4030_charger_update_current(bci); + /* Need to keep phy powered */ if (!bci->usb_enabled) { pm_runtime_get_sync(bci->transceiver->dev); @@ -463,6 +482,7 @@ static irqreturn_t twl4030_charger_interrupt(int irq, void *arg) struct twl4030_bci *bci = arg; dev_dbg(bci->dev, "CHG_PRES irq\n"); + twl4030_charger_update_current(bci); power_supply_changed(bci->ac); power_supply_changed(bci->usb); @@ -495,6 +515,7 @@ static irqreturn_t twl4030_bci_interrupt(int irq, void *arg) power_supply_changed(bci->ac); power_supply_changed(bci->usb); } + twl4030_charger_update_current(bci); /* various monitoring events, for now we just log them here */ if (irqs1 & (TWL4030_TBATOR2 | TWL4030_TBATOR1)) @@ -724,10 +745,11 @@ static int twl4030_bci_probe(struct platform_device *pdev) bci->ichg_eoc = 80100; /* Stop charging when current drops to here */ bci->ichg_lo = 241000; /* Low threshold */ bci->ichg_hi = 50; /* High threshold */ + bci->ac_cur = 50; /* 500mA */ if (allow_usb) - bci->cur = 50; /* 500mA */ + bci->usb_cur = 50; /* 500mA */ else - bci->cur = 10; /* 100mA */ + bci->usb_cur = 10; /* 100mA */ bci->dev = &pdev->dev; bci->irq_chg = platform_get_irq(pdev, 0); -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.