Re: [PATCH 1/7] [POWERPC] Xilinx: Uartlite: Make console output actually work.

2008-01-09 Thread Peter Korsgaard
 Stephen == Stephen Neuendorffer [EMAIL PROTECTED] writes:

  From: Grant Likely [EMAIL PROTECTED]
  Signed-off-by: Grant Likely [EMAIL PROTECTED]

  Fixed to apply against 2.6.24-rc5, and remove DEBUG information.

Please CC me and the linux-serial list on uartlite patches.

The subject seems to be wrong, as console output works ok here
(non-OF). Perhaps change to uartlite: fix OF console setup ?

  Signed-off-by: Stephen Neuendorffer [EMAIL PROTECTED]
  ---
   drivers/serial/uartlite.c |  121 
  +
   1 files changed, 79 insertions(+), 42 deletions(-)

  diff --git a/drivers/serial/uartlite.c b/drivers/serial/uartlite.c
  index 3f59324..71e4c0a 100644
  --- a/drivers/serial/uartlite.c
  +++ b/drivers/serial/uartlite.c
  @@ -9,6 +9,8 @@
* kind, whether express or implied.
*/
 
  +#undef DEBUG
  +

Don't do that! What are you trying to do?

   #include linux/platform_device.h
   #include linux/module.h
   #include linux/console.h
  @@ -321,6 +323,49 @@ static struct uart_ops ulite_ops = {
   .verify_port= ulite_verify_port
   };
 
  +/**
  + * ulite_get_port: Get the uart_port for a given port number and base addr
  + */
  +static struct uart_port *ulite_get_port(int id)
  +{
  +struct uart_port *port;
  +
  +/* 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)) {
  +printk(KERN_WARNING uartlite: invalid id: %i\n, id);

pr_warn

  +return NULL;
  +}
  +
  +/* The ID is valid, so get the address of the uart_port structure */
  +port = ulite_ports[id];
  +
  +/* Is the structure is already initialized? */
  +if (port-mapbase)
  +return port;
  +
  +/* At this point, we've got an empty uart_port struct, initialize it */
  +spin_lock_init(port-lock);
  +port-membase = NULL;
  +port-fifosize = 16;
  +port-regshift = 2;
  +port-iotype = UPIO_MEM;
  +port-iobase = 1; /* mark port in use */
  +port-ops = ulite_ops;
  +port-irq = NO_IRQ;
  +port-flags = UPF_BOOT_AUTOCONF;
  +port-dev = NULL;
  +port-type = PORT_UNKNOWN;
  +port-line = id;

Please put the above in a conditional istead of 2 returns, E.G.

if (!port-mapbase) {
   spin_lock_init ..

  +
  +return port;
  +}
  +
   /* -
* Console driver operations
*/
  @@ -376,7 +421,7 @@ static void ulite_console_write(struct console *co, 
  const char *s,
   }
 
   #if defined(CONFIG_OF)
  -static inline void __init ulite_console_of_find_device(int id)
  +static inline u32 __init ulite_console_of_find_device(int id)

resource_size_t?

   {
   struct device_node *np;
   struct resource res;
  @@ -392,13 +437,14 @@ static inline void __init 
  ulite_console_of_find_device(int id)
   if (rc)
   continue;
 
  -ulite_ports[id].mapbase = res.start;
   of_node_put(np);
  -return;
  +return res.start+3;

Are all OF users big endian?

   }
  +
  +return 0;
   }
   #else /* CONFIG_OF */
  -static inline void __init ulite_console_of_find_device(int id) { /* do 
  nothing */ }
  +static inline u32 __init ulite_console_of_find_device(int id) { return 0; }
   #endif /* CONFIG_OF */
 
   static int __init ulite_console_setup(struct console *co, char *options)
  @@ -408,25 +454,33 @@ static int __init ulite_console_setup(struct console 
  *co, char *options)
   int bits = 8;
   int parity = 'n';
   int flow = 'n';
  +u32 base;
 
  -if (co-index  0 || co-index = ULITE_NR_UARTS)
  -return -EINVAL;
  +/* Find a matching uart port in the device tree */
  +base = ulite_console_of_find_device(co-index);
 
  -port = ulite_ports[co-index];
  +/* Get the port structure */
  +port = ulite_get_port(co-index);
  +if (!port)
  +return -ENODEV;
 
  -/* Check if it is an OF device */
  -if (!port-mapbase)
  -ulite_console_of_find_device(co-index);
  +/* was it initialized for this device? */
  +if (base) {

I preferred the old way, where it was clearer that this stuff is only
done in the OF case, E.G.:

/* Check if it is an OF device */
if (!port-mapbase)
   port-mapbase = ulite_console_of_find_device(co-index);

  +if ((port-mapbase)  (port-mapbase != base)) {
  +pr_debug(KERN_DEBUG ulite: addr mismatch; %x != %x\n,
  + port-mapbase, base);
  +return -ENODEV; /* port used by another device; bail */

You have this both here and in ulite_assign - Couldn't this be moved
to ulite_get_port?

  +}
  +port-mapbase = base;
  +}
 
  -

