]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mfd: sec: Add support for S2MU005 PMIC
authorKaustabh Chakraborty <kauschluss@disroot.org>
Fri, 15 May 2026 21:38:36 +0000 (03:08 +0530)
committerLee Jones <lee@kernel.org>
Wed, 17 Jun 2026 10:26:30 +0000 (11:26 +0100)
Samsung's S2MU005 PMIC includes subdevices for a charger, an MUIC (Micro
USB Interface Controller), and flash and RGB LED controllers.

S2MU005's interrupt registers divided into three domains, each for the
charger, flash LEDs, and the MUIC, packed into a single regmap IRQ chip
construct.

In devices other than S2MPG1X, the revision can be retrieved from the
first register of the PMIC regmap. In S2MU005 however, the location is
in offset 0x73. Introduce a switch-case block to allow selecting the
REG_ID register. S2MU005 also has a field mask for the revision. Apply
it using FIELD_GET() and get the extracted value.

Add initial support for S2MU005 in the PMIC driver, along with its three
interrupt chips, and support for allowing to fetch revision based on the
device variant.

Co-developed-by: Łukasz Lebiedziński <kernel@lvkasz.us>
Signed-off-by: Łukasz Lebiedziński <kernel@lvkasz.us>
Signed-off-by: Kaustabh Chakraborty <kauschluss@disroot.org>
Link: https://patch.msgid.link/20260516-s2mu005-pmic-v7-4-73f9702fb461@disroot.org
Signed-off-by: Lee Jones <lee@kernel.org>
drivers/mfd/sec-common.c
drivers/mfd/sec-i2c.c
drivers/mfd/sec-irq.c
include/linux/mfd/samsung/core.h
include/linux/mfd/samsung/irq.h
include/linux/mfd/samsung/s2mu005.h [new file with mode: 0644]

index bd8b5f9686892b286a953909c6d3c72e1ae85199..22f6c74eb6c0e922cb9b922ebedcd8b37d16cdba 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/mfd/samsung/irq.h>
 #include <linux/mfd/samsung/s2mps11.h>
 #include <linux/mfd/samsung/s2mps13.h>
+#include <linux/mfd/samsung/s2mu005.h>
 #include <linux/module.h>
 #include <linux/of.h>
 #include <linux/pm.h>
@@ -105,22 +106,39 @@ static const struct mfd_cell s2mpu05_devs[] = {
        MFD_CELL_RES("s2mps15-rtc", s2mpu05_rtc_resources),
 };
 
+static const struct resource s2mu005_muic_resources[] = {
+       DEFINE_RES_IRQ_NAMED(S2MU005_IRQ_MUIC_ATTACH, "attach"),
+       DEFINE_RES_IRQ_NAMED(S2MU005_IRQ_MUIC_DETACH, "detach"),
+};
+
+static const struct mfd_cell s2mu005_devs[] = {
+       MFD_CELL_NAME("s2mu005-charger"),
+       MFD_CELL_OF("s2mu005-flash", NULL, NULL, 0, 0, "samsung,s2mu005-flash"),
+       MFD_CELL_OF("s2mu005-muic", s2mu005_muic_resources, NULL, 0, 0, "samsung,s2mu005-muic"),
+       MFD_CELL_OF("s2mu005-rgb", NULL, NULL, 0, 0, "samsung,s2mu005-rgb"),
+};
+
 static void sec_pmic_dump_rev(struct sec_pmic_dev *sec_pmic)
 {
-       unsigned int val;
+       unsigned int reg, mask, val;
 
-       /* For s2mpg1x, the revision is in a different regmap */
        switch (sec_pmic->device_type) {
        case S2MPG10:
        case S2MPG11:
+               /* For s2mpg1x, the revision is in a different regmap */
                return;
-       default:
+       case S2MU005:
+               reg = S2MU005_REG_ID;
+               mask = S2MU005_ID_MASK;
                break;
+       default:
+               /* For other device types, REG_ID is always the first register. */
+               reg = S2MPS11_REG_ID;
+               mask = ~0;
        }
 
-       /* For each device type, the REG_ID is always the first register */
-       if (!regmap_read(sec_pmic->regmap_pmic, S2MPS11_REG_ID, &val))
-               dev_dbg(sec_pmic->dev, "Revision: 0x%x\n", val);
+       if (!regmap_read(sec_pmic->regmap_pmic, reg, &val))
+               dev_dbg(sec_pmic->dev, "Revision: 0x%x\n", field_get(mask, val));
 }
 
 static void sec_pmic_configure(struct sec_pmic_dev *sec_pmic)
