Re: [PATCH] Input: q40kbd - convert driver to the split model

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

 



On Wed, Jan 11, 2012 at 10:25:20AM +0100, Geert Uytterhoeven wrote:
> On Wed, Jan 11, 2012 at 09:11, Dmitry Torokhov
> <dmitry.torokhov@xxxxxxxxx> wrote:
> > On Wed, Jan 11, 2012 at 08:55:54AM +0100, Geert Uytterhoeven wrote:
> >> On Sat, Dec 31, 2011 at 02:11, Dmitry Torokhov
> >> <dmitry.torokhov@xxxxxxxxx> wrote:
> 
> >> > +static struct platform_device q40_kbd_pdev = {
> >> > +       .name   = "q40kbd",
> >> > +       .id     = -1,
> >> > +};
> >> > +
> >> > +static __init int q40_add_kbd_device(void)
> >> > +{
> >> > +       return platform_device_register(&q40_kbd_pdev);
> >>
> >> If you would use platform_device_register_simple(), you don't need the
> >> q40_kbd_pdev above, reducing memory consumption on non-Q40 platforms.
> >
> > Isn't this file only compiled on q40 platforms?
> 
> No, m68k does support multi-platform kernels.

OK, I'll do dynamic platform device allocation.

> 
> >> > +}
> >> > +arch_initcall(q40_add_kbd_device);
> >>
> >> For the Amiga platform drivers, I used device_initcall().
> >
> > Won't it potentially race with initialization of q40kbd? It looks like
> > module_initcall is the same as device_initcall() when module is compiled
> > in. Given that q40kbd uses platform_dveice_probe() losing race might be
> > fatal.
> 
> So far I haven't encountered any problems on Amiga.
> I'll look into this.

I guess link order (arch before drivers) saves you here but it is not
very clean.

>
> >> > -static int __devexit q40kbd_remove(struct platform_device *dev)
> >> > +static int __devexit q40kbd_remove(struct platform_device *pdev)
> >> >  {
> >> > -       serio_unregister_port(q40kbd_port);
> >> > +       struct q40kbd *q40kbd = platform_get_drvdata(pdev);
> >> > +
> >> > +       free_irq(Q40_IRQ_KEYBOARD, q40kbd);
> >> > +
> >> > +       serio_unregister_port(q40kbd->port);
> >>
> >> Should the unregister be done before freeing the IRQ, i.e. reverse
> >> order compared to probe?
> >
> > Unregister will most likely cause memory being freed; you don't want to
> > chance IRQ firing here.
> 
> And in the probe case that can't happen when request_irq() is called?

We explicitly do q40kbd_stop() before requesting IRQ. Frankly serio
will be stopped by the serio core (via serio->stop() which is
q40kbd_stop()) so freeing IRQ fisrt should be fine, it just was looking
scary. I'll revert the order and add a comment.

Thanks.

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


[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux