# 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
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
* 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)
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;
}
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/platform_device.h>
+#include <linux/lnw_gpio.h>
#include <asm/gpio.h>
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;
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)
{
#include "mdfld_dsi_pkg_sender.h"
#include "psb_drv.h"
+extern struct drm_device *gpDrmDevice;
#ifdef CONFIG_SUPPORT_TOSHIBA_MIPI_DISPLAY
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"));
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;
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;
}
}
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);
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 {
/*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 ;
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) {
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) {
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");
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);
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) ||
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
int videoenc_access_count;
int videodec_access_count;
int display_access_count;
- bool suspend_pci = true;
if(gbSuspendInProgress || gbResumeInProgress)
{
}
#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);
#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
{
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");
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);
DRM_ERROR("Failed to send turn on packet\n");
return err;
}
-
return 0;
}
{
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");
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;
}
list_entry((ptr)->next, type, member)
#endif
-
static int psb_msvdx_send(struct drm_device *dev, void *cmd,
unsigned long cmd_size);
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,