axp20x_usb_power.c is modified to read those parameters from the device tree configuration. if a configuration value is not found then the corresponding register value is not changed.
also, debug messages are added, controlled by "CONFIG_POWER_SUPPLY_DEBUG" : Signed-off-by: Ene Alexandru <[email protected]> --- diff -uprN -X linux-sunxi-original/Documentation/dontdiff linux-sunxi-original/drivers/power/axp20x_usb_power.c linux-sunxi/drivers/power/axp20x_usb_power.c --- linux-sunxi-original/drivers/power/axp20x_usb_power.c 2016-05-09 16:51:44.000000000 +0200 +++ linux-sunxi/drivers/power/axp20x_usb_power.c 2016-05-11 13:26:24.444681579 +0200 @@ -41,6 +41,19 @@ #define AXP20X_VBUS_MON_VBUS_VALID BIT(3) +/* bit defines for REG 30H: VBUS-IPSOUT Power Path Management */ +/* VBUS VHOLD voltage limiting control */ +#define AXP20X_VBUS_IPSOUT_MGMT_VHOLD BIT(6) +#define AXP20X_VBUS_IPSOUT_MGMT_VHOLD_ENA BIT(6) +#define AXP20X_VBUS_IPSOUT_MGMT_VHOLD_DIS BIT(0) +/* VHOLD Set voltage */ +#define AXP20X_VBUS_IPSOUT_MGMT_VHOLD_SET_MASK (BIT(5)|BIT(4)|BIT(3)) +#define AXP20X_VBUS_IPSOUT_MGMT_VHOLD_SET_SHIFT (3) +/* VBUS current-limit selection */ +#define AXP20X_VBUS_IPSOUT_MGMT_IBUS_MASK (BIT(1) | BIT(0)) + + + struct axp20x_usb_power { struct regmap *regmap; struct power_supply *supply; @@ -164,6 +177,93 @@ static const struct power_supply_desc ax .get_property = axp20x_usb_power_get_property, }; + +static int axp20x_usb_power_read_params(const struct device_node *node, + struct axp20x_usb_power *power, struct platform_device *pdev) +{ + const u32 *prop; + int ret; + + /* + * configurable parameters are: + * register VBUS-IPSOUT + * bit 6: VBUS VHOLD voltage limiting control + * 0: No voltage drop limit + * 1: Limit the voltage drop + * bit 5-3 VHOLD Set VHOLD = [4.0+ (Bit5-3) * 0.1] V + * bit 1-0 VBUS current-limit selection + * 00:900mA + * 01:500mA + * 10:100mA + * 11:no limit + */ + + prop = of_get_property(node, "vhold-enable", NULL); + if (prop) { + /* either 1 or 0 */ +#ifdef DEBUG + dev_info(&pdev->dev, "set vhold-enable property to %d", + !!(*prop)); +#endif + if (!!(*prop)) { + ret = regmap_update_bits(power->regmap, + AXP20X_VBUS_IPSOUT_MGMT, + AXP20X_VBUS_IPSOUT_MGMT_VHOLD, + AXP20X_VBUS_IPSOUT_MGMT_VHOLD_ENA); + } else { + ret = regmap_update_bits(power->regmap, + AXP20X_VBUS_IPSOUT_MGMT, + AXP20X_VBUS_IPSOUT_MGMT_VHOLD, + AXP20X_VBUS_IPSOUT_MGMT_VHOLD_DIS); + } + if (ret) + return ret; + } else { +#ifdef DEBUG + dev_info(&pdev->dev, "no vhold-enable property found"); +#endif + } + + prop = of_get_property(node, "vhold-set", NULL); + if (prop) { + /* from 0b000 to 0b111 */ +#ifdef DEBUG + dev_info(&pdev->dev, "set vhold-set property to %02X", + ((*prop)>>24)); +#endif + ret = regmap_update_bits(power->regmap, + AXP20X_VBUS_IPSOUT_MGMT, + AXP20X_VBUS_IPSOUT_MGMT_VHOLD_SET_MASK, + ((*prop)>>24) << AXP20X_VBUS_IPSOUT_MGMT_VHOLD_SET_SHIFT); + if (ret) + return ret; + } else { +#ifdef DEBUG + dev_info(&pdev->dev, "no vhold-set property found"); +#endif + } + + prop = of_get_property(node, "ibus-limit", NULL); + if (prop) { + /* from 0b0 to 0b11 */ +#ifdef DEBUG + dev_info(&pdev->dev, "set ibus-limit property to %02X", + ((*prop)>>24)); +#endif + ret = regmap_update_bits(power->regmap, AXP20X_VBUS_IPSOUT_MGMT, + AXP20X_VBUS_IPSOUT_MGMT_IBUS_MASK, + ((*prop)>>24)); + if (ret) + return ret; + } else { +#ifdef DEBUG + dev_info(&pdev->dev, "no ibus-limit property found"); +#endif + } + + return 0; +} + static int axp20x_usb_power_probe(struct platform_device *pdev) { struct axp20x_dev *axp20x = dev_get_drvdata(pdev->dev.parent); @@ -172,6 +272,7 @@ static int axp20x_usb_power_probe(struct static const char * const irq_names[] = { "VBUS_PLUGIN", "VBUS_REMOVAL", "VBUS_VALID", "VBUS_NOT_VALID" }; int i, irq, ret; + struct device_node *node; if (!of_device_is_available(pdev->dev.of_node)) return -ENODEV; @@ -208,6 +309,11 @@ static int axp20x_usb_power_probe(struct if (IS_ERR(power->supply)) return PTR_ERR(power->supply); + + /* read DT configurations parameters, if available */ + for_each_compatible_node(node, NULL, "x-powers,axp202-usb-power-supply") + axp20x_usb_power_read_params(node, power, pdev); + /* Request irqs after registering, as irqs may trigger immediately */ for (i = 0; i < ARRAY_SIZE(irq_names); i++) { irq = platform_get_irq_byname(pdev, irq_names[i]); --- -- You received this message because you are subscribed to the Google Groups "linux-sunxi" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
