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>
22 /* The max/min PWM frequency in BPCR[31:17] - */
24 * 15-bit field of the and then*/
25 /* shifts to the left by one bit to get the actual 16-bit
26 * value that the 15-bits correspond to.*/
31 * Sets the power state for the panel.
38 struct drm_psb_private *dev_priv = dev->dev_private; in oaktrail_lvds_set_power()
49 dev_priv->is_lvds_on = true; in oaktrail_lvds_set_power()
50 if (dev_priv->ops->lvds_bl_power) in oaktrail_lvds_set_power()
51 dev_priv->ops->lvds_bl_power(dev, true); in oaktrail_lvds_set_power()
53 if (dev_priv->ops->lvds_bl_power) in oaktrail_lvds_set_power()
54 dev_priv->ops->lvds_bl_power(dev, false); in oaktrail_lvds_set_power()
60 dev_priv->is_lvds_on = false; in oaktrail_lvds_set_power()
61 pm_request_idle(&dev->pdev->dev); in oaktrail_lvds_set_power()
68 struct drm_device *dev = encoder->dev; in oaktrail_lvds_dpms()
76 /* XXX: We never power down the LVDS pairs. */ in oaktrail_lvds_dpms()
83 struct drm_device *dev = encoder->dev; in oaktrail_lvds_mode_set()
84 struct drm_psb_private *dev_priv = dev->dev_private; in oaktrail_lvds_mode_set()
85 struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; in oaktrail_lvds_mode_set()
86 struct drm_mode_config *mode_config = &dev->mode_config; in oaktrail_lvds_mode_set()
88 struct drm_crtc *crtc = encoder->crtc; in oaktrail_lvds_mode_set()
96 * The LVDS pin pair will already have been turned on in the in oaktrail_lvds_mode_set()
100 lvds_port = (REG_READ(LVDS) & in oaktrail_lvds_mode_set()
107 if (mode_dev->panel_wants_dither || dev_priv->lvds_dither) in oaktrail_lvds_mode_set()
110 REG_WRITE(LVDS, lvds_port); in oaktrail_lvds_mode_set()
113 list_for_each_entry(connector, &mode_config->connector_list, head) { in oaktrail_lvds_mode_set()
114 if (!connector->encoder || connector->encoder->crtc != crtc) in oaktrail_lvds_mode_set()
124 &connector->base, in oaktrail_lvds_mode_set()
125 dev->mode_config.scaling_mode_property, in oaktrail_lvds_mode_set()
131 if ((mode->vdisplay != adjusted_mode->crtc_vdisplay) || in oaktrail_lvds_mode_set()
132 (mode->hdisplay != adjusted_mode->crtc_hdisplay)) { in oaktrail_lvds_mode_set()
133 if ((adjusted_mode->crtc_hdisplay * mode->vdisplay) == in oaktrail_lvds_mode_set()
134 (mode->hdisplay * adjusted_mode->crtc_vdisplay)) in oaktrail_lvds_mode_set()
136 else if ((adjusted_mode->crtc_hdisplay * in oaktrail_lvds_mode_set()
137 mode->vdisplay) > (mode->hdisplay * in oaktrail_lvds_mode_set()
138 adjusted_mode->crtc_vdisplay)) in oaktrail_lvds_mode_set()
154 struct drm_device *dev = encoder->dev; in oaktrail_lvds_prepare()
155 struct drm_psb_private *dev_priv = dev->dev_private; in oaktrail_lvds_prepare()
157 struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; in oaktrail_lvds_prepare()
162 mode_dev->saveBLC_PWM_CTL = REG_READ(BLC_PWM_CTL); in oaktrail_lvds_prepare()
163 mode_dev->backlight_duty_cycle = (mode_dev->saveBLC_PWM_CTL & in oaktrail_lvds_prepare()
171 struct drm_psb_private *dev_priv = dev->dev_private; in oaktrail_lvds_get_max_backlight()
181 ret = ((dev_priv->regs.saveBLC_PWM_CTL & in oaktrail_lvds_get_max_backlight()
190 struct drm_device *dev = encoder->dev; in oaktrail_lvds_commit()
191 struct drm_psb_private *dev_priv = dev->dev_private; in oaktrail_lvds_commit()
193 struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; in oaktrail_lvds_commit()
195 if (mode_dev->backlight_duty_cycle == 0) in oaktrail_lvds_commit()
196 mode_dev->backlight_duty_cycle = in oaktrail_lvds_commit()
209 /* Returns the panel fixed mode from configuration. */
215 struct drm_psb_private *dev_priv = dev->dev_private; in oaktrail_lvds_get_configuration_mode()
216 struct oaktrail_timing_info *ti = &dev_priv->gct_data.DTD; in oaktrail_lvds_get_configuration_mode()
218 mode_dev->panel_fixed_mode = NULL; in oaktrail_lvds_get_configuration_mode()
221 if (dev_priv->has_gct) { in oaktrail_lvds_get_configuration_mode()
226 mode->hdisplay = (ti->hactive_hi << 8) | ti->hactive_lo; in oaktrail_lvds_get_configuration_mode()
227 mode->vdisplay = (ti->vactive_hi << 8) | ti->vactive_lo; in oaktrail_lvds_get_configuration_mode()
228 mode->hsync_start = mode->hdisplay + \ in oaktrail_lvds_get_configuration_mode()
229 ((ti->hsync_offset_hi << 8) | \ in oaktrail_lvds_get_configuration_mode()
230 ti->hsync_offset_lo); in oaktrail_lvds_get_configuration_mode()
231 mode->hsync_end = mode->hsync_start + \ in oaktrail_lvds_get_configuration_mode()
232 ((ti->hsync_pulse_width_hi << 8) | \ in oaktrail_lvds_get_configuration_mode()
233 ti->hsync_pulse_width_lo); in oaktrail_lvds_get_configuration_mode()
234 mode->htotal = mode->hdisplay + ((ti->hblank_hi << 8) | \ in oaktrail_lvds_get_configuration_mode()
235 ti->hblank_lo); in oaktrail_lvds_get_configuration_mode()
236 mode->vsync_start = \ in oaktrail_lvds_get_configuration_mode()
237 mode->vdisplay + ((ti->vsync_offset_hi << 4) | \ in oaktrail_lvds_get_configuration_mode()
238 ti->vsync_offset_lo); in oaktrail_lvds_get_configuration_mode()
239 mode->vsync_end = \ in oaktrail_lvds_get_configuration_mode()
240 mode->vsync_start + ((ti->vsync_pulse_width_hi << 4) | \ in oaktrail_lvds_get_configuration_mode()
241 ti->vsync_pulse_width_lo); in oaktrail_lvds_get_configuration_mode()
242 mode->vtotal = mode->vdisplay + \ in oaktrail_lvds_get_configuration_mode()
243 ((ti->vblank_hi << 8) | ti->vblank_lo); in oaktrail_lvds_get_configuration_mode()
244 mode->clock = ti->pixel_clock * 10; in oaktrail_lvds_get_configuration_mode()
246 pr_info("hdisplay is %d\n", mode->hdisplay); in oaktrail_lvds_get_configuration_mode()
247 pr_info("vdisplay is %d\n", mode->vdisplay); in oaktrail_lvds_get_configuration_mode()
248 pr_info("HSS is %d\n", mode->hsync_start); in oaktrail_lvds_get_configuration_mode()
249 pr_info("HSE is %d\n", mode->hsync_end); in oaktrail_lvds_get_configuration_mode()
250 pr_info("htotal is %d\n", mode->htotal); in oaktrail_lvds_get_configuration_mode()
251 pr_info("VSS is %d\n", mode->vsync_start); in oaktrail_lvds_get_configuration_mode()
252 pr_info("VSE is %d\n", mode->vsync_end); in oaktrail_lvds_get_configuration_mode()
253 pr_info("vtotal is %d\n", mode->vtotal); in oaktrail_lvds_get_configuration_mode()
254 pr_info("clock is %d\n", mode->clock); in oaktrail_lvds_get_configuration_mode()
256 mode_dev->panel_fixed_mode = mode; in oaktrail_lvds_get_configuration_mode()
260 if (mode_dev->panel_fixed_mode == NULL && mode_dev->vbt_mode) in oaktrail_lvds_get_configuration_mode()
261 mode_dev->panel_fixed_mode = drm_mode_duplicate(dev, in oaktrail_lvds_get_configuration_mode()
262 mode_dev->vbt_mode); in oaktrail_lvds_get_configuration_mode()
264 /* Then try the LVDS VBT mode */ in oaktrail_lvds_get_configuration_mode()
265 if (mode_dev->panel_fixed_mode == NULL) in oaktrail_lvds_get_configuration_mode()
266 if (dev_priv->lfp_lvds_vbt_mode) in oaktrail_lvds_get_configuration_mode()
267 mode_dev->panel_fixed_mode = in oaktrail_lvds_get_configuration_mode()
269 dev_priv->lfp_lvds_vbt_mode); in oaktrail_lvds_get_configuration_mode()
272 if (mode_dev->panel_fixed_mode == NULL) in oaktrail_lvds_get_configuration_mode()
275 drm_mode_set_name(mode_dev->panel_fixed_mode); in oaktrail_lvds_get_configuration_mode()
276 drm_mode_set_crtcinfo(mode_dev->panel_fixed_mode, 0); in oaktrail_lvds_get_configuration_mode()
280 * oaktrail_lvds_init - setup LVDS connectors on this device
283 * Create the connector, register the LVDS DDC bus, and try to figure out what
284 * modes we can display on the LVDS panel (if present).
293 struct drm_psb_private *dev_priv = dev->dev_private; in oaktrail_lvds_init()
306 connector = &gma_connector->base; in oaktrail_lvds_init()
307 encoder = &gma_encoder->base; in oaktrail_lvds_init()
308 dev_priv->is_lvds_on = true; in oaktrail_lvds_init()
317 gma_encoder->type = INTEL_OUTPUT_LVDS; in oaktrail_lvds_init()
322 connector->display_info.subpixel_order = SubPixelHorizontalRGB; in oaktrail_lvds_init()
323 connector->interlace_allowed = false; in oaktrail_lvds_init()
324 connector->doublescan_allowed = false; in oaktrail_lvds_init()
326 drm_object_attach_property(&connector->base, in oaktrail_lvds_init()
327 dev->mode_config.scaling_mode_property, in oaktrail_lvds_init()
329 drm_object_attach_property(&connector->base, in oaktrail_lvds_init()
330 dev_priv->backlight_property, in oaktrail_lvds_init()
333 mode_dev->panel_wants_dither = false; in oaktrail_lvds_init()
334 if (dev_priv->has_gct) in oaktrail_lvds_init()
335 mode_dev->panel_wants_dither = (dev_priv->gct_data. in oaktrail_lvds_init()
337 if (dev_priv->lvds_dither) in oaktrail_lvds_init()
338 mode_dev->panel_wants_dither = 1; in oaktrail_lvds_init()
341 * LVDS discovery: in oaktrail_lvds_init()
344 * 3) check to see if LVDS is already on in oaktrail_lvds_init()
345 * if none of the above, no panel in oaktrail_lvds_init()
351 mutex_lock(&dev->mode_config.mutex); in oaktrail_lvds_init()
352 i2c_adap = i2c_get_adapter(dev_priv->ops->i2c_bus); in oaktrail_lvds_init()
355 if (edid == NULL && dev_priv->lpc_gpio_base) { in oaktrail_lvds_init()
357 if (gma_encoder->ddc_bus != NULL) { in oaktrail_lvds_init()
358 i2c_adap = &gma_encoder->ddc_bus->adapter; in oaktrail_lvds_init()
363 * Attempt to get the fixed panel mode from DDC. Assume that the in oaktrail_lvds_init()
371 list_for_each_entry(scan, &connector->probed_modes, head) { in oaktrail_lvds_init()
372 if (scan->type & DRM_MODE_TYPE_PREFERRED) { in oaktrail_lvds_init()
373 mode_dev->panel_fixed_mode = in oaktrail_lvds_init()
379 dev_err(dev->dev, "No ddc adapter available!\n"); in oaktrail_lvds_init()
381 * If we didn't get EDID, try geting panel timing in oaktrail_lvds_init()
386 if (mode_dev->panel_fixed_mode) { in oaktrail_lvds_init()
387 mode_dev->panel_fixed_mode->type |= DRM_MODE_TYPE_PREFERRED; in oaktrail_lvds_init()
392 if (!mode_dev->panel_fixed_mode) { in oaktrail_lvds_init()
393 dev_err(dev->dev, "Found no modes on the lvds, ignoring the LVDS\n"); in oaktrail_lvds_init()
398 mutex_unlock(&dev->mode_config.mutex); in oaktrail_lvds_init()
404 mutex_unlock(&dev->mode_config.mutex); in oaktrail_lvds_init()
406 dev_dbg(dev->dev, "No LVDS modes found, disabling.\n"); in oaktrail_lvds_init()
407 if (gma_encoder->ddc_bus) { in oaktrail_lvds_init()
408 psb_intel_i2c_destroy(gma_encoder->ddc_bus); in oaktrail_lvds_init()
409 gma_encoder->ddc_bus = NULL; in oaktrail_lvds_init()