summaryrefslogtreecommitdiffstats
path: root/drivers/i2c
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2024-02-05 08:45:46 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2024-02-08 08:17:00 +0100
commitb28091f154eaa70b7e8ca229c1ebe9ab3caa4ad6 (patch)
tree504c060fb86fe24ae8145811a1472bf20a26a7b2 /drivers/i2c
parent31a6cc5f09362a866526ff2530d799b49a5592df (diff)
downloadbarebox-b28091f154eaa70b7e8ca229c1ebe9ab3caa4ad6.tar.gz
barebox-b28091f154eaa70b7e8ca229c1ebe9ab3caa4ad6.tar.xz
i2c: lpi2c: determine clk rate during probe
The clock rate is not expected to change during runtime, so we can determine it during probe instead of later when actually transferring messages. This helps us to integrate PBL support into the driver where we don't have clk_get_rate() available. Link: https://lore.barebox.org/20240205074553.2005284-2-s.hauer@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/i2c')
-rw-r--r--drivers/i2c/busses/i2c-imx-lpi2c.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/drivers/i2c/busses/i2c-imx-lpi2c.c b/drivers/i2c/busses/i2c-imx-lpi2c.c
index f28a445601..91203d90be 100644
--- a/drivers/i2c/busses/i2c-imx-lpi2c.c
+++ b/drivers/i2c/busses/i2c-imx-lpi2c.c
@@ -104,6 +104,7 @@ struct lpi2c_imx_struct {
unsigned int txfifosize;
unsigned int rxfifosize;
enum lpi2c_imx_mode mode;
+ unsigned long clk_rate;
};
static void lpi2c_imx_intctrl(struct lpi2c_imx_struct *lpi2c_imx,
@@ -197,23 +198,19 @@ static void lpi2c_imx_stop(struct lpi2c_imx_struct *lpi2c_imx)
static int lpi2c_imx_config(struct lpi2c_imx_struct *lpi2c_imx)
{
u8 prescale, filt, sethold, datavd;
- unsigned int clk_rate, clk_cycle, clkhi, clklo;
+ unsigned int clk_cycle, clkhi, clklo;
enum lpi2c_imx_pincfg pincfg;
unsigned int temp;
lpi2c_imx_set_mode(lpi2c_imx);
- clk_rate = clk_get_rate(lpi2c_imx->clks[0].clk);
- if (!clk_rate)
- return -EINVAL;
-
if (lpi2c_imx->mode == HS || lpi2c_imx->mode == ULTRA_FAST)
filt = 0;
else
filt = 2;
for (prescale = 0; prescale <= 7; prescale++) {
- clk_cycle = clk_rate / ((1 << prescale) * lpi2c_imx->bitrate)
+ clk_cycle = lpi2c_imx->clk_rate / ((1 << prescale) * lpi2c_imx->bitrate)
- 3 - (filt >> 1);
clkhi = DIV_ROUND_UP(clk_cycle, I2C_CLK_RATIO + 1);
clklo = clk_cycle - clkhi;
@@ -493,6 +490,8 @@ static int lpi2c_imx_probe(struct device *dev)
if (ret)
return ret;
+ lpi2c_imx->clk_rate = clk_get_rate(lpi2c_imx->clks[0].clk);
+
temp = readl(lpi2c_imx->base + LPI2C_PARAM);
lpi2c_imx->txfifosize = 1 << (temp & 0x0f);
lpi2c_imx->rxfifosize = 1 << ((temp >> 8) & 0x0f);