| .. | .. |
|---|
| 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, |
|---|