21
21
int tegra_output_connector_get_modes (struct drm_connector * connector )
22
22
{
23
23
struct tegra_output * output = connector_to_output (connector );
24
- struct edid * edid = NULL ;
24
+ const struct drm_edid * drm_edid ;
25
25
int err = 0 ;
26
26
27
27
/*
@@ -34,18 +34,17 @@ int tegra_output_connector_get_modes(struct drm_connector *connector)
34
34
return err ;
35
35
}
36
36
37
- if (output -> edid )
38
- edid = kmemdup (output -> edid , sizeof ( * edid ), GFP_KERNEL );
37
+ if (output -> drm_edid )
38
+ drm_edid = drm_edid_dup (output -> drm_edid );
39
39
else if (output -> ddc )
40
- edid = drm_get_edid (connector , output -> ddc );
40
+ drm_edid = drm_edid_read_ddc (connector , output -> ddc );
41
41
42
- cec_notifier_set_phys_addr_from_edid (output -> cec , edid );
43
- drm_connector_update_edid_property (connector , edid );
42
+ drm_edid_connector_update (connector , drm_edid );
43
+ cec_notifier_set_phys_addr (output -> cec ,
44
+ connector -> display_info .source_physical_address );
44
45
45
- if (edid ) {
46
- err = drm_add_edid_modes (connector , edid );
47
- kfree (edid );
48
- }
46
+ err = drm_edid_connector_add_modes (connector );
47
+ drm_edid_free (drm_edid );
49
48
50
49
return err ;
51
50
}
@@ -98,6 +97,7 @@ static irqreturn_t hpd_irq(int irq, void *data)
98
97
int tegra_output_probe (struct tegra_output * output )
99
98
{
100
99
struct device_node * ddc , * panel ;
100
+ const void * edid ;
101
101
unsigned long flags ;
102
102
int err , size ;
103
103
@@ -124,8 +124,6 @@ int tegra_output_probe(struct tegra_output *output)
124
124
return PTR_ERR (output -> panel );
125
125
}
126
126
127
- output -> edid = of_get_property (output -> of_node , "nvidia,edid" , & size );
128
-
129
127
ddc = of_parse_phandle (output -> of_node , "nvidia,ddc-i2c-bus" , 0 );
130
128
if (ddc ) {
131
129
output -> ddc = of_get_i2c_adapter_by_node (ddc );
@@ -137,6 +135,9 @@ int tegra_output_probe(struct tegra_output *output)
137
135
}
138
136
}
139
137
138
+ edid = of_get_property (output -> of_node , "nvidia,edid" , & size );
139
+ output -> drm_edid = drm_edid_alloc (edid , size );
140
+
140
141
output -> hpd_gpio = devm_fwnode_gpiod_get (output -> dev ,
141
142
of_fwnode_handle (output -> of_node ),
142
143
"nvidia,hpd" ,
@@ -187,6 +188,8 @@ int tegra_output_probe(struct tegra_output *output)
187
188
if (output -> ddc )
188
189
i2c_put_adapter (output -> ddc );
189
190
191
+ drm_edid_free (output -> drm_edid );
192
+
190
193
return err ;
191
194
}
192
195
@@ -197,6 +200,8 @@ void tegra_output_remove(struct tegra_output *output)
197
200
198
201
if (output -> ddc )
199
202
i2c_put_adapter (output -> ddc );
203
+
204
+ drm_edid_free (output -> drm_edid );
200
205
}
201
206
202
207
int tegra_output_init (struct drm_device * drm , struct tegra_output * output )
0 commit comments