Add segment setting for bus select

Signed-off-by: Jim Liu <[email protected]>
---
 drivers/i2c/npcm_i2c.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/drivers/i2c/npcm_i2c.c b/drivers/i2c/npcm_i2c.c
index d57237a6df1..cc1847893f6 100644
--- a/drivers/i2c/npcm_i2c.c
+++ b/drivers/i2c/npcm_i2c.c
@@ -14,6 +14,7 @@
 #define NPCM_I2C_TIMEOUT_MS            10
 #define NPCM7XX_I2CSEGCTL_INIT_VAL     0x0333F000
 #define NPCM8XX_I2CSEGCTL_INIT_VAL     0x9333F000
+#define NPCM_I2CSEGCTL_SEG_MASK                0x3
 
 /* SCLFRQ min/max field values  */
 #define SCLFRQ_MIN             10
@@ -112,6 +113,7 @@ struct npcm_i2c_bus {
        u32 freq;
        bool started;
 };
+static const u8 npcm_i2csegctl_shift[] = {0,2,4,6,8,10,26,29};
 
 static void npcm_dump_regs(struct npcm_i2c_bus *bus)
 {
@@ -564,6 +566,7 @@ static int npcm_i2c_probe(struct udevice *dev)
        struct npcm_gcr *gcr = (struct npcm_gcr *)NPCM_GCR_BA;
        struct npcm_i2c_regs *reg;
        u32 i2csegctl_val = dev_get_driver_data(dev);
+       u32 segment;
        struct clk clk;
        int ret;
 
@@ -590,6 +593,16 @@ static int npcm_i2c_probe(struct udevice *dev)
        }
 
        /* set initial i2csegctl value */
+       if(IS_ENABLED(CONFIG_ARCH_NPCM8XX)) {
+               i2csegctl_val = readl(&gcr->i2csegctl);
+               i2csegctl_val |= NPCM8XX_I2CSEGCTL_INIT_VAL;
+               if(bus->num < 8) {
+                       segment = 
dev_read_u32_default(dev,"nuvoton,i2c-segment",0);
+                       segment &= NPCM_I2CSEGCTL_SEG_MASK;
+                       i2csegctl_val |= (segment << 
npcm_i2csegctl_shift[bus->num] );
+               }
+       }
+
        writel(i2csegctl_val, &gcr->i2csegctl);
 
        /* enable SMB module */
-- 
2.34.1

Reply via email to