linux-mips
[Top] [All Lists]

serial console: platform_device

To: linux-mips@linux-mips.org
Subject: serial console: platform_device
From: Ashlesha Shintre <ashlesha@kenati.com>
Date: Tue, 05 Dec 2006 11:23:59 -0800
Original-recipient: rfc822;linux-mips@linux-mips.org
Reply-to: ashlesha@kenati.com
Sender: linux-mips-bounce@linux-mips.org
Hi,

I m working on porting the 2.6.14.6 kernel to the Encore M3 (AU1500)
board --

The kernel mounts the NFS root and executes the init=/bin/sh program --
however I dont see it on the console (standard 8250 UART)

The reason is that there was no platform_device structure defined for
the serial console in the platform.c file.

I therefore added the following to the
arch/mips/au1000/common/platform.c file,


> 
> #ifdef CONFIG_MIPS_AMPRO_M3
> static struct plat_serial8250_port encm3_via_uart_data[] = {
>           {
>              .mapbase        = 0x50000000 + 0x3f8, 
>              .membase        = (char *)(0x50000000 +0x3f8),         
>              .irq            = AU1000_GPIO_0,
>              .flags          = UPF_SHARE_IRQ, 
>              .iotype         = UPIO_PORT,
>              .regshift       = 1,
>              .uartclk        = 1843200,
> 
>              },
>                         { },
> };
> 
> static struct resource encm3_via_uart_resource = {
>                 .start  = VIA_COM1_ADDR, // this is 0x3f8
>                 .end    = VIA_COM1_ADDR + 0x7,
>                 .flags  = IORESOURCE_IO,
> };
> 
> 
> static struct platform_device encm3_via_uart = {        
>                 .name           = "serial8250",
>                 .id             = 1,
>                 .dev                    = {
>                                 .platform_data  = encm3_via_uart_data,
>                  },
>                 .num_resources  = 1,
>                 .resource       = &encm3_via_uart_resource,
> };
> #endif
> 

I have a these queries about the above entries:

1) The serial console is on a VIA 686B southbridge which is on the PCI
bus -- however, because of the way the VIA is designed, any references
from the processor to port 0x3f8 are routed to the console -- 
- the  0x50000000 is the mips_io_port_base address for the Southbridge
so should the resource.flags be IORESOURCE_IO or IORESOURCE_MEM -- what
does this signify exactly? I tried both and neither makes a difference
to the output from the log buffer which I have pasted below.  Does this
have to do with whether the ports are i/o or memory mapped -- cus in
that case it should be IORESOURCE_MEM as all io ports on MIPS processors
are memory mapped -- right?

2) in the platform_device structure, does the name of the device have to
be coherent with a name given to it elsewhere, if yes, where? 

3) control goes into the serial8250_probe function and assigns values
from the plat_serial8250_port encm3_via_uart_data to the port..so what
is the basic difference between registration of "probe device" versus
"platform bus" devices in the 2.6 kernel?

When I build the kernel with this platform.c file and run it, I see an
error in the pci_register_driver function executed to register the usb
port which is on the AU1500 chip, which is the other platform device -- 
I did not get such an error before the above entries were added to the
file!  I have pasted the contents of the entire file below.

Sorry about the length of this email and Thank you,
Ashlesha.


> /*
>  * Platform device support for Au1x00 SoCs.
>  *
>  * Copyright 2004, Matt Porter <mporter@kernel.crashing.org>
>  *
>  * 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/device.h>
> #include <linux/kernel.h>
> #include <linux/init.h>
> #include <linux/resource.h>
> #include <linux/serial_8250.h>
> #include <linux/tty.h>
> 
> #include <asm/mach-au1x00/au1000.h>
> #include <asm/mach-encm3/encm3.h>
> 
> static struct resource au1xxx_usb_ohci_resources[] = {
>         [0] = {
>                 .start          = USB_OHCI_BASE,
>                 .end            = USB_OHCI_BASE + USB_OHCI_LEN,
>                 .flags          = IORESOURCE_MEM,
>         },
>         [1] = {
>                 .start          = AU1000_USB_HOST_INT,
>                 .end            = AU1000_USB_HOST_INT,
>                 .flags          = IORESOURCE_IRQ,
>         },
> };
> 
> /* The dmamask must be set for OHCI to work */
> static u64 ohci_dmamask = ~(u32)0;
> 
> static struct platform_device au1xxx_usb_ohci_device = {
>         .name           = "au1xxx-ohci",
>         .id             = 0,
>         .dev = {
>                 .dma_mask               = &ohci_dmamask,
>                 .coherent_dma_mask      = 0xffffffff,
>         },
>         .num_resources  = ARRAY_SIZE(au1xxx_usb_ohci_resources),
>         .resource       = au1xxx_usb_ohci_resources,
>                                                                               
>                               44,2-9        Top
> 
> };
> 
> 
> 
> #ifdef CONFIG_MIPS_AMPRO_M3
> static struct plat_serial8250_port encm3_via_uart_data[] = {
>                 {
> //                      .mapbase        = 0x50000000 + 0x3f8,                 
>   //resource base
>                         .membase        = (char *)(0x50000000 + 0x3f8),       
>   // is a pointer - ioremap cookie or NULL
>                         .irq            = AU1000_GPIO_0,
>                         .flags          = UPF_SHARE_IRQ, //| UPF_IOREMAP, 
> //UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
>                         .iotype         = UPIO_PORT,
>                         .regshift       = 1,
>                         .uartclk        = 1843200,
> 
>                   },
>                         { },
> };
> 
> static struct resource encm3_via_uart_resource = {
>                 .start  = VIA_COM1_ADDR,
>                 .end    = VIA_COM1_ADDR + 0x7,
>                 .flags  = IORESOURCE_IO,
> };
> 
> 
> static struct platform_device encm3_via_uart = {        // coyote_uart 
> arm/mach-ixp4xx/coyote-setup.c
>                 .name           = "serial8250",
>                 .id             = 1,
>                 .dev                    = {
>                                 .platform_data  = encm3_via_uart_data,
>                  },
>                 .num_resources  = 1,
>                 .resource       = &encm3_via_uart_resource,
> };
> #endif
> 
> static struct platform_device *au1xxx_platform_devices[] __initdata = {
>         &au1xxx_usb_ohci_device,
>         &encm3_via_uart,
> };
> int au1xxx_platform_init(void)
> {
>         printk("size of au1xxx platform devices is 
> %d\n",ARRAY_SIZE(au1xxx_platform_devices));
>         return platform_add_devices(au1xxx_platform_devices, 
> ARRAY_SIZE(au1xxx_platform_devices));
> }
> 
> arch_initcall(au1xxx_platform_init);
> 


<Prev in Thread] Current Thread [Next in Thread>