power: supply: cpcap-charger: Add minimal CPCAP PMIC battery charger
Subsystems (2)
PATCH v2 1/1 power: supply: cpcap-charger: Add minimal CPCAP PMIC battery charger
The custom CPCAP PMIC used on Motorola phones such as Droid 4 has a USB battery charger. It can optionally also have a companion chip that is used for wireless charging.
The charger on CPCAP also can feed VBUS for the USB host mode. This can be handled by the existing kernel phy_companion interface.
---
Changes since v1:
- Fix scaling of IIO values as pointed out by Sebastian Reichel <[email protected]>
- Use iio_read_channel_processed() instead of iio_read_channel_scaled() as changed in the v2 of the ADC driver
- Add GPL v2 license header
--- .../bindings/power/supply/cpcap-charger.txt | 34 + drivers/power/supply/Kconfig | 7 + drivers/power/supply/Makefile | 1 + drivers/power/supply/cpcap-charger.c | 684 +++++++++++++++++++++ 4 files changed, 726 insertions(+) create mode 100644 Documentation/devicetree/bindings/power/supply/cpcap-charger.txt create mode 100644 drivers/power/supply/cpcap-charger.c
Documentation/devicetree/bindings/power/supply/cpcap-charger.txt new file +34 -0
@@ -0,0 +1,34 @@ +Motorola CPCAP PMIC battery charger binding + +Required properties: +- compatible: Shall be "motorola,cpcap-charger" or + "motorola,mapphone-cpcap-charger" +- interrupts: Interrupts used on the CPCAP PMIC +- interrupt-names: Names of the interrupts +- io-channels: IIO ADC channels used by the charger +- io-channel-names: Names of the IIO ADC channels + +Optional properties: +- mode-gpios: Optionally CPCAP charger can have a companion wireless + charge controller that is controlled with two GPIOs + +Example: + +cpcap_charger: charger { + compatible = "motorola,mapphone-cpcap-charger"; + interrupts-extended = < + &cpcap 13 0 &cpcap 12 0 &cpcap 29 0 &cpcap 28 0 + &cpcap 22 0 &cpcap 20 0 &cpcap 19 0 &cpcap 54 0 + >; + interrupt-names = + "chrg_det", "rvrs_chrg", "chrg_se1b", "se0conn", + "rvrs_mode", "chrgcurr1", "vbusvld", "battdetb"; + mode-gpios = <&gpio3 29 GPIO_ACTIVE_LOW + &gpio3 23 GPIO_ACTIVE_LOW>; + io-channels = <&cpcap_adc 0 &cpcap_adc 1 + &cpcap_adc 2 &cpcap_adc 5 + &cpcap_adc 6>; + io-channel-names = "battdetb", "battp", + "vbus", "chg_isense", + "batti"; +};
drivers/power/supply/Kconfig +7 -0
@@ -317,6 +317,13 @@ config BATTERY_RX51 Say Y here to enable support for battery information on Nokia RX-51, also known as N900 tablet. +config CHARGER_CPCAP + tristate "CPCAP PMIC Charger Driver" + depends on MFD_CPCAP + help + Say Y to enable support for CPCAP PMIC charger driver for Motorola + mobile devices such as Droid 4. + config CHARGER_ISP1704 tristate "ISP1704 USB Charger Detection" depends on USB_PHY
drivers/power/supply/Makefile +1 -0
@@ -51,6 +51,7 @@ obj-$(CONFIG_CHARGER_PCF50633) += pcf50633-charger.o obj-$(CONFIG_BATTERY_JZ4740) += jz4740-battery.o obj-$(CONFIG_BATTERY_RX51) += rx51_battery.o obj-$(CONFIG_AB8500_BM) += ab8500_bmdata.o ab8500_charger.o ab8500_fg.o ab8500_btemp.o abx500_chargalg.o pm2301_charger.o +obj-$(CONFIG_CHARGER_CPCAP) += cpcap-charger.o obj-$(CONFIG_CHARGER_ISP1704) += isp1704_charger.o obj-$(CONFIG_CHARGER_MAX8903) += max8903_charger.o obj-$(CONFIG_CHARGER_TWL4030) += twl4030_charger.o
drivers/power/supply/cpcap-charger.c new file +684 -0
684 lines not on this page · raw message
Signature · 1 line
2.11.1
Sebastian Reichel
maintainerHi,
Quoted 14 lines · Tony Lindgren
The custom CPCAP PMIC used on Motorola phones such as Droid 4 has a USB battery charger. It can optionally also have a companion chip that is used for wireless charging.
The charger on CPCAP also can feed VBUS for the USB host mode. This can be handled by the existing kernel
phy_companioninterface.[...]
Documentation/devicetree/bindings/power/supply/cpcap-charger.txt new file +0
-0
Documentation/devicetree/bindings/power/supply/cpcap-charger.txt line 7
Quoted 7 lines
Documentation/devicetree/bindings/power/supply/cpcap-charger.txt new file +7
-0@@ -0,0 +1,34 @@ +Motorola CPCAP PMIC battery charger binding + +Required properties: +- compatible: Shall be "motorola,cpcap-charger" or + "motorola,mapphone-cpcap-charger" +- interrupts: Interrupts used on the CPCAP PMIC +- interrupt-names: Names of the interrupts
That's usually done like
interrupts: Interrupt specifier for each name in interrupt-names
interrupt-names: Should contain the following entries:
"bla", "foo", "42"
Documentation/devicetree/bindings/power/supply/cpcap-charger.txt line 9
Quoted 2 lines
Documentation/devicetree/bindings/power/supply/cpcap-charger.txt new file +2
-0+- io-channels: IIO ADC channels used by the charger +- io-channel-names: Names of the IIO ADC channels
Same as for interrupts.
Documentation/devicetree/bindings/power/supply/cpcap-charger.txt line 13
Quoted 3 lines
Documentation/devicetree/bindings/power/supply/cpcap-charger.txt new file +3
-0+Optional properties: +- mode-gpios: Optionally CPCAP charger can have a companion wireless + charge controller that is controlled with two GPIOs
DT people prefer to have GPIO activity (high/low) to be specified in the binding.
Quoted 24 lines
Documentation/devicetree/bindings/power/supply/cpcap-charger.txt new file +20
-0+Example: + +cpcap_charger: charger { + compatible = "motorola,mapphone-cpcap-charger"; + interrupts-extended = < + &cpcap 13 0 &cpcap 12 0 &cpcap 29 0 &cpcap 28 0 + &cpcap 22 0 &cpcap 20 0 &cpcap 19 0 &cpcap 54 0 + >; + interrupt-names = + "chrg_det", "rvrs_chrg", "chrg_se1b", "se0conn", + "rvrs_mode", "chrgcurr1", "vbusvld", "battdetb"; + mode-gpios = <&gpio3 29 GPIO_ACTIVE_LOW + &gpio3 23 GPIO_ACTIVE_LOW>; + io-channels = <&cpcap_adc 0 &cpcap_adc 1 + &cpcap_adc 2 &cpcap_adc 5 + &cpcap_adc 6>; + io-channel-names = "battdetb", "battp", + "vbus", "chg_isense", + "batti"; +};
drivers/power/supply/Kconfig config BATTERY_RX51 · line 326
Quoted 10 lines
drivers/power/supply/Kconfig +7
-0@@ -317,6 +317,13 @@ config BATTERY_RX51 Say Y here to enable support for battery information on Nokia RX-51, also known as N900 tablet. +config CHARGER_CPCAP + tristate "CPCAP PMIC Charger Driver" + depends on MFD_CPCAP + help + Say Y to enable support for CPCAP PMIC charger driver for Motorola + mobile devices such as Droid 4. +
I think adding "default MFD_CPCAP" for CPCPAP's subdrivers would be nice.
Quoted 6 lines
drivers/power/supply/Kconfig +0
-0config CHARGER_ISP1704 tristate "ISP1704 USB Charger Detection" depends on USB_PHY
drivers/power/supply/Makefile
Quoted 9 lines
drivers/power/supply/Makefile +6
-0+#include <linux/gpio/consumer.h> +#include <linux/usb/phy_companion.h> +#include <linux/phy/omap_usb.h> +#include <linux/usb/otg.h> +#include <linux/iio/consumer.h> +#include <linux/mfd/motorola-cpcap.h>
This looks very entangled with mapphone specific things, so maybe we should not add "motorola,cpcap-charger" for now?
Quoted 19 lines
[...]
drivers/power/supply/Makefile +17
-0+static int cpcap_charger_get_ints_state(struct cpcap_charger_ddata *ddata, + struct cpcap_charger_ints_state *s) +{ + int val, error; + + error = regmap_read(ddata->reg, CPCAP_REG_INTS1, &val); + if (error) + return error; + + s->chrg_det = val & BIT(13); + s->rvrs_chrg = val & BIT(12); + s->vbusov = val & BIT(11); + + error = regmap_read(ddata->reg, CPCAP_REG_INTS2, &val); + if (error) + return error; +
drivers/power/supply/Makefile
Quoted 10 lines
drivers/power/supply/Makefile +10
-0+ s->chrg_se1b = val & BIT(13); + s->rvrs_mode = val & BIT(6); + s->chrgcurr1 = val & BIT(4); + s->vbusvld = val & BIT(3); + + error = regmap_read(ddata->reg, CPCAP_REG_INTS4, &val); + if (error) + return error; + + s->battdetb = val & BIT(6);
Did you avoid using cpcap_sense_virq() for performance reasons?
s->battdetb = cpcap_sense_virq(ddata->reg, ddata->irq_battdetb); (and so on)
looks cleaner IMHO.
drivers/power/supply/Makefile
Quoted 5 lines
drivers/power/supply/Makefile +3
-0+ + return 0; +}
-- Sebastian
Quoted 9 lines · Sebastian Reichel
Documentation/devicetree/bindings/power/supply/cpcap-charger.txt line 7
Quoted 5 lines · Tony Lindgren
Documentation/devicetree/bindings/power/supply/cpcap-charger.txt new file +5
-0+Required properties: +- compatible: Shall be "motorola,cpcap-charger" or + "motorola,mapphone-cpcap-charger" +- interrupts: Interrupts used on the CPCAP PMIC +- interrupt-names: Names of the interruptsThat's usually done like
Quoted 3 lines
interrupts: Interrupt specifier for each name in interrupt-names
interrupt-names: Should contain the following entries:
"bla", "foo", "42"
Sure will update.
Quoted 4 lines
Quoted 2 lines
+- io-channels: IIO ADC channels used by the charger +- io-channel-names: Names of the IIO ADC channelsSame as for interrupts.
OK
Quoted 6 lines
Documentation/devicetree/bindings/power/supply/cpcap-charger.txt line 13
Quoted 3 lines
Documentation/devicetree/bindings/power/supply/cpcap-charger.txt new file +3
-0+Optional properties: +- mode-gpios: Optionally CPCAP charger can have a companion wireless + charge controller that is controlled with two GPIOsDT people prefer to have GPIO activity (high/low) to be specified in the binding.
OK will add.
Quoted 6 lines
Quoted 6 lines
drivers/power/supply/Kconfig +0
-0@@ -317,6 +317,13 @@ config BATTERY_RX51 Say Y here to enable support for battery information on Nokia RX-51, also known as N900 tablet.
Quoted 9 lines
drivers/power/supply/Kconfig config BATTERY_RX51 · line 326
Quoted 7 lines
drivers/power/supply/Kconfig +7
-0+config CHARGER_CPCAP + tristate "CPCAP PMIC Charger Driver" + depends on MFD_CPCAP + help + Say Y to enable support for CPCAP PMIC charger driver for Motorola + mobile devices such as Droid 4. +I think adding "default
MFD_CPCAP" for CPCPAP's subdrivers would be nice.
OK
Quoted 6 lines
Quoted 6 lines
drivers/power/supply/Makefile +0
-0
Quoted 10 lines
drivers/power/supply/Makefile
Quoted 6 lines
drivers/power/supply/Makefile +6
-0+#include <linux/gpio/consumer.h> +#include <linux/usb/phy_companion.h> +#include <linux/phy/omap_usb.h> +#include <linux/usb/otg.h> +#include <linux/iio/consumer.h> +#include <linux/mfd/motorola-cpcap.h>This looks very entangled with mapphone specific things, so maybe we should not add "motorola,cpcap-charger" for now?
Yeah I think that's a good idea as we have no documentation for the mystery companion charger chip there that has "6500" printed on it.
Quoted 21 lines
Quoted 21 lines
drivers/power/supply/Makefile +21
-0+static int cpcap_charger_get_ints_state(struct cpcap_charger_ddata *ddata, + struct cpcap_charger_ints_state *s) +{ + int val, error; + + error = regmap_read(ddata->reg, CPCAP_REG_INTS1, &val); + if (error) + return error; + + s->chrg_det = val & BIT(13); + s->rvrs_chrg = val & BIT(12); + s->vbusov = val & BIT(11); + + error = regmap_read(ddata->reg, CPCAP_REG_INTS2, &val); + if (error) + return error; + + s->chrg_se1b = val & BIT(13); + s->rvrs_mode = val & BIT(6); + s->chrgcurr1 = val & BIT(4); + s->vbusvld = val & BIT(3);
Quoted 8 lines
drivers/power/supply/Makefile
Quoted 6 lines
drivers/power/supply/Makefile +6
-0+ + error = regmap_read(ddata->reg, CPCAP_REG_INTS4, &val); + if (error) + return error; + + s->battdetb = val & BIT(6);Did you avoid using
cpcap_sense_virq()for performance reasons?
I don't think performance is an issue here :)
Quoted 4 lines
s->battdetb=cpcap_sense_virq(ddata->reg, ddata->irq_battdetb); (and so on)looks cleaner IMHO.
I figured I'll do a follow up patch for when available to remove dependencies between subsystems.
Regards,
Tony
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): [email protected]
Hi,
Quoted 7 lines · Tony Lindgren
Quoted 4 lines
s->battdetb=cpcap_sense_virq(ddata->reg, ddata->irq_battdetb); (and so on)looks cleaner IMHO.
I figured I'll do a follow up patch for when available to remove dependencies between subsystems.
Ok. I'm fine with that.
-- Sebastian