Re: Kernel Oops after call to platform_driver_register | |
| [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] | |
Jeez, I stared at this problem for hours and then noticed the
solution only a few minutes after sending this message. I had
misplaced the #endif in the platform_driver declaration. The proper
code is as follows:
static struct platform_driver st7529fb_driver = {
.probe = st7529fb_probe,
.remove = st7529fb_remove,
#ifdef CONFIG_PM
.suspend = st7529fb_suspend, /* optional but recommended */
.resume = st7529fb_resume, /* optional but recommended */
#endif
.driver = {
.name = ST_DEVICENAME,
},
};
My apologies for the added noise.
Cheers,
Alex
On Apr 9, 2008, at 1:57 AM, Alex Parkinson wrote:
> Hello everyone,
>
> I'm currently working on a framebuffer driver for a small graphic
> LCD with a Sitronix ST7529 controller. I'm basing my code on
> s1d13xxxfb.h and skeletonfb.h, and I'm getting a kernel Oops in the
> call to platform_driver_register of my driver's initialization
> routine. As can be seen in the output below, it seems that a null
> pointer is being dereferenced in the call to strncmp in
> platform_match. platform_match compares the device name, which is
> initialized in my board configuration file, to the driver name,
> initialized in the driver file. I can see that the device is
> registered from the board file during the boot process because my
> debug code is executing, but the driver fails to register when I
> attempt to load the module with insmod. The relevant info from
> these files is pasted below. Does anyone have an idea why I'm
> getting this Oops or what I can do to track it down?
>
> Many thanks in advance,
> Alex
>
>
> From st7529fb.h:
> ======================================================================
> ======
> #define ST_FBID "ST7529"
> #define ST_DEVICENAME "st7529fb"
>
> struct st7529fb_regval {
> u16 addr;
> u8 value;
> };
> struct st7529fb_par {
> void __iomem *regs;
> unsigned char status;
> #ifdef CONFIG_PM
> void *regs_save; /* pm saves all registers here */
> void *disp_save; /* pm saves entire screen here */
> #endif
> };
>
> struct st7529fb_pdata {
> const struct st7529fb_regval *initregs;
> const unsigned int initregssize;
> };
>
>
> From st7529fb.c:
> ======================================================================
> ======
> static struct platform_driver st7529fb_driver = {
> .probe = st7529fb_probe,
> .remove = st7529fb_remove,
> #ifdef CONFIG_PM
> .suspend = st7529fb_suspend, /* optional but recommended */
> .resume = st7529fb_resume, /* optional but recommended */
> .driver = {
> .name = ST_DEVICENAME,
> },#endif
> };
>
> static int __init st7529fb_init(void){
> #ifndef MODULE
> if (fb_get_options("st7529fb", NULL))
> return -ENODEV;
> #endif
> dbg(PFX "initializing driver\n");
> return platform_driver_register(&st7529fb_driver)
> }
>
>
> From board-at91sam9260ek.c
> ======================================================================
> ======
> static struct st7529fb_pdata st7529fb_data = {
> .initregssize = 0,
> };
>
> #define ST7529_FB_START 0x10400001 /* Stub address */
> #define ST7529_FB_LEN 255*160
> #define ST7529_REG_START 0x10400000
> #define ST7529_REG_LEN 1
> static struct resource st7529fb_resources[] = {
> [0] = {
> .start = ST7529_FB_START,
> .end = ST7529_FB_START + ST7529_FB_LEN - 1,
> .flags = IORESOURCE_MEM,
> },
> [1] = {
> .start = ST7529_REG_START,
> .end = ST7529_REG_START + ST7529_REG_LEN - 1,
> .flags = IORESOURCE_MEM,
> },
> };
>
> static struct platform_device st7529fb_device = {
> .name = ST_DEVICENAME,
> .id = 0,
> .dev = {
> .platform_data = &st7529fb_data,
> },
> .num_resources = ARRAY_SIZE(st7529fb_resources),
> .resource = st7529fb_resources,
> };
>
> void __init at91_add_device_st7529(void)
> {
> printk("Registering ST7529 device\n");
> platform_device_register(&st7529fb_device);
> }
>
>
> Oops output
> ======================================================================
> ======
> # insmod st7529fb.ko
> initializing ST7529 driver
> Unable to handle kernel NULL pointer dereference at virtual address
> 00000000
> pgd = c3670000
> [00000000] *pgd=23c37031, *pte=00000000, *ppte=00000000
> Internal error: Oops: 17 [#1]
> Modules linked in: st7529fb
> CPU: 0 Not tainted (2.6.24 #22)
> PC is at strncmp+0x18/0x50
> LR is at platform_match+0x1c/0x28
> pc : [<c00e4444>] lr : [<c0118aec>] psr: 20000013
> sp : c3debe10 ip : 00000073 fp : c3debe1c
> r10: c485c000 r9 : 00000000 r8 : c02045ac
> r7 : bf0008e4 r6 : bf0008e4 r5 : c01f76bc r4 : c01f76bc
> r3 : 00000000 r2 : 00000013 r1 : 00000000 r0 : c01c56dc
> Flags: nzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
> Control: 0005317f Table: 23670000 DAC: 00000015
> Process insmod (pid: 275, stack limit = 0xc3dea258)
> Stack: (0xc3debe10 to 0xc3dec000)
> be00: c3debe2c c3debe20
> c0118aec c00e443c
> be20: c3debe4c c3debe30 c0116fa4 c0118ae0 c01f7760 c01f76bc
> c01171f8 bf0008e4
> be40: c3debe64 c3debe50 c011727c c0116f74 00000000 c3debe68
> c3debe90 c3debe68
> be60: c0116384 c0117208 c0204644 c0204644 c01f7704 bf0008e4
> bf0008ec 00000000
> be80: c485caf8 c3debea0 c3debe94 c0116e84 c011634c c3debec4
> c3debea4 c0116734
> bea0: c0116e74 bf0008e4 c3715e00 bf000b00 c485caf8 c485c800
> c3debed8 c3debec8
> bec0: c0117504 c01166d4 c3715f9c c3debee8 c3debedc c0118b7c
> c0117494 c3debef8
> bee0: c3debeec bf00201c c0118b20 c3debfa4 c3debefc c0057574
> bf002010 00000000
> bf00: 00012008 00000000 00000000 00000000 00000000 00000000
> 00000000 00000000
> bf20: 00000000 00000000 00000000 00000000 00000000 00000000
> c485d040 c3761f80
> bf40: c485caa8 c485c9e0 c485cad0 00000000 00000041 00000041
> bf000b0c 00000013
> bf60: c485c764 c485c800 00000013 00000011 00000014 00000000
> 00000000 4000098c
> bf80: 00000004 00012018 00000080 c0020fa4 c3dea000 00012008
> 00000000 c3debfa8
> bfa0: c0020e00 c0056244 4000098c 00000004 00012018 00001274
> 00012008 00000000
> bfc0: 4000098c 00000004 00012018 00004000 be8d8ebb 00000002
> 00012008 00008cd0
> bfe0: 4005f68c be8d8d38 00008f10 4005f698 20000010 00012018
> 00000000 00000000
> Backtrace:[<c00e442c>] (strncmp+0x0/0x50) from [<c0118aec>]
> (platform_match+0x1c/0x28)
> [<c0118ad0>] (platform_match+0x0/0x28) from [<c0116fa4>]
> (driver_probe_device+0x40/0x1b8)
> [<c0116f64>] (driver_probe_device+0x0/0x1b8) from [<c011727c>]
> (__driver_attach+0x84/0xe4) r7:bf0008e4 r6:c01171f8 r5:c01f76bc
> r4:c01f7760
> [<c01171f8>] (__driver_attach+0x0/0xe4) from [<c0116384>]
> (bus_for_each_dev+0x48/0x80) r5:c3debe68 r4:00000000
> [<c011633c>] (bus_for_each_dev+0x0/0x80) from [<c0116e84>]
> (driver_attach+0x20/0x28) r7:c485caf8 r6:00000000 r5:bf0008ec
> r4:bf0008e4
> [<c0116e64>] (driver_attach+0x0/0x28) from [<c0116734>]
> (bus_add_driver+0x70/0x1c0)
> [<c01166c4>] (bus_add_driver+0x0/0x1c0) from [<c0117504>]
> (driver_register+0x80/0x88) r8:c485c800 r7:c485caf8 r6:bf000b00
> r5:c3715e00 r4:bf0008e4
> [<c0117484>] (driver_register+0x0/0x88) from [<c0118b7c>]
> (platform_driver_register+0x6c/0x88) r4:c3715f9c
> [<c0118b10>] (platform_driver_register+0x0/0x88) from [<bf00201c>]
> (st7529fb_init+0x1c/0x50 [st7529fb])
> [<bf002000>] (st7529fb_init+0x0/0x50 [st7529fb]) from [<c0057574>]
> (sys_init_module+0x1340/0x1428)
> [<c0056234>] (sys_init_module+0x0/0x1428) from [<c0020e00>]
> (ret_fast_syscall+0x0/0x2c)
> Code: e24cb004 e3a03000 ea000008 e5d0c000 (e5d13000)
> ---[ end trace 5d724fd5d7a2bcb7 ]---
> Segmentation fault
>
-------------------------------------------------------------------
List admin: http://lists.arm.linux.org.uk/mailman/listinfo/linux-arm
FAQ: http://www.arm.linux.org.uk/mailinglists/faq.php
Etiquette: http://www.arm.linux.org.uk/mailinglists/etiquette.php
[Site Home] [Fedora ARM] [IETF Annouce] [Security] [Bugtraq] [Linux] [Linux ARM Kernel] [Linux OMAP] [Linux MIPS] [ECOS] [Tools] [DDR & Rambus] [Monitors]