[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20100526093821.GP17272@pengutronix.de>
Date: Wed, 26 May 2010 11:38:21 +0200
From: Sascha Hauer <s.hauer@...gutronix.de>
To: Dinh.Nguyen@...escale.com
Cc: linux-kernel@...r.kernel.org, linux-arm-kernel@...ts.infradead.org,
valentin.longchamp@...l.ch, daniel@...aq.de,
grant.likely@...retlab.ca, xiao-lizhang@...escale.com
Subject: Re: [PATCHv1 2.6.34] mx5: Add i2c to Freescale MX51 Babbage HW
On Tue, May 25, 2010 at 10:06:18AM -0500, Dinh.Nguyen@...escale.com wrote:
> From: Dinh Nguyen <Dinh.Nguyen@...escale.com>
>
> This patch adds I2C functionality to the Freescale MX51 Babbage HW.
> The patch adds device structures, i2c board slave device defines,
> IOMUX pin defines, and clocks.
>
> Signed-off-by: Dinh Nguyen <Dinh.Nguyen@...escale.com>
> ---
> arch/arm/mach-mx5/board-mx51_babbage.c | 45 +++++++++++++++++++++
> arch/arm/mach-mx5/clock-mx51.c | 11 +++++
> arch/arm/mach-mx5/devices.c | 58 +++++++++++++++++++++++++++
> arch/arm/mach-mx5/devices.h | 3 +
> arch/arm/plat-mxc/include/mach/iomux-mx51.h | 14 ++++---
I really prefer seperating the i.MX specific part from the board part.
> 5 files changed, 125 insertions(+), 6 deletions(-)
>
> diff --git a/arch/arm/mach-mx5/board-mx51_babbage.c b/arch/arm/mach-mx5/board-mx51_babbage.c
> index ee67a71..49fafa5 100644
> --- a/arch/arm/mach-mx5/board-mx51_babbage.c
> +++ b/arch/arm/mach-mx5/board-mx51_babbage.c
> @@ -12,11 +12,13 @@
>
> #include <linux/init.h>
> #include <linux/platform_device.h>
> +#include <linux/i2c.h>
>
> #include <mach/common.h>
> #include <mach/hardware.h>
> #include <mach/imx-uart.h>
> #include <mach/iomux-mx51.h>
> +#include <mach/i2c.h>
>
> #include <asm/irq.h>
> #include <asm/setup.h>
> @@ -46,6 +48,18 @@ static struct pad_desc mx51babbage_pads[] = {
> MX51_PAD_EIM_D26__UART3_TXD,
> MX51_PAD_EIM_D27__UART3_RTS,
> MX51_PAD_EIM_D24__UART3_CTS,
> +
> + /* I2C1 */
> + MX51_PAD_EIM_D16__I2C1_SDA,
> + MX51_PAD_EIM_D19__I2C1_SCL,
> +
> + /* I2C2 */
> + MX51_PAD_KEY_COL4__I2C2_SCL,
> + MX51_PAD_KEY_COL5__I2C2_SDA,
> +
> + /* HSI2C */
> + MX51_PAD_I2C1_CLK__HSI2C_CLK,
> + MX51_PAD_I2C1_DAT__HSI2C_DAT,
> };
>
> /* Serial ports */
> @@ -66,6 +80,28 @@ static inline void mxc_init_imx_uart(void)
> }
> #endif /* SERIAL_IMX */
>
> +static struct imxi2c_platform_data babbage_i2c_data = {
> + .bitrate = 100000,
> +};
> +
> +static struct imxi2c_platform_data babbage_hsi2c_data = {
> + .bitrate = 400000,
> +};
> +
> +static struct i2c_board_info babbage_hsi2c_board_info[] = {
> + {
> + I2C_BOARD_INFO("sii9022", 0x39),
> + }, {
> + I2C_BOARD_INFO("ch7026", 0x75),
> + }
> +};
> +
> +static struct i2c_board_info babbage_i2c1_board_info[] = {
> + {
> + I2C_BOARD_INFO("sgtl5000-i2c", 0x0a),
> + }
> +};
I think you should skip the board_info as long we do not have the
drivers in the tree.
> +
> /*
> * Board specific initialization.
> */
> @@ -75,6 +111,15 @@ static void __init mxc_board_init(void)
> ARRAY_SIZE(mx51babbage_pads));
> mxc_init_imx_uart();
> platform_add_devices(devices, ARRAY_SIZE(devices));
> +
> + mxc_register_device(&mxc_i2c_device0, &babbage_i2c_data);
> + mxc_register_device(&mxc_i2c_device1, &babbage_i2c_data);
> + mxc_register_device(&mxc_hsi2c_device, &babbage_hsi2c_data);
> +
> + i2c_register_board_info(1, babbage_i2c1_board_info,
> + ARRAY_SIZE(babbage_i2c1_board_info));
> + i2c_register_board_info(2, babbage_hsi2c_board_info,
> + ARRAY_SIZE(babbage_hsi2c_board_info));
> }
>
> static void __init mx51_babbage_timer_init(void)
> diff --git a/arch/arm/mach-mx5/clock-mx51.c b/arch/arm/mach-mx5/clock-mx51.c
> index 1ee6ce4..9a7dba8 100644
> --- a/arch/arm/mach-mx5/clock-mx51.c
> +++ b/arch/arm/mach-mx5/clock-mx51.c
> @@ -762,6 +762,14 @@ DEFINE_CLOCK(gpt_clk, 0, MXC_CCM_CCGR2, MXC_CCM_CCGRx_CG9_OFFSET,
> DEFINE_CLOCK(gpt_ipg_clk, 0, MXC_CCM_CCGR2, MXC_CCM_CCGRx_CG10_OFFSET,
> NULL, NULL, &ipg_clk, NULL);
>
> +/* I2C */
> +DEFINE_CLOCK(i2c1_clk, 0, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG9_OFFSET,
> + NULL, NULL, &ipg_clk, NULL);
> +DEFINE_CLOCK(i2c2_clk, 1, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG10_OFFSET,
> + NULL, NULL, &ipg_clk, NULL);
> +DEFINE_CLOCK(hsi2c_clk, 0, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG11_OFFSET,
> + NULL, NULL, &ipg_clk, NULL);
> +
> /* FEC */
> DEFINE_CLOCK(fec_clk, 0, MXC_CCM_CCGR2, MXC_CCM_CCGRx_CG12_OFFSET,
> NULL, NULL, &ipg_clk, NULL);
> @@ -779,6 +787,9 @@ static struct clk_lookup lookups[] = {
> _REGISTER_CLOCK("imx-uart.2", NULL, uart3_clk)
> _REGISTER_CLOCK(NULL, "gpt", gpt_clk)
> _REGISTER_CLOCK("fec.0", NULL, fec_clk)
> + _REGISTER_CLOCK("imx-i2c.0", NULL, i2c1_clk)
> + _REGISTER_CLOCK("imx-i2c.1", NULL, i2c2_clk)
> + _REGISTER_CLOCK("imx-i2c.2", NULL, hsi2c_clk)
> };
>
> static void clk_tree_init(void)
> diff --git a/arch/arm/mach-mx5/devices.c b/arch/arm/mach-mx5/devices.c
> index d6fd396..f6d5fbc 100644
> --- a/arch/arm/mach-mx5/devices.c
> +++ b/arch/arm/mach-mx5/devices.c
> @@ -89,6 +89,64 @@ struct platform_device mxc_fec_device = {
> .resource = mxc_fec_resources,
> };
>
> +static struct resource mxc_i2c0_resources[] = {
> + {
> + .start = MX51_I2C1_BASE_ADDR,
> + .end = MX51_I2C1_BASE_ADDR + SZ_4K - 1,
> + .flags = IORESOURCE_MEM,
> + }, {
> + .start = MX51_MXC_INT_I2C1,
> + .end = MX51_MXC_INT_I2C1,
> + .flags = IORESOURCE_IRQ,
> + },
> +};
> +
> +struct platform_device mxc_i2c_device0 = {
> + .name = "imx-i2c",
> + .id = 0,
> + .num_resources = ARRAY_SIZE(mxc_i2c0_resources),
> + .resource = mxc_i2c0_resources,
> +};
> +
> +static struct resource mxc_i2c1_resources[] = {
> + {
> + .start = MX51_I2C2_BASE_ADDR,
> + .end = MX51_I2C2_BASE_ADDR + SZ_4K - 1,
> + .flags = IORESOURCE_MEM,
> + }, {
> + .start = MX51_MXC_INT_I2C2,
> + .end = MX51_MXC_INT_I2C2,
> + .flags = IORESOURCE_IRQ,
> + },
> +};
> +
> +struct platform_device mxc_i2c_device1 = {
> + .name = "imx-i2c",
> + .id = 1,
> + .num_resources = ARRAY_SIZE(mxc_i2c1_resources),
> + .resource = mxc_i2c1_resources,
> +};
> +
> +static struct resource mxc_hsi2c_resources[] = {
> + {
> + .start = MX51_HSI2C_DMA_BASE_ADDR,
> + .end = MX51_HSI2C_DMA_BASE_ADDR + SZ_16K - 1,
> + .flags = IORESOURCE_MEM,
> + },
> + {
> + .start = MX51_MXC_INT_HS_I2C,
> + .end = MX51_MXC_INT_HS_I2C,
> + .flags = IORESOURCE_IRQ,
> + },
> +};
> +
> +struct platform_device mxc_hsi2c_device = {
> + .name = "imx-i2c",
> + .id = 2,
> + .num_resources = ARRAY_SIZE(mxc_hsi2c_resources),
> + .resource = mxc_hsi2c_resources
> +};
> +
> /* Dummy definition to allow compiling in AVIC and TZIC simultaneously */
> int __init mxc_register_gpios(void)
> {
> diff --git a/arch/arm/mach-mx5/devices.h b/arch/arm/mach-mx5/devices.h
> index f339ab8..f6289cf 100644
> --- a/arch/arm/mach-mx5/devices.h
> +++ b/arch/arm/mach-mx5/devices.h
> @@ -2,3 +2,6 @@ extern struct platform_device mxc_uart_device0;
> extern struct platform_device mxc_uart_device1;
> extern struct platform_device mxc_uart_device2;
> extern struct platform_device mxc_fec_device;
> +extern struct platform_device mxc_i2c_device0;
> +extern struct platform_device mxc_i2c_device1;
> +extern struct platform_device mxc_hsi2c_device;
> diff --git a/arch/arm/plat-mxc/include/mach/iomux-mx51.h b/arch/arm/plat-mxc/include/mach/iomux-mx51.h
> index b4f975e..003afe4 100644
> --- a/arch/arm/plat-mxc/include/mach/iomux-mx51.h
> +++ b/arch/arm/plat-mxc/include/mach/iomux-mx51.h
> @@ -37,6 +37,8 @@ typedef enum iomux_config {
> PAD_CTL_SRE_FAST)
> #define MX51_UART3_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_DSE_HIGH | \
> PAD_CTL_SRE_FAST)
> +#define MX51_I2C_PAD_CTRL (PAD_CTL_SRE_FAST | PAD_CTL_ODE | \
> + PAD_CTL_DSE_HIGH | PAD_CTL_PUS_100K_UP | PAD_CTL_HYS)
>
> /*
> * The naming convention for the pad modes is MX51_PAD_<padname>__<padmode>
> @@ -51,10 +53,10 @@ typedef enum iomux_config {
>
> /* PAD MUX ALT INPSE PATH PADCTRL */
>
> -#define MX51_PAD_GPIO_2_0__EIM_D16 IOMUX_PAD(0x3f0, 0x05c, 1, 0x0, 0, NO_PAD_CTRL)
> +#define MX51_PAD_EIM_D16__I2C1_SDA IOMUX_PAD(0x3f0, 0x05c, IOMUX_CONFIG_ALT4 | IOMUX_CONFIG_SION, 0x09b4, 0, MX51_I2C_PAD_CTRL)
> #define MX51_PAD_GPIO_2_1__EIM_D17 IOMUX_PAD(0x3f4, 0x060, 1, 0x0, 0, NO_PAD_CTRL)
> #define MX51_PAD_GPIO_2_2__EIM_D18 IOMUX_PAD(0x3f8, 0x064, 1, 0x0, 0, NO_PAD_CTRL)
> -#define MX51_PAD_GPIO_2_3__EIM_D19 IOMUX_PAD(0x3fc, 0x068, 1, 0x0, 0, NO_PAD_CTRL)
> +#define MX51_PAD_EIM_D19__I2C1_SCL IOMUX_PAD(0x3fc, 0x068, IOMUX_CONFIG_ALT4 | IOMUX_CONFIG_SION, 0x09b0, 0, MX51_I2C_PAD_CTRL)
> #define MX51_PAD_GPIO_2_4__EIM_D20 IOMUX_PAD(0x400, 0x06c, 1, 0x0, 0, NO_PAD_CTRL)
> #define MX51_PAD_GPIO_2_5__EIM_D21 IOMUX_PAD(0x404, 0x070, 1, 0x0, 0, NO_PAD_CTRL)
> #define MX51_PAD_GPIO_2_6__EIM_D22 IOMUX_PAD(0x408, 0x074, 1, 0x0, 0, NO_PAD_CTRL)
> @@ -172,8 +174,8 @@ typedef enum iomux_config {
> #define MX51_PAD_GPIO_4_14__CSI2_HSYNC IOMUX_PAD(0x5E0, 0x1F0, 3, 0x0, 0, NO_PAD_CTRL)
> #define MX51_PAD_GPIO_4_15__CSI2_PIXCLK IOMUX_PAD(0x5E4, 0x1F4, 3, 0x0, 0, NO_PAD_CTRL)
> #define MX51_PAD_CSI2_PKE0__CSI2_PKE0 IOMUX_PAD(0x81C, 0x0, 0, 0x0, 0, NO_PAD_CTRL)
> -#define MX51_PAD_GPIO_4_16__I2C1_CLK IOMUX_PAD(0x5E8, 0x1F8, 3, 0x0, 0, NO_PAD_CTRL)
> -#define MX51_PAD_GPIO_4_17__I2C1_DAT IOMUX_PAD(0x5EC, 0x1FC, 3, 0x0, 0, NO_PAD_CTRL)
> +#define MX51_PAD_I2C1_CLK__HSI2C_CLK IOMUX_PAD(0x5E8, 0x1F8, IOMUX_CONFIG_ALT0, 0x0, 0, NO_PAD_CTRL)
> +#define MX51_PAD_I2C1_DAT__HSI2C_DAT IOMUX_PAD(0x5EC, 0x1FC, IOMUX_CONFIG_ALT0, 0x0, 0, NO_PAD_CTRL)
> #define MX51_PAD_GPIO_4_18__AUD3_BB_TXD IOMUX_PAD(0x5F0, 0x200, 3, 0x0, 0, NO_PAD_CTRL)
> #define MX51_PAD_GPIO_4_19__AUD3_BB_RXD IOMUX_PAD(0x5F4, 0x204, 3, 0x0, 0, NO_PAD_CTRL)
> #define MX51_PAD_GPIO_4_20__AUD3_BB_CK IOMUX_PAD(0x5F8, 0x208, 3, 0x0, 0, NO_PAD_CTRL)
> @@ -206,8 +208,8 @@ typedef enum iomux_config {
> #define MX51_PAD_KEY_COL1__KEY_COL1 IOMUX_PAD(0x650, 0x260, 0, 0x0, 0, NO_PAD_CTRL)
> #define MX51_PAD_KEY_COL2__KEY_COL2 IOMUX_PAD(0x654, 0x264, 0, 0x0, 0, NO_PAD_CTRL)
> #define MX51_PAD_KEY_COL3__KEY_COL3 IOMUX_PAD(0x658, 0x268, 0, 0x0, 0, NO_PAD_CTRL)
> -#define MX51_PAD_KEY_COL4__KEY_COL4 IOMUX_PAD(0x65C, 0x26C, 0, 0x0, 0, NO_PAD_CTRL)
> -#define MX51_PAD_KEY_COL5__KEY_COL5 IOMUX_PAD(0x660, 0x270, 0, 0x0, 0, NO_PAD_CTRL)
> +#define MX51_PAD_KEY_COL4__I2C2_SCL IOMUX_PAD(0x65C, 0x26C, IOMUX_CONFIG_ALT3 | IOMUX_CONFIG_SION, 0x09b8, 1, MX51_I2C_PAD_CTRL)
> +#define MX51_PAD_KEY_COL5__I2C2_SDA IOMUX_PAD(0x660, 0x270, IOMUX_CONFIG_ALT3 | IOMUX_CONFIG_SION, 0x09bc, 1, MX51_I2C_PAD_CTRL)
> #define MX51_PAD_GPIO_1_25__USBH1_CLK IOMUX_PAD(0x678, 0x278, 2, 0x0, 0, NO_PAD_CTRL)
> #define MX51_PAD_GPIO_1_26__USBH1_DIR IOMUX_PAD(0x67C, 0x27C, 2, 0x0, 0, NO_PAD_CTRL)
> #define MX51_PAD_GPIO_1_27__USBH1_STP IOMUX_PAD(0x680, 0x280, 2, 0x0, 0, NO_PAD_CTRL)
> --
> 1.6.0.4
>
>
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists