.. | .. |
---|
15 | 15 | } |
---|
16 | 16 | |
---|
17 | 17 | static struct mipi_dsi_device *serdes_attach_dsi(struct serdes_bridge *serdes_bridge, |
---|
18 | | - struct device_node *dsi_node) |
---|
| 18 | + struct device_node *remote_node) |
---|
19 | 19 | { |
---|
20 | 20 | struct mipi_dsi_device_info info = { "serdes", 0, NULL }; |
---|
21 | 21 | struct serdes *serdes = serdes_bridge->parent; |
---|
.. | .. |
---|
29 | 29 | SERDES_DBG_MFD("%s: type=%s, name=%s\n", __func__, |
---|
30 | 30 | info.type, serdes->chip_data->name); |
---|
31 | 31 | |
---|
32 | | - host = of_find_mipi_dsi_host_by_node(dsi_node); |
---|
| 32 | + host = of_find_mipi_dsi_host_by_node(remote_node); |
---|
33 | 33 | if (!host) { |
---|
34 | 34 | dev_err(serdes_bridge->dev, "failed to find serdes dsi host\n"); |
---|
35 | 35 | return ERR_PTR(-EPROBE_DEFER); |
---|
.. | .. |
---|
49 | 49 | (!strcmp(serdes->chip_data->name, "bu18rl82"))) { |
---|
50 | 50 | dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | |
---|
51 | 51 | MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_EOT_PACKET; |
---|
52 | | - SERDES_DBG_MFD("%s: dsi mode MIPI_DSI_MODE_VIDEO_BURST 0x%lx\n", |
---|
53 | | - __func__, dsi->mode_flags); |
---|
| 52 | + SERDES_DBG_MFD("%s: %s dsi_mode MIPI_DSI_MODE_VIDEO_BURST 0x%lx\n", |
---|
| 53 | + __func__, serdes->chip_data->name, dsi->mode_flags); |
---|
| 54 | + } else { |
---|
| 55 | + dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE; |
---|
| 56 | + SERDES_DBG_MFD("%s: %s dsi_mode MIPI_DSI_MODE_VIDEO_SYNC_PULSE 0x%lx\n", |
---|
| 57 | + __func__, serdes->chip_data->name, dsi->mode_flags); |
---|
54 | 58 | } |
---|
55 | 59 | } else { |
---|
56 | 60 | dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE; |
---|
57 | | - SERDES_DBG_MFD("%s: dsi mode MIPI_DSI_MODE_VIDEO_SYNC_PULSE 0x%lx\n", |
---|
58 | | - __func__, dsi->mode_flags); |
---|
| 61 | + SERDES_DBG_MFD("%s: %s dsi_mode MIPI_DSI_MODE_VIDEO_SYNC_PULSE 0x%lx\n", |
---|
| 62 | + __func__, serdes->chip_data->name, dsi->mode_flags); |
---|
59 | 63 | } |
---|
60 | 64 | |
---|
61 | 65 | ret = mipi_dsi_attach(dsi); |
---|
.. | .. |
---|
86 | 90 | dev_info(serdes_bridge->dev->parent, "serdes sel_mipi %d\n", |
---|
87 | 91 | serdes_bridge->sel_mipi); |
---|
88 | 92 | /* Attach primary DSI */ |
---|
89 | | - serdes_bridge->dsi = serdes_attach_dsi(serdes_bridge, serdes_bridge->dsi_node); |
---|
| 93 | + serdes_bridge->dsi = serdes_attach_dsi(serdes_bridge, serdes_bridge->remote_node); |
---|
90 | 94 | if (IS_ERR(serdes_bridge->dsi)) |
---|
91 | 95 | return PTR_ERR(serdes_bridge->dsi); |
---|
92 | 96 | } |
---|
.. | .. |
---|
167 | 171 | if (serdes->chip_data->bridge_ops->init) |
---|
168 | 172 | ret = serdes->chip_data->bridge_ops->init(serdes); |
---|
169 | 173 | |
---|
170 | | - if (serdes->chip_data->serdes_type == TYPE_DES) |
---|
171 | | - serdes_i2c_set_sequence(serdes); |
---|
172 | | - |
---|
173 | | - if (serdes_bridge->panel) |
---|
174 | | - ret = drm_panel_prepare(serdes_bridge->panel); |
---|
| 174 | + if (serdes->chip_data->serdes_type == TYPE_DES) { |
---|
| 175 | + if (serdes->chip_data->chip_init) |
---|
| 176 | + serdes->chip_data->chip_init(serdes); |
---|
| 177 | + ret = serdes_i2c_set_sequence(serdes); |
---|
| 178 | + } |
---|
175 | 179 | |
---|
176 | 180 | if (serdes->chip_data->bridge_ops->pre_enable) |
---|
177 | 181 | ret = serdes->chip_data->bridge_ops->pre_enable(serdes); |
---|
| 182 | + |
---|
| 183 | + if (serdes_bridge->panel) |
---|
| 184 | + ret = drm_panel_prepare(serdes_bridge->panel); |
---|
178 | 185 | |
---|
179 | 186 | serdes_set_pinctrl_default(serdes); |
---|
180 | 187 | |
---|
.. | .. |
---|
198 | 205 | SERDES_DBG_MFD("%s: extcon is true\n", __func__); |
---|
199 | 206 | } |
---|
200 | 207 | |
---|
201 | | - SERDES_DBG_MFD("%s: %s ret=%d\n", __func__, dev_name(serdes->dev), ret); |
---|
| 208 | + SERDES_DBG_MFD("%s: %s-%s ret=%d\n", __func__, dev_name(serdes->dev), |
---|
| 209 | + serdes->chip_data->name, ret); |
---|
202 | 210 | } |
---|
203 | 211 | |
---|
204 | 212 | static enum drm_connector_status |
---|
.. | .. |
---|
230 | 238 | if (serdes_bridge->panel) |
---|
231 | 239 | ret = drm_panel_get_modes(serdes_bridge->panel, connector); |
---|
232 | 240 | |
---|
233 | | - SERDES_DBG_MFD("%s:name=%s, type=%d\n", __func__, |
---|
234 | | - serdes->chip_data->name, serdes->type); |
---|
| 241 | + SERDES_DBG_MFD("%s:name=%s, node=%s\n", __func__, |
---|
| 242 | + serdes->chip_data->name, serdes_bridge->dev->of_node->name); |
---|
235 | 243 | |
---|
236 | 244 | return ret; |
---|
237 | 245 | } |
---|
.. | .. |
---|
273 | 281 | return dev_err_probe(dev, -ENODEV, "failed to get serdes regmap\n"); |
---|
274 | 282 | |
---|
275 | 283 | serdes_bridge->sel_mipi = of_property_read_bool(dev->parent->of_node, "sel-mipi"); |
---|
276 | | - if (serdes_bridge->sel_mipi) { |
---|
277 | | - serdes_bridge->dsi_node = of_graph_get_remote_node(dev->parent->of_node, 0, -1); |
---|
278 | | - if (!serdes_bridge->dsi_node) |
---|
279 | | - return dev_err_probe(dev->parent, -ENODEV, |
---|
280 | | - "failed to get remote node for serdes dsi\n"); |
---|
| 284 | + SERDES_DBG_MFD("%s: sel_mipi=%d\n", __func__, serdes_bridge->sel_mipi); |
---|
281 | 285 | |
---|
282 | | - SERDES_DBG_MFD("%s: sel_mipi=%d\n", __func__, serdes_bridge->sel_mipi); |
---|
| 286 | + serdes_bridge->base_bridge.of_node = dev->parent->of_node; |
---|
| 287 | + serdes_bridge->remote_node = of_graph_get_remote_node(dev->parent->of_node, 0, -1); |
---|
| 288 | + if (!serdes_bridge->remote_node) { |
---|
| 289 | + serdes_bridge->base_bridge.of_node = dev->of_node; |
---|
| 290 | + SERDES_DBG_MFD("warning: failed to get remote node for serdes on %s\n", |
---|
| 291 | + dev_name(dev->parent)); |
---|
| 292 | + serdes_bridge->remote_node = of_graph_get_remote_node(dev->of_node, 0, -1); |
---|
| 293 | + if (!serdes_bridge->remote_node) { |
---|
| 294 | + return dev_err_probe(dev, -ENODEV, |
---|
| 295 | + "failed to get remote node for serdes dsi\n"); |
---|
| 296 | + } |
---|
283 | 297 | } |
---|
284 | 298 | |
---|
285 | 299 | serdes_bridge->base_bridge.funcs = &serdes_bridge_funcs; |
---|
286 | | - serdes_bridge->base_bridge.of_node = dev->parent->of_node; |
---|
287 | 300 | serdes_bridge->base_bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_MODES; |
---|
288 | 301 | |
---|
289 | 302 | if (serdes_bridge->sel_mipi) { |
---|
.. | .. |
---|
291 | 304 | SERDES_DBG_MFD("%s: type DRM_MODE_CONNECTOR_DSI\n", __func__); |
---|
292 | 305 | } else if (serdes_bridge->parent->chip_data->connector_type) { |
---|
293 | 306 | serdes_bridge->base_bridge.type = serdes_bridge->parent->chip_data->connector_type; |
---|
294 | | - SERDES_DBG_MFD("%s: type 0x%x\n", __func__, serdes_bridge->base_bridge.type); |
---|
| 307 | + SERDES_DBG_MFD("%s: type %d\n", __func__, serdes_bridge->base_bridge.type); |
---|
295 | 308 | } else { |
---|
296 | 309 | serdes_bridge->base_bridge.type = DRM_MODE_CONNECTOR_eDP; |
---|
297 | 310 | SERDES_DBG_MFD("%s: type DRM_MODE_CONNECTOR_LVDS\n", __func__); |
---|
.. | .. |
---|
319 | 332 | { .compatible = "rohm,bu18tl82-bridge", }, |
---|
320 | 333 | { .compatible = "rohm,bu18rl82-bridge", }, |
---|
321 | 334 | { .compatible = "maxim,max96745-bridge", }, |
---|
322 | | - { .compatible = "maxim,max96752-bridge", }, |
---|
323 | 335 | { .compatible = "maxim,max96755-bridge", }, |
---|
324 | | - { .compatible = "maxim,max96772-bridge", }, |
---|
| 336 | + { .compatible = "maxim,max96789-bridge", }, |
---|
325 | 337 | { .compatible = "rockchip,rkx111-bridge", }, |
---|
326 | 338 | { .compatible = "rockchip,rkx121-bridge", }, |
---|
327 | 339 | { } |
---|