Hello.
Ashlesha Shintre wrote:
There is already an interrupt handler in place for the AU1000_GPIO_0
that takes care of the cascaded interrupts -- so I *can* say
.irq= AU1000_GPIO_0 ----right?
No, you can't. You'll have to specify to what 8259's IRQ4 maps to on your
platform.
Also, how will I make sure my board specific encm3_platform_init is
called during the arch init calls?
Mentioning it in arch_initcall() arranges for that. :-/
I have put in an entry in the Makefile for the board specific
encm3_platform.c file -- so it is built - but when control goes to the
static int __devinit serial8250_probe(struct device *dev) function in
the 8250.c it never executes the serial8250_register_port function.
I know this cus I m using the JTAG port on the board to look inside and
step through the code..
That's strange. Although the UART declaration has a grave defect....
Here is my /arch/mips/au1000/encm3/encm3_platform.c file:
/*
* Platform device support for Au1x00 SoCs.
*
* Copyright 2004, Matt Porter <mporter@xxxxxxxxxxxxxxxxxxx>
*
* 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.
*/
That boilerplate is no longer applicable. :-)
#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 plat_serial8250_port encm3_via_uart_data[] = {
{
.mapbase =
0x3f8, //resource base
Damn, I didn't notice: .mapbase should be changed to .iobase!
// .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,
};
Still, you don't need to declare the resources for the 8250 devices -- the
driver should handle requesting them for you -- as they're alredy specified by
struct plat_serial8250_port.
static struct platform_device encm3_via_uart = {
.name = "serial8250",
.id = 1,
I guess it should be PLAT8250_DEV_LEGACY...
.dev = {
.platform_data = encm3_via_uart_data,
},
So, you also don't need the following 2 lines:
.num_resources = 1,
.resource = &encm3_via_uart_resource,
};
static struct platform_device *encm3_platform_devices[] __initdata = {
&encm3_via_uart,
};
int encm3_platform_init(void)
{
printk("size of encm3 platform devices is %d
\n",ARRAY_SIZE(encm3_platform_devices));
return platform_add_devices(encm3_platform_devices,
ARRAY_SIZE(encm3_platform_devices));
I think it's better to call platform_device_register() for a single device...
WBR, Sergei