Thread (10 messages) flat view 10 messages, 2 authors, 2012-05-21

Re: [V2 5/5] powerpc: kernel: 16650 UART reg-shift support

From: Josh Boyer <hidden>
Date: 2012-05-02 13:38:16
Also in: linuxppc-dev, lkml

On Mon, Apr 9, 2012 at 3:20 AM, Tanmay Inamdar [off-list ref] wrote:
quoted hunk ↗ jump to hunk
In APM8018X SOC, UART register address space has been relocated to 32-bit
data boundaries for APB bus implementation.
Current legacy_serial driver ignores the reg-shift property. This patch
modifies legacy_serial.c and udbg_16550.c to work with above mentioned UARTs.

Signed-off-by: Tanmay Inamdar <redacted>
---
:100644 100644 8338aef... f5fc106... M  arch/powerpc/include/asm/udbg.h
:100644 100644 bedd12e... d523b7d... M  arch/powerpc/kernel/legacy_serial.c
:100644 100644 6837f83... e0cb7dc... M  arch/powerpc/kernel/udbg_16550.c
 arch/powerpc/include/asm/udbg.h     |    2 +-
 arch/powerpc/kernel/legacy_serial.c |   16 +++++---
 arch/powerpc/kernel/udbg_16550.c    |   64 ++++++++++++++++++++++------------
 3 files changed, 52 insertions(+), 30 deletions(-)
diff --git a/arch/powerpc/include/asm/udbg.h b/arch/powerpc/include/asm/udbg.h
index 8338aef..f5fc106 100644
--- a/arch/powerpc/include/asm/udbg.h
+++ b/arch/powerpc/include/asm/udbg.h
@@ -29,7 +29,7 @@ extern void udbg_printf(const char *fmt, ...)
 extern void udbg_progress(char *s, unsigned short hex);

 extern void udbg_init_uart(void __iomem *comport, unsigned int speed,
-                          unsigned int clock);
+                          unsigned int clock,  unsigned int regshift);
 extern unsigned int udbg_probe_uart_speed(void __iomem *comport,
                                         unsigned int clock);
diff --git a/arch/powerpc/kernel/legacy_serial.c b/arch/powerpc/kernel/legacy_serial.c
index bedd12e..d523b7d 100644
--- a/arch/powerpc/kernel/legacy_serial.c
+++ b/arch/powerpc/kernel/legacy_serial.c
@@ -33,6 +33,7 @@ static struct legacy_serial_info {
       unsigned int                    clock;
       int                             irq_check_parent;
       phys_addr_t                     taddr;
+       unsigned int                    regshift;
 } legacy_serial_infos[MAX_LEGACY_SERIAL_PORTS];

 static struct __initdata of_device_id legacy_serial_parents[] = {
@@ -42,6 +43,7 @@ static struct __initdata of_device_id legacy_serial_parents[] = {
       {.compatible = "ibm,opb",},
       {.compatible = "simple-bus",},
       {.compatible = "wrs,epld-localbus",},
+       {.compatible = "apm,apb",},
       {},
 };
@@ -163,11 +165,6 @@ static int __init add_legacy_soc_port(struct device_node *np,
       if (of_get_property(np, "clock-frequency", NULL) == NULL)
               return -1;

-       /* if reg-shift or offset, don't try to use it */
-       if ((of_get_property(np, "reg-shift", NULL) != NULL) ||
-               (of_get_property(np, "reg-offset", NULL) != NULL))
-               return -1;
-
So we explicitly didn't support reg-shift before.  I'm guessing there is
a reason for that, but I don't recall what.  Ben?

Also, why do you need to use the legacy serial driver at all for this
SOC?  As far as I remember, the OF serial driver should be sufficient.
+static unsigned int reg_shift;
+#define ns16550_offset(addr) (addr - (unsigned char *)udbg_comport)
+
 static struct NS16550 __iomem *udbg_comport;

+static inline u8 serial_read(unsigned char *addr)
+{
+       u32 offset = ns16550_offset(addr) << reg_shift;
+       return readb(udbg_comport + offset);
+}
+
+static inline void serial_write(unsigned char *addr, char val)
+{
+       u32 offset = ns16550_offset(addr) << reg_shift;
+       writeb(val, udbg_comport + offset);
+}
+
I don't think readb/writeb are correct here.  Why did you switch to
using those instead of sticking with in_8/out_8?

josh
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help