* [PATCH 0/6] drivers: mfd: Add MAX77659 MFD and related device drivers
@ 2022-12-20 13:22 Zeynep Arslanbenzer
2022-12-20 13:22 ` [PATCH 1/6] drivers: mfd: add MAX77659 PMIC support Zeynep Arslanbenzer
` (5 more replies)
0 siblings, 6 replies; 18+ messages in thread
From: Zeynep Arslanbenzer @ 2022-12-20 13:22 UTC (permalink / raw)
To: lee, robh+dt, krzysztof.kozlowski+dt, sre, lgirdwood, broonie
Cc: Zeynep.Arslanbenzer, Nurettin.Bolucu, linux-kernel, devicetree,
linux-pm
This patchset adds mfd, regulator and charger driver and related bindings.The patches
are required to be applied in sequence.
Zeynep Arslanbenzer (6):
drivers: mfd: add MAX77659 PMIC support
dt-bindings: mfd: add MAX77659 binding
drivers: power: supply: add MAX77659 charger support
dt-bindings: power: supply: add MAX77659 charger binding
drivers: regulator: add MAX77659 regulator support
dt-bindings: regulator: add MAX77659 regulator binding
.../devicetree/bindings/mfd/adi,max77659.yaml | 70 +++
.../power/supply/adi,max77659-charger.yaml | 42 ++
.../regulator/adi,max77659-regulator.yaml | 31 +
MAINTAINERS | 13 +
drivers/mfd/Kconfig | 14 +
drivers/mfd/Makefile | 1 +
drivers/mfd/max77659.c | 188 ++++++
drivers/power/supply/Kconfig | 7 +
drivers/power/supply/Makefile | 1 +
drivers/power/supply/max77659-charger.c | 547 ++++++++++++++++++
drivers/regulator/Kconfig | 8 +
drivers/regulator/Makefile | 1 +
drivers/regulator/max77659-regulator.c | 98 ++++
include/linux/mfd/max77659.h | 60 ++
14 files changed, 1081 insertions(+)
create mode 100644 Documentation/devicetree/bindings/mfd/adi,max77659.yaml
create mode 100644 Documentation/devicetree/bindings/power/supply/adi,max77659-charger.yaml
create mode 100644 Documentation/devicetree/bindings/regulator/adi,max77659-regulator.yaml
create mode 100644 drivers/mfd/max77659.c
create mode 100644 drivers/power/supply/max77659-charger.c
create mode 100644 drivers/regulator/max77659-regulator.c
create mode 100644 include/linux/mfd/max77659.h
--
2.25.1
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH 1/6] drivers: mfd: add MAX77659 PMIC support
2022-12-20 13:22 [PATCH 0/6] drivers: mfd: Add MAX77659 MFD and related device drivers Zeynep Arslanbenzer
@ 2022-12-20 13:22 ` Zeynep Arslanbenzer
2022-12-20 14:47 ` Krzysztof Kozlowski
2022-12-20 13:22 ` [PATCH 2/6] dt-bindings: mfd: add MAX77659 binding Zeynep Arslanbenzer
` (4 subsequent siblings)
5 siblings, 1 reply; 18+ messages in thread
From: Zeynep Arslanbenzer @ 2022-12-20 13:22 UTC (permalink / raw)
To: lee, robh+dt, krzysztof.kozlowski+dt, sre, lgirdwood, broonie
Cc: Zeynep.Arslanbenzer, Nurettin.Bolucu, linux-kernel, devicetree,
linux-pm
This patch adds MFD driver for MAX77659 to enable its sub
devices.
The MAX77659 is a multi-function devices. It includes
charger and regulator
Signed-off-by: Nurettin Bolucu <Nurettin.Bolucu@analog.com>
Signed-off-by: Zeynep Arslanbenzer <Zeynep.Arslanbenzer@analog.com>
---
MAINTAINERS | 8 ++
drivers/mfd/Kconfig | 14 +++
drivers/mfd/Makefile | 1 +
drivers/mfd/max77659.c | 188 +++++++++++++++++++++++++++++++++++
include/linux/mfd/max77659.h | 60 +++++++++++
5 files changed, 271 insertions(+)
create mode 100644 drivers/mfd/max77659.c
create mode 100644 include/linux/mfd/max77659.h
diff --git a/MAINTAINERS b/MAINTAINERS
index a608f19da3a9..45a8a471c7c0 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -12640,6 +12640,14 @@ F: drivers/power/supply/max77650-charger.c
F: drivers/regulator/max77650-regulator.c
F: include/linux/mfd/max77650.h
+ANALOG DEVICES MAX77659 PMIC MFD DRIVER
+M: Nurettin Bolucu <Nurettin.Bolucu@analog.com>
+M: Zeynep Arslanbenzer <Zeynep.Arslanbenzer@analog.com>
+L: linux-kernel@vger.kernel.org
+S: Maintained
+F: drivers/mfd/max77659.c
+F: include/linux/mfd/max77659.h
+
MAXIM MAX77714 PMIC MFD DRIVER
M: Luca Ceresoli <luca@lucaceresoli.net>
S: Maintained
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 8b93856de432..4d5e446edfa5 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -821,6 +821,20 @@ config MFD_MAX77650
the following functionalities of the device: GPIO, regulator,
charger, LED, onkey.
+config MFD_MAX77659
+ tristate "Analog Devices MAX77659 PMIC Support"
+ depends on I2C
+ depends on OF
+ select MFD_CORE
+ select REGMAP_I2C
+ select REGMAP_IRQ
+ help
+ Say Y here to add support for Analog Devices MAX77659 Power
+ Management IC. This is the core multifunction
+ driver for interacting with the device. Additional drivers can be
+ enabled in order to use the following functionalities of the device:
+ regulator, charger.
+
config MFD_MAX77686
tristate "Maxim Semiconductor MAX77686/802 PMIC Support"
depends on I2C
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 7ed3ef4a698c..f7b39bf4aacb 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -163,6 +163,7 @@ obj-$(CONFIG_MFD_DA9150) += da9150-core.o
obj-$(CONFIG_MFD_MAX14577) += max14577.o
obj-$(CONFIG_MFD_MAX77620) += max77620.o
obj-$(CONFIG_MFD_MAX77650) += max77650.o
+obj-$(CONFIG_MFD_MAX77659) += max77659.o
obj-$(CONFIG_MFD_MAX77686) += max77686.o
obj-$(CONFIG_MFD_MAX77693) += max77693.o
obj-$(CONFIG_MFD_MAX77714) += max77714.o
diff --git a/drivers/mfd/max77659.c b/drivers/mfd/max77659.c
new file mode 100644
index 000000000000..8401aea20e8c
--- /dev/null
+++ b/drivers/mfd/max77659.c
@@ -0,0 +1,188 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include <linux/i2c.h>
+#include <linux/mfd/core.h>
+#include <linux/mfd/max77659.h>
+#include <linux/mod_devicetable.h>
+#include <linux/regmap.h>
+
+static const struct regmap_config max77659_regmap_config = {
+ .reg_bits = 8,
+ .val_bits = 8,
+};
+
+static const struct regmap_irq max77659_glbl0_irqs[] = {
+ { .mask = MAX77659_BIT_INT_GLBL0_GPIO0_F, },
+ { .mask = MAX77659_BIT_INT_GLBL0_GPIO0_R, },
+ { .mask = MAX77659_BIT_INT_GLBL0_EN_F, },
+ { .mask = MAX77659_BIT_INT_GLBL0_EN_R, },
+ { .mask = MAX77659_BIT_INT_GLBL0_TJAL1_R, },
+ { .mask = MAX77659_BIT_INT_GLBL0_TJAL2_R, },
+ { .mask = MAX77659_BIT_INT_GLBL0_DOD0_R, },
+};
+
+static const struct regmap_irq_chip max77659_glbl0_irq_chip = {
+ .name = "max77659_glbl0",
+ .status_base = MAX77659_REG_INT_GLBL0,
+ .mask_base = MAX77659_REG_INTM_GLBL0,
+ .num_regs = 1,
+ .irqs = max77659_glbl0_irqs,
+ .num_irqs = ARRAY_SIZE(max77659_glbl0_irqs),
+};
+
+static const struct regmap_irq max77659_glbl1_irqs[] = {
+ { .mask = MAX77659_BIT_INT_GLBL1_GPI1_F, },
+ { .mask = MAX77659_BIT_INT_GLBL1_GPI1_R, },
+ { .mask = MAX77659_BIT_INT_GLBL1_SBB_TO, },
+ { .mask = MAX77659_BIT_INT_GLBL1_LDO0_F, },
+};
+
+static const struct regmap_irq_chip max77659_glbl1_irq_chip = {
+ .name = "max77659_glbl1",
+ .status_base = MAX77659_REG_INT_GLBL1,
+ .mask_base = MAX77659_REG_INTM_GLBL1,
+ .num_regs = 1,
+ .irqs = max77659_glbl1_irqs,
+ .num_irqs = ARRAY_SIZE(max77659_glbl1_irqs),
+};
+
+static const struct regmap_irq max77659_chg_irqs[] = {
+ { .mask = MAX77659_BIT_INT_THM, },
+ { .mask = MAX77659_BIT_INT_CHG, },
+ { .mask = MAX77659_BIT_INT_CHGIN, },
+ { .mask = MAX77659_BIT_INT_TJ_REG, },
+ { .mask = MAX77659_BIT_INT_SYS_CTRL, },
+};
+
+static const struct regmap_irq_chip max77659_chg_irq_chip = {
+ .name = "max77659_chg",
+ .status_base = MAX77659_REG_INT_CHG,
+ .mask_base = MAX77659_REG_INT_M_CHG,
+ .num_regs = 1,
+ .irqs = max77659_chg_irqs,
+ .num_irqs = ARRAY_SIZE(max77659_chg_irqs),
+};
+
+static const struct mfd_cell max77659_devs[] = {
+ MFD_CELL_OF(MAX77659_REGULATOR_NAME, NULL, NULL, 0, 0, "adi,max77659-regulator"),
+ MFD_CELL_OF(MAX77659_CHARGER_NAME, NULL, NULL, 0, 0, "adi,max77659-charger"),
+};
+
+static int max77659_pmic_irq_init(struct max77659_dev *me)
+{
+ struct device *dev = me->dev;
+ int ret;
+
+ ret = regmap_write(me->regmap, MAX77659_REG_INTM_GLBL0, MAX77659_INT_GLBL0_MASK);
+ if (ret)
+ return dev_err_probe(dev, ret,
+ "Unable to write Global0 Interrupt Masking register\n");
+
+ ret = regmap_write(me->regmap, MAX77659_REG_INTM_GLBL1, MAX77659_INT_GLBL1_MASK);
+ if (ret)
+ return dev_err_probe(dev, ret,
+ "Unable to write Global1 Interrupt Masking register\n");
+
+ ret = devm_regmap_add_irq_chip(dev, me->regmap, me->irq,
+ IRQF_ONESHOT | IRQF_SHARED, 0,
+ &max77659_glbl0_irq_chip, &me->irqc_glbl0);
+ if (ret)
+ return dev_err_probe(dev, ret, "Failed to add global0 IRQ chip\n");
+
+ ret = devm_regmap_add_irq_chip(dev, me->regmap, me->irq,
+ IRQF_ONESHOT | IRQF_SHARED, 0,
+ &max77659_glbl1_irq_chip, &me->irqc_glbl1);
+ if (ret)
+ return dev_err_probe(dev, ret, "Failed to add global1 IRQ chip\n");
+
+ return devm_regmap_add_irq_chip(dev, me->regmap, me->irq,
+ IRQF_ONESHOT | IRQF_SHARED, 0,
+ &max77659_chg_irq_chip, &me->irqc_chg);
+}
+
+static int max77659_pmic_setup(struct max77659_dev *me)
+{
+ struct device *dev = me->dev;
+ unsigned int val;
+ int ret;
+
+ ret = max77659_pmic_irq_init(me);
+ if (ret < 0)
+ return dev_err_probe(dev, ret, "Failed to initialize IRQ\n");
+
+ ret = regmap_read(me->regmap, MAX77659_REG_INT_GLBL0, &val);
+ if (ret)
+ return dev_err_probe(dev, ret,
+ "Unable to read Global0 Interrupt Status register\n");
+
+ ret = regmap_read(me->regmap, MAX77659_REG_INT_GLBL1, &val);
+ if (ret)
+ return dev_err_probe(dev, ret,
+ "Unable to read Global1 Interrupt Status register\n");
+
+ ret = regmap_read(me->regmap, MAX77659_REG_INT_CHG, &val);
+ if (ret)
+ return dev_err_probe(dev, ret,
+ "Unable to read Charger Interrupt Status register\n");
+ ret = device_init_wakeup(dev, true);
+ if (ret)
+ return dev_err_probe(dev, ret, "Unable to init wakeup\n");
+
+ ret = devm_mfd_add_devices(dev, -1, max77659_devs, ARRAY_SIZE(max77659_devs),
+ NULL, 0, NULL);
+ if (ret)
+ return dev_err_probe(dev, ret, "Failed to add sub-devices\n");
+
+ enable_irq_wake(me->irq);
+
+ return 0;
+}
+
+static int max77659_i2c_probe(struct i2c_client *client)
+{
+ struct max77659_dev *me;
+
+ me = devm_kzalloc(&client->dev, sizeof(*me), GFP_KERNEL);
+ if (!me)
+ return -ENOMEM;
+
+ i2c_set_clientdata(client, me);
+ me->dev = &client->dev;
+ me->irq = client->irq;
+
+ me->regmap = devm_regmap_init_i2c(client, &max77659_regmap_config);
+
+ if (IS_ERR(me->regmap))
+ return dev_err_probe(&client->dev, PTR_ERR(me->regmap),
+ "Failed to allocate register map\n");
+
+ return max77659_pmic_setup(me);
+}
+
+static const struct of_device_id max77659_of_id[] = {
+ { .compatible = "adi,max77659" },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, max77659_of_id);
+
+static const struct i2c_device_id max77659_i2c_id[] = {
+ { MAX77659_NAME, 0 },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(i2c, max77659_i2c_id);
+
+static struct i2c_driver max77659_i2c_driver = {
+ .driver = {
+ .name = MAX77659_NAME,
+ .of_match_table = of_match_ptr(max77659_of_id),
+ },
+ .probe_new = max77659_i2c_probe,
+ .id_table = max77659_i2c_id,
+};
+
+module_i2c_driver(max77659_i2c_driver);
+
+MODULE_DESCRIPTION("max77659 MFD Driver");
+MODULE_AUTHOR("Nurettin.Bolucu@analog.com, Zeynep.Arslanbenzer@analog.com");
+MODULE_LICENSE("GPL");
+MODULE_VERSION("1.0");
diff --git a/include/linux/mfd/max77659.h b/include/linux/mfd/max77659.h
new file mode 100644
index 000000000000..ef781e6e54c2
--- /dev/null
+++ b/include/linux/mfd/max77659.h
@@ -0,0 +1,60 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#ifndef __MAX77659_MFD_H__
+#define __MAX77659_MFD_H__
+
+#include <linux/bits.h>
+
+#define MAX77659_NAME "max77659"
+
+#define MAX77659_REGULATOR_NAME MAX77659_NAME "-regulator"
+#define MAX77659_CHARGER_NAME MAX77659_NAME "-charger"
+
+#define MAX77659_REG_INT_GLBL0 0x00
+#define MAX77659_REG_INT_CHG 0x01
+#define MAX77659_REG_INT_GLBL1 0x04
+#define MAX77659_REG_INT_M_CHG 0x07
+#define MAX77659_REG_INTM_GLBL1 0x08
+#define MAX77659_REG_INTM_GLBL0 0x09
+
+#define MAX77659_INT_GLBL0_MASK 0xFF
+#define MAX77659_INT_GLBL1_MASK 0x33
+
+#define MAX77659_BIT_INT_GLBL0_GPIO0_F BIT(0)
+#define MAX77659_BIT_INT_GLBL0_GPIO0_R BIT(1)
+#define MAX77659_BIT_INT_GLBL0_EN_F BIT(2)
+#define MAX77659_BIT_INT_GLBL0_EN_R BIT(3)
+#define MAX77659_BIT_INT_GLBL0_TJAL1_R BIT(4)
+#define MAX77659_BIT_INT_GLBL0_TJAL2_R BIT(5)
+#define MAX77659_BIT_INT_GLBL0_DOD0_R BIT(7)
+
+#define MAX77659_BIT_INT_GLBL1_GPI1_F BIT(0)
+#define MAX77659_BIT_INT_GLBL1_GPI1_R BIT(1)
+#define MAX77659_BIT_INT_GLBL1_SBB_TO BIT(4)
+#define MAX77659_BIT_INT_GLBL1_LDO0_F BIT(5)
+
+#define MAX77659_BIT_INT_THM BIT(0)
+#define MAX77659_BIT_INT_CHG BIT(1)
+#define MAX77659_BIT_INT_CHGIN BIT(2)
+#define MAX77659_BIT_INT_TJ_REG BIT(3)
+#define MAX77659_BIT_INT_SYS_CTRL BIT(4)
+
+enum {
+ MAX77659_DEV_PMIC,
+ MAX77659_DEV_CHARGER,
+ MAX77659_DEV_REGULATOR,
+ MAX77659_NUM_DEVS,
+};
+
+struct max77659_dev {
+ struct device *dev;
+
+ int irq;
+ struct regmap_irq_chip_data *irqc_glbl0;
+ struct regmap_irq_chip_data *irqc_glbl1;
+ struct regmap_irq_chip_data *irqc_chg;
+
+ struct regmap *regmap;
+};
+
+#endif /* __MAX77659_MFD_H__ */
--
2.25.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 2/6] dt-bindings: mfd: add MAX77659 binding
2022-12-20 13:22 [PATCH 0/6] drivers: mfd: Add MAX77659 MFD and related device drivers Zeynep Arslanbenzer
2022-12-20 13:22 ` [PATCH 1/6] drivers: mfd: add MAX77659 PMIC support Zeynep Arslanbenzer
@ 2022-12-20 13:22 ` Zeynep Arslanbenzer
2022-12-20 14:43 ` Krzysztof Kozlowski
2022-12-20 16:40 ` Rob Herring
2022-12-20 13:22 ` [PATCH 3/6] drivers: power: supply: add MAX77659 charger support Zeynep Arslanbenzer
` (3 subsequent siblings)
5 siblings, 2 replies; 18+ messages in thread
From: Zeynep Arslanbenzer @ 2022-12-20 13:22 UTC (permalink / raw)
To: lee, robh+dt, krzysztof.kozlowski+dt, sre, lgirdwood, broonie
Cc: Zeynep.Arslanbenzer, Nurettin.Bolucu, linux-kernel, devicetree,
linux-pm
This patch adds binding document for MAX77659 MFD driver.
Signed-off-by: Nurettin Bolucu <Nurettin.Bolucu@analog.com>
Signed-off-by: Zeynep Arslanbenzer <Zeynep.Arslanbenzer@analog.com>
---
.../devicetree/bindings/mfd/adi,max77659.yaml | 70 +++++++++++++++++++
MAINTAINERS | 1 +
2 files changed, 71 insertions(+)
create mode 100644 Documentation/devicetree/bindings/mfd/adi,max77659.yaml
diff --git a/Documentation/devicetree/bindings/mfd/adi,max77659.yaml b/Documentation/devicetree/bindings/mfd/adi,max77659.yaml
new file mode 100644
index 000000000000..6bec11607615
--- /dev/null
+++ b/Documentation/devicetree/bindings/mfd/adi,max77659.yaml
@@ -0,0 +1,70 @@
+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/mfd/adi,max77659.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: MAX77659 SIMO PMIC from ADI.
+
+maintainers:
+ - Nurettin Bolucu <Nurettin.Bolucu@analog.com>
+ - Zeynep Arslanbenzer <Zeynep.Arslanbenzer@analog.com>
+
+description: |
+ MAX77659 is an PMIC providing battery charging and power
+ supply solutions for low-power applications.
+
+ For device-tree bindings of other sub-modules (regulator, power supply
+ refer to the binding documents under the respective
+ sub-system directories.
+
+properties:
+ compatible:
+ const: adi,max77659
+
+ reg:
+ description:
+ I2C device address.
+ maxItems: 1
+
+ interrupts:
+ maxItems: 1
+
+ charger:
+ $ref: ../power/supply/adi,max77659-charger.yaml
+
+ regulator:
+ $ref: ../regulator/adi,max77659-regulator.yaml
+
+required:
+ - compatible
+ - reg
+ - interrupts
+
+additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/interrupt-controller/irq.h>
+ i2c {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ pmic@40 {
+ compatible = "adi,max77659";
+ reg = <0x40>;
+ interrupt-parent = <&gpio>;
+ #interrupt-cells = <2>;
+ interrupts = <16 IRQ_TYPE_EDGE_FALLING>;
+ regulator {
+ compatible = "adi,max77659-regulator";
+ regulator-boot-on;
+ regulator-always-on;
+ };
+ charger {
+ compatible = "adi,max77659-charger";
+ adi,fast-charge-timer = <5>;
+ adi,fast-charge-microamp = <15000>;
+ adi,topoff-timer = <30>;
+ };
+ };
+ };
diff --git a/MAINTAINERS b/MAINTAINERS
index 45a8a471c7c0..e7a9cadf0ff2 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -12645,6 +12645,7 @@ M: Nurettin Bolucu <Nurettin.Bolucu@analog.com>
M: Zeynep Arslanbenzer <Zeynep.Arslanbenzer@analog.com>
L: linux-kernel@vger.kernel.org
S: Maintained
+F: Documentation/devicetree/bindings/mfd/adi,max77659.yaml
F: drivers/mfd/max77659.c
F: include/linux/mfd/max77659.h
--
2.25.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 3/6] drivers: power: supply: add MAX77659 charger support
2022-12-20 13:22 [PATCH 0/6] drivers: mfd: Add MAX77659 MFD and related device drivers Zeynep Arslanbenzer
2022-12-20 13:22 ` [PATCH 1/6] drivers: mfd: add MAX77659 PMIC support Zeynep Arslanbenzer
2022-12-20 13:22 ` [PATCH 2/6] dt-bindings: mfd: add MAX77659 binding Zeynep Arslanbenzer
@ 2022-12-20 13:22 ` Zeynep Arslanbenzer
2022-12-20 14:51 ` Krzysztof Kozlowski
2023-01-02 20:44 ` Sebastian Reichel
2022-12-20 13:22 ` [PATCH 4/6] dt-bindings: power: supply: add MAX77659 charger binding Zeynep Arslanbenzer
` (2 subsequent siblings)
5 siblings, 2 replies; 18+ messages in thread
From: Zeynep Arslanbenzer @ 2022-12-20 13:22 UTC (permalink / raw)
To: lee, robh+dt, krzysztof.kozlowski+dt, sre, lgirdwood, broonie
Cc: Zeynep.Arslanbenzer, Nurettin.Bolucu, linux-kernel, devicetree,
linux-pm
This patch adds battery charger driver for MAX77659.
Signed-off-by: Nurettin Bolucu <Nurettin.Bolucu@analog.com>
Signed-off-by: Zeynep Arslanbenzer <Zeynep.Arslanbenzer@analog.com>
---
MAINTAINERS | 1 +
drivers/power/supply/Kconfig | 7 +
drivers/power/supply/Makefile | 1 +
drivers/power/supply/max77659-charger.c | 547 ++++++++++++++++++++++++
4 files changed, 556 insertions(+)
create mode 100644 drivers/power/supply/max77659-charger.c
diff --git a/MAINTAINERS b/MAINTAINERS
index e7a9cadf0ff2..b3e307163063 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -12647,6 +12647,7 @@ L: linux-kernel@vger.kernel.org
S: Maintained
F: Documentation/devicetree/bindings/mfd/adi,max77659.yaml
F: drivers/mfd/max77659.c
+F: drivers/power/supply/max77659-charger.c
F: include/linux/mfd/max77659.h
MAXIM MAX77714 PMIC MFD DRIVER
diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig
index 0bbfe6a7ce4d..d38ef40ae9ee 100644
--- a/drivers/power/supply/Kconfig
+++ b/drivers/power/supply/Kconfig
@@ -565,6 +565,13 @@ config CHARGER_MAX77650
Say Y to enable support for the battery charger control of MAX77650
PMICs.
+config CHARGER_MAX77659
+ tristate "Analog Devices MAX77659 battery charger driver"
+ depends on MFD_MAX77659
+ help
+ Say Y to enable support for the battery charger control of MAX77659
+ PMICs.
+
config CHARGER_MAX77693
tristate "Maxim MAX77693 battery charger driver"
depends on MFD_MAX77693
diff --git a/drivers/power/supply/Makefile b/drivers/power/supply/Makefile
index 0ee8653e882e..e8646896bcd2 100644
--- a/drivers/power/supply/Makefile
+++ b/drivers/power/supply/Makefile
@@ -76,6 +76,7 @@ obj-$(CONFIG_CHARGER_LTC4162L) += ltc4162-l-charger.o
obj-$(CONFIG_CHARGER_MAX14577) += max14577_charger.o
obj-$(CONFIG_CHARGER_DETECTOR_MAX14656) += max14656_charger_detector.o
obj-$(CONFIG_CHARGER_MAX77650) += max77650-charger.o
+obj-$(CONFIG_CHARGER_MAX77659) += max77659-charger.o
obj-$(CONFIG_CHARGER_MAX77693) += max77693_charger.o
obj-$(CONFIG_CHARGER_MAX77976) += max77976_charger.o
obj-$(CONFIG_CHARGER_MAX8997) += max8997_charger.o
diff --git a/drivers/power/supply/max77659-charger.c b/drivers/power/supply/max77659-charger.c
new file mode 100644
index 000000000000..dfdbd484f7cd
--- /dev/null
+++ b/drivers/power/supply/max77659-charger.c
@@ -0,0 +1,547 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include <linux/bitfield.h>
+#include <linux/interrupt.h>
+#include <linux/mfd/max77659.h>
+#include <linux/module.h>
+#include <linux/mutex.h>
+#include <linux/of_irq.h>
+#include <linux/platform_device.h>
+#include <linux/power_supply.h>
+#include <linux/regmap.h>
+
+#define MAX77659_IRQ_WORK_DELAY 0
+#define MAX77659_CHARGER_CURRENT_MAX 300000
+#define MAX77659_CHARGER_CURRENT_MIN 7500
+#define MAX77659_CHARGER_CURRENT_STEP 7500
+#define MAX77659_CHARGER_TOPOFF_TIMER_STEP 5
+
+#define MAX77659_REG_STAT_CHG_A 0x02
+#define MAX77659_REG_STAT_CHG_B 0x03
+#define MAX77659_REG_CNFG_CHG_A 0x20
+#define MAX77659_REG_CNFG_CHG_B 0x21
+#define MAX77659_REG_CNFG_CHG_C 0x22
+#define MAX77659_REG_CNFG_CHG_D 0x23
+#define MAX77659_REG_CNFG_CHG_E 0x24
+#define MAX77659_REG_CNFG_CHG_F 0x25
+#define MAX77659_REG_CNFG_CHG_G 0x26
+#define MAX77659_REG_CNFG_CHG_H 0x27
+#define MAX77659_REG_CNFG_CHG_I 0x28
+
+#define MAX77659_BIT_STAT_A_VSYSY_MIN_STAT BIT(4)
+#define MAX77659_BIT_STAT_A_TJ_REG_STAT BIT(3)
+#define MAX77659_BIT_STAT_A_THM_DTLS GENMASK(2, 0)
+#define MAX77659_BIT_STAT_B_CHG_DTLS GENMASK(7, 4)
+#define MAX77659_BIT_STAT_B_CHGIN_DTSL GENMASK(3, 2)
+#define MAX77659_BIT_STAT_B_CHG BIT(1)
+#define MAX77659_BIT_CNFG_B_CHG_EN BIT(0)
+#define MAX77659_BIT_CNFG_C_TOPOFFTIMER GENMASK(2, 0)
+#define MAX77659_BIT_CNFG_E_CC GENMASK(7, 2)
+#define MAX77659_BIT_CNFG_E_TFASTCHG GENMASK(1, 0)
+#define MAX77659_BIT_CNFG_G_CHG_CV GENMASK(7, 2)
+
+enum {
+ MAX77659_CHG_DTLS_OFF,
+ MAX77659_CHG_DTLS_PREQUAL,
+ MAX77659_CHG_DTLS_FASTCHARGE_CC,
+ MAX77659_CHG_DTLS_JEITA_FASTCHARGE_CC,
+ MAX77659_CHG_DTLS_FASTCHARGE_CV,
+ MAX77659_CHG_DTLS_JEITA_FASTCHARGE_CV,
+ MAX77659_CHG_DTLS_TOPOFF,
+ MAX77659_CHG_DTLS_JEITA_TOPOFF,
+ MAX77659_CHG_DTLS_DONE,
+ MAX77659_CHG_DTLS_JEITA_DONE,
+ MAX77659_CHG_DTLS_OFF_TIMER_FAULT,
+ MAX77659_CHG_DTLS_OFF_CHARGE_TIMER_FAULT,
+ MAX77659_CHG_DTLS_OFF_BATTERY_TEMP_FAULT,
+ MAX77659_CHG_DTLS_RESERVED_13,
+};
+
+enum {
+ MAX77659_CHG_IRQ_THM_I,
+ MAX77659_CHG_IRQ_CHG_I,
+ MAX77659_CHG_IRQ_CHGIN_I,
+ MAX77659_CHG_IRQ_TJ_REG_I,
+ MAX77659_CHG_IRQ_SYS_CTRL_I,
+
+ MAX77659_CHG_IRQ_MAX,
+};
+
+struct max77659_charger_dev {
+ struct device *dev;
+ struct max77659_dev *max77659;
+ struct regmap *regmap;
+
+ struct power_supply *psy_chg;
+ struct power_supply_desc psy_chg_d;
+
+ int irq;
+ int irq_arr[MAX77659_CHG_IRQ_MAX];
+ int irq_mask;
+
+ struct delayed_work irq_work;
+ /* mutex for charger operations*/
+ struct mutex lock;
+
+ int present;
+ int health;
+ int status;
+ int charge_type;
+
+ unsigned int fast_charge_current_ua;
+ unsigned int fast_charge_timer_hr;
+ unsigned int topoff_timer_min;
+};
+
+static char *chg_supplied_to[] = {
+ MAX77659_CHARGER_NAME,
+};
+
+static int max77659_set_charge_current(struct max77659_charger_dev *charger,
+ int fast_charge_current_ua)
+{
+ unsigned int reg_data;
+
+ fast_charge_current_ua = clamp_val(fast_charge_current_ua, MAX77659_CHARGER_CURRENT_MIN,
+ MAX77659_CHARGER_CURRENT_MAX);
+ reg_data = fast_charge_current_ua / MAX77659_CHARGER_CURRENT_STEP - 1;
+ reg_data = FIELD_PREP(MAX77659_BIT_CNFG_E_CC, reg_data);
+
+ return regmap_update_bits(charger->regmap, MAX77659_REG_CNFG_CHG_E,
+ MAX77659_BIT_CNFG_E_CC, reg_data);
+}
+
+static int max77659_get_charge_current(struct max77659_charger_dev *charger,
+ int *get_current)
+{
+ struct regmap *regmap = charger->regmap;
+ unsigned int reg_data, current_val;
+ int ret;
+
+ ret = regmap_read(regmap, MAX77659_REG_CNFG_CHG_E, ®_data);
+ if (ret)
+ return ret;
+
+ reg_data = FIELD_GET(MAX77659_BIT_CNFG_E_CC, reg_data);
+ current_val = (reg_data + 1) * MAX77659_CHARGER_CURRENT_STEP;
+
+ *get_current = clamp_val(current_val, MAX77659_CHARGER_CURRENT_MIN,
+ MAX77659_CHARGER_CURRENT_MAX);
+
+ return 0;
+}
+
+static int max77659_set_topoff_timer(struct max77659_charger_dev *charger, int termination_time_min)
+{
+ unsigned int reg_data;
+
+ termination_time_min = clamp_val(termination_time_min, 0, MAX77659_BIT_CNFG_C_TOPOFFTIMER
+ * MAX77659_CHARGER_TOPOFF_TIMER_STEP);
+ reg_data = FIELD_PREP(MAX77659_BIT_CNFG_C_TOPOFFTIMER,
+ termination_time_min / MAX77659_CHARGER_TOPOFF_TIMER_STEP);
+
+ return regmap_update_bits(charger->regmap, MAX77659_REG_CNFG_CHG_C,
+ MAX77659_BIT_CNFG_C_TOPOFFTIMER, reg_data);
+}
+
+static int max77659_charger_initialize(struct max77659_charger_dev *charger)
+{
+ int ret;
+ unsigned int val;
+
+ val = (MAX77659_BIT_INT_SYS_CTRL | MAX77659_BIT_INT_TJ_REG | MAX77659_BIT_INT_CHGIN |
+ MAX77659_BIT_INT_CHG | MAX77659_BIT_INT_THM);
+
+ ret = regmap_write(charger->regmap, MAX77659_REG_INT_M_CHG, val);
+ if (ret)
+ return dev_err_probe(charger->dev, ret, "Error in writing register INT_M_CHG\n");
+
+ ret = max77659_set_charge_current(charger, charger->fast_charge_current_ua);
+ if (ret)
+ return dev_err_probe(charger->dev, ret, "Error in writing register CNFG_CHG_C\n");
+
+ if (charger->fast_charge_timer_hr == 0 || charger->fast_charge_timer_hr > 7)
+ val = 0x00;
+ else if (charger->fast_charge_timer_hr < 3)
+ val = 0x01;
+ else
+ val = DIV_ROUND_UP(charger->fast_charge_timer_hr - 1, 2);
+
+ ret = regmap_update_bits(charger->regmap, MAX77659_REG_CNFG_CHG_E,
+ MAX77659_BIT_CNFG_E_TFASTCHG, val);
+ if (ret)
+ return dev_err_probe(charger->dev, ret, "Error in writing register CNFG_CHG_E\n");
+
+ return max77659_set_topoff_timer(charger, charger->topoff_timer_min);
+}
+
+static void max77659_charger_parse_dt(struct max77659_charger_dev *charger)
+{
+ int ret;
+
+ ret = device_property_read_u32(charger->dev, "adi,fast-charge-timer",
+ &charger->fast_charge_timer_hr);
+ if (ret)
+ dev_dbg(charger->dev, "Could not read adi,fast-charge-timer DT property\n");
+
+ ret = device_property_read_u32(charger->dev, "adi,fast-charge-microamp",
+ &charger->fast_charge_current_ua);
+ if (ret)
+ dev_dbg(charger->dev, "Could not read adi,fast-charge-microamp DT property\n");
+
+ ret = device_property_read_u32(charger->dev, "adi,topoff-timer",
+ &charger->topoff_timer_min);
+ if (ret)
+ dev_dbg(charger->dev, "Could not read adi,topoff-timer DT property\n");
+}
+
+struct max77659_charger_status_map {
+ int health;
+ int status;
+ int charge_type;
+};
+
+#define STATUS_MAP(_MAX77659_CHG_DTLS, _health, _status, _charge_type) \
+ [MAX77659_CHG_DTLS_##_MAX77659_CHG_DTLS] = {\
+ .health = POWER_SUPPLY_HEALTH_##_health,\
+ .status = POWER_SUPPLY_STATUS_##_status,\
+ .charge_type = POWER_SUPPLY_CHARGE_TYPE_##_charge_type,\
+ }
+
+static struct max77659_charger_status_map max77659_charger_status_map[] = {
+ /* chg_details_xx, health, status, charge_type */
+ STATUS_MAP(OFF, UNKNOWN, NOT_CHARGING, NONE),
+ STATUS_MAP(PREQUAL, GOOD, CHARGING, TRICKLE),
+ STATUS_MAP(FASTCHARGE_CC, GOOD, CHARGING, FAST),
+ STATUS_MAP(JEITA_FASTCHARGE_CC, GOOD, CHARGING, FAST),
+ STATUS_MAP(FASTCHARGE_CV, GOOD, CHARGING, FAST),
+ STATUS_MAP(JEITA_FASTCHARGE_CV, GOOD, CHARGING, FAST),
+ STATUS_MAP(TOPOFF, GOOD, CHARGING, FAST),
+ STATUS_MAP(JEITA_TOPOFF, GOOD, CHARGING, FAST),
+ STATUS_MAP(DONE, GOOD, FULL, NONE),
+ STATUS_MAP(JEITA_DONE, GOOD, FULL, NONE),
+ STATUS_MAP(OFF_TIMER_FAULT, SAFETY_TIMER_EXPIRE, NOT_CHARGING, NONE),
+ STATUS_MAP(OFF_CHARGE_TIMER_FAULT, UNKNOWN, NOT_CHARGING, NONE),
+ STATUS_MAP(OFF_BATTERY_TEMP_FAULT, HOT, NOT_CHARGING, NONE),
+};
+
+static int max77659_charger_update(struct max77659_charger_dev *charger)
+{
+ unsigned int stat_chg_b, chg_dtls;
+ int ret;
+
+ ret = regmap_read(charger->regmap, MAX77659_REG_STAT_CHG_B, &stat_chg_b);
+ if (ret) {
+ charger->health = POWER_SUPPLY_HEALTH_UNKNOWN;
+ charger->status = POWER_SUPPLY_STATUS_UNKNOWN;
+ charger->charge_type = POWER_SUPPLY_CHARGE_TYPE_UNKNOWN;
+ return ret;
+ }
+
+ charger->present = stat_chg_b & MAX77659_BIT_STAT_B_CHG;
+ if (!charger->present) {
+ charger->health = POWER_SUPPLY_HEALTH_UNKNOWN;
+ charger->status = POWER_SUPPLY_STATUS_DISCHARGING;
+ charger->charge_type = POWER_SUPPLY_CHARGE_TYPE_UNKNOWN;
+ return 0;
+ }
+
+ chg_dtls = FIELD_GET(MAX77659_BIT_STAT_B_CHG_DTLS, stat_chg_b);
+
+ charger->health = max77659_charger_status_map[chg_dtls].health;
+ charger->status = max77659_charger_status_map[chg_dtls].status;
+ charger->charge_type = max77659_charger_status_map[chg_dtls].charge_type;
+
+ return 0;
+}
+
+static enum power_supply_property max77659_charger_props[] = {
+ POWER_SUPPLY_PROP_ONLINE,
+ POWER_SUPPLY_PROP_HEALTH,
+ POWER_SUPPLY_PROP_STATUS,
+ POWER_SUPPLY_PROP_CHARGE_TYPE,
+ POWER_SUPPLY_PROP_CURRENT_NOW
+};
+
+static int max77659_property_is_writeable(struct power_supply *psy, enum power_supply_property psp)
+{
+ switch (psp) {
+ case POWER_SUPPLY_PROP_ONLINE:
+ case POWER_SUPPLY_PROP_CURRENT_NOW:
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+static int max77659_charger_get_property(struct power_supply *psy,
+ enum power_supply_property psp,
+ union power_supply_propval *val)
+{
+ struct max77659_charger_dev *charger = power_supply_get_drvdata(psy);
+ int ret;
+
+ mutex_lock(&charger->lock);
+
+ ret = max77659_charger_update(charger);
+ if (ret)
+ goto out;
+
+ switch (psp) {
+ case POWER_SUPPLY_PROP_ONLINE:
+ val->intval = charger->present;
+ break;
+ case POWER_SUPPLY_PROP_HEALTH:
+ val->intval = charger->health;
+ break;
+ case POWER_SUPPLY_PROP_STATUS:
+ val->intval = charger->status;
+ break;
+ case POWER_SUPPLY_PROP_CHARGE_TYPE:
+ val->intval = charger->charge_type;
+ break;
+ case POWER_SUPPLY_PROP_CURRENT_NOW:
+ ret = max77659_get_charge_current(charger, &val->intval);
+ break;
+ default:
+ ret = -EINVAL;
+ break;
+ }
+
+out:
+ mutex_unlock(&charger->lock);
+
+ return ret;
+}
+
+static int max77659_charger_set_property(struct power_supply *psy, enum power_supply_property psp,
+ const union power_supply_propval *val)
+{
+ struct max77659_charger_dev *charger = power_supply_get_drvdata(psy);
+ int ret;
+
+ mutex_lock(&charger->lock);
+
+ switch (psp) {
+ case POWER_SUPPLY_PROP_ONLINE:
+ ret = regmap_update_bits(charger->regmap, MAX77659_REG_CNFG_CHG_B,
+ MAX77659_BIT_CNFG_B_CHG_EN, !!val->intval);
+ if (ret)
+ goto out;
+
+ ret = max77659_set_charge_current(charger, charger->fast_charge_current_ua);
+ break;
+ case POWER_SUPPLY_PROP_CURRENT_NOW:
+ /* val->intval - uA */
+ ret = max77659_set_charge_current(charger, val->intval);
+ if (ret)
+ goto out;
+
+ charger->fast_charge_current_ua = val->intval;
+ break;
+ default:
+ ret = -EINVAL;
+ break;
+ }
+
+out:
+ mutex_unlock(&charger->lock);
+
+ return ret;
+}
+
+static void max77659_charger_irq_handler(struct max77659_charger_dev *charger, int irq)
+{
+ unsigned int val, stat_chg_b;
+ int chg_present;
+ int ret;
+
+ switch (irq) {
+ case MAX77659_CHG_IRQ_THM_I:
+ ret = regmap_read(charger->regmap, MAX77659_REG_STAT_CHG_A, &val);
+ if (ret) {
+ dev_err(charger->dev, "Failed to read STAT_CHG_A\n");
+ return;
+ }
+
+ val = FIELD_GET(MAX77659_BIT_STAT_A_THM_DTLS, val);
+ dev_dbg(charger->dev, "CHG_INT_THM: thm_dtls = %02Xh\n", val);
+ break;
+
+ case MAX77659_CHG_IRQ_CHG_I:
+ ret = regmap_read(charger->regmap, MAX77659_REG_STAT_CHG_B, &val);
+ if (ret) {
+ dev_err(charger->dev, "Failed to read STAT_CHG_B\n");
+ return;
+ }
+
+ val = FIELD_GET(MAX77659_BIT_STAT_B_CHG_DTLS, val);
+ dev_dbg(charger->dev, "CHG_INT_CHG: MAX77659_CHG_DTLS = %02Xh\n", val);
+ break;
+
+ case MAX77659_CHG_IRQ_CHGIN_I:
+ ret = regmap_read(charger->regmap, MAX77659_REG_STAT_CHG_B, &val);
+ if (ret) {
+ dev_err(charger->dev, "Failed to read STAT_CHG_B\n");
+ return;
+ }
+
+ val = FIELD_GET(MAX77659_BIT_STAT_B_CHG_DTLS, val);
+ dev_dbg(charger->dev, "CHG_INT_CHG: MAX77659_CHG_DTLS = %02Xh\n", val);
+
+ ret = regmap_read(charger->regmap, MAX77659_REG_STAT_CHG_B, &stat_chg_b);
+ if (ret) {
+ dev_err(charger->dev, "Failed to read STAT_CHG_B\n");
+ return;
+ }
+
+ chg_present = stat_chg_b & MAX77659_BIT_STAT_B_CHG;
+
+ regmap_update_bits(charger->regmap, MAX77659_REG_CNFG_CHG_B,
+ MAX77659_BIT_CNFG_B_CHG_EN, !!chg_present);
+ if (!chg_present)
+ max77659_set_charge_current(charger, charger->fast_charge_current_ua);
+
+ dev_dbg(charger->dev, "CHG_INT_CHGIN: Charger input %s\n",
+ chg_present ? "inserted" : "removed");
+ break;
+
+ case MAX77659_CHG_IRQ_TJ_REG_I:
+ ret = regmap_read(charger->regmap, MAX77659_REG_STAT_CHG_A, &val);
+ if (ret) {
+ dev_err(charger->dev, "Failed to read STAT_CHG_A\n");
+ return;
+ }
+
+ val = FIELD_GET(MAX77659_BIT_STAT_A_TJ_REG_STAT, val);
+ dev_dbg(charger->dev, "CHG_INT_TJ_REG: tj_reg_stat = %02Xh\n", val);
+ dev_dbg(charger->dev, "CHG_INT_TJ_REG: Die temperature %s Tj-reg\n",
+ val ? "has exceeded" : "has not exceeded");
+ break;
+
+ case MAX77659_CHG_IRQ_SYS_CTRL_I:
+ ret = regmap_read(charger->regmap, MAX77659_REG_STAT_CHG_A, &val);
+ if (ret) {
+ dev_err(charger->dev, "Failed to read STAT_CHG_A\n");
+ return;
+ }
+
+ val = FIELD_GET(MAX77659_BIT_STAT_A_VSYSY_MIN_STAT, val);
+ dev_dbg(charger->dev,
+ "CHG_INT_SYS_CTRL: The minimum system voltage regulation loop %s\n",
+ val ? "has engaged" : "has not engaged");
+ break;
+
+ default:
+ break;
+ }
+
+ power_supply_changed(charger->psy_chg);
+}
+
+static irqreturn_t max77659_charger_isr(int irq, void *data)
+{
+ struct max77659_charger_dev *charger = data;
+
+ charger->irq = irq;
+ max77659_charger_update(charger);
+ max77659_charger_irq_handler(charger, charger->irq - charger->irq_arr[0]);
+
+ return IRQ_HANDLED;
+}
+
+static const char * const max77659_irq_descs[] = {
+ "charger-thm",
+ "charger-chg",
+ "charger-chgin",
+ "charger-tj-reg",
+ "charger-sys-ctrl",
+};
+
+static int max77659_charger_probe(struct platform_device *pdev)
+{
+ struct max77659_dev *max77659 = dev_get_drvdata(pdev->dev.parent);
+ struct max77659_charger_dev *charger;
+ struct device *dev = &pdev->dev;
+ int i, ret;
+ struct power_supply_config charger_cfg = {};
+
+ charger = devm_kzalloc(dev, sizeof(*charger), GFP_KERNEL);
+ if (!charger)
+ return -ENOMEM;
+
+ mutex_init(&charger->lock);
+
+ charger->dev = dev;
+ charger->regmap = dev_get_regmap(charger->dev->parent, NULL);
+ charger->fast_charge_current_ua = 15000;
+ charger->topoff_timer_min = 30;
+
+ max77659_charger_parse_dt(charger);
+
+ charger->psy_chg_d.name = MAX77659_CHARGER_NAME;
+ charger->psy_chg_d.type = POWER_SUPPLY_TYPE_UNKNOWN;
+ charger->psy_chg_d.get_property = max77659_charger_get_property;
+ charger->psy_chg_d.set_property = max77659_charger_set_property;
+ charger->psy_chg_d.properties = max77659_charger_props;
+ charger->psy_chg_d.property_is_writeable = max77659_property_is_writeable;
+ charger->psy_chg_d.num_properties = ARRAY_SIZE(max77659_charger_props);
+ charger_cfg.drv_data = charger;
+ charger_cfg.supplied_to = chg_supplied_to;
+ charger_cfg.of_node = dev->of_node;
+ charger_cfg.num_supplicants = ARRAY_SIZE(chg_supplied_to);
+
+ ret = max77659_charger_initialize(charger);
+ if (ret)
+ return dev_err_probe(dev, ret, "Failed to initialize charger\n");
+
+ for (i = 0; i < MAX77659_CHG_IRQ_MAX; i++) {
+ charger->irq_arr[i] = regmap_irq_get_virq(max77659->irqc_chg, i);
+
+ if (charger->irq_arr[i] < 0)
+ return dev_err_probe(dev, -EINVAL,
+ "Invalid IRQ for MAX77659_CHG_IRQ %d\n", i);
+
+ ret = devm_request_threaded_irq(dev, charger->irq_arr[i],
+ NULL, max77659_charger_isr, IRQF_TRIGGER_FALLING,
+ max77659_irq_descs[i], charger);
+ if (ret)
+ return dev_err_probe(dev, ret, "Failed to request irq: %d\n",
+ charger->irq_arr[i]);
+ }
+
+ charger->psy_chg = devm_power_supply_register(dev, &charger->psy_chg_d, &charger_cfg);
+ if (IS_ERR(charger->psy_chg))
+ return dev_err_probe(dev, PTR_ERR(charger->psy_chg),
+ "Failed to register power supply\n");
+
+ return 0;
+}
+
+static const struct of_device_id max77659_charger_of_id[] = {
+ { .compatible = "adi,max77659-charger" },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, max77659_charger_of_id);
+
+static const struct platform_device_id max77659_charger_id[] = {
+ { MAX77659_CHARGER_NAME, 0, },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(platform, max77659_charger_id);
+
+static struct platform_driver max77659_charger_driver = {
+ .driver = {
+ .name = MAX77659_CHARGER_NAME,
+ .of_match_table = of_match_ptr(max77659_charger_of_id),
+ },
+ .probe = max77659_charger_probe,
+ .id_table = max77659_charger_id,
+};
+
+module_platform_driver(max77659_charger_driver);
+
+MODULE_DESCRIPTION("MAX77659 Charger Driver");
+MODULE_AUTHOR("Nurettin.Bolucu@analog.com, Zeynep.Arslanbenzer@analog.com");
+MODULE_LICENSE("GPL");
+MODULE_VERSION("1.0");
--
2.25.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 4/6] dt-bindings: power: supply: add MAX77659 charger binding
2022-12-20 13:22 [PATCH 0/6] drivers: mfd: Add MAX77659 MFD and related device drivers Zeynep Arslanbenzer
` (2 preceding siblings ...)
2022-12-20 13:22 ` [PATCH 3/6] drivers: power: supply: add MAX77659 charger support Zeynep Arslanbenzer
@ 2022-12-20 13:22 ` Zeynep Arslanbenzer
2022-12-20 14:54 ` Krzysztof Kozlowski
2022-12-20 13:22 ` [PATCH 5/6] drivers: regulator: add MAX77659 regulator support Zeynep Arslanbenzer
2022-12-20 13:22 ` [PATCH 6/6] dt-bindings: regulator: add MAX77659 regulator binding Zeynep Arslanbenzer
5 siblings, 1 reply; 18+ messages in thread
From: Zeynep Arslanbenzer @ 2022-12-20 13:22 UTC (permalink / raw)
To: lee, robh+dt, krzysztof.kozlowski+dt, sre, lgirdwood, broonie
Cc: Zeynep.Arslanbenzer, Nurettin.Bolucu, linux-kernel, devicetree,
linux-pm
This patch adds device tree binding documentation for MAX77659 charger.
Signed-off-by: Nurettin Bolucu <Nurettin.Bolucu@analog.com>
Signed-off-by: Zeynep Arslanbenzer <Zeynep.Arslanbenzer@analog.com>
---
.../power/supply/adi,max77659-charger.yaml | 42 +++++++++++++++++++
MAINTAINERS | 1 +
2 files changed, 43 insertions(+)
create mode 100644 Documentation/devicetree/bindings/power/supply/adi,max77659-charger.yaml
diff --git a/Documentation/devicetree/bindings/power/supply/adi,max77659-charger.yaml b/Documentation/devicetree/bindings/power/supply/adi,max77659-charger.yaml
new file mode 100644
index 000000000000..24f8b5a2bd84
--- /dev/null
+++ b/Documentation/devicetree/bindings/power/supply/adi,max77659-charger.yaml
@@ -0,0 +1,42 @@
+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/power/supply/adi,max77659-charger.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Battery charger for MAX77659 PMIC from ADI.
+
+maintainers:
+ - Nurettin Bolucu <Nurettin.Bolucu@analog.com>
+ - Zeynep Arslanbenzer <Zeynep.Arslanbenzer@analog.com>
+
+description: |
+ This module is part of the MAX77659 MFD device. For more details
+ see Documentation/devicetree/bindings/mfd/adi,max77659.yaml.
+
+ The charger is represented as a sub-node of the PMIC node on the device tree.
+
+properties:
+ compatible:
+ const: adi,max77659-charger
+
+ reg:
+ maxItems: 1
+
+ adi,fast-charge-timer:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ description: Fast-charge safety timer value (in hours).
+
+ adi,fast-charge-microamp:
+ description: Fast-charge constant current value.
+
+ adi,topoff-timer:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ description: Top-Off timer value (in minutes).
+
+required:
+ - compatible
+
+additionalProperties: false
+
+...
diff --git a/MAINTAINERS b/MAINTAINERS
index b3e307163063..5cb8fa452f2d 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -12646,6 +12646,7 @@ M: Zeynep Arslanbenzer <Zeynep.Arslanbenzer@analog.com>
L: linux-kernel@vger.kernel.org
S: Maintained
F: Documentation/devicetree/bindings/mfd/adi,max77659.yaml
+F: Documentation/devicetree/bindings/power/supply/adi,max77659-charger.yaml
F: drivers/mfd/max77659.c
F: drivers/power/supply/max77659-charger.c
F: include/linux/mfd/max77659.h
--
2.25.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 5/6] drivers: regulator: add MAX77659 regulator support
2022-12-20 13:22 [PATCH 0/6] drivers: mfd: Add MAX77659 MFD and related device drivers Zeynep Arslanbenzer
` (3 preceding siblings ...)
2022-12-20 13:22 ` [PATCH 4/6] dt-bindings: power: supply: add MAX77659 charger binding Zeynep Arslanbenzer
@ 2022-12-20 13:22 ` Zeynep Arslanbenzer
2022-12-20 13:22 ` [PATCH 6/6] dt-bindings: regulator: add MAX77659 regulator binding Zeynep Arslanbenzer
5 siblings, 0 replies; 18+ messages in thread
From: Zeynep Arslanbenzer @ 2022-12-20 13:22 UTC (permalink / raw)
To: lee, robh+dt, krzysztof.kozlowski+dt, sre, lgirdwood, broonie
Cc: Zeynep.Arslanbenzer, Nurettin.Bolucu, linux-kernel, devicetree,
linux-pm
This patch adds regulator driver for MAX77659.
Signed-off-by: Nurettin Bolucu <Nurettin.Bolucu@analog.com>
Signed-off-by: Zeynep Arslanbenzer <Zeynep.Arslanbenzer@analog.com>
---
MAINTAINERS | 1 +
drivers/regulator/Kconfig | 8 +++
drivers/regulator/Makefile | 1 +
drivers/regulator/max77659-regulator.c | 98 ++++++++++++++++++++++++++
4 files changed, 108 insertions(+)
create mode 100644 drivers/regulator/max77659-regulator.c
diff --git a/MAINTAINERS b/MAINTAINERS
index 5cb8fa452f2d..13c062a8cda2 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -12649,6 +12649,7 @@ F: Documentation/devicetree/bindings/mfd/adi,max77659.yaml
F: Documentation/devicetree/bindings/power/supply/adi,max77659-charger.yaml
F: drivers/mfd/max77659.c
F: drivers/power/supply/max77659-charger.c
+F: drivers/regulator/max77659-regulator.c
F: include/linux/mfd/max77659.h
MAXIM MAX77714 PMIC MFD DRIVER
diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index 820c9a0788e5..4a9852c7050f 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -573,6 +573,14 @@ config REGULATOR_MAX77650
Semiconductor. This device has a SIMO with three independent
power rails and an LDO.
+config REGULATOR_MAX77659
+ tristate "Analog Devices MAX77659 Regulator"
+ depends on MFD_MAX77659
+ help
+ Regulator driver for MAX77659 PMIC from Analog Devices.
+ This driver supports an LDO regulator.
+ Say Y here to enable the regulator driver.
+
config REGULATOR_MAX8649
tristate "Maxim 8649 voltage regulator"
depends on I2C
diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile
index b9f5eb35bf5f..a7e91b56fb3f 100644
--- a/drivers/regulator/Makefile
+++ b/drivers/regulator/Makefile
@@ -70,6 +70,7 @@ obj-$(CONFIG_REGULATOR_MAX1586) += max1586.o
obj-$(CONFIG_REGULATOR_MAX597X) += max597x-regulator.o
obj-$(CONFIG_REGULATOR_MAX77620) += max77620-regulator.o
obj-$(CONFIG_REGULATOR_MAX77650) += max77650-regulator.o
+obj-$(CONFIG_REGULATOR_MAX77659) += max77659-regulator.o
obj-$(CONFIG_REGULATOR_MAX8649) += max8649.o
obj-$(CONFIG_REGULATOR_MAX8660) += max8660.o
obj-$(CONFIG_REGULATOR_MAX8893) += max8893.o
diff --git a/drivers/regulator/max77659-regulator.c b/drivers/regulator/max77659-regulator.c
new file mode 100644
index 000000000000..03a565013851
--- /dev/null
+++ b/drivers/regulator/max77659-regulator.c
@@ -0,0 +1,98 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include <linux/mfd/max77659.h>
+#include <linux/of_irq.h>
+#include <linux/platform_device.h>
+#include <linux/power_supply.h>
+#include <linux/regulator/driver.h>
+#include <linux/regulator/of_regulator.h>
+
+#define MAX77659_LDO_VOLT_REG_MAX 0x7F
+#define MAX77659_LDO_VOLT_N_RANGE 0x80
+#define MAX77659_LDO_VOLT_STEP 25000
+#define MAX77659_LDO_VOLT_BASE 500000
+
+#define MAX77659_REG_CNFG_LDO0_A 0x38
+#define MAX77659_REG_CNFG_LDO0_B 0x39
+
+#define MAX77659_BITS_CONFIG_LDO0_A_TV_LDO GENMASK(6, 0)
+#define MAX77659_BITS_CONFIG_LDO0_B_EN_LDO GENMASK(2, 0)
+
+/*
+ * 0.500 to 3.675V (25mV step)
+ */
+static const struct linear_range MAX77659_LDO_volts[] = {
+ REGULATOR_LINEAR_RANGE(MAX77659_LDO_VOLT_BASE, 0x00, MAX77659_LDO_VOLT_REG_MAX,
+ MAX77659_LDO_VOLT_STEP),
+};
+
+static const struct regulator_ops max77659_LDO_ops = {
+ .list_voltage = regulator_list_voltage_linear_range,
+ .map_voltage = regulator_map_voltage_ascend,
+ .is_enabled = regulator_is_enabled_regmap,
+ .enable = regulator_enable_regmap,
+ .disable = regulator_disable_regmap,
+ .get_voltage_sel = regulator_get_voltage_sel_regmap,
+ .set_voltage_sel = regulator_set_voltage_sel_regmap,
+};
+
+static struct regulator_desc max77659_LDO_desc = {
+ .name = "LDO",
+ .id = 0,
+ .regulators_node = of_match_ptr("regulator"),
+ .ops = &max77659_LDO_ops,
+ .type = REGULATOR_VOLTAGE,
+ .owner = THIS_MODULE,
+ .n_linear_ranges = MAX77659_LDO_VOLT_N_RANGE,
+ .linear_ranges = MAX77659_LDO_volts,
+ .vsel_reg = MAX77659_REG_CNFG_LDO0_A,
+ .vsel_mask = MAX77659_BITS_CONFIG_LDO0_A_TV_LDO,
+ .enable_reg = MAX77659_REG_CNFG_LDO0_B,
+ .enable_mask = MAX77659_BITS_CONFIG_LDO0_B_EN_LDO,
+ .enable_val = 0x06,
+ .disable_val = 0x04,
+};
+
+static int max77659_regulator_probe(struct platform_device *pdev)
+{
+ struct regulator_dev *rdev;
+ struct regulator_config config = {};
+
+ config.dev = &pdev->dev;
+
+ rdev = devm_regulator_register(&pdev->dev, &max77659_LDO_desc, &config);
+
+ if (IS_ERR(rdev))
+ return dev_err_probe(&pdev->dev, PTR_ERR(rdev),
+ "Failed to register regulator %s\n", max77659_LDO_desc.name);
+
+ return 0;
+}
+
+static const struct of_device_id max77659_regulator_of_id[] = {
+ { .compatible = "adi,max77659-regulator" },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, max77659_regulator_of_id);
+
+static const struct platform_device_id max77659_regulator_id[] = {
+ { MAX77659_REGULATOR_NAME, 0, },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(platform, max77659_regulator_id);
+
+static struct platform_driver max77659_regulator_driver = {
+ .driver = {
+ .name = MAX77659_REGULATOR_NAME,
+ .of_match_table = of_match_ptr(max77659_regulator_of_id),
+ },
+ .probe = max77659_regulator_probe,
+ .id_table = max77659_regulator_id,
+};
+
+module_platform_driver(max77659_regulator_driver);
+
+MODULE_DESCRIPTION("max77659 Regulator Driver");
+MODULE_AUTHOR("Nurettin.Bolucu@analog.com, Zeynep.Arslanbenzer@analog.com");
+MODULE_LICENSE("GPL");
+MODULE_VERSION("1.0");
--
2.25.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 6/6] dt-bindings: regulator: add MAX77659 regulator binding
2022-12-20 13:22 [PATCH 0/6] drivers: mfd: Add MAX77659 MFD and related device drivers Zeynep Arslanbenzer
` (4 preceding siblings ...)
2022-12-20 13:22 ` [PATCH 5/6] drivers: regulator: add MAX77659 regulator support Zeynep Arslanbenzer
@ 2022-12-20 13:22 ` Zeynep Arslanbenzer
2022-12-20 14:55 ` Krzysztof Kozlowski
5 siblings, 1 reply; 18+ messages in thread
From: Zeynep Arslanbenzer @ 2022-12-20 13:22 UTC (permalink / raw)
To: lee, robh+dt, krzysztof.kozlowski+dt, sre, lgirdwood, broonie
Cc: Zeynep.Arslanbenzer, Nurettin.Bolucu, linux-kernel, devicetree,
linux-pm
This patch adds device tree binding documentation for MAX77659 regulator.
Signed-off-by: Nurettin Bolucu <Nurettin.Bolucu@analog.com>
Signed-off-by: Zeynep Arslanbenzer <Zeynep.Arslanbenzer@analog.com>
---
.../regulator/adi,max77659-regulator.yaml | 31 +++++++++++++++++++
MAINTAINERS | 1 +
2 files changed, 32 insertions(+)
create mode 100644 Documentation/devicetree/bindings/regulator/adi,max77659-regulator.yaml
diff --git a/Documentation/devicetree/bindings/regulator/adi,max77659-regulator.yaml b/Documentation/devicetree/bindings/regulator/adi,max77659-regulator.yaml
new file mode 100644
index 000000000000..c1e2d88be25b
--- /dev/null
+++ b/Documentation/devicetree/bindings/regulator/adi,max77659-regulator.yaml
@@ -0,0 +1,31 @@
+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/regulator/adi,max77659-regulator.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Regulator driver for MAX77659 PMIC from ADI.
+
+maintainers:
+ - Nurettin Bolucu <Nurettin.Bolucu@analog.com>
+ - Zeynep Arslanbenzer <Zeynep.Arslanbenzer@analog.com>
+
+description: |
+ This module is part of the MAX77659 MFD device. For more details
+ see Documentation/devicetree/bindings/mfd/adi,max77659.yaml.
+
+ The regulator is represented as a sub-node of the PMIC node on the device tree.
+
+properties:
+ compatible:
+ const: adi,max77650-regulator
+
+ regulator-boot-on: true
+ regulator-always-on: true
+
+required:
+ - compatible
+
+additionalProperties: false
+
+...
diff --git a/MAINTAINERS b/MAINTAINERS
index 13c062a8cda2..a10fff677b0b 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -12647,6 +12647,7 @@ L: linux-kernel@vger.kernel.org
S: Maintained
F: Documentation/devicetree/bindings/mfd/adi,max77659.yaml
F: Documentation/devicetree/bindings/power/supply/adi,max77659-charger.yaml
+F: Documentation/devicetree/bindings/regulator/adi,max77659-regulator.yaml
F: drivers/mfd/max77659.c
F: drivers/power/supply/max77659-charger.c
F: drivers/regulator/max77659-regulator.c
--
2.25.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH 2/6] dt-bindings: mfd: add MAX77659 binding
2022-12-20 13:22 ` [PATCH 2/6] dt-bindings: mfd: add MAX77659 binding Zeynep Arslanbenzer
@ 2022-12-20 14:43 ` Krzysztof Kozlowski
2022-12-20 16:40 ` Rob Herring
1 sibling, 0 replies; 18+ messages in thread
From: Krzysztof Kozlowski @ 2022-12-20 14:43 UTC (permalink / raw)
To: Zeynep Arslanbenzer, lee, robh+dt, krzysztof.kozlowski+dt, sre,
lgirdwood, broonie
Cc: Nurettin.Bolucu, linux-kernel, devicetree, linux-pm
On 20/12/2022 14:22, Zeynep Arslanbenzer wrote:
> This patch adds binding document for MAX77659 MFD driver.
1. Do not use "This commit/patch".
https://elixir.bootlin.com/linux/v5.17.1/source/Documentation/process/submitting-patches.rst#L95
2. Subject: drop second, redundant "binding".
>
> Signed-off-by: Nurettin Bolucu <Nurettin.Bolucu@analog.com>
> Signed-off-by: Zeynep Arslanbenzer <Zeynep.Arslanbenzer@analog.com>
> ---
> .../devicetree/bindings/mfd/adi,max77659.yaml | 70 +++++++++++++++++++
> MAINTAINERS | 1 +
> 2 files changed, 71 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/mfd/adi,max77659.yaml
>
> diff --git a/Documentation/devicetree/bindings/mfd/adi,max77659.yaml b/Documentation/devicetree/bindings/mfd/adi,max77659.yaml
> new file mode 100644
> index 000000000000..6bec11607615
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/mfd/adi,max77659.yaml
> @@ -0,0 +1,70 @@
> +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/mfd/adi,max77659.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: MAX77659 SIMO PMIC from ADI.
Drop full stop.
> +
> +maintainers:
> + - Nurettin Bolucu <Nurettin.Bolucu@analog.com>
> + - Zeynep Arslanbenzer <Zeynep.Arslanbenzer@analog.com>
> +
> +description: |
> + MAX77659 is an PMIC providing battery charging and power
> + supply solutions for low-power applications.
> +
> + For device-tree bindings of other sub-modules (regulator, power supply
> + refer to the binding documents under the respective
> + sub-system directories.
Drop this part, not really relevant.
> +
> +properties:
> + compatible:
> + const: adi,max77659
> +
> + reg:
> + description:
> + I2C device address.
Drop description.
> + maxItems: 1
> +
> + interrupts:
> + maxItems: 1
> +
> + charger:
> + $ref: ../power/supply/adi,max77659-charger.yaml
Full path, so /schemas/
There is no such file so you did not test the patch.
> +
> + regulator:
> + $ref: ../regulator/adi,max77659-regulator.yaml
Ditto
There is no such file so you did not test the patch.
> +
> +required:
> + - compatible
> + - reg
> + - interrupts
> +
> +additionalProperties: false
> +
> +examples:
> + - |
> + #include <dt-bindings/interrupt-controller/irq.h>
> + i2c {
> + #address-cells = <1>;
> + #size-cells = <0>;
> + pmic@40 {
> + compatible = "adi,max77659";
> + reg = <0x40>;
> + interrupt-parent = <&gpio>;
> + #interrupt-cells = <2>;
> + interrupts = <16 IRQ_TYPE_EDGE_FALLING>;
> + regulator {
> + compatible = "adi,max77659-regulator";
> + regulator-boot-on;
> + regulator-always-on;
> + };
> + charger {
> + compatible = "adi,max77659-charger";
> + adi,fast-charge-timer = <5>;
That's not DT coding style...
> + adi,fast-charge-microamp = <15000>;
> + adi,topoff-timer = <30>;
Same problem.
>
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 1/6] drivers: mfd: add MAX77659 PMIC support
2022-12-20 13:22 ` [PATCH 1/6] drivers: mfd: add MAX77659 PMIC support Zeynep Arslanbenzer
@ 2022-12-20 14:47 ` Krzysztof Kozlowski
0 siblings, 0 replies; 18+ messages in thread
From: Krzysztof Kozlowski @ 2022-12-20 14:47 UTC (permalink / raw)
To: Zeynep Arslanbenzer, lee, robh+dt, krzysztof.kozlowski+dt, sre,
lgirdwood, broonie
Cc: Nurettin.Bolucu, linux-kernel, devicetree, linux-pm
On 20/12/2022 14:22, Zeynep Arslanbenzer wrote:
> This patch adds MFD driver for MAX77659 to enable its sub
> devices.
>
> The MAX77659 is a multi-function devices. It includes
> charger and regulator
>
> Signed-off-by: Nurettin Bolucu <Nurettin.Bolucu@analog.com>
> Signed-off-by: Zeynep Arslanbenzer <Zeynep.Arslanbenzer@analog.com>
> ---
> MAINTAINERS | 8 ++
> drivers/mfd/Kconfig | 14 +++
> drivers/mfd/Makefile | 1 +
> drivers/mfd/max77659.c | 188 +++++++++++++++++++++++++++++++++++
> include/linux/mfd/max77659.h | 60 +++++++++++
> 5 files changed, 271 insertions(+)
> create mode 100644 drivers/mfd/max77659.c
> create mode 100644 include/linux/mfd/max77659.h
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index a608f19da3a9..45a8a471c7c0 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -12640,6 +12640,14 @@ F: drivers/power/supply/max77650-charger.c
> F: drivers/regulator/max77650-regulator.c
> F: include/linux/mfd/max77650.h
> + ret = regmap_read(me->regmap, MAX77659_REG_INT_CHG, &val);
> + if (ret)
> + return dev_err_probe(dev, ret,
> + "Unable to read Charger Interrupt Status register\n");
> + ret = device_init_wakeup(dev, true);
> + if (ret)
> + return dev_err_probe(dev, ret, "Unable to init wakeup\n");
> +
> + ret = devm_mfd_add_devices(dev, -1, max77659_devs, ARRAY_SIZE(max77659_devs),
> + NULL, 0, NULL);
> + if (ret)
> + return dev_err_probe(dev, ret, "Failed to add sub-devices\n");
> +
> + enable_irq_wake(me->irq);
You do not allow a wakeup-source in DT, do you?
> +
> + return 0;
> +}
> +
> +static int max77659_i2c_probe(struct i2c_client *client)
> +{
> + struct max77659_dev *me;
Do you see other MFD driver calling this "me"? Please submit code which
is consistent with Linux style, not with your own.
> +
> + me = devm_kzalloc(&client->dev, sizeof(*me), GFP_KERNEL);
> + if (!me)
> + return -ENOMEM;
> +
> + i2c_set_clientdata(client, me);
> + me->dev = &client->dev;
> + me->irq = client->irq;
> +
> + me->regmap = devm_regmap_init_i2c(client, &max77659_regmap_config);
> +
> + if (IS_ERR(me->regmap))
> + return dev_err_probe(&client->dev, PTR_ERR(me->regmap),
> + "Failed to allocate register map\n");
> +
> + return max77659_pmic_setup(me);
> +}
> +
> +static const struct of_device_id max77659_of_id[] = {
> + { .compatible = "adi,max77659" },
> + { /* sentinel */ }
> +};
> +MODULE_DEVICE_TABLE(of, max77659_of_id);
> +
> +static const struct i2c_device_id max77659_i2c_id[] = {
> + { MAX77659_NAME, 0 },
Nope. Use proper string.
> + { /* sentinel */ }
> +};
> +MODULE_DEVICE_TABLE(i2c, max77659_i2c_id);
> +
> +static struct i2c_driver max77659_i2c_driver = {
> + .driver = {
> + .name = MAX77659_NAME,
> + .of_match_table = of_match_ptr(max77659_of_id),
You will have warnings here, so the patch was not really compile tested.
Drop of_match_ptr() and check your code before sending (W=1, smatch,
sparse, coccinelle)
> + },
> + .probe_new = max77659_i2c_probe,
> + .id_table = max77659_i2c_id,
> +};
> +
> +module_i2c_driver(max77659_i2c_driver);
> +
> +MODULE_DESCRIPTION("max77659 MFD Driver");
> +MODULE_AUTHOR("Nurettin.Bolucu@analog.com, Zeynep.Arslanbenzer@analog.com");
> +MODULE_LICENSE("GPL");
> +MODULE_VERSION("1.0");
> diff --git a/include/linux/mfd/max77659.h b/include/linux/mfd/max77659.h
> new file mode 100644
> index 000000000000..ef781e6e54c2
> --- /dev/null
> +++ b/include/linux/mfd/max77659.h
> @@ -0,0 +1,60 @@
> +/* SPDX-License-Identifier: GPL-2.0-or-later */
> +
> +#ifndef __MAX77659_MFD_H__
> +#define __MAX77659_MFD_H__
Header guard should be more descriptive (with pieces of path)
> +
> +#include <linux/bits.h>
> +
> +#define MAX77659_NAME "max77659"
Not really for include.
> +
> +#define MAX77659_REGULATOR_NAME MAX77659_NAME "-regulator"
> +#define MAX77659_CHARGER_NAME MAX77659_NAME "-charger"
Neither these.
> +
> +#define MAX77659_REG_INT_GLBL0 0x00
> +#define MAX77659_REG_INT_CHG 0x01
> +#define MAX77659_REG_INT_GLBL1 0x04
> +#define MAX77659_REG_INT_M_CHG 0x07
> +#define MAX77659_REG_INTM_GLBL1 0x08
> +#define MAX77659_REG_INTM_GLBL0 0x09
That's absolutely unreadable code.
> +
> +#define MAX77659_INT_GLBL0_MASK 0xFF
> +#define MAX77659_INT_GLBL1_MASK 0x33
> +
> +#define MAX77659_BIT_INT_GLBL0_GPIO0_F BIT(0)
> +#define MAX77659_BIT_INT_GLBL0_GPIO0_R BIT(1)
> +#define MAX77659_BIT_INT_GLBL0_EN_F BIT(2)
> +#define MAX77659_BIT_INT_GLBL0_EN_R BIT(3)
> +#define MAX77659_BIT_INT_GLBL0_TJAL1_R BIT(4)
> +#define MAX77659_BIT_INT_GLBL0_TJAL2_R BIT(5)
> +#define MAX77659_BIT_INT_GLBL0_DOD0_R BIT(7)
> +
> +#define MAX77659_BIT_INT_GLBL1_GPI1_F BIT(0)
> +#define MAX77659_BIT_INT_GLBL1_GPI1_R BIT(1)
> +#define MAX77659_BIT_INT_GLBL1_SBB_TO BIT(4)
> +#define MAX77659_BIT_INT_GLBL1_LDO0_F BIT(5)
> +
> +#define MAX77659_BIT_INT_THM BIT(0)
> +#define MAX77659_BIT_INT_CHG BIT(1)
> +#define MAX77659_BIT_INT_CHGIN BIT(2)
> +#define MAX77659_BIT_INT_TJ_REG BIT(3)
> +#define MAX77659_BIT_INT_SYS_CTRL BIT(4)
> +
> +enum {
> + MAX77659_DEV_PMIC,
> + MAX77659_DEV_CHARGER,
> + MAX77659_DEV_REGULATOR,
> + MAX77659_NUM_DEVS,
> +};
> +
> +struct max77659_dev {
> + struct device *dev;
> +
> + int irq;
> + struct regmap_irq_chip_data *irqc_glbl0;
> + struct regmap_irq_chip_data *irqc_glbl1;
> + struct regmap_irq_chip_data *irqc_chg;
Keep your code consistent.
> +
> + struct regmap *regmap;
> +};
> +
> +#endif /* __MAX77659_MFD_H__ */
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 3/6] drivers: power: supply: add MAX77659 charger support
2022-12-20 13:22 ` [PATCH 3/6] drivers: power: supply: add MAX77659 charger support Zeynep Arslanbenzer
@ 2022-12-20 14:51 ` Krzysztof Kozlowski
2023-01-02 20:44 ` Sebastian Reichel
1 sibling, 0 replies; 18+ messages in thread
From: Krzysztof Kozlowski @ 2022-12-20 14:51 UTC (permalink / raw)
To: Zeynep Arslanbenzer, lee, robh+dt, krzysztof.kozlowski+dt, sre,
lgirdwood, broonie
Cc: Nurettin.Bolucu, linux-kernel, devicetree, linux-pm
On 20/12/2022 14:22, Zeynep Arslanbenzer wrote:
> This patch adds battery charger driver for MAX77659.
>
> Signed-off-by: Nurettin Bolucu <Nurettin.Bolucu@analog.com>
> Signed-off-by: Zeynep Arslanbenzer <Zeynep.Arslanbenzer@analog.com>
> ---
> MAINTAINERS | 1 +
> drivers/power/supply/Kconfig | 7 +
> drivers/power/supply/Makefile | 1 +
> drivers/power/supply/max77659-charger.c | 547 ++++++++++++++++++++++++
> 4 files changed, 556 insertions(+)
> create mode 100644 drivers/power/supply/max77659-charger.c
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index e7a9cadf0ff2..b3e307163063 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -12647,6 +12647,7 @@ L: linux-kernel@vger.kernel.org
> S: Maintained
> F: Documentation/devicetree/bindings/mfd/adi,max77659.yaml
> F: drivers/mfd/max77659.c
> +F: drivers/power/supply/max77659-charger.c
> F: include/linux/mfd/max77659.h
>
> MAXIM MAX77714 PMIC MFD DRIVER
> diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig
> index 0bbfe6a7ce4d..d38ef40ae9ee 100644
> --- a/drivers/power/supply/Kconfig
> +++ b/drivers/power/supply/Kconfig
> @@ -565,6 +565,13 @@ config CHARGER_MAX77650
> Say Y to enable support for the battery charger control of MAX77650
> PMICs.
>
> +config CHARGER_MAX77659
> + tristate "Analog Devices MAX77659 battery charger driver"
> + depends on MFD_MAX77659
> + help
> + Say Y to enable support for the battery charger control of MAX77659
> + PMICs.
> +
> config CHARGER_MAX77693
> tristate "Maxim MAX77693 battery charger driver"
> depends on MFD_MAX77693
> diff --git a/drivers/power/supply/Makefile b/drivers/power/supply/Makefile
> index 0ee8653e882e..e8646896bcd2 100644
> --- a/drivers/power/supply/Makefile
> +++ b/drivers/power/supply/Makefile
> @@ -76,6 +76,7 @@ obj-$(CONFIG_CHARGER_LTC4162L) += ltc4162-l-charger.o
> obj-$(CONFIG_CHARGER_MAX14577) += max14577_charger.o
> obj-$(CONFIG_CHARGER_DETECTOR_MAX14656) += max14656_charger_detector.o
> obj-$(CONFIG_CHARGER_MAX77650) += max77650-charger.o
> +obj-$(CONFIG_CHARGER_MAX77659) += max77659-charger.o
> obj-$(CONFIG_CHARGER_MAX77693) += max77693_charger.o
> obj-$(CONFIG_CHARGER_MAX77976) += max77976_charger.o
> obj-$(CONFIG_CHARGER_MAX8997) += max8997_charger.o
> diff --git a/drivers/power/supply/max77659-charger.c b/drivers/power/supply/max77659-charger.c
> new file mode 100644
> index 000000000000..dfdbd484f7cd
> --- /dev/null
> +++ b/drivers/power/supply/max77659-charger.c
> @@ -0,0 +1,547 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +
> +#include <linux/bitfield.h>
> +#include <linux/interrupt.h>
> +#include <linux/mfd/max77659.h>
> +#include <linux/module.h>
> +#include <linux/mutex.h>
> +#include <linux/of_irq.h>
> +#include <linux/platform_device.h>
> +#include <linux/power_supply.h>
> +#include <linux/regmap.h>
> +
> +#define MAX77659_IRQ_WORK_DELAY 0
> +#define MAX77659_CHARGER_CURRENT_MAX 300000
> +#define MAX77659_CHARGER_CURRENT_MIN 7500
> +#define MAX77659_CHARGER_CURRENT_STEP 7500
> +#define MAX77659_CHARGER_TOPOFF_TIMER_STEP 5
> +
> +#define MAX77659_REG_STAT_CHG_A 0x02
Same problems as your other patch - unreadable code. Two different
coding styles...
> +#define MAX77659_REG_STAT_CHG_B 0x03
> +#define MAX77659_REG_CNFG_CHG_A 0x20
> +#define MAX77659_REG_CNFG_CHG_B 0x21
> +#define MAX77659_REG_CNFG_CHG_C 0x22
> +#define MAX77659_REG_CNFG_CHG_D 0x23
> +#define MAX77659_REG_CNFG_CHG_E 0x24
> +#define MAX77659_REG_CNFG_CHG_F 0x25
> +#define MAX77659_REG_CNFG_CHG_G 0x26
> +#define MAX77659_REG_CNFG_CHG_H 0x27
> +#define MAX77659_REG_CNFG_CHG_I 0x28
> +
> +#define MAX77659_BIT_STAT_A_VSYSY_MIN_STAT BIT(4)
> +#define MAX77659_BIT_STAT_A_TJ_REG_STAT BIT(3)
> +#define MAX77659_BIT_STAT_A_THM_DTLS GENMASK(2, 0)
> +#define MAX77659_BIT_STAT_B_CHG_DTLS GENMASK(7, 4)
> +#define MAX77659_BIT_STAT_B_CHGIN_DTSL GENMASK(3, 2)
> +#define MAX77659_BIT_STAT_B_CHG BIT(1)
> +#define MAX77659_BIT_CNFG_B_CHG_EN BIT(0)
> +#define MAX77659_BIT_CNFG_C_TOPOFFTIMER GENMASK(2, 0)
> +#define MAX77659_BIT_CNFG_E_CC GENMASK(7, 2)
> +#define MAX77659_BIT_CNFG_E_TFASTCHG GENMASK(1, 0)
> +#define MAX77659_BIT_CNFG_G_CHG_CV GENMASK(7, 2)
> +
(...)
> +
> + charger->psy_chg_d.name = MAX77659_CHARGER_NAME;
> + charger->psy_chg_d.type = POWER_SUPPLY_TYPE_UNKNOWN;
> + charger->psy_chg_d.get_property = max77659_charger_get_property;
> + charger->psy_chg_d.set_property = max77659_charger_set_property;
> + charger->psy_chg_d.properties = max77659_charger_props;
> + charger->psy_chg_d.property_is_writeable = max77659_property_is_writeable;
> + charger->psy_chg_d.num_properties = ARRAY_SIZE(max77659_charger_props);
> + charger_cfg.drv_data = charger;
> + charger_cfg.supplied_to = chg_supplied_to;
> + charger_cfg.of_node = dev->of_node;
> + charger_cfg.num_supplicants = ARRAY_SIZE(chg_supplied_to);
> +
> + ret = max77659_charger_initialize(charger);
> + if (ret)
> + return dev_err_probe(dev, ret, "Failed to initialize charger\n");
> +
> + for (i = 0; i < MAX77659_CHG_IRQ_MAX; i++) {
> + charger->irq_arr[i] = regmap_irq_get_virq(max77659->irqc_chg, i);
> +
> + if (charger->irq_arr[i] < 0)
> + return dev_err_probe(dev, -EINVAL,
> + "Invalid IRQ for MAX77659_CHG_IRQ %d\n", i);
> +
> + ret = devm_request_threaded_irq(dev, charger->irq_arr[i],
> + NULL, max77659_charger_isr, IRQF_TRIGGER_FALLING,
This does not look like wrapped to Linux coding style (which is
explicitly set at 80).
> + max77659_irq_descs[i], charger);
> + if (ret)
> + return dev_err_probe(dev, ret, "Failed to request irq: %d\n",
> + charger->irq_arr[i]);
> + }
> +
> + charger->psy_chg = devm_power_supply_register(dev, &charger->psy_chg_d, &charger_cfg);
> + if (IS_ERR(charger->psy_chg))
> + return dev_err_probe(dev, PTR_ERR(charger->psy_chg),
> + "Failed to register power supply\n");
> +
> + return 0;
> +}
> +
> +static const struct of_device_id max77659_charger_of_id[] = {
> + { .compatible = "adi,max77659-charger" },
> + { /* sentinel */ }
> +};
> +MODULE_DEVICE_TABLE(of, max77659_charger_of_id);
> +
> +static const struct platform_device_id max77659_charger_id[] = {
> + { MAX77659_CHARGER_NAME, 0, },
Same comment.
> + { /* sentinel */ }
> +};
> +MODULE_DEVICE_TABLE(platform, max77659_charger_id);
> +
> +static struct platform_driver max77659_charger_driver = {
> + .driver = {
> + .name = MAX77659_CHARGER_NAME,
> + .of_match_table = of_match_ptr(max77659_charger_of_id),
Same problem.
> + },
> + .probe = max77659_charger_probe,
> + .id_table = max77659_charger_id,
> +};
> +
> +module_platform_driver(max77659_charger_driver);
> +
> +MODULE_DESCRIPTION("MAX77659 Charger Driver");
> +MODULE_AUTHOR("Nurettin.Bolucu@analog.com, Zeynep.Arslanbenzer@analog.com");
> +MODULE_LICENSE("GPL");
> +MODULE_VERSION("1.0");
Drop version. From all possible places.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 4/6] dt-bindings: power: supply: add MAX77659 charger binding
2022-12-20 13:22 ` [PATCH 4/6] dt-bindings: power: supply: add MAX77659 charger binding Zeynep Arslanbenzer
@ 2022-12-20 14:54 ` Krzysztof Kozlowski
2023-04-17 21:43 ` Arslanbenzer, Zeynep
0 siblings, 1 reply; 18+ messages in thread
From: Krzysztof Kozlowski @ 2022-12-20 14:54 UTC (permalink / raw)
To: Zeynep Arslanbenzer, lee, robh+dt, krzysztof.kozlowski+dt, sre,
lgirdwood, broonie
Cc: Nurettin.Bolucu, linux-kernel, devicetree, linux-pm
On 20/12/2022 14:22, Zeynep Arslanbenzer wrote:
> This patch adds device tree binding documentation for MAX77659 charger.
Do not use "This commit/patch".
https://elixir.bootlin.com/linux/v5.17.1/source/Documentation/process/submitting-patches.rst#L95
>
> Signed-off-by: Nurettin Bolucu <Nurettin.Bolucu@analog.com>
> Signed-off-by: Zeynep Arslanbenzer <Zeynep.Arslanbenzer@analog.com>
> ---
> .../power/supply/adi,max77659-charger.yaml | 42 +++++++++++++++++++
> MAINTAINERS | 1 +
> 2 files changed, 43 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/power/supply/adi,max77659-charger.yaml
>
> diff --git a/Documentation/devicetree/bindings/power/supply/adi,max77659-charger.yaml b/Documentation/devicetree/bindings/power/supply/adi,max77659-charger.yaml
> new file mode 100644
> index 000000000000..24f8b5a2bd84
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/power/supply/adi,max77659-charger.yaml
> @@ -0,0 +1,42 @@
> +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/power/supply/adi,max77659-charger.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Battery charger for MAX77659 PMIC from ADI.
Drop full stop.
> +
> +maintainers:
> + - Nurettin Bolucu <Nurettin.Bolucu@analog.com>
> + - Zeynep Arslanbenzer <Zeynep.Arslanbenzer@analog.com>
> +
> +description: |
> + This module is part of the MAX77659 MFD device. For more details
> + see Documentation/devicetree/bindings/mfd/adi,max77659.yaml.
> +
> + The charger is represented as a sub-node of the PMIC node on the device tree.
> +
> +properties:
> + compatible:
> + const: adi,max77659-charger
> +
> + reg:
> + maxItems: 1
> +
> + adi,fast-charge-timer:
> + $ref: /schemas/types.yaml#/definitions/uint32
> + description: Fast-charge safety timer value (in hours).
No, use suffixes for common units.
> +
> + adi,fast-charge-microamp:
> + description: Fast-charge constant current value.
> +
> + adi,topoff-timer:
> + $ref: /schemas/types.yaml#/definitions/uint32
> + description: Top-Off timer value (in minutes).
No, use suffixes for common units.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 6/6] dt-bindings: regulator: add MAX77659 regulator binding
2022-12-20 13:22 ` [PATCH 6/6] dt-bindings: regulator: add MAX77659 regulator binding Zeynep Arslanbenzer
@ 2022-12-20 14:55 ` Krzysztof Kozlowski
0 siblings, 0 replies; 18+ messages in thread
From: Krzysztof Kozlowski @ 2022-12-20 14:55 UTC (permalink / raw)
To: Zeynep Arslanbenzer, lee, robh+dt, krzysztof.kozlowski+dt, sre,
lgirdwood, broonie
Cc: Nurettin.Bolucu, linux-kernel, devicetree, linux-pm
On 20/12/2022 14:22, Zeynep Arslanbenzer wrote:
> This patch adds device tree binding documentation for MAX77659 regulator.
Do not use "This commit/patch".
https://elixir.bootlin.com/linux/v5.17.1/source/Documentation/process/submitting-patches.rst#L95
>
> Signed-off-by: Nurettin Bolucu <Nurettin.Bolucu@analog.com>
> Signed-off-by: Zeynep Arslanbenzer <Zeynep.Arslanbenzer@analog.com>
> ---
> .../regulator/adi,max77659-regulator.yaml | 31 +++++++++++++++++++
> MAINTAINERS | 1 +
> 2 files changed, 32 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/regulator/adi,max77659-regulator.yaml
>
> diff --git a/Documentation/devicetree/bindings/regulator/adi,max77659-regulator.yaml b/Documentation/devicetree/bindings/regulator/adi,max77659-regulator.yaml
> new file mode 100644
> index 000000000000..c1e2d88be25b
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/regulator/adi,max77659-regulator.yaml
> @@ -0,0 +1,31 @@
> +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/regulator/adi,max77659-regulator.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Regulator driver for MAX77659 PMIC from ADI.
It's not a driver. Drop.
Also full stop
> +
> +maintainers:
> + - Nurettin Bolucu <Nurettin.Bolucu@analog.com>
> + - Zeynep Arslanbenzer <Zeynep.Arslanbenzer@analog.com>
> +
> +description: |
> + This module is part of the MAX77659 MFD device. For more details
> + see Documentation/devicetree/bindings/mfd/adi,max77659.yaml.
> +
> + The regulator is represented as a sub-node of the PMIC node on the device tree.
> +
> +properties:
> + compatible:
> + const: adi,max77650-regulator
> +
> + regulator-boot-on: true
> + regulator-always-on: true
> +
Missing reference to regulator schema.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 2/6] dt-bindings: mfd: add MAX77659 binding
2022-12-20 13:22 ` [PATCH 2/6] dt-bindings: mfd: add MAX77659 binding Zeynep Arslanbenzer
2022-12-20 14:43 ` Krzysztof Kozlowski
@ 2022-12-20 16:40 ` Rob Herring
1 sibling, 0 replies; 18+ messages in thread
From: Rob Herring @ 2022-12-20 16:40 UTC (permalink / raw)
To: Zeynep Arslanbenzer
Cc: lgirdwood, linux-pm, broonie, lee, Nurettin.Bolucu, robh+dt,
linux-kernel, krzysztof.kozlowski+dt, sre, devicetree
On Tue, 20 Dec 2022 16:22:46 +0300, Zeynep Arslanbenzer wrote:
> This patch adds binding document for MAX77659 MFD driver.
>
> Signed-off-by: Nurettin Bolucu <Nurettin.Bolucu@analog.com>
> Signed-off-by: Zeynep Arslanbenzer <Zeynep.Arslanbenzer@analog.com>
> ---
> .../devicetree/bindings/mfd/adi,max77659.yaml | 70 +++++++++++++++++++
> MAINTAINERS | 1 +
> 2 files changed, 71 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/mfd/adi,max77659.yaml
>
My bot found errors running 'make DT_CHECKER_FLAGS=-m dt_binding_check'
on your patch (DT_CHECKER_FLAGS is new in v5.13):
yamllint warnings/errors:
dtschema/dtc warnings/errors:
./Documentation/devicetree/bindings/mfd/adi,max77659.yaml: Unable to find schema file matching $id: http://devicetree.org/schemas/power/supply/adi,max77659-charger.yaml
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/mfd/adi,max77659.example.dtb: pmic@40: charger: False schema does not allow {'compatible': ['adi,max77659-charger'], 'adi,fast-charge-timer': [[5]], 'adi,fast-charge-microamp': [[15000]], 'adi,topoff-timer': [[30]]}
From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/mfd/adi,max77659.yaml
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/mfd/adi,max77659.example.dtb: pmic@40: regulator: False schema does not allow {'compatible': ['adi,max77659-regulator'], 'regulator-boot-on': True, 'regulator-always-on': True}
From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/mfd/adi,max77659.yaml
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/mfd/adi,max77659.example.dtb: pmic@40: '#interrupt-cells' does not match any of the regexes: 'pinctrl-[0-9]+'
From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/mfd/adi,max77659.yaml
Documentation/devicetree/bindings/mfd/adi,max77659.example.dtb:0:0: /example-0/i2c/pmic@40/regulator: failed to match any schema with compatible: ['adi,max77659-regulator']
Documentation/devicetree/bindings/mfd/adi,max77659.example.dtb:0:0: /example-0/i2c/pmic@40/charger: failed to match any schema with compatible: ['adi,max77659-charger']
doc reference errors (make refcheckdocs):
See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/20221220132250.19383-3-Zeynep.Arslanbenzer@analog.com
The base for the series is generally the latest rc1. A different dependency
should be noted in *this* patch.
If you already ran 'make dt_binding_check' and didn't see the above
error(s), then make sure 'yamllint' is installed and dt-schema is up to
date:
pip3 install dtschema --upgrade
Please check and re-submit after running the above command yourself. Note
that DT_SCHEMA_FILES can be set to your schema file to speed up checking
your schema. However, it must be unset to test all examples with your schema.
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 3/6] drivers: power: supply: add MAX77659 charger support
2022-12-20 13:22 ` [PATCH 3/6] drivers: power: supply: add MAX77659 charger support Zeynep Arslanbenzer
2022-12-20 14:51 ` Krzysztof Kozlowski
@ 2023-01-02 20:44 ` Sebastian Reichel
1 sibling, 0 replies; 18+ messages in thread
From: Sebastian Reichel @ 2023-01-02 20:44 UTC (permalink / raw)
To: Zeynep Arslanbenzer
Cc: lee, robh+dt, krzysztof.kozlowski+dt, lgirdwood, broonie,
Nurettin.Bolucu, linux-kernel, devicetree, linux-pm
[-- Attachment #1: Type: text/plain, Size: 21179 bytes --]
Hi,
On Tue, Dec 20, 2022 at 04:22:47PM +0300, Zeynep Arslanbenzer wrote:
> This patch adds battery charger driver for MAX77659.
>
> Signed-off-by: Nurettin Bolucu <Nurettin.Bolucu@analog.com>
> Signed-off-by: Zeynep Arslanbenzer <Zeynep.Arslanbenzer@analog.com>
> ---
Some additional feedback.
> MAINTAINERS | 1 +
> drivers/power/supply/Kconfig | 7 +
> drivers/power/supply/Makefile | 1 +
> drivers/power/supply/max77659-charger.c | 547 ++++++++++++++++++++++++
> 4 files changed, 556 insertions(+)
> create mode 100644 drivers/power/supply/max77659-charger.c
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index e7a9cadf0ff2..b3e307163063 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -12647,6 +12647,7 @@ L: linux-kernel@vger.kernel.org
> S: Maintained
> F: Documentation/devicetree/bindings/mfd/adi,max77659.yaml
> F: drivers/mfd/max77659.c
> +F: drivers/power/supply/max77659-charger.c
> F: include/linux/mfd/max77659.h
>
> MAXIM MAX77714 PMIC MFD DRIVER
> diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig
> index 0bbfe6a7ce4d..d38ef40ae9ee 100644
> --- a/drivers/power/supply/Kconfig
> +++ b/drivers/power/supply/Kconfig
> @@ -565,6 +565,13 @@ config CHARGER_MAX77650
> Say Y to enable support for the battery charger control of MAX77650
> PMICs.
>
> +config CHARGER_MAX77659
> + tristate "Analog Devices MAX77659 battery charger driver"
> + depends on MFD_MAX77659
> + help
> + Say Y to enable support for the battery charger control of MAX77659
> + PMICs.
> +
> config CHARGER_MAX77693
> tristate "Maxim MAX77693 battery charger driver"
> depends on MFD_MAX77693
> diff --git a/drivers/power/supply/Makefile b/drivers/power/supply/Makefile
> index 0ee8653e882e..e8646896bcd2 100644
> --- a/drivers/power/supply/Makefile
> +++ b/drivers/power/supply/Makefile
> @@ -76,6 +76,7 @@ obj-$(CONFIG_CHARGER_LTC4162L) += ltc4162-l-charger.o
> obj-$(CONFIG_CHARGER_MAX14577) += max14577_charger.o
> obj-$(CONFIG_CHARGER_DETECTOR_MAX14656) += max14656_charger_detector.o
> obj-$(CONFIG_CHARGER_MAX77650) += max77650-charger.o
> +obj-$(CONFIG_CHARGER_MAX77659) += max77659-charger.o
> obj-$(CONFIG_CHARGER_MAX77693) += max77693_charger.o
> obj-$(CONFIG_CHARGER_MAX77976) += max77976_charger.o
> obj-$(CONFIG_CHARGER_MAX8997) += max8997_charger.o
> diff --git a/drivers/power/supply/max77659-charger.c b/drivers/power/supply/max77659-charger.c
> new file mode 100644
> index 000000000000..dfdbd484f7cd
> --- /dev/null
> +++ b/drivers/power/supply/max77659-charger.c
> @@ -0,0 +1,547 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +
> +#include <linux/bitfield.h>
> +#include <linux/interrupt.h>
> +#include <linux/mfd/max77659.h>
> +#include <linux/module.h>
> +#include <linux/mutex.h>
> +#include <linux/of_irq.h>
> +#include <linux/platform_device.h>
> +#include <linux/power_supply.h>
> +#include <linux/regmap.h>
> +
> +#define MAX77659_IRQ_WORK_DELAY 0
> +#define MAX77659_CHARGER_CURRENT_MAX 300000
> +#define MAX77659_CHARGER_CURRENT_MIN 7500
> +#define MAX77659_CHARGER_CURRENT_STEP 7500
> +#define MAX77659_CHARGER_TOPOFF_TIMER_STEP 5
> +
> +#define MAX77659_REG_STAT_CHG_A 0x02
> +#define MAX77659_REG_STAT_CHG_B 0x03
> +#define MAX77659_REG_CNFG_CHG_A 0x20
> +#define MAX77659_REG_CNFG_CHG_B 0x21
> +#define MAX77659_REG_CNFG_CHG_C 0x22
> +#define MAX77659_REG_CNFG_CHG_D 0x23
> +#define MAX77659_REG_CNFG_CHG_E 0x24
> +#define MAX77659_REG_CNFG_CHG_F 0x25
> +#define MAX77659_REG_CNFG_CHG_G 0x26
> +#define MAX77659_REG_CNFG_CHG_H 0x27
> +#define MAX77659_REG_CNFG_CHG_I 0x28
> +
> +#define MAX77659_BIT_STAT_A_VSYSY_MIN_STAT BIT(4)
> +#define MAX77659_BIT_STAT_A_TJ_REG_STAT BIT(3)
> +#define MAX77659_BIT_STAT_A_THM_DTLS GENMASK(2, 0)
> +#define MAX77659_BIT_STAT_B_CHG_DTLS GENMASK(7, 4)
> +#define MAX77659_BIT_STAT_B_CHGIN_DTSL GENMASK(3, 2)
> +#define MAX77659_BIT_STAT_B_CHG BIT(1)
> +#define MAX77659_BIT_CNFG_B_CHG_EN BIT(0)
> +#define MAX77659_BIT_CNFG_C_TOPOFFTIMER GENMASK(2, 0)
> +#define MAX77659_BIT_CNFG_E_CC GENMASK(7, 2)
> +#define MAX77659_BIT_CNFG_E_TFASTCHG GENMASK(1, 0)
> +#define MAX77659_BIT_CNFG_G_CHG_CV GENMASK(7, 2)
> +
> +enum {
> + MAX77659_CHG_DTLS_OFF,
> + MAX77659_CHG_DTLS_PREQUAL,
> + MAX77659_CHG_DTLS_FASTCHARGE_CC,
> + MAX77659_CHG_DTLS_JEITA_FASTCHARGE_CC,
> + MAX77659_CHG_DTLS_FASTCHARGE_CV,
> + MAX77659_CHG_DTLS_JEITA_FASTCHARGE_CV,
> + MAX77659_CHG_DTLS_TOPOFF,
> + MAX77659_CHG_DTLS_JEITA_TOPOFF,
> + MAX77659_CHG_DTLS_DONE,
> + MAX77659_CHG_DTLS_JEITA_DONE,
> + MAX77659_CHG_DTLS_OFF_TIMER_FAULT,
> + MAX77659_CHG_DTLS_OFF_CHARGE_TIMER_FAULT,
> + MAX77659_CHG_DTLS_OFF_BATTERY_TEMP_FAULT,
> + MAX77659_CHG_DTLS_RESERVED_13,
> +};
> +
> +enum {
> + MAX77659_CHG_IRQ_THM_I,
> + MAX77659_CHG_IRQ_CHG_I,
> + MAX77659_CHG_IRQ_CHGIN_I,
> + MAX77659_CHG_IRQ_TJ_REG_I,
> + MAX77659_CHG_IRQ_SYS_CTRL_I,
> +
> + MAX77659_CHG_IRQ_MAX,
> +};
> +
> +struct max77659_charger_dev {
> + struct device *dev;
> + struct max77659_dev *max77659;
> + struct regmap *regmap;
> +
> + struct power_supply *psy_chg;
> + struct power_supply_desc psy_chg_d;
> +
> + int irq;
> + int irq_arr[MAX77659_CHG_IRQ_MAX];
> + int irq_mask;
> +
> + struct delayed_work irq_work;
> + /* mutex for charger operations*/
> + struct mutex lock;
> +
> + int present;
> + int health;
> + int status;
> + int charge_type;
> +
> + unsigned int fast_charge_current_ua;
> + unsigned int fast_charge_timer_hr;
> + unsigned int topoff_timer_min;
> +};
> +
> +static char *chg_supplied_to[] = {
> + MAX77659_CHARGER_NAME,
> +};
> +
> +static int max77659_set_charge_current(struct max77659_charger_dev *charger,
> + int fast_charge_current_ua)
> +{
> + unsigned int reg_data;
> +
> + fast_charge_current_ua = clamp_val(fast_charge_current_ua, MAX77659_CHARGER_CURRENT_MIN,
> + MAX77659_CHARGER_CURRENT_MAX);
> + reg_data = fast_charge_current_ua / MAX77659_CHARGER_CURRENT_STEP - 1;
> + reg_data = FIELD_PREP(MAX77659_BIT_CNFG_E_CC, reg_data);
> +
> + return regmap_update_bits(charger->regmap, MAX77659_REG_CNFG_CHG_E,
> + MAX77659_BIT_CNFG_E_CC, reg_data);
> +}
> +
> +static int max77659_get_charge_current(struct max77659_charger_dev *charger,
> + int *get_current)
> +{
> + struct regmap *regmap = charger->regmap;
> + unsigned int reg_data, current_val;
> + int ret;
> +
> + ret = regmap_read(regmap, MAX77659_REG_CNFG_CHG_E, ®_data);
> + if (ret)
> + return ret;
> +
> + reg_data = FIELD_GET(MAX77659_BIT_CNFG_E_CC, reg_data);
> + current_val = (reg_data + 1) * MAX77659_CHARGER_CURRENT_STEP;
> +
> + *get_current = clamp_val(current_val, MAX77659_CHARGER_CURRENT_MIN,
> + MAX77659_CHARGER_CURRENT_MAX);
> +
> + return 0;
> +}
> +
> +static int max77659_set_topoff_timer(struct max77659_charger_dev *charger, int termination_time_min)
> +{
> + unsigned int reg_data;
> +
> + termination_time_min = clamp_val(termination_time_min, 0, MAX77659_BIT_CNFG_C_TOPOFFTIMER
> + * MAX77659_CHARGER_TOPOFF_TIMER_STEP);
> + reg_data = FIELD_PREP(MAX77659_BIT_CNFG_C_TOPOFFTIMER,
> + termination_time_min / MAX77659_CHARGER_TOPOFF_TIMER_STEP);
> +
> + return regmap_update_bits(charger->regmap, MAX77659_REG_CNFG_CHG_C,
> + MAX77659_BIT_CNFG_C_TOPOFFTIMER, reg_data);
> +}
> +
> +static int max77659_charger_initialize(struct max77659_charger_dev *charger)
> +{
> + int ret;
> + unsigned int val;
> +
> + val = (MAX77659_BIT_INT_SYS_CTRL | MAX77659_BIT_INT_TJ_REG | MAX77659_BIT_INT_CHGIN |
> + MAX77659_BIT_INT_CHG | MAX77659_BIT_INT_THM);
> +
> + ret = regmap_write(charger->regmap, MAX77659_REG_INT_M_CHG, val);
> + if (ret)
> + return dev_err_probe(charger->dev, ret, "Error in writing register INT_M_CHG\n");
> +
> + ret = max77659_set_charge_current(charger, charger->fast_charge_current_ua);
> + if (ret)
> + return dev_err_probe(charger->dev, ret, "Error in writing register CNFG_CHG_C\n");
> +
> + if (charger->fast_charge_timer_hr == 0 || charger->fast_charge_timer_hr > 7)
> + val = 0x00;
> + else if (charger->fast_charge_timer_hr < 3)
> + val = 0x01;
> + else
> + val = DIV_ROUND_UP(charger->fast_charge_timer_hr - 1, 2);
> +
> + ret = regmap_update_bits(charger->regmap, MAX77659_REG_CNFG_CHG_E,
> + MAX77659_BIT_CNFG_E_TFASTCHG, val);
> + if (ret)
> + return dev_err_probe(charger->dev, ret, "Error in writing register CNFG_CHG_E\n");
> +
> + return max77659_set_topoff_timer(charger, charger->topoff_timer_min);
> +}
> +
> +static void max77659_charger_parse_dt(struct max77659_charger_dev *charger)
> +{
> + int ret;
> +
> + ret = device_property_read_u32(charger->dev, "adi,fast-charge-timer",
> + &charger->fast_charge_timer_hr);
> + if (ret)
> + dev_dbg(charger->dev, "Could not read adi,fast-charge-timer DT property\n");
> +
> + ret = device_property_read_u32(charger->dev, "adi,fast-charge-microamp",
> + &charger->fast_charge_current_ua);
> + if (ret)
> + dev_dbg(charger->dev, "Could not read adi,fast-charge-microamp DT property\n");
As far as I can tell this is power_supply_battery_info.constant_charge_current_max_ua
from power_supply_get_battery_info().
> + ret = device_property_read_u32(charger->dev, "adi,topoff-timer",
> + &charger->topoff_timer_min);
> + if (ret)
> + dev_dbg(charger->dev, "Could not read adi,topoff-timer DT property\n");
> +}
> +
> +struct max77659_charger_status_map {
> + int health;
> + int status;
> + int charge_type;
> +};
> +
> +#define STATUS_MAP(_MAX77659_CHG_DTLS, _health, _status, _charge_type) \
> + [MAX77659_CHG_DTLS_##_MAX77659_CHG_DTLS] = {\
> + .health = POWER_SUPPLY_HEALTH_##_health,\
> + .status = POWER_SUPPLY_STATUS_##_status,\
> + .charge_type = POWER_SUPPLY_CHARGE_TYPE_##_charge_type,\
> + }
> +
> +static struct max77659_charger_status_map max77659_charger_status_map[] = {
> + /* chg_details_xx, health, status, charge_type */
> + STATUS_MAP(OFF, UNKNOWN, NOT_CHARGING, NONE),
> + STATUS_MAP(PREQUAL, GOOD, CHARGING, TRICKLE),
> + STATUS_MAP(FASTCHARGE_CC, GOOD, CHARGING, FAST),
> + STATUS_MAP(JEITA_FASTCHARGE_CC, GOOD, CHARGING, FAST),
> + STATUS_MAP(FASTCHARGE_CV, GOOD, CHARGING, FAST),
> + STATUS_MAP(JEITA_FASTCHARGE_CV, GOOD, CHARGING, FAST),
> + STATUS_MAP(TOPOFF, GOOD, CHARGING, FAST),
> + STATUS_MAP(JEITA_TOPOFF, GOOD, CHARGING, FAST),
> + STATUS_MAP(DONE, GOOD, FULL, NONE),
> + STATUS_MAP(JEITA_DONE, GOOD, FULL, NONE),
> + STATUS_MAP(OFF_TIMER_FAULT, SAFETY_TIMER_EXPIRE, NOT_CHARGING, NONE),
> + STATUS_MAP(OFF_CHARGE_TIMER_FAULT, UNKNOWN, NOT_CHARGING, NONE),
> + STATUS_MAP(OFF_BATTERY_TEMP_FAULT, HOT, NOT_CHARGING, NONE),
> +};
> +
> +static int max77659_charger_update(struct max77659_charger_dev *charger)
> +{
> + unsigned int stat_chg_b, chg_dtls;
> + int ret;
> +
> + ret = regmap_read(charger->regmap, MAX77659_REG_STAT_CHG_B, &stat_chg_b);
> + if (ret) {
> + charger->health = POWER_SUPPLY_HEALTH_UNKNOWN;
> + charger->status = POWER_SUPPLY_STATUS_UNKNOWN;
> + charger->charge_type = POWER_SUPPLY_CHARGE_TYPE_UNKNOWN;
> + return ret;
> + }
> +
> + charger->present = stat_chg_b & MAX77659_BIT_STAT_B_CHG;
> + if (!charger->present) {
> + charger->health = POWER_SUPPLY_HEALTH_UNKNOWN;
> + charger->status = POWER_SUPPLY_STATUS_DISCHARGING;
> + charger->charge_type = POWER_SUPPLY_CHARGE_TYPE_UNKNOWN;
> + return 0;
> + }
> +
> + chg_dtls = FIELD_GET(MAX77659_BIT_STAT_B_CHG_DTLS, stat_chg_b);
> +
> + charger->health = max77659_charger_status_map[chg_dtls].health;
> + charger->status = max77659_charger_status_map[chg_dtls].status;
> + charger->charge_type = max77659_charger_status_map[chg_dtls].charge_type;
> +
> + return 0;
> +}
> +
> +static enum power_supply_property max77659_charger_props[] = {
> + POWER_SUPPLY_PROP_ONLINE,
> + POWER_SUPPLY_PROP_HEALTH,
> + POWER_SUPPLY_PROP_STATUS,
> + POWER_SUPPLY_PROP_CHARGE_TYPE,
> + POWER_SUPPLY_PROP_CURRENT_NOW
> +};
> +
> +static int max77659_property_is_writeable(struct power_supply *psy, enum power_supply_property psp)
> +{
> + switch (psp) {
> + case POWER_SUPPLY_PROP_ONLINE:
> + case POWER_SUPPLY_PROP_CURRENT_NOW:
> + return 1;
> + default:
> + return 0;
> + }
> +}
> +
> +static int max77659_charger_get_property(struct power_supply *psy,
> + enum power_supply_property psp,
> + union power_supply_propval *val)
> +{
> + struct max77659_charger_dev *charger = power_supply_get_drvdata(psy);
> + int ret;
> +
> + mutex_lock(&charger->lock);
> +
> + ret = max77659_charger_update(charger);
> + if (ret)
> + goto out;
> +
> + switch (psp) {
> + case POWER_SUPPLY_PROP_ONLINE:
> + val->intval = charger->present;
> + break;
> + case POWER_SUPPLY_PROP_HEALTH:
> + val->intval = charger->health;
> + break;
> + case POWER_SUPPLY_PROP_STATUS:
> + val->intval = charger->status;
> + break;
> + case POWER_SUPPLY_PROP_CHARGE_TYPE:
> + val->intval = charger->charge_type;
> + break;
> + case POWER_SUPPLY_PROP_CURRENT_NOW:
> + ret = max77659_get_charge_current(charger, &val->intval);
> + break;
> + default:
> + ret = -EINVAL;
> + break;
> + }
> +
> +out:
> + mutex_unlock(&charger->lock);
> +
> + return ret;
> +}
> +
> +static int max77659_charger_set_property(struct power_supply *psy, enum power_supply_property psp,
> + const union power_supply_propval *val)
> +{
> + struct max77659_charger_dev *charger = power_supply_get_drvdata(psy);
> + int ret;
> +
> + mutex_lock(&charger->lock);
> +
> + switch (psp) {
> + case POWER_SUPPLY_PROP_ONLINE:
> + ret = regmap_update_bits(charger->regmap, MAX77659_REG_CNFG_CHG_B,
> + MAX77659_BIT_CNFG_B_CHG_EN, !!val->intval);
> + if (ret)
> + goto out;
> +
> + ret = max77659_set_charge_current(charger, charger->fast_charge_current_ua);
> + break;
> + case POWER_SUPPLY_PROP_CURRENT_NOW:
> + /* val->intval - uA */
> + ret = max77659_set_charge_current(charger, val->intval);
> + if (ret)
> + goto out;
> +
> + charger->fast_charge_current_ua = val->intval;
> + break;
> + default:
> + ret = -EINVAL;
> + break;
> + }
> +
> +out:
> + mutex_unlock(&charger->lock);
> +
> + return ret;
> +}
> +
> +static void max77659_charger_irq_handler(struct max77659_charger_dev *charger, int irq)
> +{
> + unsigned int val, stat_chg_b;
> + int chg_present;
> + int ret;
> +
> + switch (irq) {
> + case MAX77659_CHG_IRQ_THM_I:
> + ret = regmap_read(charger->regmap, MAX77659_REG_STAT_CHG_A, &val);
> + if (ret) {
> + dev_err(charger->dev, "Failed to read STAT_CHG_A\n");
> + return;
> + }
> +
> + val = FIELD_GET(MAX77659_BIT_STAT_A_THM_DTLS, val);
> + dev_dbg(charger->dev, "CHG_INT_THM: thm_dtls = %02Xh\n", val);
> + break;
> +
> + case MAX77659_CHG_IRQ_CHG_I:
> + ret = regmap_read(charger->regmap, MAX77659_REG_STAT_CHG_B, &val);
> + if (ret) {
> + dev_err(charger->dev, "Failed to read STAT_CHG_B\n");
> + return;
> + }
> +
> + val = FIELD_GET(MAX77659_BIT_STAT_B_CHG_DTLS, val);
> + dev_dbg(charger->dev, "CHG_INT_CHG: MAX77659_CHG_DTLS = %02Xh\n", val);
> + break;
> +
> + case MAX77659_CHG_IRQ_CHGIN_I:
> + ret = regmap_read(charger->regmap, MAX77659_REG_STAT_CHG_B, &val);
> + if (ret) {
> + dev_err(charger->dev, "Failed to read STAT_CHG_B\n");
> + return;
> + }
> +
> + val = FIELD_GET(MAX77659_BIT_STAT_B_CHG_DTLS, val);
> + dev_dbg(charger->dev, "CHG_INT_CHG: MAX77659_CHG_DTLS = %02Xh\n", val);
> +
> + ret = regmap_read(charger->regmap, MAX77659_REG_STAT_CHG_B, &stat_chg_b);
> + if (ret) {
> + dev_err(charger->dev, "Failed to read STAT_CHG_B\n");
> + return;
> + }
> +
> + chg_present = stat_chg_b & MAX77659_BIT_STAT_B_CHG;
> +
> + regmap_update_bits(charger->regmap, MAX77659_REG_CNFG_CHG_B,
> + MAX77659_BIT_CNFG_B_CHG_EN, !!chg_present);
> + if (!chg_present)
> + max77659_set_charge_current(charger, charger->fast_charge_current_ua);
> +
> + dev_dbg(charger->dev, "CHG_INT_CHGIN: Charger input %s\n",
> + chg_present ? "inserted" : "removed");
> + break;
> +
> + case MAX77659_CHG_IRQ_TJ_REG_I:
> + ret = regmap_read(charger->regmap, MAX77659_REG_STAT_CHG_A, &val);
> + if (ret) {
> + dev_err(charger->dev, "Failed to read STAT_CHG_A\n");
> + return;
> + }
> +
> + val = FIELD_GET(MAX77659_BIT_STAT_A_TJ_REG_STAT, val);
> + dev_dbg(charger->dev, "CHG_INT_TJ_REG: tj_reg_stat = %02Xh\n", val);
> + dev_dbg(charger->dev, "CHG_INT_TJ_REG: Die temperature %s Tj-reg\n",
> + val ? "has exceeded" : "has not exceeded");
> + break;
> +
> + case MAX77659_CHG_IRQ_SYS_CTRL_I:
> + ret = regmap_read(charger->regmap, MAX77659_REG_STAT_CHG_A, &val);
> + if (ret) {
> + dev_err(charger->dev, "Failed to read STAT_CHG_A\n");
> + return;
> + }
> +
> + val = FIELD_GET(MAX77659_BIT_STAT_A_VSYSY_MIN_STAT, val);
> + dev_dbg(charger->dev,
> + "CHG_INT_SYS_CTRL: The minimum system voltage regulation loop %s\n",
> + val ? "has engaged" : "has not engaged");
> + break;
> +
> + default:
> + break;
> + }
> +
> + power_supply_changed(charger->psy_chg);
> +}
> +
> +static irqreturn_t max77659_charger_isr(int irq, void *data)
> +{
> + struct max77659_charger_dev *charger = data;
> +
> + charger->irq = irq;
> + max77659_charger_update(charger);
> + max77659_charger_irq_handler(charger, charger->irq - charger->irq_arr[0]);
> +
> + return IRQ_HANDLED;
> +}
> +
> +static const char * const max77659_irq_descs[] = {
> + "charger-thm",
> + "charger-chg",
> + "charger-chgin",
> + "charger-tj-reg",
> + "charger-sys-ctrl",
> +};
> +
> +static int max77659_charger_probe(struct platform_device *pdev)
> +{
> + struct max77659_dev *max77659 = dev_get_drvdata(pdev->dev.parent);
> + struct max77659_charger_dev *charger;
> + struct device *dev = &pdev->dev;
> + int i, ret;
> + struct power_supply_config charger_cfg = {};
> +
> + charger = devm_kzalloc(dev, sizeof(*charger), GFP_KERNEL);
> + if (!charger)
> + return -ENOMEM;
> +
> + mutex_init(&charger->lock);
> +
> + charger->dev = dev;
> + charger->regmap = dev_get_regmap(charger->dev->parent, NULL);
> + charger->fast_charge_current_ua = 15000;
> + charger->topoff_timer_min = 30;
> +
> + max77659_charger_parse_dt(charger);
> +
> + charger->psy_chg_d.name = MAX77659_CHARGER_NAME;
> + charger->psy_chg_d.type = POWER_SUPPLY_TYPE_UNKNOWN;
POWER_SUPPLY_TYPE_USB
> + charger->psy_chg_d.get_property = max77659_charger_get_property;
> + charger->psy_chg_d.set_property = max77659_charger_set_property;
> + charger->psy_chg_d.properties = max77659_charger_props;
> + charger->psy_chg_d.property_is_writeable = max77659_property_is_writeable;
> + charger->psy_chg_d.num_properties = ARRAY_SIZE(max77659_charger_props);
> + charger_cfg.drv_data = charger;
> + charger_cfg.supplied_to = chg_supplied_to;
> + charger_cfg.of_node = dev->of_node;
> + charger_cfg.num_supplicants = ARRAY_SIZE(chg_supplied_to);
It does not make sense that the charger supplies itself.
> + ret = max77659_charger_initialize(charger);
> + if (ret)
> + return dev_err_probe(dev, ret, "Failed to initialize charger\n");
> +
> + for (i = 0; i < MAX77659_CHG_IRQ_MAX; i++) {
> + charger->irq_arr[i] = regmap_irq_get_virq(max77659->irqc_chg, i);
> +
> + if (charger->irq_arr[i] < 0)
> + return dev_err_probe(dev, -EINVAL,
> + "Invalid IRQ for MAX77659_CHG_IRQ %d\n", i);
> +
> + ret = devm_request_threaded_irq(dev, charger->irq_arr[i],
> + NULL, max77659_charger_isr, IRQF_TRIGGER_FALLING,
> + max77659_irq_descs[i], charger);
> + if (ret)
> + return dev_err_probe(dev, ret, "Failed to request irq: %d\n",
> + charger->irq_arr[i]);
> + }
> +
> + charger->psy_chg = devm_power_supply_register(dev, &charger->psy_chg_d, &charger_cfg);
> + if (IS_ERR(charger->psy_chg))
> + return dev_err_probe(dev, PTR_ERR(charger->psy_chg),
> + "Failed to register power supply\n");
> +
> + return 0;
> +}
> +
> +static const struct of_device_id max77659_charger_of_id[] = {
> + { .compatible = "adi,max77659-charger" },
> + { /* sentinel */ }
> +};
> +MODULE_DEVICE_TABLE(of, max77659_charger_of_id);
> +
> +static const struct platform_device_id max77659_charger_id[] = {
> + { MAX77659_CHARGER_NAME, 0, },
> + { /* sentinel */ }
> +};
> +MODULE_DEVICE_TABLE(platform, max77659_charger_id);
> +
> +static struct platform_driver max77659_charger_driver = {
> + .driver = {
> + .name = MAX77659_CHARGER_NAME,
> + .of_match_table = of_match_ptr(max77659_charger_of_id),
> + },
> + .probe = max77659_charger_probe,
> + .id_table = max77659_charger_id,
> +};
> +
> +module_platform_driver(max77659_charger_driver);
> +
> +MODULE_DESCRIPTION("MAX77659 Charger Driver");
> +MODULE_AUTHOR("Nurettin.Bolucu@analog.com, Zeynep.Arslanbenzer@analog.com");
> +MODULE_LICENSE("GPL");
> +MODULE_VERSION("1.0");
-- Sebastian
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* RE: [PATCH 4/6] dt-bindings: power: supply: add MAX77659 charger binding
2022-12-20 14:54 ` Krzysztof Kozlowski
@ 2023-04-17 21:43 ` Arslanbenzer, Zeynep
2023-04-18 7:09 ` Krzysztof Kozlowski
0 siblings, 1 reply; 18+ messages in thread
From: Arslanbenzer, Zeynep @ 2023-04-17 21:43 UTC (permalink / raw)
To: Krzysztof Kozlowski
Cc: linux-kernel@vger.kernel.org, devicetree@vger.kernel.org,
linux-pm@vger.kernel.org, lee@kernel.org, robh+dt@kernel.org,
krzysztof.kozlowski+dt@linaro.org, sre@kernel.org,
lgirdwood@gmail.com, broonie@kernel.org
>On 20/12/2022 14:22, Zeynep Arslanbenzer wrote:
>> This patch adds device tree binding documentation for MAX77659 charger.
>
>Do not use "This commit/patch".
>https://urldefense.com/v3/__https://elixir.bootlin.com/linux/v5.17.1/source/Documentation/process/submitting-patches.rst*L95__;>Iw!!A3Ni8CS0y2Y!-AnHmIThbB5Q88_dFdveEmsXlsfflRXDabf6RVE5ySRusMxP24NEfAr8RCsu26LTvoaIIMvEDr2YxDECrGlMwR8-ywvoR62rXB0W$
>
>>
>> Signed-off-by: Nurettin Bolucu <Nurettin.Bolucu@analog.com>>
>> Signed-off-by: Zeynep Arslanbenzer <Zeynep.Arslanbenzer@analog.com>>
>> ---
>> .../power/supply/adi,max77659-charger.yaml | 42 +++++++++++++++++++
>> MAINTAINERS | 1 +
>> 2 files changed, 43 insertions(+)
>> create mode 100644
>> Documentation/devicetree/bindings/power/supply/adi,max77659-charger.ya
>> ml
>>
>> diff --git
>> a/Documentation/devicetree/bindings/power/supply/adi,max77659-charger.
>> yaml
>> b/Documentation/devicetree/bindings/power/supply/adi,max77659-charger.
>> yaml
>> new file mode 100644
>> index 000000000000..24f8b5a2bd84
>> --- /dev/null
>> +++ b/Documentation/devicetree/bindings/power/supply/adi,max77659-char
>> +++ ger.yaml
>> @@ -0,0 +1,42 @@
>> +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause %YAML 1.2
>> +---
>> +$id:
>> +https://urldefense.com/v3/__http://devicetree.org/schemas/power/suppl
>> +y/adi,max77659-charger.yaml*__;Iw!!A3Ni8CS0y2Y!-AnHmIThbB5Q88_dFdveEm
>> +sXlsfflRXDabf6RVE5ySRusMxP24NEfAr8RCsu26LTvoaIIMvEDr2YxDECrGlMwR8-ywv
>> +oR5rKUR11$
>> +$schema:
>> +https://urldefense.com/v3/__http://devicetree.org/meta-schemas/core.y
>> +aml*__;Iw!!A3Ni8CS0y2Y!-AnHmIThbB5Q88_dFdveEmsXlsfflRXDabf6RVE5ySRusM
>> +xP24NEfAr8RCsu26LTvoaIIMvEDr2YxDECrGlMwR8-ywvoRy_yWWBS$
>> +
>> +title: Battery charger for MAX77659 PMIC from ADI.
>
>Drop full stop.
>
>> +
>> +maintainers:
>> + - Nurettin Bolucu <Nurettin.Bolucu@analog.com>>
>> + - Zeynep Arslanbenzer <Zeynep.Arslanbenzer@analog.com>>
>> +
>> +description: |
>> + This module is part of the MAX77659 MFD device. For more details
>> + see Documentation/devicetree/bindings/mfd/adi,max77659.yaml.
>> +
>> + The charger is represented as a sub-node of the PMIC node on the device tree.
>> +
>> +properties:
>> + compatible:
>> + const: adi,max77659-charger
>> +
>> + reg:
>> + maxItems: 1
>> +
>> + adi,fast-charge-timer:
>> + $ref: /schemas/types.yaml#/definitions/uint32
>> + description: Fast-charge safety timer value (in hours).
>
>No, use suffixes for common units.
Hi Krzysztof,
Thank you for your review. The possible register values of the fast charge safety timer are described in the datasheet as follows. I was undecided about using the common unit, second, as it may affect the comprehensibility of the code. Of course, I can use second as the common unit if you think it's more appropriate.
0b00 = Timer disabled
0b01 = 3 hours
0b10 = 5 hours
0b11 = 7 hours
>
>> +
>> + adi,fast-charge-microamp:
>> + description: Fast-charge constant current value.
>
>> +
>> + adi,topoff-timer:
>> + $ref: /schemas/types.yaml#/definitions/uint32
>> + description: Top-Off timer value (in minutes).
>
>No, use suffixes for common units.
Similar case:
0b000 = 0 minutes
0b001 = 5 minutes
0b010 = 10 minutes
0b011 = 15 minutes
0b100 = 20 minutes
0b101 = 25 minutes
0b110 = 30 minutes
0b111 = 35 minutes
>
>
>Best regards,
>Krzysztof
Best regards,
Zeynep
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 4/6] dt-bindings: power: supply: add MAX77659 charger binding
2023-04-17 21:43 ` Arslanbenzer, Zeynep
@ 2023-04-18 7:09 ` Krzysztof Kozlowski
2023-04-18 9:41 ` Arslanbenzer, Zeynep
0 siblings, 1 reply; 18+ messages in thread
From: Krzysztof Kozlowski @ 2023-04-18 7:09 UTC (permalink / raw)
To: Arslanbenzer, Zeynep
Cc: linux-kernel@vger.kernel.org, devicetree@vger.kernel.org,
linux-pm@vger.kernel.org, lee@kernel.org, robh+dt@kernel.org,
krzysztof.kozlowski+dt@linaro.org, sre@kernel.org,
lgirdwood@gmail.com, broonie@kernel.org
On 17/04/2023 23:43, Arslanbenzer, Zeynep wrote:
>> On 20/12/2022 14:22, Zeynep Arslanbenzer wrote:
>>> This patch adds device tree binding documentation for MAX77659 charger.
>>
>> Do not use "This commit/patch".
>> https://urldefense.com/v3/__https://elixir.bootlin.com/linux/v5.17.1/source/Documentation/process/submitting-patches.rst*L95__;>Iw!!A3Ni8CS0y2Y!-AnHmIThbB5Q88_dFdveEmsXlsfflRXDabf6RVE5ySRusMxP24NEfAr8RCsu26LTvoaIIMvEDr2YxDECrGlMwR8-ywvoR62rXB0W$
>>
>>>
>>> Signed-off-by: Nurettin Bolucu <Nurettin.Bolucu@analog.com>>
>>> Signed-off-by: Zeynep Arslanbenzer <Zeynep.Arslanbenzer@analog.com>>
>>> ---
>>> .../power/supply/adi,max77659-charger.yaml | 42 +++++++++++++++++++
>>> MAINTAINERS | 1 +
>>> 2 files changed, 43 insertions(+)
>>> create mode 100644
>>> Documentation/devicetree/bindings/power/supply/adi,max77659-charger.ya
>>> ml
>>>
>>> diff --git
>>> a/Documentation/devicetree/bindings/power/supply/adi,max77659-charger.
>>> yaml
>>> b/Documentation/devicetree/bindings/power/supply/adi,max77659-charger.
>>> yaml
>>> new file mode 100644
>>> index 000000000000..24f8b5a2bd84
>>> --- /dev/null
>>> +++ b/Documentation/devicetree/bindings/power/supply/adi,max77659-char
>>> +++ ger.yaml
>>> @@ -0,0 +1,42 @@
>>> +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause %YAML 1.2
>>> +---
>>> +$id:
>>> +https://urldefense.com/v3/__http://devicetree.org/schemas/power/suppl
>>> +y/adi,max77659-charger.yaml*__;Iw!!A3Ni8CS0y2Y!-AnHmIThbB5Q88_dFdveEm
>>> +sXlsfflRXDabf6RVE5ySRusMxP24NEfAr8RCsu26LTvoaIIMvEDr2YxDECrGlMwR8-ywv
>>> +oR5rKUR11$
>>> +$schema:
>>> +https://urldefense.com/v3/__http://devicetree.org/meta-schemas/core.y
>>> +aml*__;Iw!!A3Ni8CS0y2Y!-AnHmIThbB5Q88_dFdveEmsXlsfflRXDabf6RVE5ySRusM
>>> +xP24NEfAr8RCsu26LTvoaIIMvEDr2YxDECrGlMwR8-ywvoRy_yWWBS$
>>> +
>>> +title: Battery charger for MAX77659 PMIC from ADI.
>>
>> Drop full stop.
>>
>>> +
>>> +maintainers:
>>> + - Nurettin Bolucu <Nurettin.Bolucu@analog.com>>
>>> + - Zeynep Arslanbenzer <Zeynep.Arslanbenzer@analog.com>>
>>> +
>>> +description: |
>>> + This module is part of the MAX77659 MFD device. For more details
>>> + see Documentation/devicetree/bindings/mfd/adi,max77659.yaml.
>>> +
>>> + The charger is represented as a sub-node of the PMIC node on the device tree.
>>> +
>>> +properties:
>>> + compatible:
>>> + const: adi,max77659-charger
>>> +
>>> + reg:
>>> + maxItems: 1
>>> +
>>> + adi,fast-charge-timer:
>>> + $ref: /schemas/types.yaml#/definitions/uint32
>>> + description: Fast-charge safety timer value (in hours).
>>
>> No, use suffixes for common units.
>
> Hi Krzysztof,
>
> Thank you for your review. The possible register values of the fast charge safety timer are described in the datasheet as follows. I was undecided about using the common unit, second, as it may affect the comprehensibility of the code. Of course, I can use second as the common unit if you think it's more appropriate.
This is quite common property, so I do not understand why this one
driver should have it written differently. I understand that parsing
0/1/2/3 is easier for the machine than 0/3/5/7 but it is not easier for
humans.
>
> 0b00 = Timer disabled
> 0b01 = 3 hours
> 0b10 = 5 hours
> 0b11 = 7 hours
>
>>
>>> +
>>> + adi,fast-charge-microamp:
>>> + description: Fast-charge constant current value.
>>
>>> +
>>> + adi,topoff-timer:
>>> + $ref: /schemas/types.yaml#/definitions/uint32
>>> + description: Top-Off timer value (in minutes).
>>
>> No, use suffixes for common units.
>
> Similar case:
>
> 0b000 = 0 minutes
> 0b001 = 5 minutes
> 0b010 = 10 minutes
> 0b011 = 15 minutes
> 0b100 = 20 minutes
> 0b101 = 25 minutes
> 0b110 = 30 minutes
> 0b111 = 35 minutes
Come on, this is easy to parse. Divide by 5 and where is the code
complexity?
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 18+ messages in thread
* RE: [PATCH 4/6] dt-bindings: power: supply: add MAX77659 charger binding
2023-04-18 7:09 ` Krzysztof Kozlowski
@ 2023-04-18 9:41 ` Arslanbenzer, Zeynep
2023-04-18 12:30 ` Krzysztof Kozlowski
0 siblings, 1 reply; 18+ messages in thread
From: Arslanbenzer, Zeynep @ 2023-04-18 9:41 UTC (permalink / raw)
To: Krzysztof Kozlowski
Cc: linux-kernel@vger.kernel.org, devicetree@vger.kernel.org,
linux-pm@vger.kernel.org, lee@kernel.org, robh+dt@kernel.org,
krzysztof.kozlowski+dt@linaro.org, sre@kernel.org,
lgirdwood@gmail.com, broonie@kernel.org
>On 17/04/2023 23:43, Arslanbenzer, Zeynep wrote:
>>> On 20/12/2022 14:22, Zeynep Arslanbenzer wrote:
>>>> This patch adds device tree binding documentation for MAX77659 charger.
>>>
>>> Do not use "This commit/patch".
>>> https://urldefense.com/v3/__https://elixir.bootlin.com/linux/v5.17.1/
>>> source/Documentation/process/submitting-patches.rst*L95__;>Iw!!A3Ni8C
>>> S0y2Y!-AnHmIThbB5Q88_dFdveEmsXlsfflRXDabf6RVE5ySRusMxP24NEfAr8RCsu26L
>>> TvoaIIMvEDr2YxDECrGlMwR8-ywvoR62rXB0W$
>>>
>>>>
>>>> Signed-off-by: Nurettin Bolucu <Nurettin.Bolucu@analog.com>>
>>>> Signed-off-by: Zeynep Arslanbenzer <Zeynep.Arslanbenzer@analog.com>>
>>>> ---
>>>> .../power/supply/adi,max77659-charger.yaml | 42 +++++++++++++++++++
>>>> MAINTAINERS | 1 +
>>>> 2 files changed, 43 insertions(+)
>>>> create mode 100644
>>>> Documentation/devicetree/bindings/power/supply/adi,max77659-charger.
>>>> ya
>>>> ml
>>>>
>>>> diff --git
>>>> a/Documentation/devicetree/bindings/power/supply/adi,max77659-charger.
>>>> yaml
>>>> b/Documentation/devicetree/bindings/power/supply/adi,max77659-charger.
>>>> yaml
>>>> new file mode 100644
>>>> index 000000000000..24f8b5a2bd84
>>>> --- /dev/null
>>>> +++ b/Documentation/devicetree/bindings/power/supply/adi,max77659-ch
>>>> +++ ar
>>>> +++ ger.yaml
>>>> @@ -0,0 +1,42 @@
>>>> +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause %YAML 1.2
>>>> +---
>>>> +$id:
>>>> +https://urldefense.com/v3/__http://devicetree.org/schemas/power/sup
>>>> +pl
>>>> +y/adi,max77659-charger.yaml*__;Iw!!A3Ni8CS0y2Y!-AnHmIThbB5Q88_dFdve
>>>> +Em
>>>> +sXlsfflRXDabf6RVE5ySRusMxP24NEfAr8RCsu26LTvoaIIMvEDr2YxDECrGlMwR8-y
>>>> +wv
>>>> +oR5rKUR11$
>>>> +$schema:
>>>> +https://urldefense.com/v3/__http://devicetree.org/meta-schemas/core
>>>> +.y
>>>> +aml*__;Iw!!A3Ni8CS0y2Y!-AnHmIThbB5Q88_dFdveEmsXlsfflRXDabf6RVE5ySRu
>>>> +sM xP24NEfAr8RCsu26LTvoaIIMvEDr2YxDECrGlMwR8-ywvoRy_yWWBS$
>>>> +
>>>> +title: Battery charger for MAX77659 PMIC from ADI.
>>>
>>> Drop full stop.
>>>
>>>> +
>>>> +maintainers:
>>>> + - Nurettin Bolucu <Nurettin.Bolucu@analog.com>>
>>>> + - Zeynep Arslanbenzer <Zeynep.Arslanbenzer@analog.com>>
>>>> +
>>>> +description: |
>>>> + This module is part of the MAX77659 MFD device. For more details
>>>> + see Documentation/devicetree/bindings/mfd/adi,max77659.yaml.
>>>> +
>>>> + The charger is represented as a sub-node of the PMIC node on the device tree.
>>>> +
>>>> +properties:
>>>> + compatible:
>>>> + const: adi,max77659-charger
>>>> +
>>>> + reg:
>>>> + maxItems: 1
>>>> +
>>>> + adi,fast-charge-timer:
>>>> + $ref: /schemas/types.yaml#/definitions/uint32
>>>> + description: Fast-charge safety timer value (in hours).
>>>
>>> No, use suffixes for common units.
>>
>> Hi Krzysztof,
>>
>> Thank you for your review. The possible register values of the fast charge safety timer are described in the datasheet as follows. I was undecided about using the common unit, second, as it may affect the comprehensibility of the code. Of course, I can use second as the common unit if you think it's more appropriate.
>
>This is quite common property, so I do not understand why this one driver should have it written differently. I understand that parsing
>0/1/2/3 is easier for the machine than 0/3/5/7 but it is not easier for humans.
I referenced property-units.yaml for common units.
As I understood hours and minutes are not common units in Linux for time so I cannot use them as suffixes. Therefore, I thought I had to use "seconds" instead of "hours" or "minutes". I am totally fine if I can use " adi,fast-charge-timer-hours" and "adi,topoff-timer-minutes".
>
>>
>> 0b00 = Timer disabled
>> 0b01 = 3 hours
>> 0b10 = 5 hours
>> 0b11 = 7 hours
>>
>>>
>>>> +
>>>> + adi,fast-charge-microamp:
>>>> + description: Fast-charge constant current value.
>>>
>>>> +
>>>> + adi,topoff-timer:
>>>> + $ref: /schemas/types.yaml#/definitions/uint32
>>>> + description: Top-Off timer value (in minutes).
>>>
>>> No, use suffixes for common units.
>>
>> Similar case:
>>
>> 0b000 = 0 minutes
>> 0b001 = 5 minutes
>> 0b010 = 10 minutes
>> 0b011 = 15 minutes
>> 0b100 = 20 minutes
>> 0b101 = 25 minutes
>> 0b110 = 30 minutes
>> 0b111 = 35 minutes
>
>Come on, this is easy to parse. Divide by 5 and where is the code
>complexity?
>
>Best regards,
>Krzysztof
>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 4/6] dt-bindings: power: supply: add MAX77659 charger binding
2023-04-18 9:41 ` Arslanbenzer, Zeynep
@ 2023-04-18 12:30 ` Krzysztof Kozlowski
0 siblings, 0 replies; 18+ messages in thread
From: Krzysztof Kozlowski @ 2023-04-18 12:30 UTC (permalink / raw)
To: Arslanbenzer, Zeynep
Cc: linux-kernel@vger.kernel.org, devicetree@vger.kernel.org,
linux-pm@vger.kernel.org, lee@kernel.org, robh+dt@kernel.org,
krzysztof.kozlowski+dt@linaro.org, sre@kernel.org,
lgirdwood@gmail.com, broonie@kernel.org
On 18/04/2023 11:41, Arslanbenzer, Zeynep wrote:
>>>> No, use suffixes for common units.
>>>
>>> Hi Krzysztof,
>>>
>>> Thank you for your review. The possible register values of the fast charge safety timer are described in the datasheet as follows. I was undecided about using the common unit, second, as it may affect the comprehensibility of the code. Of course, I can use second as the common unit if you think it's more appropriate.
>>
>> This is quite common property, so I do not understand why this one driver should have it written differently. I understand that parsing
>> 0/1/2/3 is easier for the machine than 0/3/5/7 but it is not easier for humans.
>
> I referenced property-units.yaml for common units.
>
> As I understood hours and minutes are not common units in Linux for time so I cannot use them as suffixes. Therefore, I thought I had to use "seconds" instead of "hours" or "minutes". I am totally fine if I can use " adi,fast-charge-timer-hours" and "adi,topoff-timer-minutes".
Wrap your replies to match mailing list style.
Yeah... indeed... because it should not be in DTS in the first place.
It's not a property of the hardware, so the same as with other drivers -
we don't store it in DT. Check other maxim drivers.
>
>>
>>>
>>> 0b00 = Timer disabled
>>> 0b01 = 3 hours
>>> 0b10 = 5 hours
>>> 0b11 = 7 hours
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2023-04-18 12:30 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-12-20 13:22 [PATCH 0/6] drivers: mfd: Add MAX77659 MFD and related device drivers Zeynep Arslanbenzer
2022-12-20 13:22 ` [PATCH 1/6] drivers: mfd: add MAX77659 PMIC support Zeynep Arslanbenzer
2022-12-20 14:47 ` Krzysztof Kozlowski
2022-12-20 13:22 ` [PATCH 2/6] dt-bindings: mfd: add MAX77659 binding Zeynep Arslanbenzer
2022-12-20 14:43 ` Krzysztof Kozlowski
2022-12-20 16:40 ` Rob Herring
2022-12-20 13:22 ` [PATCH 3/6] drivers: power: supply: add MAX77659 charger support Zeynep Arslanbenzer
2022-12-20 14:51 ` Krzysztof Kozlowski
2023-01-02 20:44 ` Sebastian Reichel
2022-12-20 13:22 ` [PATCH 4/6] dt-bindings: power: supply: add MAX77659 charger binding Zeynep Arslanbenzer
2022-12-20 14:54 ` Krzysztof Kozlowski
2023-04-17 21:43 ` Arslanbenzer, Zeynep
2023-04-18 7:09 ` Krzysztof Kozlowski
2023-04-18 9:41 ` Arslanbenzer, Zeynep
2023-04-18 12:30 ` Krzysztof Kozlowski
2022-12-20 13:22 ` [PATCH 5/6] drivers: regulator: add MAX77659 regulator support Zeynep Arslanbenzer
2022-12-20 13:22 ` [PATCH 6/6] dt-bindings: regulator: add MAX77659 regulator binding Zeynep Arslanbenzer
2022-12-20 14:55 ` Krzysztof Kozlowski
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).