lkml.org 
[lkml]   [2019]   [Jan]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 1/4] mfd: max77620: Add backup battery charger support
    Date
    Add PMIC configurations for backup battery charger, which
    is a constant voltage and constant current style charger
    with a series output resistance.

    The max77620 register CNFGBBC(addr: 0x04) defines the
    parameters of backup battery charger. This patch adds
    support for it.

    Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
    Signed-off-by: Venkat Reddy Talla <vreddytalla@nvidia.com>
    Signed-off-by: Mark Zhang <markz@nvidia.com>
    ---
    drivers/mfd/max77620.c | 80 ++++++++++++++++++++++++++++++++++++++++++
    1 file changed, 80 insertions(+)

    diff --git a/drivers/mfd/max77620.c b/drivers/mfd/max77620.c
    index d8ddd1a6f304..f58143103185 100644
    --- a/drivers/mfd/max77620.c
    +++ b/drivers/mfd/max77620.c
    @@ -398,6 +398,82 @@ static int max77620_initialise_fps(struct max77620_chip *chip)
    return 0;
    }

    +static int max77620_init_backup_battery_charging(struct max77620_chip *chip)
    +{
    + struct device *dev = chip->dev;
    + struct device_node *np;
    + u32 pval;
    + u8 config;
    + int charging_current;
    + int charging_voltage;
    + int resistor;
    + int ret;
    +
    + np = of_get_child_by_name(dev->of_node, "backup-battery");
    + if (!np) {
    + dev_info(dev, "Backup battery charging support disabled\n");
    + ret = regmap_update_bits(chip->rmap, MAX77620_REG_CNFGBBC,
    + MAX77620_CNFGBBC_ENABLE, 0);
    + if (ret < 0)
    + dev_err(dev, "Failed to update CNFGBBC: %d\n", ret);
    + return ret;
    + }
    +
    + ret = of_property_read_u32(np,
    + "maxim,backup-battery-charging-current", &pval);
    + charging_current = (!ret) ? pval : 50;
    +
    + ret = of_property_read_u32(np,
    + "maxim,backup-battery-charging-voltage", &pval);
    + charging_voltage = (!ret) ? pval : 2500000;
    + charging_voltage /= 1000;
    +
    + ret = of_property_read_u32(np,
    + "maxim,backup-battery-output-resister", &pval);
    + resistor = (!ret) ? pval : 1000;
    +
    + config = MAX77620_CNFGBBC_ENABLE;
    + if (charging_current <= 50)
    + config |= 0 << MAX77620_CNFGBBC_CURRENT_SHIFT;
    + else if (charging_current <= 100)
    + config |= 3 << MAX77620_CNFGBBC_CURRENT_SHIFT;
    + else if (charging_current <= 200)
    + config |= 0 << MAX77620_CNFGBBC_CURRENT_SHIFT;
    + else if (charging_current <= 400)
    + config |= 3 << MAX77620_CNFGBBC_CURRENT_SHIFT;
    + else if (charging_current <= 600)
    + config |= 1 << MAX77620_CNFGBBC_CURRENT_SHIFT;
    + else
    + config |= 2 << MAX77620_CNFGBBC_CURRENT_SHIFT;
    +
    + if (charging_current > 100)
    + config |= MAX77620_CNFGBBC_LOW_CURRENT_DISABLE;
    +
    + if (charging_voltage <= 2500)
    + config |= 0 << MAX77620_CNFGBBC_VOLTAGE_SHIFT;
    + else if (charging_voltage <= 3000)
    + config |= 1 << MAX77620_CNFGBBC_VOLTAGE_SHIFT;
    + else if (charging_voltage <= 3300)
    + config |= 2 << MAX77620_CNFGBBC_VOLTAGE_SHIFT;
    + else
    + config |= 3 << MAX77620_CNFGBBC_VOLTAGE_SHIFT;
    +
    + if (resistor <= 100)
    + config |= 0 << MAX77620_CNFGBBC_RESISTOR_SHIFT;
    + else if (resistor <= 1000)
    + config |= 1 << MAX77620_CNFGBBC_RESISTOR_SHIFT;
    + else if (resistor <= 3000)
    + config |= 2 << MAX77620_CNFGBBC_RESISTOR_SHIFT;
    + else if (resistor <= 6000)
    + config |= 3 << MAX77620_CNFGBBC_RESISTOR_SHIFT;
    +
    + ret = regmap_write(chip->rmap, MAX77620_REG_CNFGBBC, config);
    + if (ret < 0)
    + dev_err(dev, "Reg 0x%02x write failed, %d\n",
    + MAX77620_REG_CNFGBBC, ret);
    + return ret;
    +}
    +
    static int max77620_read_es_version(struct max77620_chip *chip)
    {
    unsigned int val;
    @@ -483,6 +559,10 @@ static int max77620_probe(struct i2c_client *client,
    if (ret < 0)
    return ret;

    + ret = max77620_init_backup_battery_charging(chip);
    + if (ret < 0)
    + return ret;
    +
    ret = devm_mfd_add_devices(chip->dev, PLATFORM_DEVID_NONE,
    mfd_cells, n_mfd_cells, NULL, 0,
    regmap_irq_get_domain(chip->top_irq_data));
    --
    2.19.2
    \
     
     \ /
      Last update: 2019-01-29 09:57    [W:2.691 / U:0.472 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site