.. | .. |
---|
13 | 13 | #include <linux/mfd/rk628.h> |
---|
14 | 14 | #include <linux/phy/phy.h> |
---|
15 | 15 | |
---|
16 | | -#include <drm/drmP.h> |
---|
17 | 16 | #include <drm/drm_of.h> |
---|
18 | 17 | #include <drm/drm_atomic.h> |
---|
19 | | -#include <drm/drm_crtc_helper.h> |
---|
| 18 | +#include <drm/drm_probe_helper.h> |
---|
20 | 19 | #include <drm/drm_atomic_helper.h> |
---|
21 | 20 | #include <drm/drm_panel.h> |
---|
22 | 21 | |
---|
.. | .. |
---|
64 | 63 | static enum lvds_format rk628_lvds_get_format(u32 bus_format) |
---|
65 | 64 | { |
---|
66 | 65 | switch (bus_format) { |
---|
67 | | - case MEDIA_BUS_FMT_RGB666_1X7X3_JEIDA: |
---|
68 | | - return LVDS_FORMAT_JEIDA_18BIT; |
---|
69 | 66 | case MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA: |
---|
70 | 67 | return LVDS_FORMAT_JEIDA_24BIT; |
---|
71 | 68 | case MEDIA_BUS_FMT_RGB666_1X7X3_SPWG: |
---|
.. | .. |
---|
112 | 109 | struct drm_display_info *info = &connector->display_info; |
---|
113 | 110 | int num_modes = 0; |
---|
114 | 111 | |
---|
115 | | - num_modes = drm_panel_get_modes(lvds->panel); |
---|
| 112 | + num_modes = drm_panel_get_modes(lvds->panel, connector); |
---|
116 | 113 | |
---|
117 | 114 | if (info->num_bus_formats) |
---|
118 | 115 | lvds->format = rk628_lvds_get_format(info->bus_formats[0]); |
---|
.. | .. |
---|
130 | 127 | |
---|
131 | 128 | static void rk628_lvds_connector_destroy(struct drm_connector *connector) |
---|
132 | 129 | { |
---|
133 | | - struct rk628_lvds *lvds = connector_to_lvds(connector); |
---|
134 | | - |
---|
135 | | - drm_panel_detach(lvds->panel); |
---|
136 | 130 | drm_connector_cleanup(connector); |
---|
137 | 131 | } |
---|
138 | 132 | |
---|
.. | .. |
---|
195 | 189 | bus_width |= (mode->clock / 1000) << 8; |
---|
196 | 190 | phy_set_bus_width(lvds->phy, bus_width); |
---|
197 | 191 | |
---|
198 | | - ret = phy_set_mode(lvds->phy, PHY_MODE_VIDEO_LVDS); |
---|
| 192 | + ret = phy_set_mode(lvds->phy, PHY_MODE_LVDS); |
---|
199 | 193 | if (ret) { |
---|
200 | 194 | dev_err(lvds->dev, "failed to set phy mode: %d\n", ret); |
---|
201 | 195 | return; |
---|
.. | .. |
---|
216 | 210 | phy_power_off(lvds->phy); |
---|
217 | 211 | } |
---|
218 | 212 | |
---|
219 | | -static int rk628_lvds_bridge_attach(struct drm_bridge *bridge) |
---|
| 213 | +static int rk628_lvds_bridge_attach(struct drm_bridge *bridge, |
---|
| 214 | + enum drm_bridge_attach_flags flags) |
---|
220 | 215 | { |
---|
221 | 216 | struct rk628_lvds *lvds = bridge_to_lvds(bridge); |
---|
222 | 217 | struct drm_connector *connector = &lvds->connector; |
---|
223 | 218 | struct drm_device *drm = bridge->dev; |
---|
224 | 219 | int ret; |
---|
| 220 | + |
---|
| 221 | + if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR) |
---|
| 222 | + return 0; |
---|
225 | 223 | |
---|
226 | 224 | ret = drm_connector_init(drm, connector, &rk628_lvds_connector_funcs, |
---|
227 | 225 | DRM_MODE_CONNECTOR_LVDS); |
---|
.. | .. |
---|
233 | 231 | drm_connector_helper_add(connector, &rk628_lvds_connector_helper_funcs); |
---|
234 | 232 | drm_connector_attach_encoder(connector, bridge->encoder); |
---|
235 | 233 | |
---|
236 | | - ret = drm_panel_attach(lvds->panel, connector); |
---|
237 | | - if (ret) { |
---|
238 | | - dev_err(lvds->dev, "Failed to attach panel\n"); |
---|
239 | | - return ret; |
---|
240 | | - } |
---|
241 | | - |
---|
242 | 234 | return 0; |
---|
243 | 235 | } |
---|
244 | 236 | |
---|
245 | 237 | static void rk628_lvds_bridge_mode_set(struct drm_bridge *bridge, |
---|
246 | | - struct drm_display_mode *mode, |
---|
247 | | - struct drm_display_mode *adj) |
---|
| 238 | + const struct drm_display_mode *mode, |
---|
| 239 | + const struct drm_display_mode *adj) |
---|
248 | 240 | { |
---|
249 | 241 | struct rk628_lvds *lvds = bridge_to_lvds(bridge); |
---|
250 | 242 | |
---|