hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/mfd/display-serdes/rohm/rohm-bu18rl82.c
....@@ -45,6 +45,7 @@
4545 struct serdes_function_data {
4646 u8 gpio_rx_en:1;
4747 u16 gpio_id;
48
+ u16 mdelay;
4849 };
4950
5051 static const char *serdes_gpio_groups[] = {
....@@ -71,6 +72,16 @@
7172 .num_group_names = ARRAY_SIZE(serdes_gpio_groups), \
7273 .data = (void *)(const struct serdes_function_data []) { \
7374 { .gpio_rx_en = 0, .gpio_id = id + 2 } \
75
+ }, \
76
+} \
77
+
78
+#define FUNCTION_DES_DELAY_MS(ms) \
79
+{ \
80
+ .name = "DELAY_"#ms"MS", \
81
+ .group_names = serdes_gpio_groups, \
82
+ .num_group_names = ARRAY_SIZE(serdes_gpio_groups), \
83
+ .data = (void *)(const struct serdes_function_data []) { \
84
+ { .mdelay = ms, } \
7485 }, \
7586 } \
7687
....@@ -154,6 +165,12 @@
154165
155166 FUNCTION_DESC_GPIO_OUTPUT_HIGH(),
156167 FUNCTION_DESC_GPIO_OUTPUT_LOW(),
168
+
169
+ FUNCTION_DES_DELAY_MS(10),
170
+ FUNCTION_DES_DELAY_MS(50),
171
+ FUNCTION_DES_DELAY_MS(100),
172
+ FUNCTION_DES_DELAY_MS(200),
173
+ FUNCTION_DES_DELAY_MS(500),
157174 };
158175
159176 static struct serdes_chip_pinctrl_info bu18rl82_pinctrl_info = {
....@@ -203,34 +220,33 @@
203220
204221 static int bu18rl82_bridge_init(struct serdes *serdes)
205222 {
206
- return 0;
207
-
208223 bu18rl82_bridge_swrst(serdes);
209224
210225 return 0;
211226 }
212227
213
-static int bu18rl82_bridge_enable(struct serdes *serdes)
228
+static int bu18rl82_bridge_pre_enable(struct serdes *serdes)
214229 {
215230 int ret = 0;
216231
217232 /* 1:enable 0:disable */
218233 bu18rl82_enable_hwint(serdes, 0);
219234
235
+ msleep(100);
236
+
220237 SERDES_DBG_CHIP("%s: serdes %s ret=%d\n", __func__,
221238 serdes->chip_data->name, ret);
222239 return ret;
223240 }
224241
225
-static int bu18rl82_bridge_disable(struct serdes *serdes)
242
+static int bu18rl82_bridge_post_disable(struct serdes *serdes)
226243 {
227244 return 0;
228245 }
229246
230247 static struct serdes_chip_bridge_ops bu18rl82_bridge_ops = {
231
- .init = bu18rl82_bridge_init,
232
- .enable = bu18rl82_bridge_enable,
233
- .disable = bu18rl82_bridge_disable,
248
+ .enable = bu18rl82_bridge_pre_enable,
249
+ .disable = bu18rl82_bridge_post_disable,
234250 };
235251
236252 static int bu18rl82_pinctrl_config_get(struct serdes *serdes,
....@@ -320,6 +336,7 @@
320336 struct function_desc *func;
321337 struct group_desc *grp;
322338 int i, offset;
339
+ u16 ms;
323340
324341 func = pinmux_generic_get_function(pinctrl->pctl, function);
325342 if (!func)
....@@ -335,6 +352,7 @@
335352
336353 if (func->data) {
337354 struct serdes_function_data *fdata = func->data;
355
+ ms = fdata->mdelay;
338356
339357 for (i = 0; i < grp->num_pins; i++) {
340358 offset = grp->pins[i] - pinctrl->pin_base;
....@@ -344,22 +362,29 @@
344362 else
345363 SERDES_DBG_CHIP("%s: serdes chip %s gpio_id=0x%x, offset=%d\n",
346364 __func__, serdes->chip_data->name, fdata->gpio_id, offset);
347
- serdes_set_bits(serdes, bu18rl82_gpio_oen[offset].reg,
348
- bu18rl82_gpio_oen[offset].mask,
349
- FIELD_PREP(BIT(3), fdata->gpio_rx_en));
350365
351
- serdes_set_bits(serdes, bu18rl82_gpio_id_low[offset].reg,
352
- bu18rl82_gpio_id_low[offset].mask,
353
- FIELD_PREP(GENMASK(7, 0),
354
- (fdata->gpio_id & 0xff)));
366
+ if (!ms) {
367
+ serdes_set_bits(serdes, bu18rl82_gpio_oen[offset].reg,
368
+ bu18rl82_gpio_oen[offset].mask,
369
+ FIELD_PREP(BIT(3), fdata->gpio_rx_en));
355370
356
- serdes_set_bits(serdes, bu18rl82_gpio_id_high[offset].reg,
357
- bu18rl82_gpio_id_high[offset].mask,
358
- FIELD_PREP(GENMASK(2, 0),
359
- ((fdata->gpio_id >> 8) & 0x7)));
360
- serdes_set_bits(serdes, bu18rl82_gpio_pden[offset].reg,
361
- bu18rl82_gpio_pden[offset].mask,
362
- FIELD_PREP(BIT(4), 0));
371
+ serdes_set_bits(serdes, bu18rl82_gpio_id_low[offset].reg,
372
+ bu18rl82_gpio_id_low[offset].mask,
373
+ FIELD_PREP(GENMASK(7, 0),
374
+ (fdata->gpio_id & 0xff)));
375
+
376
+ serdes_set_bits(serdes, bu18rl82_gpio_id_high[offset].reg,
377
+ bu18rl82_gpio_id_high[offset].mask,
378
+ FIELD_PREP(GENMASK(2, 0),
379
+ ((fdata->gpio_id >> 8) & 0x7)));
380
+ serdes_set_bits(serdes, bu18rl82_gpio_pden[offset].reg,
381
+ bu18rl82_gpio_pden[offset].mask,
382
+ FIELD_PREP(BIT(4), 0));
383
+ } else {
384
+ mdelay(ms);
385
+ SERDES_DBG_CHIP("%s: delay %d ms\n",
386
+ __func__, ms);
387
+ }
363388 }
364389 }
365390
....@@ -447,6 +472,7 @@
447472 .serdes_id = ROHM_ID_BU18RL82,
448473 .bridge_type = TYPE_BRIDGE_BRIDGE,
449474 .connector_type = DRM_MODE_CONNECTOR_LVDS,
475
+ .chip_init = bu18rl82_bridge_init,
450476 .regmap_config = &bu18rl82_regmap_config,
451477 .pinctrl_info = &bu18rl82_pinctrl_info,
452478 .bridge_ops = &bu18rl82_bridge_ops,