Dmitry,

2 comments + one question before sending next version...

[...]

> > > > > +static irqreturn_t omap_keypad_threaded(int irq, void *dev_id)
> > > > > +{
> > > >
> > > > Why is iti threaded? I fo not see anything that will sleep.
> >
> >
> > It was implemented based on previous comments...
> >
> 
> Would you point me to that comment? Like I said, I do not see anything
> that would possibly sleep in this routine so you don't need to use
> threaded interrupt.

Using now request_irq based on your comments. In same omap_keypad_interrupt 
disable/clear/enable interrupts will be executed

[...]

> > > > > +     input_set_capability(input_dev, EV_MSC, MSC_SCAN);
> > > >
> > > > You forgot to actualy report MSC_SCAN though.
> >
> > Should I remove it? I think I do need it only when KEY_UNKNOWN keys will be
> > remapped, right?
> 
> I'd rather you actually report EV_MSC/MSC_SCAN.

I am reporting now EV_MSC/MSC_SCAN. I am using evtest to read the events, if I 
press and release a key no code will be reported

  Event: time 946684836.854248, -------------- Report Sync ------------
  Event: time 946684836.854248, -------------- Report Sync ------------

Unless I keep it depressed

  Event: time 946684817.945892, type 1 (Key), code 18 (E), value 2

And after releasing the key some other events will get generated

  Event: time 946684817.967559, type 4 (Misc), code 4 (ScanCode), value 24
  Event: time 946684817.967559, -------------- Report Sync ------------
  Event: time 946684817.967559, type 4 (Misc), code 4 (ScanCode), value 32
  Event: time 946684817.967559, -------------- Report Sync ------------
  Event: time 946684817.967590, type 4 (Misc), code 4 (ScanCode), value 40
  Event: time 946684817.967590, -------------- Report Sync ------------

Am I missing something?

[...]

> 
> >
> > > > > +failed_free_irq:
> > > > > +     free_irq(keypad_data->irq, pdev);
> > > > > +failed_free_base:
> > > > > +     keypad_data->base = NULL;
> > > > > +failed_free_input:
> > > > > +     input_free_device(input_dev);
> > > > > +failed_free_codes:
> > > > > +     kfree(keypad_codes);
> > > > > +failed_free_data:
> > > > > +     kfree(keypad_data);
> > > > > +failed_free_platform:
> > > > > +     kfree(keymap_data);
> > > > > +     kfree(pdata);
> > > > > +     return error;

Using now the following sequence...

        pdata = pdev->dev.platform_data;
                return -EINVAL;

        keymap_data = pdata->keymap_data;
                goto failed_free_pdata;

        keypad_data = kzalloc(sizeof(struct omap_keypad) +
                goto failed_free_keymap;
        
        keypad_data->base = pdata->base;
                goto failed_free_keypad;

        keypad_data->irq = pdata->irq;
                goto failed_free_base;

        input_dev = input_allocate_device();
                goto failed_free_base;

        status = input_register_device(keypad_data->input);
                goto failed_free_input;

        status = request_irq(keypad_data->irq, omap_keypad_interrupt,
                goto failed_unregister_device;

failed_unregister__device:
        input_unregister_device(keypad_data->input);
        input_dev = NULL;
failed_free_input:
        input_free_device(input_dev);
failed_free_base:
        keypad_data->base = NULL;
failed_free_keypad:
        kfree(keypad_data);
failed_free_keymap:
        kfree(keymap_data);
failed_free_pdata:
        kfree(pdata);
        return error;

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

Reply via email to