@@ -250,6 +268,10 @@ int sec_pmic_probe(struct device *dev, int device_type, unsigned int irq,
                sec_devs = s2mpu05_devs;
                num_sec_devs = ARRAY_SIZE(s2mpu05_devs);
                break;
+       case S2MU005:
+               sec_devs = s2mu005_devs;
+               num_sec_devs = ARRAY_SIZE(s2mu005_devs);
+               break;
        default:
                return dev_err_probe(sec_pmic->dev, -EINVAL,
                                     "Unsupported device type %d\n",
index 3132b849b4bc445cf18b2ef362092137a9b618c9..d8609886fcc80da3549e2c9460d717dac22534a2 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/mfd/samsung/s2mps14.h>
 #include <linux/mfd/samsung/s2mps15.h>
 #include <linux/mfd/samsung/s2mpu02.h>
+#include <linux/mfd/samsung/s2mu005.h>
 #include <linux/mfd/samsung/s5m8767.h>
 #include <linux/mod_devicetable.h>
 #include <linux/module.h>
@@ -66,6 +67,19 @@ static bool s2mpu02_volatile(struct device *dev, unsigned int reg)
        }
 }
 
+static bool s2mu005_volatile(struct device *dev, unsigned int reg)
+{
+       switch (reg) {
+       case S2MU005_REG_CHGR_INT1M:
+       case S2MU005_REG_FLED_INT1M:
+       case S2MU005_REG_MUIC_INT1M:
+       case S2MU005_REG_MUIC_INT2M:
+               return false;
+       default:
+               return true;
+       }
+}
+
 static const struct regmap_config s2dos05_regmap_config = {
        .reg_bits = 8,
        .val_bits = 8,
@@ -130,6 +144,15 @@ static const struct regmap_config s2mpu05_regmap_config = {
        .val_bits = 8,
 };
 
+static const struct regmap_config s2mu005_regmap_config = {
+       .reg_bits = 8,
+       .val_bits = 8,
+
+       .max_register = S2MU005_REG_MUIC_LDOADC_H,
+       .volatile_reg = s2mu005_volatile,
+       .cache_type = REGCACHE_FLAT_S,
+};
+
 static const struct regmap_config s5m8767_regmap_config = {
        .reg_bits = 8,
        .val_bits = 8,
@@ -203,6 +226,11 @@ static const struct sec_pmic_i2c_platform_data s2mpu05_data = {
        .device_type = S2MPU05,
 };
 
+static const struct sec_pmic_i2c_platform_data s2mu005_data = {
+       .regmap_cfg = &s2mu005_regmap_config,
+       .device_type = S2MU005,
+};
+
 static const struct sec_pmic_i2c_platform_data s5m8767_data = {
        .regmap_cfg = &s5m8767_regmap_config,
        .device_type = S5M8767X,
@@ -217,6 +245,7 @@ static const struct of_device_id sec_pmic_i2c_of_match[] = {
        { .compatible = "samsung,s2mps15-pmic", .data = &s2mps15_data, },
        { .compatible = "samsung,s2mpu02-pmic", .data = &s2mpu02_data, },
        { .compatible = "samsung,s2mpu05-pmic", .data = &s2mpu05_data, },
+       { .compatible = "samsung,s2mu005-pmic", .data = &s2mu005_data, },
        { .compatible = "samsung,s5m8767-pmic", .data = &s5m8767_data, },
        { },
 };
index 133188391f7c255e20aac56acb38ad89875cab18..42862807be1a0acea4ab3d70005219cfcfb27eb3 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/mfd/samsung/s2mps14.h>
 #include <linux/mfd/samsung/s2mpu02.h>
 #include <linux/mfd/samsung/s2mpu05.h>
+#include <linux/mfd/samsung/s2mu005.h>
 #include <linux/mfd/samsung/s5m8767.h>
 #include <linux/regmap.h>
 #include "sec-core.h"
@@ -223,6 +224,65 @@ static const struct regmap_irq s2mpu05_irqs[] = {
        REGMAP_IRQ_REG(S2MPU05_IRQ_TSD, 2, S2MPU05_IRQ_TSD_MASK),
 };
 
+static const struct regmap_irq s2mu005_irqs[] = {
+       REGMAP_IRQ_REG(S2MU005_IRQ_CHGR_DETBAT, 0, S2MU005_IRQ_CHGR_DETBAT_MASK),
+       REGMAP_IRQ_REG(S2MU005_IRQ_CHGR_BAT, 0, S2MU005_IRQ_CHGR_BAT_MASK),
+       REGMAP_IRQ_REG(S2MU005_IRQ_CHGR_IVR, 0, S2MU005_IRQ_CHGR_IVR_MASK),
+       REGMAP_IRQ_REG(S2MU005_IRQ_CHGR_EVENT, 0, S2MU005_IRQ_CHGR_EVENT_MASK),
+       REGMAP_IRQ_REG(S2MU005_IRQ_CHGR_CHG, 0, S2MU005_IRQ_CHGR_CHG_MASK),
+       REGMAP_IRQ_REG(S2MU005_IRQ_CHGR_VMID, 0, S2MU005_IRQ_CHGR_VMID_MASK),
+       REGMAP_IRQ_REG(S2MU005_IRQ_CHGR_WCIN, 0, S2MU005_IRQ_CHGR_WCIN_MASK),
+       REGMAP_IRQ_REG(S2MU005_IRQ_CHGR_VBUS, 0, S2MU005_IRQ_CHGR_VBUS_MASK),
+
+       REGMAP_IRQ_REG(S2MU005_IRQ_FLED_LBPROT, 1, S2MU005_IRQ_FLED_LBPROT_MASK),
+       REGMAP_IRQ_REG(S2MU005_IRQ_FLED_OPENCH2, 1, S2MU005_IRQ_FLED_OPENCH2_MASK),
+       REGMAP_IRQ_REG(S2MU005_IRQ_FLED_OPENCH1, 1, S2MU005_IRQ_FLED_OPENCH1_MASK),
+       REGMAP_IRQ_REG(S2MU005_IRQ_FLED_SHORTCH2, 1, S2MU005_IRQ_FLED_SHORTCH2_MASK),
+       REGMAP_IRQ_REG(S2MU005_IRQ_FLED_SHORTCH1, 1, S2MU005_IRQ_FLED_SHORTCH1_MASK),
+
+       REGMAP_IRQ_REG(S2MU005_IRQ_MUIC_ATTACH, 2, S2MU005_IRQ_MUIC_ATTACH_MASK),
+       REGMAP_IRQ_REG(S2MU005_IRQ_MUIC_DETACH, 2, S2MU005_IRQ_MUIC_DETACH_MASK),
+       REGMAP_IRQ_REG(S2MU005_IRQ_MUIC_KP, 2, S2MU005_IRQ_MUIC_KP_MASK),
+       REGMAP_IRQ_REG(S2MU005_IRQ_MUIC_LKP, 2, S2MU005_IRQ_MUIC_LKP_MASK),
+       REGMAP_IRQ_REG(S2MU005_IRQ_MUIC_LKR, 2, S2MU005_IRQ_MUIC_LKR_MASK),
+       REGMAP_IRQ_REG(S2MU005_IRQ_MUIC_RIDCHG, 2, S2MU005_IRQ_MUIC_RIDCHG_MASK),
+
+       REGMAP_IRQ_REG(S2MU005_IRQ_MUIC_VBUSON, 3, S2MU005_IRQ_MUIC_VBUSON_MASK),
+       REGMAP_IRQ_REG(S2MU005_IRQ_MUIC_RSVD, 3, S2MU005_IRQ_MUIC_RSVD_MASK),
+       REGMAP_IRQ_REG(S2MU005_IRQ_MUIC_ADC, 3, S2MU005_IRQ_MUIC_ADC_MASK),
+       REGMAP_IRQ_REG(S2MU005_IRQ_MUIC_STUCK, 3, S2MU005_IRQ_MUIC_STUCK_MASK),
+       REGMAP_IRQ_REG(S2MU005_IRQ_MUIC_STUCKRCV, 3, S2MU005_IRQ_MUIC_STUCKRCV_MASK),
+       REGMAP_IRQ_REG(S2MU005_IRQ_MUIC_MHDL, 3, S2MU005_IRQ_MUIC_MHDL_MASK),
+       REGMAP_IRQ_REG(S2MU005_IRQ_MUIC_AVCHG, 3, S2MU005_IRQ_MUIC_AVCHG_MASK),
+       REGMAP_IRQ_REG(S2MU005_IRQ_MUIC_VBUSOFF, 3, S2MU005_IRQ_MUIC_VBUSOFF_MASK),
+};
+
+static unsigned int s2mu005_irq_get_reg(struct regmap_irq_chip_data *data,
+                                       unsigned int base, int index)
+{
+       const unsigned int irqf_regs[] = {
+               S2MU005_REG_CHGR_INT1,
+               S2MU005_REG_FLED_INT1,
+               S2MU005_REG_MUIC_INT1,
+               S2MU005_REG_MUIC_INT2,
+       };
+       const unsigned int mask_regs[] = {
+               S2MU005_REG_CHGR_INT1M,
+               S2MU005_REG_FLED_INT1M,
+               S2MU005_REG_MUIC_INT1M,
+               S2MU005_REG_MUIC_INT2M,
+       };
+
+       switch (base) {
+       case S2MU005_REG_CHGR_INT1:
+               return irqf_regs[index];
+       case S2MU005_REG_CHGR_INT1M:
+               return mask_regs[index];
+       }
+
+       return base;
+}
+
 static const struct regmap_irq s5m8767_irqs[] = {
        REGMAP_IRQ_REG(S5M8767_IRQ_PWRR, 0, S5M8767_IRQ_PWRR_MASK),
        REGMAP_IRQ_REG(S5M8767_IRQ_PWRF, 0, S5M8767_IRQ_PWRF_MASK),
@@ -337,6 +397,16 @@ static const struct regmap_irq_chip s2mpu05_irq_chip = {
        .ack_base = S2MPU05_REG_INT1,
 };
 
+static const struct regmap_irq_chip s2mu005_irq_chip = {
+       .name = "s2mu005",
+       .irqs = s2mu005_irqs,
+       .num_irqs = ARRAY_SIZE(s2mu005_irqs),
+       .num_regs = 4,
+       .status_base = S2MU005_REG_CHGR_INT1,
+       .mask_base = S2MU005_REG_CHGR_INT1M,
+       .get_irq_reg = s2mu005_irq_get_reg,
+};
+
 static const struct regmap_irq_chip s5m8767_irq_chip = {
        .name = "s5m8767",
        .irqs = s5m8767_irqs,
@@ -442,6 +512,9 @@ struct regmap_irq_chip_data *sec_irq_init(struct sec_pmic_dev *sec_pmic)
        case S2MPU05:
                sec_irq_chip = &s2mpu05_irq_chip;
                break;
+       case S2MU005:
+               sec_irq_chip = &s2mu005_irq_chip;
+               break;
        default:
                return dev_err_ptr_probe(sec_pmic->dev, -EINVAL, "Unsupported device type %d\n",
                                         sec_pmic->device_type);
index 4480c631110a6924bedb2d3a307a4fa7ddb2c87d..6191f409de945e4f894d3d629f6dc7e88d70d425 100644 (file)
@@ -47,6 +47,7 @@ enum sec_device_type {
        S2MPS15X,
        S2MPU02,
        S2MPU05,
+       S2MU005,
 };
 
 /**
index 6eab95de6fa8376e114dc5b347e61552a595331f..19d0f0e12944fd02bdd747ac7cd92637fc400dd1 100644 (file)
@@ -408,6 +408,72 @@ enum s2mpu05_irq {
 #define S2MPU05_IRQ_INT140C_MASK       BIT(1)
 #define S2MPU05_IRQ_TSD_MASK           BIT(2)
 
+enum s2mu005_irq {
+       S2MU005_IRQ_CHGR_DETBAT,
+       S2MU005_IRQ_CHGR_BAT,
+       S2MU005_IRQ_CHGR_IVR,
+       S2MU005_IRQ_CHGR_EVENT,
+       S2MU005_IRQ_CHGR_CHG,
+       S2MU005_IRQ_CHGR_VMID,
+       S2MU005_IRQ_CHGR_WCIN,
+       S2MU005_IRQ_CHGR_VBUS,
+
+       S2MU005_IRQ_FLED_LBPROT,
+       S2MU005_IRQ_FLED_OPENCH2,
+       S2MU005_IRQ_FLED_OPENCH1,
+       S2MU005_IRQ_FLED_SHORTCH2,
+       S2MU005_IRQ_FLED_SHORTCH1,
+
+       S2MU005_IRQ_MUIC_ATTACH,
+       S2MU005_IRQ_MUIC_DETACH,
+       S2MU005_IRQ_MUIC_KP,
+       S2MU005_IRQ_MUIC_LKP,
+       S2MU005_IRQ_MUIC_LKR,
+       S2MU005_IRQ_MUIC_RIDCHG,
+
+       S2MU005_IRQ_MUIC_VBUSON,
+       S2MU005_IRQ_MUIC_RSVD,
+       S2MU005_IRQ_MUIC_ADC,
+       S2MU005_IRQ_MUIC_STUCK,
+       S2MU005_IRQ_MUIC_STUCKRCV,
+       S2MU005_IRQ_MUIC_MHDL,
+       S2MU005_IRQ_MUIC_AVCHG,
+       S2MU005_IRQ_MUIC_VBUSOFF,
+
+       S2MU005_IRQ_NR,
+};
+
+#define S2MU005_IRQ_CHGR_DETBAT_MASK   BIT(0)
+#define S2MU005_IRQ_CHGR_BAT_MASK      BIT(1)
+#define S2MU005_IRQ_CHGR_IVR_MASK      BIT(2)
+#define S2MU005_IRQ_CHGR_EVENT_MASK    BIT(3)
+#define S2MU005_IRQ_CHGR_CHG_MASK      BIT(4)
+#define S2MU005_IRQ_CHGR_VMID_MASK     BIT(5)
+#define S2MU005_IRQ_CHGR_WCIN_MASK     BIT(6)
+#define S2MU005_IRQ_CHGR_VBUS_MASK     BIT(7)
+
+#define S2MU005_IRQ_FLED_LBPROT_MASK           BIT(2)
+#define S2MU005_IRQ_FLED_OPENCH2_MASK          BIT(4)
+#define S2MU005_IRQ_FLED_OPENCH1_MASK          BIT(5)
+#define S2MU005_IRQ_FLED_SHORTCH2_MASK         BIT(6)
+#define S2MU005_IRQ_FLED_SHORTCH1_MASK         BIT(7)
+
+#define S2MU005_IRQ_MUIC_ATTACH_MASK           BIT(0)
+#define S2MU005_IRQ_MUIC_DETACH_MASK           BIT(1)
+#define S2MU005_IRQ_MUIC_KP_MASK               BIT(2)
+#define S2MU005_IRQ_MUIC_LKP_MASK              BIT(3)
+#define S2MU005_IRQ_MUIC_LKR_MASK              BIT(4)
+#define S2MU005_IRQ_MUIC_RIDCHG_MASK           BIT(5)
+
+#define S2MU005_IRQ_MUIC_VBUSON_MASK           BIT(0)
+#define S2MU005_IRQ_MUIC_RSVD_MASK             BIT(1)
+#define S2MU005_IRQ_MUIC_ADC_MASK              BIT(2)
+#define S2MU005_IRQ_MUIC_STUCK_MASK            BIT(3)
+#define S2MU005_IRQ_MUIC_STUCKRCV_MASK         BIT(4)
+#define S2MU005_IRQ_MUIC_MHDL_MASK             BIT(5)
+#define S2MU005_IRQ_MUIC_AVCHG_MASK            BIT(6)
+#define S2MU005_IRQ_MUIC_VBUSOFF_MASK          BIT(7)
+
 enum s5m8767_irq {
        S5M8767_IRQ_PWRR,
        S5M8767_IRQ_PWRF,
diff --git a/include/linux/mfd/samsung/s2mu005.h b/include/linux/mfd/samsung/s2mu005.h
new file mode 100644 (file)
index 0000000..46e7759
--- /dev/null
@@ -0,0 +1,332 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd
+ * Copyright (c) 2026 Kaustabh Chakraborty <kauschluss@disroot.org>
+ * Copyright (c) 2026 Łukasz Lebiedziński <kernel@lvkasz.us>
+ */
+
+#ifndef __LINUX_MFD_S2MU005_H
+#define __LINUX_MFD_S2MU005_H
+
+#include <linux/bitfield.h>
+#include <linux/bits.h>
+
+/* S2MU005 registers */
+enum s2mu005_reg {
+       S2MU005_REG_CHGR_INT1,
+       S2MU005_REG_CHGR_INT1M,
+
+       S2MU005_REG_FLED_INT1,
+       S2MU005_REG_FLED_INT1M,
+
+       S2MU005_REG_MUIC_INT1,
+       S2MU005_REG_MUIC_INT2,
+       S2MU005_REG_MUIC_INT1M,
+       S2MU005_REG_MUIC_INT2M,
+
+       S2MU005_REG_CHGR_STATUS0,
+       S2MU005_REG_CHGR_STATUS1,
+       S2MU005_REG_CHGR_STATUS2,
+       S2MU005_REG_CHGR_STATUS3,
+       S2MU005_REG_CHGR_STATUS4,
+       S2MU005_REG_CHGR_STATUS5,
+       S2MU005_REG_CHGR_CTRL0,
+       S2MU005_REG_CHGR_CTRL1,
+       S2MU005_REG_CHGR_CTRL2,
+       S2MU005_REG_CHGR_CTRL3,
+       S2MU005_REG_CHGR_CTRL4,
+       S2MU005_REG_CHGR_CTRL5,
+       S2MU005_REG_CHGR_CTRL6,
+       S2MU005_REG_CHGR_CTRL7,
+       S2MU005_REG_CHGR_CTRL8,
+       S2MU005_REG_CHGR_CTRL9,
+       S2MU005_REG_CHGR_CTRL10,
+       S2MU005_REG_CHGR_CTRL11,
+       S2MU005_REG_CHGR_CTRL12,
+       S2MU005_REG_CHGR_CTRL13,
+       S2MU005_REG_CHGR_CTRL14,
+       S2MU005_REG_CHGR_CTRL15,
+       S2MU005_REG_CHGR_CTRL16,
+       S2MU005_REG_CHGR_CTRL17,
+       S2MU005_REG_CHGR_CTRL18,
+       S2MU005_REG_CHGR_CTRL19,
+       S2MU005_REG_CHGR_TEST0,
+       S2MU005_REG_CHGR_TEST1,
+       S2MU005_REG_CHGR_TEST2,
+       S2MU005_REG_CHGR_TEST3,
+       S2MU005_REG_CHGR_TEST4,
+       S2MU005_REG_CHGR_TEST5,
+       S2MU005_REG_CHGR_TEST6,
+       S2MU005_REG_CHGR_TEST7,
+       S2MU005_REG_CHGR_TEST8,
+       S2MU005_REG_CHGR_TEST9,
+       S2MU005_REG_CHGR_TEST10,
+
+       S2MU005_REG_FLED_STATUS,
+       S2MU005_REG_FLED_CH0_CTRL0,
+       S2MU005_REG_FLED_CH0_CTRL1,
+       S2MU005_REG_FLED_CH0_CTRL2,
+       S2MU005_REG_FLED_CH0_CTRL3,
+       S2MU005_REG_FLED_CH1_CTRL0,
+       S2MU005_REG_FLED_CH1_CTRL1,
+       S2MU005_REG_FLED_CH1_CTRL2,
+       S2MU005_REG_FLED_CH1_CTRL3,
+       S2MU005_REG_FLED_CTRL0,
+       S2MU005_REG_FLED_CTRL1,
+       S2MU005_REG_FLED_CTRL2,
+       S2MU005_REG_FLED_CTRL3,
+       S2MU005_REG_FLED_CTRL4,
+       S2MU005_REG_FLED_CTRL5,
+       S2MU005_REG_FLED_CTRL6,
+
+       S2MU005_REG_RGB_EN,
+       S2MU005_REG_RGB_CH0_CTRL,
+       S2MU005_REG_RGB_CH1_CTRL,
+       S2MU005_REG_RGB_CH2_CTRL,
+       S2MU005_REG_RGB_CH0_RAMP,
+       S2MU005_REG_RGB_CH0_STAY,
+       S2MU005_REG_RGB_CH1_RAMP,
+       S2MU005_REG_RGB_CH1_STAY,
+       S2MU005_REG_RGB_CH2_RAMP,
+       S2MU005_REG_RGB_CH2_STAY,
+       S2MU005_REG_RGB_TEST0,
+       S2MU005_REG_RGB_CTRL0,
+
+       S2MU005_REG_MUIC_ADC,
+       S2MU005_REG_MUIC_DEV1,
+       S2MU005_REG_MUIC_DEV2,
+       S2MU005_REG_MUIC_DEV3,
+       S2MU005_REG_MUIC_BUTTON1,
+       S2MU005_REG_MUIC_BUTTON2,
+       S2MU005_REG_MUIC_RESET,
+       S2MU005_REG_MUIC_CHGTYPE,
+       S2MU005_REG_MUIC_DEVAPPLE,
+       S2MU005_REG_MUIC_BCDRESCAN,
+       S2MU005_REG_MUIC_TEST1,
+       S2MU005_REG_MUIC_TEST2,
+       S2MU005_REG_MUIC_TEST3,
+
+       S2MU005_REG_ID = 0x73,
+
+       S2MU005_REG_MUIC_CTRL1 = 0xb2,
+       S2MU005_REG_MUIC_TIMERSET1,
+       S2MU005_REG_MUIC_TIMERSET2,
+       S2MU005_REG_MUIC_SWCTRL,
+       S2MU005_REG_MUIC_TIMERSET3,
+       S2MU005_REG_MUIC_CTRL2,
+       S2MU005_REG_MUIC_CTRL3,
+
+       S2MU005_REG_MUIC_LDOADC_L = 0xbf,
+       S2MU005_REG_MUIC_LDOADC_H,
+};
+
+#define S2MU005_REG_FLED_CH_CTRL0(x)   (S2MU005_REG_FLED_CH0_CTRL0 + 4 * (x))
+#define S2MU005_REG_FLED_CH_CTRL1(x)   (S2MU005_REG_FLED_CH0_CTRL1 + 4 * (x))
+#define S2MU005_REG_FLED_CH_CTRL2(x)   (S2MU005_REG_FLED_CH0_CTRL2 + 4 * (x))
+#define S2MU005_REG_FLED_CH_CTRL3(x)   (S2MU005_REG_FLED_CH0_CTRL3 + 4 * (x))
+
+#define S2MU005_REG_RGB_CH_CTRL(x)     (S2MU005_REG_RGB_CH0_CTRL + 1 * (x))
+#define S2MU005_REG_RGB_CH_RAMP(x)     (S2MU005_REG_RGB_CH0_RAMP + 2 * (x))
+#define S2MU005_REG_RGB_CH_STAY(x)     (S2MU005_REG_RGB_CH0_STAY + 2 * (x))
+
+/* S2MU005_REG_CHGR_STATUS0 */
+#define S2MU005_CHGR_VBUS              BIT(7)
+#define S2MU005_CHGR_WCIN              BIT(6)
+#define S2MU005_CHGR_VMID              BIT(5)
+#define S2MU005_CHGR_CHG               BIT(4)
+#define S2MU005_CHGR_STAT              GENMASK(3, 0)
+
+#define S2MU005_CHGR_STAT_DONE         8
+#define S2MU005_CHGR_STAT_TOPOFF       7
+#define S2MU005_CHGR_STAT_DONE_FLAG    6
+#define S2MU005_CHGR_STAT_CV           5
+#define S2MU005_CHGR_STAT_CC           4
+#define S2MU005_CHGR_STAT_COOL_CHG     3
+#define S2MU005_CHGR_STAT_PRE_CHG      2
+
+/* S2MU005_REG_CHGR_STATUS1 */
+#define S2MU005_CHGR_DETBAT            BIT(7)
+#define S2MU005_CHGR_VBUS_OVP          GENMASK(6, 4)
+
+#define S2MU005_CHGR_VBUS_OVP_OVERVOLT 2
+
+/* S2MU005_REG_CHGR_STATUS2 */
+#define S2MU005_CHGR_BAT               GENMASK(6, 4)
+
+#define S2MU005_CHGR_BAT_VOLT_DET      7
+#define S2MU005_CHGR_BAT_FAST_CHG_DET  6
+#define S2MU005_CHGR_BAT_COOL_CHG_DET  5
+#define S2MU005_CHGR_BAT_LOW_CHG       2
+#define S2MU005_CHGR_BAT_SELF_DISCHG   1
+#define S2MU005_CHGR_BAT_OVP_DET       0
+
+/* S2MU005_REG_CHGR_STATUS3 */
+#define S2MU005_CHGR_EVT               GENMASK(3, 0)
+
+#define S2MU005_CHGR_EVT_WDT_RST       6
+#define S2MU005_CHGR_EVT_WDT_SUSP      5
+#define S2MU005_CHGR_EVT_VSYS_VUVLO    4
+#define S2MU005_CHGR_EVT_VSYS_VOVP     3
+#define S2MU005_CHGR_EVT_THERM_FOLDBACK        2
+#define S2MU005_CHGR_EVT_THERM_SHUTDOWN        1
+
+/* S2MU005_REG_CHGR_CTRL0 */
+#define S2MU005_CHGR_CHG_EN            BIT(4)
+#define S2MU005_CHGR_OP_MODE           GENMASK(2, 0)
+
+#define S2MU005_CHGR_OP_MODE_OTG       BIT(2)
+#define S2MU005_CHGR_OP_MODE_CHG       BIT(1)
+
+/* S2MU005_REG_CHGR_CTRL1 */
+#define S2MU005_CHGR_VIN_DROP          GENMASK(6, 4)
+
+/* S2MU005_REG_CHGR_CTRL2 */
+#define S2MU005_CHGR_IN_CURR_LIM       GENMASK(5, 0)
+
+/* S2MU005_REG_CHGR_CTRL4 */
+#define S2MU005_CHGR_OTG_OCP_ON                BIT(5)
+#define S2MU005_CHGR_OTG_OCP_OFF       BIT(4)
+#define S2MU005_CHGR_OTG_OCP           GENMASK(3, 2)
+#define S2MU005_CHGR_OTG_OCP_1P5A      0x3
+
+/* S2MU005_REG_CHGR_CTRL5 */
+#define S2MU005_CHGR_VMID_BOOST                GENMASK(4, 0)
+#define S2MU005_CHGR_VMID_BOOST_5P1V   0x16
+
+/* S2MU005_REG_CHGR_CTRL6 */
+#define S2MU005_CHGR_COOL_CHG_CURR     GENMASK(5, 0)
+
+/* S2MU005_REG_CHGR_CTRL7 */
+#define S2MU005_CHGR_FAST_CHG_CURR     GENMASK(5, 0)
+
+/* S2MU005_REG_CHGR_CTRL8 */
+#define S2MU005_CHGR_VF_VBAT           GENMASK(6, 1)
+
+/* S2MU005_REG_CHGR_CTRL10 */
+#define S2MU005_CHGR_TOPOFF_CURR(x)    (GENMASK(3, 0) << 4 * (x))
+
+/* S2MU005_REG_CHGR_CTRL11 */
+#define S2MU005_CHGR_OSC_BOOST         GENMASK(6, 5)
+#define S2MU005_CHGR_OSC_BUCK          GENMASK(4, 3)
+#define S2MU005_CHGR_OSC_BOOST_2MHZ    0x3
+
+/* S2MU005_REG_CHGR_CTRL12 */
+#define S2MU005_CHGR_WDT               GENMASK(2, 0)
+
+#define S2MU005_CHGR_WDT_ON            BIT(2)
+#define S2MU005_CHGR_WDT_OFF           BIT(1)
+
+/* S2MU005_REG_CHGR_CTRL15 */
+#define S2MU005_CHGR_OTG_EN            GENMASK(3, 2)
+#define S2MU005_CHGR_OTG_EN_ON         0x3
+
+/* S2MU005_REG_FLED_STATUS */
+#define S2MU005_FLED_FLASH_STATUS(x)   (BIT(7) >> 2 * (x))
+#define S2MU005_FLED_TORCH_STATUS(x)   (BIT(6) >> 2 * (x))
+
+/* S2MU005_REG_FLED_CHx_CTRL0 */
+#define S2MU005_FLED_FLASH_IOUT                GENMASK(3, 0)
+
+/* S2MU005_REG_FLED_CHx_CTRL1 */
+#define S2MU005_FLED_TORCH_IOUT                GENMASK(3, 0)
+
+/* S2MU005_REG_FLED_CHx_CTRL2 */
+#define S2MU005_FLED_TORCH_TIMEOUT     GENMASK(3, 0)
+
+/* S2MU005_REG_FLED_CHx_CTRL3 */
+#define S2MU005_FLED_FLASH_TIMEOUT     GENMASK(3, 0)
+
+/* S2MU005_REG_FLED_CTRL1 */
+#define S2MU005_FLED_CH_EN             BIT(7)
+
+/*
+ * S2MU005_REG_FLED_CTRL4 - Rev. EVT0
+ * S2MU005_REG_FLED_CTRL6 - Rev. EVT1 and later
+ */
+#define S2MU005_FLED_FLASH_EN(x)       (GENMASK(7, 6) >> 4 * (x))
+#define S2MU005_FLED_TORCH_EN(x)       (GENMASK(5, 4) >> 4 * (x))
+
+/* S2MU005_REG_RGB_EN */
+#define S2MU005_RGB_RESET              BIT(6)
+#define S2MU005_RGB_SLOPE              GENMASK(5, 0)
+
+#define S2MU005_RGB_SLOPE_CONST                (BIT(4) | BIT(2) | BIT(0))
+#define S2MU005_RGB_SLOPE_SMOOTH       (BIT(5) | BIT(3) | BIT(1))
+
+/* S2MU005_REG_RGB_CHx_RAMP */
+#define S2MU005_RGB_CH_RAMP_UP         GENMASK(7, 4)
+#define S2MU005_RGB_CH_RAMP_DN         GENMASK(3, 0)
+
+/* S2MU005_REG_RGB_CHx_STAY */
+#define S2MU005_RGB_CH_STAY_HI         GENMASK(7, 4)
+#define S2MU005_RGB_CH_STAY_LO         GENMASK(3, 0)
+
+/* S2MU005_REG_MUIC_DEV1 */
+#define S2MU005_MUIC_OTG               BIT(7)
+#define S2MU005_MUIC_DCP               BIT(6)
+#define S2MU005_MUIC_CDP               BIT(5)
+#define S2MU005_MUIC_T1_T2_CHG         BIT(4)
+#define S2MU005_MUIC_UART              BIT(3)
+#define S2MU005_MUIC_SDP               BIT(2)
+#define S2MU005_MUIC_LANHUB            BIT(1)
+#define S2MU005_MUIC_AUDIO             BIT(0)
+
+/* S2MU005_REG_MUIC_DEV2 */
+#define S2MU005_MUIC_SDP_1P8S          BIT(7)
+#define S2MU005_MUIC_AV                        BIT(6)
+#define S2MU005_MUIC_TTY               BIT(5)
+#define S2MU005_MUIC_PPD               BIT(4)
+#define S2MU005_MUIC_JIG_UART_OFF      BIT(3)
+#define S2MU005_MUIC_JIG_UART_ON       BIT(2)
+#define S2MU005_MUIC_JIG_USB_OFF       BIT(1)
+#define S2MU005_MUIC_JIG_USB_ON                BIT(0)
+
+/* S2MU005_REG_MUIC_DEV3 */
+#define S2MU005_MUIC_U200_CHG          BIT(7)
+#define S2MU005_MUIC_VBUS_AV           BIT(4)
+#define S2MU005_MUIC_VBUS_R255         BIT(1)
+#define S2MU005_MUIC_MHL               BIT(0)
+
+/* S2MU005_REG_MUIC_DEVAPPLE */
+#define S2MU005_MUIC_APPLE_CHG_0P5A    BIT(7)
+#define S2MU005_MUIC_APPLE_CHG_1P0A    BIT(6)
+#define S2MU005_MUIC_APPLE_CHG_2P0A    BIT(5)
+#define S2MU005_MUIC_APPLE_CHG_2P4A    BIT(4)
+#define S2MU005_MUIC_SDP_DCD_OUT       BIT(3)
+#define S2MU005_MUIC_RID_WAKEUP                BIT(2)
+#define S2MU005_MUIC_VBUS_WAKEUP       BIT(1)
+#define S2MU005_MUIC_BCV1P2_OR_OPEN    BIT(0)
+
+/* S2MU005_REG_ID */
+#define S2MU005_ID_MASK                        GENMASK(3, 0)
+
+/* S2MU005_REG_MUIC_SWCTRL */
+#define S2MU005_MUIC_DM_DP             GENMASK(7, 2)
+#define S2MU005_MUIC_JIG               BIT(0)
+
+#define S2MU005_MUIC_DM_DP_UART                0x12
+#define S2MU005_MUIC_DM_DP_USB         0x09
+
+/* S2MU005_REG_MUIC_CTRL1 */
+#define S2MU005_MUIC_OPEN              BIT(4)
+#define S2MU005_MUIC_RAW_DATA          BIT(3)
+#define S2MU005_MUIC_MAN_SW            BIT(2)
+#define S2MU005_MUIC_WAIT              BIT(1)
+#define S2MU005_MUIC_IRQ               BIT(0)
+
+/* S2MU005_REG_MUIC_CTRL3 */
+#define S2MU005_MUIC_ONESHOT_ADC       BIT(2)
+
+/* S2MU005_REG_MUIC_LDOADC_L and S2MU005_REG_MUIC_LDOADC_H */
+#define S2MU005_MUIC_VSET              GENMASK(4, 0)
+
+#define S2MU005_MUIC_VSET_3P0V         0x1f
+#define S2MU005_MUIC_VSET_2P6V         0x0e
+#define S2MU005_MUIC_VSET_2P4V         0x0c
+#define S2MU005_MUIC_VSET_2P2V         0x0a
+#define S2MU005_MUIC_VSET_2P0V         0x08
+#define S2MU005_MUIC_VSET_1P5V         0x03
+#define S2MU005_MUIC_VSET_1P4V         0x02
+#define S2MU005_MUIC_VSET_1P2V         0x00
+
+#endif /* __LINUX_MFD_S2MU005_H */