summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Krummenacher <max.krummenacher@toradex.com>2014-02-14 17:50:03 +0100
committerMax Krummenacher <max.krummenacher@toradex.com>2014-02-14 17:50:03 +0100
commit13d14a2e5b1d31b85373949422b34fb9d68380bd (patch)
tree74b3e12bd8cc7df06a94cbf8ec97513a56247334
parenta04866753934832035f3e5d0729f8e627c27c29c (diff)
i2c-ddc: use i2c-gpio to workaround pinmuxing
- not (yet) working hdmi-phy i2c would require i2c1 to be muxed between power i2c and ddc.
-rw-r--r--arch/arm/configs/apalis_imx6_defconfig1
-rw-r--r--arch/arm/mach-mx6/board-apalis_imx6.c47
-rw-r--r--arch/arm/mach-mx6/pads-apalis_imx6.h26
3 files changed, 38 insertions, 36 deletions
diff --git a/arch/arm/configs/apalis_imx6_defconfig b/arch/arm/configs/apalis_imx6_defconfig
index f91e2b526fae..99cd2ee76c35 100644
--- a/arch/arm/configs/apalis_imx6_defconfig
+++ b/arch/arm/configs/apalis_imx6_defconfig
@@ -166,6 +166,7 @@ CONFIG_FSL_OTP=y
CONFIG_HW_RANDOM=y
CONFIG_MXS_VIIM=y
CONFIG_I2C_CHARDEV=y
+CONFIG_I2C_GPIO=y
CONFIG_I2C_IMX=y
CONFIG_SPI=y
CONFIG_SPI_IMX=y
diff --git a/arch/arm/mach-mx6/board-apalis_imx6.c b/arch/arm/mach-mx6/board-apalis_imx6.c
index 40ac27172791..942f790f1bed 100644
--- a/arch/arm/mach-mx6/board-apalis_imx6.c
+++ b/arch/arm/mach-mx6/board-apalis_imx6.c
@@ -31,6 +31,7 @@
#include <linux/spi/spi.h>
#include <linux/spi/flash.h>
#include <linux/i2c.h>
+#include<linux/i2c-gpio.h>
#include <linux/ata.h>
#ifdef TODO
#include <linux/input/fusion_F0710A.h>
@@ -89,6 +90,9 @@
#define GP_USB_PEN IMX_GPIO_NR(1, 0) /* USBH_EN */
#define GP_USB_HUB_VBUS IMX_GPIO_NR(3, 28) /* USB_VBUS_DET */
#define GP_ENET_PHY_INT IMX_GPIO_NR(1, 30)
+#define GP_DDC_SCL IMX_GPIO_NR(2, 30) /* HDMI DDC SCL GPIO bitbang driver */
+#define GP_DDC_SDA IMX_GPIO_NR(3, 16) /* HDMI DDC SDA GPIO bitbang driver */
+
#define TOUCH_PEN_INT IMX_GPIO_NR(4, 10)
#define CAN1_ERR_TEST_PADCFG (PAD_CTL_PKE | PAD_CTL_PUE | \
@@ -434,8 +438,21 @@ static int pinmux_fusion_pins(void)
#endif
/* I2C */
-/* Make sure that the pinmuxing enable the 'open drain' feature for pins used
- for I2C */
+/* Use I2C-gpio for EDID */
+static struct i2c_gpio_platform_data ddc_i2c_pdata = {
+ .sda_pin = GP_DDC_SDA,
+ .scl_pin = GP_DDC_SCL,
+ .sda_is_open_drain = 0,
+ .scl_is_open_drain = 0,
+ .udelay = 10,
+};
+static struct platform_device ddc_i2c_device = {
+ .name = "i2c-gpio",
+ .id = 8,
+ .dev = {
+ .platform_data =&ddc_i2c_pdata,
+ },
+};
/* I2C1_SDA/SCL on MXM3 pin 209/211 (e.g. RTC on carrier board) */
static struct i2c_board_info mxc_i2c0_board_info[] __initdata = {
@@ -453,11 +470,10 @@ static struct i2c_board_info mxc_i2c0_board_info[] __initdata = {
#endif
};
-/* DDC: I2C_SDA/SCL on MXM3 pin 205/207 (e.g. display EDID) */
-
/* CAM_I2C: I2C3_SDA/SCL on MXM3 pin 201/203 (e.g. camera sensor on carrier
board) */
static struct i2c_board_info mxc_i2c2_board_info[] __initdata = {
+ /* currently no devices */
};
/* PWR_I2C: power I2C to audio codec, PMIC and touch screen controller */
@@ -509,13 +525,15 @@ static struct i2c_board_info mxc_i2c1_board_info[] __initdata = {
I2C_BOARD_INFO("pf0100", 0x08),
},
#endif
+};
+
+/* DDC: I2C_SDA/SCL on MXM3 pin 205/207 (e.g. display EDID) */
+static struct i2c_board_info mxc_i2cddc_board_info[] __initdata = {
{
I2C_BOARD_INFO("mxc_hdmi_i2c", 0x50),
},
};
-//***********************************************************************************************************************
-
static struct imxi2c_platform_data i2c_data = {
.bitrate = 100000,
};
@@ -673,14 +691,6 @@ static struct fsl_mxc_tvin_platform_data adv7180_data = {
.csi = 1,
};
-#if 0
-static struct i2c_board_info mxc_i2c1_board_info[] __initdata = {
- {
- I2C_BOARD_INFO("mxc_hdmi_i2c", 0x50),
- },
-};
-#endif
-#if 0
static struct fsl_mxc_lcd_platform_data adv7391_data = {
.ipu_id = 0,
.disp_id = 0,
@@ -899,14 +909,12 @@ static void hdmi_init(int ipu_id, int disp_id)
static void hdmi_enable_ddc_pin(void)
{
- printk("hdmi: pinmux for EDID");
- IOMUX_SETUP(hdmi_ddc_pads);
+ IOMUX_SETUP(hdmi_hdcp_pads);
}
static void hdmi_disable_ddc_pin(void)
{
- printk("hdmi: pinmux for PWR_I2C\n");
- IOMUX_SETUP(i2c2_pads);
+ IOMUX_SETUP(hdmi_ddc_pads);
}
static struct fsl_mxc_hdmi_platform_data hdmi_data = {
@@ -1444,6 +1452,7 @@ static void __init board_init(void)
imx6q_add_imx_i2c(0, &i2c_data);
imx6q_add_imx_i2c(1, &i2c_data);
imx6q_add_imx_i2c(2, &i2c_data);
+ platform_device_register(&ddc_i2c_device);
/* enable touch interrupt GPIO */
gpio_request(TOUCH_PEN_INT, "TOUCH_PEN_INT");
@@ -1457,6 +1466,8 @@ static void __init board_init(void)
ARRAY_SIZE(mxc_i2c1_board_info));
i2c_register_board_info(2, mxc_i2c2_board_info,
ARRAY_SIZE(mxc_i2c2_board_info));
+ i2c_register_board_info(8, mxc_i2cddc_board_info,
+ ARRAY_SIZE(mxc_i2cddc_board_info));
/* SPI */
imx6q_add_ecspi(0, &spi_data);
diff --git a/arch/arm/mach-mx6/pads-apalis_imx6.h b/arch/arm/mach-mx6/pads-apalis_imx6.h
index 1161b48dc781..efc7ccfc3f75 100644
--- a/arch/arm/mach-mx6/pads-apalis_imx6.h
+++ b/arch/arm/mach-mx6/pads-apalis_imx6.h
@@ -277,6 +277,10 @@ static iomux_v3_cfg_t MX6NAME(common_pads)[] = {
MX6PAD(CSI0_DAT9__I2C1_SCL),
MX6PAD(CSI0_DAT8__I2C1_SDA),
+ /* Apalis power I2C, i.MX I2C2*/
+ MX6PAD(KEY_COL3__I2C2_SCL),
+ MX6PAD(KEY_ROW3__I2C2_SDA),
+
/* Apalis I2C3 (CAM), i.MX I2C3 */
MX6PAD(EIM_D17__I2C3_SCL),
MX6PAD(EIM_D18__I2C3_SDA),
@@ -302,28 +306,14 @@ static iomux_v3_cfg_t MX6NAME(common_pads)[] = {
};
/* Apalis I2C2 (DDC) */
-#define DDC_USE_I2C2
-static iomux_v3_cfg_t MX6NAME(hdmi_ddc_pads)[] = {
-#ifdef DDC_USE_I2C2
- MX6PAD(KEY_COL3__GPIO_4_12), /* I2C2 SCL */
- MX6PAD(KEY_ROW3__GPIO_4_13), /* I2C2 SDA */
- MX6PAD(EIM_EB2__I2C2_SCL), /* HDMI DDC SCL */
- MX6PAD(EIM_D16__I2C2_SDA), /* HDMI DDC SDA */
-#else
+static iomux_v3_cfg_t MX6NAME(hdmi_hdcp_pads)[] = {
MX6PAD(EIM_EB2__HDMI_TX_DDC_SCL), /* HDMI DDC SCL */
MX6PAD(EIM_D16__HDMI_TX_DDC_SDA), /* HDMI DDC SDA */
-#endif
0
};
-
-/* Apalis power I2C, i.MX I2C2*/
-static iomux_v3_cfg_t MX6NAME(i2c2_pads)[] = {
-#ifdef DDC_USE_I2C2
- MX6PAD(EIM_EB2__HDMI_TX_DDC_SCL), /* HDMI DDC SCL */
- MX6PAD(EIM_D16__HDMI_TX_DDC_SDA), /* HDMI DDC SDA */
-#endif
- MX6PAD(KEY_COL3__I2C2_SCL), /* I2C2 SCL */
- MX6PAD(KEY_ROW3__I2C2_SDA), /* I2C2 SDA */
+static iomux_v3_cfg_t MX6NAME(hdmi_ddc_pads)[] = {
+ MX6PAD(EIM_EB2__GPIO_2_30), /* HDMI DDC SCL GPIO bitbang driver */
+ MX6PAD(EIM_D16__GPIO_3_16), /* HDMI DDC SDA GPIO bitbang driver */
0
};