21
21
static int hibmc_connector_get_modes (struct drm_connector * connector )
22
22
{
23
23
int count ;
24
+ void * edid ;
25
+ struct hibmc_connector * hibmc_connector = to_hibmc_connector (connector );
26
+
27
+ edid = drm_get_edid (connector , & hibmc_connector -> adapter );
28
+ if (edid ) {
29
+ drm_connector_update_edid_property (connector , edid );
30
+ count = drm_add_edid_modes (connector , edid );
31
+ if (count )
32
+ goto out ;
33
+ }
24
34
25
35
count = drm_add_modes_noedid (connector ,
26
36
connector -> dev -> mode_config .max_width ,
27
37
connector -> dev -> mode_config .max_height );
28
38
drm_set_preferred_mode (connector , 1024 , 768 );
29
39
40
+ out :
41
+ kfree (edid );
30
42
return count ;
31
43
}
32
44
@@ -36,6 +48,14 @@ static enum drm_mode_status hibmc_connector_mode_valid(struct drm_connector *con
36
48
return MODE_OK ;
37
49
}
38
50
51
+ static void hibmc_connector_destroy (struct drm_connector * connector )
52
+ {
53
+ struct hibmc_connector * hibmc_connector = to_hibmc_connector (connector );
54
+
55
+ i2c_del_adapter (& hibmc_connector -> adapter );
56
+ drm_connector_cleanup (connector );
57
+ }
58
+
39
59
static const struct drm_connector_helper_funcs
40
60
hibmc_connector_helper_funcs = {
41
61
.get_modes = hibmc_connector_get_modes ,
@@ -44,7 +64,7 @@ static const struct drm_connector_helper_funcs
44
64
45
65
static const struct drm_connector_funcs hibmc_connector_funcs = {
46
66
.fill_modes = drm_helper_probe_single_connector_modes ,
47
- .destroy = drm_connector_cleanup ,
67
+ .destroy = hibmc_connector_destroy ,
48
68
.reset = drm_atomic_helper_connector_reset ,
49
69
.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state ,
50
70
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state ,
@@ -77,10 +97,17 @@ static const struct drm_encoder_funcs hibmc_encoder_funcs = {
77
97
int hibmc_vdac_init (struct hibmc_drm_private * priv )
78
98
{
79
99
struct drm_device * dev = priv -> dev ;
100
+ struct hibmc_connector * hibmc_connector = & priv -> connector ;
80
101
struct drm_encoder * encoder = & priv -> encoder ;
81
- struct drm_connector * connector = & priv -> connector ;
102
+ struct drm_connector * connector = & hibmc_connector -> base ;
82
103
int ret ;
83
104
105
+ ret = hibmc_ddc_create (dev , hibmc_connector );
106
+ if (ret ) {
107
+ drm_err (dev , "failed to create ddc: %d\n" , ret );
108
+ return ret ;
109
+ }
110
+
84
111
encoder -> possible_crtcs = 0x1 ;
85
112
ret = drm_encoder_init (dev , encoder , & hibmc_encoder_funcs ,
86
113
DRM_MODE_ENCODER_DAC , NULL );
@@ -91,12 +118,15 @@ int hibmc_vdac_init(struct hibmc_drm_private *priv)
91
118
92
119
drm_encoder_helper_add (encoder , & hibmc_encoder_helper_funcs );
93
120
94
- ret = drm_connector_init (dev , connector , & hibmc_connector_funcs ,
95
- DRM_MODE_CONNECTOR_VGA );
121
+ ret = drm_connector_init_with_ddc (dev , connector ,
122
+ & hibmc_connector_funcs ,
123
+ DRM_MODE_CONNECTOR_VGA ,
124
+ & hibmc_connector -> adapter );
96
125
if (ret ) {
97
126
drm_err (dev , "failed to init connector: %d\n" , ret );
98
127
return ret ;
99
128
}
129
+
100
130
drm_connector_helper_add (connector , & hibmc_connector_helper_funcs );
101
131
102
132
drm_connector_attach_encoder (connector , encoder );
0 commit comments