[PATCH v4 2/2] i2c: npcm7xx: add i2c controller master mode only

2018-08-19 Thread Tali Perry


Nuvoton NPCM7XX I2C Controller
NPCM7xx includes 16 I2C controllers. This driver operates the controller.
This module also includes a slave mode, which will be submitted later on.

---
v4 -> v3:
- typo on cover letter.

v3 -> v2:
- fix dt binding: compatible name: omit "bus"

v2 -> v1:
- run check patch in strict mode.
- use linux crc.
- define regs in constant offset without base.
- remove debug prints.
- no declarations for local functions.

v1: initial version

Signed-off-by: Tali Perry 
Reviewed-by: Rob Herring 
---
 drivers/i2c/busses/Kconfig   |   11 +
 drivers/i2c/busses/Makefile  |1 +
 drivers/i2c/busses/i2c-npcm7xx.c | 2017 ++
 3 files changed, 2029 insertions(+)
 create mode 100644 drivers/i2c/busses/i2c-npcm7xx.c

diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig
index 4f8df2ec87b1..61862fed71fd 100644
--- a/drivers/i2c/busses/Kconfig
+++ b/drivers/i2c/busses/Kconfig
@@ -742,6 +742,17 @@ config I2C_NOMADIK
  I2C interface from ST-Ericsson's Nomadik and Ux500 architectures,
  as well as the STA2X11 PCIe I/O HUB.
 
+config I2C_NPCM7XX
+   tristate "Nuvoton I2C Controller"
+   depends on ARCH_NPCM7XX
+   select CRC8
+   help
+ If you say yes to this option, support will be included for the
+ Nuvoton I2C controller.
+
+ This driver can also be built as a module.  If so, the module
+ will be called i2c-npcm7xx.
+
 config I2C_OCORES
tristate "OpenCores I2C Controller"
help
diff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile
index 5a869144a0c5..80d4ec8908e1 100644
--- a/drivers/i2c/busses/Makefile
+++ b/drivers/i2c/busses/Makefile
@@ -74,6 +74,7 @@ obj-$(CONFIG_I2C_MT65XX)  += i2c-mt65xx.o
 obj-$(CONFIG_I2C_MV64XXX)  += i2c-mv64xxx.o
 obj-$(CONFIG_I2C_MXS)  += i2c-mxs.o
 obj-$(CONFIG_I2C_NOMADIK)  += i2c-nomadik.o
+obj-$(CONFIG_I2C_NPCM7XX)  += i2c-npcm7xx.o
 obj-$(CONFIG_I2C_OCORES)   += i2c-ocores.o
 obj-$(CONFIG_I2C_OMAP) += i2c-omap.o
 obj-$(CONFIG_I2C_PASEMI)   += i2c-pasemi.o
