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.

Reply via email to