Re: [PATCH v5 09/11] power: supply: add AC power supply driver for AXP813

2018-10-30 Thread Chen-Yu Tsai
On Wed, Oct 24, 2018 at 2:54 AM Oskari Lemmela  wrote:
>
> AXP813 and AXP803 PMICs can control input current and minimum voltage.
>
> Both of these values are configurable.
>
> Signed-off-by: Oskari Lemmela 
> Reviewed-by: Quentin Schulz 

Reviewed-by: Chen-Yu Tsai 


Re: [PATCH v5 09/11] power: supply: add AC power supply driver for AXP813

2018-10-25 Thread Lee Jones
On Tue, 23 Oct 2018, Oskari Lemmela wrote:

> AXP813 and AXP803 PMICs can control input current and minimum voltage.
> 
> Both of these values are configurable.
> 
> Signed-off-by: Oskari Lemmela 
> Reviewed-by: Quentin Schulz 
> ---
>  drivers/power/supply/axp20x_ac_power.c | 94 ++

>  include/linux/mfd/axp20x.h |  1 +

Acked-by: Lee Jones 

-- 
Lee Jones [李琼斯]
Linaro Services Technical Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog


[PATCH v5 09/11] power: supply: add AC power supply driver for AXP813

2018-10-23 Thread Oskari Lemmela
AXP813 and AXP803 PMICs can control input current and minimum voltage.

Both of these values are configurable.

Signed-off-by: Oskari Lemmela 
Reviewed-by: Quentin Schulz 
---
 drivers/power/supply/axp20x_ac_power.c | 94 ++
 include/linux/mfd/axp20x.h |  1 +
 2 files changed, 95 insertions(+)

diff --git a/drivers/power/supply/axp20x_ac_power.c 
b/drivers/power/supply/axp20x_ac_power.c
index 0771f951b11f..59b4c8d3b961 100644
--- a/drivers/power/supply/axp20x_ac_power.c
+++ b/drivers/power/supply/axp20x_ac_power.c
@@ -27,6 +27,16 @@
 #define AXP20X_PWR_STATUS_ACIN_PRESENT BIT(7)
 #define AXP20X_PWR_STATUS_ACIN_AVAIL   BIT(6)
 
+#define AXP813_VHOLD_MASK  GENMASK(5, 3)
+#define AXP813_VHOLD_UV_TO_BIT(x)  x) / 10) - 40) << 3)
+#define AXP813_VHOLD_REG_TO_UV(x)  \
+   (x) & AXP813_VHOLD_MASK) >> 3) + 40) * 10)
+
+#define AXP813_CURR_LIMIT_MASK GENMASK(2, 0)
+#define AXP813_CURR_LIMIT_UA_TO_BIT(x) (((x) / 50) - 3)
+#define AXP813_CURR_LIMIT_REG_TO_UA(x) \
+   x) & AXP813_CURR_LIMIT_MASK) + 3) * 50)
+
 #define DRVNAME "axp20x-ac-power-supply"
 
 struct axp20x_ac_power {
@@ -102,6 +112,57 @@ static int axp20x_ac_power_get_property(struct 
power_supply *psy,
 
return 0;
 
+   case POWER_SUPPLY_PROP_VOLTAGE_MIN:
+   ret = regmap_read(power->regmap, AXP813_ACIN_PATH_CTRL, ®);
+   if (ret)
+   return ret;
+
+   val->intval = AXP813_VHOLD_REG_TO_UV(reg);
+
+   return 0;
+
+   case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
+   ret = regmap_read(power->regmap, AXP813_ACIN_PATH_CTRL, ®);
+   if (ret)
+   return ret;
+
+   val->intval = AXP813_CURR_LIMIT_REG_TO_UA(reg);
+   /* AXP813 datasheet defines values 11x as 4000mA */
+   if (val->intval > 400)
+   val->intval = 400;
+
+   return 0;
+
+   default:
+   return -EINVAL;
+   }
+
+   return -EINVAL;
+}
+
+static int axp813_ac_power_set_property(struct power_supply *psy,
+   enum power_supply_property psp,
+   const union power_supply_propval *val)
+{
+   struct axp20x_ac_power *power = power_supply_get_drvdata(psy);
+
+   switch (psp) {
+   case POWER_SUPPLY_PROP_VOLTAGE_MIN:
+   if (val->intval < 400 || val->intval > 470)
+   return -EINVAL;
+
+   return regmap_update_bits(power->regmap, AXP813_ACIN_PATH_CTRL,
+ AXP813_VHOLD_MASK,
+ AXP813_VHOLD_UV_TO_BIT(val->intval));
+
+   case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
+   if (val->intval < 150 || val->intval > 400)
+   return -EINVAL;
+
+   return regmap_update_bits(power->regmap, AXP813_ACIN_PATH_CTRL,
+ AXP813_CURR_LIMIT_MASK,
+ 
AXP813_CURR_LIMIT_UA_TO_BIT(val->intval));
+
default:
return -EINVAL;
}
@@ -109,6 +170,13 @@ static int axp20x_ac_power_get_property(struct 
power_supply *psy,
return -EINVAL;
 }
 
+static int axp813_ac_power_prop_writeable(struct power_supply *psy,
+ enum power_supply_property psp)
+{
+   return psp == POWER_SUPPLY_PROP_VOLTAGE_MIN ||
+  psp == POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT;
+}
+
 static enum power_supply_property axp20x_ac_power_properties[] = {
POWER_SUPPLY_PROP_HEALTH,
POWER_SUPPLY_PROP_PRESENT,
@@ -123,6 +191,14 @@ static enum power_supply_property 
axp22x_ac_power_properties[] = {
POWER_SUPPLY_PROP_ONLINE,
 };
 
+static enum power_supply_property axp813_ac_power_properties[] = {
+   POWER_SUPPLY_PROP_HEALTH,
+   POWER_SUPPLY_PROP_PRESENT,
+   POWER_SUPPLY_PROP_ONLINE,
+   POWER_SUPPLY_PROP_VOLTAGE_MIN,
+   POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
+};
+
 static const struct power_supply_desc axp20x_ac_power_desc = {
.name = "axp20x-ac",
.type = POWER_SUPPLY_TYPE_MAINS,
@@ -139,6 +215,16 @@ static const struct power_supply_desc axp22x_ac_power_desc 
= {
.get_property = axp20x_ac_power_get_property,
 };
 
+static const struct power_supply_desc axp813_ac_power_desc = {
+   .name = "axp813-ac",
+   .type = POWER_SUPPLY_TYPE_MAINS,
+   .properties = axp813_ac_power_properties,
+   .num_properties = ARRAY_SIZE(axp813_ac_power_properties),
+   .property_is_writeable = axp813_ac_power_prop_writeable,
+   .get_property = axp20x_ac_power_get_property,
+   .set_property = axp813_ac_power_set_property,
+};
+
 struct axp_data {
const struct power_supply_desc  *power_desc;
boolacin_adc;
@@