Skip to contentSkip to conversation

power: axp20x_usb: Add support for usb power-supply on axp22x pmics

PATCH New Hans de Goede 5 participants 15 messages Jun 2, 2016 – Jun 10, 2016

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

PATCH v2 1/4 power: axp20x_usb: Add support for usb power-supply on axp22x pmics

The usb power-supply on the axp22x pmics is mostly identical to the one on the axp20x pmics. One significant difference is that it cannot measure / monitor the usb voltage / current.

---
Changes in v2:
-Use compatible instead of axp20x->variant to detect pmic type

---
 .../bindings/power_supply/axp20x_usb_power.txt     |  3 +-
 drivers/power/axp20x_usb_power.c                   | 92 ++++++++++++++++------
 2 files changed, 71 insertions(+), 24 deletions(-)
Documentation/devicetree/bindings/power_supply/axp20x_usb_power.txt +2 -1
index 862f4a4..f1d7bee 100644
@@ -1,7 +1,8 @@
 AXP20x USB power supply
 
 Required Properties:
--compatible: "x-powers,axp202-usb-power-supply"
+-compatible: One of: "x-powers,axp202-usb-power-supply"
+                     "x-powers,axp221-usb-power-supply"
 
 This node is a subnode of the axp20x PMIC.
 
drivers/power/axp20x_usb_power.c +69 -23

154 lines not on this page · raw message

Signature · 1 line
2.7.4
#1 lore raw

PATCH v2 2/4 mfd: axp20x: Extend axp22x_volatile_ranges

The axp22x pmic has a bunch of volatile registers besides the interrupt ones, extend axp22x_volatile_ranges with these.

---
Changes in v2:
-Added Chen-Yu's Acked-by

---
 drivers/mfd/axp20x.c | 3 +++
 1 file changed, 3 insertions(+)
