Re: [PATCH 4/6] twl4030_charger: Allow charger to control the regulator that feeds it.
Hi Neil, On Wed, Apr 25, 2012 at 05:33:11PM +1000, NeilBrown wrote: The charger needs usb3v1 to be running, so add a new consumer to keep it running. This allows the charger to draw current even when the USB driver has powered down. Signed-off-by: NeilBrown ne...@suse.de --- drivers/mfd/twl-core.c |9 + drivers/power/twl4030_charger.c | 15 +++ 2 files changed, 20 insertions(+), 4 deletions(-) In case Anton has not taken that patchset yet: Acked-by: Samuel Ortiz sa...@linux.intel.com Cheers, Samuel. -- Intel Open Source Technology Centre http://oss.intel.com/ -- 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 4/6] twl4030_charger: Allow charger to control the regulator that feeds it.
Hi Neil, As I am supposed to be acting as a maintainer for the drivers/mfd/twl-*, you can add an ack from me for the twl-core.c part. It looks kind of okay, even if I would eventually like to remove/fix the ugly regulator init from twl-core. Just a question, who is going to merge all this seeing it is touching stuff all over the place? -Tero On Wed, 2012-04-25 at 17:33 +1000, NeilBrown wrote: The charger needs usb3v1 to be running, so add a new consumer to keep it running. This allows the charger to draw current even when the USB driver has powered down. Signed-off-by: NeilBrown ne...@suse.de --- drivers/mfd/twl-core.c |9 + drivers/power/twl4030_charger.c | 15 +++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c index 7c2267e..4cbf285 100644 --- a/drivers/mfd/twl-core.c +++ b/drivers/mfd/twl-core.c @@ -723,8 +723,9 @@ add_children(struct twl4030_platform_data *pdata, unsigned irq_base, static struct regulator_consumer_supply usb1v8 = { .supply = usb1v8, }; - static struct regulator_consumer_supply usb3v1 = { - .supply = usb3v1, + static struct regulator_consumer_supply usb3v1[] = { + { .supply = usb3v1 }, + { .supply = bci3v1 }, }; /* First add the regulators so that they can be used by transceiver */ @@ -752,7 +753,7 @@ add_children(struct twl4030_platform_data *pdata, unsigned irq_base, return PTR_ERR(child); child = add_regulator_linked(TWL4030_REG_VUSB3V1, - usb_fixed, usb3v1, 1, + usb_fixed, usb3v1, 2, features); if (IS_ERR(child)) return PTR_ERR(child); @@ -773,7 +774,7 @@ add_children(struct twl4030_platform_data *pdata, unsigned irq_base, if (twl_has_regulator() child) { usb1v5.dev_name = dev_name(child); usb1v8.dev_name = dev_name(child); - usb3v1.dev_name = dev_name(child); + usb3v1[0].dev_name = dev_name(child); } } if (twl_has_usb() pdata-usb twl_class_is_6030()) { diff --git a/drivers/power/twl4030_charger.c b/drivers/power/twl4030_charger.c index 684662a..d9d8e4a 100644 --- a/drivers/power/twl4030_charger.c +++ b/drivers/power/twl4030_charger.c @@ -21,6 +21,7 @@ #include linux/power_supply.h #include linux/notifier.h #include linux/usb/otg.h +#include linux/regulator/machine.h #define TWL4030_BCIMSTATEC 0x02 #define TWL4030_BCIICHG 0x08 @@ -86,6 +87,8 @@ struct twl4030_bci { struct work_struct work; int irq_chg; int irq_bci; + struct regulator*usb_reg; + int usb_enabled; unsigned long event; }; @@ -179,6 +182,12 @@ static int twl4030_charger_enable_usb(struct twl4030_bci *bci, bool enable) return -EACCES; } + /* Need to keep regulator on */ + if (!bci-usb_enabled) { + regulator_enable(bci-usb_reg); + bci-usb_enabled = 1; + } + /* forcing the field BCIAUTOUSB (BOOT_BCI[1]) to 1 */ ret = twl4030_clear_set_boot_bci(0, TWL4030_BCIAUTOUSB); if (ret 0) @@ -189,6 +198,10 @@ static int twl4030_charger_enable_usb(struct twl4030_bci *bci, bool enable) TWL4030_USBFASTMCHG, TWL4030_BCIMFSTS4); } else { ret = twl4030_clear_set_boot_bci(TWL4030_BCIAUTOUSB, 0); + if (bci-usb_enabled) { + regulator_disable(bci-usb_reg); + bci-usb_enabled = 0; + } } return ret; @@ -507,6 +520,8 @@ static int __init twl4030_bci_probe(struct platform_device *pdev) bci-usb.num_properties = ARRAY_SIZE(twl4030_charger_props); bci-usb.get_property = twl4030_bci_get_property; + bci-usb_reg = regulator_get(bci-dev, bci3v1); + ret = power_supply_register(pdev-dev, bci-usb); if (ret) { dev_err(pdev-dev, failed to register usb: %d\n, ret); -- 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 -- 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
Re: [PATCH 4/6] twl4030_charger: Allow charger to control the regulator that feeds it.
On Mon, 30 Apr 2012 13:14:32 +0300 Tero Kristo t-kri...@ti.com wrote: Hi Neil, As I am supposed to be acting as a maintainer for the drivers/mfd/twl-*, you can add an ack from me for the twl-core.c part. It looks kind of okay, even if I would eventually like to remove/fix the ugly regulator init from twl-core. Thanks. Just a question, who is going to merge all this seeing it is touching stuff all over the place? Good question. I'll try Anton Vorontsov as he seems to handle drivers/power/ stuff. Maybe with your ack he will take it. Otherwise apkm seems to be the default if no-one else cares :-) Thanks, NeilBrown -Tero On Wed, 2012-04-25 at 17:33 +1000, NeilBrown wrote: The charger needs usb3v1 to be running, so add a new consumer to keep it running. This allows the charger to draw current even when the USB driver has powered down. Signed-off-by: NeilBrown ne...@suse.de --- drivers/mfd/twl-core.c |9 + drivers/power/twl4030_charger.c | 15 +++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c index 7c2267e..4cbf285 100644 --- a/drivers/mfd/twl-core.c +++ b/drivers/mfd/twl-core.c @@ -723,8 +723,9 @@ add_children(struct twl4030_platform_data *pdata, unsigned irq_base, static struct regulator_consumer_supply usb1v8 = { .supply = usb1v8, }; - static struct regulator_consumer_supply usb3v1 = { - .supply = usb3v1, + static struct regulator_consumer_supply usb3v1[] = { + { .supply = usb3v1 }, + { .supply = bci3v1 }, }; /* First add the regulators so that they can be used by transceiver */ @@ -752,7 +753,7 @@ add_children(struct twl4030_platform_data *pdata, unsigned irq_base, return PTR_ERR(child); child = add_regulator_linked(TWL4030_REG_VUSB3V1, - usb_fixed, usb3v1, 1, + usb_fixed, usb3v1, 2, features); if (IS_ERR(child)) return PTR_ERR(child); @@ -773,7 +774,7 @@ add_children(struct twl4030_platform_data *pdata, unsigned irq_base, if (twl_has_regulator() child) { usb1v5.dev_name = dev_name(child); usb1v8.dev_name = dev_name(child); - usb3v1.dev_name = dev_name(child); + usb3v1[0].dev_name = dev_name(child); } } if (twl_has_usb() pdata-usb twl_class_is_6030()) { diff --git a/drivers/power/twl4030_charger.c b/drivers/power/twl4030_charger.c index 684662a..d9d8e4a 100644 --- a/drivers/power/twl4030_charger.c +++ b/drivers/power/twl4030_charger.c @@ -21,6 +21,7 @@ #include linux/power_supply.h #include linux/notifier.h #include linux/usb/otg.h +#include linux/regulator/machine.h #define TWL4030_BCIMSTATEC 0x02 #define TWL4030_BCIICHG0x08 @@ -86,6 +87,8 @@ struct twl4030_bci { struct work_struct work; int irq_chg; int irq_bci; + struct regulator*usb_reg; + int usb_enabled; unsigned long event; }; @@ -179,6 +182,12 @@ static int twl4030_charger_enable_usb(struct twl4030_bci *bci, bool enable) return -EACCES; } + /* Need to keep regulator on */ + if (!bci-usb_enabled) { + regulator_enable(bci-usb_reg); + bci-usb_enabled = 1; + } + /* forcing the field BCIAUTOUSB (BOOT_BCI[1]) to 1 */ ret = twl4030_clear_set_boot_bci(0, TWL4030_BCIAUTOUSB); if (ret 0) @@ -189,6 +198,10 @@ static int twl4030_charger_enable_usb(struct twl4030_bci *bci, bool enable) TWL4030_USBFASTMCHG, TWL4030_BCIMFSTS4); } else { ret = twl4030_clear_set_boot_bci(TWL4030_BCIAUTOUSB, 0); + if (bci-usb_enabled) { + regulator_disable(bci-usb_reg); + bci-usb_enabled = 0; + } } return ret; @@ -507,6 +520,8 @@ static int __init twl4030_bci_probe(struct platform_device *pdev) bci-usb.num_properties = ARRAY_SIZE(twl4030_charger_props); bci-usb.get_property = twl4030_bci_get_property; + bci-usb_reg = regulator_get(bci-dev, bci3v1); + ret = power_supply_register(pdev-dev, bci-usb); if (ret) { dev_err(pdev-dev, failed to register usb: %d\n, ret); -- To unsubscribe from this list: send the line unsubscribe linux-omap in
[PATCH 4/6] twl4030_charger: Allow charger to control the regulator that feeds it.
The charger needs usb3v1 to be running, so add a new consumer to keep it running. This allows the charger to draw current even when the USB driver has powered down. Signed-off-by: NeilBrown ne...@suse.de --- drivers/mfd/twl-core.c |9 + drivers/power/twl4030_charger.c | 15 +++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c index 7c2267e..4cbf285 100644 --- a/drivers/mfd/twl-core.c +++ b/drivers/mfd/twl-core.c @@ -723,8 +723,9 @@ add_children(struct twl4030_platform_data *pdata, unsigned irq_base, static struct regulator_consumer_supply usb1v8 = { .supply = usb1v8, }; - static struct regulator_consumer_supply usb3v1 = { - .supply = usb3v1, + static struct regulator_consumer_supply usb3v1[] = { + { .supply = usb3v1 }, + { .supply = bci3v1 }, }; /* First add the regulators so that they can be used by transceiver */ @@ -752,7 +753,7 @@ add_children(struct twl4030_platform_data *pdata, unsigned irq_base, return PTR_ERR(child); child = add_regulator_linked(TWL4030_REG_VUSB3V1, - usb_fixed, usb3v1, 1, + usb_fixed, usb3v1, 2, features); if (IS_ERR(child)) return PTR_ERR(child); @@ -773,7 +774,7 @@ add_children(struct twl4030_platform_data *pdata, unsigned irq_base, if (twl_has_regulator() child) { usb1v5.dev_name = dev_name(child); usb1v8.dev_name = dev_name(child); - usb3v1.dev_name = dev_name(child); + usb3v1[0].dev_name = dev_name(child); } } if (twl_has_usb() pdata-usb twl_class_is_6030()) { diff --git a/drivers/power/twl4030_charger.c b/drivers/power/twl4030_charger.c index 684662a..d9d8e4a 100644 --- a/drivers/power/twl4030_charger.c +++ b/drivers/power/twl4030_charger.c @@ -21,6 +21,7 @@ #include linux/power_supply.h #include linux/notifier.h #include linux/usb/otg.h +#include linux/regulator/machine.h #define TWL4030_BCIMSTATEC 0x02 #define TWL4030_BCIICHG0x08 @@ -86,6 +87,8 @@ struct twl4030_bci { struct work_struct work; int irq_chg; int irq_bci; + struct regulator*usb_reg; + int usb_enabled; unsigned long event; }; @@ -179,6 +182,12 @@ static int twl4030_charger_enable_usb(struct twl4030_bci *bci, bool enable) return -EACCES; } + /* Need to keep regulator on */ + if (!bci-usb_enabled) { + regulator_enable(bci-usb_reg); + bci-usb_enabled = 1; + } + /* forcing the field BCIAUTOUSB (BOOT_BCI[1]) to 1 */ ret = twl4030_clear_set_boot_bci(0, TWL4030_BCIAUTOUSB); if (ret 0) @@ -189,6 +198,10 @@ static int twl4030_charger_enable_usb(struct twl4030_bci *bci, bool enable) TWL4030_USBFASTMCHG, TWL4030_BCIMFSTS4); } else { ret = twl4030_clear_set_boot_bci(TWL4030_BCIAUTOUSB, 0); + if (bci-usb_enabled) { + regulator_disable(bci-usb_reg); + bci-usb_enabled = 0; + } } return ret; @@ -507,6 +520,8 @@ static int __init twl4030_bci_probe(struct platform_device *pdev) bci-usb.num_properties = ARRAY_SIZE(twl4030_charger_props); bci-usb.get_property = twl4030_bci_get_property; + bci-usb_reg = regulator_get(bci-dev, bci3v1); + ret = power_supply_register(pdev-dev, bci-usb); if (ret) { dev_err(pdev-dev, failed to register usb: %d\n, ret); -- 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