| From ba27a37aafaa504af71b55afed614504f61e5eaf Mon Sep 17 00:00:00 2001 |
| From: Jingchang Lu <b35083@freescale.com> |
| Date: Wed, 7 Aug 2013 17:05:43 +0800 |
| Subject: i2c: imx: Add Vybrid VF610 I2C controller support |
| |
| Add Freescale Vybrid VF610 I2C controller support to |
| imx I2C driver framework. |
| |
| Signed-off-by: Jason Jin <Jason.jin@freescale.com> |
| Signed-off-by: Jingchang Lu <b35083@freescale.com> |
| Reviewed-by: Sascha Hauer <s.hauer@pengutronix.de> |
| Signed-off-by: Wolfram Sang <wsa@the-dreams.de> |
| (cherry picked from commit ad90efae1b9203baeb0f6fd668e6c61c2377bd5f) |
| Signed-off-by: Darren Hart <dvhart@linux.intel.com> |
| --- |
| drivers/i2c/busses/i2c-imx.c | 32 ++++++++++++++++++++++++++++++++ |
| 1 file changed, 32 insertions(+) |
| |
| diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c |
| index ce31196bb5e7..9c0f8bda692a 100644 |
| --- a/drivers/i2c/busses/i2c-imx.c |
| +++ b/drivers/i2c/busses/i2c-imx.c |
| @@ -79,6 +79,7 @@ |
| #define IMX_I2C_I2DR 0x04 /* i2c transfer data */ |
| |
| #define IMX_I2C_REGSHIFT 2 |
| +#define VF610_I2C_REGSHIFT 0 |
| |
| /* Bits of IMX I2C registers */ |
| #define I2SR_RXAK 0x01 |
| @@ -140,9 +141,29 @@ static struct imx_i2c_clk_pair imx_i2c_clk_div[] = { |
| { 3072, 0x1E }, { 3840, 0x1F } |
| }; |
| |
| +/* Vybrid VF610 clock divider, register value pairs */ |
| +static struct imx_i2c_clk_pair vf610_i2c_clk_div[] = { |
| + { 20, 0x00 }, { 22, 0x01 }, { 24, 0x02 }, { 26, 0x03 }, |
| + { 28, 0x04 }, { 30, 0x05 }, { 32, 0x09 }, { 34, 0x06 }, |
| + { 36, 0x0A }, { 40, 0x07 }, { 44, 0x0C }, { 48, 0x0D }, |
| + { 52, 0x43 }, { 56, 0x0E }, { 60, 0x45 }, { 64, 0x12 }, |
| + { 68, 0x0F }, { 72, 0x13 }, { 80, 0x14 }, { 88, 0x15 }, |
| + { 96, 0x19 }, { 104, 0x16 }, { 112, 0x1A }, { 128, 0x17 }, |
| + { 136, 0x4F }, { 144, 0x1C }, { 160, 0x1D }, { 176, 0x55 }, |
| + { 192, 0x1E }, { 208, 0x56 }, { 224, 0x22 }, { 228, 0x24 }, |
| + { 240, 0x1F }, { 256, 0x23 }, { 288, 0x5C }, { 320, 0x25 }, |
| + { 384, 0x26 }, { 448, 0x2A }, { 480, 0x27 }, { 512, 0x2B }, |
| + { 576, 0x2C }, { 640, 0x2D }, { 768, 0x31 }, { 896, 0x32 }, |
| + { 960, 0x2F }, { 1024, 0x33 }, { 1152, 0x34 }, { 1280, 0x35 }, |
| + { 1536, 0x36 }, { 1792, 0x3A }, { 1920, 0x37 }, { 2048, 0x3B }, |
| + { 2304, 0x3C }, { 2560, 0x3D }, { 3072, 0x3E }, { 3584, 0x7A }, |
| + { 3840, 0x3F }, { 4096, 0x7B }, { 5120, 0x7D }, { 6144, 0x7E }, |
| +}; |
| + |
| enum imx_i2c_type { |
| IMX1_I2C, |
| IMX21_I2C, |
| + VF610_I2C, |
| }; |
| |
| struct imx_i2c_hwdata { |
| @@ -186,6 +207,16 @@ static const struct imx_i2c_hwdata imx21_i2c_hwdata = { |
| |
| }; |
| |
| +static struct imx_i2c_hwdata vf610_i2c_hwdata = { |
| + .devtype = VF610_I2C, |
| + .regshift = VF610_I2C_REGSHIFT, |
| + .clk_div = vf610_i2c_clk_div, |
| + .ndivs = ARRAY_SIZE(vf610_i2c_clk_div), |
| + .i2sr_clr_opcode = I2SR_CLR_OPCODE_W1C, |
| + .i2cr_ien_opcode = I2CR_IEN_OPCODE_0, |
| + |
| +}; |
| + |
| static struct platform_device_id imx_i2c_devtype[] = { |
| { |
| .name = "imx1-i2c", |
| @@ -202,6 +233,7 @@ MODULE_DEVICE_TABLE(platform, imx_i2c_devtype); |
| static const struct of_device_id i2c_imx_dt_ids[] = { |
| { .compatible = "fsl,imx1-i2c", .data = &imx1_i2c_hwdata, }, |
| { .compatible = "fsl,imx21-i2c", .data = &imx21_i2c_hwdata, }, |
| + { .compatible = "fsl,vf610-i2c", .data = &vf610_i2c_hwdata, }, |
| { /* sentinel */ } |
| }; |
| MODULE_DEVICE_TABLE(of, i2c_imx_dt_ids); |
| -- |
| 1.8.5.rc3 |
| |