Thread (1 message) 1 message, 1 author, 2016-05-17

[linux-sunxi] Re: PATH[1/3] ARM: axp20x_usb_power.c add device tree configuration options for REG 30H: VBUS-IPSOUT

From: Julian Calaby <hidden>
Date: 2016-05-17 23:16:06
Also in: linux-devicetree, lkml

Hi Ene,

On Wed, May 18, 2016 at 3:47 AM, Ene Alexandru [off-list ref] wrote:
quoted hunk
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 <redacted>


---
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))
+
+
+
Drop the two extra empty lines here.
quoted hunk
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
Use dev_dbg() instead of wrapping the dev_info() calls in #ifdefs.
+                      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
Ditto.
+          }
+
+          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
Ditto.
+                      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
Ditto.
+          }
+
+          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
Ditto.
+                      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
Ditto.
quoted hunk
+          }
+
+          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]);
---
Thanks,

-- 
Julian Calaby

Email: julian.calaby at gmail.com
Profile: http://www.google.com/profiles/julian.calaby/
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help