diff --git a/drivers/i2c/busses/i2c-npcm7xx.c b/drivers/i2c/busses/i2c-npcm7xx.c
new file mode 100644
index ..4dc766016031
--- /dev/null
+++ b/drivers/i2c/busses/i2c-npcm7xx.c
@@ -0,0 +1,2017 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Nuvoton NPCM7xx SMB Controller driver
+ *
+ * Copyright (C) 2018 Nuvoton Technologies tali.pe...@nuvoton.com
+ */
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define I2C_VERSION "0.0.3"
+
+enum smb_mode {
+   SMB_SLAVE = 1,
+   SMB_MASTER
+};
+
+/*
+ * External SMB Interface driver xfer indication values, which indicate status
+ * of the bus.
+ */
+enum smb_state_ind {
+   SMB_NO_STATUS_IND = 0,
+   SMB_SLAVE_RCV_IND = 1,
+   SMB_SLAVE_XMIT_IND = 2,
+   SMB_SLAVE_XMIT_MISSING_DATA_IND = 3,
+   SMB_SLAVE_RESTART_IND = 4,
+   SMB_SLAVE_DONE_IND = 5,
+   SMB_MASTER_DONE_IND = 6,
+   SMB_NO_DATA_IND = 7,
+   SMB_NACK_IND = 8,
+   SMB_BUS_ERR_IND = 9,
+   SMB_WAKE_UP_IND = 10,
+   SMB_MASTER_PEC_ERR_IND = 11,
+   SMB_BLOCK_BYTES_ERR_IND = 12,
+   SMB_SLAVE_PEC_ERR_IND = 13,
+   SMB_SLAVE_RCV_MISSING_DATA_IND = 14,
+};
+
+// SMBus Operation type values
+enum smb_oper {
+   SMB_NO_OPER = 0,
+   SMB_WRITE_OPER = 1,
+   SMB_READ_OPER = 2
+};
+
+// SMBus Bank (FIFO mode)
+enum smb_bank {
+   SMB_BANK_0 = 0,
+   SMB_BANK_1 = 1
+};
+
+// Internal SMB states values (for the SMB module state machine).
+enum smb_state {
+   SMB_DISABLE = 0,
+   SMB_IDLE,
+   SMB_MASTER_START,
+   SMB_SLAVE_MATCH,
+   SMB_OPER_STARTED,
+   SMB_REPEATED_START,
+   SMB_STOP_PENDING
+};
+
+// Module supports setting multiple own slave addresses:
+enum smb_addr {
+   SMB_SLAVE_ADDR1 = 0,
+   SMB_SLAVE_ADDR2,
+   SMB_SLAVE_ADDR3,
+   SMB_SLAVE_ADDR4,
+   SMB_SLAVE_ADDR5,
+   SMB_SLAVE_ADDR6,
+   SMB_SLAVE_ADDR7,
+   SMB_SLAVE_ADDR8,
+   SMB_SLAVE_ADDR9,
+   SMB_SLAVE_ADDR10,
+   SMB_GC_ADDR,
+   SMB_ARP_ADDR
+};
+
+// global regs
+static struct regmap *gcr_regmap;
+static struct regmap *clk_regmap;
+
+#define NPCM_I2CSEGCTL  0xE4
+#define NPCM_SECCNT0x68
+#define NPCM_CNTR25M   0x6C
+#define I2CSEGCTL_VAL  0x0333F000
+
+// Common regs
+#define NPCM_SMBSDA0x000
+#define NPCM_SMBST 0x002
+#define NPCM_SMBCST0x004
+#define NPCM_SMBCTL1   0x006
+#define NPCM_SMBADDR1  0x008
+#define NPCM_SMBCTL2   0x00A
+#define NPCM_SMBADDR2  0x00C
+#define NPCM_SMBCTL3   0x00E
+#define NPCM_SMBCST2   0x018
+#define NPCM_SMBCST3

[PATCH v4 2/2] i2c: npcm7xx: add i2c controller master mode only

2018-08-19 Thread Tali Perry


Nuvoton NPCM7XX I2C Controller
NPCM7xx includes 16 I2C controllers. This driver operates the controller.
This module also includes a slave mode, which will be submitted later on.

---
v4 -> v3:
- typo on cover letter.

v3 -> v2:
- fix dt binding: compatible name: omit "bus"

v2 -> v1:
- run check patch in strict mode.
- use linux crc.
- define regs in constant offset without base.
- remove debug prints.
- no declarations for local functions.

v1: initial version

Signed-off-by: Tali Perry 
Reviewed-by: Rob Herring 
---
 drivers/i2c/busses/Kconfig   |   11 +
 drivers/i2c/busses/Makefile  |1 +
 drivers/i2c/busses/i2c-npcm7xx.c | 2017 ++
 3 files changed, 2029 insertions(+)
 create mode 100644 drivers/i2c/busses/i2c-npcm7xx.c

diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig
index 4f8df2ec87b1..61862fed71fd 100644
--- a/drivers/i2c/busses/Kconfig
+++ b/drivers/i2c/busses/Kconfig
@@ -742,6 +742,17 @@ config I2C_NOMADIK
  I2C interface from ST-Ericsson's Nomadik and Ux500 architectures,
  as well as the STA2X11 PCIe I/O HUB.
 
+config I2C_NPCM7XX
+   tristate "Nuvoton I2C Controller"
+   depends on ARCH_NPCM7XX
+   select CRC8
+   help
+ If you say yes to this option, support will be included for the
+ Nuvoton I2C controller.
+
+ This driver can also be built as a module.  If so, the module
+ will be called i2c-npcm7xx.
+
 config I2C_OCORES
tristate "OpenCores I2C Controller"
help
diff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile
index 5a869144a0c5..80d4ec8908e1 100644
--- a/drivers/i2c/busses/Makefile
+++ b/drivers/i2c/busses/Makefile
@@ -74,6 +74,7 @@ obj-$(CONFIG_I2C_MT65XX)  += i2c-mt65xx.o
 obj-$(CONFIG_I2C_MV64XXX)  += i2c-mv64xxx.o
 obj-$(CONFIG_I2C_MXS)  += i2c-mxs.o
 obj-$(CONFIG_I2C_NOMADIK)  += i2c-nomadik.o
