Re: [PATCH 07/13] twl4030_charger: distinguish between USB current and 'AC' current

2015-08-06 Thread NeilBrown
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

2015-08-06 Thread Sebastian Reichel
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

2015-08-06 Thread Tony Lindgren
* 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

2015-08-06 Thread NeilBrown
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

2015-08-06 Thread Tony Lindgren
* 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/


Re: [PATCH 07/13] twl4030_charger: distinguish between USB current and 'AC' current

2015-08-06 Thread Tony Lindgren
* NeilBrown n...@brown.name [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/


Re: [PATCH 07/13] twl4030_charger: distinguish between USB current and 'AC' current

2015-08-06 Thread Tony Lindgren
* NeilBrown n...@brown.name [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 t...@atomide.com
--
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

2015-08-06 Thread NeilBrown
On Fri, 7 Aug 2015 07:13:09 +0200 Sebastian Reichel s...@kernel.org
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

2015-08-06 Thread NeilBrown
On Thu, 6 Aug 2015 20:11:16 -0700 Tony Lindgren t...@atomide.com
wrote:

 * NeilBrown n...@brown.name [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 n...@brown.name
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 t...@atomide.com
Signed-off-by: NeilBrown n...@brown.name

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

2015-08-06 Thread Sebastian Reichel
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 n...@brown.name
 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 t...@atomide.com
 Signed-off-by: NeilBrown n...@brown.name
 
 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


[PATCH 07/13] twl4030_charger: distinguish between USB current and 'AC' current

2015-07-29 Thread NeilBrown

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, );
@@ -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 = >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.tux.org/lkml/

[PATCH 07/13] twl4030_charger: distinguish between USB current and 'AC' current

2015-07-29 Thread NeilBrown

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 pa...@ucw.cz
Signed-off-by: NeilBrown n...@brown.name
---
 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 linux/power_supply.h
 #include linux/notifier.h
 #include linux/usb/otg.h
+#include linux/i2c/twl4030-madc.h
 
 #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