diff options
author | Patrik Jakobsson <patrik.r.jakobsson@gmail.com> | 2011-12-19 16:41:33 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2011-12-20 05:23:17 -0500 |
commit | 9bd81acdb648509dbbc32d4da0477c9fae0d6a73 (patch) | |
tree | adfeea49b91ed3c7bf1590db3f0a331ab4ef1e98 /drivers/gpu/drm/gma500/oaktrail_lvds.c | |
parent | a12d6a078e47e244a476b67c3f4b6ca03c138a99 (diff) |
gma500: Convert Oaktrail to work with new output handling
Replace psb_intel_output with psb_intel_encoder and psb_intel_connector
Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
[Changed Moorestown reference to Oaktrail]
Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/gma500/oaktrail_lvds.c')
-rw-r--r-- | drivers/gpu/drm/gma500/oaktrail_lvds.c | 79 |
1 files changed, 52 insertions, 27 deletions
diff --git a/drivers/gpu/drm/gma500/oaktrail_lvds.c b/drivers/gpu/drm/gma500/oaktrail_lvds.c index 69659cad6778..965d47cac0b5 100644 --- a/drivers/gpu/drm/gma500/oaktrail_lvds.c +++ b/drivers/gpu/drm/gma500/oaktrail_lvds.c | |||
@@ -43,7 +43,8 @@ | |||
43 | * Sets the power state for the panel. | 43 | * Sets the power state for the panel. |
44 | */ | 44 | */ |
45 | static void oaktrail_lvds_set_power(struct drm_device *dev, | 45 | static void oaktrail_lvds_set_power(struct drm_device *dev, |
46 | struct psb_intel_output *output, bool on) | 46 | struct psb_intel_encoder *psb_intel_encoder, |
47 | bool on) | ||
47 | { | 48 | { |
48 | u32 pp_status; | 49 | u32 pp_status; |
49 | struct drm_psb_private *dev_priv = dev->dev_private; | 50 | struct drm_psb_private *dev_priv = dev->dev_private; |
@@ -77,12 +78,13 @@ static void oaktrail_lvds_set_power(struct drm_device *dev, | |||
77 | static void oaktrail_lvds_dpms(struct drm_encoder *encoder, int mode) | 78 | static void oaktrail_lvds_dpms(struct drm_encoder *encoder, int mode) |
78 | { | 79 | { |
79 | struct drm_device *dev = encoder->dev; | 80 | struct drm_device *dev = encoder->dev; |
80 | struct psb_intel_output *output = enc_to_psb_intel_output(encoder); | 81 | struct psb_intel_encoder *psb_intel_encoder = |
82 | to_psb_intel_encoder(encoder); | ||
81 | 83 | ||
82 | if (mode == DRM_MODE_DPMS_ON) | 84 | if (mode == DRM_MODE_DPMS_ON) |
83 | oaktrail_lvds_set_power(dev, output, true); | 85 | oaktrail_lvds_set_power(dev, psb_intel_encoder, true); |
84 | else | 86 | else |
85 | oaktrail_lvds_set_power(dev, output, false); | 87 | oaktrail_lvds_set_power(dev, psb_intel_encoder, false); |
86 | 88 | ||
87 | /* XXX: We never power down the LVDS pairs. */ | 89 | /* XXX: We never power down the LVDS pairs. */ |
88 | } | 90 | } |
@@ -91,10 +93,12 @@ static void oaktrail_lvds_mode_set(struct drm_encoder *encoder, | |||
91 | struct drm_display_mode *mode, | 93 | struct drm_display_mode *mode, |
92 | struct drm_display_mode *adjusted_mode) | 94 | struct drm_display_mode *adjusted_mode) |
93 | { | 95 | { |
94 | struct psb_intel_mode_device *mode_dev = | ||
95 | enc_to_psb_intel_output(encoder)->mode_dev; | ||
96 | struct drm_device *dev = encoder->dev; | 96 | struct drm_device *dev = encoder->dev; |
97 | struct drm_psb_private *dev_priv = dev->dev_private; | 97 | struct drm_psb_private *dev_priv = dev->dev_private; |
98 | struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; | ||
99 | struct drm_mode_config *mode_config = &dev->mode_config; | ||
100 | struct drm_connector *connector = NULL; | ||
101 | struct drm_crtc *crtc = encoder->crtc; | ||
98 | u32 lvds_port; | 102 | u32 lvds_port; |
99 | uint64_t v = DRM_MODE_SCALE_FULLSCREEN; | 103 | uint64_t v = DRM_MODE_SCALE_FULLSCREEN; |
100 | 104 | ||
@@ -118,8 +122,19 @@ static void oaktrail_lvds_mode_set(struct drm_encoder *encoder, | |||
118 | 122 | ||
119 | REG_WRITE(LVDS, lvds_port); | 123 | REG_WRITE(LVDS, lvds_port); |
120 | 124 | ||
125 | /* Find the connector we're trying to set up */ | ||
126 | list_for_each_entry(connector, &mode_config->connector_list, head) { | ||
127 | if (!connector->encoder || connector->encoder->crtc != crtc) | ||
128 | continue; | ||
129 | } | ||
130 | |||
131 | if (!connector) { | ||
132 | DRM_ERROR("Couldn't find connector when setting mode"); | ||
133 | return; | ||
134 | } | ||
135 | |||
121 | drm_connector_property_get_value( | 136 | drm_connector_property_get_value( |
122 | &enc_to_psb_intel_output(encoder)->base, | 137 | connector, |
123 | dev->mode_config.scaling_mode_property, | 138 | dev->mode_config.scaling_mode_property, |
124 | &v); | 139 | &v); |
125 | 140 | ||
@@ -150,8 +165,10 @@ static void oaktrail_lvds_mode_set(struct drm_encoder *encoder, | |||
150 | static void oaktrail_lvds_prepare(struct drm_encoder *encoder) | 165 | static void oaktrail_lvds_prepare(struct drm_encoder *encoder) |
151 | { | 166 | { |
152 | struct drm_device *dev = encoder->dev; | 167 | struct drm_device *dev = encoder->dev; |
153 | struct psb_intel_output *output = enc_to_psb_intel_output(encoder); | 168 | struct drm_psb_private *dev_priv = dev->dev_private; |
154 | struct psb_intel_mode_device *mode_dev = output->mode_dev; | 169 | struct psb_intel_encoder *psb_intel_encoder = |
170 | to_psb_intel_encoder(encoder); | ||
171 | struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; | ||
155 | 172 | ||
156 | if (!gma_power_begin(dev, true)) | 173 | if (!gma_power_begin(dev, true)) |
157 | return; | 174 | return; |
@@ -159,7 +176,7 @@ static void oaktrail_lvds_prepare(struct drm_encoder *encoder) | |||
159 | mode_dev->saveBLC_PWM_CTL = REG_READ(BLC_PWM_CTL); | 176 | mode_dev->saveBLC_PWM_CTL = REG_READ(BLC_PWM_CTL); |
160 | mode_dev->backlight_duty_cycle = (mode_dev->saveBLC_PWM_CTL & | 177 | mode_dev->backlight_duty_cycle = (mode_dev->saveBLC_PWM_CTL & |
161 | BACKLIGHT_DUTY_CYCLE_MASK); | 178 | BACKLIGHT_DUTY_CYCLE_MASK); |
162 | oaktrail_lvds_set_power(dev, output, false); | 179 | oaktrail_lvds_set_power(dev, psb_intel_encoder, false); |
163 | gma_power_end(dev); | 180 | gma_power_end(dev); |
164 | } | 181 | } |
165 | 182 | ||
@@ -185,13 +202,15 @@ static u32 oaktrail_lvds_get_max_backlight(struct drm_device *dev) | |||
185 | static void oaktrail_lvds_commit(struct drm_encoder *encoder) | 202 | static void oaktrail_lvds_commit(struct drm_encoder *encoder) |
186 | { | 203 | { |
187 | struct drm_device *dev = encoder->dev; | 204 | struct drm_device *dev = encoder->dev; |
188 | struct psb_intel_output *output = enc_to_psb_intel_output(encoder); | 205 | struct drm_psb_private *dev_priv = dev->dev_private; |
189 | struct psb_intel_mode_device *mode_dev = output->mode_dev; | 206 | struct psb_intel_encoder *psb_intel_encoder = |
207 | to_psb_intel_encoder(encoder); | ||
208 | struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; | ||
190 | 209 | ||
191 | if (mode_dev->backlight_duty_cycle == 0) | 210 | if (mode_dev->backlight_duty_cycle == 0) |
192 | mode_dev->backlight_duty_cycle = | 211 | mode_dev->backlight_duty_cycle = |
193 | oaktrail_lvds_get_max_backlight(dev); | 212 | oaktrail_lvds_get_max_backlight(dev); |
194 | oaktrail_lvds_set_power(dev, output, true); | 213 | oaktrail_lvds_set_power(dev, psb_intel_encoder, true); |
195 | } | 214 | } |
196 | 215 | ||
197 | static const struct drm_encoder_helper_funcs oaktrail_lvds_helper_funcs = { | 216 | static const struct drm_encoder_helper_funcs oaktrail_lvds_helper_funcs = { |
@@ -306,7 +325,8 @@ static void oaktrail_lvds_get_configuration_mode(struct drm_device *dev, | |||
306 | void oaktrail_lvds_init(struct drm_device *dev, | 325 | void oaktrail_lvds_init(struct drm_device *dev, |
307 | struct psb_intel_mode_device *mode_dev) | 326 | struct psb_intel_mode_device *mode_dev) |
308 | { | 327 | { |
309 | struct psb_intel_output *psb_intel_output; | 328 | struct psb_intel_encoder *psb_intel_encoder; |
329 | struct psb_intel_connector *psb_intel_connector; | ||
310 | struct drm_connector *connector; | 330 | struct drm_connector *connector; |
311 | struct drm_encoder *encoder; | 331 | struct drm_encoder *encoder; |
312 | struct drm_psb_private *dev_priv = | 332 | struct drm_psb_private *dev_priv = |
@@ -316,24 +336,27 @@ void oaktrail_lvds_init(struct drm_device *dev, | |||
316 | struct i2c_adapter *i2c_adap; | 336 | struct i2c_adapter *i2c_adap; |
317 | struct drm_display_mode *scan; /* *modes, *bios_mode; */ | 337 | struct drm_display_mode *scan; /* *modes, *bios_mode; */ |
318 | 338 | ||
319 | psb_intel_output = kzalloc(sizeof(struct psb_intel_output), GFP_KERNEL); | 339 | psb_intel_encoder = kzalloc(sizeof(struct psb_intel_encoder), GFP_KERNEL); |
320 | if (!psb_intel_output) | 340 | if (!psb_intel_encoder) |
321 | return; | 341 | return; |
322 | 342 | ||
323 | psb_intel_output->mode_dev = mode_dev; | 343 | psb_intel_connector = kzalloc(sizeof(struct psb_intel_encoder), GFP_KERNEL); |
324 | connector = &psb_intel_output->base; | 344 | if (!psb_intel_connector) |
325 | encoder = &psb_intel_output->enc; | 345 | goto failed_connector; |
346 | |||
347 | connector = &psb_intel_connector->base; | ||
348 | encoder = &psb_intel_encoder->base; | ||
326 | dev_priv->is_lvds_on = true; | 349 | dev_priv->is_lvds_on = true; |
327 | drm_connector_init(dev, &psb_intel_output->base, | 350 | drm_connector_init(dev, connector, |
328 | &psb_intel_lvds_connector_funcs, | 351 | &psb_intel_lvds_connector_funcs, |
329 | DRM_MODE_CONNECTOR_LVDS); | 352 | DRM_MODE_CONNECTOR_LVDS); |
330 | 353 | ||
331 | drm_encoder_init(dev, &psb_intel_output->enc, &psb_intel_lvds_enc_funcs, | 354 | drm_encoder_init(dev, encoder, &psb_intel_lvds_enc_funcs, |
332 | DRM_MODE_ENCODER_LVDS); | 355 | DRM_MODE_ENCODER_LVDS); |
333 | 356 | ||
334 | drm_mode_connector_attach_encoder(&psb_intel_output->base, | 357 | psb_intel_connector_attach_encoder(psb_intel_connector, |
335 | &psb_intel_output->enc); | 358 | psb_intel_encoder); |
336 | psb_intel_output->type = INTEL_OUTPUT_LVDS; | 359 | psb_intel_encoder->type = INTEL_OUTPUT_LVDS; |
337 | 360 | ||
338 | drm_encoder_helper_add(encoder, &oaktrail_lvds_helper_funcs); | 361 | drm_encoder_helper_add(encoder, &oaktrail_lvds_helper_funcs); |
339 | drm_connector_helper_add(connector, | 362 | drm_connector_helper_add(connector, |
@@ -411,13 +434,15 @@ out: | |||
411 | 434 | ||
412 | failed_find: | 435 | failed_find: |
413 | dev_dbg(dev->dev, "No LVDS modes found, disabling.\n"); | 436 | dev_dbg(dev->dev, "No LVDS modes found, disabling.\n"); |
414 | if (psb_intel_output->ddc_bus) | 437 | if (psb_intel_encoder->ddc_bus) |
415 | psb_intel_i2c_destroy(psb_intel_output->ddc_bus); | 438 | psb_intel_i2c_destroy(psb_intel_encoder->ddc_bus); |
416 | 439 | ||
417 | /* failed_ddc: */ | 440 | /* failed_ddc: */ |
418 | 441 | ||
419 | drm_encoder_cleanup(encoder); | 442 | drm_encoder_cleanup(encoder); |
420 | drm_connector_cleanup(connector); | 443 | drm_connector_cleanup(connector); |
421 | kfree(connector); | 444 | kfree(psb_intel_connector); |
445 | failed_connector: | ||
446 | kfree(psb_intel_encoder); | ||
422 | } | 447 | } |
423 | 448 | ||