Lines Matching +full:panel +full:- +full:lvds

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright © 2006-2009 Intel Corporation
14 #include <asm/intel-mid.h>
24 /* The max/min PWM frequency in BPCR[31:17] - */
26 * 15-bit field of the and then*/
27 /* shifts to the left by one bit to get the actual 16-bit
28 * value that the 15-bits correspond to.*/
33 * Sets the power state for the panel.
40 struct drm_psb_private *dev_priv = dev->dev_private; in oaktrail_lvds_set_power()
51 dev_priv->is_lvds_on = true; in oaktrail_lvds_set_power()
52 if (dev_priv->ops->lvds_bl_power) in oaktrail_lvds_set_power()
53 dev_priv->ops->lvds_bl_power(dev, true); in oaktrail_lvds_set_power()
55 if (dev_priv->ops->lvds_bl_power) in oaktrail_lvds_set_power()
56 dev_priv->ops->lvds_bl_power(dev, false); in oaktrail_lvds_set_power()
62 dev_priv->is_lvds_on = false; in oaktrail_lvds_set_power()
63 pm_request_idle(&dev->pdev->dev); in oaktrail_lvds_set_power()
70 struct drm_device *dev = encoder->dev; in oaktrail_lvds_dpms()
78 /* XXX: We never power down the LVDS pairs. */ in oaktrail_lvds_dpms()
85 struct drm_device *dev = encoder->dev; in oaktrail_lvds_mode_set()
86 struct drm_psb_private *dev_priv = dev->dev_private; in oaktrail_lvds_mode_set()
87 struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; in oaktrail_lvds_mode_set()
88 struct drm_mode_config *mode_config = &dev->mode_config; in oaktrail_lvds_mode_set()
90 struct drm_crtc *crtc = encoder->crtc; in oaktrail_lvds_mode_set()
98 * The LVDS pin pair will already have been turned on in the in oaktrail_lvds_mode_set()
102 lvds_port = (REG_READ(LVDS) & in oaktrail_lvds_mode_set()
109 if (mode_dev->panel_wants_dither || dev_priv->lvds_dither) in oaktrail_lvds_mode_set()
112 REG_WRITE(LVDS, lvds_port); in oaktrail_lvds_mode_set()
115 list_for_each_entry(connector, &mode_config->connector_list, head) { in oaktrail_lvds_mode_set()
116 if (!connector->encoder || connector->encoder->crtc != crtc) in oaktrail_lvds_mode_set()
127 &connector->base, in oaktrail_lvds_mode_set()
128 dev->mode_config.scaling_mode_property, in oaktrail_lvds_mode_set()
134 if ((mode->vdisplay != adjusted_mode->crtc_vdisplay) || in oaktrail_lvds_mode_set()
135 (mode->hdisplay != adjusted_mode->crtc_hdisplay)) { in oaktrail_lvds_mode_set()
136 if ((adjusted_mode->crtc_hdisplay * mode->vdisplay) == in oaktrail_lvds_mode_set()
137 (mode->hdisplay * adjusted_mode->crtc_vdisplay)) in oaktrail_lvds_mode_set()
139 else if ((adjusted_mode->crtc_hdisplay * in oaktrail_lvds_mode_set()
140 mode->vdisplay) > (mode->hdisplay * in oaktrail_lvds_mode_set()
141 adjusted_mode->crtc_vdisplay)) in oaktrail_lvds_mode_set()
157 struct drm_device *dev = encoder->dev; in oaktrail_lvds_prepare()
158 struct drm_psb_private *dev_priv = dev->dev_private; in oaktrail_lvds_prepare()
160 struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; in oaktrail_lvds_prepare()
165 mode_dev->saveBLC_PWM_CTL = REG_READ(BLC_PWM_CTL); in oaktrail_lvds_prepare()
166 mode_dev->backlight_duty_cycle = (mode_dev->saveBLC_PWM_CTL & in oaktrail_lvds_prepare()
174 struct drm_psb_private *dev_priv = dev->dev_private; in oaktrail_lvds_get_max_backlight()
184 ret = ((dev_priv->regs.saveBLC_PWM_CTL & in oaktrail_lvds_get_max_backlight()
193 struct drm_device *dev = encoder->dev; in oaktrail_lvds_commit()
194 struct drm_psb_private *dev_priv = dev->dev_private; in oaktrail_lvds_commit()
196 struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; in oaktrail_lvds_commit()
198 if (mode_dev->backlight_duty_cycle == 0) in oaktrail_lvds_commit()
199 mode_dev->backlight_duty_cycle = in oaktrail_lvds_commit()
212 /* Returns the panel fixed mode from configuration. */
218 struct drm_psb_private *dev_priv = dev->dev_private; in oaktrail_lvds_get_configuration_mode()
219 struct oaktrail_timing_info *ti = &dev_priv->gct_data.DTD; in oaktrail_lvds_get_configuration_mode()
221 mode_dev->panel_fixed_mode = NULL; in oaktrail_lvds_get_configuration_mode()
224 if (dev_priv->has_gct) { in oaktrail_lvds_get_configuration_mode()
229 mode->hdisplay = (ti->hactive_hi << 8) | ti->hactive_lo; in oaktrail_lvds_get_configuration_mode()
230 mode->vdisplay = (ti->vactive_hi << 8) | ti->vactive_lo; in oaktrail_lvds_get_configuration_mode()
231 mode->hsync_start = mode->hdisplay + \ in oaktrail_lvds_get_configuration_mode()
232 ((ti->hsync_offset_hi << 8) | \ in oaktrail_lvds_get_configuration_mode()
233 ti->hsync_offset_lo); in oaktrail_lvds_get_configuration_mode()
234 mode->hsync_end = mode->hsync_start + \ in oaktrail_lvds_get_configuration_mode()
235 ((ti->hsync_pulse_width_hi << 8) | \ in oaktrail_lvds_get_configuration_mode()
236 ti->hsync_pulse_width_lo); in oaktrail_lvds_get_configuration_mode()
237 mode->htotal = mode->hdisplay + ((ti->hblank_hi << 8) | \ in oaktrail_lvds_get_configuration_mode()
238 ti->hblank_lo); in oaktrail_lvds_get_configuration_mode()
239 mode->vsync_start = \ in oaktrail_lvds_get_configuration_mode()
240 mode->vdisplay + ((ti->vsync_offset_hi << 4) | \ in oaktrail_lvds_get_configuration_mode()
241 ti->vsync_offset_lo); in oaktrail_lvds_get_configuration_mode()
242 mode->vsync_end = \ in oaktrail_lvds_get_configuration_mode()
243 mode->vsync_start + ((ti->vsync_pulse_width_hi << 4) | \ in oaktrail_lvds_get_configuration_mode()
244 ti->vsync_pulse_width_lo); in oaktrail_lvds_get_configuration_mode()
245 mode->vtotal = mode->vdisplay + \ in oaktrail_lvds_get_configuration_mode()
246 ((ti->vblank_hi << 8) | ti->vblank_lo); in oaktrail_lvds_get_configuration_mode()
247 mode->clock = ti->pixel_clock * 10; in oaktrail_lvds_get_configuration_mode()
249 pr_info("hdisplay is %d\n", mode->hdisplay); in oaktrail_lvds_get_configuration_mode()
250 pr_info("vdisplay is %d\n", mode->vdisplay); in oaktrail_lvds_get_configuration_mode()
251 pr_info("HSS is %d\n", mode->hsync_start); in oaktrail_lvds_get_configuration_mode()
252 pr_info("HSE is %d\n", mode->hsync_end); in oaktrail_lvds_get_configuration_mode()
253 pr_info("htotal is %d\n", mode->htotal); in oaktrail_lvds_get_configuration_mode()
254 pr_info("VSS is %d\n", mode->vsync_start); in oaktrail_lvds_get_configuration_mode()
255 pr_info("VSE is %d\n", mode->vsync_end); in oaktrail_lvds_get_configuration_mode()
256 pr_info("vtotal is %d\n", mode->vtotal); in oaktrail_lvds_get_configuration_mode()
257 pr_info("clock is %d\n", mode->clock); in oaktrail_lvds_get_configuration_mode()
259 mode_dev->panel_fixed_mode = mode; in oaktrail_lvds_get_configuration_mode()
263 if (mode_dev->panel_fixed_mode == NULL && mode_dev->vbt_mode) in oaktrail_lvds_get_configuration_mode()
264 mode_dev->panel_fixed_mode = drm_mode_duplicate(dev, in oaktrail_lvds_get_configuration_mode()
265 mode_dev->vbt_mode); in oaktrail_lvds_get_configuration_mode()
267 /* Then try the LVDS VBT mode */ in oaktrail_lvds_get_configuration_mode()
268 if (mode_dev->panel_fixed_mode == NULL) in oaktrail_lvds_get_configuration_mode()
269 if (dev_priv->lfp_lvds_vbt_mode) in oaktrail_lvds_get_configuration_mode()
270 mode_dev->panel_fixed_mode = in oaktrail_lvds_get_configuration_mode()
272 dev_priv->lfp_lvds_vbt_mode); in oaktrail_lvds_get_configuration_mode()
275 if (mode_dev->panel_fixed_mode == NULL) in oaktrail_lvds_get_configuration_mode()
278 drm_mode_set_name(mode_dev->panel_fixed_mode); in oaktrail_lvds_get_configuration_mode()
279 drm_mode_set_crtcinfo(mode_dev->panel_fixed_mode, 0); in oaktrail_lvds_get_configuration_mode()
283 * oaktrail_lvds_init - setup LVDS connectors on this device
286 * Create the connector, register the LVDS DDC bus, and try to figure out what
287 * modes we can display on the LVDS panel (if present).
296 struct drm_psb_private *dev_priv = dev->dev_private; in oaktrail_lvds_init()
309 connector = &gma_connector->base; in oaktrail_lvds_init()
310 encoder = &gma_encoder->base; in oaktrail_lvds_init()
311 dev_priv->is_lvds_on = true; in oaktrail_lvds_init()
319 gma_encoder->type = INTEL_OUTPUT_LVDS; in oaktrail_lvds_init()
324 connector->display_info.subpixel_order = SubPixelHorizontalRGB; in oaktrail_lvds_init()
325 connector->interlace_allowed = false; in oaktrail_lvds_init()
326 connector->doublescan_allowed = false; in oaktrail_lvds_init()
328 drm_object_attach_property(&connector->base, in oaktrail_lvds_init()
329 dev->mode_config.scaling_mode_property, in oaktrail_lvds_init()
331 drm_object_attach_property(&connector->base, in oaktrail_lvds_init()
332 dev_priv->backlight_property, in oaktrail_lvds_init()
335 mode_dev->panel_wants_dither = false; in oaktrail_lvds_init()
336 if (dev_priv->has_gct) in oaktrail_lvds_init()
337 mode_dev->panel_wants_dither = (dev_priv->gct_data. in oaktrail_lvds_init()
339 if (dev_priv->lvds_dither) in oaktrail_lvds_init()
340 mode_dev->panel_wants_dither = 1; in oaktrail_lvds_init()
343 * LVDS discovery: in oaktrail_lvds_init()
346 * 3) check to see if LVDS is already on in oaktrail_lvds_init()
347 * if none of the above, no panel in oaktrail_lvds_init()
353 mutex_lock(&dev->mode_config.mutex); in oaktrail_lvds_init()
354 i2c_adap = i2c_get_adapter(dev_priv->ops->i2c_bus); in oaktrail_lvds_init()
357 if (edid == NULL && dev_priv->lpc_gpio_base) { in oaktrail_lvds_init()
359 if (gma_encoder->ddc_bus != NULL) { in oaktrail_lvds_init()
360 i2c_adap = &gma_encoder->ddc_bus->adapter; in oaktrail_lvds_init()
365 * Attempt to get the fixed panel mode from DDC. Assume that the in oaktrail_lvds_init()
373 list_for_each_entry(scan, &connector->probed_modes, head) { in oaktrail_lvds_init()
374 if (scan->type & DRM_MODE_TYPE_PREFERRED) { in oaktrail_lvds_init()
375 mode_dev->panel_fixed_mode = in oaktrail_lvds_init()
381 dev_err(dev->dev, "No ddc adapter available!\n"); in oaktrail_lvds_init()
383 * If we didn't get EDID, try geting panel timing in oaktrail_lvds_init()
388 if (mode_dev->panel_fixed_mode) { in oaktrail_lvds_init()
389 mode_dev->panel_fixed_mode->type |= DRM_MODE_TYPE_PREFERRED; in oaktrail_lvds_init()
394 if (!mode_dev->panel_fixed_mode) { in oaktrail_lvds_init()
395 dev_err(dev->dev, "Found no modes on the lvds, ignoring the LVDS\n"); in oaktrail_lvds_init()
400 mutex_unlock(&dev->mode_config.mutex); in oaktrail_lvds_init()
406 mutex_unlock(&dev->mode_config.mutex); in oaktrail_lvds_init()
408 dev_dbg(dev->dev, "No LVDS modes found, disabling.\n"); in oaktrail_lvds_init()
409 if (gma_encoder->ddc_bus) { in oaktrail_lvds_init()
410 psb_intel_i2c_destroy(gma_encoder->ddc_bus); in oaktrail_lvds_init()
411 gma_encoder->ddc_bus = NULL; in oaktrail_lvds_init()