drm/rockchip: analogix_dp: Support DP connector

Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>
Change-Id: I338ed6b0478bc1bfd702ed4676384f5fd88fb194
This commit is contained in:
Wyon Bi
2022-03-23 19:06:27 +08:00
committed by Tao Huang
parent 8b151401fe
commit 43f938cfbb
3 changed files with 20 additions and 5 deletions

View File

@@ -1290,6 +1290,8 @@ static int analogix_dp_bridge_attach(struct drm_bridge *bridge,
ret = drm_connector_init(dp->drm_dev, connector, ret = drm_connector_init(dp->drm_dev, connector,
&analogix_dp_connector_funcs, &analogix_dp_connector_funcs,
dp->plat_data->bridge ?
dp->plat_data->bridge->type :
DRM_MODE_CONNECTOR_eDP); DRM_MODE_CONNECTOR_eDP);
if (ret) { if (ret) {
DRM_ERROR("Failed to initialize connector with drm\n"); DRM_ERROR("Failed to initialize connector with drm\n");

View File

@@ -76,7 +76,6 @@ struct rockchip_dp_device {
struct drm_device *drm_dev; struct drm_device *drm_dev;
struct device *dev; struct device *dev;
struct drm_encoder encoder; struct drm_encoder encoder;
struct drm_bridge *bridge;
struct drm_display_mode mode; struct drm_display_mode mode;
struct regmap *grf; struct regmap *grf;
@@ -244,6 +243,17 @@ static void rockchip_dp_loader_protect(struct drm_encoder *encoder, bool on)
analogix_dp_loader_protect(dp->adp); analogix_dp_loader_protect(dp->adp);
} }
static bool rockchip_dp_skip_connector(struct drm_bridge *bridge)
{
if (!bridge)
return false;
if (of_device_is_compatible(bridge->of_node, "dp-connector"))
return false;
return true;
}
static int rockchip_dp_bridge_attach(struct analogix_dp_plat_data *plat_data, static int rockchip_dp_bridge_attach(struct analogix_dp_plat_data *plat_data,
struct drm_bridge *bridge, struct drm_bridge *bridge,
struct drm_connector *connector) struct drm_connector *connector)
@@ -252,8 +262,10 @@ static int rockchip_dp_bridge_attach(struct analogix_dp_plat_data *plat_data,
struct rockchip_drm_sub_dev *sdev = &dp->sub_dev; struct rockchip_drm_sub_dev *sdev = &dp->sub_dev;
int ret; int ret;
if (dp->bridge) { if (plat_data->bridge) {
ret = drm_bridge_attach(&dp->encoder, dp->bridge, bridge, 0); ret = drm_bridge_attach(&dp->encoder, plat_data->bridge, bridge,
rockchip_dp_skip_connector(bridge) ?
DRM_BRIDGE_ATTACH_NO_CONNECTOR : 0);
if (ret) { if (ret) {
DRM_ERROR("Failed to attach bridge to drm: %d\n", ret); DRM_ERROR("Failed to attach bridge to drm: %d\n", ret);
return ret; return ret;
@@ -580,8 +592,8 @@ static int rockchip_dp_probe(struct platform_device *pdev)
dp->plat_data.detach = rockchip_dp_bridge_detach; dp->plat_data.detach = rockchip_dp_bridge_detach;
dp->plat_data.convert_to_split_mode = drm_mode_convert_to_split_mode; dp->plat_data.convert_to_split_mode = drm_mode_convert_to_split_mode;
dp->plat_data.convert_to_origin_mode = drm_mode_convert_to_origin_mode; dp->plat_data.convert_to_origin_mode = drm_mode_convert_to_origin_mode;
dp->plat_data.skip_connector = !!bridge; dp->plat_data.skip_connector = rockchip_dp_skip_connector(bridge);
dp->bridge = bridge; dp->plat_data.bridge = bridge;
ret = rockchip_dp_of_probe(dp); ret = rockchip_dp_of_probe(dp);
if (ret < 0) if (ret < 0)

View File

@@ -36,6 +36,7 @@ static inline bool is_rockchip(enum analogix_dp_devtype type)
struct analogix_dp_plat_data { struct analogix_dp_plat_data {
enum analogix_dp_devtype dev_type; enum analogix_dp_devtype dev_type;
struct drm_panel *panel; struct drm_panel *panel;
struct drm_bridge *bridge;
struct drm_encoder *encoder; struct drm_encoder *encoder;
struct drm_connector *connector; struct drm_connector *connector;
bool skip_connector; bool skip_connector;