|
@@ -195,8 +195,9 @@ static void cdv_intel_lvds_set_backlight(struct drm_device *dev, int level)
|
|
|
* Sets the power state for the panel.
|
|
|
*/
|
|
|
static void cdv_intel_lvds_set_power(struct drm_device *dev,
|
|
|
- struct psb_intel_output *output, bool on)
|
|
|
+ struct drm_encoder *encoder, bool on)
|
|
|
{
|
|
|
+ struct drm_psb_private *dev_priv = dev->dev_private;
|
|
|
u32 pp_status;
|
|
|
|
|
|
if (!gma_power_begin(dev, true))
|
|
@@ -210,8 +211,7 @@ static void cdv_intel_lvds_set_power(struct drm_device *dev,
|
|
|
} while ((pp_status & PP_ON) == 0);
|
|
|
|
|
|
cdv_intel_lvds_set_backlight(dev,
|
|
|
- output->
|
|
|
- mode_dev->backlight_duty_cycle);
|
|
|
+ dev_priv->mode_dev.backlight_duty_cycle);
|
|
|
} else {
|
|
|
cdv_intel_lvds_set_backlight(dev, 0);
|
|
|
|
|
@@ -227,11 +227,10 @@ static void cdv_intel_lvds_set_power(struct drm_device *dev,
|
|
|
static void cdv_intel_lvds_encoder_dpms(struct drm_encoder *encoder, int mode)
|
|
|
{
|
|
|
struct drm_device *dev = encoder->dev;
|
|
|
- struct psb_intel_output *output = enc_to_psb_intel_output(encoder);
|
|
|
if (mode == DRM_MODE_DPMS_ON)
|
|
|
- cdv_intel_lvds_set_power(dev, output, true);
|
|
|
+ cdv_intel_lvds_set_power(dev, encoder, true);
|
|
|
else
|
|
|
- cdv_intel_lvds_set_power(dev, output, false);
|
|
|
+ cdv_intel_lvds_set_power(dev, encoder, false);
|
|
|
/* XXX: We never power down the LVDS pairs. */
|
|
|
}
|
|
|
|
|
@@ -244,12 +243,12 @@ static void cdv_intel_lvds_restore(struct drm_connector *connector)
|
|
|
}
|
|
|
|
|
|
int cdv_intel_lvds_mode_valid(struct drm_connector *connector,
|
|
|
- struct drm_display_mode *mode)
|
|
|
+ struct drm_display_mode *mode)
|
|
|
{
|
|
|
- struct psb_intel_output *psb_intel_output =
|
|
|
- to_psb_intel_output(connector);
|
|
|
+ struct drm_device *dev = connector->dev;
|
|
|
+ struct drm_psb_private *dev_priv = dev->dev_private;
|
|
|
struct drm_display_mode *fixed_mode =
|
|
|
- psb_intel_output->mode_dev->panel_fixed_mode;
|
|
|
+ dev_priv->mode_dev.panel_fixed_mode;
|
|
|
|
|
|
/* just in case */
|
|
|
if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
|
|
@@ -272,9 +271,9 @@ bool cdv_intel_lvds_mode_fixup(struct drm_encoder *encoder,
|
|
|
struct drm_display_mode *mode,
|
|
|
struct drm_display_mode *adjusted_mode)
|
|
|
{
|
|
|
- struct psb_intel_mode_device *mode_dev =
|
|
|
- enc_to_psb_intel_output(encoder)->mode_dev;
|
|
|
struct drm_device *dev = encoder->dev;
|
|
|
+ struct drm_psb_private *dev_priv = dev->dev_private;
|
|
|
+ struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev;
|
|
|
struct drm_encoder *tmp_encoder;
|
|
|
struct drm_display_mode *panel_fixed_mode = mode_dev->panel_fixed_mode;
|
|
|
|
|
@@ -321,8 +320,8 @@ bool cdv_intel_lvds_mode_fixup(struct drm_encoder *encoder,
|
|
|
static void cdv_intel_lvds_prepare(struct drm_encoder *encoder)
|
|
|
{
|
|
|
struct drm_device *dev = encoder->dev;
|
|
|
- struct psb_intel_output *output = enc_to_psb_intel_output(encoder);
|
|
|
- struct psb_intel_mode_device *mode_dev = output->mode_dev;
|
|
|
+ struct drm_psb_private *dev_priv = dev->dev_private;
|
|
|
+ struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev;
|
|
|
|
|
|
if (!gma_power_begin(dev, true))
|
|
|
return;
|
|
@@ -331,7 +330,7 @@ static void cdv_intel_lvds_prepare(struct drm_encoder *encoder)
|
|
|
mode_dev->backlight_duty_cycle = (mode_dev->saveBLC_PWM_CTL &
|
|
|
BACKLIGHT_DUTY_CYCLE_MASK);
|
|
|
|
|
|
- cdv_intel_lvds_set_power(dev, output, false);
|
|
|
+ cdv_intel_lvds_set_power(dev, encoder, false);
|
|
|
|
|
|
gma_power_end(dev);
|
|
|
}
|
|
@@ -339,14 +338,14 @@ static void cdv_intel_lvds_prepare(struct drm_encoder *encoder)
|
|
|
static void cdv_intel_lvds_commit(struct drm_encoder *encoder)
|
|
|
{
|
|
|
struct drm_device *dev = encoder->dev;
|
|
|
- struct psb_intel_output *output = enc_to_psb_intel_output(encoder);
|
|
|
- struct psb_intel_mode_device *mode_dev = output->mode_dev;
|
|
|
+ struct drm_psb_private *dev_priv = dev->dev_private;
|
|
|
+ struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev;
|
|
|
|
|
|
if (mode_dev->backlight_duty_cycle == 0)
|
|
|
mode_dev->backlight_duty_cycle =
|
|
|
cdv_intel_lvds_get_max_backlight(dev);
|
|
|
|
|
|
- cdv_intel_lvds_set_power(dev, output, true);
|
|
|
+ cdv_intel_lvds_set_power(dev, encoder, true);
|
|
|
}
|
|
|
|
|
|
static void cdv_intel_lvds_mode_set(struct drm_encoder *encoder,
|
|
@@ -401,13 +400,13 @@ static enum drm_connector_status cdv_intel_lvds_detect(
|
|
|
static int cdv_intel_lvds_get_modes(struct drm_connector *connector)
|
|
|
{
|
|
|
struct drm_device *dev = connector->dev;
|
|
|
- struct psb_intel_output *psb_intel_output =
|
|
|
- to_psb_intel_output(connector);
|
|
|
- struct psb_intel_mode_device *mode_dev =
|
|
|
- psb_intel_output->mode_dev;
|
|
|
+ struct drm_psb_private *dev_priv = dev->dev_private;
|
|
|
+ struct psb_intel_encoder *psb_intel_encoder =
|
|
|
+ psb_intel_attached_encoder(connector);
|
|
|
+ struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev;
|
|
|
int ret;
|
|
|
|
|
|
- ret = psb_intel_ddc_get_modes(psb_intel_output);
|
|
|
+ ret = psb_intel_ddc_get_modes(connector, &psb_intel_encoder->i2c_bus->adapter);
|
|
|
|
|
|
if (ret)
|
|
|
return ret;
|
|
@@ -439,11 +438,11 @@ static int cdv_intel_lvds_get_modes(struct drm_connector *connector)
|
|
|
*/
|
|
|
void cdv_intel_lvds_destroy(struct drm_connector *connector)
|
|
|
{
|
|
|
- struct psb_intel_output *psb_intel_output =
|
|
|
- to_psb_intel_output(connector);
|
|
|
+ struct psb_intel_encoder *psb_intel_encoder =
|
|
|
+ psb_intel_attached_encoder(connector);
|
|
|
|
|
|
- if (psb_intel_output->ddc_bus)
|
|
|
- psb_intel_i2c_destroy(psb_intel_output->ddc_bus);
|
|
|
+ if (psb_intel_encoder->i2c_bus)
|
|
|
+ psb_intel_i2c_destroy(psb_intel_encoder->i2c_bus);
|
|
|
drm_sysfs_connector_remove(connector);
|
|
|
drm_connector_cleanup(connector);
|
|
|
kfree(connector);
|
|
@@ -565,7 +564,8 @@ const struct drm_encoder_funcs cdv_intel_lvds_enc_funcs = {
|
|
|
void cdv_intel_lvds_init(struct drm_device *dev,
|
|
|
struct psb_intel_mode_device *mode_dev)
|
|
|
{
|
|
|
- struct psb_intel_output *psb_intel_output;
|
|
|
+ struct psb_intel_encoder *psb_intel_encoder;
|
|
|
+ struct psb_intel_connector *psb_intel_connector;
|
|
|
struct cdv_intel_lvds_priv *lvds_priv;
|
|
|
struct drm_connector *connector;
|
|
|
struct drm_encoder *encoder;
|
|
@@ -575,32 +575,38 @@ void cdv_intel_lvds_init(struct drm_device *dev,
|
|
|
u32 lvds;
|
|
|
int pipe;
|
|
|
|
|
|
- psb_intel_output = kzalloc(sizeof(struct psb_intel_output) +
|
|
|
- sizeof(struct cdv_intel_lvds_priv), GFP_KERNEL);
|
|
|
- if (!psb_intel_output)
|
|
|
+ psb_intel_encoder = kzalloc(sizeof(struct psb_intel_encoder),
|
|
|
+ GFP_KERNEL);
|
|
|
+ if (!psb_intel_encoder)
|
|
|
return;
|
|
|
|
|
|
- lvds_priv = (struct cdv_intel_lvds_priv *)(psb_intel_output + 1);
|
|
|
+ psb_intel_connector = kzalloc(sizeof(struct psb_intel_connector),
|
|
|
+ GFP_KERNEL);
|
|
|
+ if (!psb_intel_connector)
|
|
|
+ goto failed_connector;
|
|
|
|
|
|
- psb_intel_output->dev_priv = lvds_priv;
|
|
|
+ lvds_priv = kzalloc(sizeof(struct cdv_intel_lvds_priv), GFP_KERNEL);
|
|
|
+ if (!lvds_priv)
|
|
|
+ goto failed_lvds_priv;
|
|
|
|
|
|
- psb_intel_output->mode_dev = mode_dev;
|
|
|
- connector = &psb_intel_output->base;
|
|
|
- encoder = &psb_intel_output->enc;
|
|
|
+ psb_intel_encoder->dev_priv = lvds_priv;
|
|
|
|
|
|
+ connector = &psb_intel_connector->base;
|
|
|
+ encoder = &psb_intel_encoder->base;
|
|
|
|
|
|
- drm_connector_init(dev, &psb_intel_output->base,
|
|
|
+
|
|
|
+ drm_connector_init(dev, connector,
|
|
|
&cdv_intel_lvds_connector_funcs,
|
|
|
DRM_MODE_CONNECTOR_LVDS);
|
|
|
|
|
|
- drm_encoder_init(dev, &psb_intel_output->enc,
|
|
|
+ drm_encoder_init(dev, encoder,
|
|
|
&cdv_intel_lvds_enc_funcs,
|
|
|
DRM_MODE_ENCODER_LVDS);
|
|
|
|
|
|
|
|
|
- drm_mode_connector_attach_encoder(&psb_intel_output->base,
|
|
|
- &psb_intel_output->enc);
|
|
|
- psb_intel_output->type = INTEL_OUTPUT_LVDS;
|
|
|
+ psb_intel_connector_attach_encoder(psb_intel_connector,
|
|
|
+ psb_intel_encoder);
|
|
|
+ psb_intel_encoder->type = INTEL_OUTPUT_LVDS;
|
|
|
|
|
|
drm_encoder_helper_add(encoder, &cdv_intel_lvds_helper_funcs);
|
|
|
drm_connector_helper_add(connector,
|
|
@@ -621,16 +627,16 @@ void cdv_intel_lvds_init(struct drm_device *dev,
|
|
|
* Set up I2C bus
|
|
|
* FIXME: distroy i2c_bus when exit
|
|
|
*/
|
|
|
- psb_intel_output->i2c_bus = psb_intel_i2c_create(dev,
|
|
|
+ psb_intel_encoder->i2c_bus = psb_intel_i2c_create(dev,
|
|
|
GPIOB,
|
|
|
"LVDSBLC_B");
|
|
|
- if (!psb_intel_output->i2c_bus) {
|
|
|
+ if (!psb_intel_encoder->i2c_bus) {
|
|
|
dev_printk(KERN_ERR,
|
|
|
&dev->pdev->dev, "I2C bus registration failed.\n");
|
|
|
goto failed_blc_i2c;
|
|
|
}
|
|
|
- psb_intel_output->i2c_bus->slave_addr = 0x2C;
|
|
|
- dev_priv->lvds_i2c_bus = psb_intel_output->i2c_bus;
|
|
|
+ psb_intel_encoder->i2c_bus->slave_addr = 0x2C;
|
|
|
+ dev_priv->lvds_i2c_bus = psb_intel_encoder->i2c_bus;
|
|
|
|
|
|
/*
|
|
|
* LVDS discovery:
|
|
@@ -643,10 +649,10 @@ void cdv_intel_lvds_init(struct drm_device *dev,
|
|
|
*/
|
|
|
|
|
|
/* Set up the DDC bus. */
|
|
|
- psb_intel_output->ddc_bus = psb_intel_i2c_create(dev,
|
|
|
+ psb_intel_encoder->ddc_bus = psb_intel_i2c_create(dev,
|
|
|
GPIOC,
|
|
|
"LVDSDDC_C");
|
|
|
- if (!psb_intel_output->ddc_bus) {
|
|
|
+ if (!psb_intel_encoder->ddc_bus) {
|
|
|
dev_printk(KERN_ERR, &dev->pdev->dev,
|
|
|
"DDC bus registration " "failed.\n");
|
|
|
goto failed_ddc;
|
|
@@ -656,7 +662,8 @@ void cdv_intel_lvds_init(struct drm_device *dev,
|
|
|
* Attempt to get the fixed panel mode from DDC. Assume that the
|
|
|
* preferred mode is the right one.
|
|
|
*/
|
|
|
- psb_intel_ddc_get_modes(psb_intel_output);
|
|
|
+ psb_intel_ddc_get_modes(connector,
|
|
|
+ &psb_intel_encoder->ddc_bus->adapter);
|
|
|
list_for_each_entry(scan, &connector->probed_modes, head) {
|
|
|
if (scan->type & DRM_MODE_TYPE_PREFERRED) {
|
|
|
mode_dev->panel_fixed_mode =
|
|
@@ -707,15 +714,19 @@ out:
|
|
|
|
|
|
failed_find:
|
|
|
printk(KERN_ERR "Failed find\n");
|
|
|
- if (psb_intel_output->ddc_bus)
|
|
|
- psb_intel_i2c_destroy(psb_intel_output->ddc_bus);
|
|
|
+ if (psb_intel_encoder->ddc_bus)
|
|
|
+ psb_intel_i2c_destroy(psb_intel_encoder->ddc_bus);
|
|
|
failed_ddc:
|
|
|
printk(KERN_ERR "Failed DDC\n");
|
|
|
- if (psb_intel_output->i2c_bus)
|
|
|
- psb_intel_i2c_destroy(psb_intel_output->i2c_bus);
|
|
|
+ if (psb_intel_encoder->i2c_bus)
|
|
|
+ psb_intel_i2c_destroy(psb_intel_encoder->i2c_bus);
|
|
|
failed_blc_i2c:
|
|
|
printk(KERN_ERR "Failed BLC\n");
|
|
|
drm_encoder_cleanup(encoder);
|
|
|
drm_connector_cleanup(connector);
|
|
|
- kfree(connector);
|
|
|
+ kfree(lvds_priv);
|
|
|
+failed_lvds_priv:
|
|
|
+ kfree(psb_intel_connector);
|
|
|
+failed_connector:
|
|
|
+ kfree(psb_intel_encoder);
|
|
|
}
|