[Graphics/Display]: Port a bunch of patches from R2
authorRandy Xu <randy.xu@intel.com>
Sun, 11 Dec 2011 11:17:20 +0000 (19:17 +0800)
committerbuildbot <buildbot@intel.com>
Tue, 13 Dec 2011 13:19:51 +0000 (05:19 -0800)
BZ: 17008

This patch includes below bug fixing

0002-Gfx-Display-Enhance-DDC-to-read-extention-block-in-E.patch:BZ: 13176
0003-GFX-PM-Support-of-MIPIA-Display-OFF-during-video-pla.patch:BZ: 14855
0004-Gfx-Display-Fix-issue-for-MIPI-ERROR-fifo-is-not-emp.patch:BZ: 15147
0005-GFX-PM-fix-the-return-value-when-encoder-fail-to-pow.patch:BZ: 16150
0006-Solve-one-PM-issue-may-lead-to-Fabric-error.patch:BZ: 15373

Change-Id: Ia7cf3dc456df204489368dca3ff4e3a1f615bbec
Signed-off-by: Randy Xu <randy.xu@intel.com>
Signed-off-by: Tong Bo <box.tong@intel.com>
Reviewed-on: http://android.intel.com:8080/27125
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
arch/x86/configs/i386_mfld_defconfig
drivers/gpu/drm/drm_edid.c
drivers/i2c/busses/i2c-gpio.c
drivers/staging/mrst/drv/mdfld_dsi_dpi.c
drivers/staging/mrst/drv/mdfld_dsi_output.c
drivers/staging/mrst/drv/psb_drm.h
drivers/staging/mrst/drv/psb_drv.h
drivers/staging/mrst/drv/psb_intel_hdmi.c
drivers/staging/mrst/drv/psb_powermgmt.c
drivers/staging/mrst/drv/tmd_6x10_vid.c
drivers/staging/mrst/imgv/psb_msvdx.c

index 13c7622..5832ce0 100644 (file)
@@ -1169,7 +1169,7 @@ CONFIG_I2C_ALGOBIT=y
 # I2C system bus drivers (mostly embedded / system-on-chip)
 #
 CONFIG_I2C_DESIGNWARE_PCI=y
-# CONFIG_I2C_GPIO is not set
+CONFIG_I2C_GPIO=y
 # CONFIG_I2C_INTEL_MID is not set
 # CONFIG_I2C_OCORES is not set
 # CONFIG_I2C_PCA_PLATFORM is not set
index 3330bc4..6482dab 100644 (file)
@@ -241,7 +241,8 @@ static int
 drm_do_probe_ddc_edid(struct i2c_adapter *adapter, unsigned char *buf,
                      int block, int len)
 {
-       unsigned char start = block * EDID_LENGTH;
+       unsigned char segment = block / 2;
+       unsigned char start = (block % 2) * EDID_LENGTH;
        int ret, retries = 5;
 
        /* The core i2c driver will automatically retry the transfer if the
@@ -250,24 +251,50 @@ drm_do_probe_ddc_edid(struct i2c_adapter *adapter, unsigned char *buf,
         * generate spurious NAKs and timeouts. Retrying the transfer
         * of the individual block a few times seems to overcome this.
         */
-       do {
-               struct i2c_msg msgs[] = {
-                       {
-                               .addr   = DDC_ADDR,
-                               .flags  = 0,
-                               .len    = 1,
-                               .buf    = &start,
-                       }, {
-                               .addr   = DDC_ADDR,
-                               .flags  = I2C_M_RD,
-                               .len    = len,
-                               .buf    = buf,
-                       }
-               };
-               ret = i2c_transfer(adapter, msgs, 2);
-       } while (ret != 2 && --retries);
+       if (segment > 0) {
+               do {
+                       struct i2c_msg msgs[] = {
+                               {
+                                       .addr   = DDC_SEGMENT_ADDR,
+                                       .flags  = 0,
+                                       .len    = 1,
+                                       .buf    = &segment,
+                               }, {
+                                       .addr   = DDC_ADDR,
+                                       .flags  = 0,
+                                       .len    = 1,
+                                       .buf    = &start,
+                               }, {
+                                       .addr   = DDC_ADDR,
+                                       .flags  = I2C_M_RD,
+                                       .len    = len,
+                                       .buf    = buf,
+                               }
+                       };
+                       ret = i2c_transfer(adapter, msgs, 3);
+               } while (ret != 3 && --retries);
+
+               return ret == 3 ? 0 : -1;
+       } else {
+               do {
+                       struct i2c_msg msgs[] = {
+                               {
+                                       .addr   = DDC_ADDR,
+                                       .flags  = 0,
+                                       .len    = 1,
+                                       .buf    = &start,
+                               }, {
+                                       .addr   = DDC_ADDR,
+                                       .flags  = I2C_M_RD,
+                                       .len    = len,
+                                       .buf    = buf,
+                               }
+                       };
+                       ret = i2c_transfer(adapter, msgs, 2);
+               } while (ret != 2 && --retries);
 
-       return ret == 2 ? 0 : -1;
+               return ret == 2 ? 0 : -1;
+       }
 }
 
 static bool drm_edid_is_zero(u8 *in_edid, int length)
