Re: OMAP34xx

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

 



* Russell King - ARM Linux <linux@xxxxxxxxxxxxxxxx> [120205 02:39]:
> On Sat, Feb 04, 2012 at 05:55:30PM -0800, Tony Lindgren wrote:
> > Hi,
> > 
> > * Russell King - ARM Linux <linux@xxxxxxxxxxxxxxxx> [120204 12:03]:
> > > 
> > > Another problem oopses the kernel at boot in the voltage domain code,
> > > which I suspect this has never been boot tested on OMAP34xx CPUs:
> > > 
> > > omap_vc_init_channel: PMIC info requried to configure vc forvdd_core not populated.Hence cannot initialize vc
> > > Unable to handle kernel NULL pointer dereference at virtual address 00000000
> > ...
> > > Backtrace: 
> > > [<c03db824>] (omap_vp_init+0x0/0x15c) from [<c03db448>] (omap_voltage_late_init+
> > > 0xc4/0xfc)
> > > [<c03db384>] (omap_voltage_late_init+0x0/0xfc) from [<c03d9df8>] (omap2_common_p
> > > m_late_init+0x14/0x54)
> > >  r8:00000000 r7:00000013 r6:c0039988 r5:c03fe004 r4:c03fdfb8
> > > [<c03d9de4>] (omap2_common_pm_late_init+0x0/0x54) from [<c0008798>] (do_one_init
> > > call+0x9c/0x164)
> > > [<c00086fc>] (do_one_initcall+0x0/0x164) from [<c03d1284>] (kernel_init+0x7c/0x1
> > > 20)
> > > [<c03d1208>] (kernel_init+0x0/0x120) from [<c0039988>] (do_exit+0x0/0x2cc)
> > >  r5:c03d1208 r4:00000000
> > ...
> > 
> > > And OMAP4 doesn't build.  Fixing the build error in prm44xx.c (which is
> > > virtually the same as the OMAP3 build error in its prm file) gets us to
> > > a buildable state, but... it silently fails to boot.
> > > 
> > > arch/arm/mach-omap2/prm44xx.c:41: error: 'OMAP44XX_IRQ_PRCM' undeclared here (not in a function)
> > > 
> > > At least enabling DEBUG_LL gets this reason:
> > > 
> > > <1>Unable to handle kernel NULL pointer dereference at virtual address 00000000 
> > ...
> > > Backtrace:                                                                      
> > > [<c007bab4>] (irq_domain_add+0x0/0x134) from [<c029baac>] (twl_probe+0xd0/0x370)
> > >  r6:c03bef90 r5:00000014 r4:00000170                                            
> > > [<c029b9dc>] (twl_probe+0x0/0x370) from [<c01eee70>] (i2c_device_probe+0xb0/0xe4
> > > )                                                                               
> > > [<c01eedc0>] (i2c_device_probe+0x0/0xe4) from [<c01d1f34>] (really_probe+0xa0/0x
> > > 178)                                                                            
> > ...
> > 
> > Just to verify, it seems that both of these happen because of
> > IRQ_DOMAIN not being set?
> 
> No.  The OMAP3 boot oops is partly because of that rubbish dependency
> preventing the PMIC support code being build, but that is only part of
> the problem and therefore that patch is only _part_ of the solution.

OK
 
> It's clearly a legal configuration for the TWL support to be disabled,
> and the kernel should NOT oops on boot because of that.  So even though
> removing the IRQ_DOMAIN dependency _and_ enabling the driver makes the
> oops go away, that's _really_ not a fix by any shape or form.
> 
> Code should _never_ oops because something isn't built-in that's required.
> The vc layer of the voltage domain cope with the missing pmic, and so
> should the vp layer.

Agreed. The TWL support be optional. It is possible to have a some non-TWL/TPS
PMIC: For example Nokia n8x0 were using retu/tahvo instead of TPS PMIC.
 
> As for OMAP4, in no way does that patch fix the problem there, because
> OMAP4 has the GIC, and the GIC selects CONFIG_IRQ_DOMAIN.  The problem is
> much more fundamental, and of course the code reveals why:
> 
> drivers/mfd/twl-core.c:
>         domain.irq_base = pdata->irq_base;
>         domain.nr_irq = nr_irqs;
> #ifdef CONFIG_OF_IRQ
>         domain.of_node = of_node_get(node);
>         domain.ops = &irq_domain_simple_ops;
> #endif
>         irq_domain_add(&domain);
> 
> kernel/irq/irqdomain.c:
> void irq_domain_add(struct irq_domain *domain)
> {
>         irq_domain_for_each_irq(domain, hwirq, irq) {
> 
> include/linux/irqdomain.h:
> #define irq_domain_for_each_irq(d, hw, irq) \
>         for (hw = d->hwirq_base, irq = irq_domain_to_irq(d, hw); \
>              hw < d->hwirq_base + d->nr_irq; \
>              hw++, irq = irq_domain_to_irq(d, hw))
> 
> static inline unsigned int irq_domain_to_irq(struct irq_domain *d,
>                                              unsigned long hwirq)
> {
>         if (d->ops->to_irq)
>                 return d->ops->to_irq(d, hwirq);
> 
> Basically, the irq domain ops pointer _must_ _always_ be a valid pointer
> before an irq domain is added.
> 
> At a guess, twl-core.c should be:
> 
> drivers/mfd/twl-core.c:
> #ifdef CONFIG_IRQ_DOMAIN
>         domain.irq_base = pdata->irq_base;
>         domain.nr_irq = nr_irqs;
> #ifdef CONFIG_OF_IRQ
>         domain.of_node = of_node_get(node);
> #endif
>         domain.ops = &irq_domain_simple_ops;
>         irq_domain_add(&domain);
> #endif

OK makes sense.

Regards,

Tony
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux