Loading Documentation/devicetree/bindings/mfd/rn5t618.txt +11 −8 Original line number Diff line number Diff line * Ricoh RN5T618 PMIC * Ricoh RN5T567/RN5T618 PMIC Ricoh RN5T618 is a power management IC which integrates 3 step-down DCDC converters, 7 low-dropout regulators, a Li-ion battery charger, fuel gauge, ADC, GPIOs and a watchdog timer. It can be controlled through a I2C interface. Ricoh RN5T567/RN5T618 is a power management IC family which integrates 3 to 4 step-down DCDC converters, 7 low-dropout regulators, GPIOs and a watchdog timer. The RN5T618 provides additionally a Li-ion battery charger, fuel gauge and an ADC. It can be controlled through an I2C interface. Required properties: - compatible: should be "ricoh,rn5t618" - compatible: must be one of "ricoh,rn5t567" "ricoh,rn5t618" - reg: the I2C slave address of the device Sub-nodes: - regulators: the node is required if the regulator functionality is needed. The valid regulator names are: DCDC1, DCDC2, DCDC3, LDO1, LDO2, LDO3, LDO4, LDO5, LDORTC1 and LDORTC2. needed. The valid regulator names are: DCDC1, DCDC2, DCDC3, DCDC4 (RN5T567), LDO1, LDO2, LDO3, LDO4, LDO5, LDORTC1 and LDORTC2. The common bindings for each individual regulator can be found in: Documentation/devicetree/bindings/regulator/regulator.txt Loading Documentation/devicetree/bindings/regulator/qcom,spmi-regulator.txt +3 −3 Original line number Diff line number Diff line Loading @@ -113,9 +113,9 @@ pm8916: l14, l15, l16, l17, l18 pm8941: s1, s2, s3, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24, lvs1, lvs2, lvs3, mvs1, mvs2 s1, s2, s3, s4, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24, lvs1, lvs2, lvs3, 5vs1, 5vs2 pm8994: s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, l1, l2, l3, l4, l5, Loading arch/arm/boot/dts/meson8-minix-neo-x8.dts +1 −0 Original line number Diff line number Diff line Loading @@ -80,6 +80,7 @@ &i2c_AO { pmic@32 { compatible = "ricoh,rn5t618"; reg = <0x32>; system-power-controller; regulators { }; Loading drivers/mfd/Kconfig +4 −3 Original line number Diff line number Diff line Loading @@ -852,13 +852,14 @@ config MFD_RK808 including interrupts, RTC, LDO & DCDC regulators, and onkey. config MFD_RN5T618 tristate "Ricoh RN5T5618 PMIC" tristate "Ricoh RN5T567/618 PMIC" depends on I2C depends on OF select MFD_CORE select REGMAP_I2C help Say yes here to add support for the Ricoh RN5T618 PMIC. This driver provides common support for accessing the device, Say yes here to add support for the Ricoh RN5T567 or R5T618 PMIC. This driver provides common support for accessing the device, additional drivers must be enabled in order to use the functionality of the device. Loading drivers/mfd/rn5t618.c +58 −12 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ * MFD core driver for Ricoh RN5T618 PMIC * * Copyright (C) 2014 Beniamino Galvani <b.galvani@gmail.com> * Copyright (C) 2016 Toradex AG * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License Loading @@ -11,10 +12,13 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include <linux/delay.h> #include <linux/i2c.h> #include <linux/mfd/core.h> #include <linux/mfd/rn5t618.h> #include <linux/module.h> #include <linux/of_device.h> #include <linux/reboot.h> #include <linux/regmap.h> static const struct mfd_cell rn5t618_cells[] = { Loading Loading @@ -48,28 +52,64 @@ static const struct regmap_config rn5t618_regmap_config = { }; static struct rn5t618 *rn5t618_pm_power_off; static struct notifier_block rn5t618_restart_handler; static void rn5t618_power_off(void) static void rn5t618_trigger_poweroff_sequence(bool repower) { /* disable automatic repower-on */ regmap_update_bits(rn5t618_pm_power_off->regmap, RN5T618_REPCNT, RN5T618_REPCNT_REPWRON, 0); RN5T618_REPCNT_REPWRON, repower ? RN5T618_REPCNT_REPWRON : 0); /* start power-off sequence */ regmap_update_bits(rn5t618_pm_power_off->regmap, RN5T618_SLPCNT, RN5T618_SLPCNT_SWPWROFF, RN5T618_SLPCNT_SWPWROFF); } static void rn5t618_power_off(void) { rn5t618_trigger_poweroff_sequence(false); } static int rn5t618_restart(struct notifier_block *this, unsigned long mode, void *cmd) { rn5t618_trigger_poweroff_sequence(true); /* * Re-power factor detection on PMIC side is not instant. 1ms * proved to be enough time until reset takes effect. */ mdelay(1); return NOTIFY_DONE; } static const struct of_device_id rn5t618_of_match[] = { { .compatible = "ricoh,rn5t567", .data = (void *)RN5T567 }, { .compatible = "ricoh,rn5t618", .data = (void *)RN5T618 }, { } }; MODULE_DEVICE_TABLE(of, rn5t618_of_match); static int rn5t618_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { const struct of_device_id *of_id; struct rn5t618 *priv; int ret; of_id = of_match_device(rn5t618_of_match, &i2c->dev); if (!of_id) { dev_err(&i2c->dev, "Failed to find matching DT ID\n"); return -EINVAL; } priv = devm_kzalloc(&i2c->dev, sizeof(*priv), GFP_KERNEL); if (!priv) return -ENOMEM; i2c_set_clientdata(i2c, priv); priv->variant = (long)of_id->data; priv->regmap = devm_regmap_init_i2c(i2c, &rn5t618_regmap_config); if (IS_ERR(priv->regmap)) { Loading @@ -85,9 +125,21 @@ static int rn5t618_i2c_probe(struct i2c_client *i2c, return ret; } if (!pm_power_off) { rn5t618_pm_power_off = priv; if (of_device_is_system_power_controller(i2c->dev.of_node)) { if (!pm_power_off) pm_power_off = rn5t618_power_off; else dev_warn(&i2c->dev, "Poweroff callback already assigned\n"); } rn5t618_restart_handler.notifier_call = rn5t618_restart; rn5t618_restart_handler.priority = 192; ret = register_restart_handler(&rn5t618_restart_handler); if (ret) { dev_err(&i2c->dev, "cannot register restart handler, %d\n", ret); return ret; } return 0; Loading @@ -105,12 +157,6 @@ static int rn5t618_i2c_remove(struct i2c_client *i2c) return 0; } static const struct of_device_id rn5t618_of_match[] = { { .compatible = "ricoh,rn5t618" }, { } }; MODULE_DEVICE_TABLE(of, rn5t618_of_match); static const struct i2c_device_id rn5t618_i2c_id[] = { { } }; Loading @@ -129,5 +175,5 @@ static struct i2c_driver rn5t618_i2c_driver = { module_i2c_driver(rn5t618_i2c_driver); MODULE_AUTHOR("Beniamino Galvani <b.galvani@gmail.com>"); MODULE_DESCRIPTION("Ricoh RN5T618 MFD driver"); MODULE_DESCRIPTION("Ricoh RN5T567/618 MFD driver"); MODULE_LICENSE("GPL v2"); Loading
Documentation/devicetree/bindings/mfd/rn5t618.txt +11 −8 Original line number Diff line number Diff line * Ricoh RN5T618 PMIC * Ricoh RN5T567/RN5T618 PMIC Ricoh RN5T618 is a power management IC which integrates 3 step-down DCDC converters, 7 low-dropout regulators, a Li-ion battery charger, fuel gauge, ADC, GPIOs and a watchdog timer. It can be controlled through a I2C interface. Ricoh RN5T567/RN5T618 is a power management IC family which integrates 3 to 4 step-down DCDC converters, 7 low-dropout regulators, GPIOs and a watchdog timer. The RN5T618 provides additionally a Li-ion battery charger, fuel gauge and an ADC. It can be controlled through an I2C interface. Required properties: - compatible: should be "ricoh,rn5t618" - compatible: must be one of "ricoh,rn5t567" "ricoh,rn5t618" - reg: the I2C slave address of the device Sub-nodes: - regulators: the node is required if the regulator functionality is needed. The valid regulator names are: DCDC1, DCDC2, DCDC3, LDO1, LDO2, LDO3, LDO4, LDO5, LDORTC1 and LDORTC2. needed. The valid regulator names are: DCDC1, DCDC2, DCDC3, DCDC4 (RN5T567), LDO1, LDO2, LDO3, LDO4, LDO5, LDORTC1 and LDORTC2. The common bindings for each individual regulator can be found in: Documentation/devicetree/bindings/regulator/regulator.txt Loading
Documentation/devicetree/bindings/regulator/qcom,spmi-regulator.txt +3 −3 Original line number Diff line number Diff line Loading @@ -113,9 +113,9 @@ pm8916: l14, l15, l16, l17, l18 pm8941: s1, s2, s3, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24, lvs1, lvs2, lvs3, mvs1, mvs2 s1, s2, s3, s4, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24, lvs1, lvs2, lvs3, 5vs1, 5vs2 pm8994: s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, l1, l2, l3, l4, l5, Loading
arch/arm/boot/dts/meson8-minix-neo-x8.dts +1 −0 Original line number Diff line number Diff line Loading @@ -80,6 +80,7 @@ &i2c_AO { pmic@32 { compatible = "ricoh,rn5t618"; reg = <0x32>; system-power-controller; regulators { }; Loading
drivers/mfd/Kconfig +4 −3 Original line number Diff line number Diff line Loading @@ -852,13 +852,14 @@ config MFD_RK808 including interrupts, RTC, LDO & DCDC regulators, and onkey. config MFD_RN5T618 tristate "Ricoh RN5T5618 PMIC" tristate "Ricoh RN5T567/618 PMIC" depends on I2C depends on OF select MFD_CORE select REGMAP_I2C help Say yes here to add support for the Ricoh RN5T618 PMIC. This driver provides common support for accessing the device, Say yes here to add support for the Ricoh RN5T567 or R5T618 PMIC. This driver provides common support for accessing the device, additional drivers must be enabled in order to use the functionality of the device. Loading
drivers/mfd/rn5t618.c +58 −12 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ * MFD core driver for Ricoh RN5T618 PMIC * * Copyright (C) 2014 Beniamino Galvani <b.galvani@gmail.com> * Copyright (C) 2016 Toradex AG * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License Loading @@ -11,10 +12,13 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include <linux/delay.h> #include <linux/i2c.h> #include <linux/mfd/core.h> #include <linux/mfd/rn5t618.h> #include <linux/module.h> #include <linux/of_device.h> #include <linux/reboot.h> #include <linux/regmap.h> static const struct mfd_cell rn5t618_cells[] = { Loading Loading @@ -48,28 +52,64 @@ static const struct regmap_config rn5t618_regmap_config = { }; static struct rn5t618 *rn5t618_pm_power_off; static struct notifier_block rn5t618_restart_handler; static void rn5t618_power_off(void) static void rn5t618_trigger_poweroff_sequence(bool repower) { /* disable automatic repower-on */ regmap_update_bits(rn5t618_pm_power_off->regmap, RN5T618_REPCNT, RN5T618_REPCNT_REPWRON, 0); RN5T618_REPCNT_REPWRON, repower ? RN5T618_REPCNT_REPWRON : 0); /* start power-off sequence */ regmap_update_bits(rn5t618_pm_power_off->regmap, RN5T618_SLPCNT, RN5T618_SLPCNT_SWPWROFF, RN5T618_SLPCNT_SWPWROFF); } static void rn5t618_power_off(void) { rn5t618_trigger_poweroff_sequence(false); } static int rn5t618_restart(struct notifier_block *this, unsigned long mode, void *cmd) { rn5t618_trigger_poweroff_sequence(true); /* * Re-power factor detection on PMIC side is not instant. 1ms * proved to be enough time until reset takes effect. */ mdelay(1); return NOTIFY_DONE; } static const struct of_device_id rn5t618_of_match[] = { { .compatible = "ricoh,rn5t567", .data = (void *)RN5T567 }, { .compatible = "ricoh,rn5t618", .data = (void *)RN5T618 }, { } }; MODULE_DEVICE_TABLE(of, rn5t618_of_match); static int rn5t618_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { const struct of_device_id *of_id; struct rn5t618 *priv; int ret; of_id = of_match_device(rn5t618_of_match, &i2c->dev); if (!of_id) { dev_err(&i2c->dev, "Failed to find matching DT ID\n"); return -EINVAL; } priv = devm_kzalloc(&i2c->dev, sizeof(*priv), GFP_KERNEL); if (!priv) return -ENOMEM; i2c_set_clientdata(i2c, priv); priv->variant = (long)of_id->data; priv->regmap = devm_regmap_init_i2c(i2c, &rn5t618_regmap_config); if (IS_ERR(priv->regmap)) { Loading @@ -85,9 +125,21 @@ static int rn5t618_i2c_probe(struct i2c_client *i2c, return ret; } if (!pm_power_off) { rn5t618_pm_power_off = priv; if (of_device_is_system_power_controller(i2c->dev.of_node)) { if (!pm_power_off) pm_power_off = rn5t618_power_off; else dev_warn(&i2c->dev, "Poweroff callback already assigned\n"); } rn5t618_restart_handler.notifier_call = rn5t618_restart; rn5t618_restart_handler.priority = 192; ret = register_restart_handler(&rn5t618_restart_handler); if (ret) { dev_err(&i2c->dev, "cannot register restart handler, %d\n", ret); return ret; } return 0; Loading @@ -105,12 +157,6 @@ static int rn5t618_i2c_remove(struct i2c_client *i2c) return 0; } static const struct of_device_id rn5t618_of_match[] = { { .compatible = "ricoh,rn5t618" }, { } }; MODULE_DEVICE_TABLE(of, rn5t618_of_match); static const struct i2c_device_id rn5t618_i2c_id[] = { { } }; Loading @@ -129,5 +175,5 @@ static struct i2c_driver rn5t618_i2c_driver = { module_i2c_driver(rn5t618_i2c_driver); MODULE_AUTHOR("Beniamino Galvani <b.galvani@gmail.com>"); MODULE_DESCRIPTION("Ricoh RN5T618 MFD driver"); MODULE_DESCRIPTION("Ricoh RN5T567/618 MFD driver"); MODULE_LICENSE("GPL v2");