.. | .. |
---|
45 | 45 | struct serdes_function_data { |
---|
46 | 46 | u8 gpio_rx_en:1; |
---|
47 | 47 | u16 gpio_id; |
---|
| 48 | + u16 mdelay; |
---|
48 | 49 | }; |
---|
49 | 50 | |
---|
50 | 51 | static const char *serdes_gpio_groups[] = { |
---|
.. | .. |
---|
71 | 72 | .num_group_names = ARRAY_SIZE(serdes_gpio_groups), \ |
---|
72 | 73 | .data = (void *)(const struct serdes_function_data []) { \ |
---|
73 | 74 | { .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, } \ |
---|
74 | 85 | }, \ |
---|
75 | 86 | } \ |
---|
76 | 87 | |
---|
.. | .. |
---|
154 | 165 | |
---|
155 | 166 | FUNCTION_DESC_GPIO_OUTPUT_HIGH(), |
---|
156 | 167 | 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), |
---|
157 | 174 | }; |
---|
158 | 175 | |
---|
159 | 176 | static struct serdes_chip_pinctrl_info bu18rl82_pinctrl_info = { |
---|
.. | .. |
---|
203 | 220 | |
---|
204 | 221 | static int bu18rl82_bridge_init(struct serdes *serdes) |
---|
205 | 222 | { |
---|
206 | | - return 0; |
---|
207 | | - |
---|
208 | 223 | bu18rl82_bridge_swrst(serdes); |
---|
209 | 224 | |
---|
210 | 225 | return 0; |
---|
211 | 226 | } |
---|
212 | 227 | |
---|
213 | | -static int bu18rl82_bridge_enable(struct serdes *serdes) |
---|
| 228 | +static int bu18rl82_bridge_pre_enable(struct serdes *serdes) |
---|
214 | 229 | { |
---|
215 | 230 | int ret = 0; |
---|
216 | 231 | |
---|
217 | 232 | /* 1:enable 0:disable */ |
---|
218 | 233 | bu18rl82_enable_hwint(serdes, 0); |
---|
219 | 234 | |
---|
| 235 | + msleep(100); |
---|
| 236 | + |
---|
220 | 237 | SERDES_DBG_CHIP("%s: serdes %s ret=%d\n", __func__, |
---|
221 | 238 | serdes->chip_data->name, ret); |
---|
222 | 239 | return ret; |
---|
223 | 240 | } |
---|
224 | 241 | |
---|
225 | | -static int bu18rl82_bridge_disable(struct serdes *serdes) |
---|
| 242 | +static int bu18rl82_bridge_post_disable(struct serdes *serdes) |
---|
226 | 243 | { |
---|
227 | 244 | return 0; |
---|
228 | 245 | } |
---|
229 | 246 | |
---|
230 | 247 | 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, |
---|
234 | 250 | }; |
---|
235 | 251 | |
---|
236 | 252 | static int bu18rl82_pinctrl_config_get(struct serdes *serdes, |
---|
.. | .. |
---|
320 | 336 | struct function_desc *func; |
---|
321 | 337 | struct group_desc *grp; |
---|
322 | 338 | int i, offset; |
---|
| 339 | + u16 ms; |
---|
323 | 340 | |
---|
324 | 341 | func = pinmux_generic_get_function(pinctrl->pctl, function); |
---|
325 | 342 | if (!func) |
---|
.. | .. |
---|
335 | 352 | |
---|
336 | 353 | if (func->data) { |
---|
337 | 354 | struct serdes_function_data *fdata = func->data; |
---|
| 355 | + ms = fdata->mdelay; |
---|
338 | 356 | |
---|
339 | 357 | for (i = 0; i < grp->num_pins; i++) { |
---|
340 | 358 | offset = grp->pins[i] - pinctrl->pin_base; |
---|
.. | .. |
---|
344 | 362 | else |
---|
345 | 363 | SERDES_DBG_CHIP("%s: serdes chip %s gpio_id=0x%x, offset=%d\n", |
---|
346 | 364 | __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)); |
---|
350 | 365 | |
---|
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)); |
---|
355 | 370 | |
---|
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 | + } |
---|
363 | 388 | } |
---|
364 | 389 | } |
---|
365 | 390 | |
---|
.. | .. |
---|
447 | 472 | .serdes_id = ROHM_ID_BU18RL82, |
---|
448 | 473 | .bridge_type = TYPE_BRIDGE_BRIDGE, |
---|
449 | 474 | .connector_type = DRM_MODE_CONNECTOR_LVDS, |
---|
| 475 | + .chip_init = bu18rl82_bridge_init, |
---|
450 | 476 | .regmap_config = &bu18rl82_regmap_config, |
---|
451 | 477 | .pinctrl_info = &bu18rl82_pinctrl_info, |
---|
452 | 478 | .bridge_ops = &bu18rl82_bridge_ops, |
---|