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