@@ -56,14 +56,13 @@ struct rockchip_lvds {
5656 struct drm_device * drm_dev ;
5757 struct drm_panel * panel ;
5858 struct drm_bridge * bridge ;
59- struct drm_connector connector ;
6059 struct rockchip_encoder encoder ;
6160 struct dev_pin_info * pins ;
6261};
6362
64- static inline struct rockchip_lvds * connector_to_lvds (struct drm_connector * connector )
63+ static inline struct rockchip_lvds * brige_to_lvds (struct drm_bridge * bridge )
6564{
66- return container_of ( connector , struct rockchip_lvds , connector ) ;
65+ return ( struct rockchip_lvds * ) bridge -> driver_private ;
6766}
6867
6968static inline struct rockchip_lvds * encoder_to_lvds (struct drm_encoder * encoder )
@@ -106,25 +105,21 @@ static inline int rockchip_lvds_name_to_output(const char *s)
106105 return - EINVAL ;
107106}
108107
109- static const struct drm_connector_funcs rockchip_lvds_connector_funcs = {
110- .fill_modes = drm_helper_probe_single_connector_modes ,
111- .destroy = drm_connector_cleanup ,
112- .reset = drm_atomic_helper_connector_reset ,
113- .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state ,
114- .atomic_destroy_state = drm_atomic_helper_connector_destroy_state ,
115- };
116-
117- static int rockchip_lvds_connector_get_modes (struct drm_connector * connector )
108+ static int
109+ rockchip_lvds_bridge_get_modes (struct drm_bridge * bridge , struct drm_connector * connector )
118110{
119- struct rockchip_lvds * lvds = connector_to_lvds ( connector );
111+ struct rockchip_lvds * lvds = brige_to_lvds ( bridge );
120112 struct drm_panel * panel = lvds -> panel ;
121113
122114 return drm_panel_get_modes (panel , connector );
123115}
124116
125117static const
126- struct drm_connector_helper_funcs rockchip_lvds_connector_helper_funcs = {
127- .get_modes = rockchip_lvds_connector_get_modes ,
118+ struct drm_bridge_funcs rockchip_lvds_bridge_funcs = {
119+ .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state ,
120+ .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state ,
121+ .atomic_reset = drm_atomic_helper_bridge_reset ,
122+ .get_modes = rockchip_lvds_bridge_get_modes ,
128123};
129124
130125static int
@@ -606,41 +601,38 @@ static int rockchip_lvds_bind(struct device *dev, struct device *master,
606601 }
607602
608603 drm_encoder_helper_add (encoder , lvds -> soc_data -> helper_funcs );
609- connector = & lvds -> connector ;
610604
611605 if (lvds -> panel ) {
612- connector -> dpms = DRM_MODE_DPMS_OFF ;
613- ret = drm_connector_init (drm_dev , connector ,
614- & rockchip_lvds_connector_funcs ,
615- DRM_MODE_CONNECTOR_LVDS );
616- if (ret < 0 ) {
617- drm_err (drm_dev ,
618- "failed to initialize connector: %d\n" , ret );
606+ lvds -> bridge = drm_panel_bridge_add_typed (lvds -> panel , DRM_MODE_CONNECTOR_LVDS );
607+ if (IS_ERR (lvds -> bridge )) {
608+ ret = PTR_ERR (lvds -> bridge );
619609 goto err_free_encoder ;
620610 }
611+ }
621612
622- drm_connector_helper_add (connector ,
623- & rockchip_lvds_connector_helper_funcs );
624- } else {
625- ret = drm_bridge_attach (encoder , lvds -> bridge , NULL ,
626- DRM_BRIDGE_ATTACH_NO_CONNECTOR );
613+ if (lvds -> bridge ) {
614+ lvds -> bridge -> driver_private = lvds ;
615+ lvds -> bridge -> ops = DRM_BRIDGE_OP_MODES ;
616+ lvds -> bridge -> funcs = & rockchip_lvds_bridge_funcs ;
617+
618+ ret = drm_bridge_attach (encoder , lvds -> bridge , NULL , DRM_BRIDGE_ATTACH_NO_CONNECTOR );
627619 if (ret )
628- goto err_free_encoder ;
620+ goto err_free_bridge ;
629621
630622 connector = drm_bridge_connector_init (lvds -> drm_dev , encoder );
631623 if (IS_ERR (connector )) {
632624 drm_err (drm_dev ,
633625 "failed to initialize bridge connector: %pe\n" ,
634626 connector );
635627 ret = PTR_ERR (connector );
636- goto err_free_encoder ;
628+ goto err_free_bridge ;
637629 }
638- }
639630
640- ret = drm_connector_attach_encoder (connector , encoder );
641- if (ret < 0 ) {
642- drm_err (drm_dev , "failed to attach encoder: %d\n" , ret );
643- goto err_free_connector ;
631+ ret = drm_connector_attach_encoder (connector , encoder );
632+ if (ret < 0 ) {
633+ drm_err (drm_dev , "failed to attach encoder: %d\n" , ret );
634+ goto err_free_bridge ;
635+ }
644636 }
645637
646638 pm_runtime_enable (dev );
@@ -649,8 +641,8 @@ static int rockchip_lvds_bind(struct device *dev, struct device *master,
649641
650642 return 0 ;
651643
652- err_free_connector :
653- drm_connector_cleanup ( connector );
644+ err_free_bridge :
645+ drm_panel_bridge_remove ( lvds -> bridge );
654646err_free_encoder :
655647 drm_encoder_cleanup (encoder );
656648err_put_remote :
@@ -670,8 +662,6 @@ static void rockchip_lvds_unbind(struct device *dev, struct device *master,
670662 encoder_funcs = lvds -> soc_data -> helper_funcs ;
671663 encoder_funcs -> disable (& lvds -> encoder .encoder );
672664 pm_runtime_disable (dev );
673- drm_connector_cleanup (& lvds -> connector );
674- drm_encoder_cleanup (& lvds -> encoder .encoder );
675665}
676666
677667static const struct component_ops rockchip_lvds_component_ops = {
0 commit comments