[PATCH 1/7] [POWERPC] Xilinx: Uartlite: Make console output actually work.

2008-01-08 Thread Stephen Neuendorffer
From: Grant Likely [EMAIL PROTECTED]

Signed-off-by: Grant Likely [EMAIL PROTECTED]

Fixed to apply against 2.6.24-rc5, and remove DEBUG information.

Signed-off-by: Stephen Neuendorffer [EMAIL PROTECTED]
---
 drivers/serial/uartlite.c |  121 +
 1 files changed, 79 insertions(+), 42 deletions(-)

diff --git a/drivers/serial/uartlite.c b/drivers/serial/uartlite.c
index 3f59324..71e4c0a 100644
--- a/drivers/serial/uartlite.c
+++ b/drivers/serial/uartlite.c
@@ -9,6 +9,8 @@
  * kind, whether express or implied.
  */
 
+#undef DEBUG
+
 #include linux/platform_device.h
 #include linux/module.h
 #include linux/console.h
@@ -321,6 +323,49 @@ static struct uart_ops ulite_ops = {
.verify_port= ulite_verify_port
 };
 
+/**
+ * ulite_get_port: Get the uart_port for a given port number and base addr
+ */
+static struct uart_port *ulite_get_port(int id)
+{
+   struct uart_port *port;
+
+   /* 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)) {
+   printk(KERN_WARNING uartlite: invalid id: %i\n, id);
+   return NULL;
+   }
+
+   /* The ID is valid, so get the address of the uart_port structure */
+   port = ulite_ports[id];
+
+   /* Is the structure is already initialized? */
+   if (port-mapbase)
+   return port;
+
+   /* At this point, we've got an empty uart_port struct, initialize it */
+   spin_lock_init(port-lock);
+   port-membase = NULL;
+   port-fifosize = 16;
+   port-regshift = 2;
+   port-iotype = UPIO_MEM;
+   port-iobase = 1; /* mark port in use */
+   port-ops = ulite_ops;
+   port-irq = NO_IRQ;
+   port-flags = UPF_BOOT_AUTOCONF;
+   port-dev = NULL;
+   port-type = PORT_UNKNOWN;
+   port-line = id;
+
+   return port;
+}
+
 /* -
  * Console driver operations
  */
@@ -376,7 +421,7 @@ static void ulite_console_write(struct console *co, const 
char *s,
 }
 
 #if defined(CONFIG_OF)
-static inline void __init ulite_console_of_find_device(int id)
+static inline u32 __init ulite_console_of_find_device(int id)
 {
struct device_node *np;
struct resource res;
@@ -392,13 +437,14 @@ static inline void __init 
ulite_console_of_find_device(int id)
if (rc)
continue;
 
-   ulite_ports[id].mapbase = res.start;
of_node_put(np);
-   return;
+   return res.start+3;
}
+
+   return 0;
 }
 #else /* CONFIG_OF */
-static inline void __init ulite_console_of_find_device(int id) { /* do nothing 
*/ }
+static inline u32 __init ulite_console_of_find_device(int id) { return 0; }
 #endif /* CONFIG_OF */
 
 static int __init ulite_console_setup(struct console *co, char *options)
@@ -408,25 +454,33 @@ static int __init ulite_console_setup(struct console *co, 
char *options)
int bits = 8;
int parity = 'n';
int flow = 'n';
+   u32 base;
 
-   if (co-index  0 || co-index = ULITE_NR_UARTS)
-   return -EINVAL;
+   /* Find a matching uart port in the device tree */
+   base = ulite_console_of_find_device(co-index);
 
-   port = ulite_ports[co-index];
+   /* Get the port structure */
+   port = ulite_get_port(co-index);
+   if (!port)
+   return -ENODEV;
 
-   /* Check if it is an OF device */
-   if (!port-mapbase)
-   ulite_console_of_find_device(co-index);
+   /* was it initialized for this device? */
+   if (base) {
+   if ((port-mapbase)  (port-mapbase != base)) {
+   pr_debug(KERN_DEBUG ulite: addr mismatch; %x != %x\n,
+port-mapbase, base);
+   return -ENODEV; /* port used by another device; bail */
+   }
+   port-mapbase = base;
+   }
 
-   /* Do we have a device now? */
-   if (!port-mapbase) {
-   pr_debug(console on ttyUL%i not present\n, co-index);
+   if (!port-mapbase)
return -ENODEV;
-   }
 
-   /* not initialized yet? */
+   /* registers mapped yet? */
if (!port-membase) {
-   if (ulite_request_port(port))
+   port-membase = ioremap(port-mapbase, ULITE_REGION);
+   if (!port-membase)
return -ENODEV;
}
 
@@ -488,39 +542,22 @@ static int __devinit ulite_assign(struct device *dev, int 
id, u32 base, int irq)
struct uart_port *port;
int rc;
 
-   /* if id = -1; then scan for a free id and use that */
-   if (id  0) {
-   for (id = 0; id  ULITE_NR_UARTS; id++)
-