i2c: sh_mobile: add helper to check frequency calculations
Because we will add a second formula soon, put the sanity checks for the computed results into a separate function. Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com> Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
This commit is contained in:
Родитель
023c22fd82
Коммит
c3449f73a8
|
@ -246,32 +246,10 @@ static u32 sh_mobile_i2c_icch(unsigned long count_khz, u32 tHIGH, u32 tf)
|
||||||
return (((count_khz * (tHIGH + tf)) + 5000) / 10000);
|
return (((count_khz * (tHIGH + tf)) + 5000) / 10000);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sh_mobile_i2c_init(struct sh_mobile_i2c_data *pd)
|
static int sh_mobile_i2c_check_timing(struct sh_mobile_i2c_data *pd)
|
||||||
{
|
{
|
||||||
unsigned long i2c_clk_khz;
|
u16 max_val = pd->flags & IIC_FLAG_HAS_ICIC67 ? 0x1ff : 0xff;
|
||||||
u32 tHIGH, tLOW, tf;
|
|
||||||
uint16_t max_val;
|
|
||||||
|
|
||||||
i2c_clk_khz = clk_get_rate(pd->clk) / 1000 / pd->clks_per_count;
|
|
||||||
|
|
||||||
if (pd->bus_speed == STANDARD_MODE) {
|
|
||||||
tLOW = 47; /* tLOW = 4.7 us */
|
|
||||||
tHIGH = 40; /* tHD;STA = tHIGH = 4.0 us */
|
|
||||||
tf = 3; /* tf = 0.3 us */
|
|
||||||
} else if (pd->bus_speed == FAST_MODE) {
|
|
||||||
tLOW = 13; /* tLOW = 1.3 us */
|
|
||||||
tHIGH = 6; /* tHD;STA = tHIGH = 0.6 us */
|
|
||||||
tf = 3; /* tf = 0.3 us */
|
|
||||||
} else {
|
|
||||||
dev_err(pd->dev, "unrecognized bus speed %lu Hz\n",
|
|
||||||
pd->bus_speed);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
pd->iccl = sh_mobile_i2c_iccl(i2c_clk_khz, tLOW, tf);
|
|
||||||
pd->icch = sh_mobile_i2c_icch(i2c_clk_khz, tHIGH, tf);
|
|
||||||
|
|
||||||
max_val = pd->flags & IIC_FLAG_HAS_ICIC67 ? 0x1ff : 0xff;
|
|
||||||
if (pd->iccl > max_val || pd->icch > max_val) {
|
if (pd->iccl > max_val || pd->icch > max_val) {
|
||||||
dev_err(pd->dev, "timing values out of range: L/H=0x%x/0x%x\n",
|
dev_err(pd->dev, "timing values out of range: L/H=0x%x/0x%x\n",
|
||||||
pd->iccl, pd->icch);
|
pd->iccl, pd->icch);
|
||||||
|
@ -294,6 +272,33 @@ static int sh_mobile_i2c_init(struct sh_mobile_i2c_data *pd)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int sh_mobile_i2c_init(struct sh_mobile_i2c_data *pd)
|
||||||
|
{
|
||||||
|
unsigned long i2c_clk_khz;
|
||||||
|
u32 tHIGH, tLOW, tf;
|
||||||
|
|
||||||
|
i2c_clk_khz = clk_get_rate(pd->clk) / 1000 / pd->clks_per_count;
|
||||||
|
|
||||||
|
if (pd->bus_speed == STANDARD_MODE) {
|
||||||
|
tLOW = 47; /* tLOW = 4.7 us */
|
||||||
|
tHIGH = 40; /* tHD;STA = tHIGH = 4.0 us */
|
||||||
|
tf = 3; /* tf = 0.3 us */
|
||||||
|
} else if (pd->bus_speed == FAST_MODE) {
|
||||||
|
tLOW = 13; /* tLOW = 1.3 us */
|
||||||
|
tHIGH = 6; /* tHD;STA = tHIGH = 0.6 us */
|
||||||
|
tf = 3; /* tf = 0.3 us */
|
||||||
|
} else {
|
||||||
|
dev_err(pd->dev, "unrecognized bus speed %lu Hz\n",
|
||||||
|
pd->bus_speed);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
pd->iccl = sh_mobile_i2c_iccl(i2c_clk_khz, tLOW, tf);
|
||||||
|
pd->icch = sh_mobile_i2c_icch(i2c_clk_khz, tHIGH, tf);
|
||||||
|
|
||||||
|
return sh_mobile_i2c_check_timing(pd);
|
||||||
|
}
|
||||||
|
|
||||||
static unsigned char i2c_op(struct sh_mobile_i2c_data *pd,
|
static unsigned char i2c_op(struct sh_mobile_i2c_data *pd,
|
||||||
enum sh_mobile_i2c_op op, unsigned char data)
|
enum sh_mobile_i2c_op op, unsigned char data)
|
||||||
{
|
{
|
||||||
|
|
Загрузка…
Ссылка в новой задаче