drivers/mfd/axp20x.c +3 -0
index e4e3297..ca04361 100644
@@ -93,7 +93,10 @@ static const struct regmap_range axp22x_writeable_ranges[] = {
 };
 
 static const struct regmap_range axp22x_volatile_ranges[] = {
+	regmap_reg_range(AXP20X_PWR_INPUT_STATUS, AXP20X_PWR_OP_MODE),
 	regmap_reg_range(AXP20X_IRQ1_EN, AXP20X_IRQ5_STATE),
+	regmap_reg_range(AXP22X_GPIO_STATE, AXP22X_GPIO_STATE),
+	regmap_reg_range(AXP20X_FG_RES, AXP20X_FG_RES),
 };
 
 static const struct regmap_access_table axp22x_writeable_table = {
Signature · 1 line
2.7.4
Applied
#2 lore raw

PATCH v2 2/4 mfd: axp20x: Extend axp22x_volatile_ranges

Quoted 11 lines · Hans de Goede

The axp22x pmic has a bunch of volatile registers besides the interrupt ones, extend axp22x_volatile_ranges with these.

---
Changes in v2:
-Added Chen-Yu's Acked-by

---
 drivers/mfd/axp20x.c | 3 +++
 1 file changed, 3 insertions(+)

Applied, thanks.

Quoted 15 lines
drivers/mfd/axp20x.c +3 -0
index e4e3297..ca04361 100644
@@ -93,7 +93,10 @@ static const struct regmap_range axp22x_writeable_ranges[] = {
 };
 
 static const struct regmap_range axp22x_volatile_ranges[] = {
+	regmap_reg_range(AXP20X_PWR_INPUT_STATUS, AXP20X_PWR_OP_MODE),
 	regmap_reg_range(AXP20X_IRQ1_EN, AXP20X_IRQ5_STATE),
+	regmap_reg_range(AXP22X_GPIO_STATE, AXP22X_GPIO_STATE),
+	regmap_reg_range(AXP20X_FG_RES, AXP20X_FG_RES),
 };
 
 static const struct regmap_access_table axp22x_writeable_table = {
Signature · 4 lines
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
#3 lore raw

PATCH v2 3/4 mfd: axp20x: Add axp20x-usb-power-supply for axp22x pmics

In reply to Hans de Goede

Add axp20x-usb-power-supply for axp22x pmics.

---
Changes in v2:
-Change compatible string for axp22x usb-power-supply cell to match v2 of:
"power: axp20x_usb: Add support for usb power-supply on axp22x pmics"

---
 drivers/mfd/axp20x.c | 10 ++++++++++
 1 file changed, 10 insertions(+)
drivers/mfd/axp20x.c +10 -0
index ca04361..6364dab 100644
@@ -160,6 +160,11 @@ static struct resource axp20x_usb_power_supply_resources[] = {
 	DEFINE_RES_IRQ_NAMED(AXP20X_IRQ_VBUS_NOT_VALID, "VBUS_NOT_VALID"),
 };
 
+static struct resource axp22x_usb_power_supply_resources[] = {
+	DEFINE_RES_IRQ_NAMED(AXP22X_IRQ_VBUS_PLUGIN, "VBUS_PLUGIN"),
+	DEFINE_RES_IRQ_NAMED(AXP22X_IRQ_VBUS_REMOVAL, "VBUS_REMOVAL"),
+};
+
 static struct resource axp22x_pek_resources[] = {
 	{
 		.name   = "PEK_DBR",
@@ -527,6 +532,11 @@ static struct mfd_cell axp22x_cells[] = {
 		.resources		= axp22x_pek_resources,
 	}, {
 		.name			= "axp20x-regulator",
+	}, {
+		.name		= "axp20x-usb-power-supply",
+		.of_compatible	= "x-powers,axp221-usb-power-supply",
+		.num_resources	= ARRAY_SIZE(axp22x_usb_power_supply_resources),
+		.resources	= axp22x_usb_power_supply_resources,
 	},
 };
 
Signature · 1 line
2.7.4
Applied
#5 lore raw

PATCH v2 3/4 mfd: axp20x: Add axp20x-usb-power-supply for axp22x pmics

In reply to Hans de Goede
Quoted 10 lines · Hans de Goede

Add axp20x-usb-power-supply for axp22x pmics.

---
Changes in v2:
-Change compatible string for axp22x usb-power-supply cell to match v2 of:
"power: axp20x_usb: Add support for usb power-supply on axp22x pmics"

---
 drivers/mfd/axp20x.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

Applied, thanks.

Quoted 28 lines
drivers/mfd/axp20x.c +10 -0
index ca04361..6364dab 100644
@@ -160,6 +160,11 @@ static struct resource axp20x_usb_power_supply_resources[] = {
 	DEFINE_RES_IRQ_NAMED(AXP20X_IRQ_VBUS_NOT_VALID, "VBUS_NOT_VALID"),
 };
 
+static struct resource axp22x_usb_power_supply_resources[] = {
+	DEFINE_RES_IRQ_NAMED(AXP22X_IRQ_VBUS_PLUGIN, "VBUS_PLUGIN"),
+	DEFINE_RES_IRQ_NAMED(AXP22X_IRQ_VBUS_REMOVAL, "VBUS_REMOVAL"),
+};
+
 static struct resource axp22x_pek_resources[] = {
 	{
 		.name   = "PEK_DBR",
@@ -527,6 +532,11 @@ static struct mfd_cell axp22x_cells[] = {
 		.resources		= axp22x_pek_resources,
 	}, {
 		.name			= "axp20x-regulator",
+	}, {
+		.name		= "axp20x-usb-power-supply",
+		.of_compatible	= "x-powers,axp221-usb-power-supply",
+		.num_resources	= ARRAY_SIZE(axp22x_usb_power_supply_resources),
+		.resources	= axp22x_usb_power_supply_resources,
 	},
 };
 
Signature · 4 lines
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
#6 lore raw

PATCH v2 3/4 mfd: axp20x: Add axp20x-usb-power-supply for axp22x pmics

Hi,

Quoted 13 lines · Lee Jones
Quoted 10 lines · Hans de Goede

Add axp20x-usb-power-supply for axp22x pmics.

---
Changes in v2:
-Change compatible string for axp22x usb-power-supply cell to match v2 of:
"power: axp20x_usb: Add support for usb power-supply on axp22x pmics"

---
 drivers/mfd/axp20x.c | 10 ++++++++++
 1 file changed, 10 insertions(+)
Quoted 1 line

Applied, thanks.

Thanks, any chance we can see this show up soonish in :

https://git.kernel.org/cgit/linux/kernel/git/lee/mfd.git/log/?h=for-mfd-next

?

We keep a branch with all the foo-for-next branches relevant for sunxi merged in for testing and it would be good to get these in there.

Regards,

Hans

Quoted 30 lines
Quoted 29 lines
drivers/mfd/axp20x.c +10 -0
index ca04361..6364dab 100644
@@ -160,6 +160,11 @@ static struct resource axp20x_usb_power_supply_resources[] = {
 	DEFINE_RES_IRQ_NAMED(AXP20X_IRQ_VBUS_NOT_VALID, "VBUS_NOT_VALID"),
 };
 
+static struct resource axp22x_usb_power_supply_resources[] = {
+	DEFINE_RES_IRQ_NAMED(AXP22X_IRQ_VBUS_PLUGIN, "VBUS_PLUGIN"),
+	DEFINE_RES_IRQ_NAMED(AXP22X_IRQ_VBUS_REMOVAL, "VBUS_REMOVAL"),
+};
+
 static struct resource axp22x_pek_resources[] = {
 	{
 		.name   = "PEK_DBR",
@@ -527,6 +532,11 @@ static struct mfd_cell axp22x_cells[] = {
 		.resources		= axp22x_pek_resources,
 	}, {
 		.name			= "axp20x-regulator",
+	}, {
+		.name		= "axp20x-usb-power-supply",
+		.of_compatible	= "x-powers,axp221-usb-power-supply",
+		.num_resources	= ARRAY_SIZE(axp22x_usb_power_supply_resources),
+		.resources	= axp22x_usb_power_supply_resources,
 	},
 };
 
#7 lore raw

PATCH v2 4/4 regulator: axp20x: Add support for the (external) drivebus regulator

In reply to Hans de Goede

The axp20x pmics have 2 power inputs, one called ACIN which is intended for to be supplied via a powerbarrel on the board and one called VBUS which is intended to be supplied via an otg connector.

In the VBUS case the pmic needs to know if the board is supplying power to the otg connector, because then it should not take any power from its VBUS pin. The axp209 pmic has a N_VBUSEN input pin via which the board can signal to the pmic whether the board is supplying power to the otg connector or not.

On the axp221/axp223 this pin can alternatively be used as an output which controls an external regulator which (optionally) supplies power to the otg connector from the board. When the pin is used as output it is called DRIVEVBUS in the datasheet.

This commit adds support for the DRIVEVBUS pin as an extra pmic controlled regulator. Since this is optional a new x-powers,drivebus dt property is added. When this is present the misc-control register is written to change the N_VBUSEN input pin to DRIVEVBUS output pin mode and the extra drivebus regulator is registered with the regulator subsystem.

---
Changes in v2:
-Rename the dt property to drive-vbus-en -s/drivebus/drivevbus/
-Add a line describing the drivevbus regulator to the table in
Documentation/devicetree/bindings/mfd/axp20x.txt
-Set supply_name to drivevbus-supply

---
 Documentation/devicetree/bindings/mfd/axp20x.txt |  6 +++++
 drivers/regulator/axp20x-regulator.c             | 30 ++++++++++++++++++++++++
 2 files changed, 36 insertions(+)
Documentation/devicetree/bindings/mfd/axp20x.txt +6 -0
index d20b103..6aca4fe 100644
@@ -22,6 +22,11 @@ Optional properties:
 		      AXP152/20X: range:  750-1875, Default: 1.5 MHz
 		      AXP22X/80X: range: 1800-4050, Default: 3   MHz
 
+- x-powers,drive-vbus-en: axp221 / axp223 only boolean, set this when the
+                  N_VBUSEN pin is used as an output pin to control an external
+                  regulator to drive the OTG VBus, rather then as an input pin
+                  which signals whether the board is driving OTG VBus or not.
+
 - <input>-supply: a phandle to the regulator supply node. May be omitted if
 		  inputs are unregulated, such as using the IPSOUT output
 		  from the PMIC.
@@ -79,6 +84,7 @@ ELDO3		: LDO		: eldoin-supply		: shared supply
 LDO_IO0		: LDO		: ips-supply		: GPIO 0
 LDO_IO1		: LDO		: ips-supply		: GPIO 1
 RTC_LDO		: LDO		: ips-supply		: always on
+DRIVEVBUS	: Enable output	: drivevbus-supply	: external regulator
 
 AXP809 regulators, type, and corresponding input supply names:
 
drivers/regulator/axp20x-regulator.c +30 -0
index 728be64..3f1bba4 100644
@@ -36,6 +36,8 @@
 
 #define AXP20X_FREQ_DCDC_MASK		0x0f
 
+#define AXP22X_MISC_N_VBUSEN_FUNC	BIT(4)
+
 #define AXP_DESC_IO(_family, _id, _match, _supply, _min, _max, _step, _vreg,	\
 		    _vmask, _ereg, _emask, _enable_val, _disable_val)		\
 	[_family##_##_id] = {							\
@@ -230,6 +232,18 @@ static const struct regulator_desc axp22x_regulators[] = {
 	AXP_DESC_FIXED(AXP22X, RTC_LDO, "rtc_ldo", "ips", 3000),
 };
 
+static const struct regulator_desc axp22x_drivevbus_regulator = {
+	.name		= "drivevbus",
+	.supply_name	= "drivevbus-supply",
+	.of_match	= of_match_ptr("drivevbus"),
+	.regulators_node = of_match_ptr("regulators"),
+	.type		= REGULATOR_VOLTAGE,
+	.owner		= THIS_MODULE,
+	.enable_reg	= AXP20X_VBUS_IPSOUT_MGMT,
+	.enable_mask	= BIT(2),
+	.ops		= &axp20x_ops_sw,
+};
+
 static const struct regulator_linear_range axp809_dcdc4_ranges[] = {
 	REGULATOR_LINEAR_RANGE(600000, 0x0, 0x2f, 20000),
 	REGULATOR_LINEAR_RANGE(1800000, 0x30, 0x38, 100000),
@@ -411,6 +425,7 @@ static int axp20x_regulator_probe(struct platform_device *pdev)
 	u32 workmode;
 	const char *dcdc1_name = axp22x_regulators[AXP22X_DCDC1].name;
 	const char *dcdc5_name = axp22x_regulators[AXP22X_DCDC5].name;
+	bool drivevbus = false;
 
 	switch (axp20x->variant) {
 	case AXP202_ID:
@@ -422,6 +437,8 @@ static int axp20x_regulator_probe(struct platform_device *pdev)
 	case AXP223_ID:
 		regulators = axp22x_regulators;
 		nregulators = AXP22X_REG_ID_MAX;
+		drivevbus = of_property_read_bool(pdev->dev.parent->of_node,
+						  "x-powers,drive-vbus-en");
 		break;
 	case AXP809_ID:
 		regulators = axp809_regulators;
@@ -500,6 +517,19 @@ static int axp20x_regulator_probe(struct platform_device *pdev)
 						&dcdc5_name);
 	}
 
+	if (drivevbus) {
+		/* Change N_VBUSEN sense pin to DRIVEVBUS output pin */
+		regmap_update_bits(axp20x->regmap, AXP20X_OVER_TMP,
+				   AXP22X_MISC_N_VBUSEN_FUNC, 0);
+		rdev = devm_regulator_register(&pdev->dev,
+					       &axp22x_drivevbus_regulator,
+					       &config);
+		if (IS_ERR(rdev)) {
+			dev_err(&pdev->dev, "Failed to register drivevbus\n");
+			return PTR_ERR(rdev);
+		}
+	}
+
 	return 0;
 }
 
Signature · 1 line
2.7.4
#8 lore raw

PATCH v2 4/4 regulator: axp20x: Add support for the (external) drivebus regulator

Hi,

Quoted 39 lines · Hans de Goede

The axp20x pmics have 2 power inputs, one called ACIN which is intended for to be supplied via a powerbarrel on the board and one called VBUS which is intended to be supplied via an otg connector.

In the VBUS case the pmic needs to know if the board is supplying power to the otg connector, because then it should not take any power from its VBUS pin. The axp209 pmic has a N_VBUSEN input pin via which the board can signal to the pmic whether the board is supplying power to the otg connector or not.

On the axp221/axp223 this pin can alternatively be used as an output which controls an external regulator which (optionally) supplies power to the otg connector from the board. When the pin is used as output it is called DRIVEVBUS in the datasheet.

This commit adds support for the DRIVEVBUS pin as an extra pmic controlled regulator. Since this is optional a new x-powers,drivebus dt property is added. When this is present the misc-control register is written to change the N_VBUSEN input pin to DRIVEVBUS output pin mode and the extra drivebus regulator is registered with the regulator subsystem.

---
Changes in v2:

(quoted diff) +0 -5
-Rename the dt property to drive-vbus-en
-s/drivebus/drivevbus/
-Add a line describing the drivevbus regulator to the table in
 Documentation/devicetree/bindings/mfd/axp20x.txt
-Set supply_name to drivevbus-supply
---
 Documentation/devicetree/bindings/mfd/axp20x.txt |  6 +++++
 drivers/regulator/axp20x-regulator.c             | 30 ++++++++++++++++++++++++
 2 files changed, 36 insertions(+)
Documentation/devicetree/bindings/mfd/axp20x.txt +0 -0
index d20b103..6aca4fe 100644

Documentation/devicetree/bindings/mfd/axp20x.txt Optional properties: · line 28

Quoted 7 lines
Documentation/devicetree/bindings/mfd/axp20x.txt +4 -0
@@ -22,6 +22,11 @@ Optional properties:
                      AXP152/20X: range:  750-1875, Default: 1.5 MHz
                      AXP22X/80X: range: 1800-4050, Default: 3   MHz
 
+- x-powers,drive-vbus-en: axp221 / axp223 only boolean, set this when the
+                  N_VBUSEN pin is used as an output pin to control an external
+                  regulator to drive the OTG VBus, rather then as an input pin
+                  which signals whether the board is driving OTG VBus or not.

Git complains about space indentation here.

Quoted 26 lines
Documentation/devicetree/bindings/mfd/axp20x.txt +2 -0
+
 - <input>-supply: a phandle to the regulator supply node. May be omitted if
                  inputs are unregulated, such as using the IPSOUT output
                  from the PMIC.
@@ -79,6 +84,7 @@ ELDO3         : LDO           : eldoin-supply         : shared supply
 LDO_IO0                : LDO           : ips-supply            : GPIO 0
 LDO_IO1                : LDO           : ips-supply            : GPIO 1
 RTC_LDO                : LDO           : ips-supply            : always on
+DRIVEVBUS      : Enable output : drivevbus-supply      : external regulator
 
 AXP809 regulators, type, and corresponding input supply names:
 
drivers/regulator/axp20x-regulator.c +2 -0
index 728be64..3f1bba4 100644
@@ -36,6 +36,8 @@
 
 #define AXP20X_FREQ_DCDC_MASK          0x0f
 
+#define AXP22X_MISC_N_VBUSEN_FUNC      BIT(4)
+
 #define AXP_DESC_IO(_family, _id, _match, _supply, _min, _max, _step, _vreg,   \
                    _vmask, _ereg, _emask, _enable_val, _disable_val)           \
        [_family##_##_id] = {                                                   \

drivers/regulator/axp20x-regulator.c static const struct regulator_desc axp22x_regulators[] = { · line 237

Quoted 6 lines
drivers/regulator/axp20x-regulator.c +3 -0
@@ -230,6 +232,18 @@ static const struct regulator_desc axp22x_regulators[] = {
        AXP_DESC_FIXED(AXP22X, RTC_LDO, "rtc_ldo", "ips", 3000),
 };
 
+static const struct regulator_desc axp22x_drivevbus_regulator = {
+       .name           = "drivevbus",
+       .supply_name    = "drivevbus-supply",

The "-supply" suffix is added by the regulator core upon lookup. No need to add it here. I assume the regulator core won't get confused over a supply name that's the same as the regulator requesting it.

Otherwise,

Quoted 52 lines
drivers/regulator/axp20x-regulator.c +25 -1
+       .of_match       = of_match_ptr("drivevbus"),
+       .regulators_node = of_match_ptr("regulators"),
+       .type           = REGULATOR_VOLTAGE,
+       .owner          = THIS_MODULE,
+       .enable_reg     = AXP20X_VBUS_IPSOUT_MGMT,
+       .enable_mask    = BIT(2),
+       .ops            = &axp20x_ops_sw,
+};
+
 static const struct regulator_linear_range axp809_dcdc4_ranges[] = {
        REGULATOR_LINEAR_RANGE(600000, 0x0, 0x2f, 20000),
        REGULATOR_LINEAR_RANGE(1800000, 0x30, 0x38, 100000),
@@ -411,6 +425,7 @@ static int axp20x_regulator_probe(struct platform_device *pdev)
        u32 workmode;
        const char *dcdc1_name = axp22x_regulators[AXP22X_DCDC1].name;
        const char *dcdc5_name = axp22x_regulators[AXP22X_DCDC5].name;
+       bool drivevbus = false;
 
        switch (axp20x->variant) {
        case AXP202_ID:
@@ -422,6 +437,8 @@ static int axp20x_regulator_probe(struct platform_device *pdev)
        case AXP223_ID:
                regulators = axp22x_regulators;
                nregulators = AXP22X_REG_ID_MAX;
+               drivevbus = of_property_read_bool(pdev->dev.parent->of_node,
+                                                 "x-powers,drive-vbus-en");
                break;
        case AXP809_ID:
                regulators = axp809_regulators;
@@ -500,6 +517,19 @@ static int axp20x_regulator_probe(struct platform_device *pdev)
                                                &dcdc5_name);
        }
 
+       if (drivevbus) {
+               /* Change N_VBUSEN sense pin to DRIVEVBUS output pin */
+               regmap_update_bits(axp20x->regmap, AXP20X_OVER_TMP,
+                                  AXP22X_MISC_N_VBUSEN_FUNC, 0);
+               rdev = devm_regulator_register(&pdev->dev,
+                                              &axp22x_drivevbus_regulator,
+                                              &config);
+               if (IS_ERR(rdev)) {
+                       dev_err(&pdev->dev, "Failed to register drivevbus\n");
+                       return PTR_ERR(rdev);
+               }
+       }
+
        return 0;
 }
 
--

2.7.4

#9 lore raw

PATCH v2 4/4 regulator: axp20x: Add support for the (external) drivebus regulator

Hi,

Quoted 90 lines · Chen-Yu Tsai

Hi,

Quoted 39 lines · Hans de Goede

The axp20x pmics have 2 power inputs, one called ACIN which is intended for to be supplied via a powerbarrel on the board and one called VBUS which is intended to be supplied via an otg connector.

In the VBUS case the pmic needs to know if the board is supplying power to the otg connector, because then it should not take any power from its VBUS pin. The axp209 pmic has a N_VBUSEN input pin via which the board can signal to the pmic whether the board is supplying power to the otg connector or not.

On the axp221/axp223 this pin can alternatively be used as an output which controls an external regulator which (optionally) supplies power to the otg connector from the board. When the pin is used as output it is called DRIVEVBUS in the datasheet.

This commit adds support for the DRIVEVBUS pin as an extra pmic controlled regulator. Since this is optional a new x-powers,drivebus dt property is added. When this is present the misc-control register is written to change the N_VBUSEN input pin to DRIVEVBUS output pin mode and the extra drivebus regulator is registered with the regulator subsystem.

---
Changes in v2:

(quoted diff) +0 -5
-Rename the dt property to drive-vbus-en
-s/drivebus/drivevbus/
-Add a line describing the drivevbus regulator to the table in
 Documentation/devicetree/bindings/mfd/axp20x.txt
-Set supply_name to drivevbus-supply
---
 Documentation/devicetree/bindings/mfd/axp20x.txt |  6 +++++
 drivers/regulator/axp20x-regulator.c             | 30 ++++++++++++++++++++++++
 2 files changed, 36 insertions(+)
Documentation/devicetree/bindings/mfd/axp20x.txt +0 -0
index d20b103..6aca4fe 100644

Documentation/devicetree/bindings/mfd/axp20x.txt Optional properties: · line 28

Quoted 7 lines
Documentation/devicetree/bindings/mfd/axp20x.txt +4 -0
@@ -22,6 +22,11 @@ Optional properties:
                      AXP152/20X: range:  750-1875, Default: 1.5 MHz
                      AXP22X/80X: range: 1800-4050, Default: 3   MHz
 
+- x-powers,drive-vbus-en: axp221 / axp223 only boolean, set this when the
+                  N_VBUSEN pin is used as an output pin to control an external
+                  regulator to drive the OTG VBus, rather then as an input pin
+                  which signals whether the board is driving OTG VBus or not.

Git complains about space indentation here.

Quoted 26 lines
Documentation/devicetree/bindings/mfd/axp20x.txt +2 -0
+
 - <input>-supply: a phandle to the regulator supply node. May be omitted if
                  inputs are unregulated, such as using the IPSOUT output
                  from the PMIC.
@@ -79,6 +84,7 @@ ELDO3         : LDO           : eldoin-supply         : shared supply
 LDO_IO0                : LDO           : ips-supply            : GPIO 0
 LDO_IO1                : LDO           : ips-supply            : GPIO 1
 RTC_LDO                : LDO           : ips-supply            : always on
+DRIVEVBUS      : Enable output : drivevbus-supply      : external regulator
 
 AXP809 regulators, type, and corresponding input supply names:
 
drivers/regulator/axp20x-regulator.c +2 -0
index 728be64..3f1bba4 100644
@@ -36,6 +36,8 @@
 
 #define AXP20X_FREQ_DCDC_MASK          0x0f
 
+#define AXP22X_MISC_N_VBUSEN_FUNC      BIT(4)
+
 #define AXP_DESC_IO(_family, _id, _match, _supply, _min, _max, _step, _vreg,   \
                    _vmask, _ereg, _emask, _enable_val, _disable_val)           \
        [_family##_##_id] = {                                                   \

drivers/regulator/axp20x-regulator.c static const struct regulator_desc axp22x_regulators[] = { · line 237

Quoted 6 lines
drivers/regulator/axp20x-regulator.c +3 -0
@@ -230,6 +232,18 @@ static const struct regulator_desc axp22x_regulators[] = {
        AXP_DESC_FIXED(AXP22X, RTC_LDO, "rtc_ldo", "ips", 3000),
 };
 
+static const struct regulator_desc axp22x_drivevbus_regulator = {
+       .name           = "drivevbus",
+       .supply_name    = "drivevbus-supply",

The "-supply" suffix is added by the regulator core upon lookup. No need to add it here. I assume the regulator core won't get confused over a supply name that's the same as the regulator requesting it.

Quoted 3 lines

Otherwise,

Thanks, I'll send a v3 with both issues fixed.

Regards,

Hans

Quoted 53 lines
Quoted 53 lines
drivers/regulator/axp20x-regulator.c +25 -1
+       .of_match       = of_match_ptr("drivevbus"),
+       .regulators_node = of_match_ptr("regulators"),
+       .type           = REGULATOR_VOLTAGE,
+       .owner          = THIS_MODULE,
+       .enable_reg     = AXP20X_VBUS_IPSOUT_MGMT,
+       .enable_mask    = BIT(2),
+       .ops            = &axp20x_ops_sw,
+};
+
 static const struct regulator_linear_range axp809_dcdc4_ranges[] = {
        REGULATOR_LINEAR_RANGE(600000, 0x0, 0x2f, 20000),
        REGULATOR_LINEAR_RANGE(1800000, 0x30, 0x38, 100000),
@@ -411,6 +425,7 @@ static int axp20x_regulator_probe(struct platform_device *pdev)
        u32 workmode;
        const char *dcdc1_name = axp22x_regulators[AXP22X_DCDC1].name;
        const char *dcdc5_name = axp22x_regulators[AXP22X_DCDC5].name;
+       bool drivevbus = false;
 
        switch (axp20x->variant) {
        case AXP202_ID:
@@ -422,6 +437,8 @@ static int axp20x_regulator_probe(struct platform_device *pdev)
        case AXP223_ID:
                regulators = axp22x_regulators;
                nregulators = AXP22X_REG_ID_MAX;
+               drivevbus = of_property_read_bool(pdev->dev.parent->of_node,
+                                                 "x-powers,drive-vbus-en");
                break;
        case AXP809_ID:
                regulators = axp809_regulators;
@@ -500,6 +517,19 @@ static int axp20x_regulator_probe(struct platform_device *pdev)
                                                &dcdc5_name);
        }
 
+       if (drivevbus) {
+               /* Change N_VBUSEN sense pin to DRIVEVBUS output pin */
+               regmap_update_bits(axp20x->regmap, AXP20X_OVER_TMP,
+                                  AXP22X_MISC_N_VBUSEN_FUNC, 0);
+               rdev = devm_regulator_register(&pdev->dev,
+                                              &axp22x_drivevbus_regulator,
+                                              &config);
+               if (IS_ERR(rdev)) {
+                       dev_err(&pdev->dev, "Failed to register drivevbus\n");
+                       return PTR_ERR(rdev);
+               }
+       }
+
        return 0;
 }
 
--

2.7.4

#11 lore raw

PATCH v2 1/4 power: axp20x_usb: Add support for usb power-supply on axp22x pmics

In reply to Hans de Goede

Hi,

Quoted 3 lines · Hans de Goede

The usb power-supply on the axp22x pmics is mostly identical to the one on the axp20x pmics. One significant difference is that it cannot measure / monitor the usb voltage / current.

What's the merge strategy for this patchset?

-- Sebastian
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20160604/fe8bc925/attachment-0001.sig>

#12 lore raw

PATCH v2 1/4 power: axp20x_usb: Add support for usb power-supply on axp22x pmics

Hi,

Quoted 10 lines · Sebastian Reichel

Hi,

Quoted 3 lines · Hans de Goede

The usb power-supply on the axp22x pmics is mostly identical to the one on the axp20x pmics. One significant difference is that it cannot measure / monitor the usb voltage / current.

What's the merge strategy for this patchset?

All of the separate bits can be merged separately without problems, so Lee can take the 2 mfd patches, you can take the power-supply patch and Mark Brown can take the regulator patch.

I believe that that is the best merge strategy.

Regards,

Hans

#13 lore raw

PATCH v2 1/4 power: axp20x_usb: Add support for usb power-supply on axp22x pmics

Hi,

Quoted 6 lines · Hans de Goede
Quoted 5 lines · Sebastian Reichel
Quoted 3 lines · Hans de Goede

The usb power-supply on the axp22x pmics is mostly identical to the one on the axp20x pmics. One significant difference is that it cannot measure / monitor the usb voltage / current.

Quoted 6 lines
Quoted 3 lines

What's the merge strategy for this patchset?

All of the separate bits can be merged separately without problems, [...]

OK, I queued the first patch with Rob's Acked-By.

-- Sebastian
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20160610/59bd4b85/attachment.sig>

maintainer
#14 lore raw

PATCH v2 1/4 power: axp20x_usb: Add support for usb power-supply on axp22x pmics

In reply to Hans de Goede
Quoted 10 lines · Hans de Goede

The usb power-supply on the axp22x pmics is mostly identical to the one on the axp20x pmics. One significant difference is that it cannot measure / monitor the usb voltage / current.

---
Changes in v2:
-Use compatible instead of axp20x->variant to detect pmic type

---
 .../bindings/power_supply/axp20x_usb_power.txt     |  3 +-
Quoted 2 lines
 drivers/power/axp20x_usb_power.c                   | 92 ++++++++++++++++------
 2 files changed, 71 insertions(+), 24 deletions(-)