From 13d14a2e5b1d31b85373949422b34fb9d68380bd Mon Sep 17 00:00:00 2001 From: Max Krummenacher Date: Fri, 14 Feb 2014 17:50:03 +0100 Subject: 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. --- arch/arm/configs/apalis_imx6_defconfig | 1 + arch/arm/mach-mx6/board-apalis_imx6.c | 47 +++++++++++++++++++++------------- arch/arm/mach-mx6/pads-apalis_imx6.h | 26 ++++++------------- 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 #include #include +#include #include #ifdef TODO #include @@ -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 }; -- cgit v1.2.3