1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright © 2006-2011 Intel Corporation
4  *
5  * Authors:
6  *	Eric Anholt <eric@anholt.net>
7  *	Dave Airlie <airlied@linux.ie>
8  *	Jesse Barnes <jesse.barnes@intel.com>
9  */
10 
11 #include <linux/dmi.h>
12 #include <linux/i2c.h>
13 #include <linux/pm_runtime.h>
14 
15 #include "cdv_device.h"
16 #include "intel_bios.h"
17 #include "power.h"
18 #include "psb_drv.h"
19 #include "psb_intel_drv.h"
20 #include "psb_intel_reg.h"
21 
22 /**
23  * LVDS I2C backlight control macros
24  */
25 #define BRIGHTNESS_MAX_LEVEL 100
26 #define BRIGHTNESS_MASK 0xFF
27 #define BLC_I2C_TYPE	0x01
28 #define BLC_PWM_TYPT	0x02
29 
30 #define BLC_POLARITY_NORMAL 0
31 #define BLC_POLARITY_INVERSE 1
32 
33 #define PSB_BLC_MAX_PWM_REG_FREQ       (0xFFFE)
34 #define PSB_BLC_MIN_PWM_REG_FREQ	(0x2)
35 #define PSB_BLC_PWM_PRECISION_FACTOR	(10)
36 #define PSB_BACKLIGHT_PWM_CTL_SHIFT	(16)
37 #define PSB_BACKLIGHT_PWM_POLARITY_BIT_CLEAR (0xFFFE)
38 
39 struct cdv_intel_lvds_priv {
40 	/**
41 	 * Saved LVDO output states
42 	 */
43 	uint32_t savePP_ON;
44 	uint32_t savePP_OFF;
45 	uint32_t saveLVDS;
46 	uint32_t savePP_CONTROL;
47 	uint32_t savePP_CYCLE;
48 	uint32_t savePFIT_CONTROL;
49 	uint32_t savePFIT_PGM_RATIOS;
50 	uint32_t saveBLC_PWM_CTL;
51 };
52 
53 /*
54  * Returns the maximum level of the backlight duty cycle field.
55  */
56 static u32 cdv_intel_lvds_get_max_backlight(struct drm_device *dev)
57 {
58 	struct drm_psb_private *dev_priv = dev->dev_private;
59 	u32 retval;
60 
61 	if (gma_power_begin(dev, false)) {
62 		retval = ((REG_READ(BLC_PWM_CTL) &
63 			  BACKLIGHT_MODULATION_FREQ_MASK) >>
64 			  BACKLIGHT_MODULATION_FREQ_SHIFT) * 2;
65 
66 		gma_power_end(dev);
67 	} else
68 		retval = ((dev_priv->regs.saveBLC_PWM_CTL &
69 			  BACKLIGHT_MODULATION_FREQ_MASK) >>
70 			  BACKLIGHT_MODULATION_FREQ_SHIFT) * 2;
71 
72 	return retval;
73 }
74 
75 #if 0
76 /*
77  * Set LVDS backlight level by I2C command
78  */
79 static int cdv_lvds_i2c_set_brightness(struct drm_device *dev,
80 					unsigned int level)
81 {
82 	struct drm_psb_private *dev_priv = dev->dev_private;
83 	struct psb_intel_i2c_chan *lvds_i2c_bus = dev_priv->lvds_i2c_bus;
84 	u8 out_buf[2];
85 	unsigned int blc_i2c_brightness;
86 
87 	struct i2c_msg msgs[] = {
88 		{
89 			.addr = lvds_i2c_bus->slave_addr,
90 			.flags = 0,
91 			.len = 2,
92 			.buf = out_buf,
93 		}
94 	};
95 
96 	blc_i2c_brightness = BRIGHTNESS_MASK & ((unsigned int)level *
97 			     BRIGHTNESS_MASK /
98 			     BRIGHTNESS_MAX_LEVEL);
99 
100 	if (dev_priv->lvds_bl->pol == BLC_POLARITY_INVERSE)
101 		blc_i2c_brightness = BRIGHTNESS_MASK - blc_i2c_brightness;
102 
103 	out_buf[0] = dev_priv->lvds_bl->brightnesscmd;
104 	out_buf[1] = (u8)blc_i2c_brightness;
105 
106 	if (i2c_transfer(&lvds_i2c_bus->adapter, msgs, 1) == 1)
107 		return 0;
108 
109 	DRM_ERROR("I2C transfer error\n");
110 	return -1;
111 }
112 
113 
114 static int cdv_lvds_pwm_set_brightness(struct drm_device *dev, int level)
115 {
116 	struct drm_psb_private *dev_priv = dev->dev_private;
117 
118 	u32 max_pwm_blc;
119 	u32 blc_pwm_duty_cycle;
120 
121 	max_pwm_blc = cdv_intel_lvds_get_max_backlight(dev);
122 
123 	/*BLC_PWM_CTL Should be initiated while backlight device init*/
124 	BUG_ON((max_pwm_blc & PSB_BLC_MAX_PWM_REG_FREQ) == 0);
125 
126 	blc_pwm_duty_cycle = level * max_pwm_blc / BRIGHTNESS_MAX_LEVEL;
127 
128 	if (dev_priv->lvds_bl->pol == BLC_POLARITY_INVERSE)
129 		blc_pwm_duty_cycle = max_pwm_blc - blc_pwm_duty_cycle;
130 
131 	blc_pwm_duty_cycle &= PSB_BACKLIGHT_PWM_POLARITY_BIT_CLEAR;
132 	REG_WRITE(BLC_PWM_CTL,
133 		  (max_pwm_blc << PSB_BACKLIGHT_PWM_CTL_SHIFT) |
134 		  (blc_pwm_duty_cycle));
135 
136 	return 0;
137 }
138 
139 /*
140  * Set LVDS backlight level either by I2C or PWM
141  */
142 void cdv_intel_lvds_set_brightness(struct drm_device *dev, int level)
143 {
144 	struct drm_psb_private *dev_priv = dev->dev_private;
145 
146 	if (!dev_priv->lvds_bl) {
147 		DRM_ERROR("NO LVDS Backlight Info\n");
148 		return;
149 	}
150 
151 	if (dev_priv->lvds_bl->type == BLC_I2C_TYPE)
152 		cdv_lvds_i2c_set_brightness(dev, level);
153 	else
154 		cdv_lvds_pwm_set_brightness(dev, level);
155 }
156 #endif
157 
158 /**
159  * Sets the backlight level.
160  *
161  * level backlight level, from 0 to cdv_intel_lvds_get_max_backlight().
162  */
163 static void cdv_intel_lvds_set_backlight(struct drm_device *dev, int level)
164 {
165 	struct drm_psb_private *dev_priv = dev->dev_private;
166 	u32 blc_pwm_ctl;
167 
168 	if (gma_power_begin(dev, false)) {
169 		blc_pwm_ctl =
170 			REG_READ(BLC_PWM_CTL) & ~BACKLIGHT_DUTY_CYCLE_MASK;
171 		REG_WRITE(BLC_PWM_CTL,
172 				(blc_pwm_ctl |
173 				(level << BACKLIGHT_DUTY_CYCLE_SHIFT)));
174 		gma_power_end(dev);
175 	} else {
176 		blc_pwm_ctl = dev_priv->regs.saveBLC_PWM_CTL &
177 				~BACKLIGHT_DUTY_CYCLE_MASK;
178 		dev_priv->regs.saveBLC_PWM_CTL = (blc_pwm_ctl |
179 					(level << BACKLIGHT_DUTY_CYCLE_SHIFT));
180 	}
181 }
182 
183 /**
184  * Sets the power state for the panel.
185  */
186 static void cdv_intel_lvds_set_power(struct drm_device *dev,
187 				     struct drm_encoder *encoder, bool on)
188 {
189 	struct drm_psb_private *dev_priv = dev->dev_private;
190 	u32 pp_status;
191 
192 	if (!gma_power_begin(dev, true))
193 		return;
194 
195 	if (on) {
196 		REG_WRITE(PP_CONTROL, REG_READ(PP_CONTROL) |
197 			  POWER_TARGET_ON);
198 		do {
199 			pp_status = REG_READ(PP_STATUS);
200 		} while ((pp_status & PP_ON) == 0);
201 
202 		cdv_intel_lvds_set_backlight(dev,
203 				dev_priv->mode_dev.backlight_duty_cycle);
204 	} else {
205 		cdv_intel_lvds_set_backlight(dev, 0);
206 
207 		REG_WRITE(PP_CONTROL, REG_READ(PP_CONTROL) &
208 			  ~POWER_TARGET_ON);
209 		do {
210 			pp_status = REG_READ(PP_STATUS);
211 		} while (pp_status & PP_ON);
212 	}
213 	gma_power_end(dev);
214 }
215 
216 static void cdv_intel_lvds_encoder_dpms(struct drm_encoder *encoder, int mode)
217 {
218 	struct drm_device *dev = encoder->dev;
219 	if (mode == DRM_MODE_DPMS_ON)
220 		cdv_intel_lvds_set_power(dev, encoder, true);
221 	else
222 		cdv_intel_lvds_set_power(dev, encoder, false);
223 	/* XXX: We never power down the LVDS pairs. */
224 }
225 
226 static void cdv_intel_lvds_save(struct drm_connector *connector)
227 {
228 }
229 
230 static void cdv_intel_lvds_restore(struct drm_connector *connector)
231 {
232 }
233 
234 static enum drm_mode_status cdv_intel_lvds_mode_valid(struct drm_connector *connector,
235 			      struct drm_display_mode *mode)
236 {
237 	struct drm_device *dev = connector->dev;
238 	struct drm_psb_private *dev_priv = dev->dev_private;
239 	struct drm_display_mode *fixed_mode =
240 					dev_priv->mode_dev.panel_fixed_mode;
241 
242 	/* just in case */
243 	if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
244 		return MODE_NO_DBLESCAN;
245 
246 	/* just in case */
247 	if (mode->flags & DRM_MODE_FLAG_INTERLACE)
248 		return MODE_NO_INTERLACE;
249 
250 	if (fixed_mode) {
251 		if (mode->hdisplay > fixed_mode->hdisplay)
252 			return MODE_PANEL;
253 		if (mode->vdisplay > fixed_mode->vdisplay)
254 			return MODE_PANEL;
255 	}
256 	return MODE_OK;
257 }
258 
259 static bool cdv_intel_lvds_mode_fixup(struct drm_encoder *encoder,
260 				  const struct drm_display_mode *mode,
261 				  struct drm_display_mode *adjusted_mode)
262 {
263 	struct drm_device *dev = encoder->dev;
264 	struct drm_psb_private *dev_priv = dev->dev_private;
265 	struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev;
266 	struct drm_encoder *tmp_encoder;
267 	struct drm_display_mode *panel_fixed_mode = mode_dev->panel_fixed_mode;
268 
269 	/* Should never happen!! */
270 	list_for_each_entry(tmp_encoder, &dev->mode_config.encoder_list,
271 			    head) {
272 		if (tmp_encoder != encoder
273 		    && tmp_encoder->crtc == encoder->crtc) {
274 			pr_err("Can't enable LVDS and another encoder on the same pipe\n");
275 			return false;
276 		}
277 	}
278 
279 	/*
280 	 * If we have timings from the BIOS for the panel, put them in
281 	 * to the adjusted mode.  The CRTC will be set up for this mode,
282 	 * with the panel scaling set up to source from the H/VDisplay
283 	 * of the original mode.
284 	 */
285 	if (panel_fixed_mode != NULL) {
286 		adjusted_mode->hdisplay = panel_fixed_mode->hdisplay;
287 		adjusted_mode->hsync_start = panel_fixed_mode->hsync_start;
288 		adjusted_mode->hsync_end = panel_fixed_mode->hsync_end;
289 		adjusted_mode->htotal = panel_fixed_mode->htotal;
290 		adjusted_mode->vdisplay = panel_fixed_mode->vdisplay;
291 		adjusted_mode->vsync_start = panel_fixed_mode->vsync_start;
292 		adjusted_mode->vsync_end = panel_fixed_mode->vsync_end;
293 		adjusted_mode->vtotal = panel_fixed_mode->vtotal;
294 		adjusted_mode->clock = panel_fixed_mode->clock;
295 		drm_mode_set_crtcinfo(adjusted_mode,
296 				      CRTC_INTERLACE_HALVE_V);
297 	}
298 
299 	/*
300 	 * XXX: It would be nice to support lower refresh rates on the
301 	 * panels to reduce power consumption, and perhaps match the
302 	 * user's requested refresh rate.
303 	 */
304 
305 	return true;
306 }
307 
308 static void cdv_intel_lvds_prepare(struct drm_encoder *encoder)
309 {
310 	struct drm_device *dev = encoder->dev;
311 	struct drm_psb_private *dev_priv = dev->dev_private;
312 	struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev;
313 
314 	if (!gma_power_begin(dev, true))
315 		return;
316 
317 	mode_dev->saveBLC_PWM_CTL = REG_READ(BLC_PWM_CTL);
318 	mode_dev->backlight_duty_cycle = (mode_dev->saveBLC_PWM_CTL &
319 					  BACKLIGHT_DUTY_CYCLE_MASK);
320 
321 	cdv_intel_lvds_set_power(dev, encoder, false);
322 
323 	gma_power_end(dev);
324 }
325 
326 static void cdv_intel_lvds_commit(struct drm_encoder *encoder)
327 {
328 	struct drm_device *dev = encoder->dev;
329 	struct drm_psb_private *dev_priv = dev->dev_private;
330 	struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev;
331 
332 	if (mode_dev->backlight_duty_cycle == 0)
333 		mode_dev->backlight_duty_cycle =
334 		    cdv_intel_lvds_get_max_backlight(dev);
335 
336 	cdv_intel_lvds_set_power(dev, encoder, true);
337 }
338 
339 static void cdv_intel_lvds_mode_set(struct drm_encoder *encoder,
340 				struct drm_display_mode *mode,
341 				struct drm_display_mode *adjusted_mode)
342 {
343 	struct drm_device *dev = encoder->dev;
344 	struct drm_psb_private *dev_priv = dev->dev_private;
345 	struct gma_crtc *gma_crtc = to_gma_crtc(encoder->crtc);
346 	u32 pfit_control;
347 
348 	/*
349 	 * The LVDS pin pair will already have been turned on in the
350 	 * cdv_intel_crtc_mode_set since it has a large impact on the DPLL
351 	 * settings.
352 	 */
353 
354 	/*
355 	 * Enable automatic panel scaling so that non-native modes fill the
356 	 * screen.  Should be enabled before the pipe is enabled, according to
357 	 * register description and PRM.
358 	 */
359 	if (mode->hdisplay != adjusted_mode->hdisplay ||
360 	    mode->vdisplay != adjusted_mode->vdisplay)
361 		pfit_control = (PFIT_ENABLE | VERT_AUTO_SCALE |
362 				HORIZ_AUTO_SCALE | VERT_INTERP_BILINEAR |
363 				HORIZ_INTERP_BILINEAR);
364 	else
365 		pfit_control = 0;
366 
367 	pfit_control |= gma_crtc->pipe << PFIT_PIPE_SHIFT;
368 
369 	if (dev_priv->lvds_dither)
370 		pfit_control |= PANEL_8TO6_DITHER_ENABLE;
371 
372 	REG_WRITE(PFIT_CONTROL, pfit_control);
373 }
374 
375 /**
376  * Return the list of DDC modes if available, or the BIOS fixed mode otherwise.
377  */
378 static int cdv_intel_lvds_get_modes(struct drm_connector *connector)
379 {
380 	struct drm_device *dev = connector->dev;
381 	struct drm_psb_private *dev_priv = dev->dev_private;
382 	struct gma_encoder *gma_encoder = gma_attached_encoder(connector);
383 	struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev;
384 	int ret;
385 
386 	ret = psb_intel_ddc_get_modes(connector, &gma_encoder->i2c_bus->adapter);
387 
388 	if (ret)
389 		return ret;
390 
391 	if (mode_dev->panel_fixed_mode != NULL) {
392 		struct drm_display_mode *mode =
393 		    drm_mode_duplicate(dev, mode_dev->panel_fixed_mode);
394 		drm_mode_probed_add(connector, mode);
395 		return 1;
396 	}
397 
398 	return 0;
399 }
400 
401 /**
402  * cdv_intel_lvds_destroy - unregister and free LVDS structures
403  * @connector: connector to free
404  *
405  * Unregister the DDC bus for this connector then free the driver private
406  * structure.
407  */
408 static void cdv_intel_lvds_destroy(struct drm_connector *connector)
409 {
410 	struct gma_encoder *gma_encoder = gma_attached_encoder(connector);
411 
412 	psb_intel_i2c_destroy(gma_encoder->i2c_bus);
413 	drm_connector_unregister(connector);
414 	drm_connector_cleanup(connector);
415 	kfree(connector);
416 }
417 
418 static int cdv_intel_lvds_set_property(struct drm_connector *connector,
419 				       struct drm_property *property,
420 				       uint64_t value)
421 {
422 	struct drm_encoder *encoder = connector->encoder;
423 
424 	if (!strcmp(property->name, "scaling mode") && encoder) {
425 		struct gma_crtc *crtc = to_gma_crtc(encoder->crtc);
426 		uint64_t curValue;
427 
428 		if (!crtc)
429 			return -1;
430 
431 		switch (value) {
432 		case DRM_MODE_SCALE_FULLSCREEN:
433 			break;
434 		case DRM_MODE_SCALE_NO_SCALE:
435 			break;
436 		case DRM_MODE_SCALE_ASPECT:
437 			break;
438 		default:
439 			return -1;
440 		}
441 
442 		if (drm_object_property_get_value(&connector->base,
443 						     property,
444 						     &curValue))
445 			return -1;
446 
447 		if (curValue == value)
448 			return 0;
449 
450 		if (drm_object_property_set_value(&connector->base,
451 							property,
452 							value))
453 			return -1;
454 
455 		if (crtc->saved_mode.hdisplay != 0 &&
456 		    crtc->saved_mode.vdisplay != 0) {
457 			if (!drm_crtc_helper_set_mode(encoder->crtc,
458 						      &crtc->saved_mode,
459 						      encoder->crtc->x,
460 						      encoder->crtc->y,
461 						      encoder->crtc->primary->fb))
462 				return -1;
463 		}
464 	} else if (!strcmp(property->name, "backlight") && encoder) {
465 		if (drm_object_property_set_value(&connector->base,
466 							property,
467 							value))
468 			return -1;
469 		else
470                         gma_backlight_set(encoder->dev, value);
471 	} else if (!strcmp(property->name, "DPMS") && encoder) {
472 		const struct drm_encoder_helper_funcs *helpers =
473 					encoder->helper_private;
474 		helpers->dpms(encoder, value);
475 	}
476 	return 0;
477 }
478 
479 static const struct drm_encoder_helper_funcs
480 					cdv_intel_lvds_helper_funcs = {
481 	.dpms = cdv_intel_lvds_encoder_dpms,
482 	.mode_fixup = cdv_intel_lvds_mode_fixup,
483 	.prepare = cdv_intel_lvds_prepare,
484 	.mode_set = cdv_intel_lvds_mode_set,
485 	.commit = cdv_intel_lvds_commit,
486 };
487 
488 static const struct drm_connector_helper_funcs
489 				cdv_intel_lvds_connector_helper_funcs = {
490 	.get_modes = cdv_intel_lvds_get_modes,
491 	.mode_valid = cdv_intel_lvds_mode_valid,
492 	.best_encoder = gma_best_encoder,
493 };
494 
495 static const struct drm_connector_funcs cdv_intel_lvds_connector_funcs = {
496 	.dpms = drm_helper_connector_dpms,
497 	.fill_modes = drm_helper_probe_single_connector_modes,
498 	.set_property = cdv_intel_lvds_set_property,
499 	.destroy = cdv_intel_lvds_destroy,
500 };
501 
502 
503 static void cdv_intel_lvds_enc_destroy(struct drm_encoder *encoder)
504 {
505 	drm_encoder_cleanup(encoder);
506 }
507 
508 static const struct drm_encoder_funcs cdv_intel_lvds_enc_funcs = {
509 	.destroy = cdv_intel_lvds_enc_destroy,
510 };
511 
512 /*
513  * Enumerate the child dev array parsed from VBT to check whether
514  * the LVDS is present.
515  * If it is present, return 1.
516  * If it is not present, return false.
517  * If no child dev is parsed from VBT, it assumes that the LVDS is present.
518  */
519 static bool lvds_is_present_in_vbt(struct drm_device *dev,
520 				   u8 *i2c_pin)
521 {
522 	struct drm_psb_private *dev_priv = dev->dev_private;
523 	int i;
524 
525 	if (!dev_priv->child_dev_num)
526 		return true;
527 
528 	for (i = 0; i < dev_priv->child_dev_num; i++) {
529 		struct child_device_config *child = dev_priv->child_dev + i;
530 
531 		/* If the device type is not LFP, continue.
532 		 * We have to check both the new identifiers as well as the
533 		 * old for compatibility with some BIOSes.
534 		 */
535 		if (child->device_type != DEVICE_TYPE_INT_LFP &&
536 		    child->device_type != DEVICE_TYPE_LFP)
537 			continue;
538 
539 		if (child->i2c_pin)
540 		    *i2c_pin = child->i2c_pin;
541 
542 		/* However, we cannot trust the BIOS writers to populate
543 		 * the VBT correctly.  Since LVDS requires additional
544 		 * information from AIM blocks, a non-zero addin offset is
545 		 * a good indicator that the LVDS is actually present.
546 		 */
547 		if (child->addin_offset)
548 			return true;
549 
550 		/* But even then some BIOS writers perform some black magic
551 		 * and instantiate the device without reference to any
552 		 * additional data.  Trust that if the VBT was written into
553 		 * the OpRegion then they have validated the LVDS's existence.
554 		 */
555 		if (dev_priv->opregion.vbt)
556 			return true;
557 	}
558 
559 	return false;
560 }
561 
562 /**
563  * cdv_intel_lvds_init - setup LVDS connectors on this device
564  * @dev: drm device
565  *
566  * Create the connector, register the LVDS DDC bus, and try to figure out what
567  * modes we can display on the LVDS panel (if present).
568  */
569 void cdv_intel_lvds_init(struct drm_device *dev,
570 		     struct psb_intel_mode_device *mode_dev)
571 {
572 	struct gma_encoder *gma_encoder;
573 	struct gma_connector *gma_connector;
574 	struct cdv_intel_lvds_priv *lvds_priv;
575 	struct drm_connector *connector;
576 	struct drm_encoder *encoder;
577 	struct drm_display_mode *scan;
578 	struct drm_crtc *crtc;
579 	struct drm_psb_private *dev_priv = dev->dev_private;
580 	u32 lvds;
581 	int pipe;
582 	u8 pin;
583 
584 	if (!dev_priv->lvds_enabled_in_vbt)
585 		return;
586 
587 	pin = GMBUS_PORT_PANEL;
588 	if (!lvds_is_present_in_vbt(dev, &pin)) {
589 		DRM_DEBUG_KMS("LVDS is not present in VBT\n");
590 		return;
591 	}
592 
593 	gma_encoder = kzalloc(sizeof(struct gma_encoder),
594 				    GFP_KERNEL);
595 	if (!gma_encoder)
596 		return;
597 
598 	gma_connector = kzalloc(sizeof(struct gma_connector),
599 				      GFP_KERNEL);
600 	if (!gma_connector)
601 		goto failed_connector;
602 
603 	lvds_priv = kzalloc(sizeof(struct cdv_intel_lvds_priv), GFP_KERNEL);
604 	if (!lvds_priv)
605 		goto failed_lvds_priv;
606 
607 	gma_encoder->dev_priv = lvds_priv;
608 
609 	connector = &gma_connector->base;
610 	gma_connector->save = cdv_intel_lvds_save;
611 	gma_connector->restore = cdv_intel_lvds_restore;
612 	encoder = &gma_encoder->base;
613 
614 
615 	drm_connector_init(dev, connector,
616 			   &cdv_intel_lvds_connector_funcs,
617 			   DRM_MODE_CONNECTOR_LVDS);
618 
619 	drm_encoder_init(dev, encoder,
620 			 &cdv_intel_lvds_enc_funcs,
621 			 DRM_MODE_ENCODER_LVDS, NULL);
622 
623 
624 	gma_connector_attach_encoder(gma_connector, gma_encoder);
625 	gma_encoder->type = INTEL_OUTPUT_LVDS;
626 
627 	drm_encoder_helper_add(encoder, &cdv_intel_lvds_helper_funcs);
628 	drm_connector_helper_add(connector,
629 				 &cdv_intel_lvds_connector_helper_funcs);
630 	connector->display_info.subpixel_order = SubPixelHorizontalRGB;
631 	connector->interlace_allowed = false;
632 	connector->doublescan_allowed = false;
633 
634 	/*Attach connector properties*/
635 	drm_object_attach_property(&connector->base,
636 				      dev->mode_config.scaling_mode_property,
637 				      DRM_MODE_SCALE_FULLSCREEN);
638 	drm_object_attach_property(&connector->base,
639 				      dev_priv->backlight_property,
640 				      BRIGHTNESS_MAX_LEVEL);
641 
642 	/**
643 	 * Set up I2C bus
644 	 * FIXME: distroy i2c_bus when exit
645 	 */
646 	gma_encoder->i2c_bus = psb_intel_i2c_create(dev,
647 							 GPIOB,
648 							 "LVDSBLC_B");
649 	if (!gma_encoder->i2c_bus) {
650 		dev_printk(KERN_ERR,
651 			&dev->pdev->dev, "I2C bus registration failed.\n");
652 		goto failed_blc_i2c;
653 	}
654 	gma_encoder->i2c_bus->slave_addr = 0x2C;
655 	dev_priv->lvds_i2c_bus = gma_encoder->i2c_bus;
656 
657 	/*
658 	 * LVDS discovery:
659 	 * 1) check for EDID on DDC
660 	 * 2) check for VBT data
661 	 * 3) check to see if LVDS is already on
662 	 *    if none of the above, no panel
663 	 * 4) make sure lid is open
664 	 *    if closed, act like it's not there for now
665 	 */
666 
667 	/* Set up the DDC bus. */
668 	gma_encoder->ddc_bus = psb_intel_i2c_create(dev,
669 							 GPIOC,
670 							 "LVDSDDC_C");
671 	if (!gma_encoder->ddc_bus) {
672 		dev_printk(KERN_ERR, &dev->pdev->dev,
673 			   "DDC bus registration " "failed.\n");
674 		goto failed_ddc;
675 	}
676 
677 	/*
678 	 * Attempt to get the fixed panel mode from DDC.  Assume that the
679 	 * preferred mode is the right one.
680 	 */
681 	mutex_lock(&dev->mode_config.mutex);
682 	psb_intel_ddc_get_modes(connector,
683 				&gma_encoder->ddc_bus->adapter);
684 	list_for_each_entry(scan, &connector->probed_modes, head) {
685 		if (scan->type & DRM_MODE_TYPE_PREFERRED) {
686 			mode_dev->panel_fixed_mode =
687 			    drm_mode_duplicate(dev, scan);
688 			goto out;	/* FIXME: check for quirks */
689 		}
690 	}
691 
692 	/* Failed to get EDID, what about VBT? do we need this?*/
693 	if (dev_priv->lfp_lvds_vbt_mode) {
694 		mode_dev->panel_fixed_mode =
695 			drm_mode_duplicate(dev, dev_priv->lfp_lvds_vbt_mode);
696 		if (mode_dev->panel_fixed_mode) {
697 			mode_dev->panel_fixed_mode->type |=
698 				DRM_MODE_TYPE_PREFERRED;
699 			goto out;	/* FIXME: check for quirks */
700 		}
701 	}
702 	/*
703 	 * If we didn't get EDID, try checking if the panel is already turned
704 	 * on.	If so, assume that whatever is currently programmed is the
705 	 * correct mode.
706 	 */
707 	lvds = REG_READ(LVDS);
708 	pipe = (lvds & LVDS_PIPEB_SELECT) ? 1 : 0;
709 	crtc = psb_intel_get_crtc_from_pipe(dev, pipe);
710 
711 	if (crtc && (lvds & LVDS_PORT_EN)) {
712 		mode_dev->panel_fixed_mode =
713 		    cdv_intel_crtc_mode_get(dev, crtc);
714 		if (mode_dev->panel_fixed_mode) {
715 			mode_dev->panel_fixed_mode->type |=
716 			    DRM_MODE_TYPE_PREFERRED;
717 			goto out;	/* FIXME: check for quirks */
718 		}
719 	}
720 
721 	/* If we still don't have a mode after all that, give up. */
722 	if (!mode_dev->panel_fixed_mode) {
723 		DRM_DEBUG
724 			("Found no modes on the lvds, ignoring the LVDS\n");
725 		goto failed_find;
726 	}
727 
728 	/* setup PWM */
729 	{
730 		u32 pwm;
731 
732 		pwm = REG_READ(BLC_PWM_CTL2);
733 		if (pipe == 1)
734 			pwm |= PWM_PIPE_B;
735 		else
736 			pwm &= ~PWM_PIPE_B;
737 		pwm |= PWM_ENABLE;
738 		REG_WRITE(BLC_PWM_CTL2, pwm);
739 	}
740 
741 out:
742 	mutex_unlock(&dev->mode_config.mutex);
743 	drm_connector_register(connector);
744 	return;
745 
746 failed_find:
747 	mutex_unlock(&dev->mode_config.mutex);
748 	pr_err("Failed find\n");
749 	psb_intel_i2c_destroy(gma_encoder->ddc_bus);
750 failed_ddc:
751 	pr_err("Failed DDC\n");
752 	psb_intel_i2c_destroy(gma_encoder->i2c_bus);
753 failed_blc_i2c:
754 	pr_err("Failed BLC\n");
755 	drm_encoder_cleanup(encoder);
756 	drm_connector_cleanup(connector);
757 	kfree(lvds_priv);
758 failed_lvds_priv:
759 	kfree(gma_connector);
760 failed_connector:
761 	kfree(gma_encoder);
762 }
763