+obj-$(CONFIG_I2C_NPCM7XX)  += i2c-npcm7xx.o
 obj-$(CONFIG_I2C_OCORES)   += i2c-ocores.o
 obj-$(CONFIG_I2C_OMAP) += i2c-omap.o
 obj-$(CONFIG_I2C_PASEMI)   += i2c-pasemi.o
diff --git a/drivers/i2c/busses/i2c-npcm7xx.c b/drivers/i2c/busses/i2c-npcm7xx.c
new file mode 100644
index ..4dc766016031
--- /dev/null
+++ b/drivers/i2c/busses/i2c-npcm7xx.c
@@ -0,0 +1,2017 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Nuvoton NPCM7xx SMB Controller driver
+ *
+ * Copyright (C) 2018 Nuvoton Technologies tali.pe...@nuvoton.com
+ */
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define I2C_VERSION "0.0.3"
+
+enum smb_mode {
+   SMB_SLAVE = 1,
+   SMB_MASTER
+};
+
+/*
+ * External SMB Interface driver xfer indication values, which indicate status
+ * of the bus.
+ */
+enum smb_state_ind {
+   SMB_NO_STATUS_IND = 0,
+   SMB_SLAVE_RCV_IND = 1,
+   SMB_SLAVE_XMIT_IND = 2,
+   SMB_SLAVE_XMIT_MISSING_DATA_IND = 3,
+   SMB_SLAVE_RESTART_IND = 4,
+   SMB_SLAVE_DONE_IND = 5,
+   SMB_MASTER_DONE_IND = 6,
+   SMB_NO_DATA_IND = 7,
+   SMB_NACK_IND = 8,
+   SMB_BUS_ERR_IND = 9,
+   SMB_WAKE_UP_IND = 10,
+   SMB_MASTER_PEC_ERR_IND = 11,
+   SMB_BLOCK_BYTES_ERR_IND = 12,
+   SMB_SLAVE_PEC_ERR_IND = 13,
+   SMB_SLAVE_RCV_MISSING_DATA_IND = 14,
+};
+
+// SMBus Operation type values
+enum smb_oper {
+   SMB_NO_OPER = 0,
+   SMB_WRITE_OPER = 1,
+   SMB_READ_OPER = 2
+};
+
+// SMBus Bank (FIFO mode)
+enum smb_bank {
+   SMB_BANK_0 = 0,
+   SMB_BANK_1 = 1
+};
+
+// Internal SMB states values (for the SMB module state machine).
+enum smb_state {
+   SMB_DISABLE = 0,
+   SMB_IDLE,
+   SMB_MASTER_START,
+   SMB_SLAVE_MATCH,
+   SMB_OPER_STARTED,
+   SMB_REPEATED_START,
+   SMB_STOP_PENDING
+};
+
+// Module supports setting multiple own slave addresses:
+enum smb_addr {
+   SMB_SLAVE_ADDR1 = 0,
+   SMB_SLAVE_ADDR2,
+   SMB_SLAVE_ADDR3,
+   SMB_SLAVE_ADDR4,
+   SMB_SLAVE_ADDR5,
+   SMB_SLAVE_ADDR6,
+   SMB_SLAVE_ADDR7,
+   SMB_SLAVE_ADDR8,
+   SMB_SLAVE_ADDR9,
+   SMB_SLAVE_ADDR10,
+   SMB_GC_ADDR,
+   SMB_ARP_ADDR
+};
+
+// global regs
+static struct regmap *gcr_regmap;
+static struct regmap *clk_regmap;
+
+#define NPCM_I2CSEGCTL  0xE4
+#define NPCM_SECCNT0x68
+#define NPCM_CNTR25M   0x6C
+#define I2CSEGCTL_VAL  0x0333F000
+
+// Common regs
+#define NPCM_SMBSDA0x000
+#define NPCM_SMBST 0x002
+#define NPCM_SMBCST0x004
+#define NPCM_SMBCTL1   0x006
+#define NPCM_SMBADDR1  0x008
+#define NPCM_SMBCTL2   0x00A
+#define NPCM_SMBADDR2  0x00C
+#define NPCM_SMBCTL3   0x00E
+#define NPCM_SMBCST2   0x018
+#define NPCM_SMBCST3