@@ -319,7 +346,12 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter)
                                  block + (valid_extensions + 1) * EDID_LENGTH,
                                  j, EDID_LENGTH))
                                goto out;
-                       if (drm_edid_block_valid(block + (valid_extensions + 1) * EDID_LENGTH)) {
+                       if (j < 2) {
+                               if (drm_edid_block_valid(block + (valid_extensions + 1) * EDID_LENGTH)) {
+                                       valid_extensions++;
+                                       break;
+                               }
+                       } else {
                                valid_extensions++;
                                break;
                        }
index 369b056..80c7fe3 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/module.h>
 #include <linux/slab.h>
 #include <linux/platform_device.h>
+#include <linux/lnw_gpio.h>
 
 #include <asm/gpio.h>
 
@@ -104,6 +105,9 @@ static int __devinit i2c_gpio_probe(struct platform_device *pdev)
        if (ret)
                goto err_request_scl;
 
+       lnw_gpio_set_alt(pdata->sda_pin, LNW_GPIO);
+       lnw_gpio_set_alt(pdata->scl_pin, LNW_GPIO);
+
        if (pdata->sda_is_open_drain) {
                gpio_direction_output(pdata->sda_pin, 1);
                bit_data->setsda = i2c_gpio_setsda_val;
@@ -204,14 +208,46 @@ static struct platform_driver i2c_gpio_driver = {
 static int __init i2c_gpio_init(void)
 {
        int ret;
+       struct platform_device *pdev;
+       struct i2c_gpio_platform_data *pdata;
+
+       /*
+        * Hard code a gpio controller platform device to take over
+        * the two gpio pins used to be controlled by i2c bus 3.
+        * This is to support HDMI EDID extension block read, which
+        * is not supported by the current i2c controller, so we use
+        * GPIO pin the simulate an i2c bus.
+        */
+       pdev = platform_device_alloc("i2c-gpio", 8);
+       if (!pdev) {
+               pr_err("i2c-gpio: failed to alloc platform device\n");
+               ret = -ENOMEM;
+               goto out;
+       }
+
+       pdata = kzalloc(sizeof(struct i2c_gpio_platform_data), GFP_KERNEL);
+       if (!pdata) {
+               pr_err("i2c-gpio: failed to alloc platform data\n");
+               kfree(pdev);
+               ret = -ENOMEM;
+               goto out;
+       }
+       pdata->scl_pin = 35 + 96;
+       pdata->sda_pin = 36 + 96;
+       pdata->sda_is_open_drain = 1;
+       pdata->scl_is_open_drain = 1;
+       pdev->dev.platform_data = pdata;
+
+       platform_device_add(pdev);
 
        ret = platform_driver_register(&i2c_gpio_driver);
        if (ret)
                printk(KERN_ERR "i2c-gpio: probe failed: %d\n", ret);
 
+out:
        return ret;
 }
-device_initcall(i2c_gpio_init);
+late_initcall(i2c_gpio_init);
 
 static void __exit i2c_gpio_exit(void)
 {
index 4250c62..393df40 100755 (executable)
@@ -30,6 +30,7 @@
 #include "mdfld_dsi_pkg_sender.h"
 #include "psb_drv.h"
 
+extern struct drm_device *gpDrmDevice;
 
 #ifdef CONFIG_SUPPORT_TOSHIBA_MIPI_DISPLAY
 
@@ -1527,6 +1528,7 @@ static int __mdfld_dsi_dpi_set_power(struct drm_encoder *encoder, bool on)
        struct panel_funcs *p_funcs;
        int pipe;
        struct drm_device *dev;
+       struct drm_psb_private *dev_priv;
 
        PSB_DEBUG_ENTRY("%s: mode %s\n", __func__, (on ? "on" : "off"));
 
@@ -1542,6 +1544,7 @@ static int __mdfld_dsi_dpi_set_power(struct drm_encoder *encoder, bool on)
        pipe = mdfld_dsi_encoder_get_pipe(dsi_encoder);
        dsi_connector = mdfld_dsi_encoder_get_connector(dsi_encoder);
        dev = dsi_config->dev;
+       dev_priv = dev->dev_private;
 
        if (dsi_connector->status != connector_status_connected)
                return 0;
@@ -1549,18 +1552,39 @@ static int __mdfld_dsi_dpi_set_power(struct drm_encoder *encoder, bool on)
        mutex_lock(&dsi_config->context_lock);
 
        if (on && !dsi_config->dsi_hw_context.panel_on) {
-               if (__dpi_panel_power_on(dsi_config, p_funcs)) {
-                       DRM_ERROR("Failed to power on\n");
-                       goto set_power_err;
+               /*Just turn on panel for WiDi Extended Mode.*/
+               if (!dev_priv->drm_psb_widi) {
+                       if (__dpi_panel_power_on(dsi_config, p_funcs)) {
+                               DRM_ERROR("Failed to power on\n");
+                               goto set_power_err;
+                       }
+               } else {
+                       if (p_funcs && p_funcs->power_on) {
+                               if (p_funcs->power_on(dsi_config)) {
+                                       DRM_ERROR("Failed to power on panel\n");
+                                       goto set_power_err;
+                               }
+                       }
                }
                dsi_config->dsi_hw_context.panel_on = 1;
                /*if power on , then default turn off color mode,
                        let panel in full color*/
                mdfld_dsi_dpi_set_color_mode(dsi_config, false);
        } else if (!on && dsi_config->dsi_hw_context.panel_on) {
-               if (__dpi_panel_power_off(dsi_config, p_funcs)) {
-                       DRM_ERROR("Failed to power off\n");
-                       goto set_power_err;
+               /*Just turn off panel for WiDi Extended Mode.*/
+               if (!dev_priv->drm_psb_widi) {
+                       if (__dpi_panel_power_off(dsi_config, p_funcs)) {
+                               DRM_ERROR("Failed to power off\n");
+                               goto set_power_err;
+                       }
+               } else {
+                       if (p_funcs && p_funcs->power_off) {
+                               if (p_funcs->power_off(dsi_config)) {
+                                       DRM_ERROR(
+                                       "Failed to power off panel\n");
+                                       goto set_power_err;
+                               }
+                       }
                }
                dsi_config->dsi_hw_context.panel_on = 0;
        }
index a644c20..351f2ea 100755 (executable)
@@ -342,7 +342,7 @@ void mdfld_dsi_brightness_control (struct drm_device *dev, int pipe, int level)
        }
 
        if (!ospm_power_using_hw_begin(OSPM_DISPLAY_ISLAND,
-                                       OSPM_UHB_ONLY_IF_ON))
+                                       OSPM_UHB_FORCE_POWER_ON))
                return;
 
        mutex_lock(&dsi_config->context_lock);
index c7cf015..825d787 100644 (file)
@@ -274,7 +274,8 @@ typedef enum {
        IMG_VIDEO_GET_DISPLAYING_FRAME,
        IMG_VIDEO_GET_HDMI_STATE,
        IMG_VIDEO_SET_HDMI_STATE,
-       PNW_VIDEO_QUERY_ENTRY
+       PNW_VIDEO_QUERY_ENTRY,
+       IMG_DISPLAY_SET_WIDI_EXT_STATE
 } lnc_getparam_key_t;
 
 struct drm_lnc_video_getparam_arg {
index 54e3fd9..2aca879 100755 (executable)
@@ -47,6 +47,7 @@
 /*Append new drm mode definition here, align with libdrm definition*/
 #define DRM_MODE_SCALE_NO_SCALE   4
 
+extern struct drm_device *gpDrmDevice;
 extern bool gbdispstatus;
 extern int drm_psb_debug;
 extern int drm_psb_enable_pr2_cabc ;
index 63891fe..4707338 100644 (file)
@@ -1188,8 +1188,8 @@ mdfld_hdmi_edid_detect(struct drm_connector *connector)
        if (!output->hdmi_i2c_adapter) {
                DRM_INFO("Enter mdfld_hdmi_get_modes, i2c_adapter is NULL.\n");
 
-               /* hard-coded the HDMI_I2C_ADAPTER_ID to be 3, Should get from GCT*/
-               output->hdmi_i2c_adapter = i2c_get_adapter(3);
+               /* hard-coded the HDMI_I2C_ADAPTER_ID to be 8, Should get from GCT*/
+               output->hdmi_i2c_adapter = i2c_get_adapter(8);
        }
 
        if (!output->hdmi_i2c_adapter) {
@@ -1495,8 +1495,8 @@ static int mdfld_hdmi_get_modes(struct drm_connector *connector)
        if (!psb_intel_output->hdmi_i2c_adapter) {
                DRM_INFO("Enter mdfld_hdmi_get_modes, i2c_adapter is NULL.\n");
 
-               /* hard-coded the HDMI_I2C_ADAPTER_ID to be 3, Should get from GCT*/
-               psb_intel_output->hdmi_i2c_adapter = i2c_get_adapter(3);
+               /* hard-coded the HDMI_I2C_ADAPTER_ID to be 8, Should get from GCT*/
+               psb_intel_output->hdmi_i2c_adapter = i2c_get_adapter(8);
        }
 
        if (!psb_intel_output->hdmi_i2c_adapter) {
@@ -1769,8 +1769,8 @@ void mdfld_hdmi_init(struct drm_device *dev,
 
        drm_connector_attach_property(connector, dev->mode_config.scaling_mode_property, DRM_MODE_SCALE_CENTER);
 
-       /* hard-coded the HDMI_I2C_ADAPTER_ID to be 3, Should get from GCT*/
-       psb_intel_output->hdmi_i2c_adapter = i2c_get_adapter(3);
+       /* hard-coded the HDMI_I2C_ADAPTER_ID to be 8, Should get from GCT*/
+       psb_intel_output->hdmi_i2c_adapter = i2c_get_adapter(8);
 
        if (psb_intel_output->hdmi_i2c_adapter) {
                DRM_INFO("Enter mdfld_hdmi_init, i2c_adapter is availabe.\n");
index 9bbf7f1..d197486 100755 (executable)
@@ -338,6 +338,7 @@ void ospm_power_init(struct drm_device *dev)
        mutex_init(&g_ospm_mutex);
        spin_lock_init(&dev_priv->ospm_lock);
 
+       dev_priv->drm_psb_widi = 0;
        spin_lock_irqsave(&dev_priv->ospm_lock, flags);
        g_hw_power_status_mask = OSPM_ALL_ISLANDS;
        spin_unlock_irqrestore(&dev_priv->ospm_lock, flags);
@@ -1679,6 +1680,9 @@ static void gfx_early_suspend(struct early_suspend *h)
        printk(KERN_ALERT "\n   gfx_early_suspend\n");
 #endif
 
+       if( dev_priv->drm_psb_widi )
+               dev_priv->drm_psb_widi = 0;
+
        /*Display off*/
        if (IS_MDFLD(gpDrmDevice)) {
                if ((dev_priv->panel_id == TMD_VID) ||
@@ -1738,6 +1742,9 @@ static void gfx_late_resume(struct early_suspend *h)
        printk(KERN_ALERT "\ngfx_late_resume\n");
 #endif
 
+       if( dev_priv->drm_psb_widi )
+               dev_priv->drm_psb_widi = 0;
+
        if(IS_MDFLD(gpDrmDevice)){
 
 #ifdef CONFIG_GFX_RTPM
@@ -1815,7 +1822,6 @@ int ospm_power_suspend(struct pci_dev *pdev, pm_message_t state)
         int videoenc_access_count;
         int videodec_access_count;
         int display_access_count;
-        bool suspend_pci = true;
 
        if(gbSuspendInProgress || gbResumeInProgress)
         {
@@ -1855,13 +1861,11 @@ int ospm_power_suspend(struct pci_dev *pdev, pm_message_t state)
                         }
 
 #endif
-                        if (ospm_runtime_pm_topaz_suspend(gpDrmDevice) != 0) {
-                               suspend_pci = false;
-                        }
+                        if (ospm_runtime_pm_topaz_suspend(gpDrmDevice) != 0)
+                               ret = -EBUSY;
 
-                        if (suspend_pci == true) {
+                       if (!ret)
                                ospm_suspend_pci(pdev);
-                        }
                         gbSuspendInProgress = false;
                 } else {
                         printk(KERN_ALERT "ospm_power_suspend: device busy: graphics %d videoenc %d videodec %d display %d\n", graphics_access_count, videoenc_access_count, videodec_access_count, display_access_count);
index 47fdf51..5978a40 100755 (executable)
@@ -32,6 +32,9 @@
 #include "mdfld_dsi_pkg_sender.h"
 #include <linux/gpio.h>
 #include <linux/sfi.h>
+#include "psb_drv.h"
+
+#define GPIO_MIPI_PANEL_RESET 128
 
 /* ************************************************************************* *\
  * FUNCTION: mdfld_dsi_tmd_6X10_ic_init
@@ -263,6 +266,8 @@ static int mdfld_dsi_pr2_power_on(struct mdfld_dsi_config *dsi_config)
 {
        struct mdfld_dsi_pkg_sender *sender =
                mdfld_dsi_get_pkg_sender(dsi_config);
+       struct drm_psb_private *dev_priv =
+               (struct drm_psb_private *) gpDrmDevice->dev_private;
        int err;
 
        PSB_DEBUG_ENTRY("Turn on video mode TMD panel...\n");
@@ -271,29 +276,34 @@ static int mdfld_dsi_pr2_power_on(struct mdfld_dsi_config *dsi_config)
                DRM_ERROR("Failed to get DSI packet sender\n");
                return -EINVAL;
        }
-       mdfld_dsi_send_gen_long_hs(sender, pr2_mcs_protect_off, 1, 0);
 
-       /*change power state*/
-       mdfld_dsi_send_mcs_long_hs(sender, pr2_exit_sleep_mode, 1, 0);
+       /*Just turn on panel for WiDi Extended Mode.*/
+       if (!dev_priv->drm_psb_widi) {
+               mdfld_dsi_send_gen_long_hs(sender, pr2_mcs_protect_off, 1, 0);
+               /*change power state*/
+               mdfld_dsi_send_mcs_long_hs(sender, pr2_exit_sleep_mode, 1, 0);
 
-       msleep(120);
+               msleep(120);
 
-       /*enable PWMON*/
-       pr2_backlight_control_2[0] |= BIT8;
-       mdfld_dsi_send_mcs_long_hs(sender, pr2_backlight_control_2, 2, 0);
+               /*enable PWMON*/
+               pr2_backlight_control_2[0] |= BIT8;
+               mdfld_dsi_send_mcs_long_hs(sender,
+                       pr2_backlight_control_2, 2, 0);
 
-       /*set display on*/
-       mdfld_dsi_send_mcs_long_hs(sender, pr2_set_display_on, 1, 0);
+               /*set display on*/
+               mdfld_dsi_send_mcs_long_hs(sender, pr2_set_display_on, 1, 0);
 
-       msleep(21);
+               msleep(21);
 
-       /*Enable BLON , CABC*/
-       if (drm_psb_enable_pr2_cabc) {
-               pr2_backlight_control_1[0] |= BIT8;
-               mdfld_dsi_send_gen_long_hs(sender, pr2_backlight_control_1, 6, 0);
-               printk(KERN_ALERT "enable pr2 cabc\n");
-       }
+               /*Enable BLON , CABC*/
+               if (drm_psb_enable_pr2_cabc) {
+                       pr2_backlight_control_1[0] |= BIT8;
+                       mdfld_dsi_send_gen_long_hs(sender,
+                               pr2_backlight_control_1, 6, 0);
+                       printk(KERN_ALERT "enable pr2 cabc\n");
+               }
 
+       }
        /*send TURN_ON packet*/
        err = mdfld_dsi_send_dpi_spk_pkg_hs(sender,
                                MDFLD_DSI_DPI_SPK_TURN_ON);
@@ -301,7 +311,6 @@ static int mdfld_dsi_pr2_power_on(struct mdfld_dsi_config *dsi_config)
                DRM_ERROR("Failed to send turn on packet\n");
                return err;
        }
-
        return 0;
 }
 
@@ -309,6 +318,8 @@ static int mdfld_dsi_pr2_power_off(struct mdfld_dsi_config *dsi_config)
 {
        struct mdfld_dsi_pkg_sender *sender =
                mdfld_dsi_get_pkg_sender(dsi_config);
+       struct drm_psb_private *dev_priv =
+               (struct drm_psb_private *) gpDrmDevice->dev_private;
        int err;
 
        PSB_DEBUG_ENTRY("Turn off video mode TMD panel...\n");
@@ -326,29 +337,30 @@ static int mdfld_dsi_pr2_power_off(struct mdfld_dsi_config *dsi_config)
                return err;
        }
 
-       mdfld_dsi_send_gen_long_hs(sender, pr2_mcs_protect_off, 1, 0);
-
-       /*change power state here*/
-       mdfld_dsi_send_mcs_long_hs(sender, pr2_set_display_off, 1, 0);
+       /*Just turn off panel for WiDi Extended Mode.*/
+       if (!dev_priv->drm_psb_widi) {
+               mdfld_dsi_send_gen_long_hs(sender, pr2_mcs_protect_off, 1, 0);
+               /*change power state here*/
+               mdfld_dsi_send_mcs_long_hs(sender, pr2_set_display_off, 1, 0);
 
-       /*disable BLCON, disable CABC*/
-       pr2_backlight_control_1[0] &= (~BIT8);
-       mdfld_dsi_send_gen_long_hs(sender, pr2_backlight_control_1, 6, 0);
-       printk(KERN_ALERT "disable pr2 cabc\n");
+               /*disable BLCON, disable CABC*/
+               pr2_backlight_control_1[0] &= (~BIT8);
+               mdfld_dsi_send_gen_long_hs(sender,
+                       pr2_backlight_control_1, 6, 0);
+               printk(KERN_ALERT "disable pr2 cabc\n");
 
-       msleep(21);
+               msleep(21);
 
-       mdfld_dsi_send_mcs_long_hs(sender, pr2_enter_sleep_mode, 1, 0);
-       /*disable PWMON*/
-       pr2_backlight_control_2[0] &= (~BIT8);
-       mdfld_dsi_send_gen_long_hs(sender, pr2_backlight_control_2, 2, 0);
+               mdfld_dsi_send_mcs_long_hs(sender, pr2_enter_sleep_mode, 1, 0);
 
-       msleep(120);
+               msleep(120);
 
-       /*put panel into deep standby mode*/
-       mdfld_dsi_send_gen_long_hs(sender, pr2_enter_low_power_mode, 1, 0);
+               /*put panel into deep standby mode*/
+               mdfld_dsi_send_gen_long_hs(sender,
+                       pr2_enter_low_power_mode, 1, 0);
 
-       mdfld_dsi_send_gen_long_hs(sender, pr2_mcs_protect_on, 1, 0);
+               mdfld_dsi_send_gen_long_hs(sender, pr2_mcs_protect_on, 1, 0);
+       }
        return 0;
 }
 
index dca1c9f..8068358 100644 (file)
@@ -33,7 +33,6 @@
        list_entry((ptr)->next, type, member)
 #endif
 
-
 static int psb_msvdx_send(struct drm_device *dev, void *cmd,
                          unsigned long cmd_size);
 
@@ -1505,6 +1504,10 @@ int lnc_video_getparam(struct drm_device *dev, void *data,
                        return -EFAULT;
                }
                break;
+       case IMG_DISPLAY_SET_WIDI_EXT_STATE:
+               dev_priv->drm_psb_widi = (int)arg->value;
+               DRM_INFO("psb_drm_widi: %d.\n", dev_priv->drm_psb_widi);
+               break;
        case IMG_VIDEO_GET_HDMI_STATE:
                ret = copy_to_user((void __user *)((unsigned long)arg->value),
                                &hdmi_state,