[RESEND PATCH] include: Add lantiq.h in include/linux/

2018-11-21 Thread Songjun Wu
In some existing lantiq driver, the C codes include lantiq_soc.h
header file directly.

./arch/mips/include/asm/mach-lantiq/falcon/lantiq_soc.h
./arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h

Those drivers need to be extended to support more platform.
lantiq.h is added in include/linux/ to make it
globally available and provides some wrapper codes.

Signed-off-by: Songjun Wu 
---

 include/linux/lantiq.h | 23 +++
 1 file changed, 23 insertions(+)
 create mode 100644 include/linux/lantiq.h

diff --git a/include/linux/lantiq.h b/include/linux/lantiq.h
new file mode 100644
index ..67921169d84d
--- /dev/null
+++ b/include/linux/lantiq.h
@@ -0,0 +1,23 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef __LINUX_LANTIQ_H
+#define __LINUX_LANTIQ_H
+
+#ifdef CONFIG_LANTIQ
+#include 
+#else
+
+#ifndef LTQ_EARLY_ASC
+#define LTQ_EARLY_ASC 0
+#endif
+
+#ifndef CPHYSADDR
+#define CPHYSADDR(a) 0
+#endif
+
+static inline struct clk *clk_get_fpi(void)
+{
+   return NULL;
+}
+#endif /* CONFIG_LANTIQ */
+#endif /* __LINUX_LANTIQ_H */
-- 
2.11.0



[RESEND PATCH] include: Add lantiq.h in include/linux/

2018-11-21 Thread Songjun Wu
In some existing lantiq driver, the C codes include lantiq_soc.h
header file directly.

./arch/mips/include/asm/mach-lantiq/falcon/lantiq_soc.h
./arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h

Those drivers need to be extended to support more platform.
lantiq.h is added in include/linux/ to make it
globally available and provides some wrapper codes.

Signed-off-by: Songjun Wu 
---

 include/linux/lantiq.h | 23 +++
 1 file changed, 23 insertions(+)
 create mode 100644 include/linux/lantiq.h

diff --git a/include/linux/lantiq.h b/include/linux/lantiq.h
new file mode 100644
index ..67921169d84d
--- /dev/null
+++ b/include/linux/lantiq.h
@@ -0,0 +1,23 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef __LINUX_LANTIQ_H
+#define __LINUX_LANTIQ_H
+
+#ifdef CONFIG_LANTIQ
+#include 
+#else
+
+#ifndef LTQ_EARLY_ASC
+#define LTQ_EARLY_ASC 0
+#endif
+
+#ifndef CPHYSADDR
+#define CPHYSADDR(a) 0
+#endif
+
+static inline struct clk *clk_get_fpi(void)
+{
+   return NULL;
+}
+#endif /* CONFIG_LANTIQ */
+#endif /* __LINUX_LANTIQ_H */
-- 
2.11.0



[RESEND PATCH 06/14] serial: lantiq: Use readl/writel instead of ltq_r32/ltq_w32

2018-10-16 Thread Songjun Wu
Previous implementation uses platform-dependent functions
ltq_w32()/ltq_r32() to access registers. Those functions are not
available for other SoC which uses the same IP.
Change to OS provided readl()/writel() and readb()/writeb(), so
that different SoCs can use the same driver.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 38 +++---
 1 file changed, 19 insertions(+), 19 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 4c14608b8ef8..e351f80996d3 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -145,7 +145,7 @@ lqasc_start_tx(struct uart_port *port)
 static void
 lqasc_stop_rx(struct uart_port *port)
 {
-   ltq_w32(ASCWHBSTATE_CLRREN, port->membase + LTQ_ASC_WHBSTATE);
+   writel(ASCWHBSTATE_CLRREN, port->membase + LTQ_ASC_WHBSTATE);
 }
 
 static int
@@ -154,11 +154,11 @@ lqasc_rx_chars(struct uart_port *port)
struct tty_port *tport = >state->port;
unsigned int ch = 0, rsr = 0, fifocnt;
 
