Re: [PATCH v5 2/3] i2c: hix5hd2: add i2c controller driver

2014-10-07 Thread Wolfram Sang
On Tue, Oct 07, 2014 at 09:04:12AM +0800, Zhangfei Gao wrote:
 From: Wei Yan sledge.yan...@huawei.com
 
 I2C drivers for hix5hd2 soc series, including following chipset
 Hi3716CV200, Hi3719CV100, Hi3718CV100, Hi3719MV100, Hi3718MV100.
 
 Signed-off-by: Wei Yan sledge.yan...@huawei.com
 Signed-off-by: Zhangfei Gao zhangfei@linaro.org

Applied to for-next, thanks!



signature.asc
Description: Digital signature


[PATCH v5 2/3] i2c: hix5hd2: add i2c controller driver

2014-10-06 Thread Zhangfei Gao
From: Wei Yan sledge.yan...@huawei.com

I2C drivers for hix5hd2 soc series, including following chipset
Hi3716CV200, Hi3719CV100, Hi3718CV100, Hi3719MV100, Hi3718MV100.

Signed-off-by: Wei Yan sledge.yan...@huawei.com
Signed-off-by: Zhangfei Gao zhangfei@linaro.org
---
 drivers/i2c/busses/Kconfig   |   10 +
 drivers/i2c/busses/Makefile  |1 +
 drivers/i2c/busses/i2c-hix5hd2.c |  557 ++
 3 files changed, 568 insertions(+)
 create mode 100644 drivers/i2c/busses/i2c-hix5hd2.c

diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig
index 2ac87fa..ba0f43c 100644
--- a/drivers/i2c/busses/Kconfig
+++ b/drivers/i2c/busses/Kconfig
@@ -77,6 +77,16 @@ config I2C_AMD8111
  This driver can also be built as a module.  If so, the module
  will be called i2c-amd8111.
 
+config I2C_HIX5HD2
+   tristate Hix5hd2 high-speed I2C driver
+   depends on ARCH_HIX5HD2
+   help
+ Say Y here to include support for high-speed I2C controller in the
+ Hisilicon based hix5hd2 SoCs.
+
+ This driver can also be built as a module.  If so, the module
+ will be called i2c-hix5hd2.
+
 config I2C_I801
tristate Intel 82801 (ICH/PCH)
depends on PCI
diff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile
index 49bf07e..9739938 100644
--- a/drivers/i2c/busses/Makefile
+++ b/drivers/i2c/busses/Makefile
@@ -47,6 +47,7 @@ obj-$(CONFIG_I2C_EG20T)   += i2c-eg20t.o
 obj-$(CONFIG_I2C_EXYNOS5)  += i2c-exynos5.o
 obj-$(CONFIG_I2C_GPIO) += i2c-gpio.o
 obj-$(CONFIG_I2C_HIGHLANDER)   += i2c-highlander.o
+obj-$(CONFIG_I2C_HIX5HD2)  += i2c-hix5hd2.o
 obj-$(CONFIG_I2C_IBM_IIC)  += i2c-ibm_iic.o
 obj-$(CONFIG_I2C_IMX)  += i2c-imx.o
 obj-$(CONFIG_I2C_IOP3XX)   += i2c-iop3xx.o
diff --git a/drivers/i2c/busses/i2c-hix5hd2.c b/drivers/i2c/busses/i2c-hix5hd2.c
new file mode 100644
index 000..9490d0f
--- /dev/null
+++ b/drivers/i2c/busses/i2c-hix5hd2.c
@@ -0,0 +1,557 @@
+/*
+ * Copyright (c) 2014 Linaro Ltd.
+ * Copyright (c) 2014 Hisilicon Limited.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Now only support 7 bit address.
+ */
+
+#include linux/clk.h
+#include linux/delay.h
+#include linux/i2c.h
+#include linux/io.h
+#include linux/interrupt.h
+#include linux/module.h
+#include linux/of.h
+#include linux/platform_device.h
+#include linux/pm_runtime.h
+
+/* Register Map */
+#define HIX5I2C_CTRL   0x00
+#define HIX5I2C_COM0x04
+#define HIX5I2C_ICR0x08
+#define HIX5I2C_SR 0x0c
+#define HIX5I2C_SCL_H  0x10
+#define HIX5I2C_SCL_L  0x14
+#define HIX5I2C_TXR0x18
+#define HIX5I2C_RXR0x1c
+
+/* I2C_CTRL_REG */
+#define I2C_ENABLE BIT(8)
+#define I2C_UNMASK_TOTAL   BIT(7)
+#define I2C_UNMASK_START   BIT(6)
+#define I2C_UNMASK_END BIT(5)
+#define I2C_UNMASK_SENDBIT(4)
+#define I2C_UNMASK_RECEIVE BIT(3)
+#define I2C_UNMASK_ACK BIT(2)
+#define I2C_UNMASK_ARBITRATE   BIT(1)
+#define I2C_UNMASK_OVERBIT(0)
+#define I2C_UNMASK_ALL (I2C_UNMASK_ACK | I2C_UNMASK_OVER)
+
+/* I2C_COM_REG */
+#define I2C_NO_ACK BIT(4)
+#define I2C_START  BIT(3)
+#define I2C_READ   BIT(2)
+#define I2C_WRITE  BIT(1)
+#define I2C_STOP   BIT(0)
+
+/* I2C_ICR_REG */
+#define I2C_CLEAR_STARTBIT(6)
+#define I2C_CLEAR_END  BIT(5)
+#define I2C_CLEAR_SEND BIT(4)
+#define I2C_CLEAR_RECEIVE  BIT(3)
+#define I2C_CLEAR_ACK  BIT(2)
+#define I2C_CLEAR_ARBITRATEBIT(1)
+#define I2C_CLEAR_OVER BIT(0)
+#define I2C_CLEAR_ALL  (I2C_CLEAR_START | I2C_CLEAR_END | \
+   I2C_CLEAR_SEND | I2C_CLEAR_RECEIVE | \
+   I2C_CLEAR_ACK | I2C_CLEAR_ARBITRATE | \
+   I2C_CLEAR_OVER)
+
+/* I2C_SR_REG */
+#define I2C_BUSY   BIT(7)
+#define I2C_START_INTR BIT(6)
+#define I2C_END_INTR   BIT(5)
+#define I2C_SEND_INTR  BIT(4)
+#define I2C_RECEIVE_INTR   BIT(3)
+#define I2C_ACK_INTR   BIT(2)
+#define I2C_ARBITRATE_INTR BIT(1)
+#define I2C_OVER_INTR  BIT(0)
+
+#define HIX5I2C_MAX_FREQ   40  /* 400k */
+#define HIX5I2C_READ_OPERATION 0x01
+
+enum hix5hd2_i2c_state {
+   HIX5I2C_STAT_RW_ERR = -1,
+   HIX5I2C_STAT_INIT,
+   HIX5I2C_STAT_RW,
+   HIX5I2C_STAT_SND_STOP,
+   HIX5I2C_STAT_RW_SUCCESS,
+};
+
+struct hix5hd2_i2c_priv {
+   struct i2c_adapter adap;
+   struct i2c_msg *msg;
+   struct completion msg_complete;
+   unsigned int msg_idx;
+   unsigned