Skip to content

Commit 603df19

Browse files
tq-steinabebarino
authored andcommitted
clk: rs9: Support device specific dif bit calculation
The calculation DIFx is BIT(n) +1 is only true for 9FGV0241. With additional devices this is getting more complicated. Support a base bit for the DIF calculation, currently only devices with consecutive bits are supported, e.g. the 6-channel device needs additional logic. Signed-off-by: Alexander Stein <alexander.stein@ew.tq-group.com> Reviewed-by: Marek Vasut <marex@denx.de> Link: https://lore.kernel.org/r/20230310075535.3476580-3-alexander.stein@ew.tq-group.com Signed-off-by: Stephen Boyd <sboyd@kernel.org>
1 parent 51f2be4 commit 603df19

File tree

1 file changed

+19
-13
lines changed

1 file changed

+19
-13
lines changed

drivers/clk/clk-renesas-pcie.c

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
#include <linux/regmap.h>
1919

2020
#define RS9_REG_OE 0x0
21-
#define RS9_REG_OE_DIF_OE(n) BIT((n) + 1)
2221
#define RS9_REG_SS 0x1
2322
#define RS9_REG_SS_AMP_0V6 0x0
2423
#define RS9_REG_SS_AMP_0V7 0x1
@@ -31,9 +30,6 @@
3130
#define RS9_REG_SS_SSC_MASK (3 << 3)
3231
#define RS9_REG_SS_SSC_LOCK BIT(5)
3332
#define RS9_REG_SR 0x2
34-
#define RS9_REG_SR_2V0_DIF(n) 0
35-
#define RS9_REG_SR_3V0_DIF(n) BIT((n) + 1)
36-
#define RS9_REG_SR_DIF_MASK(n) BIT((n) + 1)
3733
#define RS9_REG_REF 0x3
3834
#define RS9_REG_REF_OE BIT(4)
3935
#define RS9_REG_REF_OD BIT(5)
@@ -159,17 +155,27 @@ static const struct regmap_config rs9_regmap_config = {
159155
.reg_read = rs9_regmap_i2c_read,
160156
};
161157

158+
static u8 rs9_calc_dif(const struct rs9_driver_data *rs9, int idx)
159+
{
160+
enum rs9_model model = rs9->chip_info->model;
161+
162+
if (model == RENESAS_9FGV0241)
163+
return BIT(idx) + 1;
164+
165+
return 0;
166+
}
167+
162168
static int rs9_get_output_config(struct rs9_driver_data *rs9, int idx)
163169
{
164170
struct i2c_client *client = rs9->client;
171+
u8 dif = rs9_calc_dif(rs9, idx);
165172
unsigned char name[5] = "DIF0";
166173
struct device_node *np;
167174
int ret;
168175
u32 sr;
169176

170177
/* Set defaults */
171-
rs9->clk_dif_sr &= ~RS9_REG_SR_DIF_MASK(idx);
172-
rs9->clk_dif_sr |= RS9_REG_SR_3V0_DIF(idx);
178+
rs9->clk_dif_sr |= dif;
173179

174180
snprintf(name, 5, "DIF%d", idx);
175181
np = of_get_child_by_name(client->dev.of_node, name);
@@ -181,11 +187,9 @@ static int rs9_get_output_config(struct rs9_driver_data *rs9, int idx)
181187
of_node_put(np);
182188
if (!ret) {
183189
if (sr == 2000000) { /* 2V/ns */
184-
rs9->clk_dif_sr &= ~RS9_REG_SR_DIF_MASK(idx);
185-
rs9->clk_dif_sr |= RS9_REG_SR_2V0_DIF(idx);
190+
rs9->clk_dif_sr &= ~dif;
186191
} else if (sr == 3000000) { /* 3V/ns (default) */
187-
rs9->clk_dif_sr &= ~RS9_REG_SR_DIF_MASK(idx);
188-
rs9->clk_dif_sr |= RS9_REG_SR_3V0_DIF(idx);
192+
rs9->clk_dif_sr |= dif;
189193
} else
190194
ret = dev_err_probe(&client->dev, -EINVAL,
191195
"Invalid renesas,slew-rate value\n");
@@ -256,11 +260,13 @@ static void rs9_update_config(struct rs9_driver_data *rs9)
256260
}
257261

258262
for (i = 0; i < rs9->chip_info->num_clks; i++) {
259-
if (rs9->clk_dif_sr & RS9_REG_SR_3V0_DIF(i))
263+
u8 dif = rs9_calc_dif(rs9, i);
264+
265+
if (rs9->clk_dif_sr & dif)
260266
continue;
261267

262-
regmap_update_bits(rs9->regmap, RS9_REG_SR, RS9_REG_SR_3V0_DIF(i),
263-
rs9->clk_dif_sr & RS9_REG_SR_3V0_DIF(i));
268+
regmap_update_bits(rs9->regmap, RS9_REG_SR, dif,
269+
rs9->clk_dif_sr & dif);
264270
}
265271
}
266272

0 commit comments

Comments
 (0)