Cant analyze prologue code

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Sergei!

So now encm3_platform_init function is linked to the kernel image -- and
is part of the executable -- i added this line to the
arch/mips/au1000/encm3/Makefile:

obj-y +=encm3_platform.o

However, I now get a "Cant analyze prologue code at 80294aec." error!

Any remedies/suggestions for the same?

Thank you!
Best Regards,
Ashlesha.

On Wed, 2006-12-06 at 22:54 +0300, Sergei Shtylyov wrote:
> 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
> 



[Index of Archives]     [Linux MIPS Home]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Linux]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux