* [PATCH v3 00/12] Xilinx Virtex and Uartlite arch/powerpc patches ready for merge
@ 2007-10-02 2:15 Grant Likely
2007-10-02 2:15 ` [PATCH v3 01/12] Virtex: Add uartlite bootwrapper driver Grant Likely
` (11 more replies)
0 siblings, 12 replies; 22+ messages in thread
From: Grant Likely @ 2007-10-02 2:15 UTC (permalink / raw)
To: linuxppc-dev, jwboyer
Josh,
Here is the Xilinx Virtex and Uartlite series of patches to add support
to arch/powerpc. Please merge.
Device tree source files (.dts) and defconfigs to follow in a subsuquent
patch series.
Thanks,
g.
--
Grant Likely, B.Sc. P.Eng.
Secret Lab Technologies Ltd.
^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH v3 01/12] Virtex: Add uartlite bootwrapper driver
2007-10-02 2:15 [PATCH v3 00/12] Xilinx Virtex and Uartlite arch/powerpc patches ready for merge Grant Likely
@ 2007-10-02 2:15 ` Grant Likely
2007-10-02 2:15 ` [PATCH v3 02/12] Virtex: Add Kconfig macros for Xilinx Virtex board support Grant Likely
` (10 subsequent siblings)
11 siblings, 0 replies; 22+ messages in thread
From: Grant Likely @ 2007-10-02 2:15 UTC (permalink / raw)
To: linuxppc-dev, jwboyer
From: Grant Likely <grant.likely@secretlab.ca>
Allows the bootwrapper to use the uartlite device for console output.
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
---
arch/powerpc/boot/Makefile | 2 +
arch/powerpc/boot/ops.h | 1 +
arch/powerpc/boot/serial.c | 2 +
arch/powerpc/boot/uartlite.c | 64 ++++++++++++++++++++++++++++++++++++++++++
4 files changed, 68 insertions(+), 1 deletions(-)
diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile
index c1582b6..371fbc6 100644
--- a/arch/powerpc/boot/Makefile
+++ b/arch/powerpc/boot/Makefile
@@ -45,7 +45,7 @@ src-wlib := string.S crt0.S stdio.c main.c flatdevtree.c flatdevtree_misc.c \
ns16550.c serial.c simple_alloc.c div64.S util.S \
gunzip_util.c elf_util.c $(zlib) devtree.c oflib.c ofconsole.c \
4xx.c ebony.c mv64x60.c mpsc.c mv64x60_i2c.c cuboot.c bamboo.c \
- cpm-serial.c stdlib.c
+ cpm-serial.c stdlib.c uartlite.c
src-plat := of.c cuboot-83xx.c cuboot-85xx.c holly.c \
cuboot-ebony.c treeboot-ebony.c prpmc2800.c \
ps3-head.S ps3-hvcall.S ps3.c treeboot-bamboo.c cuboot-8xx.c \
diff --git a/arch/powerpc/boot/ops.h b/arch/powerpc/boot/ops.h
index 703255b..4ef30e4 100644
--- a/arch/powerpc/boot/ops.h
+++ b/arch/powerpc/boot/ops.h
@@ -84,6 +84,7 @@ int serial_console_init(void);
int ns16550_console_init(void *devp, struct serial_console_data *scdp);
int mpsc_console_init(void *devp, struct serial_console_data *scdp);
int cpm_console_init(void *devp, struct serial_console_data *scdp);
+int uartlite_console_init(void *devp, struct serial_console_data *scdp);
void *simple_alloc_init(char *base, unsigned long heap_size,
unsigned long granularity, unsigned long max_allocs);
extern void flush_cache(void *, unsigned long);
diff --git a/arch/powerpc/boot/serial.c b/arch/powerpc/boot/serial.c
index d47f8e0..70f36bf 100644
--- a/arch/powerpc/boot/serial.c
+++ b/arch/powerpc/boot/serial.c
@@ -126,6 +126,8 @@ int serial_console_init(void)
dt_is_compatible(devp, "fsl,cpm2-scc-uart") ||
dt_is_compatible(devp, "fsl,cpm2-smc-uart"))
rc = cpm_console_init(devp, &serial_cd);
+ else if (dt_is_compatible(devp, "xilinx,uartlite"))
+ rc = uartlite_console_init(devp, &serial_cd);
/* Add other serial console driver calls here */
diff --git a/arch/powerpc/boot/uartlite.c b/arch/powerpc/boot/uartlite.c
new file mode 100644
index 0000000..f4249a7
--- /dev/null
+++ b/arch/powerpc/boot/uartlite.c
@@ -0,0 +1,64 @@
+/*
+ * Xilinx UARTLITE bootloader driver
+ *
+ * Copyright (C) 2007 Secret Lab Technologies Ltd.
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2. This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ */
+
+#include <stdarg.h>
+#include <stddef.h>
+#include "types.h"
+#include "string.h"
+#include "stdio.h"
+#include "io.h"
+#include "ops.h"
+
+static void * reg_base;
+
+static int uartlite_open(void)
+{
+ /* Clear the RX FIFO */
+ out_be32(reg_base + 0x0C, 0x2);
+ return 0;
+}
+
+static void uartlite_putc(unsigned char c)
+{
+ while ((in_be32(reg_base + 0x8) & 0x08) != 0); /* spin */
+ out_be32(reg_base + 0x4, c);
+}
+
+static unsigned char uartlite_getc(void)
+{
+ while ((in_be32(reg_base + 0x8) & 0x01) == 0); /* spin */
+ return in_be32(reg_base);
+}
+
+static u8 uartlite_tstc(void)
+{
+ return ((in_be32(reg_base + 0x8) & 0x01) != 0);
+}
+
+int uartlite_console_init(void *devp, struct serial_console_data *scdp)
+{
+ int n;
+ unsigned long reg_phys;
+
+ n = getprop(devp, "virtual-reg", ®_base, sizeof(reg_base));
+ if (n != sizeof(reg_base)) {
+ if (!dt_xlate_reg(devp, 0, ®_phys, NULL))
+ return -1;
+
+ reg_base = (void *)reg_phys;
+ }
+
+ scdp->open = uartlite_open;
+ scdp->putc = uartlite_putc;
+ scdp->getc = uartlite_getc;
+ scdp->tstc = uartlite_tstc;
+ scdp->close = NULL;
+ return 0;
+}
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v3 02/12] Virtex: Add Kconfig macros for Xilinx Virtex board support
2007-10-02 2:15 [PATCH v3 00/12] Xilinx Virtex and Uartlite arch/powerpc patches ready for merge Grant Likely
2007-10-02 2:15 ` [PATCH v3 01/12] Virtex: Add uartlite bootwrapper driver Grant Likely
@ 2007-10-02 2:15 ` Grant Likely
2007-10-02 19:04 ` Peter Korsgaard
2007-10-02 2:15 ` [PATCH v3 03/12] Virtex: add xilinx interrupt controller driver Grant Likely
` (9 subsequent siblings)
11 siblings, 1 reply; 22+ messages in thread
From: Grant Likely @ 2007-10-02 2:15 UTC (permalink / raw)
To: linuxppc-dev, jwboyer
From: Grant Likely <grant.likely@secretlab.ca>
Add the needed kconfig macros to enable Xilinx Virtex board support
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
---
arch/powerpc/platforms/40x/Kconfig | 38 ++++++++++++++++++++++++------------
1 files changed, 25 insertions(+), 13 deletions(-)
diff --git a/arch/powerpc/platforms/40x/Kconfig b/arch/powerpc/platforms/40x/Kconfig
index c3dce3b..a0a50b1 100644
--- a/arch/powerpc/platforms/40x/Kconfig
+++ b/arch/powerpc/platforms/40x/Kconfig
@@ -61,13 +61,22 @@ config WALNUT
help
This option enables support for the IBM PPC405GP evaluation board.
-#config XILINX_ML300
-# bool "Xilinx-ML300"
-# depends on 40x
-# default y
-# select VIRTEX_II_PRO
-# help
-# This option enables support for the Xilinx ML300 evaluation board.
+config XILINX_VIRTEX_GENERIC_BOARD
+ bool "Generic Xilinx Virtex board"
+ depends on 40x
+ default n
+ select XILINX_VIRTEX_II_PRO
+ select XILINX_VIRTEX_4_FX
+ help
+ This option enables generic support for Xilinx Virtex based boards.
+
+ The generic virtex board support matches any device tree which
+ specifies 'xilinx,virtex' in its compatible field. This includes
+ the Xilinx ML3xx and ML4xx reference designs using the powerpc
+ core.
+
+ Most Virtex designs should use this unless it needs to do some
+ special configuration at board probe time.
# 40x specific CPU modules, selected based on the board above.
config NP405H
@@ -91,11 +100,19 @@ config 405EP
config 405GPR
bool
-config VIRTEX_II_PRO
+config XILINX_VIRTEX
bool
+
+config XILINX_VIRTEX_II_PRO
+ bool
+ select XILINX_VIRTEX
select IBM405_ERR77
select IBM405_ERR51
+config XILINX_VIRTEX_4_FX
+ bool
+ select XILINX_VIRTEX
+
config STB03xxx
bool
select IBM405_ERR77
@@ -111,11 +128,6 @@ config IBM405_ERR77
config IBM405_ERR51
bool
-#config XILINX_OCP
-# bool
-# depends on XILINX_ML300
-# default y
-
#config BIOS_FIXUP
# bool
# depends on BUBINGA || EP405 || SYCAMORE || WALNUT
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v3 03/12] Virtex: add xilinx interrupt controller driver
2007-10-02 2:15 [PATCH v3 00/12] Xilinx Virtex and Uartlite arch/powerpc patches ready for merge Grant Likely
2007-10-02 2:15 ` [PATCH v3 01/12] Virtex: Add uartlite bootwrapper driver Grant Likely
2007-10-02 2:15 ` [PATCH v3 02/12] Virtex: Add Kconfig macros for Xilinx Virtex board support Grant Likely
@ 2007-10-02 2:15 ` Grant Likely
2007-10-02 2:15 ` [PATCH v3 04/12] Virtex: Add generic Xilinx Virtex board support Grant Likely
` (8 subsequent siblings)
11 siblings, 0 replies; 22+ messages in thread
From: Grant Likely @ 2007-10-02 2:15 UTC (permalink / raw)
To: linuxppc-dev, jwboyer
From: Grant Likely <grant.likely@secretlab.ca>
Adds support for the Xilinx opb-intc interrupt controller
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
---
arch/powerpc/sysdev/Makefile | 1
arch/powerpc/sysdev/xilinx_intc.c | 151 +++++++++++++++++++++++++++++++++++++
include/asm-powerpc/xilinx_intc.h | 20 +++++
3 files changed, 172 insertions(+), 0 deletions(-)
diff --git a/arch/powerpc/sysdev/Makefile b/arch/powerpc/sysdev/Makefile
index 08ce31e..0457117 100644
--- a/arch/powerpc/sysdev/Makefile
+++ b/arch/powerpc/sysdev/Makefile
@@ -30,6 +30,7 @@ obj-$(CONFIG_PPC_INDIRECT_PCI) += indirect_pci.o
obj-$(CONFIG_PPC_I8259) += i8259.o
obj-$(CONFIG_PPC_83xx) += ipic.o
obj-$(CONFIG_4xx) += uic.o
+obj-$(CONFIG_XILINX_VIRTEX) += xilinx_intc.o
endif
# Temporary hack until we have migrated to asm-powerpc
diff --git a/arch/powerpc/sysdev/xilinx_intc.c b/arch/powerpc/sysdev/xilinx_intc.c
new file mode 100644
index 0000000..c2f17cc
--- /dev/null
+++ b/arch/powerpc/sysdev/xilinx_intc.c
@@ -0,0 +1,151 @@
+/*
+ * Interrupt controller driver for Xilinx Virtex FPGAs
+ *
+ * Copyright (C) 2007 Secret Lab Technologies Ltd.
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2. This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ *
+ */
+
+/*
+ * This is a driver for the interrupt controller typically found in
+ * Xilinx Virtex FPGA designs.
+ *
+ * The interrupt sense levels are hard coded into the FPGA design with
+ * typically a 1:1 relationship between irq lines and devices (no shared
+ * irq lines). Therefore, this driver does not attempt to handle edge
+ * and level interrupts differently.
+ */
+#undef DEBUG
+
+#include <linux/kernel.h>
+#include <linux/irq.h>
+#include <linux/of.h>
+#include <asm/io.h>
+#include <asm/processor.h>
+#include <asm/irq.h>
+
+/*
+ * INTC Registers
+ */
+#define XINTC_ISR 0 /* Interrupt Status */
+#define XINTC_IPR 4 /* Interrupt Pending */
+#define XINTC_IER 8 /* Interrupt Enable */
+#define XINTC_IAR 12 /* Interrupt Acknowledge */
+#define XINTC_SIE 16 /* Set Interrupt Enable bits */
+#define XINTC_CIE 20 /* Clear Interrupt Enable bits */
+#define XINTC_IVR 24 /* Interrupt Vector */
+#define XINTC_MER 28 /* Master Enable */
+
+static struct irq_host *master_irqhost;
+
+/*
+ * IRQ Chip operations
+ */
+static void xilinx_intc_mask(unsigned int virq)
+{
+ int irq = virq_to_hw(virq);
+ void * regs = get_irq_chip_data(virq);
+ pr_debug("mask: %d\n", irq);
+ out_be32(regs + XINTC_CIE, 1 << irq);
+}
+
+static void xilinx_intc_unmask(unsigned int virq)
+{
+ int irq = virq_to_hw(virq);
+ void * regs = get_irq_chip_data(virq);
+ pr_debug("unmask: %d\n", irq);
+ out_be32(regs + XINTC_SIE, 1 << irq);
+}
+
+static void xilinx_intc_ack(unsigned int virq)
+{
+ int irq = virq_to_hw(virq);
+ void * regs = get_irq_chip_data(virq);
+ pr_debug("ack: %d\n", irq);
+ out_be32(regs + XINTC_IAR, 1 << irq);
+}
+
+static struct irq_chip xilinx_intc_irqchip = {
+ .typename = "Xilinx INTC",
+ .mask = xilinx_intc_mask,
+ .unmask = xilinx_intc_unmask,
+ .ack = xilinx_intc_ack,
+};
+
+/*
+ * IRQ Host operations
+ */
+static int xilinx_intc_map(struct irq_host *h, unsigned int virq,
+ irq_hw_number_t irq)
+{
+ set_irq_chip_data(virq, h->host_data);
+ set_irq_chip_and_handler(virq, &xilinx_intc_irqchip, handle_level_irq);
+ set_irq_type(virq, IRQ_TYPE_NONE);
+ return 0;
+}
+
+static struct irq_host_ops xilinx_intc_ops = {
+ .map = xilinx_intc_map,
+};
+
+struct irq_host * __init
+xilinx_intc_init(struct device_node *np)
+{
+ struct irq_host * irq;
+ struct resource res;
+ void * regs;
+ int rc;
+
+ /* Find and map the intc registers */
+ rc = of_address_to_resource(np, 0, &res);
+ if (rc) {
+ printk(KERN_ERR __FILE__ ": of_address_to_resource() failed\n");
+ return NULL;
+ }
+ regs = ioremap(res.start, 32);
+
+ printk(KERN_INFO "Xilinx intc at 0x%08X mapped to 0x%p\n",
+ res.start, regs);
+
+ /* Setup interrupt controller */
+ out_be32(regs + XINTC_IER, 0); /* disable all irqs */
+ out_be32(regs + XINTC_IAR, ~(u32) 0); /* Acknowledge pending irqs */
+ out_be32(regs + XINTC_MER, 0x3UL); /* Turn on the Master Enable. */
+
+ /* Allocate and initialize an irq_host structure. */
+ irq = irq_alloc_host(np, IRQ_HOST_MAP_LINEAR, 32, &xilinx_intc_ops, -1);
+ if (!irq)
+ panic(__FILE__ ": Cannot allocate IRQ host\n");
+ irq->host_data = regs;
+ return irq;
+}
+
+int xilinx_intc_get_irq(void)
+{
+ void * regs = master_irqhost->host_data;
+ pr_debug("get_irq:\n");
+ return irq_linear_revmap(master_irqhost, in_be32(regs + XINTC_IVR));
+}
+
+void __init xilinx_intc_init_tree(void)
+{
+ struct device_node *np;
+
+ /* find top level interrupt controller */
+ for_each_compatible_node(np, NULL, "xilinx,intc") {
+ if (!of_get_property(np, "interrupts", NULL))
+ break;
+ }
+
+ /* xilinx interrupt controller needs to be top level */
+ BUG_ON(!np);
+
+ master_irqhost = xilinx_intc_init(np);
+ BUG_ON(!master_irqhost);
+
+ irq_set_default_host(master_irqhost);
+ of_node_put(np);
+}
diff --git a/include/asm-powerpc/xilinx_intc.h b/include/asm-powerpc/xilinx_intc.h
new file mode 100644
index 0000000..343612f
--- /dev/null
+++ b/include/asm-powerpc/xilinx_intc.h
@@ -0,0 +1,20 @@
+/*
+ * Xilinx intc external definitions
+ *
+ * Copyright 2007 Secret Lab Technologies Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ */
+#ifndef _ASM_POWERPC_XILINX_INTC_H
+#define _ASM_POWERPC_XILINX_INTC_H
+
+#ifdef __KERNEL__
+
+extern void __init xilinx_intc_init_tree(void);
+extern unsigned int xilinx_intc_get_irq(void);
+
+#endif /* __KERNEL__ */
+#endif /* _ASM_POWERPC_XILINX_INTC_H */
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v3 04/12] Virtex: Add generic Xilinx Virtex board support
2007-10-02 2:15 [PATCH v3 00/12] Xilinx Virtex and Uartlite arch/powerpc patches ready for merge Grant Likely
` (2 preceding siblings ...)
2007-10-02 2:15 ` [PATCH v3 03/12] Virtex: add xilinx interrupt controller driver Grant Likely
@ 2007-10-02 2:15 ` Grant Likely
2007-10-02 2:15 ` [PATCH v3 05/12] Add PowerPC Xilinx Virtex entry to maintainers Grant Likely
` (7 subsequent siblings)
11 siblings, 0 replies; 22+ messages in thread
From: Grant Likely @ 2007-10-02 2:15 UTC (permalink / raw)
To: linuxppc-dev, jwboyer
From: Grant Likely <grant.likely@secretlab.ca>
Adds support for generic Xilinx Virtex boards. Any board which specifies
"xilinx,virtex" in the compatible property will make use of this board
support.
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
---
arch/powerpc/platforms/40x/Makefile | 1 +
arch/powerpc/platforms/40x/virtex.c | 50 +++++++++++++++++++++++++++++++++++
2 files changed, 51 insertions(+), 0 deletions(-)
diff --git a/arch/powerpc/platforms/40x/Makefile b/arch/powerpc/platforms/40x/Makefile
index e6c0bbd..0a3cfe9 100644
--- a/arch/powerpc/platforms/40x/Makefile
+++ b/arch/powerpc/platforms/40x/Makefile
@@ -1 +1,2 @@
obj-$(CONFIG_WALNUT) += walnut.o
+obj-$(CONFIG_XILINX_VIRTEX_GENERIC_BOARD) += virtex.o
diff --git a/arch/powerpc/platforms/40x/virtex.c b/arch/powerpc/platforms/40x/virtex.c
new file mode 100644
index 0000000..b52aa94
--- /dev/null
+++ b/arch/powerpc/platforms/40x/virtex.c
@@ -0,0 +1,50 @@
+/*
+ * Xilinx Virtex (IIpro & 4FX) based board support
+ *
+ * Copyright 2007 Secret Lab Technologies Ltd.
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2. This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ */
+
+#include <linux/init.h>
+#include <linux/of_platform.h>
+#include <asm/machdep.h>
+#include <asm/prom.h>
+#include <asm/time.h>
+#include <asm/xilinx_intc.h>
+
+static int __init virtex_device_probe(void)
+{
+ if (!machine_is(virtex))
+ return 0;
+
+ of_platform_bus_probe(NULL, NULL, NULL);
+
+ return 0;
+}
+device_initcall(virtex_device_probe);
+
+static int __init virtex_probe(void)
+{
+ unsigned long root = of_get_flat_dt_root();
+
+ if (!of_flat_dt_is_compatible(root, "xilinx,virtex"))
+ return 0;
+
+ return 1;
+}
+
+static void __init virtex_setup_arch(void)
+{
+}
+
+define_machine(virtex) {
+ .name = "Xilinx Virtex",
+ .probe = virtex_probe,
+ .setup_arch = virtex_setup_arch,
+ .init_IRQ = xilinx_intc_init_tree,
+ .get_irq = xilinx_intc_get_irq,
+ .calibrate_decr = generic_calibrate_decr,
+};
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v3 05/12] Add PowerPC Xilinx Virtex entry to maintainers
2007-10-02 2:15 [PATCH v3 00/12] Xilinx Virtex and Uartlite arch/powerpc patches ready for merge Grant Likely
` (3 preceding siblings ...)
2007-10-02 2:15 ` [PATCH v3 04/12] Virtex: Add generic Xilinx Virtex board support Grant Likely
@ 2007-10-02 2:15 ` Grant Likely
2007-10-02 18:53 ` Peter Korsgaard
2007-10-02 2:15 ` [PATCH v3 06/12] Uartlite: Fix reg io to access documented register size Grant Likely
` (6 subsequent siblings)
11 siblings, 1 reply; 22+ messages in thread
From: Grant Likely @ 2007-10-02 2:15 UTC (permalink / raw)
To: linuxppc-dev, jwboyer
From: Grant Likely <grant.likely@secretlab.ca>
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
---
MAINTAINERS | 7 +++++++
1 files changed, 7 insertions(+), 0 deletions(-)
diff --git a/MAINTAINERS b/MAINTAINERS
index 8f80068..bca4ca5 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -2304,6 +2304,13 @@ L: linuxppc-embedded@ozlabs.org
T: git kernel.org:/pub/scm/linux/kernel/git/jwboyer/powerpc.git
S: Maintained
+LINUX FOR POWERPC EMBEDDED XILINX VIRTEX
+P: Grant Likely
+M: grant.likely@secretlab.ca
+W: http://www.secretlab.ca/
+L: linuxppc-dev@ozlabs.org
+S: Maintained
+
LINUX FOR POWERPC BOOT CODE
P: Tom Rini
M: trini@kernel.crashing.org
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v3 06/12] Uartlite: Fix reg io to access documented register size
2007-10-02 2:15 [PATCH v3 00/12] Xilinx Virtex and Uartlite arch/powerpc patches ready for merge Grant Likely
` (4 preceding siblings ...)
2007-10-02 2:15 ` [PATCH v3 05/12] Add PowerPC Xilinx Virtex entry to maintainers Grant Likely
@ 2007-10-02 2:15 ` Grant Likely
2007-10-02 2:15 ` [PATCH v3 07/12] Uartlite: change name of ports to ulite_ports Grant Likely
` (5 subsequent siblings)
11 siblings, 0 replies; 22+ messages in thread
From: Grant Likely @ 2007-10-02 2:15 UTC (permalink / raw)
To: linuxppc-dev, jwboyer
From: Grant Likely <grant.likely@secretlab.ca>
The Uartlite data sheet defines the registers as 32 bit wide. This
patch changes the register access to use 32 bit transfers and eliminates
the magic +3 offset which is currently required to make the device
work.
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
Acked-by: John Williams <jwilliams@itee.uq.edu.au>
---
arch/ppc/syslib/virtex_devices.c | 2 +-
drivers/serial/uartlite.c | 32 ++++++++++++++++----------------
2 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/arch/ppc/syslib/virtex_devices.c b/arch/ppc/syslib/virtex_devices.c
index ace4ec0..270ad3a 100644
--- a/arch/ppc/syslib/virtex_devices.c
+++ b/arch/ppc/syslib/virtex_devices.c
@@ -28,7 +28,7 @@
.num_resources = 2, \
.resource = (struct resource[]) { \
{ \
- .start = XPAR_UARTLITE_##num##_BASEADDR + 3, \
+ .start = XPAR_UARTLITE_##num##_BASEADDR, \
.end = XPAR_UARTLITE_##num##_HIGHADDR, \
.flags = IORESOURCE_MEM, \
}, \
diff --git a/drivers/serial/uartlite.c b/drivers/serial/uartlite.c
index f5051cf..59b674a 100644
--- a/drivers/serial/uartlite.c
+++ b/drivers/serial/uartlite.c
@@ -61,7 +61,7 @@ static int ulite_receive(struct uart_port *port, int stat)
/* stats */
if (stat & ULITE_STATUS_RXVALID) {
port->icount.rx++;
- ch = readb(port->membase + ULITE_RX);
+ ch = in_be32((void*)port->membase + ULITE_RX);
if (stat & ULITE_STATUS_PARITY)
port->icount.parity++;
@@ -106,7 +106,7 @@ static int ulite_transmit(struct uart_port *port, int stat)
return 0;
if (port->x_char) {
- writeb(port->x_char, port->membase + ULITE_TX);
+ out_be32((void*)port->membase + ULITE_TX, port->x_char);
port->x_char = 0;
port->icount.tx++;
return 1;
@@ -115,7 +115,7 @@ static int ulite_transmit(struct uart_port *port, int stat)
if (uart_circ_empty(xmit) || uart_tx_stopped(port))
return 0;
- writeb(xmit->buf[xmit->tail], port->membase + ULITE_TX);
+ out_be32((void*)port->membase + ULITE_TX, xmit->buf[xmit->tail]);
xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE-1);
port->icount.tx++;
@@ -132,7 +132,7 @@ static irqreturn_t ulite_isr(int irq, void *dev_id)
int busy;
do {
- int stat = readb(port->membase + ULITE_STATUS);
+ int stat = in_be32((void*)port->membase + ULITE_STATUS);
busy = ulite_receive(port, stat);
busy |= ulite_transmit(port, stat);
} while (busy);
@@ -148,7 +148,7 @@ static unsigned int ulite_tx_empty(struct uart_port *port)
unsigned int ret;
spin_lock_irqsave(&port->lock, flags);
- ret = readb(port->membase + ULITE_STATUS);
+ ret = in_be32((void*)port->membase + ULITE_STATUS);
spin_unlock_irqrestore(&port->lock, flags);
return ret & ULITE_STATUS_TXEMPTY ? TIOCSER_TEMT : 0;
@@ -171,7 +171,7 @@ static void ulite_stop_tx(struct uart_port *port)
static void ulite_start_tx(struct uart_port *port)
{
- ulite_transmit(port, readb(port->membase + ULITE_STATUS));
+ ulite_transmit(port, in_be32((void*)port->membase + ULITE_STATUS));
}
static void ulite_stop_rx(struct uart_port *port)
@@ -200,17 +200,17 @@ static int ulite_startup(struct uart_port *port)
if (ret)
return ret;
- writeb(ULITE_CONTROL_RST_RX | ULITE_CONTROL_RST_TX,
- port->membase + ULITE_CONTROL);
- writeb(ULITE_CONTROL_IE, port->membase + ULITE_CONTROL);
+ out_be32((void*)port->membase + ULITE_CONTROL,
+ ULITE_CONTROL_RST_RX | ULITE_CONTROL_RST_TX);
+ out_be32((void*)port->membase + ULITE_CONTROL, ULITE_CONTROL_IE);
return 0;
}
static void ulite_shutdown(struct uart_port *port)
{
- writeb(0, port->membase + ULITE_CONTROL);
- readb(port->membase + ULITE_CONTROL); /* dummy */
+ out_be32((void*)port->membase + ULITE_CONTROL, 0);
+ in_be32((void*)port->membase + ULITE_CONTROL); /* dummy */
free_irq(port->irq, port);
}
@@ -314,7 +314,7 @@ static void ulite_console_wait_tx(struct uart_port *port)
/* wait up to 10ms for the character(s) to be sent */
for (i = 0; i < 10000; i++) {
- if (readb(port->membase + ULITE_STATUS) & ULITE_STATUS_TXEMPTY)
+ if (in_be32((void*)port->membase + ULITE_STATUS) & ULITE_STATUS_TXEMPTY)
break;
udelay(1);
}
@@ -323,7 +323,7 @@ static void ulite_console_wait_tx(struct uart_port *port)
static void ulite_console_putchar(struct uart_port *port, int ch)
{
ulite_console_wait_tx(port);
- writeb(ch, port->membase + ULITE_TX);
+ out_be32((void*)port->membase + ULITE_TX, ch);
}
static void ulite_console_write(struct console *co, const char *s,
@@ -340,8 +340,8 @@ static void ulite_console_write(struct console *co, const char *s,
spin_lock_irqsave(&port->lock, flags);
/* save and disable interrupt */
- ier = readb(port->membase + ULITE_STATUS) & ULITE_STATUS_IE;
- writeb(0, port->membase + ULITE_CONTROL);
+ ier = in_be32((void*)port->membase + ULITE_STATUS) & ULITE_STATUS_IE;
+ out_be32((void*)port->membase + ULITE_CONTROL, 0);
uart_console_write(port, s, count, ulite_console_putchar);
@@ -349,7 +349,7 @@ static void ulite_console_write(struct console *co, const char *s,
/* restore interrupt state */
if (ier)
- writeb(ULITE_CONTROL_IE, port->membase + ULITE_CONTROL);
+ out_be32((void*)port->membase + ULITE_CONTROL, ULITE_CONTROL_IE);
if (locked)
spin_unlock_irqrestore(&port->lock, flags);
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v3 07/12] Uartlite: change name of ports to ulite_ports
2007-10-02 2:15 [PATCH v3 00/12] Xilinx Virtex and Uartlite arch/powerpc patches ready for merge Grant Likely
` (5 preceding siblings ...)
2007-10-02 2:15 ` [PATCH v3 06/12] Uartlite: Fix reg io to access documented register size Grant Likely
@ 2007-10-02 2:15 ` Grant Likely
2007-10-02 18:53 ` Peter Korsgaard
2007-10-02 2:15 ` [PATCH v3 08/12] Uartlite: Add macro for uartlite device name Grant Likely
` (4 subsequent siblings)
11 siblings, 1 reply; 22+ messages in thread
From: Grant Likely @ 2007-10-02 2:15 UTC (permalink / raw)
To: linuxppc-dev, jwboyer
From: Grant Likely <grant.likely@secretlab.ca>
Changed to match naming convention used in the rest of the module
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
---
drivers/serial/uartlite.c | 10 +++++-----
1 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/drivers/serial/uartlite.c b/drivers/serial/uartlite.c
index 59b674a..ae05a67 100644
--- a/drivers/serial/uartlite.c
+++ b/drivers/serial/uartlite.c
@@ -46,7 +46,7 @@
#define ULITE_CONTROL_IE 0x10
-static struct uart_port ports[ULITE_NR_UARTS];
+static struct uart_port ulite_ports[ULITE_NR_UARTS];
static int ulite_receive(struct uart_port *port, int stat)
{
@@ -329,7 +329,7 @@ static void ulite_console_putchar(struct uart_port *port, int ch)
static void ulite_console_write(struct console *co, const char *s,
unsigned int count)
{
- struct uart_port *port = &ports[co->index];
+ struct uart_port *port = &ulite_ports[co->index];
unsigned long flags;
unsigned int ier;
int locked = 1;
@@ -366,7 +366,7 @@ static int __init ulite_console_setup(struct console *co, char *options)
if (co->index < 0 || co->index >= ULITE_NR_UARTS)
return -EINVAL;
- port = &ports[co->index];
+ port = &ulite_ports[co->index];
/* not initialized yet? */
if (!port->membase)
@@ -420,7 +420,7 @@ static int __devinit ulite_probe(struct platform_device *pdev)
if (pdev->id < 0 || pdev->id >= ULITE_NR_UARTS)
return -EINVAL;
- if (ports[pdev->id].membase)
+ if (ulite_ports[pdev->id].membase)
return -EBUSY;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -431,7 +431,7 @@ static int __devinit ulite_probe(struct platform_device *pdev)
if (!res2)
return -ENODEV;
- port = &ports[pdev->id];
+ port = &ulite_ports[pdev->id];
port->fifosize = 16;
port->regshift = 2;
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v3 08/12] Uartlite: Add macro for uartlite device name
2007-10-02 2:15 [PATCH v3 00/12] Xilinx Virtex and Uartlite arch/powerpc patches ready for merge Grant Likely
` (6 preceding siblings ...)
2007-10-02 2:15 ` [PATCH v3 07/12] Uartlite: change name of ports to ulite_ports Grant Likely
@ 2007-10-02 2:15 ` Grant Likely
2007-10-02 19:05 ` Peter Korsgaard
2007-10-02 2:15 ` [PATCH v3 09/12] Uartlite: Separate the bus binding from the driver proper Grant Likely
` (3 subsequent siblings)
11 siblings, 1 reply; 22+ messages in thread
From: Grant Likely @ 2007-10-02 2:15 UTC (permalink / raw)
To: linuxppc-dev, jwboyer
From: Grant Likely <grant.likely@secretlab.ca>
Changed to make the following OF_platform bus binding patch a wee bit cleaner
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
---
drivers/serial/uartlite.c | 5 +++--
1 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/serial/uartlite.c b/drivers/serial/uartlite.c
index ae05a67..10e0da9 100644
--- a/drivers/serial/uartlite.c
+++ b/drivers/serial/uartlite.c
@@ -18,6 +18,7 @@
#include <linux/interrupt.h>
#include <asm/io.h>
+#define ULITE_NAME "ttyUL"
#define ULITE_MAJOR 204
#define ULITE_MINOR 187
#define ULITE_NR_UARTS 4
@@ -381,7 +382,7 @@ static int __init ulite_console_setup(struct console *co, char *options)
static struct uart_driver ulite_uart_driver;
static struct console ulite_console = {
- .name = "ttyUL",
+ .name = ULITE_NAME,
.write = ulite_console_write,
.device = uart_console_device,
.setup = ulite_console_setup,
@@ -403,7 +404,7 @@ console_initcall(ulite_console_init);
static struct uart_driver ulite_uart_driver = {
.owner = THIS_MODULE,
.driver_name = "uartlite",
- .dev_name = "ttyUL",
+ .dev_name = ULITE_NAME,
.major = ULITE_MAJOR,
.minor = ULITE_MINOR,
.nr = ULITE_NR_UARTS,
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v3 09/12] Uartlite: Separate the bus binding from the driver proper
2007-10-02 2:15 [PATCH v3 00/12] Xilinx Virtex and Uartlite arch/powerpc patches ready for merge Grant Likely
` (7 preceding siblings ...)
2007-10-02 2:15 ` [PATCH v3 08/12] Uartlite: Add macro for uartlite device name Grant Likely
@ 2007-10-02 2:15 ` Grant Likely
2007-10-02 2:15 ` [PATCH v3 10/12] Uartlite: Comment block tidy Grant Likely
` (2 subsequent siblings)
11 siblings, 0 replies; 22+ messages in thread
From: Grant Likely @ 2007-10-02 2:15 UTC (permalink / raw)
To: linuxppc-dev, jwboyer
From: Grant Likely <grant.likely@secretlab.ca>
Separate the bus binding code from the driver structure allocation code in
preparation for adding the of_platform_bus bindings needed by arch/powerpc
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
---
drivers/serial/uartlite.c | 99 ++++++++++++++++++++++++++++++---------------
1 files changed, 65 insertions(+), 34 deletions(-)
diff --git a/drivers/serial/uartlite.c b/drivers/serial/uartlite.c
index 10e0da9..c00a627 100644
--- a/drivers/serial/uartlite.c
+++ b/drivers/serial/uartlite.c
@@ -413,59 +413,90 @@ static struct uart_driver ulite_uart_driver = {
#endif
};
-static int __devinit ulite_probe(struct platform_device *pdev)
+static int __devinit ulite_assign(struct device *dev, int id, u32 base, int irq)
{
- struct resource *res, *res2;
struct uart_port *port;
+ int rc;
- if (pdev->id < 0 || pdev->id >= ULITE_NR_UARTS)
+ /* if id = -1; then scan for a free id and use that */
+ if (id < 0) {
+ for (id = 0; id < ULITE_NR_UARTS; id++)
+ if (ulite_ports[id].mapbase == 0)
+ break;
+ }
+ if (id < 0 || id >= ULITE_NR_UARTS) {
+ dev_err(dev, "%s%i too large\n", ULITE_NAME, id);
return -EINVAL;
+ }
- if (ulite_ports[pdev->id].membase)
+ if (ulite_ports[id].mapbase) {
+ dev_err(dev, "cannot assign to %s%i; it is already in use\n",
+ ULITE_NAME, id);
return -EBUSY;
+ }
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- if (!res)
- return -ENODEV;
+ port = &ulite_ports[id];
- res2 = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
- if (!res2)
- return -ENODEV;
+ spin_lock_init(&port->lock);
+ port->fifosize = 16;
+ port->regshift = 2;
+ port->iotype = UPIO_MEM;
+ port->iobase = 1; /* mark port in use */
+ port->mapbase = base;
+ port->membase = NULL;
+ port->ops = &ulite_ops;
+ port->irq = irq;
+ port->flags = UPF_BOOT_AUTOCONF;
+ port->dev = dev;
+ port->type = PORT_UNKNOWN;
+ port->line = id;
+
+ dev_set_drvdata(dev, port);
+
+ /* Register the port */
+ rc = uart_add_one_port(&ulite_uart_driver, port);
+ if (rc) {
+ dev_err(dev, "uart_add_one_port() failed; err=%i\n", rc);
+ port->mapbase = 0;
+ dev_set_drvdata(dev, NULL);
+ return rc;
+ }
- port = &ulite_ports[pdev->id];
+ return 0;
+}
- port->fifosize = 16;
- port->regshift = 2;
- port->iotype = UPIO_MEM;
- port->iobase = 1; /* mark port in use */
- port->mapbase = res->start;
- port->membase = NULL;
- port->ops = &ulite_ops;
- port->irq = res2->start;
- port->flags = UPF_BOOT_AUTOCONF;
- port->dev = &pdev->dev;
- port->type = PORT_UNKNOWN;
- port->line = pdev->id;
+static int __devinit ulite_release(struct device *dev)
+{
+ struct uart_port *port = dev_get_drvdata(dev);
+ int rc = 0;
- uart_add_one_port(&ulite_uart_driver, port);
- platform_set_drvdata(pdev, port);
+ if (port) {
+ rc = uart_remove_one_port(&ulite_uart_driver, port);
+ dev_set_drvdata(dev, NULL);
+ port->mapbase = 0;
+ }
- return 0;
+ return rc;
}
-static int ulite_remove(struct platform_device *pdev)
+static int __devinit ulite_probe(struct platform_device *pdev)
{
- struct uart_port *port = platform_get_drvdata(pdev);
+ struct resource *res, *res2;
- platform_set_drvdata(pdev, NULL);
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!res)
+ return -ENODEV;
- if (port)
- uart_remove_one_port(&ulite_uart_driver, port);
+ res2 = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
+ if (!res2)
+ return -ENODEV;
- /* mark port as free */
- port->membase = NULL;
+ return ulite_assign(&pdev->dev, pdev->id, res->start, res2->start);
+}
- return 0;
+static int ulite_remove(struct platform_device *pdev)
+{
+ return ulite_release(&pdev->dev);
}
static struct platform_driver ulite_platform_driver = {
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v3 10/12] Uartlite: Comment block tidy
2007-10-02 2:15 [PATCH v3 00/12] Xilinx Virtex and Uartlite arch/powerpc patches ready for merge Grant Likely
` (8 preceding siblings ...)
2007-10-02 2:15 ` [PATCH v3 09/12] Uartlite: Separate the bus binding from the driver proper Grant Likely
@ 2007-10-02 2:15 ` Grant Likely
2007-10-02 19:05 ` Peter Korsgaard
2007-10-02 2:16 ` [PATCH v3 11/12] Uartlite: Add of-platform-bus binding Grant Likely
2007-10-02 2:16 ` [PATCH v3 12/12] Uartlite: Let the console be initialized earlier Grant Likely
11 siblings, 1 reply; 22+ messages in thread
From: Grant Likely @ 2007-10-02 2:15 UTC (permalink / raw)
To: linuxppc-dev, jwboyer
From: Grant Likely <grant.likely@secretlab.ca>
Tidy the comments to split the driver into logical section; the main driver,
the console driver, the platform bus binding, and module initialization
and teardown.
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
---
drivers/serial/uartlite.c | 43 ++++++++++++++++++++++++++++++++++++++++---
1 files changed, 40 insertions(+), 3 deletions(-)
diff --git a/drivers/serial/uartlite.c b/drivers/serial/uartlite.c
index c00a627..ed13b9f 100644
--- a/drivers/serial/uartlite.c
+++ b/drivers/serial/uartlite.c
@@ -23,9 +23,13 @@
#define ULITE_MINOR 187
#define ULITE_NR_UARTS 4
-/* For register details see datasheet:
- http://www.xilinx.com/bvdocs/ipcenter/data_sheet/opb_uartlite.pdf
-*/
+/* ---------------------------------------------------------------------
+ * Register definitions
+ *
+ * For register details see datasheet:
+ * http://www.xilinx.com/bvdocs/ipcenter/data_sheet/opb_uartlite.pdf
+ */
+
#define ULITE_RX 0x00
#define ULITE_TX 0x04
#define ULITE_STATUS 0x08
@@ -49,6 +53,10 @@
static struct uart_port ulite_ports[ULITE_NR_UARTS];
+/* ---------------------------------------------------------------------
+ * Core UART driver operations
+ */
+
static int ulite_receive(struct uart_port *port, int stat)
{
struct tty_struct *tty = port->info->tty;
@@ -308,6 +316,10 @@ static struct uart_ops ulite_ops = {
.verify_port = ulite_verify_port
};
+/* ---------------------------------------------------------------------
+ * Console driver operations
+ */
+
#ifdef CONFIG_SERIAL_UARTLITE_CONSOLE
static void ulite_console_wait_tx(struct uart_port *port)
{
@@ -413,6 +425,19 @@ static struct uart_driver ulite_uart_driver = {
#endif
};
+/* ---------------------------------------------------------------------
+ * Port assignment functions (mapping devices to uart_port structures)
+ */
+
+/** ulite_assign: register a uartlite device with the driver
+ *
+ * @dev: pointer to device structure
+ * @id: requested id number. Pass -1 for automatic port assignment
+ * @base: base address of uartlite registers
+ * @irq: irq number for uartlite
+ *
+ * Returns: 0 on success, <0 otherwise
+ */
static int __devinit ulite_assign(struct device *dev, int id, u32 base, int irq)
{
struct uart_port *port;
@@ -465,6 +490,10 @@ static int __devinit ulite_assign(struct device *dev, int id, u32 base, int irq)
return 0;
}
+/** ulite_release: register a uartlite device with the driver
+ *
+ * @dev: pointer to device structure
+ */
static int __devinit ulite_release(struct device *dev)
{
struct uart_port *port = dev_get_drvdata(dev);
@@ -479,6 +508,10 @@ static int __devinit ulite_release(struct device *dev)
return rc;
}
+/* ---------------------------------------------------------------------
+ * Platform bus binding
+ */
+
static int __devinit ulite_probe(struct platform_device *pdev)
{
struct resource *res, *res2;
@@ -508,6 +541,10 @@ static struct platform_driver ulite_platform_driver = {
},
};
+/* ---------------------------------------------------------------------
+ * Module setup/teardown
+ */
+
int __init ulite_init(void)
{
int ret;
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v3 11/12] Uartlite: Add of-platform-bus binding
2007-10-02 2:15 [PATCH v3 00/12] Xilinx Virtex and Uartlite arch/powerpc patches ready for merge Grant Likely
` (9 preceding siblings ...)
2007-10-02 2:15 ` [PATCH v3 10/12] Uartlite: Comment block tidy Grant Likely
@ 2007-10-02 2:16 ` Grant Likely
2007-10-02 18:54 ` Peter Korsgaard
2007-10-02 2:16 ` [PATCH v3 12/12] Uartlite: Let the console be initialized earlier Grant Likely
11 siblings, 1 reply; 22+ messages in thread
From: Grant Likely @ 2007-10-02 2:16 UTC (permalink / raw)
To: linuxppc-dev, jwboyer
From: Grant Likely <grant.likely@secretlab.ca>
Add of_platform bus binding so this driver can be used with arch/powerpc
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
---
drivers/serial/uartlite.c | 96 +++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 92 insertions(+), 4 deletions(-)
diff --git a/drivers/serial/uartlite.c b/drivers/serial/uartlite.c
index ed13b9f..0904c2a 100644
--- a/drivers/serial/uartlite.c
+++ b/drivers/serial/uartlite.c
@@ -1,7 +1,8 @@
/*
* uartlite.c: Serial driver for Xilinx uartlite serial controller
*
- * Peter Korsgaard <jacmet@sunsite.dk>
+ * Copyright (C) 2006 Peter Korsgaard <jacmet@sunsite.dk>
+ * Copyright (C) 2007 Secret Lab Technologies Ltd.
*
* This file is licensed under the terms of the GNU General Public License
* version 2. This program is licensed "as is" without any warranty of any
@@ -17,6 +18,10 @@
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <asm/io.h>
+#if defined(CONFIG_OF)
+#include <linux/of_device.h>
+#include <linux/of_platform.h>
+#endif
#define ULITE_NAME "ttyUL"
#define ULITE_MAJOR 204
@@ -382,8 +387,10 @@ static int __init ulite_console_setup(struct console *co, char *options)
port = &ulite_ports[co->index];
/* not initialized yet? */
- if (!port->membase)
+ if (!port->membase) {
+ pr_debug("console on ttyUL%i not initialized\n", co->index);
return -ENODEV;
+ }
if (options)
uart_parse_options(options, &baud, &parity, &bits, &flow);
@@ -542,6 +549,72 @@ static struct platform_driver ulite_platform_driver = {
};
/* ---------------------------------------------------------------------
+ * OF bus bindings
+ */
+#if defined(CONFIG_OF)
+static int __devinit
+ulite_of_probe(struct of_device *op, const struct of_device_id *match)
+{
+ struct resource res;
+ const unsigned int *id;
+ int irq, rc;
+
+ dev_dbg(&op->dev, "%s(%p, %p)\n", __FUNCTION__, op, match);
+
+ rc = of_address_to_resource(op->node, 0, &res);
+ if (rc) {
+ dev_err(&op->dev, "invalide address\n");
+ return rc;
+ }
+
+ irq = irq_of_parse_and_map(op->node, 0);
+
+ id = of_get_property(op->node, "port-number", NULL);
+
+ return ulite_assign(&op->dev, id ? *id : -1, res.start, irq);
+}
+
+static int __devexit ulite_of_remove(struct of_device *op)
+{
+ return ulite_release(&op->dev);
+}
+
+/* Match table for of_platform binding */
+static struct of_device_id __devinit ulite_of_match[] = {
+ { .type = "serial", .compatible = "xilinx,uartlite", },
+ {},
+};
+MODULE_DEVICE_TABLE(of, ulite_of_match);
+
+static struct of_platform_driver ulite_of_driver = {
+ .owner = THIS_MODULE,
+ .name = "uartlite",
+ .match_table = ulite_of_match,
+ .probe = ulite_of_probe,
+ .remove = __devexit_p(ulite_of_remove),
+ .driver = {
+ .name = "uartlite",
+ },
+};
+
+/* Registration helpers to keep the number of #ifdefs to a minimum */
+static inline int __init ulite_of_register(void)
+{
+ pr_debug("uartlite: calling of_register_platform_driver()\n");
+ return of_register_platform_driver(&ulite_of_driver);
+}
+
+static inline void __exit ulite_of_unregister(void)
+{
+ of_unregister_platform_driver(&ulite_of_driver);
+}
+#else /* CONFIG_OF */
+/* CONFIG_OF not enabled; do nothing helpers */
+static inline int __init ulite_of_register(void) { return 0; }
+static inline void __exit ulite_of_unregister(void) { }
+#endif /* CONFIG_OF */
+
+/* ---------------------------------------------------------------------
* Module setup/teardown
*/
@@ -549,20 +622,35 @@ int __init ulite_init(void)
{
int ret;
+ pr_debug("uartlite: calling uart_register_driver()\n");
ret = uart_register_driver(&ulite_uart_driver);
if (ret)
- return ret;
+ goto err_uart;
+
+ ret = ulite_of_register();
+ if (ret)
+ goto err_of;
+ pr_debug("uartlite: calling platform_driver_register()\n");
ret = platform_driver_register(&ulite_platform_driver);
if (ret)
- uart_unregister_driver(&ulite_uart_driver);
+ goto err_plat;
+
+ return 0;
+err_plat:
+ ulite_of_unregister();
+err_of:
+ uart_unregister_driver(&ulite_uart_driver);
+err_uart:
+ printk(KERN_ERR "registering uartlite driver failed: err=%i", ret);
return ret;
}
void __exit ulite_exit(void)
{
platform_driver_unregister(&ulite_platform_driver);
+ ulite_of_unregister();
uart_unregister_driver(&ulite_uart_driver);
}
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v3 12/12] Uartlite: Let the console be initialized earlier
2007-10-02 2:15 [PATCH v3 00/12] Xilinx Virtex and Uartlite arch/powerpc patches ready for merge Grant Likely
` (10 preceding siblings ...)
2007-10-02 2:16 ` [PATCH v3 11/12] Uartlite: Add of-platform-bus binding Grant Likely
@ 2007-10-02 2:16 ` Grant Likely
2007-10-02 18:54 ` Peter Korsgaard
11 siblings, 1 reply; 22+ messages in thread
From: Grant Likely @ 2007-10-02 2:16 UTC (permalink / raw)
To: linuxppc-dev, jwboyer
From: Grant Likely <grant.likely@secretlab.ca>
By configuring it earlier we get console output sooner which is helpful
for debugging when the kernel crashes before the serial drivers are
initialized.
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
---
drivers/serial/uartlite.c | 41 ++++++++++++++++++++++++++++++++++++++---
1 files changed, 38 insertions(+), 3 deletions(-)
diff --git a/drivers/serial/uartlite.c b/drivers/serial/uartlite.c
index 0904c2a..2b8404c 100644
--- a/drivers/serial/uartlite.c
+++ b/drivers/serial/uartlite.c
@@ -373,6 +373,31 @@ static void ulite_console_write(struct console *co, const char *s,
spin_unlock_irqrestore(&port->lock, flags);
}
+#if defined(CONFIG_OF)
+static inline void __init ulite_console_of_find_device(int id)
+{
+ struct device_node *np;
+ struct resource res;
+ const unsigned int *of_id;
+ int rc;
+
+ for_each_compatible_node(np, NULL, "xilinx,uartlite") {
+ of_id = of_get_property(np, "port-number", NULL);
+ if ((!of_id) || (*of_id != id))
+ continue;
+
+ rc = of_address_to_resource(np, 0, &res);
+ if (rc)
+ continue;
+
+ ulite_ports[id].mapbase = res.start;
+ return;
+ }
+}
+#else /* CONFIG_OF */
+static inline void __init ulite_console_of_find_device(int id) { /* do nothing */ }
+#endif /* CONFIG_OF */
+
static int __init ulite_console_setup(struct console *co, char *options)
{
struct uart_port *port;
@@ -386,10 +411,20 @@ static int __init ulite_console_setup(struct console *co, char *options)
port = &ulite_ports[co->index];
+ /* Check if it is an OF device */
+ if (!port->mapbase)
+ ulite_console_of_find_device(co->index);
+
+ /* Do we have a device now? */
+ if (!port->mapbase) {
+ pr_debug("console on ttyUL%i not present\n", co->index);
+ return -ENODEV;
+ }
+
/* not initialized yet? */
if (!port->membase) {
- pr_debug("console on ttyUL%i not initialized\n", co->index);
- return -ENODEV;
+ if (ulite_request_port(port))
+ return -ENODEV;
}
if (options)
@@ -461,7 +496,7 @@ static int __devinit ulite_assign(struct device *dev, int id, u32 base, int irq)
return -EINVAL;
}
- if (ulite_ports[id].mapbase) {
+ if ((ulite_ports[id].mapbase) && (ulite_ports[id].mapbase != base)) {
dev_err(dev, "cannot assign to %s%i; it is already in use\n",
ULITE_NAME, id);
return -EBUSY;
^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [PATCH v3 05/12] Add PowerPC Xilinx Virtex entry to maintainers
2007-10-02 2:15 ` [PATCH v3 05/12] Add PowerPC Xilinx Virtex entry to maintainers Grant Likely
@ 2007-10-02 18:53 ` Peter Korsgaard
2007-10-02 19:02 ` Grant Likely
0 siblings, 1 reply; 22+ messages in thread
From: Peter Korsgaard @ 2007-10-02 18:53 UTC (permalink / raw)
To: Grant Likely; +Cc: linuxppc-dev
>>>>> "Grant" == Grant Likely <grant.likely@secretlab.ca> writes:
Hi,
Grant> +LINUX FOR POWERPC EMBEDDED XILINX VIRTEX
Grant> +P: Grant Likely
Grant> +M: grant.likely@secretlab.ca
Grant> +W: http://www.secretlab.ca/
You still don't rather want to link to
http://wiki.secretlab.ca/index.php/Linux_on_Xilinx_Virtex ?
--
Bye, Peter Korsgaard
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v3 07/12] Uartlite: change name of ports to ulite_ports
2007-10-02 2:15 ` [PATCH v3 07/12] Uartlite: change name of ports to ulite_ports Grant Likely
@ 2007-10-02 18:53 ` Peter Korsgaard
0 siblings, 0 replies; 22+ messages in thread
From: Peter Korsgaard @ 2007-10-02 18:53 UTC (permalink / raw)
To: Grant Likely; +Cc: linuxppc-dev
>>>>> "Grant" == Grant Likely <grant.likely@secretlab.ca> writes:
Grant> From: Grant Likely <grant.likely@secretlab.ca>
Grant> Changed to match naming convention used in the rest of the module
Grant> Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
Acked-by: Peter Korsgaard <jacmet@sunsite.dk>
--
Bye, Peter Korsgaard
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v3 11/12] Uartlite: Add of-platform-bus binding
2007-10-02 2:16 ` [PATCH v3 11/12] Uartlite: Add of-platform-bus binding Grant Likely
@ 2007-10-02 18:54 ` Peter Korsgaard
0 siblings, 0 replies; 22+ messages in thread
From: Peter Korsgaard @ 2007-10-02 18:54 UTC (permalink / raw)
To: Grant Likely; +Cc: linuxppc-dev
>>>>> "Grant" == Grant Likely <grant.likely@secretlab.ca> writes:
Grant> From: Grant Likely <grant.likely@secretlab.ca>
Grant> Add of_platform bus binding so this driver can be used with
Grant> arch/powerpc
Grant> Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
Acked-by: Peter Korsgaard <jacmet@sunsite.dk>
--
Bye, Peter Korsgaard
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v3 12/12] Uartlite: Let the console be initialized earlier
2007-10-02 2:16 ` [PATCH v3 12/12] Uartlite: Let the console be initialized earlier Grant Likely
@ 2007-10-02 18:54 ` Peter Korsgaard
0 siblings, 0 replies; 22+ messages in thread
From: Peter Korsgaard @ 2007-10-02 18:54 UTC (permalink / raw)
To: Grant Likely; +Cc: linuxppc-dev
>>>>> "Grant" == Grant Likely <grant.likely@secretlab.ca> writes:
Grant> From: Grant Likely <grant.likely@secretlab.ca> By configuring
Grant> it earlier we get console output sooner which is helpful for
Grant> debugging when the kernel crashes before the serial drivers
Grant> are initialized.
Grant> Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
Acked-by: Peter Korsgaard <jacmet@sunsite.dk>
--
Bye, Peter Korsgaard
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v3 05/12] Add PowerPC Xilinx Virtex entry to maintainers
2007-10-02 18:53 ` Peter Korsgaard
@ 2007-10-02 19:02 ` Grant Likely
0 siblings, 0 replies; 22+ messages in thread
From: Grant Likely @ 2007-10-02 19:02 UTC (permalink / raw)
To: Peter Korsgaard; +Cc: linuxppc-dev
On 10/2/07, Peter Korsgaard <jacmet@sunsite.dk> wrote:
> >>>>> "Grant" == Grant Likely <grant.likely@secretlab.ca> writes:
>
> Hi,
>
> Grant> +LINUX FOR POWERPC EMBEDDED XILINX VIRTEX
> Grant> +P: Grant Likely
> Grant> +M: grant.likely@secretlab.ca
> Grant> +W: http://www.secretlab.ca/
>
> You still don't rather want to link to
> http://wiki.secretlab.ca/index.php/Linux_on_Xilinx_Virtex ?
This is already in jwb's tree like this. I'll submit a fixup patch
this evening.
g.
--
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.
grant.likely@secretlab.ca
(403) 399-0195
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v3 02/12] Virtex: Add Kconfig macros for Xilinx Virtex board support
2007-10-02 2:15 ` [PATCH v3 02/12] Virtex: Add Kconfig macros for Xilinx Virtex board support Grant Likely
@ 2007-10-02 19:04 ` Peter Korsgaard
2007-10-02 19:06 ` Grant Likely
0 siblings, 1 reply; 22+ messages in thread
From: Peter Korsgaard @ 2007-10-02 19:04 UTC (permalink / raw)
To: Grant Likely; +Cc: linuxppc-dev
>>>>> "Grant" == Grant Likely <grant.likely@secretlab.ca> writes:
Hi,
Grant> From: Grant Likely <grant.likely@secretlab.ca>
Grant> Add the needed kconfig macros to enable Xilinx Virtex board support
..
Grant> +config XILINX_VIRTEX_II_PRO
Grant> + bool
Grant> + select XILINX_VIRTEX
Grant> select IBM405_ERR77
Grant> select IBM405_ERR51
Grant> +config XILINX_VIRTEX_4_FX
Grant> + bool
Grant> + select XILINX_VIRTEX
Grant> +
This seems different than under arch/ppc - The errattas were also
enabled for the V4FX - What is correct?
--
Bye, Peter Korsgaard
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v3 08/12] Uartlite: Add macro for uartlite device name
2007-10-02 2:15 ` [PATCH v3 08/12] Uartlite: Add macro for uartlite device name Grant Likely
@ 2007-10-02 19:05 ` Peter Korsgaard
0 siblings, 0 replies; 22+ messages in thread
From: Peter Korsgaard @ 2007-10-02 19:05 UTC (permalink / raw)
To: Grant Likely; +Cc: linuxppc-dev
>>>>> "Grant" == Grant Likely <grant.likely@secretlab.ca> writes:
Grant> From: Grant Likely <grant.likely@secretlab.ca> Changed to make
Grant> the following OF_platform bus binding patch a wee bit cleaner
Grant> Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
Acked-by: Peter Korsgaard <jacmet@sunsite.dk>
--
Bye, Peter Korsgaard
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v3 10/12] Uartlite: Comment block tidy
2007-10-02 2:15 ` [PATCH v3 10/12] Uartlite: Comment block tidy Grant Likely
@ 2007-10-02 19:05 ` Peter Korsgaard
0 siblings, 0 replies; 22+ messages in thread
From: Peter Korsgaard @ 2007-10-02 19:05 UTC (permalink / raw)
To: Grant Likely; +Cc: linuxppc-dev
>>>>> "Grant" == Grant Likely <grant.likely@secretlab.ca> writes:
Grant> From: Grant Likely <grant.likely@secretlab.ca> Tidy the
Grant> comments to split the driver into logical section; the main
Grant> driver, the console driver, the platform bus binding, and
Grant> module initialization and teardown.
Grant> Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
Acked-by: Peter Korsgaard <jacmet@sunsite.dk>
--
Bye, Peter Korsgaard
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v3 02/12] Virtex: Add Kconfig macros for Xilinx Virtex board support
2007-10-02 19:04 ` Peter Korsgaard
@ 2007-10-02 19:06 ` Grant Likely
0 siblings, 0 replies; 22+ messages in thread
From: Grant Likely @ 2007-10-02 19:06 UTC (permalink / raw)
To: Peter Korsgaard; +Cc: linuxppc-dev
On 10/2/07, Peter Korsgaard <jacmet@sunsite.dk> wrote:
> >>>>> "Grant" == Grant Likely <grant.likely@secretlab.ca> writes:
>
> Grant> +config XILINX_VIRTEX_II_PRO
> Grant> + bool
> Grant> + select XILINX_VIRTEX
> Grant> select IBM405_ERR77
> Grant> select IBM405_ERR51
>
> Grant> +config XILINX_VIRTEX_4_FX
> Grant> + bool
> Grant> + select XILINX_VIRTEX
> Grant> +
>
> This seems different than under arch/ppc - The errattas were also
> enabled for the V4FX - What is correct?
I'll need to take another look. I made a mental point to look at it
last week when I wrote it, but apparently I forgot. :-(
Cheers,
g.
--
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.
grant.likely@secretlab.ca
(403) 399-0195
^ permalink raw reply [flat|nested] 22+ messages in thread
end of thread, other threads:[~2007-10-02 19:06 UTC | newest]
Thread overview: 22+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-10-02 2:15 [PATCH v3 00/12] Xilinx Virtex and Uartlite arch/powerpc patches ready for merge Grant Likely
2007-10-02 2:15 ` [PATCH v3 01/12] Virtex: Add uartlite bootwrapper driver Grant Likely
2007-10-02 2:15 ` [PATCH v3 02/12] Virtex: Add Kconfig macros for Xilinx Virtex board support Grant Likely
2007-10-02 19:04 ` Peter Korsgaard
2007-10-02 19:06 ` Grant Likely
2007-10-02 2:15 ` [PATCH v3 03/12] Virtex: add xilinx interrupt controller driver Grant Likely
2007-10-02 2:15 ` [PATCH v3 04/12] Virtex: Add generic Xilinx Virtex board support Grant Likely
2007-10-02 2:15 ` [PATCH v3 05/12] Add PowerPC Xilinx Virtex entry to maintainers Grant Likely
2007-10-02 18:53 ` Peter Korsgaard
2007-10-02 19:02 ` Grant Likely
2007-10-02 2:15 ` [PATCH v3 06/12] Uartlite: Fix reg io to access documented register size Grant Likely
2007-10-02 2:15 ` [PATCH v3 07/12] Uartlite: change name of ports to ulite_ports Grant Likely
2007-10-02 18:53 ` Peter Korsgaard
2007-10-02 2:15 ` [PATCH v3 08/12] Uartlite: Add macro for uartlite device name Grant Likely
2007-10-02 19:05 ` Peter Korsgaard
2007-10-02 2:15 ` [PATCH v3 09/12] Uartlite: Separate the bus binding from the driver proper Grant Likely
2007-10-02 2:15 ` [PATCH v3 10/12] Uartlite: Comment block tidy Grant Likely
2007-10-02 19:05 ` Peter Korsgaard
2007-10-02 2:16 ` [PATCH v3 11/12] Uartlite: Add of-platform-bus binding Grant Likely
2007-10-02 18:54 ` Peter Korsgaard
2007-10-02 2:16 ` [PATCH v3 12/12] Uartlite: Let the console be initialized earlier Grant Likely
2007-10-02 18:54 ` Peter Korsgaard
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).