-   fifocnt = ltq_r32(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_RXFFLMASK;
+   fifocnt = readl(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_RXFFLMASK;
while (fifocnt--) {
u8 flag = TTY_NORMAL;
-   ch = ltq_r8(port->membase + LTQ_ASC_RBUF);
-   rsr = (ltq_r32(port->membase + LTQ_ASC_STATE)
+   ch = readb(port->membase + LTQ_ASC_RBUF);
+   rsr = (readl(port->membase + LTQ_ASC_STATE)
& ASCSTATE_ANY) | UART_DUMMY_UER_RX;
tty_flip_buffer_push(tport);
port->icount.rx++;
@@ -218,10 +218,10 @@ lqasc_tx_chars(struct uart_port *port)
return;
}
 
-   while (((ltq_r32(port->membase + LTQ_ASC_FSTAT) &
+   while (((readl(port->membase + LTQ_ASC_FSTAT) &
ASCFSTAT_TXFREEMASK) >> ASCFSTAT_TXFREEOFF) != 0) {
if (port->x_char) {
-   ltq_w8(port->x_char, port->membase + LTQ_ASC_TBUF);
+   writeb(port->x_char, port->membase + LTQ_ASC_TBUF);
port->icount.tx++;
port->x_char = 0;
continue;
@@ -230,7 +230,7 @@ lqasc_tx_chars(struct uart_port *port)
if (uart_circ_empty(xmit))
break;
 
-   ltq_w8(port->state->xmit.buf[port->state->xmit.tail],
+   writeb(port->state->xmit.buf[port->state->xmit.tail],
port->membase + LTQ_ASC_TBUF);
xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
port->icount.tx++;
@@ -246,7 +246,7 @@ lqasc_tx_int(int irq, void *_port)
unsigned long flags;
struct uart_port *port = (struct uart_port *)_port;
spin_lock_irqsave(_asc_lock, flags);
-   ltq_w32(ASC_IRNCR_TIR, port->membase + LTQ_ASC_IRNCR);
+   writel(ASC_IRNCR_TIR, port->membase + LTQ_ASC_IRNCR);
spin_unlock_irqrestore(_asc_lock, flags);
lqasc_start_tx(port);
return IRQ_HANDLED;
@@ -271,7 +271,7 @@ lqasc_rx_int(int irq, void *_port)
unsigned long flags;
struct uart_port *port = (struct uart_port *)_port;
spin_lock_irqsave(_asc_lock, flags);
-   ltq_w32(ASC_IRNCR_RIR, port->membase + LTQ_ASC_IRNCR);
+   writel(ASC_IRNCR_RIR, port->membase + LTQ_ASC_IRNCR);
lqasc_rx_chars(port);
spin_unlock_irqrestore(_asc_lock, flags);
return IRQ_HANDLED;
@@ -281,7 +281,7 @@ static unsigned int
 lqasc_tx_empty(struct uart_port *port)
 {
int status;
-   status = ltq_r32(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_TXFFLMASK;
+   status = readl(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_TXFFLMASK;
return status ? 0 : TIOCSER_TEMT;
 }
 
@@ -314,12 +314,12 @@ lqasc_startup(struct uart_port *port)
asc_update_bits(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
port->membase + LTQ_ASC_CLC);
 
-   ltq_w32(0, port->membase + LTQ_ASC_PISEL);
-   ltq_w32(
+   writel(0, port->membase + LTQ_ASC_PISEL);
+   writel(
((TXFIFO_FL << ASCTXFCON_TXFITLOFF) & ASCTXFCON_TXFITLMASK) |
ASCTXFCON_TXFEN | ASCTXFCON_TXFFLU,
port->membase + LTQ_ASC_TXFCON);
-   ltq_w32(
+   writel(
((RXFIFO_FL << ASCRXFCON_RXFITLOFF) & ASCRXFCON_RXFITLMASK)
| ASCRXFCON_RXFEN | ASCRXFCON_RXFFLU,
port->membase + LTQ_ASC_RXFCON);
@@ -351,7 +351,7 @@ lqasc_startup(struct uart_port *port)
goto err2;
}
 
-   ltq_w32(ASC_IRNREN_RX | ASC_IRNREN_ERR | ASC_IRNREN_TX,
+   writel(ASC_IRNREN_RX | ASC_IRNREN_ERR | ASC_IRNREN_TX,
port->membase + LTQ_ASC_IR

[RESEND PATCH 06/14] serial: lantiq: Use readl/writel instead of ltq_r32/ltq_w32

2018-10-16 Thread Songjun Wu
Previous implementation uses platform-dependent functions
ltq_w32()/ltq_r32() to access registers. Those functions are not
available for other SoC which uses the same IP.
Change to OS provided readl()/writel() and readb()/writeb(), so
that different SoCs can use the same driver.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 38 +++---
 1 file changed, 19 insertions(+), 19 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 4c14608b8ef8..e351f80996d3 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -145,7 +145,7 @@ lqasc_start_tx(struct uart_port *port)
 static void
 lqasc_stop_rx(struct uart_port *port)
 {
-   ltq_w32(ASCWHBSTATE_CLRREN, port->membase + LTQ_ASC_WHBSTATE);
+   writel(ASCWHBSTATE_CLRREN, port->membase + LTQ_ASC_WHBSTATE);
 }
 
 static int
@@ -154,11 +154,11 @@ lqasc_rx_chars(struct uart_port *port)
struct tty_port *tport = >state->port;
unsigned int ch = 0, rsr = 0, fifocnt;
 
-   fifocnt = ltq_r32(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_RXFFLMASK;
+   fifocnt = readl(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_RXFFLMASK;
while (fifocnt--) {
u8 flag = TTY_NORMAL;
-   ch = ltq_r8(port->membase + LTQ_ASC_RBUF);
-   rsr = (ltq_r32(port->membase + LTQ_ASC_STATE)
+   ch = readb(port->membase + LTQ_ASC_RBUF);
+   rsr = (readl(port->membase + LTQ_ASC_STATE)
& ASCSTATE_ANY) | UART_DUMMY_UER_RX;
tty_flip_buffer_push(tport);
port->icount.rx++;
@@ -218,10 +218,10 @@ lqasc_tx_chars(struct uart_port *port)
return;
}
 
-   while (((ltq_r32(port->membase + LTQ_ASC_FSTAT) &
+   while (((readl(port->membase + LTQ_ASC_FSTAT) &
ASCFSTAT_TXFREEMASK) >> ASCFSTAT_TXFREEOFF) != 0) {
if (port->x_char) {
-   ltq_w8(port->x_char, port->membase + LTQ_ASC_TBUF);
+   writeb(port->x_char, port->membase + LTQ_ASC_TBUF);
port->icount.tx++;
port->x_char = 0;
continue;
@@ -230,7 +230,7 @@ lqasc_tx_chars(struct uart_port *port)
if (uart_circ_empty(xmit))
break;
 
-   ltq_w8(port->state->xmit.buf[port->state->xmit.tail],
+   writeb(port->state->xmit.buf[port->state->xmit.tail],
port->membase + LTQ_ASC_TBUF);
xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
port->icount.tx++;
@@ -246,7 +246,7 @@ lqasc_tx_int(int irq, void *_port)
unsigned long flags;
struct uart_port *port = (struct uart_port *)_port;
spin_lock_irqsave(_asc_lock, flags);
-   ltq_w32(ASC_IRNCR_TIR, port->membase + LTQ_ASC_IRNCR);
+   writel(ASC_IRNCR_TIR, port->membase + LTQ_ASC_IRNCR);
spin_unlock_irqrestore(_asc_lock, flags);
lqasc_start_tx(port);
return IRQ_HANDLED;
@@ -271,7 +271,7 @@ lqasc_rx_int(int irq, void *_port)
unsigned long flags;
struct uart_port *port = (struct uart_port *)_port;
spin_lock_irqsave(_asc_lock, flags);
-   ltq_w32(ASC_IRNCR_RIR, port->membase + LTQ_ASC_IRNCR);
+   writel(ASC_IRNCR_RIR, port->membase + LTQ_ASC_IRNCR);
lqasc_rx_chars(port);
spin_unlock_irqrestore(_asc_lock, flags);
return IRQ_HANDLED;
@@ -281,7 +281,7 @@ static unsigned int
 lqasc_tx_empty(struct uart_port *port)
 {
int status;
-   status = ltq_r32(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_TXFFLMASK;
+   status = readl(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_TXFFLMASK;
return status ? 0 : TIOCSER_TEMT;
 }
 
@@ -314,12 +314,12 @@ lqasc_startup(struct uart_port *port)
asc_update_bits(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
port->membase + LTQ_ASC_CLC);
 
-   ltq_w32(0, port->membase + LTQ_ASC_PISEL);
-   ltq_w32(
+   writel(0, port->membase + LTQ_ASC_PISEL);
+   writel(
((TXFIFO_FL << ASCTXFCON_TXFITLOFF) & ASCTXFCON_TXFITLMASK) |
ASCTXFCON_TXFEN | ASCTXFCON_TXFFLU,
port->membase + LTQ_ASC_TXFCON);
-   ltq_w32(
+   writel(
((RXFIFO_FL << ASCRXFCON_RXFITLOFF) & ASCRXFCON_RXFITLMASK)
| ASCRXFCON_RXFEN | ASCRXFCON_RXFFLU,
port->membase + LTQ_ASC_RXFCON);
@@ -351,7 +351,7 @@ lqasc_startup(struct uart_port *port)
goto err2;
}
 
-   ltq_w32(ASC_IRNREN_RX | ASC_IRNREN_ERR | ASC_IRNREN_TX,
+   writel(ASC_IRNREN_RX | ASC_IRNREN_ERR | ASC_IRNREN_TX,
port->membase + LTQ_ASC_IR

[RESEND PATCH 13/14] serial: lantiq: Change init_lqasc to static declaration

2018-10-16 Thread Songjun Wu
init_lqasc() is only used internally, change to static declaration.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index ba0c70b16bda..e052b69ceb98 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -784,7 +784,7 @@ static struct platform_driver lqasc_driver = {
},
 };
 
-int __init
+static int __init
 init_lqasc(void)
 {
int ret;
-- 
2.11.0



[RESEND PATCH 12/14] serial: lantiq: Replace lantiq_soc.h with lantiq.h

2018-10-16 Thread Songjun Wu
In this existing lantiq serial driver,
lantiq_soc.h is defined in the arch directory,

./arch/mips/include/asm/mach-lantiq/falcon/lantiq_soc.h
./arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h

This driver need to be extended to support more platform,
lantiq.h is added in include/linux/ to make it
globally available and provide some wrapper code.
Use lantiq.h to make the driver can find the correct
header file.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index c983694ba24d..ba0c70b16bda 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -15,6 +15,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -25,8 +26,6 @@
 #include 
 #include 
 
-#include 
-
 #define PORT_LTQ_ASC   111
 #define MAXPORTS   2
 #define UART_DUMMY_UER_RX  1
-- 
2.11.0



[RESEND PATCH 13/14] serial: lantiq: Change init_lqasc to static declaration

2018-10-16 Thread Songjun Wu
init_lqasc() is only used internally, change to static declaration.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index ba0c70b16bda..e052b69ceb98 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -784,7 +784,7 @@ static struct platform_driver lqasc_driver = {
},
 };
 
-int __init
+static int __init
 init_lqasc(void)
 {
int ret;
-- 
2.11.0



[RESEND PATCH 12/14] serial: lantiq: Replace lantiq_soc.h with lantiq.h

2018-10-16 Thread Songjun Wu
In this existing lantiq serial driver,
lantiq_soc.h is defined in the arch directory,

./arch/mips/include/asm/mach-lantiq/falcon/lantiq_soc.h
./arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h

This driver need to be extended to support more platform,
lantiq.h is added in include/linux/ to make it
globally available and provide some wrapper code.
Use lantiq.h to make the driver can find the correct
header file.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index c983694ba24d..ba0c70b16bda 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -15,6 +15,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -25,8 +26,6 @@
 #include 
 #include 
 
-#include 
-
 #define PORT_LTQ_ASC   111
 #define MAXPORTS   2
 #define UART_DUMMY_UER_RX  1
-- 
2.11.0



[RESEND PATCH 11/14] include: Add lantiq.h in include/linux/

2018-10-16 Thread Songjun Wu
In some existing lantiq driver, the C codes include lantiq_soc.h
header file directly.

./arch/mips/include/asm/mach-lantiq/falcon/lantiq_soc.h
./arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h

Those drivers need to be extended to support more platform.
lantiq.h is added in include/linux/ to make it
globally available and provides some wrapper codes.

Signed-off-by: Songjun Wu 
---

 include/linux/lantiq.h | 23 +++
 1 file changed, 23 insertions(+)
 create mode 100644 include/linux/lantiq.h

diff --git a/include/linux/lantiq.h b/include/linux/lantiq.h
new file mode 100644
index ..67921169d84d
--- /dev/null
+++ b/include/linux/lantiq.h
@@ -0,0 +1,23 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef __LINUX_LANTIQ_H
+#define __LINUX_LANTIQ_H
+
+#ifdef CONFIG_LANTIQ
+#include 
+#else
+
+#ifndef LTQ_EARLY_ASC
+#define LTQ_EARLY_ASC 0
+#endif
+
+#ifndef CPHYSADDR
+#define CPHYSADDR(a) 0
+#endif
+
+static inline struct clk *clk_get_fpi(void)
+{
+   return NULL;
+}
+#endif /* CONFIG_LANTIQ */
+#endif /* __LINUX_LANTIQ_H */
-- 
2.11.0



[RESEND PATCH 07/14] serial: lantiq: Rename fpiclk to freqclk

2018-10-16 Thread Songjun Wu
fpiclk is platform specific, freqclk is more generic.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 10 +-
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index e351f80996d3..4acdbdf8fe7a 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -105,7 +105,7 @@ static DEFINE_SPINLOCK(ltq_asc_lock);
 struct ltq_uart_port {
struct uart_portport;
/* clock used to derive divider */
-   struct clk  *fpiclk;
+   struct clk  *freqclk;
/* clock gating of the ASC core */
struct clk  *clk;
unsigned inttx_irq;
@@ -309,7 +309,7 @@ lqasc_startup(struct uart_port *port)
 
if (!IS_ERR(ltq_port->clk))
clk_enable(ltq_port->clk);
-   port->uartclk = clk_get_rate(ltq_port->fpiclk);
+   port->uartclk = clk_get_rate(ltq_port->freqclk);
 
asc_update_bits(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
port->membase + LTQ_ASC_CLC);
@@ -632,7 +632,7 @@ lqasc_console_setup(struct console *co, char *options)
if (!IS_ERR(ltq_port->clk))
clk_enable(ltq_port->clk);
 
-   port->uartclk = clk_get_rate(ltq_port->fpiclk);
+   port->uartclk = clk_get_rate(ltq_port->freqclk);
 
if (options)
uart_parse_options(options, , , , );
@@ -744,8 +744,8 @@ lqasc_probe(struct platform_device *pdev)
port->irq   = irqres[0].start;
port->mapbase   = mmres->start;
 
-   ltq_port->fpiclk = clk_get_fpi();
-   if (IS_ERR(ltq_port->fpiclk)) {
+   ltq_port->freqclk = clk_get_fpi();
+   if (IS_ERR(ltq_port->freqclk)) {
pr_err("failed to get fpi clk\n");
return -ENOENT;
}
-- 
2.11.0



[RESEND PATCH 09/14] serial: lantiq: Add CCF support

2018-10-16 Thread Songjun Wu
Previous implementation uses platform-dependent API to get the clock.
Those functions are not available for other SoC which uses the same IP.
The CCF (Common Clock Framework) have an abstraction based APIs for
clock. In future, the platform specific code will be removed when the
legacy soc use CCF as well.
Change to use CCF APIs to get clock and rate. So that different SoCs
can use the same driver.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 12 ++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 34b1ef3c12ce..88210de00f35 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -744,14 +744,22 @@ lqasc_probe(struct platform_device *pdev)
port->irq   = irqres[0].start;
port->mapbase   = mmres->start;
 
-   ltq_port->freqclk = clk_get_fpi();
+   if (IS_ENABLED(CONFIG_LANTIQ) && !IS_ENABLED(CONFIG_COMMON_CLK))
+   ltq_port->freqclk = clk_get_fpi();
+   else
+   ltq_port->freqclk = devm_clk_get(>dev, "freq");
+
+
if (IS_ERR(ltq_port->freqclk)) {
pr_err("failed to get fpi clk\n");
return -ENOENT;
}
 
/* not all asc ports have clock gates, lets ignore the return code */
-   ltq_port->clk = clk_get(>dev, NULL);
+   if (IS_ENABLED(CONFIG_LANTIQ) && !IS_ENABLED(CONFIG_COMMON_CLK))
+   ltq_port->clk = clk_get(>dev, NULL);
+   else
+   ltq_port->clk = devm_clk_get(>dev, "asc");
 
ltq_port->tx_irq = irqres[0].start;
ltq_port->rx_irq = irqres[1].start;
-- 
2.11.0



[RESEND PATCH 11/14] include: Add lantiq.h in include/linux/

2018-10-16 Thread Songjun Wu
In some existing lantiq driver, the C codes include lantiq_soc.h
header file directly.

./arch/mips/include/asm/mach-lantiq/falcon/lantiq_soc.h
./arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h

Those drivers need to be extended to support more platform.
lantiq.h is added in include/linux/ to make it
globally available and provides some wrapper codes.

Signed-off-by: Songjun Wu 
---

 include/linux/lantiq.h | 23 +++
 1 file changed, 23 insertions(+)
 create mode 100644 include/linux/lantiq.h

diff --git a/include/linux/lantiq.h b/include/linux/lantiq.h
new file mode 100644
index ..67921169d84d
--- /dev/null
+++ b/include/linux/lantiq.h
@@ -0,0 +1,23 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef __LINUX_LANTIQ_H
+#define __LINUX_LANTIQ_H
+
+#ifdef CONFIG_LANTIQ
+#include 
+#else
+
+#ifndef LTQ_EARLY_ASC
+#define LTQ_EARLY_ASC 0
+#endif
+
+#ifndef CPHYSADDR
+#define CPHYSADDR(a) 0
+#endif
+
+static inline struct clk *clk_get_fpi(void)
+{
+   return NULL;
+}
+#endif /* CONFIG_LANTIQ */
+#endif /* __LINUX_LANTIQ_H */
-- 
2.11.0



[RESEND PATCH 07/14] serial: lantiq: Rename fpiclk to freqclk

2018-10-16 Thread Songjun Wu
fpiclk is platform specific, freqclk is more generic.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 10 +-
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index e351f80996d3..4acdbdf8fe7a 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -105,7 +105,7 @@ static DEFINE_SPINLOCK(ltq_asc_lock);
 struct ltq_uart_port {
struct uart_portport;
/* clock used to derive divider */
-   struct clk  *fpiclk;
+   struct clk  *freqclk;
/* clock gating of the ASC core */
struct clk  *clk;
unsigned inttx_irq;
@@ -309,7 +309,7 @@ lqasc_startup(struct uart_port *port)
 
if (!IS_ERR(ltq_port->clk))
clk_enable(ltq_port->clk);
-   port->uartclk = clk_get_rate(ltq_port->fpiclk);
+   port->uartclk = clk_get_rate(ltq_port->freqclk);
 
asc_update_bits(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
port->membase + LTQ_ASC_CLC);
@@ -632,7 +632,7 @@ lqasc_console_setup(struct console *co, char *options)
if (!IS_ERR(ltq_port->clk))
clk_enable(ltq_port->clk);
 
-   port->uartclk = clk_get_rate(ltq_port->fpiclk);
+   port->uartclk = clk_get_rate(ltq_port->freqclk);
 
if (options)
uart_parse_options(options, , , , );
@@ -744,8 +744,8 @@ lqasc_probe(struct platform_device *pdev)
port->irq   = irqres[0].start;
port->mapbase   = mmres->start;
 
-   ltq_port->fpiclk = clk_get_fpi();
-   if (IS_ERR(ltq_port->fpiclk)) {
+   ltq_port->freqclk = clk_get_fpi();
+   if (IS_ERR(ltq_port->freqclk)) {
pr_err("failed to get fpi clk\n");
return -ENOENT;
}
-- 
2.11.0



[RESEND PATCH 09/14] serial: lantiq: Add CCF support

2018-10-16 Thread Songjun Wu
Previous implementation uses platform-dependent API to get the clock.
Those functions are not available for other SoC which uses the same IP.
The CCF (Common Clock Framework) have an abstraction based APIs for
clock. In future, the platform specific code will be removed when the
legacy soc use CCF as well.
Change to use CCF APIs to get clock and rate. So that different SoCs
can use the same driver.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 12 ++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 34b1ef3c12ce..88210de00f35 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -744,14 +744,22 @@ lqasc_probe(struct platform_device *pdev)
port->irq   = irqres[0].start;
port->mapbase   = mmres->start;
 
-   ltq_port->freqclk = clk_get_fpi();
+   if (IS_ENABLED(CONFIG_LANTIQ) && !IS_ENABLED(CONFIG_COMMON_CLK))
+   ltq_port->freqclk = clk_get_fpi();
+   else
+   ltq_port->freqclk = devm_clk_get(>dev, "freq");
+
+
if (IS_ERR(ltq_port->freqclk)) {
pr_err("failed to get fpi clk\n");
return -ENOENT;
}
 
/* not all asc ports have clock gates, lets ignore the return code */
-   ltq_port->clk = clk_get(>dev, NULL);
+   if (IS_ENABLED(CONFIG_LANTIQ) && !IS_ENABLED(CONFIG_COMMON_CLK))
+   ltq_port->clk = clk_get(>dev, NULL);
+   else
+   ltq_port->clk = devm_clk_get(>dev, "asc");
 
ltq_port->tx_irq = irqres[0].start;
ltq_port->rx_irq = irqres[1].start;
-- 
2.11.0



[RESEND PATCH 10/14] serial: lantiq: Reorder the head files

2018-10-16 Thread Songjun Wu
Reorder the head files according to the coding style.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 24 
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 88210de00f35..c983694ba24d 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -8,22 +8,22 @@
  * Copyright (C) 2010 Thomas Langer, 
  */
 
-#include 
-#include 
-#include 
+#include 
 #include 
-#include 
 #include 
-#include 
-#include 
-#include 
-#include 
-#include 
+#include 
+#include 
+#include 
+#include 
 #include 
 #include 
-#include 
-#include 
-#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
 
 #include 
 
-- 
2.11.0



[RESEND PATCH 08/14] serial: lantiq: Replace clk_enable/clk_disable with clk generic API

2018-10-16 Thread Songjun Wu
The clk driver has introduced new clock APIs that replace
the existing clk_enable and clk_disable.
- clk_enable() APIs is replaced with clk_prepare_enable()
- clk_disable() API is replaced with clk_disable_unprepare()

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 4acdbdf8fe7a..34b1ef3c12ce 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -308,7 +308,7 @@ lqasc_startup(struct uart_port *port)
int retval;
 
if (!IS_ERR(ltq_port->clk))
-   clk_enable(ltq_port->clk);
+   clk_prepare_enable(ltq_port->clk);
port->uartclk = clk_get_rate(ltq_port->freqclk);
 
asc_update_bits(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
@@ -376,7 +376,7 @@ lqasc_shutdown(struct uart_port *port)
asc_update_bits(ASCTXFCON_TXFEN, ASCTXFCON_TXFFLU,
port->membase + LTQ_ASC_TXFCON);
if (!IS_ERR(ltq_port->clk))
-   clk_disable(ltq_port->clk);
+   clk_disable_unprepare(ltq_port->clk);
 }
 
 static void
@@ -630,7 +630,7 @@ lqasc_console_setup(struct console *co, char *options)
port = _port->port;
 
if (!IS_ERR(ltq_port->clk))
-   clk_enable(ltq_port->clk);
+   clk_prepare_enable(ltq_port->clk);
 
port->uartclk = clk_get_rate(ltq_port->freqclk);
 
-- 
2.11.0



[RESEND PATCH 14/14] dt-bindings: serial: lantiq: Add optional properties for CCF

2018-10-16 Thread Songjun Wu
Clocks and clock-names are updated in device tree binding.

Reviewed-by: Rob Herring 
Signed-off-by: Songjun Wu 
---

 Documentation/devicetree/bindings/serial/lantiq_asc.txt | 15 +++
 1 file changed, 15 insertions(+)

diff --git a/Documentation/devicetree/bindings/serial/lantiq_asc.txt 
b/Documentation/devicetree/bindings/serial/lantiq_asc.txt
index 3acbd309ab9d..40e81a5818f6 100644
--- a/Documentation/devicetree/bindings/serial/lantiq_asc.txt
+++ b/Documentation/devicetree/bindings/serial/lantiq_asc.txt
@@ -6,8 +6,23 @@ Required properties:
 - interrupts: the 3 (tx rx err) interrupt numbers. The interrupt specifier
   depends on the interrupt-parent interrupt controller.
 
+Optional properties:
+- clocks: Should contain frequency clock and gate clock
+- clock-names: Should be "freq" and "asc"
+
 Example:
 
+asc0: serial@1660 {
+   compatible = "lantiq,asc";
+   reg = <0x1660 0x10>;
+   interrupt-parent = <>;
+   interrupts = ,
+   ,
+   ;
+   clocks = < CLK_SSX4>, < GCLK_UART>;
+   clock-names = "freq", "asc";
+};
+
 asc1: serial@e100c00 {
compatible = "lantiq,asc";
reg = <0xE100C00 0x400>;
-- 
2.11.0



[RESEND PATCH 08/14] serial: lantiq: Replace clk_enable/clk_disable with clk generic API

2018-10-16 Thread Songjun Wu
The clk driver has introduced new clock APIs that replace
the existing clk_enable and clk_disable.
- clk_enable() APIs is replaced with clk_prepare_enable()
- clk_disable() API is replaced with clk_disable_unprepare()

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 4acdbdf8fe7a..34b1ef3c12ce 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -308,7 +308,7 @@ lqasc_startup(struct uart_port *port)
int retval;
 
if (!IS_ERR(ltq_port->clk))
-   clk_enable(ltq_port->clk);
+   clk_prepare_enable(ltq_port->clk);
port->uartclk = clk_get_rate(ltq_port->freqclk);
 
asc_update_bits(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
@@ -376,7 +376,7 @@ lqasc_shutdown(struct uart_port *port)
asc_update_bits(ASCTXFCON_TXFEN, ASCTXFCON_TXFFLU,
port->membase + LTQ_ASC_TXFCON);
if (!IS_ERR(ltq_port->clk))
-   clk_disable(ltq_port->clk);
+   clk_disable_unprepare(ltq_port->clk);
 }
 
 static void
@@ -630,7 +630,7 @@ lqasc_console_setup(struct console *co, char *options)
port = _port->port;
 
if (!IS_ERR(ltq_port->clk))
-   clk_enable(ltq_port->clk);
+   clk_prepare_enable(ltq_port->clk);
 
port->uartclk = clk_get_rate(ltq_port->freqclk);
 
-- 
2.11.0



[RESEND PATCH 14/14] dt-bindings: serial: lantiq: Add optional properties for CCF

2018-10-16 Thread Songjun Wu
Clocks and clock-names are updated in device tree binding.

Reviewed-by: Rob Herring 
Signed-off-by: Songjun Wu 
---

 Documentation/devicetree/bindings/serial/lantiq_asc.txt | 15 +++
 1 file changed, 15 insertions(+)

diff --git a/Documentation/devicetree/bindings/serial/lantiq_asc.txt 
b/Documentation/devicetree/bindings/serial/lantiq_asc.txt
index 3acbd309ab9d..40e81a5818f6 100644
--- a/Documentation/devicetree/bindings/serial/lantiq_asc.txt
+++ b/Documentation/devicetree/bindings/serial/lantiq_asc.txt
@@ -6,8 +6,23 @@ Required properties:
 - interrupts: the 3 (tx rx err) interrupt numbers. The interrupt specifier
   depends on the interrupt-parent interrupt controller.
 
+Optional properties:
+- clocks: Should contain frequency clock and gate clock
+- clock-names: Should be "freq" and "asc"
+
 Example:
 
+asc0: serial@1660 {
+   compatible = "lantiq,asc";
+   reg = <0x1660 0x10>;
+   interrupt-parent = <>;
+   interrupts = ,
+   ,
+   ;
+   clocks = < CLK_SSX4>, < GCLK_UART>;
+   clock-names = "freq", "asc";
+};
+
 asc1: serial@e100c00 {
compatible = "lantiq,asc";
reg = <0xE100C00 0x400>;
-- 
2.11.0



[RESEND PATCH 10/14] serial: lantiq: Reorder the head files

2018-10-16 Thread Songjun Wu
Reorder the head files according to the coding style.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 24 
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 88210de00f35..c983694ba24d 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -8,22 +8,22 @@
  * Copyright (C) 2010 Thomas Langer, 
  */
 
-#include 
-#include 
-#include 
+#include 
 #include 
-#include 
 #include 
-#include 
-#include 
-#include 
-#include 
-#include 
+#include 
+#include 
+#include 
+#include 
 #include 
 #include 
-#include 
-#include 
-#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
 
 #include 
 
-- 
2.11.0



[RESEND PATCH 05/14] MIPS: lantiq: Unselect SWAP_IO_SPACE when LANTIQ is selected

2018-10-16 Thread Songjun Wu
SWAP_IO_SPACE macro prevents serial driver /drivers/tty/serial/lantiq.c
to use readl/writel to replace ltq_r32/w32 which are SoC or platform
specific APIs.

readl/writel are used for this serial driver to support multiple
platforms and multiple architectures. The legacy lantiq platform(Danube)
enables SWAP_IO_SPACE for supporting PCI due to some hardware bugs.

It's a little-endian bus plus PCI TX/RX swap enable impacted both data
and control path for MIPS based platforms. But it is better to let PCI
device driver to do endian swap since SWAP_IO_SPACE is a global wide macro
which potentially impacts other peripheral like USB.
ltq_r32/ltq_w32 is not impacted in other device drivers based on MIPS when
SWAP_IO_SPACE is not selected as they use non-byte swapping OS API
(__raw_read/__raw_writel).

Signed-off-by: Songjun Wu 
---

 arch/mips/Kconfig | 1 -
 1 file changed, 1 deletion(-)

diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 138d60cf19bc..dcc1fd39cbf3 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -406,7 +406,6 @@ config LANTIQ
select SYS_SUPPORTS_VPE_LOADER
select SYS_HAS_EARLY_PRINTK
select GPIOLIB
-   select SWAP_IO_SPACE
select BOOT_RAW
select CLKDEV_LOOKUP
select USE_OF
-- 
2.11.0



[RESEND PATCH 04/14] serial: lantiq: Change ltq_w32_mask to asc_update_bits

2018-10-16 Thread Songjun Wu
ltq prefix is platform specific function, asc prefix
is more generic.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 33 -
 1 file changed, 20 insertions(+), 13 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 66c671677761..4c14608b8ef8 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -113,6 +113,13 @@ struct ltq_uart_port {
unsigned interr_irq;
 };
 
+static inline void asc_update_bits(u32 clear, u32 set, void __iomem *reg)
+{
+   u32 tmp = readl(reg);
+
+   writel((tmp & ~clear) | set, reg);
+}
+
 static inline struct
 ltq_uart_port *to_ltq_uart_port(struct uart_port *port)
 {
@@ -163,16 +170,16 @@ lqasc_rx_chars(struct uart_port *port)
if (rsr & ASCSTATE_ANY) {
if (rsr & ASCSTATE_PE) {
port->icount.parity++;
-   ltq_w32_mask(0, ASCWHBSTATE_CLRPE,
+   asc_update_bits(0, ASCWHBSTATE_CLRPE,
port->membase + LTQ_ASC_WHBSTATE);
} else if (rsr & ASCSTATE_FE) {
port->icount.frame++;
-   ltq_w32_mask(0, ASCWHBSTATE_CLRFE,
+   asc_update_bits(0, ASCWHBSTATE_CLRFE,
port->membase + LTQ_ASC_WHBSTATE);
}
if (rsr & ASCSTATE_ROE) {
port->icount.overrun++;
-   ltq_w32_mask(0, ASCWHBSTATE_CLRROE,
+   asc_update_bits(0, ASCWHBSTATE_CLRROE,
port->membase + LTQ_ASC_WHBSTATE);
}
 
@@ -252,7 +259,7 @@ lqasc_err_int(int irq, void *_port)
struct uart_port *port = (struct uart_port *)_port;
spin_lock_irqsave(_asc_lock, flags);
/* clear any pending interrupts */
-   ltq_w32_mask(0, ASCWHBSTATE_CLRPE | ASCWHBSTATE_CLRFE |
+   asc_update_bits(0, ASCWHBSTATE_CLRPE | ASCWHBSTATE_CLRFE |
ASCWHBSTATE_CLRROE, port->membase + LTQ_ASC_WHBSTATE);
spin_unlock_irqrestore(_asc_lock, flags);
return IRQ_HANDLED;
@@ -304,7 +311,7 @@ lqasc_startup(struct uart_port *port)
clk_enable(ltq_port->clk);
port->uartclk = clk_get_rate(ltq_port->fpiclk);
 
-   ltq_w32_mask(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
+   asc_update_bits(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
port->membase + LTQ_ASC_CLC);
 
ltq_w32(0, port->membase + LTQ_ASC_PISEL);
@@ -320,7 +327,7 @@ lqasc_startup(struct uart_port *port)
 * setting enable bits
 */
wmb();
-   ltq_w32_mask(0, ASCCON_M_8ASYNC | ASCCON_FEN | ASCCON_TOEN |
+   asc_update_bits(0, ASCCON_M_8ASYNC | ASCCON_FEN | ASCCON_TOEN |
ASCCON_ROEN, port->membase + LTQ_ASC_CON);
 
retval = request_irq(ltq_port->tx_irq, lqasc_tx_int,
@@ -364,9 +371,9 @@ lqasc_shutdown(struct uart_port *port)
free_irq(ltq_port->err_irq, port);
 
ltq_w32(0, port->membase + LTQ_ASC_CON);
-   ltq_w32_mask(ASCRXFCON_RXFEN, ASCRXFCON_RXFFLU,
+   asc_update_bits(ASCRXFCON_RXFEN, ASCRXFCON_RXFFLU,
port->membase + LTQ_ASC_RXFCON);
-   ltq_w32_mask(ASCTXFCON_TXFEN, ASCTXFCON_TXFFLU,
+   asc_update_bits(ASCTXFCON_TXFEN, ASCTXFCON_TXFFLU,
port->membase + LTQ_ASC_TXFCON);
if (!IS_ERR(ltq_port->clk))
clk_disable(ltq_port->clk);
@@ -438,7 +445,7 @@ lqasc_set_termios(struct uart_port *port,
spin_lock_irqsave(_asc_lock, flags);
 
/* set up CON */
-   ltq_w32_mask(0, con, port->membase + LTQ_ASC_CON);
+   asc_update_bits(0, con, port->membase + LTQ_ASC_CON);
 
/* Set baud rate - take a divider of 2 into account */
baud = uart_get_baud_rate(port, new, old, 0, port->uartclk / 16);
@@ -446,19 +453,19 @@ lqasc_set_termios(struct uart_port *port,
divisor = divisor / 2 - 1;
 
/* disable the baudrate generator */
-   ltq_w32_mask(ASCCON_R, 0, port->membase + LTQ_ASC_CON);
+   asc_update_bits(ASCCON_R, 0, port->membase + LTQ_ASC_CON);
 
/* make sure the fractional divider is off */
-   ltq_w32_mask(ASCCON_FDE, 0, port->membase + LTQ_ASC_CON);
+   asc_update_bits(ASCCON_FDE, 0, port->membase + LTQ_ASC_CON);
 
/* set up to use divisor of 2 */
-   ltq_w32_mask(ASCCON_BRS, 0, port->membase + LTQ_ASC_CON);
+   asc_update_bits(ASCCON_BRS, 0, port->membase + LTQ_ASC_CON);
 
/* now we can write the new baudrate into the register */
ltq_w32(divisor, port->membase + LTQ_ASC_BG);
 
/* turn the baudrat

[RESEND PATCH 05/14] MIPS: lantiq: Unselect SWAP_IO_SPACE when LANTIQ is selected

2018-10-16 Thread Songjun Wu
SWAP_IO_SPACE macro prevents serial driver /drivers/tty/serial/lantiq.c
to use readl/writel to replace ltq_r32/w32 which are SoC or platform
specific APIs.

readl/writel are used for this serial driver to support multiple
platforms and multiple architectures. The legacy lantiq platform(Danube)
enables SWAP_IO_SPACE for supporting PCI due to some hardware bugs.

It's a little-endian bus plus PCI TX/RX swap enable impacted both data
and control path for MIPS based platforms. But it is better to let PCI
device driver to do endian swap since SWAP_IO_SPACE is a global wide macro
which potentially impacts other peripheral like USB.
ltq_r32/ltq_w32 is not impacted in other device drivers based on MIPS when
SWAP_IO_SPACE is not selected as they use non-byte swapping OS API
(__raw_read/__raw_writel).

Signed-off-by: Songjun Wu 
---

 arch/mips/Kconfig | 1 -
 1 file changed, 1 deletion(-)

diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 138d60cf19bc..dcc1fd39cbf3 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -406,7 +406,6 @@ config LANTIQ
select SYS_SUPPORTS_VPE_LOADER
select SYS_HAS_EARLY_PRINTK
select GPIOLIB
-   select SWAP_IO_SPACE
select BOOT_RAW
select CLKDEV_LOOKUP
select USE_OF
-- 
2.11.0



[RESEND PATCH 04/14] serial: lantiq: Change ltq_w32_mask to asc_update_bits

2018-10-16 Thread Songjun Wu
ltq prefix is platform specific function, asc prefix
is more generic.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 33 -
 1 file changed, 20 insertions(+), 13 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 66c671677761..4c14608b8ef8 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -113,6 +113,13 @@ struct ltq_uart_port {
unsigned interr_irq;
 };
 
+static inline void asc_update_bits(u32 clear, u32 set, void __iomem *reg)
+{
+   u32 tmp = readl(reg);
+
+   writel((tmp & ~clear) | set, reg);
+}
+
 static inline struct
 ltq_uart_port *to_ltq_uart_port(struct uart_port *port)
 {
@@ -163,16 +170,16 @@ lqasc_rx_chars(struct uart_port *port)
if (rsr & ASCSTATE_ANY) {
if (rsr & ASCSTATE_PE) {
port->icount.parity++;
-   ltq_w32_mask(0, ASCWHBSTATE_CLRPE,
+   asc_update_bits(0, ASCWHBSTATE_CLRPE,
port->membase + LTQ_ASC_WHBSTATE);
} else if (rsr & ASCSTATE_FE) {
port->icount.frame++;
-   ltq_w32_mask(0, ASCWHBSTATE_CLRFE,
+   asc_update_bits(0, ASCWHBSTATE_CLRFE,
port->membase + LTQ_ASC_WHBSTATE);
}
if (rsr & ASCSTATE_ROE) {
port->icount.overrun++;
-   ltq_w32_mask(0, ASCWHBSTATE_CLRROE,
+   asc_update_bits(0, ASCWHBSTATE_CLRROE,
port->membase + LTQ_ASC_WHBSTATE);
}
 
@@ -252,7 +259,7 @@ lqasc_err_int(int irq, void *_port)
struct uart_port *port = (struct uart_port *)_port;
spin_lock_irqsave(_asc_lock, flags);
/* clear any pending interrupts */
-   ltq_w32_mask(0, ASCWHBSTATE_CLRPE | ASCWHBSTATE_CLRFE |
+   asc_update_bits(0, ASCWHBSTATE_CLRPE | ASCWHBSTATE_CLRFE |
ASCWHBSTATE_CLRROE, port->membase + LTQ_ASC_WHBSTATE);
spin_unlock_irqrestore(_asc_lock, flags);
return IRQ_HANDLED;
@@ -304,7 +311,7 @@ lqasc_startup(struct uart_port *port)
clk_enable(ltq_port->clk);
port->uartclk = clk_get_rate(ltq_port->fpiclk);
 
-   ltq_w32_mask(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
+   asc_update_bits(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
port->membase + LTQ_ASC_CLC);
 
ltq_w32(0, port->membase + LTQ_ASC_PISEL);
@@ -320,7 +327,7 @@ lqasc_startup(struct uart_port *port)
 * setting enable bits
 */
wmb();
-   ltq_w32_mask(0, ASCCON_M_8ASYNC | ASCCON_FEN | ASCCON_TOEN |
+   asc_update_bits(0, ASCCON_M_8ASYNC | ASCCON_FEN | ASCCON_TOEN |
ASCCON_ROEN, port->membase + LTQ_ASC_CON);
 
retval = request_irq(ltq_port->tx_irq, lqasc_tx_int,
@@ -364,9 +371,9 @@ lqasc_shutdown(struct uart_port *port)
free_irq(ltq_port->err_irq, port);
 
ltq_w32(0, port->membase + LTQ_ASC_CON);
-   ltq_w32_mask(ASCRXFCON_RXFEN, ASCRXFCON_RXFFLU,
+   asc_update_bits(ASCRXFCON_RXFEN, ASCRXFCON_RXFFLU,
port->membase + LTQ_ASC_RXFCON);
-   ltq_w32_mask(ASCTXFCON_TXFEN, ASCTXFCON_TXFFLU,
+   asc_update_bits(ASCTXFCON_TXFEN, ASCTXFCON_TXFFLU,
port->membase + LTQ_ASC_TXFCON);
if (!IS_ERR(ltq_port->clk))
clk_disable(ltq_port->clk);
@@ -438,7 +445,7 @@ lqasc_set_termios(struct uart_port *port,
spin_lock_irqsave(_asc_lock, flags);
 
/* set up CON */
-   ltq_w32_mask(0, con, port->membase + LTQ_ASC_CON);
+   asc_update_bits(0, con, port->membase + LTQ_ASC_CON);
 
/* Set baud rate - take a divider of 2 into account */
baud = uart_get_baud_rate(port, new, old, 0, port->uartclk / 16);
@@ -446,19 +453,19 @@ lqasc_set_termios(struct uart_port *port,
divisor = divisor / 2 - 1;
 
/* disable the baudrate generator */
-   ltq_w32_mask(ASCCON_R, 0, port->membase + LTQ_ASC_CON);
+   asc_update_bits(ASCCON_R, 0, port->membase + LTQ_ASC_CON);
 
/* make sure the fractional divider is off */
-   ltq_w32_mask(ASCCON_FDE, 0, port->membase + LTQ_ASC_CON);
+   asc_update_bits(ASCCON_FDE, 0, port->membase + LTQ_ASC_CON);
 
/* set up to use divisor of 2 */
-   ltq_w32_mask(ASCCON_BRS, 0, port->membase + LTQ_ASC_CON);
+   asc_update_bits(ASCCON_BRS, 0, port->membase + LTQ_ASC_CON);
 
/* now we can write the new baudrate into the register */
ltq_w32(divisor, port->membase + LTQ_ASC_BG);
 
/* turn the baudrat

[RESEND PATCH 03/14] serial: lantiq: Get serial id from dts

2018-10-16 Thread Songjun Wu
Get serial id from dts, also keep backward compatible when dts is not
updated.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 19 +++
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 044128277248..66c671677761 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -688,7 +688,7 @@ lqasc_probe(struct platform_device *pdev)
struct ltq_uart_port *ltq_port;
struct uart_port *port;
struct resource *mmres, irqres[3];
-   int line = 0;
+   int line;
int ret;
 
mmres = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -699,9 +699,20 @@ lqasc_probe(struct platform_device *pdev)
return -ENODEV;
}
 
-   /* check if this is the console port */
-   if (mmres->start != CPHYSADDR(LTQ_EARLY_ASC))
-   line = 1;
+   /* get serial id */
+   line = of_alias_get_id(node, "serial");
+   if (line < 0) {
+   if (IS_ENABLED(CONFIG_LANTIQ)) {
+   if (mmres->start == CPHYSADDR(LTQ_EARLY_ASC))
+   line = 0;
+   else
+   line = 1;
+   } else {
+   dev_err(>dev, "failed to get alias id, errno 
%d\n",
+   line);
+   return line;
+   }
+   }
 
if (lqasc_port[line]) {
dev_err(>dev, "port %d already allocated\n", line);
-- 
2.11.0



[RESEND PATCH 02/14] MIPS: dts: Add aliases node for lantiq danube serial

2018-10-16 Thread Songjun Wu
Previous implementation uses a hard-coded register value to check
if the current serial entity is the console entity.
Now the lantiq serial driver uses the aliases for the index of the
serial port.
The lantiq danube serial dts are updated with aliases to support this.

Signed-off-by: Songjun Wu 
---

 arch/mips/boot/dts/lantiq/danube.dtsi   | 2 +-
 arch/mips/boot/dts/lantiq/easy50712.dts | 4 
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/arch/mips/boot/dts/lantiq/danube.dtsi 
b/arch/mips/boot/dts/lantiq/danube.dtsi
index 510be63c8bdf..73746d7577d7 100644
--- a/arch/mips/boot/dts/lantiq/danube.dtsi
+++ b/arch/mips/boot/dts/lantiq/danube.dtsi
@@ -74,7 +74,7 @@
reg = <0xe100a00 0x100>;
};
 
-   serial@e100c00 {
+   asc1: serial@e100c00 {
compatible = "lantiq,asc";
reg = <0xe100c00 0x400>;
interrupt-parent = <>;
diff --git a/arch/mips/boot/dts/lantiq/easy50712.dts 
b/arch/mips/boot/dts/lantiq/easy50712.dts
index 1ce20b7d05cb..452860ca1868 100644
--- a/arch/mips/boot/dts/lantiq/easy50712.dts
+++ b/arch/mips/boot/dts/lantiq/easy50712.dts
@@ -4,6 +4,10 @@
 /include/ "danube.dtsi"
 
 / {
+   aliases {
+   serial0 = 
+   };
+
chosen {
bootargs = "console=ttyLTQ0,115200 init=/etc/preinit";
};
-- 
2.11.0



[RESEND PATCH 03/14] serial: lantiq: Get serial id from dts

2018-10-16 Thread Songjun Wu
Get serial id from dts, also keep backward compatible when dts is not
updated.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 19 +++
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 044128277248..66c671677761 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -688,7 +688,7 @@ lqasc_probe(struct platform_device *pdev)
struct ltq_uart_port *ltq_port;
struct uart_port *port;
struct resource *mmres, irqres[3];
-   int line = 0;
+   int line;
int ret;
 
mmres = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -699,9 +699,20 @@ lqasc_probe(struct platform_device *pdev)
return -ENODEV;
}
 
-   /* check if this is the console port */
-   if (mmres->start != CPHYSADDR(LTQ_EARLY_ASC))
-   line = 1;
+   /* get serial id */
+   line = of_alias_get_id(node, "serial");
+   if (line < 0) {
+   if (IS_ENABLED(CONFIG_LANTIQ)) {
+   if (mmres->start == CPHYSADDR(LTQ_EARLY_ASC))
+   line = 0;
+   else
+   line = 1;
+   } else {
+   dev_err(>dev, "failed to get alias id, errno 
%d\n",
+   line);
+   return line;
+   }
+   }
 
if (lqasc_port[line]) {
dev_err(>dev, "port %d already allocated\n", line);
-- 
2.11.0



[RESEND PATCH 02/14] MIPS: dts: Add aliases node for lantiq danube serial

2018-10-16 Thread Songjun Wu
Previous implementation uses a hard-coded register value to check
if the current serial entity is the console entity.
Now the lantiq serial driver uses the aliases for the index of the
serial port.
The lantiq danube serial dts are updated with aliases to support this.

Signed-off-by: Songjun Wu 
---

 arch/mips/boot/dts/lantiq/danube.dtsi   | 2 +-
 arch/mips/boot/dts/lantiq/easy50712.dts | 4 
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/arch/mips/boot/dts/lantiq/danube.dtsi 
b/arch/mips/boot/dts/lantiq/danube.dtsi
index 510be63c8bdf..73746d7577d7 100644
--- a/arch/mips/boot/dts/lantiq/danube.dtsi
+++ b/arch/mips/boot/dts/lantiq/danube.dtsi
@@ -74,7 +74,7 @@
reg = <0xe100a00 0x100>;
};
 
-   serial@e100c00 {
+   asc1: serial@e100c00 {
compatible = "lantiq,asc";
reg = <0xe100c00 0x400>;
interrupt-parent = <>;
diff --git a/arch/mips/boot/dts/lantiq/easy50712.dts 
b/arch/mips/boot/dts/lantiq/easy50712.dts
index 1ce20b7d05cb..452860ca1868 100644
--- a/arch/mips/boot/dts/lantiq/easy50712.dts
+++ b/arch/mips/boot/dts/lantiq/easy50712.dts
@@ -4,6 +4,10 @@
 /include/ "danube.dtsi"
 
 / {
+   aliases {
+   serial0 = 
+   };
+
chosen {
bootargs = "console=ttyLTQ0,115200 init=/etc/preinit";
};
-- 
2.11.0



[RESEND PATCH 01/14] MIPS: dts: Change upper case to lower case

2018-10-16 Thread Songjun Wu
All the upper case in unit-address and hex constants are
changed to lower case according to the DT conventions.

Reviewed-by: Rob Herring 
Signed-off-by: Songjun Wu 
---

 arch/mips/boot/dts/lantiq/danube.dtsi   | 42 -
 arch/mips/boot/dts/lantiq/easy50712.dts | 14 +--
 2 files changed, 28 insertions(+), 28 deletions(-)

diff --git a/arch/mips/boot/dts/lantiq/danube.dtsi 
b/arch/mips/boot/dts/lantiq/danube.dtsi
index 2dd950181f8a..510be63c8bdf 100644
--- a/arch/mips/boot/dts/lantiq/danube.dtsi
+++ b/arch/mips/boot/dts/lantiq/danube.dtsi
@@ -10,12 +10,12 @@
};
};
 
-   biu@1F80 {
+   biu@1f80 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "lantiq,biu", "simple-bus";
-   reg = <0x1F80 0x80>;
-   ranges = <0x0 0x1F80 0x7F>;
+   reg = <0x1f80 0x80>;
+   ranges = <0x0 0x1f80 0x7f>;
 
icu0: icu@80200 {
#interrupt-cells = <1>;
@@ -24,18 +24,18 @@
reg = <0x80200 0x120>;
};
 
-   watchdog@803F0 {
+   watchdog@803f0 {
compatible = "lantiq,wdt";
-   reg = <0x803F0 0x10>;
+   reg = <0x803f0 0x10>;
};
};
 
-   sram@1F00 {
+   sram@1f00 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "lantiq,sram";
-   reg = <0x1F00 0x80>;
-   ranges = <0x0 0x1F00 0x7F>;
+   reg = <0x1f00 0x80>;
+   ranges = <0x0 0x1f00 0x7f>;
 
eiu0: eiu@101000 {
#interrupt-cells = <1>;
@@ -66,41 +66,41 @@
#address-cells = <1>;
#size-cells = <1>;
compatible = "lantiq,fpi", "simple-bus";
-   ranges = <0x0 0x1000 0xEEF>;
-   reg = <0x1000 0xEF0>;
+   ranges = <0x0 0x1000 0xeef>;
+   reg = <0x1000 0xef0>;
 
-   gptu@E100A00 {
+   gptu@e100a00 {
compatible = "lantiq,gptu-xway";
-   reg = <0xE100A00 0x100>;
+   reg = <0xe100a00 0x100>;
};
 
-   serial@E100C00 {
+   serial@e100c00 {
compatible = "lantiq,asc";
-   reg = <0xE100C00 0x400>;
+   reg = <0xe100c00 0x400>;
interrupt-parent = <>;
interrupts = <112 113 114>;
};
 
-   dma0: dma@E104100 {
+   dma0: dma@e104100 {
compatible = "lantiq,dma-xway";
-   reg = <0xE104100 0x800>;
+   reg = <0xe104100 0x800>;
};
 
-   ebu0: ebu@E105300 {
+   ebu0: ebu@e105300 {
compatible = "lantiq,ebu-xway";
-   reg = <0xE105300 0x100>;
+   reg = <0xe105300 0x100>;
};
 
-   pci0: pci@E105400 {
+   pci0: pci@e105400 {
#address-cells = <3>;
#size-cells = <2>;
#interrupt-cells = <1>;
compatible = "lantiq,pci-xway";
bus-range = <0x0 0x0>;
ranges = <0x200 0 0x800 0x800 0 0x200   
/* pci memory */
- 0x100 0 0x 0xAE0 0 0x20>; 
/* io space */
+ 0x100 0 0x 0xae0 0 0x20>; 
/* io space */
reg = <0x700 0x8000 /* config space */
-   0xE105400 0x400>;   /* pci bridge */
+   0xe105400 0x400>;   /* pci bridge */
};
};
 };
diff --git a/arch/mips/boot/dts/lantiq/easy50712.dts 
b/arch/mips/boot/dts/lantiq/easy50712.dts
index c37a33962f28..1ce20b7d05cb 100644
--- a/arch/mips/boot/dts/lantiq/easy50712.dts
+++ b/arch/mips/boot/dts/lantiq/easy50712.dts
@@ -52,14 +52,14 @@
};
};
 
-   gpio: pinmux@E100B10 {
+   gpio: pinmux@e100b10 {
compatible = "lantiq,danube-pinctrl";
p

[RESEND PATCH 01/14] MIPS: dts: Change upper case to lower case

2018-10-16 Thread Songjun Wu
All the upper case in unit-address and hex constants are
changed to lower case according to the DT conventions.

Reviewed-by: Rob Herring 
Signed-off-by: Songjun Wu 
---

 arch/mips/boot/dts/lantiq/danube.dtsi   | 42 -
 arch/mips/boot/dts/lantiq/easy50712.dts | 14 +--
 2 files changed, 28 insertions(+), 28 deletions(-)

diff --git a/arch/mips/boot/dts/lantiq/danube.dtsi 
b/arch/mips/boot/dts/lantiq/danube.dtsi
index 2dd950181f8a..510be63c8bdf 100644
--- a/arch/mips/boot/dts/lantiq/danube.dtsi
+++ b/arch/mips/boot/dts/lantiq/danube.dtsi
@@ -10,12 +10,12 @@
};
};
 
-   biu@1F80 {
+   biu@1f80 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "lantiq,biu", "simple-bus";
-   reg = <0x1F80 0x80>;
-   ranges = <0x0 0x1F80 0x7F>;
+   reg = <0x1f80 0x80>;
+   ranges = <0x0 0x1f80 0x7f>;
 
icu0: icu@80200 {
#interrupt-cells = <1>;
@@ -24,18 +24,18 @@
reg = <0x80200 0x120>;
};
 
-   watchdog@803F0 {
+   watchdog@803f0 {
compatible = "lantiq,wdt";
-   reg = <0x803F0 0x10>;
+   reg = <0x803f0 0x10>;
};
};
 
-   sram@1F00 {
+   sram@1f00 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "lantiq,sram";
-   reg = <0x1F00 0x80>;
-   ranges = <0x0 0x1F00 0x7F>;
+   reg = <0x1f00 0x80>;
+   ranges = <0x0 0x1f00 0x7f>;
 
eiu0: eiu@101000 {
#interrupt-cells = <1>;
@@ -66,41 +66,41 @@
#address-cells = <1>;
#size-cells = <1>;
compatible = "lantiq,fpi", "simple-bus";
-   ranges = <0x0 0x1000 0xEEF>;
-   reg = <0x1000 0xEF0>;
+   ranges = <0x0 0x1000 0xeef>;
+   reg = <0x1000 0xef0>;
 
-   gptu@E100A00 {
+   gptu@e100a00 {
compatible = "lantiq,gptu-xway";
-   reg = <0xE100A00 0x100>;
+   reg = <0xe100a00 0x100>;
};
 
-   serial@E100C00 {
+   serial@e100c00 {
compatible = "lantiq,asc";
-   reg = <0xE100C00 0x400>;
+   reg = <0xe100c00 0x400>;
interrupt-parent = <>;
interrupts = <112 113 114>;
};
 
-   dma0: dma@E104100 {
+   dma0: dma@e104100 {
compatible = "lantiq,dma-xway";
-   reg = <0xE104100 0x800>;
+   reg = <0xe104100 0x800>;
};
 
-   ebu0: ebu@E105300 {
+   ebu0: ebu@e105300 {
compatible = "lantiq,ebu-xway";
-   reg = <0xE105300 0x100>;
+   reg = <0xe105300 0x100>;
};
 
-   pci0: pci@E105400 {
+   pci0: pci@e105400 {
#address-cells = <3>;
#size-cells = <2>;
#interrupt-cells = <1>;
compatible = "lantiq,pci-xway";
bus-range = <0x0 0x0>;
ranges = <0x200 0 0x800 0x800 0 0x200   
/* pci memory */
- 0x100 0 0x 0xAE0 0 0x20>; 
/* io space */
+ 0x100 0 0x 0xae0 0 0x20>; 
/* io space */
reg = <0x700 0x8000 /* config space */
-   0xE105400 0x400>;   /* pci bridge */
+   0xe105400 0x400>;   /* pci bridge */
};
};
 };
diff --git a/arch/mips/boot/dts/lantiq/easy50712.dts 
b/arch/mips/boot/dts/lantiq/easy50712.dts
index c37a33962f28..1ce20b7d05cb 100644
--- a/arch/mips/boot/dts/lantiq/easy50712.dts
+++ b/arch/mips/boot/dts/lantiq/easy50712.dts
@@ -52,14 +52,14 @@
};
};
 
-   gpio: pinmux@E100B10 {
+   gpio: pinmux@e100b10 {
compatible = "lantiq,danube-pinctrl";
p

[RESEND PATCH 00/14] serial: lantiq: Add CCF suppport

2018-10-16 Thread Songjun Wu


This patch series is for adding common clock framework support
for lantiq serial driver, mainly includes:
1) Add common clock framework support.
2) Modify the dts file according to the DT conventions.
3) Replace the platform dependent functions with kernel functions



Songjun Wu (14):
  MIPS: dts: Change upper case to lower case
  MIPS: dts: Add aliases node for lantiq danube serial
  serial: lantiq: Get serial id from dts
  serial: lantiq: Change ltq_w32_mask to asc_update_bits
  MIPS: lantiq: Unselect SWAP_IO_SPACE when LANTIQ is selected
  serial: lantiq: Use readl/writel instead of ltq_r32/ltq_w32
  serial: lantiq: Rename fpiclk to freqclk
  serial: lantiq: Replace clk_enable/clk_disable with clk generic API
  serial: lantiq: Add CCF support
  serial: lantiq: Reorder the head files
  include: Add lantiq.h in include/linux/
  serial: lantiq: Replace lantiq_soc.h with lantiq.h
  serial: lantiq: Change init_lqasc to static declaration
  dt-bindings: serial: lantiq: Add optional properties for CCF

 .../devicetree/bindings/serial/lantiq_asc.txt  |  15 +++
 arch/mips/Kconfig  |   1 -
 arch/mips/boot/dts/lantiq/danube.dtsi  |  42 +++---
 arch/mips/boot/dts/lantiq/easy50712.dts|  18 ++-
 drivers/tty/serial/lantiq.c| 145 -
 include/linux/lantiq.h |  23 
 6 files changed, 155 insertions(+), 89 deletions(-)
 create mode 100644 include/linux/lantiq.h

-- 
2.11.0



[RESEND PATCH 00/14] serial: lantiq: Add CCF suppport

2018-10-16 Thread Songjun Wu


This patch series is for adding common clock framework support
for lantiq serial driver, mainly includes:
1) Add common clock framework support.
2) Modify the dts file according to the DT conventions.
3) Replace the platform dependent functions with kernel functions



Songjun Wu (14):
  MIPS: dts: Change upper case to lower case
  MIPS: dts: Add aliases node for lantiq danube serial
  serial: lantiq: Get serial id from dts
  serial: lantiq: Change ltq_w32_mask to asc_update_bits
  MIPS: lantiq: Unselect SWAP_IO_SPACE when LANTIQ is selected
  serial: lantiq: Use readl/writel instead of ltq_r32/ltq_w32
  serial: lantiq: Rename fpiclk to freqclk
  serial: lantiq: Replace clk_enable/clk_disable with clk generic API
  serial: lantiq: Add CCF support
  serial: lantiq: Reorder the head files
  include: Add lantiq.h in include/linux/
  serial: lantiq: Replace lantiq_soc.h with lantiq.h
  serial: lantiq: Change init_lqasc to static declaration
  dt-bindings: serial: lantiq: Add optional properties for CCF

 .../devicetree/bindings/serial/lantiq_asc.txt  |  15 +++
 arch/mips/Kconfig  |   1 -
 arch/mips/boot/dts/lantiq/danube.dtsi  |  42 +++---
 arch/mips/boot/dts/lantiq/easy50712.dts|  18 ++-
 drivers/tty/serial/lantiq.c| 145 -
 include/linux/lantiq.h |  23 
 6 files changed, 155 insertions(+), 89 deletions(-)
 create mode 100644 include/linux/lantiq.h

-- 
2.11.0



[PATCH 01/14] MIPS: dts: Change upper case to lower case

2018-09-24 Thread Songjun Wu
All the upper case in unit-address and hex constants are
changed to lower case according to the DT conventions.

Reviewed-by: Rob Herring 
Signed-off-by: Songjun Wu 
---

 arch/mips/boot/dts/lantiq/danube.dtsi   | 42 -
 arch/mips/boot/dts/lantiq/easy50712.dts | 14 +--
 2 files changed, 28 insertions(+), 28 deletions(-)

diff --git a/arch/mips/boot/dts/lantiq/danube.dtsi 
b/arch/mips/boot/dts/lantiq/danube.dtsi
index 2dd950181f8a..510be63c8bdf 100644
--- a/arch/mips/boot/dts/lantiq/danube.dtsi
+++ b/arch/mips/boot/dts/lantiq/danube.dtsi
@@ -10,12 +10,12 @@
};
};
 
-   biu@1F80 {
+   biu@1f80 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "lantiq,biu", "simple-bus";
-   reg = <0x1F80 0x80>;
-   ranges = <0x0 0x1F80 0x7F>;
+   reg = <0x1f80 0x80>;
+   ranges = <0x0 0x1f80 0x7f>;
 
icu0: icu@80200 {
#interrupt-cells = <1>;
@@ -24,18 +24,18 @@
reg = <0x80200 0x120>;
};
 
-   watchdog@803F0 {
+   watchdog@803f0 {
compatible = "lantiq,wdt";
-   reg = <0x803F0 0x10>;
+   reg = <0x803f0 0x10>;
};
};
 
-   sram@1F00 {
+   sram@1f00 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "lantiq,sram";
-   reg = <0x1F00 0x80>;
-   ranges = <0x0 0x1F00 0x7F>;
+   reg = <0x1f00 0x80>;
+   ranges = <0x0 0x1f00 0x7f>;
 
eiu0: eiu@101000 {
#interrupt-cells = <1>;
@@ -66,41 +66,41 @@
#address-cells = <1>;
#size-cells = <1>;
compatible = "lantiq,fpi", "simple-bus";
-   ranges = <0x0 0x1000 0xEEF>;
-   reg = <0x1000 0xEF0>;
+   ranges = <0x0 0x1000 0xeef>;
+   reg = <0x1000 0xef0>;
 
-   gptu@E100A00 {
+   gptu@e100a00 {
compatible = "lantiq,gptu-xway";
-   reg = <0xE100A00 0x100>;
+   reg = <0xe100a00 0x100>;
};
 
-   serial@E100C00 {
+   serial@e100c00 {
compatible = "lantiq,asc";
-   reg = <0xE100C00 0x400>;
+   reg = <0xe100c00 0x400>;
interrupt-parent = <>;
interrupts = <112 113 114>;
};
 
-   dma0: dma@E104100 {
+   dma0: dma@e104100 {
compatible = "lantiq,dma-xway";
-   reg = <0xE104100 0x800>;
+   reg = <0xe104100 0x800>;
};
 
-   ebu0: ebu@E105300 {
+   ebu0: ebu@e105300 {
compatible = "lantiq,ebu-xway";
-   reg = <0xE105300 0x100>;
+   reg = <0xe105300 0x100>;
};
 
-   pci0: pci@E105400 {
+   pci0: pci@e105400 {
#address-cells = <3>;
#size-cells = <2>;
#interrupt-cells = <1>;
compatible = "lantiq,pci-xway";
bus-range = <0x0 0x0>;
ranges = <0x200 0 0x800 0x800 0 0x200   
/* pci memory */
- 0x100 0 0x 0xAE0 0 0x20>; 
/* io space */
+ 0x100 0 0x 0xae0 0 0x20>; 
/* io space */
reg = <0x700 0x8000 /* config space */
-   0xE105400 0x400>;   /* pci bridge */
+   0xe105400 0x400>;   /* pci bridge */
};
};
 };
diff --git a/arch/mips/boot/dts/lantiq/easy50712.dts 
b/arch/mips/boot/dts/lantiq/easy50712.dts
index c37a33962f28..1ce20b7d05cb 100644
--- a/arch/mips/boot/dts/lantiq/easy50712.dts
+++ b/arch/mips/boot/dts/lantiq/easy50712.dts
@@ -52,14 +52,14 @@
};
};
 
-   gpio: pinmux@E100B10 {
+   gpio: pinmux@e100b10 {
compatible = "lantiq,danube-pinctrl";
p

[PATCH 01/14] MIPS: dts: Change upper case to lower case

2018-09-24 Thread Songjun Wu
All the upper case in unit-address and hex constants are
changed to lower case according to the DT conventions.

Reviewed-by: Rob Herring 
Signed-off-by: Songjun Wu 
---

 arch/mips/boot/dts/lantiq/danube.dtsi   | 42 -
 arch/mips/boot/dts/lantiq/easy50712.dts | 14 +--
 2 files changed, 28 insertions(+), 28 deletions(-)

diff --git a/arch/mips/boot/dts/lantiq/danube.dtsi 
b/arch/mips/boot/dts/lantiq/danube.dtsi
index 2dd950181f8a..510be63c8bdf 100644
--- a/arch/mips/boot/dts/lantiq/danube.dtsi
+++ b/arch/mips/boot/dts/lantiq/danube.dtsi
@@ -10,12 +10,12 @@
};
};
 
-   biu@1F80 {
+   biu@1f80 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "lantiq,biu", "simple-bus";
-   reg = <0x1F80 0x80>;
-   ranges = <0x0 0x1F80 0x7F>;
+   reg = <0x1f80 0x80>;
+   ranges = <0x0 0x1f80 0x7f>;
 
icu0: icu@80200 {
#interrupt-cells = <1>;
@@ -24,18 +24,18 @@
reg = <0x80200 0x120>;
};
 
-   watchdog@803F0 {
+   watchdog@803f0 {
compatible = "lantiq,wdt";
-   reg = <0x803F0 0x10>;
+   reg = <0x803f0 0x10>;
};
};
 
-   sram@1F00 {
+   sram@1f00 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "lantiq,sram";
-   reg = <0x1F00 0x80>;
-   ranges = <0x0 0x1F00 0x7F>;
+   reg = <0x1f00 0x80>;
+   ranges = <0x0 0x1f00 0x7f>;
 
eiu0: eiu@101000 {
#interrupt-cells = <1>;
@@ -66,41 +66,41 @@
#address-cells = <1>;
#size-cells = <1>;
compatible = "lantiq,fpi", "simple-bus";
-   ranges = <0x0 0x1000 0xEEF>;
-   reg = <0x1000 0xEF0>;
+   ranges = <0x0 0x1000 0xeef>;
+   reg = <0x1000 0xef0>;
 
-   gptu@E100A00 {
+   gptu@e100a00 {
compatible = "lantiq,gptu-xway";
-   reg = <0xE100A00 0x100>;
+   reg = <0xe100a00 0x100>;
};
 
-   serial@E100C00 {
+   serial@e100c00 {
compatible = "lantiq,asc";
-   reg = <0xE100C00 0x400>;
+   reg = <0xe100c00 0x400>;
interrupt-parent = <>;
interrupts = <112 113 114>;
};
 
-   dma0: dma@E104100 {
+   dma0: dma@e104100 {
compatible = "lantiq,dma-xway";
-   reg = <0xE104100 0x800>;
+   reg = <0xe104100 0x800>;
};
 
-   ebu0: ebu@E105300 {
+   ebu0: ebu@e105300 {
compatible = "lantiq,ebu-xway";
-   reg = <0xE105300 0x100>;
+   reg = <0xe105300 0x100>;
};
 
-   pci0: pci@E105400 {
+   pci0: pci@e105400 {
#address-cells = <3>;
#size-cells = <2>;
#interrupt-cells = <1>;
compatible = "lantiq,pci-xway";
bus-range = <0x0 0x0>;
ranges = <0x200 0 0x800 0x800 0 0x200   
/* pci memory */
- 0x100 0 0x 0xAE0 0 0x20>; 
/* io space */
+ 0x100 0 0x 0xae0 0 0x20>; 
/* io space */
reg = <0x700 0x8000 /* config space */
-   0xE105400 0x400>;   /* pci bridge */
+   0xe105400 0x400>;   /* pci bridge */
};
};
 };
diff --git a/arch/mips/boot/dts/lantiq/easy50712.dts 
b/arch/mips/boot/dts/lantiq/easy50712.dts
index c37a33962f28..1ce20b7d05cb 100644
--- a/arch/mips/boot/dts/lantiq/easy50712.dts
+++ b/arch/mips/boot/dts/lantiq/easy50712.dts
@@ -52,14 +52,14 @@
};
};
 
-   gpio: pinmux@E100B10 {
+   gpio: pinmux@e100b10 {
compatible = "lantiq,danube-pinctrl";
p

[PATCH 05/14] MIPS: lantiq: Unselect SWAP_IO_SPACE when LANTIQ is selected

2018-09-24 Thread Songjun Wu
SWAP_IO_SPACE macro prevents serial driver /drivers/tty/serial/lantiq.c
to use readl/writel to replace ltq_r32/w32 which are SoC or platform
specific APIs.

readl/writel are used for this serial driver to support multiple
platforms and multiple architectures. The legacy lantiq platform(Danube)
enables SWAP_IO_SPACE for supporting PCI due to some hardware bugs.

It's a little-endian bus plus PCI TX/RX swap enable impacted both data
and control path for MIPS based platforms. But it is better to let PCI
device driver to do endian swap since SWAP_IO_SPACE is a global wide macro
which potentially impacts other peripheral like USB.
ltq_r32/ltq_w32 is not impacted in other device drivers based on MIPS when
SWAP_IO_SPACE is not selected as they use non-byte swapping OS API
(__raw_read/__raw_writel).

Signed-off-by: Songjun Wu 
---

 arch/mips/Kconfig | 1 -
 1 file changed, 1 deletion(-)

diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 138d60cf19bc..dcc1fd39cbf3 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -406,7 +406,6 @@ config LANTIQ
select SYS_SUPPORTS_VPE_LOADER
select SYS_HAS_EARLY_PRINTK
select GPIOLIB
-   select SWAP_IO_SPACE
select BOOT_RAW
select CLKDEV_LOOKUP
select USE_OF
-- 
2.11.0



[PATCH 05/14] MIPS: lantiq: Unselect SWAP_IO_SPACE when LANTIQ is selected

2018-09-24 Thread Songjun Wu
SWAP_IO_SPACE macro prevents serial driver /drivers/tty/serial/lantiq.c
to use readl/writel to replace ltq_r32/w32 which are SoC or platform
specific APIs.

readl/writel are used for this serial driver to support multiple
platforms and multiple architectures. The legacy lantiq platform(Danube)
enables SWAP_IO_SPACE for supporting PCI due to some hardware bugs.

It's a little-endian bus plus PCI TX/RX swap enable impacted both data
and control path for MIPS based platforms. But it is better to let PCI
device driver to do endian swap since SWAP_IO_SPACE is a global wide macro
which potentially impacts other peripheral like USB.
ltq_r32/ltq_w32 is not impacted in other device drivers based on MIPS when
SWAP_IO_SPACE is not selected as they use non-byte swapping OS API
(__raw_read/__raw_writel).

Signed-off-by: Songjun Wu 
---

 arch/mips/Kconfig | 1 -
 1 file changed, 1 deletion(-)

diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 138d60cf19bc..dcc1fd39cbf3 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -406,7 +406,6 @@ config LANTIQ
select SYS_SUPPORTS_VPE_LOADER
select SYS_HAS_EARLY_PRINTK
select GPIOLIB
-   select SWAP_IO_SPACE
select BOOT_RAW
select CLKDEV_LOOKUP
select USE_OF
-- 
2.11.0



[PATCH 08/14] serial: lantiq: Replace clk_enable/clk_disable with clk generic API

2018-09-24 Thread Songjun Wu
The clk driver has introduced new clock APIs that replace
the existing clk_enable and clk_disable.
- clk_enable() APIs is replaced with clk_prepare_enable()
- clk_disable() API is replaced with clk_disable_unprepare()

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 4acdbdf8fe7a..34b1ef3c12ce 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -308,7 +308,7 @@ lqasc_startup(struct uart_port *port)
int retval;
 
if (!IS_ERR(ltq_port->clk))
-   clk_enable(ltq_port->clk);
+   clk_prepare_enable(ltq_port->clk);
port->uartclk = clk_get_rate(ltq_port->freqclk);
 
asc_update_bits(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
@@ -376,7 +376,7 @@ lqasc_shutdown(struct uart_port *port)
asc_update_bits(ASCTXFCON_TXFEN, ASCTXFCON_TXFFLU,
port->membase + LTQ_ASC_TXFCON);
if (!IS_ERR(ltq_port->clk))
-   clk_disable(ltq_port->clk);
+   clk_disable_unprepare(ltq_port->clk);
 }
 
 static void
@@ -630,7 +630,7 @@ lqasc_console_setup(struct console *co, char *options)
port = _port->port;
 
if (!IS_ERR(ltq_port->clk))
-   clk_enable(ltq_port->clk);
+   clk_prepare_enable(ltq_port->clk);
 
port->uartclk = clk_get_rate(ltq_port->freqclk);
 
-- 
2.11.0



[PATCH 08/14] serial: lantiq: Replace clk_enable/clk_disable with clk generic API

2018-09-24 Thread Songjun Wu
The clk driver has introduced new clock APIs that replace
the existing clk_enable and clk_disable.
- clk_enable() APIs is replaced with clk_prepare_enable()
- clk_disable() API is replaced with clk_disable_unprepare()

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 4acdbdf8fe7a..34b1ef3c12ce 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -308,7 +308,7 @@ lqasc_startup(struct uart_port *port)
int retval;
 
if (!IS_ERR(ltq_port->clk))
-   clk_enable(ltq_port->clk);
+   clk_prepare_enable(ltq_port->clk);
port->uartclk = clk_get_rate(ltq_port->freqclk);
 
asc_update_bits(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
@@ -376,7 +376,7 @@ lqasc_shutdown(struct uart_port *port)
asc_update_bits(ASCTXFCON_TXFEN, ASCTXFCON_TXFFLU,
port->membase + LTQ_ASC_TXFCON);
if (!IS_ERR(ltq_port->clk))
-   clk_disable(ltq_port->clk);
+   clk_disable_unprepare(ltq_port->clk);
 }
 
 static void
@@ -630,7 +630,7 @@ lqasc_console_setup(struct console *co, char *options)
port = _port->port;
 
if (!IS_ERR(ltq_port->clk))
-   clk_enable(ltq_port->clk);
+   clk_prepare_enable(ltq_port->clk);
 
port->uartclk = clk_get_rate(ltq_port->freqclk);
 
-- 
2.11.0



[PATCH 14/14] dt-bindings: serial: lantiq: Add optional properties for CCF

2018-09-24 Thread Songjun Wu
Clocks and clock-names are updated in device tree binding.

Reviewed-by: Rob Herring 
Signed-off-by: Songjun Wu 
---

 Documentation/devicetree/bindings/serial/lantiq_asc.txt | 15 +++
 1 file changed, 15 insertions(+)

diff --git a/Documentation/devicetree/bindings/serial/lantiq_asc.txt 
b/Documentation/devicetree/bindings/serial/lantiq_asc.txt
index 3acbd309ab9d..40e81a5818f6 100644
--- a/Documentation/devicetree/bindings/serial/lantiq_asc.txt
+++ b/Documentation/devicetree/bindings/serial/lantiq_asc.txt
@@ -6,8 +6,23 @@ Required properties:
 - interrupts: the 3 (tx rx err) interrupt numbers. The interrupt specifier
   depends on the interrupt-parent interrupt controller.
 
+Optional properties:
+- clocks: Should contain frequency clock and gate clock
+- clock-names: Should be "freq" and "asc"
+
 Example:
 
+asc0: serial@1660 {
+   compatible = "lantiq,asc";
+   reg = <0x1660 0x10>;
+   interrupt-parent = <>;
+   interrupts = ,
+   ,
+   ;
+   clocks = < CLK_SSX4>, < GCLK_UART>;
+   clock-names = "freq", "asc";
+};
+
 asc1: serial@e100c00 {
compatible = "lantiq,asc";
reg = <0xE100C00 0x400>;
-- 
2.11.0



[PATCH 13/14] serial: lantiq: Change init_lqasc to static declaration

2018-09-24 Thread Songjun Wu
init_lqasc() is only used internally, change to static declaration.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index ba0c70b16bda..e052b69ceb98 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -784,7 +784,7 @@ static struct platform_driver lqasc_driver = {
},
 };
 
-int __init
+static int __init
 init_lqasc(void)
 {
int ret;
-- 
2.11.0



[PATCH 03/14] serial: lantiq: Get serial id from dts

2018-09-24 Thread Songjun Wu
Get serial id from dts, also keep backward compatible when dts is not
updated.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 19 +++
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 044128277248..66c671677761 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -688,7 +688,7 @@ lqasc_probe(struct platform_device *pdev)
struct ltq_uart_port *ltq_port;
struct uart_port *port;
struct resource *mmres, irqres[3];
-   int line = 0;
+   int line;
int ret;
 
mmres = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -699,9 +699,20 @@ lqasc_probe(struct platform_device *pdev)
return -ENODEV;
}
 
-   /* check if this is the console port */
-   if (mmres->start != CPHYSADDR(LTQ_EARLY_ASC))
-   line = 1;
+   /* get serial id */
+   line = of_alias_get_id(node, "serial");
+   if (line < 0) {
+   if (IS_ENABLED(CONFIG_LANTIQ)) {
+   if (mmres->start == CPHYSADDR(LTQ_EARLY_ASC))
+   line = 0;
+   else
+   line = 1;
+   } else {
+   dev_err(>dev, "failed to get alias id, errno 
%d\n",
+   line);
+   return line;
+   }
+   }
 
if (lqasc_port[line]) {
dev_err(>dev, "port %d already allocated\n", line);
-- 
2.11.0



[PATCH 14/14] dt-bindings: serial: lantiq: Add optional properties for CCF

2018-09-24 Thread Songjun Wu
Clocks and clock-names are updated in device tree binding.

Reviewed-by: Rob Herring 
Signed-off-by: Songjun Wu 
---

 Documentation/devicetree/bindings/serial/lantiq_asc.txt | 15 +++
 1 file changed, 15 insertions(+)

diff --git a/Documentation/devicetree/bindings/serial/lantiq_asc.txt 
b/Documentation/devicetree/bindings/serial/lantiq_asc.txt
index 3acbd309ab9d..40e81a5818f6 100644
--- a/Documentation/devicetree/bindings/serial/lantiq_asc.txt
+++ b/Documentation/devicetree/bindings/serial/lantiq_asc.txt
@@ -6,8 +6,23 @@ Required properties:
 - interrupts: the 3 (tx rx err) interrupt numbers. The interrupt specifier
   depends on the interrupt-parent interrupt controller.
 
+Optional properties:
+- clocks: Should contain frequency clock and gate clock
+- clock-names: Should be "freq" and "asc"
+
 Example:
 
+asc0: serial@1660 {
+   compatible = "lantiq,asc";
+   reg = <0x1660 0x10>;
+   interrupt-parent = <>;
+   interrupts = ,
+   ,
+   ;
+   clocks = < CLK_SSX4>, < GCLK_UART>;
+   clock-names = "freq", "asc";
+};
+
 asc1: serial@e100c00 {
compatible = "lantiq,asc";
reg = <0xE100C00 0x400>;
-- 
2.11.0



[PATCH 13/14] serial: lantiq: Change init_lqasc to static declaration

2018-09-24 Thread Songjun Wu
init_lqasc() is only used internally, change to static declaration.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index ba0c70b16bda..e052b69ceb98 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -784,7 +784,7 @@ static struct platform_driver lqasc_driver = {
},
 };
 
-int __init
+static int __init
 init_lqasc(void)
 {
int ret;
-- 
2.11.0



[PATCH 03/14] serial: lantiq: Get serial id from dts

2018-09-24 Thread Songjun Wu
Get serial id from dts, also keep backward compatible when dts is not
updated.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 19 +++
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 044128277248..66c671677761 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -688,7 +688,7 @@ lqasc_probe(struct platform_device *pdev)
struct ltq_uart_port *ltq_port;
struct uart_port *port;
struct resource *mmres, irqres[3];
-   int line = 0;
+   int line;
int ret;
 
mmres = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -699,9 +699,20 @@ lqasc_probe(struct platform_device *pdev)
return -ENODEV;
}
 
-   /* check if this is the console port */
-   if (mmres->start != CPHYSADDR(LTQ_EARLY_ASC))
-   line = 1;
+   /* get serial id */
+   line = of_alias_get_id(node, "serial");
+   if (line < 0) {
+   if (IS_ENABLED(CONFIG_LANTIQ)) {
+   if (mmres->start == CPHYSADDR(LTQ_EARLY_ASC))
+   line = 0;
+   else
+   line = 1;
+   } else {
+   dev_err(>dev, "failed to get alias id, errno 
%d\n",
+   line);
+   return line;
+   }
+   }
 
if (lqasc_port[line]) {
dev_err(>dev, "port %d already allocated\n", line);
-- 
2.11.0



[PATCH 12/14] serial: lantiq: Replace lantiq_soc.h with lantiq.h

2018-09-24 Thread Songjun Wu
In this existing lantiq serial driver,
lantiq_soc.h is defined in the arch directory,

./arch/mips/include/asm/mach-lantiq/falcon/lantiq_soc.h
./arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h

This driver need to be extended to support more platform,
lantiq.h is added in include/linux/ to make it
globally available and provide some wrapper code.
Use lantiq.h to make the driver can find the correct
header file.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index c983694ba24d..ba0c70b16bda 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -15,6 +15,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -25,8 +26,6 @@
 #include 
 #include 
 
-#include 
-
 #define PORT_LTQ_ASC   111
 #define MAXPORTS   2
 #define UART_DUMMY_UER_RX  1
-- 
2.11.0



[PATCH 11/14] include: Add lantiq.h in include/linux/

2018-09-24 Thread Songjun Wu
In some existing lantiq driver, the C codes include lantiq_soc.h
header file directly.

./arch/mips/include/asm/mach-lantiq/falcon/lantiq_soc.h
./arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h

Those drivers need to be extended to support more platform.
lantiq.h is added in include/linux/ to make it
globally available and provides some wrapper codes.

Signed-off-by: Songjun Wu 
---

 include/linux/lantiq.h | 23 +++
 1 file changed, 23 insertions(+)
 create mode 100644 include/linux/lantiq.h

diff --git a/include/linux/lantiq.h b/include/linux/lantiq.h
new file mode 100644
index ..67921169d84d
--- /dev/null
+++ b/include/linux/lantiq.h
@@ -0,0 +1,23 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef __LINUX_LANTIQ_H
+#define __LINUX_LANTIQ_H
+
+#ifdef CONFIG_LANTIQ
+#include 
+#else
+
+#ifndef LTQ_EARLY_ASC
+#define LTQ_EARLY_ASC 0
+#endif
+
+#ifndef CPHYSADDR
+#define CPHYSADDR(a) 0
+#endif
+
+static inline struct clk *clk_get_fpi(void)
+{
+   return NULL;
+}
+#endif /* CONFIG_LANTIQ */
+#endif /* __LINUX_LANTIQ_H */
-- 
2.11.0



[PATCH 12/14] serial: lantiq: Replace lantiq_soc.h with lantiq.h

2018-09-24 Thread Songjun Wu
In this existing lantiq serial driver,
lantiq_soc.h is defined in the arch directory,

./arch/mips/include/asm/mach-lantiq/falcon/lantiq_soc.h
./arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h

This driver need to be extended to support more platform,
lantiq.h is added in include/linux/ to make it
globally available and provide some wrapper code.
Use lantiq.h to make the driver can find the correct
header file.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index c983694ba24d..ba0c70b16bda 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -15,6 +15,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -25,8 +26,6 @@
 #include 
 #include 
 
-#include 
-
 #define PORT_LTQ_ASC   111
 #define MAXPORTS   2
 #define UART_DUMMY_UER_RX  1
-- 
2.11.0



[PATCH 11/14] include: Add lantiq.h in include/linux/

2018-09-24 Thread Songjun Wu
In some existing lantiq driver, the C codes include lantiq_soc.h
header file directly.

./arch/mips/include/asm/mach-lantiq/falcon/lantiq_soc.h
./arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h

Those drivers need to be extended to support more platform.
lantiq.h is added in include/linux/ to make it
globally available and provides some wrapper codes.

Signed-off-by: Songjun Wu 
---

 include/linux/lantiq.h | 23 +++
 1 file changed, 23 insertions(+)
 create mode 100644 include/linux/lantiq.h

diff --git a/include/linux/lantiq.h b/include/linux/lantiq.h
new file mode 100644
index ..67921169d84d
--- /dev/null
+++ b/include/linux/lantiq.h
@@ -0,0 +1,23 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef __LINUX_LANTIQ_H
+#define __LINUX_LANTIQ_H
+
+#ifdef CONFIG_LANTIQ
+#include 
+#else
+
+#ifndef LTQ_EARLY_ASC
+#define LTQ_EARLY_ASC 0
+#endif
+
+#ifndef CPHYSADDR
+#define CPHYSADDR(a) 0
+#endif
+
+static inline struct clk *clk_get_fpi(void)
+{
+   return NULL;
+}
+#endif /* CONFIG_LANTIQ */
+#endif /* __LINUX_LANTIQ_H */
-- 
2.11.0



[PATCH 06/14] serial: lantiq: Use readl/writel instead of ltq_r32/ltq_w32

2018-09-24 Thread Songjun Wu
Previous implementation uses platform-dependent functions
ltq_w32()/ltq_r32() to access registers. Those functions are not
available for other SoC which uses the same IP.
Change to OS provided readl()/writel() and readb()/writeb(), so
that different SoCs can use the same driver.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 38 +++---
 1 file changed, 19 insertions(+), 19 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 4c14608b8ef8..e351f80996d3 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -145,7 +145,7 @@ lqasc_start_tx(struct uart_port *port)
 static void
 lqasc_stop_rx(struct uart_port *port)
 {
-   ltq_w32(ASCWHBSTATE_CLRREN, port->membase + LTQ_ASC_WHBSTATE);
+   writel(ASCWHBSTATE_CLRREN, port->membase + LTQ_ASC_WHBSTATE);
 }
 
 static int
@@ -154,11 +154,11 @@ lqasc_rx_chars(struct uart_port *port)
struct tty_port *tport = >state->port;
unsigned int ch = 0, rsr = 0, fifocnt;
 
-   fifocnt = ltq_r32(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_RXFFLMASK;
+   fifocnt = readl(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_RXFFLMASK;
while (fifocnt--) {
u8 flag = TTY_NORMAL;
-   ch = ltq_r8(port->membase + LTQ_ASC_RBUF);
-   rsr = (ltq_r32(port->membase + LTQ_ASC_STATE)
+   ch = readb(port->membase + LTQ_ASC_RBUF);
+   rsr = (readl(port->membase + LTQ_ASC_STATE)
& ASCSTATE_ANY) | UART_DUMMY_UER_RX;
tty_flip_buffer_push(tport);
port->icount.rx++;
@@ -218,10 +218,10 @@ lqasc_tx_chars(struct uart_port *port)
return;
}
 
-   while (((ltq_r32(port->membase + LTQ_ASC_FSTAT) &
+   while (((readl(port->membase + LTQ_ASC_FSTAT) &
ASCFSTAT_TXFREEMASK) >> ASCFSTAT_TXFREEOFF) != 0) {
if (port->x_char) {
-   ltq_w8(port->x_char, port->membase + LTQ_ASC_TBUF);
+   writeb(port->x_char, port->membase + LTQ_ASC_TBUF);
port->icount.tx++;
port->x_char = 0;
continue;
@@ -230,7 +230,7 @@ lqasc_tx_chars(struct uart_port *port)
if (uart_circ_empty(xmit))
break;
 
-   ltq_w8(port->state->xmit.buf[port->state->xmit.tail],
+   writeb(port->state->xmit.buf[port->state->xmit.tail],
port->membase + LTQ_ASC_TBUF);
xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
port->icount.tx++;
@@ -246,7 +246,7 @@ lqasc_tx_int(int irq, void *_port)
unsigned long flags;
struct uart_port *port = (struct uart_port *)_port;
spin_lock_irqsave(_asc_lock, flags);
-   ltq_w32(ASC_IRNCR_TIR, port->membase + LTQ_ASC_IRNCR);
+   writel(ASC_IRNCR_TIR, port->membase + LTQ_ASC_IRNCR);
spin_unlock_irqrestore(_asc_lock, flags);
lqasc_start_tx(port);
return IRQ_HANDLED;
@@ -271,7 +271,7 @@ lqasc_rx_int(int irq, void *_port)
unsigned long flags;
struct uart_port *port = (struct uart_port *)_port;
spin_lock_irqsave(_asc_lock, flags);
-   ltq_w32(ASC_IRNCR_RIR, port->membase + LTQ_ASC_IRNCR);
+   writel(ASC_IRNCR_RIR, port->membase + LTQ_ASC_IRNCR);
lqasc_rx_chars(port);
spin_unlock_irqrestore(_asc_lock, flags);
return IRQ_HANDLED;
@@ -281,7 +281,7 @@ static unsigned int
 lqasc_tx_empty(struct uart_port *port)
 {
int status;
-   status = ltq_r32(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_TXFFLMASK;
+   status = readl(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_TXFFLMASK;
return status ? 0 : TIOCSER_TEMT;
 }
 
@@ -314,12 +314,12 @@ lqasc_startup(struct uart_port *port)
asc_update_bits(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
port->membase + LTQ_ASC_CLC);
 
-   ltq_w32(0, port->membase + LTQ_ASC_PISEL);
-   ltq_w32(
+   writel(0, port->membase + LTQ_ASC_PISEL);
+   writel(
((TXFIFO_FL << ASCTXFCON_TXFITLOFF) & ASCTXFCON_TXFITLMASK) |
ASCTXFCON_TXFEN | ASCTXFCON_TXFFLU,
port->membase + LTQ_ASC_TXFCON);
-   ltq_w32(
+   writel(
((RXFIFO_FL << ASCRXFCON_RXFITLOFF) & ASCRXFCON_RXFITLMASK)
| ASCRXFCON_RXFEN | ASCRXFCON_RXFFLU,
port->membase + LTQ_ASC_RXFCON);
@@ -351,7 +351,7 @@ lqasc_startup(struct uart_port *port)
goto err2;
}
 
-   ltq_w32(ASC_IRNREN_RX | ASC_IRNREN_ERR | ASC_IRNREN_TX,
+   writel(ASC_IRNREN_RX | ASC_IRNREN_ERR | ASC_IRNREN_TX,
port->membase + LTQ_ASC_IR

[PATCH 06/14] serial: lantiq: Use readl/writel instead of ltq_r32/ltq_w32

2018-09-24 Thread Songjun Wu
Previous implementation uses platform-dependent functions
ltq_w32()/ltq_r32() to access registers. Those functions are not
available for other SoC which uses the same IP.
Change to OS provided readl()/writel() and readb()/writeb(), so
that different SoCs can use the same driver.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 38 +++---
 1 file changed, 19 insertions(+), 19 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 4c14608b8ef8..e351f80996d3 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -145,7 +145,7 @@ lqasc_start_tx(struct uart_port *port)
 static void
 lqasc_stop_rx(struct uart_port *port)
 {
-   ltq_w32(ASCWHBSTATE_CLRREN, port->membase + LTQ_ASC_WHBSTATE);
+   writel(ASCWHBSTATE_CLRREN, port->membase + LTQ_ASC_WHBSTATE);
 }
 
 static int
@@ -154,11 +154,11 @@ lqasc_rx_chars(struct uart_port *port)
struct tty_port *tport = >state->port;
unsigned int ch = 0, rsr = 0, fifocnt;
 
-   fifocnt = ltq_r32(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_RXFFLMASK;
+   fifocnt = readl(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_RXFFLMASK;
while (fifocnt--) {
u8 flag = TTY_NORMAL;
-   ch = ltq_r8(port->membase + LTQ_ASC_RBUF);
-   rsr = (ltq_r32(port->membase + LTQ_ASC_STATE)
+   ch = readb(port->membase + LTQ_ASC_RBUF);
+   rsr = (readl(port->membase + LTQ_ASC_STATE)
& ASCSTATE_ANY) | UART_DUMMY_UER_RX;
tty_flip_buffer_push(tport);
port->icount.rx++;
@@ -218,10 +218,10 @@ lqasc_tx_chars(struct uart_port *port)
return;
}
 
-   while (((ltq_r32(port->membase + LTQ_ASC_FSTAT) &
+   while (((readl(port->membase + LTQ_ASC_FSTAT) &
ASCFSTAT_TXFREEMASK) >> ASCFSTAT_TXFREEOFF) != 0) {
if (port->x_char) {
-   ltq_w8(port->x_char, port->membase + LTQ_ASC_TBUF);
+   writeb(port->x_char, port->membase + LTQ_ASC_TBUF);
port->icount.tx++;
port->x_char = 0;
continue;
@@ -230,7 +230,7 @@ lqasc_tx_chars(struct uart_port *port)
if (uart_circ_empty(xmit))
break;
 
-   ltq_w8(port->state->xmit.buf[port->state->xmit.tail],
+   writeb(port->state->xmit.buf[port->state->xmit.tail],
port->membase + LTQ_ASC_TBUF);
xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
port->icount.tx++;
@@ -246,7 +246,7 @@ lqasc_tx_int(int irq, void *_port)
unsigned long flags;
struct uart_port *port = (struct uart_port *)_port;
spin_lock_irqsave(_asc_lock, flags);
-   ltq_w32(ASC_IRNCR_TIR, port->membase + LTQ_ASC_IRNCR);
+   writel(ASC_IRNCR_TIR, port->membase + LTQ_ASC_IRNCR);
spin_unlock_irqrestore(_asc_lock, flags);
lqasc_start_tx(port);
return IRQ_HANDLED;
@@ -271,7 +271,7 @@ lqasc_rx_int(int irq, void *_port)
unsigned long flags;
struct uart_port *port = (struct uart_port *)_port;
spin_lock_irqsave(_asc_lock, flags);
-   ltq_w32(ASC_IRNCR_RIR, port->membase + LTQ_ASC_IRNCR);
+   writel(ASC_IRNCR_RIR, port->membase + LTQ_ASC_IRNCR);
lqasc_rx_chars(port);
spin_unlock_irqrestore(_asc_lock, flags);
return IRQ_HANDLED;
@@ -281,7 +281,7 @@ static unsigned int
 lqasc_tx_empty(struct uart_port *port)
 {
int status;
-   status = ltq_r32(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_TXFFLMASK;
+   status = readl(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_TXFFLMASK;
return status ? 0 : TIOCSER_TEMT;
 }
 
@@ -314,12 +314,12 @@ lqasc_startup(struct uart_port *port)
asc_update_bits(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
port->membase + LTQ_ASC_CLC);
 
-   ltq_w32(0, port->membase + LTQ_ASC_PISEL);
-   ltq_w32(
+   writel(0, port->membase + LTQ_ASC_PISEL);
+   writel(
((TXFIFO_FL << ASCTXFCON_TXFITLOFF) & ASCTXFCON_TXFITLMASK) |
ASCTXFCON_TXFEN | ASCTXFCON_TXFFLU,
port->membase + LTQ_ASC_TXFCON);
-   ltq_w32(
+   writel(
((RXFIFO_FL << ASCRXFCON_RXFITLOFF) & ASCRXFCON_RXFITLMASK)
| ASCRXFCON_RXFEN | ASCRXFCON_RXFFLU,
port->membase + LTQ_ASC_RXFCON);
@@ -351,7 +351,7 @@ lqasc_startup(struct uart_port *port)
goto err2;
}
 
-   ltq_w32(ASC_IRNREN_RX | ASC_IRNREN_ERR | ASC_IRNREN_TX,
+   writel(ASC_IRNREN_RX | ASC_IRNREN_ERR | ASC_IRNREN_TX,
port->membase + LTQ_ASC_IR

[PATCH 10/14] serial: lantiq: Reorder the head files

2018-09-24 Thread Songjun Wu
Reorder the head files according to the coding style.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 24 
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 88210de00f35..c983694ba24d 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -8,22 +8,22 @@
  * Copyright (C) 2010 Thomas Langer, 
  */
 
-#include 
-#include 
-#include 
+#include 
 #include 
-#include 
 #include 
-#include 
-#include 
-#include 
-#include 
-#include 
+#include 
+#include 
+#include 
+#include 
 #include 
 #include 
-#include 
-#include 
-#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
 
 #include 
 
-- 
2.11.0



[PATCH 10/14] serial: lantiq: Reorder the head files

2018-09-24 Thread Songjun Wu
Reorder the head files according to the coding style.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 24 
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 88210de00f35..c983694ba24d 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -8,22 +8,22 @@
  * Copyright (C) 2010 Thomas Langer, 
  */
 
-#include 
-#include 
-#include 
+#include 
 #include 
-#include 
 #include 
-#include 
-#include 
-#include 
-#include 
-#include 
+#include 
+#include 
+#include 
+#include 
 #include 
 #include 
-#include 
-#include 
-#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
 
 #include 
 
-- 
2.11.0



[PATCH 09/14] serial: lantiq: Add CCF support

2018-09-24 Thread Songjun Wu
Previous implementation uses platform-dependent API to get the clock.
Those functions are not available for other SoC which uses the same IP.
The CCF (Common Clock Framework) have an abstraction based APIs for
clock. In future, the platform specific code will be removed when the
legacy soc use CCF as well.
Change to use CCF APIs to get clock and rate. So that different SoCs
can use the same driver.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 12 ++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 34b1ef3c12ce..88210de00f35 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -744,14 +744,22 @@ lqasc_probe(struct platform_device *pdev)
port->irq   = irqres[0].start;
port->mapbase   = mmres->start;
 
-   ltq_port->freqclk = clk_get_fpi();
+   if (IS_ENABLED(CONFIG_LANTIQ) && !IS_ENABLED(CONFIG_COMMON_CLK))
+   ltq_port->freqclk = clk_get_fpi();
+   else
+   ltq_port->freqclk = devm_clk_get(>dev, "freq");
+
+
if (IS_ERR(ltq_port->freqclk)) {
pr_err("failed to get fpi clk\n");
return -ENOENT;
}
 
/* not all asc ports have clock gates, lets ignore the return code */
-   ltq_port->clk = clk_get(>dev, NULL);
+   if (IS_ENABLED(CONFIG_LANTIQ) && !IS_ENABLED(CONFIG_COMMON_CLK))
+   ltq_port->clk = clk_get(>dev, NULL);
+   else
+   ltq_port->clk = devm_clk_get(>dev, "asc");
 
ltq_port->tx_irq = irqres[0].start;
ltq_port->rx_irq = irqres[1].start;
-- 
2.11.0



[PATCH 00/14] serial: langtiq: Add CCF suppport

2018-09-24 Thread Songjun Wu
This patch series is for adding common clock framework support
for langtiq serial driver, mainly includes:
1) Add common clock framework support.
2) Modify the dts file according to the DT conventions.
3) Replace the platform dependent functions with kernel functions


Songjun Wu (14):
  MIPS: dts: Change upper case to lower case
  MIPS: dts: Add aliases node for lantiq danube serial
  serial: lantiq: Get serial id from dts
  serial: lantiq: Change ltq_w32_mask to asc_update_bits
  MIPS: lantiq: Unselect SWAP_IO_SPACE when LANTIQ is selected
  serial: lantiq: Use readl/writel instead of ltq_r32/ltq_w32
  serial: lantiq: Rename fpiclk to freqclk
  serial: lantiq: Replace clk_enable/clk_disable with clk generic API
  serial: lantiq: Add CCF support
  serial: lantiq: Reorder the head files
  include: Add lantiq.h in include/linux/
  serial: lantiq: Replace lantiq_soc.h with lantiq.h
  serial: lantiq: Change init_lqasc to static declaration
  dt-bindings: serial: lantiq: Add optional properties for CCF

 .../devicetree/bindings/serial/lantiq_asc.txt  |  15 +++
 arch/mips/Kconfig  |   1 -
 arch/mips/boot/dts/lantiq/danube.dtsi  |  42 +++---
 arch/mips/boot/dts/lantiq/easy50712.dts|  18 ++-
 drivers/tty/serial/lantiq.c| 145 -
 include/linux/lantiq.h |  23 
 6 files changed, 155 insertions(+), 89 deletions(-)
 create mode 100644 include/linux/lantiq.h

-- 
2.11.0



[PATCH 09/14] serial: lantiq: Add CCF support

2018-09-24 Thread Songjun Wu
Previous implementation uses platform-dependent API to get the clock.
Those functions are not available for other SoC which uses the same IP.
The CCF (Common Clock Framework) have an abstraction based APIs for
clock. In future, the platform specific code will be removed when the
legacy soc use CCF as well.
Change to use CCF APIs to get clock and rate. So that different SoCs
can use the same driver.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 12 ++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 34b1ef3c12ce..88210de00f35 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -744,14 +744,22 @@ lqasc_probe(struct platform_device *pdev)
port->irq   = irqres[0].start;
port->mapbase   = mmres->start;
 
-   ltq_port->freqclk = clk_get_fpi();
+   if (IS_ENABLED(CONFIG_LANTIQ) && !IS_ENABLED(CONFIG_COMMON_CLK))
+   ltq_port->freqclk = clk_get_fpi();
+   else
+   ltq_port->freqclk = devm_clk_get(>dev, "freq");
+
+
if (IS_ERR(ltq_port->freqclk)) {
pr_err("failed to get fpi clk\n");
return -ENOENT;
}
 
/* not all asc ports have clock gates, lets ignore the return code */
-   ltq_port->clk = clk_get(>dev, NULL);
+   if (IS_ENABLED(CONFIG_LANTIQ) && !IS_ENABLED(CONFIG_COMMON_CLK))
+   ltq_port->clk = clk_get(>dev, NULL);
+   else
+   ltq_port->clk = devm_clk_get(>dev, "asc");
 
ltq_port->tx_irq = irqres[0].start;
ltq_port->rx_irq = irqres[1].start;
-- 
2.11.0



[PATCH 00/14] serial: langtiq: Add CCF suppport

2018-09-24 Thread Songjun Wu
This patch series is for adding common clock framework support
for langtiq serial driver, mainly includes:
1) Add common clock framework support.
2) Modify the dts file according to the DT conventions.
3) Replace the platform dependent functions with kernel functions


Songjun Wu (14):
  MIPS: dts: Change upper case to lower case
  MIPS: dts: Add aliases node for lantiq danube serial
  serial: lantiq: Get serial id from dts
  serial: lantiq: Change ltq_w32_mask to asc_update_bits
  MIPS: lantiq: Unselect SWAP_IO_SPACE when LANTIQ is selected
  serial: lantiq: Use readl/writel instead of ltq_r32/ltq_w32
  serial: lantiq: Rename fpiclk to freqclk
  serial: lantiq: Replace clk_enable/clk_disable with clk generic API
  serial: lantiq: Add CCF support
  serial: lantiq: Reorder the head files
  include: Add lantiq.h in include/linux/
  serial: lantiq: Replace lantiq_soc.h with lantiq.h
  serial: lantiq: Change init_lqasc to static declaration
  dt-bindings: serial: lantiq: Add optional properties for CCF

 .../devicetree/bindings/serial/lantiq_asc.txt  |  15 +++
 arch/mips/Kconfig  |   1 -
 arch/mips/boot/dts/lantiq/danube.dtsi  |  42 +++---
 arch/mips/boot/dts/lantiq/easy50712.dts|  18 ++-
 drivers/tty/serial/lantiq.c| 145 -
 include/linux/lantiq.h |  23 
 6 files changed, 155 insertions(+), 89 deletions(-)
 create mode 100644 include/linux/lantiq.h

-- 
2.11.0



[PATCH 02/14] MIPS: dts: Add aliases node for lantiq danube serial

2018-09-24 Thread Songjun Wu
Previous implementation uses a hard-coded register value to check
if the current serial entity is the console entity.
Now the lantiq serial driver uses the aliases for the index of the
serial port.
The lantiq danube serial dts are updated with aliases to support this.

Signed-off-by: Songjun Wu 
---

 arch/mips/boot/dts/lantiq/danube.dtsi   | 2 +-
 arch/mips/boot/dts/lantiq/easy50712.dts | 4 
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/arch/mips/boot/dts/lantiq/danube.dtsi 
b/arch/mips/boot/dts/lantiq/danube.dtsi
index 510be63c8bdf..73746d7577d7 100644
--- a/arch/mips/boot/dts/lantiq/danube.dtsi
+++ b/arch/mips/boot/dts/lantiq/danube.dtsi
@@ -74,7 +74,7 @@
reg = <0xe100a00 0x100>;
};
 
-   serial@e100c00 {
+   asc1: serial@e100c00 {
compatible = "lantiq,asc";
reg = <0xe100c00 0x400>;
interrupt-parent = <>;
diff --git a/arch/mips/boot/dts/lantiq/easy50712.dts 
b/arch/mips/boot/dts/lantiq/easy50712.dts
index 1ce20b7d05cb..452860ca1868 100644
--- a/arch/mips/boot/dts/lantiq/easy50712.dts
+++ b/arch/mips/boot/dts/lantiq/easy50712.dts
@@ -4,6 +4,10 @@
 /include/ "danube.dtsi"
 
 / {
+   aliases {
+   serial0 = 
+   };
+
chosen {
bootargs = "console=ttyLTQ0,115200 init=/etc/preinit";
};
-- 
2.11.0



[PATCH 07/14] serial: lantiq: Rename fpiclk to freqclk

2018-09-24 Thread Songjun Wu
fpiclk is platform specific, freqclk is more generic.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 10 +-
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index e351f80996d3..4acdbdf8fe7a 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -105,7 +105,7 @@ static DEFINE_SPINLOCK(ltq_asc_lock);
 struct ltq_uart_port {
struct uart_portport;
/* clock used to derive divider */
-   struct clk  *fpiclk;
+   struct clk  *freqclk;
/* clock gating of the ASC core */
struct clk  *clk;
unsigned inttx_irq;
@@ -309,7 +309,7 @@ lqasc_startup(struct uart_port *port)
 
if (!IS_ERR(ltq_port->clk))
clk_enable(ltq_port->clk);
-   port->uartclk = clk_get_rate(ltq_port->fpiclk);
+   port->uartclk = clk_get_rate(ltq_port->freqclk);
 
asc_update_bits(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
port->membase + LTQ_ASC_CLC);
@@ -632,7 +632,7 @@ lqasc_console_setup(struct console *co, char *options)
if (!IS_ERR(ltq_port->clk))
clk_enable(ltq_port->clk);
 
-   port->uartclk = clk_get_rate(ltq_port->fpiclk);
+   port->uartclk = clk_get_rate(ltq_port->freqclk);
 
if (options)
uart_parse_options(options, , , , );
@@ -744,8 +744,8 @@ lqasc_probe(struct platform_device *pdev)
port->irq   = irqres[0].start;
port->mapbase   = mmres->start;
 
-   ltq_port->fpiclk = clk_get_fpi();
-   if (IS_ERR(ltq_port->fpiclk)) {
+   ltq_port->freqclk = clk_get_fpi();
+   if (IS_ERR(ltq_port->freqclk)) {
pr_err("failed to get fpi clk\n");
return -ENOENT;
}
-- 
2.11.0



[PATCH 04/14] serial: lantiq: Change ltq_w32_mask to asc_update_bits

2018-09-24 Thread Songjun Wu
ltq prefix is platform specific function, asc prefix
is more generic.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 33 -
 1 file changed, 20 insertions(+), 13 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 66c671677761..4c14608b8ef8 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -113,6 +113,13 @@ struct ltq_uart_port {
unsigned interr_irq;
 };
 
+static inline void asc_update_bits(u32 clear, u32 set, void __iomem *reg)
+{
+   u32 tmp = readl(reg);
+
+   writel((tmp & ~clear) | set, reg);
+}
+
 static inline struct
 ltq_uart_port *to_ltq_uart_port(struct uart_port *port)
 {
@@ -163,16 +170,16 @@ lqasc_rx_chars(struct uart_port *port)
if (rsr & ASCSTATE_ANY) {
if (rsr & ASCSTATE_PE) {
port->icount.parity++;
-   ltq_w32_mask(0, ASCWHBSTATE_CLRPE,
+   asc_update_bits(0, ASCWHBSTATE_CLRPE,
port->membase + LTQ_ASC_WHBSTATE);
} else if (rsr & ASCSTATE_FE) {
port->icount.frame++;
-   ltq_w32_mask(0, ASCWHBSTATE_CLRFE,
+   asc_update_bits(0, ASCWHBSTATE_CLRFE,
port->membase + LTQ_ASC_WHBSTATE);
}
if (rsr & ASCSTATE_ROE) {
port->icount.overrun++;
-   ltq_w32_mask(0, ASCWHBSTATE_CLRROE,
+   asc_update_bits(0, ASCWHBSTATE_CLRROE,
port->membase + LTQ_ASC_WHBSTATE);
}
 
@@ -252,7 +259,7 @@ lqasc_err_int(int irq, void *_port)
struct uart_port *port = (struct uart_port *)_port;
spin_lock_irqsave(_asc_lock, flags);
/* clear any pending interrupts */
-   ltq_w32_mask(0, ASCWHBSTATE_CLRPE | ASCWHBSTATE_CLRFE |
+   asc_update_bits(0, ASCWHBSTATE_CLRPE | ASCWHBSTATE_CLRFE |
ASCWHBSTATE_CLRROE, port->membase + LTQ_ASC_WHBSTATE);
spin_unlock_irqrestore(_asc_lock, flags);
return IRQ_HANDLED;
@@ -304,7 +311,7 @@ lqasc_startup(struct uart_port *port)
clk_enable(ltq_port->clk);
port->uartclk = clk_get_rate(ltq_port->fpiclk);
 
-   ltq_w32_mask(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
+   asc_update_bits(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
port->membase + LTQ_ASC_CLC);
 
ltq_w32(0, port->membase + LTQ_ASC_PISEL);
@@ -320,7 +327,7 @@ lqasc_startup(struct uart_port *port)
 * setting enable bits
 */
wmb();
-   ltq_w32_mask(0, ASCCON_M_8ASYNC | ASCCON_FEN | ASCCON_TOEN |
+   asc_update_bits(0, ASCCON_M_8ASYNC | ASCCON_FEN | ASCCON_TOEN |
ASCCON_ROEN, port->membase + LTQ_ASC_CON);
 
retval = request_irq(ltq_port->tx_irq, lqasc_tx_int,
@@ -364,9 +371,9 @@ lqasc_shutdown(struct uart_port *port)
free_irq(ltq_port->err_irq, port);
 
ltq_w32(0, port->membase + LTQ_ASC_CON);
-   ltq_w32_mask(ASCRXFCON_RXFEN, ASCRXFCON_RXFFLU,
+   asc_update_bits(ASCRXFCON_RXFEN, ASCRXFCON_RXFFLU,
port->membase + LTQ_ASC_RXFCON);
-   ltq_w32_mask(ASCTXFCON_TXFEN, ASCTXFCON_TXFFLU,
+   asc_update_bits(ASCTXFCON_TXFEN, ASCTXFCON_TXFFLU,
port->membase + LTQ_ASC_TXFCON);
if (!IS_ERR(ltq_port->clk))
clk_disable(ltq_port->clk);
@@ -438,7 +445,7 @@ lqasc_set_termios(struct uart_port *port,
spin_lock_irqsave(_asc_lock, flags);
 
/* set up CON */
-   ltq_w32_mask(0, con, port->membase + LTQ_ASC_CON);
+   asc_update_bits(0, con, port->membase + LTQ_ASC_CON);
 
/* Set baud rate - take a divider of 2 into account */
baud = uart_get_baud_rate(port, new, old, 0, port->uartclk / 16);
@@ -446,19 +453,19 @@ lqasc_set_termios(struct uart_port *port,
divisor = divisor / 2 - 1;
 
/* disable the baudrate generator */
-   ltq_w32_mask(ASCCON_R, 0, port->membase + LTQ_ASC_CON);
+   asc_update_bits(ASCCON_R, 0, port->membase + LTQ_ASC_CON);
 
/* make sure the fractional divider is off */
-   ltq_w32_mask(ASCCON_FDE, 0, port->membase + LTQ_ASC_CON);
+   asc_update_bits(ASCCON_FDE, 0, port->membase + LTQ_ASC_CON);
 
/* set up to use divisor of 2 */
-   ltq_w32_mask(ASCCON_BRS, 0, port->membase + LTQ_ASC_CON);
+   asc_update_bits(ASCCON_BRS, 0, port->membase + LTQ_ASC_CON);
 
/* now we can write the new baudrate into the register */
ltq_w32(divisor, port->membase + LTQ_ASC_BG);
 
/* turn the baudrat

[PATCH 02/14] MIPS: dts: Add aliases node for lantiq danube serial

2018-09-24 Thread Songjun Wu
Previous implementation uses a hard-coded register value to check
if the current serial entity is the console entity.
Now the lantiq serial driver uses the aliases for the index of the
serial port.
The lantiq danube serial dts are updated with aliases to support this.

Signed-off-by: Songjun Wu 
---

 arch/mips/boot/dts/lantiq/danube.dtsi   | 2 +-
 arch/mips/boot/dts/lantiq/easy50712.dts | 4 
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/arch/mips/boot/dts/lantiq/danube.dtsi 
b/arch/mips/boot/dts/lantiq/danube.dtsi
index 510be63c8bdf..73746d7577d7 100644
--- a/arch/mips/boot/dts/lantiq/danube.dtsi
+++ b/arch/mips/boot/dts/lantiq/danube.dtsi
@@ -74,7 +74,7 @@
reg = <0xe100a00 0x100>;
};
 
-   serial@e100c00 {
+   asc1: serial@e100c00 {
compatible = "lantiq,asc";
reg = <0xe100c00 0x400>;
interrupt-parent = <>;
diff --git a/arch/mips/boot/dts/lantiq/easy50712.dts 
b/arch/mips/boot/dts/lantiq/easy50712.dts
index 1ce20b7d05cb..452860ca1868 100644
--- a/arch/mips/boot/dts/lantiq/easy50712.dts
+++ b/arch/mips/boot/dts/lantiq/easy50712.dts
@@ -4,6 +4,10 @@
 /include/ "danube.dtsi"
 
 / {
+   aliases {
+   serial0 = 
+   };
+
chosen {
bootargs = "console=ttyLTQ0,115200 init=/etc/preinit";
};
-- 
2.11.0



[PATCH 07/14] serial: lantiq: Rename fpiclk to freqclk

2018-09-24 Thread Songjun Wu
fpiclk is platform specific, freqclk is more generic.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 10 +-
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index e351f80996d3..4acdbdf8fe7a 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -105,7 +105,7 @@ static DEFINE_SPINLOCK(ltq_asc_lock);
 struct ltq_uart_port {
struct uart_portport;
/* clock used to derive divider */
-   struct clk  *fpiclk;
+   struct clk  *freqclk;
/* clock gating of the ASC core */
struct clk  *clk;
unsigned inttx_irq;
@@ -309,7 +309,7 @@ lqasc_startup(struct uart_port *port)
 
if (!IS_ERR(ltq_port->clk))
clk_enable(ltq_port->clk);
-   port->uartclk = clk_get_rate(ltq_port->fpiclk);
+   port->uartclk = clk_get_rate(ltq_port->freqclk);
 
asc_update_bits(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
port->membase + LTQ_ASC_CLC);
@@ -632,7 +632,7 @@ lqasc_console_setup(struct console *co, char *options)
if (!IS_ERR(ltq_port->clk))
clk_enable(ltq_port->clk);
 
-   port->uartclk = clk_get_rate(ltq_port->fpiclk);
+   port->uartclk = clk_get_rate(ltq_port->freqclk);
 
if (options)
uart_parse_options(options, , , , );
@@ -744,8 +744,8 @@ lqasc_probe(struct platform_device *pdev)
port->irq   = irqres[0].start;
port->mapbase   = mmres->start;
 
-   ltq_port->fpiclk = clk_get_fpi();
-   if (IS_ERR(ltq_port->fpiclk)) {
+   ltq_port->freqclk = clk_get_fpi();
+   if (IS_ERR(ltq_port->freqclk)) {
pr_err("failed to get fpi clk\n");
return -ENOENT;
}
-- 
2.11.0



[PATCH 04/14] serial: lantiq: Change ltq_w32_mask to asc_update_bits

2018-09-24 Thread Songjun Wu
ltq prefix is platform specific function, asc prefix
is more generic.

Signed-off-by: Songjun Wu 
---

 drivers/tty/serial/lantiq.c | 33 -
 1 file changed, 20 insertions(+), 13 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 66c671677761..4c14608b8ef8 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -113,6 +113,13 @@ struct ltq_uart_port {
unsigned interr_irq;
 };
 
+static inline void asc_update_bits(u32 clear, u32 set, void __iomem *reg)
+{
+   u32 tmp = readl(reg);
+
+   writel((tmp & ~clear) | set, reg);
+}
+
 static inline struct
 ltq_uart_port *to_ltq_uart_port(struct uart_port *port)
 {
@@ -163,16 +170,16 @@ lqasc_rx_chars(struct uart_port *port)
if (rsr & ASCSTATE_ANY) {
if (rsr & ASCSTATE_PE) {
port->icount.parity++;
-   ltq_w32_mask(0, ASCWHBSTATE_CLRPE,
+   asc_update_bits(0, ASCWHBSTATE_CLRPE,
port->membase + LTQ_ASC_WHBSTATE);
} else if (rsr & ASCSTATE_FE) {
port->icount.frame++;
-   ltq_w32_mask(0, ASCWHBSTATE_CLRFE,
+   asc_update_bits(0, ASCWHBSTATE_CLRFE,
port->membase + LTQ_ASC_WHBSTATE);
}
if (rsr & ASCSTATE_ROE) {
port->icount.overrun++;
-   ltq_w32_mask(0, ASCWHBSTATE_CLRROE,
+   asc_update_bits(0, ASCWHBSTATE_CLRROE,
port->membase + LTQ_ASC_WHBSTATE);
}
 
@@ -252,7 +259,7 @@ lqasc_err_int(int irq, void *_port)
struct uart_port *port = (struct uart_port *)_port;
spin_lock_irqsave(_asc_lock, flags);
/* clear any pending interrupts */
-   ltq_w32_mask(0, ASCWHBSTATE_CLRPE | ASCWHBSTATE_CLRFE |
+   asc_update_bits(0, ASCWHBSTATE_CLRPE | ASCWHBSTATE_CLRFE |
ASCWHBSTATE_CLRROE, port->membase + LTQ_ASC_WHBSTATE);
spin_unlock_irqrestore(_asc_lock, flags);
return IRQ_HANDLED;
@@ -304,7 +311,7 @@ lqasc_startup(struct uart_port *port)
clk_enable(ltq_port->clk);
port->uartclk = clk_get_rate(ltq_port->fpiclk);
 
-   ltq_w32_mask(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
+   asc_update_bits(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
port->membase + LTQ_ASC_CLC);
 
ltq_w32(0, port->membase + LTQ_ASC_PISEL);
@@ -320,7 +327,7 @@ lqasc_startup(struct uart_port *port)
 * setting enable bits
 */
wmb();
-   ltq_w32_mask(0, ASCCON_M_8ASYNC | ASCCON_FEN | ASCCON_TOEN |
+   asc_update_bits(0, ASCCON_M_8ASYNC | ASCCON_FEN | ASCCON_TOEN |
ASCCON_ROEN, port->membase + LTQ_ASC_CON);
 
retval = request_irq(ltq_port->tx_irq, lqasc_tx_int,
@@ -364,9 +371,9 @@ lqasc_shutdown(struct uart_port *port)
free_irq(ltq_port->err_irq, port);
 
ltq_w32(0, port->membase + LTQ_ASC_CON);
-   ltq_w32_mask(ASCRXFCON_RXFEN, ASCRXFCON_RXFFLU,
+   asc_update_bits(ASCRXFCON_RXFEN, ASCRXFCON_RXFFLU,
port->membase + LTQ_ASC_RXFCON);
-   ltq_w32_mask(ASCTXFCON_TXFEN, ASCTXFCON_TXFFLU,
+   asc_update_bits(ASCTXFCON_TXFEN, ASCTXFCON_TXFFLU,
port->membase + LTQ_ASC_TXFCON);
if (!IS_ERR(ltq_port->clk))
clk_disable(ltq_port->clk);
@@ -438,7 +445,7 @@ lqasc_set_termios(struct uart_port *port,
spin_lock_irqsave(_asc_lock, flags);
 
/* set up CON */
-   ltq_w32_mask(0, con, port->membase + LTQ_ASC_CON);
+   asc_update_bits(0, con, port->membase + LTQ_ASC_CON);
 
/* Set baud rate - take a divider of 2 into account */
baud = uart_get_baud_rate(port, new, old, 0, port->uartclk / 16);
@@ -446,19 +453,19 @@ lqasc_set_termios(struct uart_port *port,
divisor = divisor / 2 - 1;
 
/* disable the baudrate generator */
-   ltq_w32_mask(ASCCON_R, 0, port->membase + LTQ_ASC_CON);
+   asc_update_bits(ASCCON_R, 0, port->membase + LTQ_ASC_CON);
 
/* make sure the fractional divider is off */
-   ltq_w32_mask(ASCCON_FDE, 0, port->membase + LTQ_ASC_CON);
+   asc_update_bits(ASCCON_FDE, 0, port->membase + LTQ_ASC_CON);
 
/* set up to use divisor of 2 */
-   ltq_w32_mask(ASCCON_BRS, 0, port->membase + LTQ_ASC_CON);
+   asc_update_bits(ASCCON_BRS, 0, port->membase + LTQ_ASC_CON);
 
/* now we can write the new baudrate into the register */
ltq_w32(divisor, port->membase + LTQ_ASC_BG);
 
/* turn the baudrat

[PATCH v2 12/18] serial: intel: Rename fpiclk to freqclk

2018-08-02 Thread Songjun Wu
Rename fpiclk to freqclk.

Signed-off-by: Songjun Wu 
---

Changes in v2: None

 drivers/tty/serial/lantiq.c | 10 +-
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 2e1b35b1cf4d..28086d52e980 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -106,7 +106,7 @@ static DEFINE_SPINLOCK(ltq_asc_lock);
 struct ltq_uart_port {
struct uart_portport;
/* clock used to derive divider */
-   struct clk  *fpiclk;
+   struct clk  *freqclk;
/* clock gating of the ASC core */
struct clk  *clk;
unsigned inttx_irq;
@@ -310,7 +310,7 @@ lqasc_startup(struct uart_port *port)
 
if (!IS_ERR(ltq_port->clk))
clk_enable(ltq_port->clk);
-   port->uartclk = clk_get_rate(ltq_port->fpiclk);
+   port->uartclk = clk_get_rate(ltq_port->freqclk);
 
asc_update_bits(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
port->membase + LTQ_ASC_CLC);
@@ -633,7 +633,7 @@ lqasc_console_setup(struct console *co, char *options)
if (!IS_ERR(ltq_port->clk))
clk_enable(ltq_port->clk);
 
-   port->uartclk = clk_get_rate(ltq_port->fpiclk);
+   port->uartclk = clk_get_rate(ltq_port->freqclk);
 
if (options)
uart_parse_options(options, , , , );
@@ -744,8 +744,8 @@ lqasc_probe(struct platform_device *pdev)
port->irq   = irqres[0].start;
port->mapbase   = mmres->start;
 
-   ltq_port->fpiclk = clk_get_fpi();
-   if (IS_ERR(ltq_port->fpiclk)) {
+   ltq_port->freqclk = clk_get_fpi();
+   if (IS_ERR(ltq_port->freqclk)) {
pr_err("failed to get fpi clk\n");
return -ENOENT;
}
-- 
2.11.0



[PATCH v2 12/18] serial: intel: Rename fpiclk to freqclk

2018-08-02 Thread Songjun Wu
Rename fpiclk to freqclk.

Signed-off-by: Songjun Wu 
---

Changes in v2: None

 drivers/tty/serial/lantiq.c | 10 +-
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 2e1b35b1cf4d..28086d52e980 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -106,7 +106,7 @@ static DEFINE_SPINLOCK(ltq_asc_lock);
 struct ltq_uart_port {
struct uart_portport;
/* clock used to derive divider */
-   struct clk  *fpiclk;
+   struct clk  *freqclk;
/* clock gating of the ASC core */
struct clk  *clk;
unsigned inttx_irq;
@@ -310,7 +310,7 @@ lqasc_startup(struct uart_port *port)
 
if (!IS_ERR(ltq_port->clk))
clk_enable(ltq_port->clk);
-   port->uartclk = clk_get_rate(ltq_port->fpiclk);
+   port->uartclk = clk_get_rate(ltq_port->freqclk);
 
asc_update_bits(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
port->membase + LTQ_ASC_CLC);
@@ -633,7 +633,7 @@ lqasc_console_setup(struct console *co, char *options)
if (!IS_ERR(ltq_port->clk))
clk_enable(ltq_port->clk);
 
-   port->uartclk = clk_get_rate(ltq_port->fpiclk);
+   port->uartclk = clk_get_rate(ltq_port->freqclk);
 
if (options)
uart_parse_options(options, , , , );
@@ -744,8 +744,8 @@ lqasc_probe(struct platform_device *pdev)
port->irq   = irqres[0].start;
port->mapbase   = mmres->start;
 
-   ltq_port->fpiclk = clk_get_fpi();
-   if (IS_ERR(ltq_port->fpiclk)) {
+   ltq_port->freqclk = clk_get_fpi();
+   if (IS_ERR(ltq_port->freqclk)) {
pr_err("failed to get fpi clk\n");
return -ENOENT;
}
-- 
2.11.0



[PATCH v2 17/18] serial: intel: Change init_lqasc to static declaration

2018-08-02 Thread Songjun Wu
init_lqasc() is only used internally, change to static declaration.

Signed-off-by: Songjun Wu 
---

Changes in v2: None

 drivers/tty/serial/lantiq.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 804aad60ed80..2bb8e37e6886 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -788,7 +788,7 @@ static struct platform_driver lqasc_driver = {
},
 };
 
-int __init
+static int __init
 init_lqasc(void)
 {
int ret;
-- 
2.11.0



[PATCH v2 18/18] dt-bindings: serial: lantiq: Add optional properties for CCF

2018-08-02 Thread Songjun Wu
Clocks and clock-names are updated in device tree binding.

Signed-off-by: Songjun Wu 
---

Changes in v2: None

 Documentation/devicetree/bindings/serial/lantiq_asc.txt | 15 +++
 1 file changed, 15 insertions(+)

diff --git a/Documentation/devicetree/bindings/serial/lantiq_asc.txt 
b/Documentation/devicetree/bindings/serial/lantiq_asc.txt
index 3acbd309ab9d..40e81a5818f6 100644
--- a/Documentation/devicetree/bindings/serial/lantiq_asc.txt
+++ b/Documentation/devicetree/bindings/serial/lantiq_asc.txt
@@ -6,8 +6,23 @@ Required properties:
 - interrupts: the 3 (tx rx err) interrupt numbers. The interrupt specifier
   depends on the interrupt-parent interrupt controller.
 
+Optional properties:
+- clocks: Should contain frequency clock and gate clock
+- clock-names: Should be "freq" and "asc"
+
 Example:
 
+asc0: serial@1660 {
+   compatible = "lantiq,asc";
+   reg = <0x1660 0x10>;
+   interrupt-parent = <>;
+   interrupts = ,
+   ,
+   ;
+   clocks = < CLK_SSX4>, < GCLK_UART>;
+   clock-names = "freq", "asc";
+};
+
 asc1: serial@e100c00 {
compatible = "lantiq,asc";
reg = <0xE100C00 0x400>;
-- 
2.11.0



[PATCH v2 17/18] serial: intel: Change init_lqasc to static declaration

2018-08-02 Thread Songjun Wu
init_lqasc() is only used internally, change to static declaration.

Signed-off-by: Songjun Wu 
---

Changes in v2: None

 drivers/tty/serial/lantiq.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 804aad60ed80..2bb8e37e6886 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -788,7 +788,7 @@ static struct platform_driver lqasc_driver = {
},
 };
 
-int __init
+static int __init
 init_lqasc(void)
 {
int ret;
-- 
2.11.0



[PATCH v2 18/18] dt-bindings: serial: lantiq: Add optional properties for CCF

2018-08-02 Thread Songjun Wu
Clocks and clock-names are updated in device tree binding.

Signed-off-by: Songjun Wu 
---

Changes in v2: None

 Documentation/devicetree/bindings/serial/lantiq_asc.txt | 15 +++
 1 file changed, 15 insertions(+)

diff --git a/Documentation/devicetree/bindings/serial/lantiq_asc.txt 
b/Documentation/devicetree/bindings/serial/lantiq_asc.txt
index 3acbd309ab9d..40e81a5818f6 100644
--- a/Documentation/devicetree/bindings/serial/lantiq_asc.txt
+++ b/Documentation/devicetree/bindings/serial/lantiq_asc.txt
@@ -6,8 +6,23 @@ Required properties:
 - interrupts: the 3 (tx rx err) interrupt numbers. The interrupt specifier
   depends on the interrupt-parent interrupt controller.
 
+Optional properties:
+- clocks: Should contain frequency clock and gate clock
+- clock-names: Should be "freq" and "asc"
+
 Example:
 
+asc0: serial@1660 {
+   compatible = "lantiq,asc";
+   reg = <0x1660 0x10>;
+   interrupt-parent = <>;
+   interrupts = ,
+   ,
+   ;
+   clocks = < CLK_SSX4>, < GCLK_UART>;
+   clock-names = "freq", "asc";
+};
+
 asc1: serial@e100c00 {
compatible = "lantiq,asc";
reg = <0xE100C00 0x400>;
-- 
2.11.0



[PATCH v2 14/18] serial: intel: Add CCF support

2018-08-02 Thread Songjun Wu
Previous implementation uses platform-dependent API to get the clock.
Those functions are not available for other SoC which uses the same IP.
The CCF (Common Clock Framework) have an abstraction based APIs for
clock. In future, the platform specific code will be removed when the
legacy soc use CCF as well.
Change to use CCF APIs to get clock and rate. So that different SoCs
can use the same driver.

Signed-off-by: Songjun Wu 
---

Changes in v2: None

 drivers/tty/serial/lantiq.c | 11 +++
 1 file changed, 11 insertions(+)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 36479d66fb7c..35518ab3a80d 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -26,7 +26,9 @@
 #include 
 #include 
 
+#ifdef CONFIG_LANTIQ
 #include 
+#endif
 
 #define PORT_LTQ_ASC   111
 #define MAXPORTS   2
@@ -744,14 +746,23 @@ lqasc_probe(struct platform_device *pdev)
port->irq   = irqres[0].start;
port->mapbase   = mmres->start;
 
+#if (IS_ENABLED(CONFIG_LANTIQ) && !IS_ENABLED(CONFIG_COMMON_CLK))
ltq_port->freqclk = clk_get_fpi();
+#else
+   ltq_port->freqclk = devm_clk_get(>dev, "freq");
+#endif
+
if (IS_ERR(ltq_port->freqclk)) {
pr_err("failed to get fpi clk\n");
return -ENOENT;
}
 
/* not all asc ports have clock gates, lets ignore the return code */
+#if (IS_ENABLED(CONFIG_LANTIQ) && !IS_ENABLED(CONFIG_COMMON_CLK))
ltq_port->clk = clk_get(>dev, NULL);
+#else
+   ltq_port->clk = devm_clk_get(>dev, "asc");
+#endif
 
ltq_port->tx_irq = irqres[0].start;
ltq_port->rx_irq = irqres[1].start;
-- 
2.11.0



[PATCH v2 07/18] MIPS: dts: Add aliases node for lantiq danube serial

2018-08-02 Thread Songjun Wu
Previous implementation uses a hard-coded register value to check
if the current serial entity is the console entity.
Now the lantiq serial driver uses the aliases for the index of the
serial port.
The lantiq danube serial dts are updated with aliases to support this.

Signed-off-by: Songjun Wu 
---

Changes in v2: None

 arch/mips/boot/dts/lantiq/danube.dtsi   | 2 +-
 arch/mips/boot/dts/lantiq/easy50712.dts | 4 
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/arch/mips/boot/dts/lantiq/danube.dtsi 
b/arch/mips/boot/dts/lantiq/danube.dtsi
index 510be63c8bdf..73746d7577d7 100644
--- a/arch/mips/boot/dts/lantiq/danube.dtsi
+++ b/arch/mips/boot/dts/lantiq/danube.dtsi
@@ -74,7 +74,7 @@
reg = <0xe100a00 0x100>;
};
 
-   serial@e100c00 {
+   asc1: serial@e100c00 {
compatible = "lantiq,asc";
reg = <0xe100c00 0x400>;
interrupt-parent = <>;
diff --git a/arch/mips/boot/dts/lantiq/easy50712.dts 
b/arch/mips/boot/dts/lantiq/easy50712.dts
index 1ce20b7d05cb..452860ca1868 100644
--- a/arch/mips/boot/dts/lantiq/easy50712.dts
+++ b/arch/mips/boot/dts/lantiq/easy50712.dts
@@ -4,6 +4,10 @@
 /include/ "danube.dtsi"
 
 / {
+   aliases {
+   serial0 = 
+   };
+
chosen {
bootargs = "console=ttyLTQ0,115200 init=/etc/preinit";
};
-- 
2.11.0



[PATCH v2 09/18] serial: intel: Change ltq_w32_mask to asc_update_bits

2018-08-02 Thread Songjun Wu
ltq prefix is platform specific function, asc prefix
is more generic.

Signed-off-by: Songjun Wu 
---

Changes in v2: None

 drivers/tty/serial/lantiq.c | 33 -
 1 file changed, 20 insertions(+), 13 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 836ca51460f2..e36e6a267e7a 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -114,6 +114,13 @@ struct ltq_uart_port {
unsigned interr_irq;
 };
 
+static inline void asc_update_bits(u32 clear, u32 set, void __iomem *reg)
+{
+   u32 tmp = readl(reg);
+
+   writel((tmp & ~clear) | set, reg);
+}
+
 static inline struct
 ltq_uart_port *to_ltq_uart_port(struct uart_port *port)
 {
@@ -164,16 +171,16 @@ lqasc_rx_chars(struct uart_port *port)
if (rsr & ASCSTATE_ANY) {
if (rsr & ASCSTATE_PE) {
port->icount.parity++;
-   ltq_w32_mask(0, ASCWHBSTATE_CLRPE,
+   asc_update_bits(0, ASCWHBSTATE_CLRPE,
port->membase + LTQ_ASC_WHBSTATE);
} else if (rsr & ASCSTATE_FE) {
port->icount.frame++;
-   ltq_w32_mask(0, ASCWHBSTATE_CLRFE,
+   asc_update_bits(0, ASCWHBSTATE_CLRFE,
port->membase + LTQ_ASC_WHBSTATE);
}
if (rsr & ASCSTATE_ROE) {
port->icount.overrun++;
-   ltq_w32_mask(0, ASCWHBSTATE_CLRROE,
+   asc_update_bits(0, ASCWHBSTATE_CLRROE,
port->membase + LTQ_ASC_WHBSTATE);
}
 
@@ -253,7 +260,7 @@ lqasc_err_int(int irq, void *_port)
struct uart_port *port = (struct uart_port *)_port;
spin_lock_irqsave(_asc_lock, flags);
/* clear any pending interrupts */
-   ltq_w32_mask(0, ASCWHBSTATE_CLRPE | ASCWHBSTATE_CLRFE |
+   asc_update_bits(0, ASCWHBSTATE_CLRPE | ASCWHBSTATE_CLRFE |
ASCWHBSTATE_CLRROE, port->membase + LTQ_ASC_WHBSTATE);
spin_unlock_irqrestore(_asc_lock, flags);
return IRQ_HANDLED;
@@ -305,7 +312,7 @@ lqasc_startup(struct uart_port *port)
clk_enable(ltq_port->clk);
port->uartclk = clk_get_rate(ltq_port->fpiclk);
 
-   ltq_w32_mask(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
+   asc_update_bits(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
port->membase + LTQ_ASC_CLC);
 
ltq_w32(0, port->membase + LTQ_ASC_PISEL);
@@ -321,7 +328,7 @@ lqasc_startup(struct uart_port *port)
 * setting enable bits
 */
wmb();
-   ltq_w32_mask(0, ASCCON_M_8ASYNC | ASCCON_FEN | ASCCON_TOEN |
+   asc_update_bits(0, ASCCON_M_8ASYNC | ASCCON_FEN | ASCCON_TOEN |
ASCCON_ROEN, port->membase + LTQ_ASC_CON);
 
retval = request_irq(ltq_port->tx_irq, lqasc_tx_int,
@@ -365,9 +372,9 @@ lqasc_shutdown(struct uart_port *port)
free_irq(ltq_port->err_irq, port);
 
ltq_w32(0, port->membase + LTQ_ASC_CON);
-   ltq_w32_mask(ASCRXFCON_RXFEN, ASCRXFCON_RXFFLU,
+   asc_update_bits(ASCRXFCON_RXFEN, ASCRXFCON_RXFFLU,
port->membase + LTQ_ASC_RXFCON);
-   ltq_w32_mask(ASCTXFCON_TXFEN, ASCTXFCON_TXFFLU,
+   asc_update_bits(ASCTXFCON_TXFEN, ASCTXFCON_TXFFLU,
port->membase + LTQ_ASC_TXFCON);
if (!IS_ERR(ltq_port->clk))
clk_disable(ltq_port->clk);
@@ -439,7 +446,7 @@ lqasc_set_termios(struct uart_port *port,
spin_lock_irqsave(_asc_lock, flags);
 
/* set up CON */
-   ltq_w32_mask(0, con, port->membase + LTQ_ASC_CON);
+   asc_update_bits(0, con, port->membase + LTQ_ASC_CON);
 
/* Set baud rate - take a divider of 2 into account */
baud = uart_get_baud_rate(port, new, old, 0, port->uartclk / 16);
@@ -447,19 +454,19 @@ lqasc_set_termios(struct uart_port *port,
divisor = divisor / 2 - 1;
 
/* disable the baudrate generator */
-   ltq_w32_mask(ASCCON_R, 0, port->membase + LTQ_ASC_CON);
+   asc_update_bits(ASCCON_R, 0, port->membase + LTQ_ASC_CON);
 
/* make sure the fractional divider is off */
-   ltq_w32_mask(ASCCON_FDE, 0, port->membase + LTQ_ASC_CON);
+   asc_update_bits(ASCCON_FDE, 0, port->membase + LTQ_ASC_CON);
 
/* set up to use divisor of 2 */
-   ltq_w32_mask(ASCCON_BRS, 0, port->membase + LTQ_ASC_CON);
+   asc_update_bits(ASCCON_BRS, 0, port->membase + LTQ_ASC_CON);
 
/* now we can write the new baudrate into the register */
ltq_w32(divisor, port->membase + LTQ_

[PATCH v2 15/18] serial: intel: Support more platform

2018-08-02 Thread Songjun Wu
Support more platform.

Signed-off-by: Songjun Wu 
---

Changes in v2: None

 drivers/tty/serial/Kconfig | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig
index df8bd0c7b97d..564c71fc24bb 100644
--- a/drivers/tty/serial/Kconfig
+++ b/drivers/tty/serial/Kconfig
@@ -1062,7 +1062,7 @@ config SERIAL_OMAP_CONSOLE
 
 config SERIAL_LANTIQ
bool "Lantiq serial driver"
-   depends on LANTIQ
+   depends on LANTIQ || INTEL_MIPS || COMPILE_TEST
select SERIAL_CORE
select SERIAL_CORE_CONSOLE
select SERIAL_EARLYCON
-- 
2.11.0



[PATCH v2 11/18] serial: intel: Use readl/writel instead of ltq_r32/ltq_w32

2018-08-02 Thread Songjun Wu
Previous implementation uses platform-dependent functions
ltq_w32()/ltq_r32() to access registers. Those functions are not
available for other SoC which uses the same IP.
Change to OS provided readl()/writel() and readb()/writeb(), so
that different SoCs can use the same driver.

Signed-off-by: Songjun Wu 
---

Changes in v2: None

 drivers/tty/serial/lantiq.c | 38 +++---
 1 file changed, 19 insertions(+), 19 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index e36e6a267e7a..2e1b35b1cf4d 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -146,7 +146,7 @@ lqasc_start_tx(struct uart_port *port)
 static void
 lqasc_stop_rx(struct uart_port *port)
 {
-   ltq_w32(ASCWHBSTATE_CLRREN, port->membase + LTQ_ASC_WHBSTATE);
+   writel(ASCWHBSTATE_CLRREN, port->membase + LTQ_ASC_WHBSTATE);
 }
 
 static int
@@ -155,11 +155,11 @@ lqasc_rx_chars(struct uart_port *port)
struct tty_port *tport = >state->port;
unsigned int ch = 0, rsr = 0, fifocnt;
 
-   fifocnt = ltq_r32(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_RXFFLMASK;
+   fifocnt = readl(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_RXFFLMASK;
while (fifocnt--) {
u8 flag = TTY_NORMAL;
-   ch = ltq_r8(port->membase + LTQ_ASC_RBUF);
-   rsr = (ltq_r32(port->membase + LTQ_ASC_STATE)
+   ch = readb(port->membase + LTQ_ASC_RBUF);
+   rsr = (readl(port->membase + LTQ_ASC_STATE)
& ASCSTATE_ANY) | UART_DUMMY_UER_RX;
tty_flip_buffer_push(tport);
port->icount.rx++;
@@ -219,10 +219,10 @@ lqasc_tx_chars(struct uart_port *port)
return;
}
 
-   while (((ltq_r32(port->membase + LTQ_ASC_FSTAT) &
+   while (((readl(port->membase + LTQ_ASC_FSTAT) &
ASCFSTAT_TXFREEMASK) >> ASCFSTAT_TXFREEOFF) != 0) {
if (port->x_char) {
-   ltq_w8(port->x_char, port->membase + LTQ_ASC_TBUF);
+   writeb(port->x_char, port->membase + LTQ_ASC_TBUF);
port->icount.tx++;
port->x_char = 0;
continue;
@@ -231,7 +231,7 @@ lqasc_tx_chars(struct uart_port *port)
if (uart_circ_empty(xmit))
break;
 
-   ltq_w8(port->state->xmit.buf[port->state->xmit.tail],
+   writeb(port->state->xmit.buf[port->state->xmit.tail],
port->membase + LTQ_ASC_TBUF);
xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
port->icount.tx++;
@@ -247,7 +247,7 @@ lqasc_tx_int(int irq, void *_port)
unsigned long flags;
struct uart_port *port = (struct uart_port *)_port;
spin_lock_irqsave(_asc_lock, flags);
-   ltq_w32(ASC_IRNCR_TIR, port->membase + LTQ_ASC_IRNCR);
+   writel(ASC_IRNCR_TIR, port->membase + LTQ_ASC_IRNCR);
spin_unlock_irqrestore(_asc_lock, flags);
lqasc_start_tx(port);
return IRQ_HANDLED;
@@ -272,7 +272,7 @@ lqasc_rx_int(int irq, void *_port)
unsigned long flags;
struct uart_port *port = (struct uart_port *)_port;
spin_lock_irqsave(_asc_lock, flags);
-   ltq_w32(ASC_IRNCR_RIR, port->membase + LTQ_ASC_IRNCR);
+   writel(ASC_IRNCR_RIR, port->membase + LTQ_ASC_IRNCR);
lqasc_rx_chars(port);
spin_unlock_irqrestore(_asc_lock, flags);
return IRQ_HANDLED;
@@ -282,7 +282,7 @@ static unsigned int
 lqasc_tx_empty(struct uart_port *port)
 {
int status;
-   status = ltq_r32(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_TXFFLMASK;
+   status = readl(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_TXFFLMASK;
return status ? 0 : TIOCSER_TEMT;
 }
 
@@ -315,12 +315,12 @@ lqasc_startup(struct uart_port *port)
asc_update_bits(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
port->membase + LTQ_ASC_CLC);
 
-   ltq_w32(0, port->membase + LTQ_ASC_PISEL);
-   ltq_w32(
+   writel(0, port->membase + LTQ_ASC_PISEL);
+   writel(
((TXFIFO_FL << ASCTXFCON_TXFITLOFF) & ASCTXFCON_TXFITLMASK) |
ASCTXFCON_TXFEN | ASCTXFCON_TXFFLU,
port->membase + LTQ_ASC_TXFCON);
-   ltq_w32(
+   writel(
((RXFIFO_FL << ASCRXFCON_RXFITLOFF) & ASCRXFCON_RXFITLMASK)
| ASCRXFCON_RXFEN | ASCRXFCON_RXFFLU,
port->membase + LTQ_ASC_RXFCON);
@@ -352,7 +352,7 @@ lqasc_startup(struct uart_port *port)
goto err2;
}
 
-   ltq_w32(ASC_IRNREN_RX | ASC_IRNREN_ERR | ASC_IRNREN_TX,
+   writel(ASC_IRNREN_RX | ASC_IRNREN_ERR | ASC_IRNREN_TX,
p

[PATCH v2 14/18] serial: intel: Add CCF support

2018-08-02 Thread Songjun Wu
Previous implementation uses platform-dependent API to get the clock.
Those functions are not available for other SoC which uses the same IP.
The CCF (Common Clock Framework) have an abstraction based APIs for
clock. In future, the platform specific code will be removed when the
legacy soc use CCF as well.
Change to use CCF APIs to get clock and rate. So that different SoCs
can use the same driver.

Signed-off-by: Songjun Wu 
---

Changes in v2: None

 drivers/tty/serial/lantiq.c | 11 +++
 1 file changed, 11 insertions(+)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 36479d66fb7c..35518ab3a80d 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -26,7 +26,9 @@
 #include 
 #include 
 
+#ifdef CONFIG_LANTIQ
 #include 
+#endif
 
 #define PORT_LTQ_ASC   111
 #define MAXPORTS   2
@@ -744,14 +746,23 @@ lqasc_probe(struct platform_device *pdev)
port->irq   = irqres[0].start;
port->mapbase   = mmres->start;
 
+#if (IS_ENABLED(CONFIG_LANTIQ) && !IS_ENABLED(CONFIG_COMMON_CLK))
ltq_port->freqclk = clk_get_fpi();
+#else
+   ltq_port->freqclk = devm_clk_get(>dev, "freq");
+#endif
+
if (IS_ERR(ltq_port->freqclk)) {
pr_err("failed to get fpi clk\n");
return -ENOENT;
}
 
/* not all asc ports have clock gates, lets ignore the return code */
+#if (IS_ENABLED(CONFIG_LANTIQ) && !IS_ENABLED(CONFIG_COMMON_CLK))
ltq_port->clk = clk_get(>dev, NULL);
+#else
+   ltq_port->clk = devm_clk_get(>dev, "asc");
+#endif
 
ltq_port->tx_irq = irqres[0].start;
ltq_port->rx_irq = irqres[1].start;
-- 
2.11.0



[PATCH v2 07/18] MIPS: dts: Add aliases node for lantiq danube serial

2018-08-02 Thread Songjun Wu
Previous implementation uses a hard-coded register value to check
if the current serial entity is the console entity.
Now the lantiq serial driver uses the aliases for the index of the
serial port.
The lantiq danube serial dts are updated with aliases to support this.

Signed-off-by: Songjun Wu 
---

Changes in v2: None

 arch/mips/boot/dts/lantiq/danube.dtsi   | 2 +-
 arch/mips/boot/dts/lantiq/easy50712.dts | 4 
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/arch/mips/boot/dts/lantiq/danube.dtsi 
b/arch/mips/boot/dts/lantiq/danube.dtsi
index 510be63c8bdf..73746d7577d7 100644
--- a/arch/mips/boot/dts/lantiq/danube.dtsi
+++ b/arch/mips/boot/dts/lantiq/danube.dtsi
@@ -74,7 +74,7 @@
reg = <0xe100a00 0x100>;
};
 
-   serial@e100c00 {
+   asc1: serial@e100c00 {
compatible = "lantiq,asc";
reg = <0xe100c00 0x400>;
interrupt-parent = <>;
diff --git a/arch/mips/boot/dts/lantiq/easy50712.dts 
b/arch/mips/boot/dts/lantiq/easy50712.dts
index 1ce20b7d05cb..452860ca1868 100644
--- a/arch/mips/boot/dts/lantiq/easy50712.dts
+++ b/arch/mips/boot/dts/lantiq/easy50712.dts
@@ -4,6 +4,10 @@
 /include/ "danube.dtsi"
 
 / {
+   aliases {
+   serial0 = 
+   };
+
chosen {
bootargs = "console=ttyLTQ0,115200 init=/etc/preinit";
};
-- 
2.11.0



[PATCH v2 09/18] serial: intel: Change ltq_w32_mask to asc_update_bits

2018-08-02 Thread Songjun Wu
ltq prefix is platform specific function, asc prefix
is more generic.

Signed-off-by: Songjun Wu 
---

Changes in v2: None

 drivers/tty/serial/lantiq.c | 33 -
 1 file changed, 20 insertions(+), 13 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 836ca51460f2..e36e6a267e7a 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -114,6 +114,13 @@ struct ltq_uart_port {
unsigned interr_irq;
 };
 
+static inline void asc_update_bits(u32 clear, u32 set, void __iomem *reg)
+{
+   u32 tmp = readl(reg);
+
+   writel((tmp & ~clear) | set, reg);
+}
+
 static inline struct
 ltq_uart_port *to_ltq_uart_port(struct uart_port *port)
 {
@@ -164,16 +171,16 @@ lqasc_rx_chars(struct uart_port *port)
if (rsr & ASCSTATE_ANY) {
if (rsr & ASCSTATE_PE) {
port->icount.parity++;
-   ltq_w32_mask(0, ASCWHBSTATE_CLRPE,
+   asc_update_bits(0, ASCWHBSTATE_CLRPE,
port->membase + LTQ_ASC_WHBSTATE);
} else if (rsr & ASCSTATE_FE) {
port->icount.frame++;
-   ltq_w32_mask(0, ASCWHBSTATE_CLRFE,
+   asc_update_bits(0, ASCWHBSTATE_CLRFE,
port->membase + LTQ_ASC_WHBSTATE);
}
if (rsr & ASCSTATE_ROE) {
port->icount.overrun++;
-   ltq_w32_mask(0, ASCWHBSTATE_CLRROE,
+   asc_update_bits(0, ASCWHBSTATE_CLRROE,
port->membase + LTQ_ASC_WHBSTATE);
}
 
@@ -253,7 +260,7 @@ lqasc_err_int(int irq, void *_port)
struct uart_port *port = (struct uart_port *)_port;
spin_lock_irqsave(_asc_lock, flags);
/* clear any pending interrupts */
-   ltq_w32_mask(0, ASCWHBSTATE_CLRPE | ASCWHBSTATE_CLRFE |
+   asc_update_bits(0, ASCWHBSTATE_CLRPE | ASCWHBSTATE_CLRFE |
ASCWHBSTATE_CLRROE, port->membase + LTQ_ASC_WHBSTATE);
spin_unlock_irqrestore(_asc_lock, flags);
return IRQ_HANDLED;
@@ -305,7 +312,7 @@ lqasc_startup(struct uart_port *port)
clk_enable(ltq_port->clk);
port->uartclk = clk_get_rate(ltq_port->fpiclk);
 
-   ltq_w32_mask(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
+   asc_update_bits(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
port->membase + LTQ_ASC_CLC);
 
ltq_w32(0, port->membase + LTQ_ASC_PISEL);
@@ -321,7 +328,7 @@ lqasc_startup(struct uart_port *port)
 * setting enable bits
 */
wmb();
-   ltq_w32_mask(0, ASCCON_M_8ASYNC | ASCCON_FEN | ASCCON_TOEN |
+   asc_update_bits(0, ASCCON_M_8ASYNC | ASCCON_FEN | ASCCON_TOEN |
ASCCON_ROEN, port->membase + LTQ_ASC_CON);
 
retval = request_irq(ltq_port->tx_irq, lqasc_tx_int,
@@ -365,9 +372,9 @@ lqasc_shutdown(struct uart_port *port)
free_irq(ltq_port->err_irq, port);
 
ltq_w32(0, port->membase + LTQ_ASC_CON);
-   ltq_w32_mask(ASCRXFCON_RXFEN, ASCRXFCON_RXFFLU,
+   asc_update_bits(ASCRXFCON_RXFEN, ASCRXFCON_RXFFLU,
port->membase + LTQ_ASC_RXFCON);
-   ltq_w32_mask(ASCTXFCON_TXFEN, ASCTXFCON_TXFFLU,
+   asc_update_bits(ASCTXFCON_TXFEN, ASCTXFCON_TXFFLU,
port->membase + LTQ_ASC_TXFCON);
if (!IS_ERR(ltq_port->clk))
clk_disable(ltq_port->clk);
@@ -439,7 +446,7 @@ lqasc_set_termios(struct uart_port *port,
spin_lock_irqsave(_asc_lock, flags);
 
/* set up CON */
-   ltq_w32_mask(0, con, port->membase + LTQ_ASC_CON);
+   asc_update_bits(0, con, port->membase + LTQ_ASC_CON);
 
/* Set baud rate - take a divider of 2 into account */
baud = uart_get_baud_rate(port, new, old, 0, port->uartclk / 16);
@@ -447,19 +454,19 @@ lqasc_set_termios(struct uart_port *port,
divisor = divisor / 2 - 1;
 
/* disable the baudrate generator */
-   ltq_w32_mask(ASCCON_R, 0, port->membase + LTQ_ASC_CON);
+   asc_update_bits(ASCCON_R, 0, port->membase + LTQ_ASC_CON);
 
/* make sure the fractional divider is off */
-   ltq_w32_mask(ASCCON_FDE, 0, port->membase + LTQ_ASC_CON);
+   asc_update_bits(ASCCON_FDE, 0, port->membase + LTQ_ASC_CON);
 
/* set up to use divisor of 2 */
-   ltq_w32_mask(ASCCON_BRS, 0, port->membase + LTQ_ASC_CON);
+   asc_update_bits(ASCCON_BRS, 0, port->membase + LTQ_ASC_CON);
 
/* now we can write the new baudrate into the register */
ltq_w32(divisor, port->membase + LTQ_

[PATCH v2 15/18] serial: intel: Support more platform

2018-08-02 Thread Songjun Wu
Support more platform.

Signed-off-by: Songjun Wu 
---

Changes in v2: None

 drivers/tty/serial/Kconfig | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig
index df8bd0c7b97d..564c71fc24bb 100644
--- a/drivers/tty/serial/Kconfig
+++ b/drivers/tty/serial/Kconfig
@@ -1062,7 +1062,7 @@ config SERIAL_OMAP_CONSOLE
 
 config SERIAL_LANTIQ
bool "Lantiq serial driver"
-   depends on LANTIQ
+   depends on LANTIQ || INTEL_MIPS || COMPILE_TEST
select SERIAL_CORE
select SERIAL_CORE_CONSOLE
select SERIAL_EARLYCON
-- 
2.11.0



[PATCH v2 11/18] serial: intel: Use readl/writel instead of ltq_r32/ltq_w32

2018-08-02 Thread Songjun Wu
Previous implementation uses platform-dependent functions
ltq_w32()/ltq_r32() to access registers. Those functions are not
available for other SoC which uses the same IP.
Change to OS provided readl()/writel() and readb()/writeb(), so
that different SoCs can use the same driver.

Signed-off-by: Songjun Wu 
---

Changes in v2: None

 drivers/tty/serial/lantiq.c | 38 +++---
 1 file changed, 19 insertions(+), 19 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index e36e6a267e7a..2e1b35b1cf4d 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -146,7 +146,7 @@ lqasc_start_tx(struct uart_port *port)
 static void
 lqasc_stop_rx(struct uart_port *port)
 {
-   ltq_w32(ASCWHBSTATE_CLRREN, port->membase + LTQ_ASC_WHBSTATE);
+   writel(ASCWHBSTATE_CLRREN, port->membase + LTQ_ASC_WHBSTATE);
 }
 
 static int
@@ -155,11 +155,11 @@ lqasc_rx_chars(struct uart_port *port)
struct tty_port *tport = >state->port;
unsigned int ch = 0, rsr = 0, fifocnt;
 
-   fifocnt = ltq_r32(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_RXFFLMASK;
+   fifocnt = readl(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_RXFFLMASK;
while (fifocnt--) {
u8 flag = TTY_NORMAL;
-   ch = ltq_r8(port->membase + LTQ_ASC_RBUF);
-   rsr = (ltq_r32(port->membase + LTQ_ASC_STATE)
+   ch = readb(port->membase + LTQ_ASC_RBUF);
+   rsr = (readl(port->membase + LTQ_ASC_STATE)
& ASCSTATE_ANY) | UART_DUMMY_UER_RX;
tty_flip_buffer_push(tport);
port->icount.rx++;
@@ -219,10 +219,10 @@ lqasc_tx_chars(struct uart_port *port)
return;
}
 
-   while (((ltq_r32(port->membase + LTQ_ASC_FSTAT) &
+   while (((readl(port->membase + LTQ_ASC_FSTAT) &
ASCFSTAT_TXFREEMASK) >> ASCFSTAT_TXFREEOFF) != 0) {
if (port->x_char) {
-   ltq_w8(port->x_char, port->membase + LTQ_ASC_TBUF);
+   writeb(port->x_char, port->membase + LTQ_ASC_TBUF);
port->icount.tx++;
port->x_char = 0;
continue;
@@ -231,7 +231,7 @@ lqasc_tx_chars(struct uart_port *port)
if (uart_circ_empty(xmit))
break;
 
-   ltq_w8(port->state->xmit.buf[port->state->xmit.tail],
+   writeb(port->state->xmit.buf[port->state->xmit.tail],
port->membase + LTQ_ASC_TBUF);
xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
port->icount.tx++;
@@ -247,7 +247,7 @@ lqasc_tx_int(int irq, void *_port)
unsigned long flags;
struct uart_port *port = (struct uart_port *)_port;
spin_lock_irqsave(_asc_lock, flags);
-   ltq_w32(ASC_IRNCR_TIR, port->membase + LTQ_ASC_IRNCR);
+   writel(ASC_IRNCR_TIR, port->membase + LTQ_ASC_IRNCR);
spin_unlock_irqrestore(_asc_lock, flags);
lqasc_start_tx(port);
return IRQ_HANDLED;
@@ -272,7 +272,7 @@ lqasc_rx_int(int irq, void *_port)
unsigned long flags;
struct uart_port *port = (struct uart_port *)_port;
spin_lock_irqsave(_asc_lock, flags);
-   ltq_w32(ASC_IRNCR_RIR, port->membase + LTQ_ASC_IRNCR);
+   writel(ASC_IRNCR_RIR, port->membase + LTQ_ASC_IRNCR);
lqasc_rx_chars(port);
spin_unlock_irqrestore(_asc_lock, flags);
return IRQ_HANDLED;
@@ -282,7 +282,7 @@ static unsigned int
 lqasc_tx_empty(struct uart_port *port)
 {
int status;
-   status = ltq_r32(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_TXFFLMASK;
+   status = readl(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_TXFFLMASK;
return status ? 0 : TIOCSER_TEMT;
 }
 
@@ -315,12 +315,12 @@ lqasc_startup(struct uart_port *port)
asc_update_bits(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
port->membase + LTQ_ASC_CLC);
 
-   ltq_w32(0, port->membase + LTQ_ASC_PISEL);
-   ltq_w32(
+   writel(0, port->membase + LTQ_ASC_PISEL);
+   writel(
((TXFIFO_FL << ASCTXFCON_TXFITLOFF) & ASCTXFCON_TXFITLMASK) |
ASCTXFCON_TXFEN | ASCTXFCON_TXFFLU,
port->membase + LTQ_ASC_TXFCON);
-   ltq_w32(
+   writel(
((RXFIFO_FL << ASCRXFCON_RXFITLOFF) & ASCRXFCON_RXFITLMASK)
| ASCRXFCON_RXFEN | ASCRXFCON_RXFFLU,
port->membase + LTQ_ASC_RXFCON);
@@ -352,7 +352,7 @@ lqasc_startup(struct uart_port *port)
goto err2;
}
 
-   ltq_w32(ASC_IRNREN_RX | ASC_IRNREN_ERR | ASC_IRNREN_TX,
+   writel(ASC_IRNREN_RX | ASC_IRNREN_ERR | ASC_IRNREN_TX,
p

[PATCH v2 16/18] serial: intel: Reorder the head files

2018-08-02 Thread Songjun Wu
Reorder the head files according to the coding style.

Signed-off-by: Songjun Wu 
---

Changes in v2:
- New patch to reorder the head files according to the coding style.

 drivers/tty/serial/lantiq.c | 24 
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 35518ab3a80d..804aad60ed80 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -9,22 +9,22 @@
  * Copyright (C) 2018 Intel Corporation.
  */
 
-#include 
-#include 
-#include 
+#include 
 #include 
-#include 
 #include 
-#include 
-#include 
-#include 
-#include 
-#include 
+#include 
+#include 
+#include 
+#include 
 #include 
 #include 
-#include 
-#include 
-#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
 
 #ifdef CONFIG_LANTIQ
 #include 
-- 
2.11.0



[PATCH v2 06/18] MIPS: dts: Change upper case to lower case

2018-08-02 Thread Songjun Wu
All the upper case in unit-address and hex constants are
changed to lower case according to the Linux conventions.

Signed-off-by: Songjun Wu 
---

Changes in v2: None

 arch/mips/boot/dts/lantiq/danube.dtsi   | 42 -
 arch/mips/boot/dts/lantiq/easy50712.dts | 14 +--
 2 files changed, 28 insertions(+), 28 deletions(-)

diff --git a/arch/mips/boot/dts/lantiq/danube.dtsi 
b/arch/mips/boot/dts/lantiq/danube.dtsi
index 2dd950181f8a..510be63c8bdf 100644
--- a/arch/mips/boot/dts/lantiq/danube.dtsi
+++ b/arch/mips/boot/dts/lantiq/danube.dtsi
@@ -10,12 +10,12 @@
};
};
 
-   biu@1F80 {
+   biu@1f80 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "lantiq,biu", "simple-bus";
-   reg = <0x1F80 0x80>;
-   ranges = <0x0 0x1F80 0x7F>;
+   reg = <0x1f80 0x80>;
+   ranges = <0x0 0x1f80 0x7f>;
 
icu0: icu@80200 {
#interrupt-cells = <1>;
@@ -24,18 +24,18 @@
reg = <0x80200 0x120>;
};
 
-   watchdog@803F0 {
+   watchdog@803f0 {
compatible = "lantiq,wdt";
-   reg = <0x803F0 0x10>;
+   reg = <0x803f0 0x10>;
};
};
 
-   sram@1F00 {
+   sram@1f00 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "lantiq,sram";
-   reg = <0x1F00 0x80>;
-   ranges = <0x0 0x1F00 0x7F>;
+   reg = <0x1f00 0x80>;
+   ranges = <0x0 0x1f00 0x7f>;
 
eiu0: eiu@101000 {
#interrupt-cells = <1>;
@@ -66,41 +66,41 @@
#address-cells = <1>;
#size-cells = <1>;
compatible = "lantiq,fpi", "simple-bus";
-   ranges = <0x0 0x1000 0xEEF>;
-   reg = <0x1000 0xEF0>;
+   ranges = <0x0 0x1000 0xeef>;
+   reg = <0x1000 0xef0>;
 
-   gptu@E100A00 {
+   gptu@e100a00 {
compatible = "lantiq,gptu-xway";
-   reg = <0xE100A00 0x100>;
+   reg = <0xe100a00 0x100>;
};
 
-   serial@E100C00 {
+   serial@e100c00 {
compatible = "lantiq,asc";
-   reg = <0xE100C00 0x400>;
+   reg = <0xe100c00 0x400>;
interrupt-parent = <>;
interrupts = <112 113 114>;
};
 
-   dma0: dma@E104100 {
+   dma0: dma@e104100 {
compatible = "lantiq,dma-xway";
-   reg = <0xE104100 0x800>;
+   reg = <0xe104100 0x800>;
};
 
-   ebu0: ebu@E105300 {
+   ebu0: ebu@e105300 {
compatible = "lantiq,ebu-xway";
-   reg = <0xE105300 0x100>;
+   reg = <0xe105300 0x100>;
};
 
-   pci0: pci@E105400 {
+   pci0: pci@e105400 {
#address-cells = <3>;
#size-cells = <2>;
#interrupt-cells = <1>;
compatible = "lantiq,pci-xway";
bus-range = <0x0 0x0>;
ranges = <0x200 0 0x800 0x800 0 0x200   
/* pci memory */
- 0x100 0 0x 0xAE0 0 0x20>; 
/* io space */
+ 0x100 0 0x 0xae0 0 0x20>; 
/* io space */
reg = <0x700 0x8000 /* config space */
-   0xE105400 0x400>;   /* pci bridge */
+   0xe105400 0x400>;   /* pci bridge */
};
};
 };
diff --git a/arch/mips/boot/dts/lantiq/easy50712.dts 
b/arch/mips/boot/dts/lantiq/easy50712.dts
index c37a33962f28..1ce20b7d05cb 100644
--- a/arch/mips/boot/dts/lantiq/easy50712.dts
+++ b/arch/mips/boot/dts/lantiq/easy50712.dts
@@ -52,14 +52,14 @@
};
};
 
-   gpio: pinmux@E100B10 {
+   gpio: pinmux@e100b10 {
compatible = "lantiq,danube-pinctrl";
p

[PATCH v2 13/18] serial: intel: Replace clk_enable/clk_disable with clk generic API

2018-08-02 Thread Songjun Wu
The clk driver has introduced new clock APIs that replace
the existing clk_enable and clk_disable.
 -clk_enable() APIs is replaced with clk_prepare_enable().
 -clk_disable() API is replaced with clk_disable_unprepare().

Signed-off-by: Songjun Wu 
---

Changes in v2: None

 drivers/tty/serial/lantiq.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 28086d52e980..36479d66fb7c 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -309,7 +309,7 @@ lqasc_startup(struct uart_port *port)
int retval;
 
if (!IS_ERR(ltq_port->clk))
-   clk_enable(ltq_port->clk);
+   clk_prepare_enable(ltq_port->clk);
port->uartclk = clk_get_rate(ltq_port->freqclk);
 
asc_update_bits(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
@@ -377,7 +377,7 @@ lqasc_shutdown(struct uart_port *port)
asc_update_bits(ASCTXFCON_TXFEN, ASCTXFCON_TXFFLU,
port->membase + LTQ_ASC_TXFCON);
if (!IS_ERR(ltq_port->clk))
-   clk_disable(ltq_port->clk);
+   clk_disable_unprepare(ltq_port->clk);
 }
 
 static void
@@ -631,7 +631,7 @@ lqasc_console_setup(struct console *co, char *options)
port = _port->port;
 
if (!IS_ERR(ltq_port->clk))
-   clk_enable(ltq_port->clk);
+   clk_prepare_enable(ltq_port->clk);
 
port->uartclk = clk_get_rate(ltq_port->freqclk);
 
-- 
2.11.0



[PATCH v2 10/18] MIPS: lantiq: Unselect SWAP_IO_SPACE when LANTIQ is selected

2018-08-02 Thread Songjun Wu
SWAP_IO_SPACE macro prevents serial driver /drivers/tty/serial/lantiq.c
to use readl/writel to replace ltq_r32/w32 which are SoC or platform
specific APIs.

readl/writel are used for this serial driver to support multiple
platforms and multiple architectures. The legacy lantiq platform(Danube)
enables SWAP_IO_SPACE for supporting PCI due to some hardware bugs.

It's a little-endian bus plus PCI TX/RX swap enable impacted both data
and control path for MIPS based platforms. But it is better to let PCI
device driver to do endian swap since SWAP_IO_SPACE is a global wide macro
which potentially impacts other peripheral like USB.
ltq_r32/ltq_w32 is not impacted in other device drivers based on MIPS when
SWAP_IO_SPACE is not selected as they use non-byte swapping OS API
(__raw_read/__raw_writel).

Signed-off-by: Songjun Wu 
---

Changes in v2: None

 arch/mips/Kconfig | 1 -
 1 file changed, 1 deletion(-)

diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 2d34f17f3e24..2e7e0b538e52 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -400,7 +400,6 @@ config LANTIQ
select SYS_SUPPORTS_VPE_LOADER
select SYS_HAS_EARLY_PRINTK
select GPIOLIB
-   select SWAP_IO_SPACE
select BOOT_RAW
select CLKDEV_LOOKUP
select USE_OF
-- 
2.11.0



[PATCH v2 08/18] serial: intel: Get serial id from dts

2018-08-02 Thread Songjun Wu
Get serial id from dts.

"#ifdef CONFIG_LANTIQ" preprocessor is used because LTQ_EARLY_ASC
macro is defined in lantiq_soc.h.
lantiq_soc.h is in arch path for legacy product support.

arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h

If "#ifdef preprocessor" is changed to
"if (IS_ENABLED(CONFIG_LANTIQ))", when CONFIG_LANTIQ is not enabled,
code using LTQ_EARLY_ASC is compiled.
Compilation will fail for no LTQ_EARLY_ASC defined.

Signed-off-by: Songjun Wu 
---

Changes in v2: None

 drivers/tty/serial/lantiq.c | 19 +++
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 044128277248..836ca51460f2 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -6,6 +6,7 @@
  * Copyright (C) 2007 Felix Fietkau 
  * Copyright (C) 2007 John Crispin 
  * Copyright (C) 2010 Thomas Langer, 
+ * Copyright (C) 2018 Intel Corporation.
  */
 
 #include 
@@ -688,7 +689,7 @@ lqasc_probe(struct platform_device *pdev)
struct ltq_uart_port *ltq_port;
struct uart_port *port;
struct resource *mmres, irqres[3];
-   int line = 0;
+   int line;
int ret;
 
mmres = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -699,9 +700,19 @@ lqasc_probe(struct platform_device *pdev)
return -ENODEV;
}
 
-   /* check if this is the console port */
-   if (mmres->start != CPHYSADDR(LTQ_EARLY_ASC))
-   line = 1;
+   /* get serial id */
+   line = of_alias_get_id(node, "serial");
+   if (line < 0) {
+#ifdef CONFIG_LANTIQ
+   if (mmres->start == CPHYSADDR(LTQ_EARLY_ASC))
+   line = 0;
+   else
+   line = 1;
+#else
+   dev_err(>dev, "failed to get alias id, errno %d\n", line);
+   return line;
+#endif
+   }
 
if (lqasc_port[line]) {
dev_err(>dev, "port %d already allocated\n", line);
-- 
2.11.0



[PATCH v2 16/18] serial: intel: Reorder the head files

2018-08-02 Thread Songjun Wu
Reorder the head files according to the coding style.

Signed-off-by: Songjun Wu 
---

Changes in v2:
- New patch to reorder the head files according to the coding style.

 drivers/tty/serial/lantiq.c | 24 
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 35518ab3a80d..804aad60ed80 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -9,22 +9,22 @@
  * Copyright (C) 2018 Intel Corporation.
  */
 
-#include 
-#include 
-#include 
+#include 
 #include 
-#include 
 #include 
-#include 
-#include 
-#include 
-#include 
-#include 
+#include 
+#include 
+#include 
+#include 
 #include 
 #include 
-#include 
-#include 
-#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
 
 #ifdef CONFIG_LANTIQ
 #include 
-- 
2.11.0



[PATCH v2 06/18] MIPS: dts: Change upper case to lower case

2018-08-02 Thread Songjun Wu
All the upper case in unit-address and hex constants are
changed to lower case according to the Linux conventions.

Signed-off-by: Songjun Wu 
---

Changes in v2: None

 arch/mips/boot/dts/lantiq/danube.dtsi   | 42 -
 arch/mips/boot/dts/lantiq/easy50712.dts | 14 +--
 2 files changed, 28 insertions(+), 28 deletions(-)

diff --git a/arch/mips/boot/dts/lantiq/danube.dtsi 
b/arch/mips/boot/dts/lantiq/danube.dtsi
index 2dd950181f8a..510be63c8bdf 100644
--- a/arch/mips/boot/dts/lantiq/danube.dtsi
+++ b/arch/mips/boot/dts/lantiq/danube.dtsi
@@ -10,12 +10,12 @@
};
};
 
-   biu@1F80 {
+   biu@1f80 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "lantiq,biu", "simple-bus";
-   reg = <0x1F80 0x80>;
-   ranges = <0x0 0x1F80 0x7F>;
+   reg = <0x1f80 0x80>;
+   ranges = <0x0 0x1f80 0x7f>;
 
icu0: icu@80200 {
#interrupt-cells = <1>;
@@ -24,18 +24,18 @@
reg = <0x80200 0x120>;
};
 
-   watchdog@803F0 {
+   watchdog@803f0 {
compatible = "lantiq,wdt";
-   reg = <0x803F0 0x10>;
+   reg = <0x803f0 0x10>;
};
};
 
-   sram@1F00 {
+   sram@1f00 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "lantiq,sram";
-   reg = <0x1F00 0x80>;
-   ranges = <0x0 0x1F00 0x7F>;
+   reg = <0x1f00 0x80>;
+   ranges = <0x0 0x1f00 0x7f>;
 
eiu0: eiu@101000 {
#interrupt-cells = <1>;
@@ -66,41 +66,41 @@
#address-cells = <1>;
#size-cells = <1>;
compatible = "lantiq,fpi", "simple-bus";
-   ranges = <0x0 0x1000 0xEEF>;
-   reg = <0x1000 0xEF0>;
+   ranges = <0x0 0x1000 0xeef>;
+   reg = <0x1000 0xef0>;
 
-   gptu@E100A00 {
+   gptu@e100a00 {
compatible = "lantiq,gptu-xway";
-   reg = <0xE100A00 0x100>;
+   reg = <0xe100a00 0x100>;
};
 
-   serial@E100C00 {
+   serial@e100c00 {
compatible = "lantiq,asc";
-   reg = <0xE100C00 0x400>;
+   reg = <0xe100c00 0x400>;
interrupt-parent = <>;
interrupts = <112 113 114>;
};
 
-   dma0: dma@E104100 {
+   dma0: dma@e104100 {
compatible = "lantiq,dma-xway";
-   reg = <0xE104100 0x800>;
+   reg = <0xe104100 0x800>;
};
 
-   ebu0: ebu@E105300 {
+   ebu0: ebu@e105300 {
compatible = "lantiq,ebu-xway";
-   reg = <0xE105300 0x100>;
+   reg = <0xe105300 0x100>;
};
 
-   pci0: pci@E105400 {
+   pci0: pci@e105400 {
#address-cells = <3>;
#size-cells = <2>;
#interrupt-cells = <1>;
compatible = "lantiq,pci-xway";
bus-range = <0x0 0x0>;
ranges = <0x200 0 0x800 0x800 0 0x200   
/* pci memory */
- 0x100 0 0x 0xAE0 0 0x20>; 
/* io space */
+ 0x100 0 0x 0xae0 0 0x20>; 
/* io space */
reg = <0x700 0x8000 /* config space */
-   0xE105400 0x400>;   /* pci bridge */
+   0xe105400 0x400>;   /* pci bridge */
};
};
 };
diff --git a/arch/mips/boot/dts/lantiq/easy50712.dts 
b/arch/mips/boot/dts/lantiq/easy50712.dts
index c37a33962f28..1ce20b7d05cb 100644
--- a/arch/mips/boot/dts/lantiq/easy50712.dts
+++ b/arch/mips/boot/dts/lantiq/easy50712.dts
@@ -52,14 +52,14 @@
};
};
 
-   gpio: pinmux@E100B10 {
+   gpio: pinmux@e100b10 {
compatible = "lantiq,danube-pinctrl";
p

[PATCH v2 13/18] serial: intel: Replace clk_enable/clk_disable with clk generic API

2018-08-02 Thread Songjun Wu
The clk driver has introduced new clock APIs that replace
the existing clk_enable and clk_disable.
 -clk_enable() APIs is replaced with clk_prepare_enable().
 -clk_disable() API is replaced with clk_disable_unprepare().

Signed-off-by: Songjun Wu 
---

Changes in v2: None

 drivers/tty/serial/lantiq.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 28086d52e980..36479d66fb7c 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -309,7 +309,7 @@ lqasc_startup(struct uart_port *port)
int retval;
 
if (!IS_ERR(ltq_port->clk))
-   clk_enable(ltq_port->clk);
+   clk_prepare_enable(ltq_port->clk);
port->uartclk = clk_get_rate(ltq_port->freqclk);
 
asc_update_bits(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
@@ -377,7 +377,7 @@ lqasc_shutdown(struct uart_port *port)
asc_update_bits(ASCTXFCON_TXFEN, ASCTXFCON_TXFFLU,
port->membase + LTQ_ASC_TXFCON);
if (!IS_ERR(ltq_port->clk))
-   clk_disable(ltq_port->clk);
+   clk_disable_unprepare(ltq_port->clk);
 }
 
 static void
@@ -631,7 +631,7 @@ lqasc_console_setup(struct console *co, char *options)
port = _port->port;
 
if (!IS_ERR(ltq_port->clk))
-   clk_enable(ltq_port->clk);
+   clk_prepare_enable(ltq_port->clk);
 
port->uartclk = clk_get_rate(ltq_port->freqclk);
 
-- 
2.11.0



[PATCH v2 10/18] MIPS: lantiq: Unselect SWAP_IO_SPACE when LANTIQ is selected

2018-08-02 Thread Songjun Wu
SWAP_IO_SPACE macro prevents serial driver /drivers/tty/serial/lantiq.c
to use readl/writel to replace ltq_r32/w32 which are SoC or platform
specific APIs.

readl/writel are used for this serial driver to support multiple
platforms and multiple architectures. The legacy lantiq platform(Danube)
enables SWAP_IO_SPACE for supporting PCI due to some hardware bugs.

It's a little-endian bus plus PCI TX/RX swap enable impacted both data
and control path for MIPS based platforms. But it is better to let PCI
device driver to do endian swap since SWAP_IO_SPACE is a global wide macro
which potentially impacts other peripheral like USB.
ltq_r32/ltq_w32 is not impacted in other device drivers based on MIPS when
SWAP_IO_SPACE is not selected as they use non-byte swapping OS API
(__raw_read/__raw_writel).

Signed-off-by: Songjun Wu 
---

Changes in v2: None

 arch/mips/Kconfig | 1 -
 1 file changed, 1 deletion(-)

diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 2d34f17f3e24..2e7e0b538e52 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -400,7 +400,6 @@ config LANTIQ
select SYS_SUPPORTS_VPE_LOADER
select SYS_HAS_EARLY_PRINTK
select GPIOLIB
-   select SWAP_IO_SPACE
select BOOT_RAW
select CLKDEV_LOOKUP
select USE_OF
-- 
2.11.0



[PATCH v2 08/18] serial: intel: Get serial id from dts

2018-08-02 Thread Songjun Wu
Get serial id from dts.

"#ifdef CONFIG_LANTIQ" preprocessor is used because LTQ_EARLY_ASC
macro is defined in lantiq_soc.h.
lantiq_soc.h is in arch path for legacy product support.

arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h

If "#ifdef preprocessor" is changed to
"if (IS_ENABLED(CONFIG_LANTIQ))", when CONFIG_LANTIQ is not enabled,
code using LTQ_EARLY_ASC is compiled.
Compilation will fail for no LTQ_EARLY_ASC defined.

Signed-off-by: Songjun Wu 
---

Changes in v2: None

 drivers/tty/serial/lantiq.c | 19 +++
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 044128277248..836ca51460f2 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -6,6 +6,7 @@
  * Copyright (C) 2007 Felix Fietkau 
  * Copyright (C) 2007 John Crispin 
  * Copyright (C) 2010 Thomas Langer, 
+ * Copyright (C) 2018 Intel Corporation.
  */
 
 #include 
@@ -688,7 +689,7 @@ lqasc_probe(struct platform_device *pdev)
struct ltq_uart_port *ltq_port;
struct uart_port *port;
struct resource *mmres, irqres[3];
-   int line = 0;
+   int line;
int ret;
 
mmres = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -699,9 +700,19 @@ lqasc_probe(struct platform_device *pdev)
return -ENODEV;
}
 
-   /* check if this is the console port */
-   if (mmres->start != CPHYSADDR(LTQ_EARLY_ASC))
-   line = 1;
+   /* get serial id */
+   line = of_alias_get_id(node, "serial");
+   if (line < 0) {
+#ifdef CONFIG_LANTIQ
+   if (mmres->start == CPHYSADDR(LTQ_EARLY_ASC))
+   line = 0;
+   else
+   line = 1;
+#else
+   dev_err(>dev, "failed to get alias id, errno %d\n", line);
+   return line;
+#endif
+   }
 
if (lqasc_port[line]) {
dev_err(>dev, "port %d already allocated\n", line);
-- 
2.11.0



[PATCH v2 05/18] dt-binding: MIPS: Add documentation of Intel MIPS SoCs

2018-08-02 Thread Songjun Wu
From: Hua Ma 

This patch adds binding documentation for the
compatible values of the Intel MIPS SoCs.

Signed-off-by: Hua Ma 
Signed-off-by: Songjun Wu 
---

Changes in v2:
- New patch split from previous patch
- Add the board and chip compatible in dt document

 Documentation/devicetree/bindings/mips/intel.txt | 17 +
 1 file changed, 17 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mips/intel.txt

diff --git a/Documentation/devicetree/bindings/mips/intel.txt 
b/Documentation/devicetree/bindings/mips/intel.txt
new file mode 100644
index ..ac594ef303b7
--- /dev/null
+++ b/Documentation/devicetree/bindings/mips/intel.txt
@@ -0,0 +1,17 @@
+Intel MIPS SoC device tree bindings
+
+1, SoCs
+
+Each device tree must specify a compatible value for the Intel SoC
+it uses in the compatible property of the root node. The compatible
+value must be one of the following values:
+
+  intel,xrx500
+
+2, Boards
+
+Each device tree must specify a compatible value for the Intel Board
+it uses in the compatible property of the root node. The compatible
+value must be one of the following values:
+
+  intel,easy350-anywan
-- 
2.11.0



[PATCH v2 03/18] dt-bindings: clk: Add documentation of grx500 clock controller

2018-08-02 Thread Songjun Wu
From: Yixin Zhu 

This patch adds binding documentation for grx500 clock controller.

Signed-off-by: YiXin Zhu 
Signed-off-by: Songjun Wu 
---

Changes in v2:
- Rewrite clock driver's dt-binding document according to Rob Herring's
  comments.
- Simplify device tree docoment, remove some clock description.

 .../devicetree/bindings/clock/intel,grx500-clk.txt | 39 ++
 1 file changed, 39 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/clock/intel,grx500-clk.txt

diff --git a/Documentation/devicetree/bindings/clock/intel,grx500-clk.txt 
b/Documentation/devicetree/bindings/clock/intel,grx500-clk.txt
new file mode 100644
index ..e54e1dad9196
--- /dev/null
+++ b/Documentation/devicetree/bindings/clock/intel,grx500-clk.txt
@@ -0,0 +1,39 @@
+Device Tree Clock bindings for grx500 PLL controller.
+
+This binding uses the common clock binding:
+   Documentation/devicetree/bindings/clock/clock-bindings.txt
+
+The grx500 clock controller supplies clock to various controllers within the
+SoC.
+
+Required properties for clock node
+- compatible: Should be "intel,grx500-cgu".
+- reg: physical base address of the controller and length of memory range.
+- #clock-cells: should be 1.
+
+Optional Propteries:
+- intel,osc-frequency: frequency of the osc clock.
+if missing, driver will use clock rate defined in the driver.
+
+Example: Clock controller node:
+
+   cgu: cgu@1620 {
+compatible = "intel,grx500-cgu", "syscon";
+   reg = <0x1620 0x200>;
+   #clock-cells = <1>;
+   };
+
+
+Example: UART controller node that consumes the clock generated by clock
+   controller.
+
+   asc0: serial@1660 {
+   compatible = "lantiq,asc";
+   reg = <0x1660 0x10>;
+   interrupt-parent = <>;
+   interrupts = ,
+   ,
+   ;
+   clocks = < CLK_SSX4>, < GCLK_UART>;
+   clock-names = "freq", "asc";
+   };
-- 
2.11.0



[PATCH v2 04/18] MIPS: dts: Add initial support for Intel MIPS SoCs

2018-08-02 Thread Songjun Wu
From: Hua Ma 

Add dts files to support Intel MIPS SoCs:
- xrx500.dtsi is the chip dts
- easy350_anywan.dts is the board dts

Signed-off-by: Hua Ma 
Signed-off-by: Songjun Wu 
---

Changes in v2:
- New patch split from previous patch
- The memory address is changed to @2000
- Update to obj-$(CONFIG_BUILTIN_DTB) as per commit fca3aa166422

 arch/mips/boot/dts/Makefile  |  1 +
 arch/mips/boot/dts/intel-mips/Makefile   |  4 ++
 arch/mips/boot/dts/intel-mips/easy350_anywan.dts | 26 ++
 arch/mips/boot/dts/intel-mips/xrx500.dtsi| 66 
 4 files changed, 97 insertions(+)
 create mode 100644 arch/mips/boot/dts/intel-mips/Makefile
 create mode 100644 arch/mips/boot/dts/intel-mips/easy350_anywan.dts
 create mode 100644 arch/mips/boot/dts/intel-mips/xrx500.dtsi

diff --git a/arch/mips/boot/dts/Makefile b/arch/mips/boot/dts/Makefile
index 1e79cab8e269..05f52f279047 100644
--- a/arch/mips/boot/dts/Makefile
+++ b/arch/mips/boot/dts/Makefile
@@ -3,6 +3,7 @@ subdir-y+= brcm
 subdir-y   += cavium-octeon
 subdir-y   += img
 subdir-y   += ingenic
+subdir-y   += intel-mips
 subdir-y   += lantiq
 subdir-y   += mscc
 subdir-y   += mti
diff --git a/arch/mips/boot/dts/intel-mips/Makefile 
b/arch/mips/boot/dts/intel-mips/Makefile
new file mode 100644
index ..adfaa07c
--- /dev/null
+++ b/arch/mips/boot/dts/intel-mips/Makefile
@@ -0,0 +1,4 @@
+# SPDX-License-Identifier: GPL-2.0
+dtb-$(CONFIG_DTB_INTEL_MIPS_GRX500)+= easy350_anywan.dtb
+
+obj-$(CONFIG_BUILTIN_DTB)  += $(addsuffix .o, $(dtb-y))
diff --git a/arch/mips/boot/dts/intel-mips/easy350_anywan.dts 
b/arch/mips/boot/dts/intel-mips/easy350_anywan.dts
new file mode 100644
index ..e5e95f90c5e7
--- /dev/null
+++ b/arch/mips/boot/dts/intel-mips/easy350_anywan.dts
@@ -0,0 +1,26 @@
+// SPDX-License-Identifier: GPL-2.0
+/dts-v1/;
+
+#include 
+#include 
+
+#include "xrx500.dtsi"
+
+/ {
+   model = "EASY350 ANYWAN (GRX350) Main model";
+   compatible = "intel,easy350-anywan";
+
+   aliases {
+   serial0 = 
+   };
+
+   chosen {
+   bootargs = "earlycon=lantiq,0x1660 clk_ignore_unused";
+   stdout-path = "serial0";
+   };
+
+   memory@2000 {
+   device_type = "memory";
+   reg = <0x2000 0x0e00>;
+   };
+};
diff --git a/arch/mips/boot/dts/intel-mips/xrx500.dtsi 
b/arch/mips/boot/dts/intel-mips/xrx500.dtsi
new file mode 100644
index ..54c5f8f8b604
--- /dev/null
+++ b/arch/mips/boot/dts/intel-mips/xrx500.dtsi
@@ -0,0 +1,66 @@
+// SPDX-License-Identifier: GPL-2.0
+
+/ {
+   #address-cells = <1>;
+   #size-cells = <1>;
+   compatible = "intel,xrx500";
+
+   cpus {
+   #address-cells = <1>;
+   #size-cells = <0>;
+
+   cpu0: cpu@0 {
+   device_type = "cpu";
+   compatible = "mti,interaptiv";
+   clocks = < CLK_CPU>;
+   reg = <0>;
+   };
+
+   cpu1: cpu@1 {
+   device_type = "cpu";
+   compatible = "mti,interaptiv";
+   reg = <1>;
+   };
+   };
+
+   cpu_intc: interrupt-controller {
+   compatible = "mti,cpu-interrupt-controller";
+
+   interrupt-controller;
+   #interrupt-cells = <1>;
+   };
+
+   gic: gic@1232 {
+   compatible = "mti,gic";
+   reg = <0x1232 0x2>;
+
+   interrupt-controller;
+   #interrupt-cells = <3>;
+   /*
+* Declare the interrupt-parent even though the mti,gic
+* binding doesn't require it, such that the kernel can
+* figure out that cpu_intc is the root interrupt
+* controller & should be probed first.
+*/
+   interrupt-parent = <_intc>;
+   mti,reserved-ipi-vectors = <56 8>;
+   };
+
+   cgu: cgu@1620 {
+   compatible = "intel,grx500-cgu", "syscon";
+   reg = <0x1620 0x200>;
+   #clock-cells = <1>;
+   };
+
+   asc0: serial@1660 {
+   compatible = "lantiq,asc";
+   reg = <0x1660 0x10>;
+
+   interrupt-parent = <>;
+   interrupts = ,
+   ,
+   ;
+   clocks = < CLK_SSX4>, < GCLK_UART>;
+   clock-names = "freq", "asc";
+   };
+};
-- 
2.11.0



[PATCH v2 05/18] dt-binding: MIPS: Add documentation of Intel MIPS SoCs

2018-08-02 Thread Songjun Wu
From: Hua Ma 

This patch adds binding documentation for the
compatible values of the Intel MIPS SoCs.

Signed-off-by: Hua Ma 
Signed-off-by: Songjun Wu 
---

Changes in v2:
- New patch split from previous patch
- Add the board and chip compatible in dt document

 Documentation/devicetree/bindings/mips/intel.txt | 17 +
 1 file changed, 17 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mips/intel.txt

diff --git a/Documentation/devicetree/bindings/mips/intel.txt 
b/Documentation/devicetree/bindings/mips/intel.txt
new file mode 100644
index ..ac594ef303b7
--- /dev/null
+++ b/Documentation/devicetree/bindings/mips/intel.txt
@@ -0,0 +1,17 @@
+Intel MIPS SoC device tree bindings
+
+1, SoCs
+
+Each device tree must specify a compatible value for the Intel SoC
+it uses in the compatible property of the root node. The compatible
+value must be one of the following values:
+
+  intel,xrx500
+
+2, Boards
+
+Each device tree must specify a compatible value for the Intel Board
+it uses in the compatible property of the root node. The compatible
+value must be one of the following values:
+
+  intel,easy350-anywan
-- 
2.11.0



[PATCH v2 03/18] dt-bindings: clk: Add documentation of grx500 clock controller

2018-08-02 Thread Songjun Wu
From: Yixin Zhu 

This patch adds binding documentation for grx500 clock controller.

Signed-off-by: YiXin Zhu 
Signed-off-by: Songjun Wu 
---

Changes in v2:
- Rewrite clock driver's dt-binding document according to Rob Herring's
  comments.
- Simplify device tree docoment, remove some clock description.

 .../devicetree/bindings/clock/intel,grx500-clk.txt | 39 ++
 1 file changed, 39 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/clock/intel,grx500-clk.txt

diff --git a/Documentation/devicetree/bindings/clock/intel,grx500-clk.txt 
b/Documentation/devicetree/bindings/clock/intel,grx500-clk.txt
new file mode 100644
index ..e54e1dad9196
--- /dev/null
+++ b/Documentation/devicetree/bindings/clock/intel,grx500-clk.txt
@@ -0,0 +1,39 @@
+Device Tree Clock bindings for grx500 PLL controller.
+
+This binding uses the common clock binding:
+   Documentation/devicetree/bindings/clock/clock-bindings.txt
+
+The grx500 clock controller supplies clock to various controllers within the
+SoC.
+
+Required properties for clock node
+- compatible: Should be "intel,grx500-cgu".
+- reg: physical base address of the controller and length of memory range.
+- #clock-cells: should be 1.
+
+Optional Propteries:
+- intel,osc-frequency: frequency of the osc clock.
+if missing, driver will use clock rate defined in the driver.
+
+Example: Clock controller node:
+
+   cgu: cgu@1620 {
+compatible = "intel,grx500-cgu", "syscon";
+   reg = <0x1620 0x200>;
+   #clock-cells = <1>;
+   };
+
+
+Example: UART controller node that consumes the clock generated by clock
+   controller.
+
+   asc0: serial@1660 {
+   compatible = "lantiq,asc";
+   reg = <0x1660 0x10>;
+   interrupt-parent = <>;
+   interrupts = ,
+   ,
+   ;
+   clocks = < CLK_SSX4>, < GCLK_UART>;
+   clock-names = "freq", "asc";
+   };
-- 
2.11.0



[PATCH v2 04/18] MIPS: dts: Add initial support for Intel MIPS SoCs

2018-08-02 Thread Songjun Wu
From: Hua Ma 

Add dts files to support Intel MIPS SoCs:
- xrx500.dtsi is the chip dts
- easy350_anywan.dts is the board dts

Signed-off-by: Hua Ma 
Signed-off-by: Songjun Wu 
---

Changes in v2:
- New patch split from previous patch
- The memory address is changed to @2000
- Update to obj-$(CONFIG_BUILTIN_DTB) as per commit fca3aa166422

 arch/mips/boot/dts/Makefile  |  1 +
 arch/mips/boot/dts/intel-mips/Makefile   |  4 ++
 arch/mips/boot/dts/intel-mips/easy350_anywan.dts | 26 ++
 arch/mips/boot/dts/intel-mips/xrx500.dtsi| 66 
 4 files changed, 97 insertions(+)
 create mode 100644 arch/mips/boot/dts/intel-mips/Makefile
 create mode 100644 arch/mips/boot/dts/intel-mips/easy350_anywan.dts
 create mode 100644 arch/mips/boot/dts/intel-mips/xrx500.dtsi

diff --git a/arch/mips/boot/dts/Makefile b/arch/mips/boot/dts/Makefile
index 1e79cab8e269..05f52f279047 100644
--- a/arch/mips/boot/dts/Makefile
+++ b/arch/mips/boot/dts/Makefile
@@ -3,6 +3,7 @@ subdir-y+= brcm
 subdir-y   += cavium-octeon
 subdir-y   += img
 subdir-y   += ingenic
+subdir-y   += intel-mips
 subdir-y   += lantiq
 subdir-y   += mscc
 subdir-y   += mti
diff --git a/arch/mips/boot/dts/intel-mips/Makefile 
b/arch/mips/boot/dts/intel-mips/Makefile
new file mode 100644
index ..adfaa07c
--- /dev/null
+++ b/arch/mips/boot/dts/intel-mips/Makefile
@@ -0,0 +1,4 @@
+# SPDX-License-Identifier: GPL-2.0
+dtb-$(CONFIG_DTB_INTEL_MIPS_GRX500)+= easy350_anywan.dtb
+
+obj-$(CONFIG_BUILTIN_DTB)  += $(addsuffix .o, $(dtb-y))
diff --git a/arch/mips/boot/dts/intel-mips/easy350_anywan.dts 
b/arch/mips/boot/dts/intel-mips/easy350_anywan.dts
new file mode 100644
index ..e5e95f90c5e7
--- /dev/null
+++ b/arch/mips/boot/dts/intel-mips/easy350_anywan.dts
@@ -0,0 +1,26 @@
+// SPDX-License-Identifier: GPL-2.0
+/dts-v1/;
+
+#include 
+#include 
+
+#include "xrx500.dtsi"
+
+/ {
+   model = "EASY350 ANYWAN (GRX350) Main model";
+   compatible = "intel,easy350-anywan";
+
+   aliases {
+   serial0 = 
+   };
+
+   chosen {
+   bootargs = "earlycon=lantiq,0x1660 clk_ignore_unused";
+   stdout-path = "serial0";
+   };
+
+   memory@2000 {
+   device_type = "memory";
+   reg = <0x2000 0x0e00>;
+   };
+};
diff --git a/arch/mips/boot/dts/intel-mips/xrx500.dtsi 
b/arch/mips/boot/dts/intel-mips/xrx500.dtsi
new file mode 100644
index ..54c5f8f8b604
--- /dev/null
+++ b/arch/mips/boot/dts/intel-mips/xrx500.dtsi
@@ -0,0 +1,66 @@
+// SPDX-License-Identifier: GPL-2.0
+
+/ {
+   #address-cells = <1>;
+   #size-cells = <1>;
+   compatible = "intel,xrx500";
+
+   cpus {
+   #address-cells = <1>;
+   #size-cells = <0>;
+
+   cpu0: cpu@0 {
+   device_type = "cpu";
+   compatible = "mti,interaptiv";
+   clocks = < CLK_CPU>;
+   reg = <0>;
+   };
+
+   cpu1: cpu@1 {
+   device_type = "cpu";
+   compatible = "mti,interaptiv";
+   reg = <1>;
+   };
+   };
+
+   cpu_intc: interrupt-controller {
+   compatible = "mti,cpu-interrupt-controller";
+
+   interrupt-controller;
+   #interrupt-cells = <1>;
+   };
+
+   gic: gic@1232 {
+   compatible = "mti,gic";
+   reg = <0x1232 0x2>;
+
+   interrupt-controller;
+   #interrupt-cells = <3>;
+   /*
+* Declare the interrupt-parent even though the mti,gic
+* binding doesn't require it, such that the kernel can
+* figure out that cpu_intc is the root interrupt
+* controller & should be probed first.
+*/
+   interrupt-parent = <_intc>;
+   mti,reserved-ipi-vectors = <56 8>;
+   };
+
+   cgu: cgu@1620 {
+   compatible = "intel,grx500-cgu", "syscon";
+   reg = <0x1620 0x200>;
+   #clock-cells = <1>;
+   };
+
+   asc0: serial@1660 {
+   compatible = "lantiq,asc";
+   reg = <0x1660 0x10>;
+
+   interrupt-parent = <>;
+   interrupts = ,
+   ,
+   ;
+   clocks = < CLK_SSX4>, < GCLK_UART>;
+   clock-names = "freq", "asc";
+   };
+};
-- 
2.11.0



[PATCH v2 00/18] MIPS: intel: add initial support for Intel MIPS SoCs

2018-08-02 Thread Songjun Wu
This patch series is for adding the support for Intel MIPS
interAptiv SoC GRX500 family. It includes CCF support, serial
driver optimization and DTS modification.

This patch series is applied on top of linux v4.18-rc7.
Basic verification is performed on GRX500 board.

We propose merging this patch series into MIPS Linux tree.

Changes in v2:
- Remove unused _END macros
- Remove the redundant check and not accurate comments
- Replace the get_counter_resolution function with fixed value 2
- Use obj-y and split into per line per .o
- Add EVA mapping description in code comments
- Remove unused include header file
- Do a clean-up for grx500_defconfig
- Rewrite clock driver, add platform clock description details in
  clock driver.
- Rewrite clock driver's dt-binding document according to Rob Herring's
  comments.
- Simplify device tree docoment, remove some clock description.
- New patch split from previous patch
- The memory address is changed to @2000
- Update to obj-$(CONFIG_BUILTIN_DTB) as per commit fca3aa166422
- New patch split from previous patch
- Add the board and chip compatible in dt document
- New patch to reorder the head files according to the coding style.

Hua Ma (3):
  MIPS: intel: Add initial support for Intel MIPS SoCs
  MIPS: dts: Add initial support for Intel MIPS SoCs
  dt-binding: MIPS: Add documentation of Intel MIPS SoCs

Songjun Wu (13):
  MIPS: dts: Change upper case to lower case
  MIPS: dts: Add aliases node for lantiq danube serial
  serial: intel: Get serial id from dts
  serial: intel: Change ltq_w32_mask to asc_update_bits
  MIPS: lantiq: Unselect SWAP_IO_SPACE when LANTIQ is selected
  serial: intel: Use readl/writel instead of ltq_r32/ltq_w32
  serial: intel: Rename fpiclk to freqclk
  serial: intel: Replace clk_enable/clk_disable with clk generic API
  serial: intel: Add CCF support
  serial: intel: Support more platform
  serial: intel: Reorder the head files
  serial: intel: Change init_lqasc to static declaration
  dt-bindings: serial: lantiq: Add optional properties for CCF

Yixin Zhu (2):
  clk: intel: Add clock driver for Intel MIPS SoCs
  dt-bindings: clk: Add documentation of grx500 clock controller

 .../devicetree/bindings/clock/intel,grx500-clk.txt |  39 ++
 Documentation/devicetree/bindings/mips/intel.txt   |  17 +
 .../devicetree/bindings/serial/lantiq_asc.txt  |  15 +
 arch/mips/Kbuild.platforms |   1 +
 arch/mips/Kconfig  |  30 +-
 arch/mips/boot/dts/Makefile|   1 +
 arch/mips/boot/dts/intel-mips/Makefile |   4 +
 arch/mips/boot/dts/intel-mips/easy350_anywan.dts   |  26 ++
 arch/mips/boot/dts/intel-mips/xrx500.dtsi  |  66 +++
 arch/mips/boot/dts/lantiq/danube.dtsi  |  42 +-
 arch/mips/boot/dts/lantiq/easy50712.dts|  18 +-
 arch/mips/configs/grx500_defconfig | 138 ++
 .../asm/mach-intel-mips/cpu-feature-overrides.h|  61 +++
 arch/mips/include/asm/mach-intel-mips/ioremap.h|  39 ++
 arch/mips/include/asm/mach-intel-mips/irq.h|  17 +
 .../asm/mach-intel-mips/kernel-entry-init.h| 104 +
 arch/mips/include/asm/mach-intel-mips/spaces.h |  27 ++
 arch/mips/include/asm/mach-intel-mips/war.h|  18 +
 arch/mips/intel-mips/Kconfig   |  22 +
 arch/mips/intel-mips/Makefile  |   5 +
 arch/mips/intel-mips/Platform  |  12 +
 arch/mips/intel-mips/irq.c |  35 ++
 arch/mips/intel-mips/prom.c| 172 
 arch/mips/intel-mips/time.c|  42 ++
 drivers/clk/Kconfig|   1 +
 drivers/clk/Makefile   |   3 +
 drivers/clk/intel/Kconfig  |  20 +
 drivers/clk/intel/Makefile |   7 +
 drivers/clk/intel/clk-cgu-pll.c| 166 
 drivers/clk/intel/clk-cgu-pll.h|  34 ++
 drivers/clk/intel/clk-cgu.c| 470 +
 drivers/clk/intel/clk-cgu.h| 259 
 drivers/clk/intel/clk-grx500.c | 168 
 drivers/tty/serial/Kconfig |   2 +-
 drivers/tty/serial/lantiq.c| 143 ---
 include/dt-bindings/clock/intel,grx500-clk.h   |  69 +++
 36 files changed, 2206 insertions(+), 87 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/clock/intel,grx500-clk.txt
 create mode 100644 Documentation/devicetree/bindings/mips/intel.txt
 create mode 100644 arch/mips/boot/dts/intel-mips/Makefile
 create mode 100644 arch/mips/boot/dts/intel-mips/easy350_anywan.dts
 create mode 100644 arch/mips/boot/dts/intel-mips/xrx500.dtsi
 create mode 100644 arch/mips/configs/grx500_defconfig
 create mode 100644 
arch/mips/include/asm/mach-intel-mips/cpu-feature-overrides.h
 create mode 100644 arch/mips/include

[PATCH v2 00/18] MIPS: intel: add initial support for Intel MIPS SoCs

2018-08-02 Thread Songjun Wu
This patch series is for adding the support for Intel MIPS
interAptiv SoC GRX500 family. It includes CCF support, serial
driver optimization and DTS modification.

This patch series is applied on top of linux v4.18-rc7.
Basic verification is performed on GRX500 board.

We propose merging this patch series into MIPS Linux tree.

Changes in v2:
- Remove unused _END macros
- Remove the redundant check and not accurate comments
- Replace the get_counter_resolution function with fixed value 2
- Use obj-y and split into per line per .o
- Add EVA mapping description in code comments
- Remove unused include header file
- Do a clean-up for grx500_defconfig
- Rewrite clock driver, add platform clock description details in
  clock driver.
- Rewrite clock driver's dt-binding document according to Rob Herring's
  comments.
- Simplify device tree docoment, remove some clock description.
- New patch split from previous patch
- The memory address is changed to @2000
- Update to obj-$(CONFIG_BUILTIN_DTB) as per commit fca3aa166422
- New patch split from previous patch
- Add the board and chip compatible in dt document
- New patch to reorder the head files according to the coding style.

Hua Ma (3):
  MIPS: intel: Add initial support for Intel MIPS SoCs
  MIPS: dts: Add initial support for Intel MIPS SoCs
  dt-binding: MIPS: Add documentation of Intel MIPS SoCs

Songjun Wu (13):
  MIPS: dts: Change upper case to lower case
  MIPS: dts: Add aliases node for lantiq danube serial
  serial: intel: Get serial id from dts
  serial: intel: Change ltq_w32_mask to asc_update_bits
  MIPS: lantiq: Unselect SWAP_IO_SPACE when LANTIQ is selected
  serial: intel: Use readl/writel instead of ltq_r32/ltq_w32
  serial: intel: Rename fpiclk to freqclk
  serial: intel: Replace clk_enable/clk_disable with clk generic API
  serial: intel: Add CCF support
  serial: intel: Support more platform
  serial: intel: Reorder the head files
  serial: intel: Change init_lqasc to static declaration
  dt-bindings: serial: lantiq: Add optional properties for CCF

Yixin Zhu (2):
  clk: intel: Add clock driver for Intel MIPS SoCs
  dt-bindings: clk: Add documentation of grx500 clock controller

 .../devicetree/bindings/clock/intel,grx500-clk.txt |  39 ++
 Documentation/devicetree/bindings/mips/intel.txt   |  17 +
 .../devicetree/bindings/serial/lantiq_asc.txt  |  15 +
 arch/mips/Kbuild.platforms |   1 +
 arch/mips/Kconfig  |  30 +-
 arch/mips/boot/dts/Makefile|   1 +
 arch/mips/boot/dts/intel-mips/Makefile |   4 +
 arch/mips/boot/dts/intel-mips/easy350_anywan.dts   |  26 ++
 arch/mips/boot/dts/intel-mips/xrx500.dtsi  |  66 +++
 arch/mips/boot/dts/lantiq/danube.dtsi  |  42 +-
 arch/mips/boot/dts/lantiq/easy50712.dts|  18 +-
 arch/mips/configs/grx500_defconfig | 138 ++
 .../asm/mach-intel-mips/cpu-feature-overrides.h|  61 +++
 arch/mips/include/asm/mach-intel-mips/ioremap.h|  39 ++
 arch/mips/include/asm/mach-intel-mips/irq.h|  17 +
 .../asm/mach-intel-mips/kernel-entry-init.h| 104 +
 arch/mips/include/asm/mach-intel-mips/spaces.h |  27 ++
 arch/mips/include/asm/mach-intel-mips/war.h|  18 +
 arch/mips/intel-mips/Kconfig   |  22 +
 arch/mips/intel-mips/Makefile  |   5 +
 arch/mips/intel-mips/Platform  |  12 +
 arch/mips/intel-mips/irq.c |  35 ++
 arch/mips/intel-mips/prom.c| 172 
 arch/mips/intel-mips/time.c|  42 ++
 drivers/clk/Kconfig|   1 +
 drivers/clk/Makefile   |   3 +
 drivers/clk/intel/Kconfig  |  20 +
 drivers/clk/intel/Makefile |   7 +
 drivers/clk/intel/clk-cgu-pll.c| 166 
 drivers/clk/intel/clk-cgu-pll.h|  34 ++
 drivers/clk/intel/clk-cgu.c| 470 +
 drivers/clk/intel/clk-cgu.h| 259 
 drivers/clk/intel/clk-grx500.c | 168 
 drivers/tty/serial/Kconfig |   2 +-
 drivers/tty/serial/lantiq.c| 143 ---
 include/dt-bindings/clock/intel,grx500-clk.h   |  69 +++
 36 files changed, 2206 insertions(+), 87 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/clock/intel,grx500-clk.txt
 create mode 100644 Documentation/devicetree/bindings/mips/intel.txt
 create mode 100644 arch/mips/boot/dts/intel-mips/Makefile
 create mode 100644 arch/mips/boot/dts/intel-mips/easy350_anywan.dts
 create mode 100644 arch/mips/boot/dts/intel-mips/xrx500.dtsi
 create mode 100644 arch/mips/configs/grx500_defconfig
 create mode 100644 
arch/mips/include/asm/mach-intel-mips/cpu-feature-overrides.h
 create mode 100644 arch/mips/include

[PATCH v2 02/18] clk: intel: Add clock driver for Intel MIPS SoCs

2018-08-02 Thread Songjun Wu
From: Yixin Zhu 

This driver provides PLL clock registration as well as various clock
branches, e.g. MUX clock, gate clock, divider clock and so on.

PLLs that provide clock to DDR, CPU and peripherals are shown below:

 +-+
|--->| LCPLL3 0|--PCIe clk-->
   XO   |+-+
+---|
|+-+
||3|--PAE clk-->
|--->| PLL0B  2|--GSWIP clk-->
||1|--DDR clk-->DDR PHY clk-->
||0|--CPU1 clk--+   +-+
|+-+|--->0|
|   | MUX |--CPU clk-->
|+-+|--->1|
||0|--CPU0 clk--+   +-+
|--->| PLLOA  1|--SSX4 clk-->
 |2|--NGI clk-->
 |3|--CBM clk-->
 +-+

Signed-off-by: Yixin Zhu 
Signed-off-by: Songjun Wu 
---

Changes in v2:
- Rewrite clock driver, add platform clock description details in
  clock driver.

 drivers/clk/Kconfig  |   1 +
 drivers/clk/Makefile |   3 +
 drivers/clk/intel/Kconfig|  20 ++
 drivers/clk/intel/Makefile   |   7 +
 drivers/clk/intel/clk-cgu-pll.c  | 166 ++
 drivers/clk/intel/clk-cgu-pll.h  |  34 ++
 drivers/clk/intel/clk-cgu.c  | 470 +++
 drivers/clk/intel/clk-cgu.h  | 259 +++
 drivers/clk/intel/clk-grx500.c   | 168 ++
 include/dt-bindings/clock/intel,grx500-clk.h |  69 
 10 files changed, 1197 insertions(+)
 create mode 100644 drivers/clk/intel/Kconfig
 create mode 100644 drivers/clk/intel/Makefile
 create mode 100644 drivers/clk/intel/clk-cgu-pll.c
 create mode 100644 drivers/clk/intel/clk-cgu-pll.h
 create mode 100644 drivers/clk/intel/clk-cgu.c
 create mode 100644 drivers/clk/intel/clk-cgu.h
 create mode 100644 drivers/clk/intel/clk-grx500.c
 create mode 100644 include/dt-bindings/clock/intel,grx500-clk.h

diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig
index 721572a8c429..5e0c1597b0d3 100644
--- a/drivers/clk/Kconfig
+++ b/drivers/clk/Kconfig
@@ -281,6 +281,7 @@ source "drivers/clk/actions/Kconfig"
 source "drivers/clk/bcm/Kconfig"
 source "drivers/clk/hisilicon/Kconfig"
 source "drivers/clk/imgtec/Kconfig"
+source "drivers/clk/intel/Kconfig"
 source "drivers/clk/keystone/Kconfig"
 source "drivers/clk/mediatek/Kconfig"
 source "drivers/clk/meson/Kconfig"
diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile
index 0bb25dd009d1..d929ca4607cf 100644
--- a/drivers/clk/Makefile
+++ b/drivers/clk/Makefile
@@ -72,6 +72,9 @@ obj-$(CONFIG_ARCH_HISI)   += hisilicon/
 obj-y  += imgtec/
 obj-$(CONFIG_ARCH_MXC) += imx/
 obj-$(CONFIG_MACH_INGENIC) += ingenic/
+ifeq ($(CONFIG_COMMON_CLK), y)
+obj-y  +=intel/
+endif
 obj-$(CONFIG_ARCH_KEYSTONE)+= keystone/
 obj-$(CONFIG_MACH_LOONGSON32)  += loongson1/
 obj-y  += mediatek/
diff --git a/drivers/clk/intel/Kconfig b/drivers/clk/intel/Kconfig
new file mode 100644
index ..c7d3fb1721fa
--- /dev/null
+++ b/drivers/clk/intel/Kconfig
@@ -0,0 +1,20 @@
+# SPDX-License-Identifier: GPL-2.0
+config INTEL_CGU_CLK
+   depends on COMMON_CLK
+   depends on INTEL_MIPS || COMPILE_TEST
+   select MFD_SYSCON
+   bool "Intel clock controller support"
+   help
+ This driver support Intel CGU (Clock Generation Unit).
+
+choice
+   prompt "SoC platform selection"
+   depends on INTEL_CGU_CLK
+   default INTEL_GRX500_CGU_CLK
+
+config INTEL_GRX500_CGU_CLK
+   bool "GRX500 CLK"
+   help
+ Clock driver of GRX500 platform.
+
+endchoice
diff --git a/drivers/clk/intel/Makefile b/drivers/clk/intel/Makefile
new file mode 100644
index ..16a0138e52c2
--- /dev/null
+++ b/drivers/clk/intel/Makefile
@@ -0,0 +1,7 @@
+# SPDX-License-Identifier: GPL-2.0
+# Makefile for intel specific clk
+
+obj-$(CONFIG_INTEL_CGU_CLK) += clk-cgu.o clk-cgu-pll.o
+ifneq ($(CONFIG_INTEL_GRX500_CGU_CLK),)
+   obj-y += clk-grx500.o
+endif
diff --git a/drivers/clk/intel/clk-cgu-pll.c b/drivers/clk/intel/clk-cgu-pll.c
new file mode 100644
index ..20759bc27e95
--- /dev/null
+++ b/drivers/clk/intel/clk-cgu-pll.c
@@ -0,0 +1,166 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ *  Copyright (C) 2018 Intel Corporation.
+ *  Zhu YiXin 
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "clk-cgu-pll.h"
+#include "clk-cgu.h"
+
+#define to_intel_c

[PATCH v2 01/18] MIPS: intel: Add initial support for Intel MIPS SoCs

2018-08-02 Thread Songjun Wu
From: Hua Ma 

Add initial support for Intel MIPS interAptiv SoCs made by Intel.
This series will add support for the grx500 family.

The series allows booting a minimal system using a initramfs.

Signed-off-by: Hua Ma 
Signed-off-by: Songjun Wu 
---

Changes in v2:
- Remove unused _END macros
- Remove the redundant check and not accurate comments
- Replace the get_counter_resolution function with fixed value 2
- Use obj-y and split into per line per .o
- Add EVA mapping description in code comments
- Remove unused include header file
- Do a clean-up for grx500_defconfig

 arch/mips/Kbuild.platforms |   1 +
 arch/mips/Kconfig  |  29 
 arch/mips/configs/grx500_defconfig | 138 +
 .../asm/mach-intel-mips/cpu-feature-overrides.h|  61 
 arch/mips/include/asm/mach-intel-mips/ioremap.h|  39 +
 arch/mips/include/asm/mach-intel-mips/irq.h|  17 ++
 .../asm/mach-intel-mips/kernel-entry-init.h| 104 +
 arch/mips/include/asm/mach-intel-mips/spaces.h |  27 
 arch/mips/include/asm/mach-intel-mips/war.h|  18 +++
 arch/mips/intel-mips/Kconfig   |  22 +++
 arch/mips/intel-mips/Makefile  |   5 +
 arch/mips/intel-mips/Platform  |  12 ++
 arch/mips/intel-mips/irq.c |  35 +
 arch/mips/intel-mips/prom.c| 172 +
 arch/mips/intel-mips/time.c|  42 +
 15 files changed, 722 insertions(+)
 create mode 100644 arch/mips/configs/grx500_defconfig
 create mode 100644 
arch/mips/include/asm/mach-intel-mips/cpu-feature-overrides.h
 create mode 100644 arch/mips/include/asm/mach-intel-mips/ioremap.h
 create mode 100644 arch/mips/include/asm/mach-intel-mips/irq.h
 create mode 100644 arch/mips/include/asm/mach-intel-mips/kernel-entry-init.h
 create mode 100644 arch/mips/include/asm/mach-intel-mips/spaces.h
 create mode 100644 arch/mips/include/asm/mach-intel-mips/war.h
 create mode 100644 arch/mips/intel-mips/Kconfig
 create mode 100644 arch/mips/intel-mips/Makefile
 create mode 100644 arch/mips/intel-mips/Platform
 create mode 100644 arch/mips/intel-mips/irq.c
 create mode 100644 arch/mips/intel-mips/prom.c
 create mode 100644 arch/mips/intel-mips/time.c

diff --git a/arch/mips/Kbuild.platforms b/arch/mips/Kbuild.platforms
index ac7ad54f984f..bcd647060f3e 100644
--- a/arch/mips/Kbuild.platforms
+++ b/arch/mips/Kbuild.platforms
@@ -12,6 +12,7 @@ platforms += cobalt
 platforms += dec
 platforms += emma
 platforms += generic
+platforms += intel-mips
 platforms += jazz
 platforms += jz4740
 platforms += lantiq
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 08c10c518f83..2d34f17f3e24 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -409,6 +409,34 @@ config LANTIQ
select ARCH_HAS_RESET_CONTROLLER
select RESET_CONTROLLER
 
+config INTEL_MIPS
+   bool "Intel MIPS interAptiv SoC based platforms"
+   select BOOT_RAW
+   select CEVT_R4K
+   select COMMON_CLK
+   select CPU_MIPS32_3_5_EVA
+   select CPU_MIPS32_3_5_FEATURES
+   select CPU_MIPSR2_IRQ_EI
+   select CPU_MIPSR2_IRQ_VI
+   select CSRC_R4K
+   select DMA_NONCOHERENT
+   select GENERIC_ISA_DMA
+   select IRQ_MIPS_CPU
+   select MFD_CORE
+   select MFD_SYSCON
+   select MIPS_CPU_SCACHE
+   select MIPS_GIC
+   select SYS_HAS_CPU_MIPS32_R1
+   select SYS_HAS_CPU_MIPS32_R2
+   select SYS_HAS_CPU_MIPS32_R3_5
+   select SYS_SUPPORTS_BIG_ENDIAN
+   select SYS_SUPPORTS_32BIT_KERNEL
+   select SYS_SUPPORTS_MIPS_CPS
+   select SYS_SUPPORTS_MULTITHREADING
+   select SYS_SUPPORTS_ZBOOT
+   select TIMER_OF
+   select USE_OF
+
 config LASAT
bool "LASAT Networks platforms"
select CEVT_R4K
@@ -1016,6 +1044,7 @@ source "arch/mips/bcm47xx/Kconfig"
 source "arch/mips/bcm63xx/Kconfig"
 source "arch/mips/bmips/Kconfig"
 source "arch/mips/generic/Kconfig"
+source "arch/mips/intel-mips/Kconfig"
 source "arch/mips/jazz/Kconfig"
 source "arch/mips/jz4740/Kconfig"
 source "arch/mips/lantiq/Kconfig"
diff --git a/arch/mips/configs/grx500_defconfig 
b/arch/mips/configs/grx500_defconfig
new file mode 100644
index ..9dd7ba8e1f74
--- /dev/null
+++ b/arch/mips/configs/grx500_defconfig
@@ -0,0 +1,138 @@
+CONFIG_INTEL_MIPS=y
+CONFIG_DTB_INTEL_MIPS_GRX500=y
+CONFIG_CPU_MIPS32_R2=y
+CONFIG_SCHED_SMT=y
+# CONFIG_MIPS_MT_FPAFF is not set
+CONFIG_MIPS_CPS=y
+CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
+CONFIG_NR_CPUS=2
+CONFIG_HZ_100=y
+# CONFIG_SECCOMP is not set
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_DEFAULT_HOSTNAME="GRX500"
+CONFIG_SYSVIPC=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_LOG_BUF_SHIFT=18
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE="&q

[PATCH v2 02/18] clk: intel: Add clock driver for Intel MIPS SoCs

2018-08-02 Thread Songjun Wu
From: Yixin Zhu 

This driver provides PLL clock registration as well as various clock
branches, e.g. MUX clock, gate clock, divider clock and so on.

PLLs that provide clock to DDR, CPU and peripherals are shown below:

 +-+
|--->| LCPLL3 0|--PCIe clk-->
   XO   |+-+
+---|
|+-+
||3|--PAE clk-->
|--->| PLL0B  2|--GSWIP clk-->
||1|--DDR clk-->DDR PHY clk-->
||0|--CPU1 clk--+   +-+
|+-+|--->0|
|   | MUX |--CPU clk-->
|+-+|--->1|
||0|--CPU0 clk--+   +-+
|--->| PLLOA  1|--SSX4 clk-->
 |2|--NGI clk-->
 |3|--CBM clk-->
 +-+

Signed-off-by: Yixin Zhu 
Signed-off-by: Songjun Wu 
---

Changes in v2:
- Rewrite clock driver, add platform clock description details in
  clock driver.

 drivers/clk/Kconfig  |   1 +
 drivers/clk/Makefile |   3 +
 drivers/clk/intel/Kconfig|  20 ++
 drivers/clk/intel/Makefile   |   7 +
 drivers/clk/intel/clk-cgu-pll.c  | 166 ++
 drivers/clk/intel/clk-cgu-pll.h  |  34 ++
 drivers/clk/intel/clk-cgu.c  | 470 +++
 drivers/clk/intel/clk-cgu.h  | 259 +++
 drivers/clk/intel/clk-grx500.c   | 168 ++
 include/dt-bindings/clock/intel,grx500-clk.h |  69 
 10 files changed, 1197 insertions(+)
 create mode 100644 drivers/clk/intel/Kconfig
 create mode 100644 drivers/clk/intel/Makefile
 create mode 100644 drivers/clk/intel/clk-cgu-pll.c
 create mode 100644 drivers/clk/intel/clk-cgu-pll.h
 create mode 100644 drivers/clk/intel/clk-cgu.c
 create mode 100644 drivers/clk/intel/clk-cgu.h
 create mode 100644 drivers/clk/intel/clk-grx500.c
 create mode 100644 include/dt-bindings/clock/intel,grx500-clk.h

diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig
index 721572a8c429..5e0c1597b0d3 100644
--- a/drivers/clk/Kconfig
+++ b/drivers/clk/Kconfig
@@ -281,6 +281,7 @@ source "drivers/clk/actions/Kconfig"
 source "drivers/clk/bcm/Kconfig"
 source "drivers/clk/hisilicon/Kconfig"
 source "drivers/clk/imgtec/Kconfig"
+source "drivers/clk/intel/Kconfig"
 source "drivers/clk/keystone/Kconfig"
 source "drivers/clk/mediatek/Kconfig"
 source "drivers/clk/meson/Kconfig"
diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile
index 0bb25dd009d1..d929ca4607cf 100644
--- a/drivers/clk/Makefile
+++ b/drivers/clk/Makefile
@@ -72,6 +72,9 @@ obj-$(CONFIG_ARCH_HISI)   += hisilicon/
 obj-y  += imgtec/
 obj-$(CONFIG_ARCH_MXC) += imx/
 obj-$(CONFIG_MACH_INGENIC) += ingenic/
+ifeq ($(CONFIG_COMMON_CLK), y)
+obj-y  +=intel/
+endif
 obj-$(CONFIG_ARCH_KEYSTONE)+= keystone/
 obj-$(CONFIG_MACH_LOONGSON32)  += loongson1/
 obj-y  += mediatek/
diff --git a/drivers/clk/intel/Kconfig b/drivers/clk/intel/Kconfig
new file mode 100644
index ..c7d3fb1721fa
--- /dev/null
+++ b/drivers/clk/intel/Kconfig
@@ -0,0 +1,20 @@
+# SPDX-License-Identifier: GPL-2.0
+config INTEL_CGU_CLK
+   depends on COMMON_CLK
+   depends on INTEL_MIPS || COMPILE_TEST
+   select MFD_SYSCON
+   bool "Intel clock controller support"
+   help
+ This driver support Intel CGU (Clock Generation Unit).
+
+choice
+   prompt "SoC platform selection"
+   depends on INTEL_CGU_CLK
+   default INTEL_GRX500_CGU_CLK
+
+config INTEL_GRX500_CGU_CLK
+   bool "GRX500 CLK"
+   help
+ Clock driver of GRX500 platform.
+
+endchoice
diff --git a/drivers/clk/intel/Makefile b/drivers/clk/intel/Makefile
new file mode 100644
index ..16a0138e52c2
--- /dev/null
+++ b/drivers/clk/intel/Makefile
@@ -0,0 +1,7 @@
+# SPDX-License-Identifier: GPL-2.0
+# Makefile for intel specific clk
+
+obj-$(CONFIG_INTEL_CGU_CLK) += clk-cgu.o clk-cgu-pll.o
+ifneq ($(CONFIG_INTEL_GRX500_CGU_CLK),)
+   obj-y += clk-grx500.o
+endif
diff --git a/drivers/clk/intel/clk-cgu-pll.c b/drivers/clk/intel/clk-cgu-pll.c
new file mode 100644
index ..20759bc27e95
--- /dev/null
+++ b/drivers/clk/intel/clk-cgu-pll.c
@@ -0,0 +1,166 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ *  Copyright (C) 2018 Intel Corporation.
+ *  Zhu YiXin 
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "clk-cgu-pll.h"
+#include "clk-cgu.h"
+
+#define to_intel_c

[PATCH v2 01/18] MIPS: intel: Add initial support for Intel MIPS SoCs

2018-08-02 Thread Songjun Wu
From: Hua Ma 

Add initial support for Intel MIPS interAptiv SoCs made by Intel.
This series will add support for the grx500 family.

The series allows booting a minimal system using a initramfs.

Signed-off-by: Hua Ma 
Signed-off-by: Songjun Wu 
---

Changes in v2:
- Remove unused _END macros
- Remove the redundant check and not accurate comments
- Replace the get_counter_resolution function with fixed value 2
- Use obj-y and split into per line per .o
- Add EVA mapping description in code comments
- Remove unused include header file
- Do a clean-up for grx500_defconfig

 arch/mips/Kbuild.platforms |   1 +
 arch/mips/Kconfig  |  29 
 arch/mips/configs/grx500_defconfig | 138 +
 .../asm/mach-intel-mips/cpu-feature-overrides.h|  61 
 arch/mips/include/asm/mach-intel-mips/ioremap.h|  39 +
 arch/mips/include/asm/mach-intel-mips/irq.h|  17 ++
 .../asm/mach-intel-mips/kernel-entry-init.h| 104 +
 arch/mips/include/asm/mach-intel-mips/spaces.h |  27 
 arch/mips/include/asm/mach-intel-mips/war.h|  18 +++
 arch/mips/intel-mips/Kconfig   |  22 +++
 arch/mips/intel-mips/Makefile  |   5 +
 arch/mips/intel-mips/Platform  |  12 ++
 arch/mips/intel-mips/irq.c |  35 +
 arch/mips/intel-mips/prom.c| 172 +
 arch/mips/intel-mips/time.c|  42 +
 15 files changed, 722 insertions(+)
 create mode 100644 arch/mips/configs/grx500_defconfig
 create mode 100644 
arch/mips/include/asm/mach-intel-mips/cpu-feature-overrides.h
 create mode 100644 arch/mips/include/asm/mach-intel-mips/ioremap.h
 create mode 100644 arch/mips/include/asm/mach-intel-mips/irq.h
 create mode 100644 arch/mips/include/asm/mach-intel-mips/kernel-entry-init.h
 create mode 100644 arch/mips/include/asm/mach-intel-mips/spaces.h
 create mode 100644 arch/mips/include/asm/mach-intel-mips/war.h
 create mode 100644 arch/mips/intel-mips/Kconfig
 create mode 100644 arch/mips/intel-mips/Makefile
 create mode 100644 arch/mips/intel-mips/Platform
 create mode 100644 arch/mips/intel-mips/irq.c
 create mode 100644 arch/mips/intel-mips/prom.c
 create mode 100644 arch/mips/intel-mips/time.c

diff --git a/arch/mips/Kbuild.platforms b/arch/mips/Kbuild.platforms
index ac7ad54f984f..bcd647060f3e 100644
--- a/arch/mips/Kbuild.platforms
+++ b/arch/mips/Kbuild.platforms
@@ -12,6 +12,7 @@ platforms += cobalt
 platforms += dec
 platforms += emma
 platforms += generic
+platforms += intel-mips
 platforms += jazz
 platforms += jz4740
 platforms += lantiq
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 08c10c518f83..2d34f17f3e24 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -409,6 +409,34 @@ config LANTIQ
select ARCH_HAS_RESET_CONTROLLER
select RESET_CONTROLLER
 
+config INTEL_MIPS
+   bool "Intel MIPS interAptiv SoC based platforms"
+   select BOOT_RAW
+   select CEVT_R4K
+   select COMMON_CLK
+   select CPU_MIPS32_3_5_EVA
+   select CPU_MIPS32_3_5_FEATURES
+   select CPU_MIPSR2_IRQ_EI
+   select CPU_MIPSR2_IRQ_VI
+   select CSRC_R4K
+   select DMA_NONCOHERENT
+   select GENERIC_ISA_DMA
+   select IRQ_MIPS_CPU
+   select MFD_CORE
+   select MFD_SYSCON
+   select MIPS_CPU_SCACHE
+   select MIPS_GIC
+   select SYS_HAS_CPU_MIPS32_R1
+   select SYS_HAS_CPU_MIPS32_R2
+   select SYS_HAS_CPU_MIPS32_R3_5
+   select SYS_SUPPORTS_BIG_ENDIAN
+   select SYS_SUPPORTS_32BIT_KERNEL
+   select SYS_SUPPORTS_MIPS_CPS
+   select SYS_SUPPORTS_MULTITHREADING
+   select SYS_SUPPORTS_ZBOOT
+   select TIMER_OF
+   select USE_OF
+
 config LASAT
bool "LASAT Networks platforms"
select CEVT_R4K
@@ -1016,6 +1044,7 @@ source "arch/mips/bcm47xx/Kconfig"
 source "arch/mips/bcm63xx/Kconfig"
 source "arch/mips/bmips/Kconfig"
 source "arch/mips/generic/Kconfig"
+source "arch/mips/intel-mips/Kconfig"
 source "arch/mips/jazz/Kconfig"
 source "arch/mips/jz4740/Kconfig"
 source "arch/mips/lantiq/Kconfig"
diff --git a/arch/mips/configs/grx500_defconfig 
b/arch/mips/configs/grx500_defconfig
new file mode 100644
index ..9dd7ba8e1f74
--- /dev/null
+++ b/arch/mips/configs/grx500_defconfig
@@ -0,0 +1,138 @@
+CONFIG_INTEL_MIPS=y
+CONFIG_DTB_INTEL_MIPS_GRX500=y
+CONFIG_CPU_MIPS32_R2=y
+CONFIG_SCHED_SMT=y
+# CONFIG_MIPS_MT_FPAFF is not set
+CONFIG_MIPS_CPS=y
+CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
+CONFIG_NR_CPUS=2
+CONFIG_HZ_100=y
+# CONFIG_SECCOMP is not set
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_DEFAULT_HOSTNAME="GRX500"
+CONFIG_SYSVIPC=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_LOG_BUF_SHIFT=18
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE="&q

  1   2   3   >