Re: [PATCH 13/15] twl4030_charger: add ac/mode to match usb/mode

2015-03-22 Thread NeilBrown
On Fri, 6 Mar 2015 23:59:04 +0200 Grazvydas Ignotas nota...@gmail.com wrote:

 On Tue, Feb 24, 2015 at 6:33 AM, NeilBrown ne...@suse.de wrote:
  This allows AC charging to be turned off, much like usb charging.
 
  continuous (aka linear) mode maps to the CVENAC (constant voltage)
  feature of the twl4030.
 
 Are you sure? Before your patches CVENAC was set at all times and and
 charger still worked in automatic mode.
 
 
  Signed-off-by: NeilBrown ne...@suse.de
  ---
   drivers/power/twl4030_charger.c |   40 
  +--
   1 file changed, 30 insertions(+), 10 deletions(-)
 
  diff --git a/drivers/power/twl4030_charger.c 
  b/drivers/power/twl4030_charger.c
  index 6c53f0b601a4..e5a0225ea87e 100644
  --- a/drivers/power/twl4030_charger.c
  +++ b/drivers/power/twl4030_charger.c
  @@ -112,7 +112,7 @@ struct twl4030_bci {
  int ichg_eoc, ichg_lo, ichg_hi;
  int usb_cur, ac_cur;
  boolac_is_active;
  -   int usb_mode; /* charging mode requested */
  +   int usb_mode, ac_mode; /* charging mode 
  requested */
   #defineCHARGE_OFF  0
   #defineCHARGE_AUTO 1
   #defineCHARGE_LINEAR   2
  @@ -449,12 +449,18 @@ static int twl4030_charger_enable_usb(struct 
  twl4030_bci *bci, bool enable)
   /*
* Enable/Disable AC Charge funtionality.
*/
  -static int twl4030_charger_enable_ac(bool enable)
  +static int twl4030_charger_enable_ac(struct twl4030_bci *bci, bool enable)
   {
  int ret;
 
  -   if (enable)
  -   ret = twl4030_clear_set_boot_bci(0, TWL4030_BCIAUTOAC);
  +   if (bci-ac_mode == CHARGE_OFF)
  +   enable = false;
  +
  +   if (enable  bci-ac_mode == CHARGE_LINEAR)
  +   ret = twl4030_clear_set_boot_bci(0, (TWL4030_CVENAC |
  +TWL4030_BCIAUTOAC));
  +   else if (enable)
  +   ret = twl4030_clear_set_boot_bci(TWL4030_CVENAC, 
  TWL4030_BCIAUTOAC);
  else
  ret = twl4030_clear_set_boot_bci(TWL4030_BCIAUTOAC, 0);
 
 CVENAC is required to be set for operation on AC without battery
 (which works fine on most pandora boards). After this patch, when
 booted without battery,  the board will reset before there is a chance
 to set the linear mode by userspace, because this is called on
 probe...
 

Yes, it looks like I misunderstood CVENAC a bit - thanks.

I've removed 'continuous' mode for AC and no longer clear or set that bit.

Thanks,
NeilBrown


pgplztCo9D_mx.pgp
Description: OpenPGP digital signature


Re: [PATCH 13/15] twl4030_charger: add ac/mode to match usb/mode

2015-03-06 Thread Grazvydas Ignotas
On Tue, Feb 24, 2015 at 6:33 AM, NeilBrown ne...@suse.de wrote:
 This allows AC charging to be turned off, much like usb charging.

 continuous (aka linear) mode maps to the CVENAC (constant voltage)
 feature of the twl4030.

Are you sure? Before your patches CVENAC was set at all times and and
charger still worked in automatic mode.


 Signed-off-by: NeilBrown ne...@suse.de
 ---
  drivers/power/twl4030_charger.c |   40 
 +--
  1 file changed, 30 insertions(+), 10 deletions(-)

 diff --git a/drivers/power/twl4030_charger.c b/drivers/power/twl4030_charger.c
 index 6c53f0b601a4..e5a0225ea87e 100644
 --- a/drivers/power/twl4030_charger.c
 +++ b/drivers/power/twl4030_charger.c
 @@ -112,7 +112,7 @@ struct twl4030_bci {
 int ichg_eoc, ichg_lo, ichg_hi;
 int usb_cur, ac_cur;
 boolac_is_active;
 -   int usb_mode; /* charging mode requested */
 +   int usb_mode, ac_mode; /* charging mode requested 
 */
  #defineCHARGE_OFF  0
  #defineCHARGE_AUTO 1
  #defineCHARGE_LINEAR   2
 @@ -449,12 +449,18 @@ static int twl4030_charger_enable_usb(struct 
 twl4030_bci *bci, bool enable)
  /*
   * Enable/Disable AC Charge funtionality.
   */
 -static int twl4030_charger_enable_ac(bool enable)
 +static int twl4030_charger_enable_ac(struct twl4030_bci *bci, bool enable)
  {
 int ret;

 -   if (enable)
 -   ret = twl4030_clear_set_boot_bci(0, TWL4030_BCIAUTOAC);
 +   if (bci-ac_mode == CHARGE_OFF)
 +   enable = false;
 +
 +   if (enable  bci-ac_mode == CHARGE_LINEAR)
 +   ret = twl4030_clear_set_boot_bci(0, (TWL4030_CVENAC |
 +TWL4030_BCIAUTOAC));
 +   else if (enable)
 +   ret = twl4030_clear_set_boot_bci(TWL4030_CVENAC, 
 TWL4030_BCIAUTOAC);
 else
 ret = twl4030_clear_set_boot_bci(TWL4030_BCIAUTOAC, 0);

CVENAC is required to be set for operation on AC without battery
(which works fine on most pandora boards). After this patch, when
booted without battery,  the board will reset before there is a chance
to set the linear mode by userspace, because this is called on
probe...


GraÅžvydas
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 13/15] twl4030_charger: add ac/mode to match usb/mode

2015-03-02 Thread Pavel Machek
On Tue 2015-02-24 15:33:53, NeilBrown wrote:
 This allows AC charging to be turned off, much like usb charging.
 
 continuous (aka linear) mode maps to the CVENAC (constant voltage)
 feature of the twl4030.
 
 Signed-off-by: NeilBrown ne...@suse.de

Acked-by: Pavel Machek pa...@ucw.cz

 --- a/drivers/power/twl4030_charger.c
 +++ b/drivers/power/twl4030_charger.c
 @@ -112,7 +112,7 @@ struct twl4030_bci {
   int ichg_eoc, ichg_lo, ichg_hi;
   int usb_cur, ac_cur;
   boolac_is_active;
 - int usb_mode; /* charging mode requested */
 + int usb_mode, ac_mode; /* charging mode requested */
  #define  CHARGE_OFF  0
  #define  CHARGE_AUTO 1
  #define  CHARGE_LINEAR   2
 @@ -449,12 +449,18 @@ static int twl4030_charger_enable_usb(struct 
 twl4030_bci *bci, bool enable)
  /*
   * Enable/Disable AC Charge funtionality.
   */
 -static int twl4030_charger_enable_ac(bool enable)
 +static int twl4030_charger_enable_ac(struct twl4030_bci *bci, bool enable)
  {
   int ret;
  
 - if (enable)
 - ret = twl4030_clear_set_boot_bci(0, TWL4030_BCIAUTOAC);
 + if (bci-ac_mode == CHARGE_OFF)
 + enable = false;
 +
 + if (enable  bci-ac_mode == CHARGE_LINEAR)
 + ret = twl4030_clear_set_boot_bci(0, (TWL4030_CVENAC |
 +  TWL4030_BCIAUTOAC));
 + else if (enable)
 + ret = twl4030_clear_set_boot_bci(TWL4030_CVENAC, 
 TWL4030_BCIAUTOAC);
   else
   ret = twl4030_clear_set_boot_bci(TWL4030_BCIAUTOAC, 0);
  
 @@ -688,9 +694,15 @@ twl4030_bci_mode_store(struct device *dev, struct 
 device_attribute *attr,
   mode = 2;
   else
   return -EINVAL;
 - twl4030_charger_enable_usb(bci, false);
 - bci-usb_mode = mode;
 - status = twl4030_charger_enable_usb(bci, true);
 + if (dev == bci-ac.dev) {
 + twl4030_charger_enable_ac(bci, false);
 + bci-ac_mode = mode;
 + status = twl4030_charger_enable_ac(bci, true);
 + } else {
 + twl4030_charger_enable_usb(bci, false);
 + bci-usb_mode = mode;
 + status = twl4030_charger_enable_usb(bci, true);
 + }
   return (status == 0) ? n : status;
  }
  
 @@ -704,9 +716,13 @@ twl4030_bci_mode_show(struct device *dev,
   struct twl4030_bci *bci = dev_get_drvdata(dev-parent);
   int len = 0;
   int i;
 + int mode = bci-usb_mode;
 +
 + if (dev == bci-ac.dev)
 + mode = bci-ac_mode;
  
   for (i = 0; i  ARRAY_SIZE(modes); i++)
 - if (bci-usb_mode == i)
 + if (mode == i)
   len += snprintf(buf+len, PAGE_SIZE-len,
   [%s] , modes[i]);
   else
 @@ -900,6 +916,7 @@ static int __init twl4030_bci_probe(struct 
 platform_device *pdev)
   else
   bci-usb_cur = 10;  /* 100mA */
   bci-usb_mode = CHARGE_AUTO;
 + bci-ac_mode = CHARGE_AUTO;
  
   bci-dev = pdev-dev;
   bci-irq_chg = platform_get_irq(pdev, 0);
 @@ -988,10 +1005,12 @@ static int __init twl4030_bci_probe(struct 
 platform_device *pdev)
   dev_warn(pdev-dev, could not create sysfs file\n);
   if (device_create_file(bci-usb.dev, dev_attr_mode))
   dev_warn(pdev-dev, could not create sysfs file\n);
 + if (device_create_file(bci-ac.dev, dev_attr_mode))
 + dev_warn(pdev-dev, could not create sysfs file\n);
   if (device_create_file(bci-ac.dev, dev_attr_max_current))
   dev_warn(pdev-dev, could not create sysfs file\n);
  
 - twl4030_charger_enable_ac(true);
 + twl4030_charger_enable_ac(bci, true);
   if (!IS_ERR_OR_NULL(bci-transceiver))
   twl4030_bci_usb_ncb(bci-usb_nb,
   bci-transceiver-last_event,
 @@ -1014,13 +1033,14 @@ static int __exit twl4030_bci_remove(struct 
 platform_device *pdev)
  {
   struct twl4030_bci *bci = platform_get_drvdata(pdev);
  
 - twl4030_charger_enable_ac(false);
 + twl4030_charger_enable_ac(bci, false);
   twl4030_charger_enable_usb(bci, false);
   twl4030_charger_enable_backup(0, 0);
  
   device_remove_file(bci-usb.dev, dev_attr_max_current);
   device_remove_file(bci-ac.dev, dev_attr_max_current);
   device_remove_file(bci-usb.dev, dev_attr_mode);
 + device_remove_file(bci-ac.dev, dev_attr_mode);
   /* mask interrupts */
   twl_i2c_write_u8(TWL4030_MODULE_INTERRUPTS, 0xff,
TWL4030_INTERRUPTS_BCIIMR1A);
 
 
 --
 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/

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, 

[PATCH 13/15] twl4030_charger: add ac/mode to match usb/mode

2015-02-24 Thread NeilBrown
This allows AC charging to be turned off, much like usb charging.

continuous (aka linear) mode maps to the CVENAC (constant voltage)
feature of the twl4030.

Signed-off-by: NeilBrown ne...@suse.de
---
 drivers/power/twl4030_charger.c |   40 +--
 1 file changed, 30 insertions(+), 10 deletions(-)

diff --git a/drivers/power/twl4030_charger.c b/drivers/power/twl4030_charger.c
index 6c53f0b601a4..e5a0225ea87e 100644
--- a/drivers/power/twl4030_charger.c
+++ b/drivers/power/twl4030_charger.c
@@ -112,7 +112,7 @@ struct twl4030_bci {
int ichg_eoc, ichg_lo, ichg_hi;
int usb_cur, ac_cur;
boolac_is_active;
-   int usb_mode; /* charging mode requested */
+   int usb_mode, ac_mode; /* charging mode requested */
 #defineCHARGE_OFF  0
 #defineCHARGE_AUTO 1
 #defineCHARGE_LINEAR   2
@@ -449,12 +449,18 @@ static int twl4030_charger_enable_usb(struct twl4030_bci 
*bci, bool enable)
 /*
  * Enable/Disable AC Charge funtionality.
  */
-static int twl4030_charger_enable_ac(bool enable)
+static int twl4030_charger_enable_ac(struct twl4030_bci *bci, bool enable)
 {
int ret;
 
-   if (enable)
-   ret = twl4030_clear_set_boot_bci(0, TWL4030_BCIAUTOAC);
+   if (bci-ac_mode == CHARGE_OFF)
+   enable = false;
+
+   if (enable  bci-ac_mode == CHARGE_LINEAR)
+   ret = twl4030_clear_set_boot_bci(0, (TWL4030_CVENAC |
+TWL4030_BCIAUTOAC));
+   else if (enable)
+   ret = twl4030_clear_set_boot_bci(TWL4030_CVENAC, 
TWL4030_BCIAUTOAC);
else
ret = twl4030_clear_set_boot_bci(TWL4030_BCIAUTOAC, 0);
 
@@ -688,9 +694,15 @@ twl4030_bci_mode_store(struct device *dev, struct 
device_attribute *attr,
mode = 2;
else
return -EINVAL;
-   twl4030_charger_enable_usb(bci, false);
-   bci-usb_mode = mode;
-   status = twl4030_charger_enable_usb(bci, true);
+   if (dev == bci-ac.dev) {
+   twl4030_charger_enable_ac(bci, false);
+   bci-ac_mode = mode;
+   status = twl4030_charger_enable_ac(bci, true);
+   } else {
+   twl4030_charger_enable_usb(bci, false);
+   bci-usb_mode = mode;
+   status = twl4030_charger_enable_usb(bci, true);
+   }
return (status == 0) ? n : status;
 }
 
@@ -704,9 +716,13 @@ twl4030_bci_mode_show(struct device *dev,
struct twl4030_bci *bci = dev_get_drvdata(dev-parent);
int len = 0;
int i;
+   int mode = bci-usb_mode;
+
+   if (dev == bci-ac.dev)
+   mode = bci-ac_mode;
 
for (i = 0; i  ARRAY_SIZE(modes); i++)
-   if (bci-usb_mode == i)
+   if (mode == i)
len += snprintf(buf+len, PAGE_SIZE-len,
[%s] , modes[i]);
else
@@ -900,6 +916,7 @@ static int __init twl4030_bci_probe(struct platform_device 
*pdev)
else
bci-usb_cur = 10;  /* 100mA */
bci-usb_mode = CHARGE_AUTO;
+   bci-ac_mode = CHARGE_AUTO;
 
bci-dev = pdev-dev;
bci-irq_chg = platform_get_irq(pdev, 0);
@@ -988,10 +1005,12 @@ static int __init twl4030_bci_probe(struct 
platform_device *pdev)
dev_warn(pdev-dev, could not create sysfs file\n);
if (device_create_file(bci-usb.dev, dev_attr_mode))
dev_warn(pdev-dev, could not create sysfs file\n);
+   if (device_create_file(bci-ac.dev, dev_attr_mode))
+   dev_warn(pdev-dev, could not create sysfs file\n);
if (device_create_file(bci-ac.dev, dev_attr_max_current))
dev_warn(pdev-dev, could not create sysfs file\n);
 
-   twl4030_charger_enable_ac(true);
+   twl4030_charger_enable_ac(bci, true);
if (!IS_ERR_OR_NULL(bci-transceiver))
twl4030_bci_usb_ncb(bci-usb_nb,
bci-transceiver-last_event,
@@ -1014,13 +1033,14 @@ static int __exit twl4030_bci_remove(struct 
platform_device *pdev)
 {
struct twl4030_bci *bci = platform_get_drvdata(pdev);
 
-   twl4030_charger_enable_ac(false);
+   twl4030_charger_enable_ac(bci, false);
twl4030_charger_enable_usb(bci, false);
twl4030_charger_enable_backup(0, 0);
 
device_remove_file(bci-usb.dev, dev_attr_max_current);
device_remove_file(bci-ac.dev, dev_attr_max_current);
device_remove_file(bci-usb.dev, dev_attr_mode);
+   device_remove_file(bci-ac.dev, dev_attr_mode);
/* mask interrupts */
twl_i2c_write_u8(TWL4030_MODULE_INTERRUPTS, 0xff,
 TWL4030_INTERRUPTS_BCIIMR1A);


--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to