summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorkeith.zhao <keith.zhao@starfivetech.com>2023-02-16 14:46:27 +0300
committerkeith.zhao <keith.zhao@starfivetech.com>2023-02-17 06:59:52 +0300
commit83dd8745566468e28ff72893c76eb5e7d69a8bf4 (patch)
tree60749ebbdfb909bbeedcaa059eca31a90f73d98c /drivers
parentf042c1ea252e3dfc955db03b0e95e0b322a7afca (diff)
downloadu-boot-83dd8745566468e28ff72893c76eb5e7d69a8bf4.tar.xz
i2c:desigware-snps: add i2c clock config
add clock config for i2c2 and i2c5 update the i2c driver clock config Signed-off-by:keith.zhao<keith.zhao@statfivetech.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/clk/starfive/clk-jh7110.c18
-rw-r--r--drivers/i2c/designware_i2c.c14
-rw-r--r--drivers/i2c/designware_i2c.h1
3 files changed, 28 insertions, 5 deletions
diff --git a/drivers/clk/starfive/clk-jh7110.c b/drivers/clk/starfive/clk-jh7110.c
index ec14a91f68..581d8b62cd 100644
--- a/drivers/clk/starfive/clk-jh7110.c
+++ b/drivers/clk/starfive/clk-jh7110.c
@@ -690,6 +690,24 @@ static int jh7110_clk_init(struct udevice *dev)
"u0_dom_vout_top_clk_mipiphy_ref", "osc",
SYS_OFFSET(JH7110_MCLK_INNER), 2));
+ /*i2c5*/
+ clk_dm(JH7110_I2C5_CLK_APB,
+ starfive_clk_gate(priv->sys,
+ "u5_dw_i2c_clk_apb", "apb0",
+ SYS_OFFSET(JH7110_I2C5_CLK_APB)));
+ clk_dm(JH7110_I2C5_CLK_CORE,
+ starfive_clk_fix_factor(priv->sys,
+ "u5_dw_i2c_clk_core", "u5_dw_i2c_clk_apb", 1, 1));
+
+ /*i2c2*/
+ clk_dm(JH7110_I2C2_CLK_APB,
+ starfive_clk_gate(priv->sys,
+ "u2_dw_i2c_clk_apb", "apb0",
+ SYS_OFFSET(JH7110_I2C2_CLK_APB)));
+ clk_dm(JH7110_I2C2_CLK_CORE,
+ starfive_clk_fix_factor(priv->sys,
+ "u2_dw_i2c_clk_core", "u2_dw_i2c_clk_apb", 1, 1));
+
return 0;
}
diff --git a/drivers/i2c/designware_i2c.c b/drivers/i2c/designware_i2c.c
index e57eed0f6c..c1b3df9600 100644
--- a/drivers/i2c/designware_i2c.c
+++ b/drivers/i2c/designware_i2c.c
@@ -775,10 +775,14 @@ int designware_i2c_of_to_plat(struct udevice *bus)
if (ret)
return ret;
- ret = clk_enable(&priv->clk);
+ ret = clk_get_bulk(bus, &priv->clks);
+ if (ret)
+ return ret;
+
+ ret = clk_enable_bulk(&priv->clks);
if (ret && ret != -ENOSYS && ret != -ENOTSUPP) {
- clk_free(&priv->clk);
- dev_err(bus, "failed to enable clock\n");
+ clk_release_bulk(&priv->clks);
+ dev_err(bus, "failed to enable bulk clock\n");
return ret;
}
#endif
@@ -809,8 +813,8 @@ int designware_i2c_remove(struct udevice *dev)
struct dw_i2c *priv = dev_get_priv(dev);
#if CONFIG_IS_ENABLED(CLK)
- clk_disable(&priv->clk);
- clk_free(&priv->clk);
+ clk_disable_bulk(&priv->clks);
+ clk_release_bulk(&priv->clks);
#endif
return reset_release_bulk(&priv->resets);
diff --git a/drivers/i2c/designware_i2c.h b/drivers/i2c/designware_i2c.h
index 9b2349a0a2..d5aaef1d79 100644
--- a/drivers/i2c/designware_i2c.h
+++ b/drivers/i2c/designware_i2c.h
@@ -204,6 +204,7 @@ struct dw_i2c {
bool has_spk_cnt;
#if CONFIG_IS_ENABLED(CLK)
struct clk clk;
+ struct clk_bulk clks;
#endif
struct dw_i2c_speed_config config;
};