Skip to contentSkip to conversation

power: supply: cpcap-charger: Add minimal CPCAP PMIC battery charger

PATCH In review Tony Lindgren 4 participants 4 messages Mar 22, 2017 – Mar 24, 2017 1 message not in the archive

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

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
new file mode 100644
@@ -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
#1 lore raw

Hi,

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_companion interface.

[...]

Documentation/devicetree/bindings/power/supply/cpcap-charger.txt new file +0 -0
new file mode 100644

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 -0
 config 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

#2 lore raw
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 interrupts

That'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 channels

Same 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 GPIOs

DT 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]

#4 lore raw

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