Re: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support

2010-05-12 Thread Dmitry Torokhov
On Wed, May 12, 2010 at 11:15:11AM +0530, Shilimkar, Santosh wrote:
  -Original Message-
  From: linux-omap-ow...@vger.kernel.org 
  [mailto:linux-omap-ow...@vger.kernel.org] On Behalf Of Arce,
  Abraham
  Sent: Wednesday, May 12, 2010 11:10 AM
  To: Dmitry Torokhov
  Cc: linux-in...@vger.kernel.org; linux-omap@vger.kernel.org
  Subject: RE: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support
  
  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
  
  [...]
 
 Sorry for jumping into the comments late. Thought this was sorted out. Key 
 scanning
 and debounce timeouts etc still there. Having all these things in ISR itself 
 isn't good
 idea.
 
 Dmitry,
 Don't you think its optimal to push the key-scanning and debounce timeout code
 part of bottom half ??


If you need debounce then you need to fire a timer and keep doing this
until interrupt (or key state) settles. It really depends on the device.

-- 
Dmitry
--
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


RE: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support

2010-05-12 Thread Shilimkar, Santosh
 -Original Message-
 From: Dmitry Torokhov [mailto:dmitry.torok...@gmail.com]
 Sent: Wednesday, May 12, 2010 11:33 AM
 To: Shilimkar, Santosh
 Cc: Arce, Abraham; linux-in...@vger.kernel.org; linux-omap@vger.kernel.org
 Subject: Re: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support
 
 On Wed, May 12, 2010 at 11:15:11AM +0530, Shilimkar, Santosh wrote:
   -Original Message-
   From: linux-omap-ow...@vger.kernel.org 
   [mailto:linux-omap-ow...@vger.kernel.org] On Behalf Of
 Arce,
   Abraham
   Sent: Wednesday, May 12, 2010 11:10 AM
   To: Dmitry Torokhov
   Cc: linux-in...@vger.kernel.org; linux-omap@vger.kernel.org
   Subject: RE: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support
  
   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
  
   [...]
  
  Sorry for jumping into the comments late. Thought this was sorted out. Key 
  scanning
  and debounce timeouts etc still there. Having all these things in ISR 
  itself isn't good
  idea.
 
  Dmitry,
  Don't you think its optimal to push the key-scanning and debounce timeout 
  code
  part of bottom half ??
 
 
 If you need debounce then you need to fire a timer and keep doing this
 until interrupt (or key state) settles. It really depends on the device.
 
The OMAP4 keypad controller has internal timeout mechanism and doesn't need any
external timer for this.



--
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


RE: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support

2010-05-12 Thread Arce, Abraham
  Sorry for jumping into the comments late. Thought this was sorted out. Key
 scanning
  and debounce timeouts etc still there. Having all these things in ISR itself
 isn't good
  idea.
 
  Dmitry,
  Don't you think its optimal to push the key-scanning and debounce timeout
 code
  part of bottom half ??
 
 
 If you need debounce then you need to fire a timer and keep doing this
 until interrupt (or key state) settles. It really depends on the device.

Controller includes a debouncing feature... 
--
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


Re: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support

2010-05-12 Thread Dmitry Torokhov
On Wed, May 12, 2010 at 11:49:45AM +0530, Shilimkar, Santosh wrote:
  -Original Message-
  From: Dmitry Torokhov [mailto:dmitry.torok...@gmail.com]
  Sent: Wednesday, May 12, 2010 11:33 AM
  To: Shilimkar, Santosh
  Cc: Arce, Abraham; linux-in...@vger.kernel.org; linux-omap@vger.kernel.org
  Subject: Re: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support
  
  On Wed, May 12, 2010 at 11:15:11AM +0530, Shilimkar, Santosh wrote:
-Original Message-
From: linux-omap-ow...@vger.kernel.org 
[mailto:linux-omap-ow...@vger.kernel.org] On Behalf Of
  Arce,
Abraham
Sent: Wednesday, May 12, 2010 11:10 AM
To: Dmitry Torokhov
Cc: linux-in...@vger.kernel.org; linux-omap@vger.kernel.org
Subject: RE: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support
   
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
   
[...]
   
   Sorry for jumping into the comments late. Thought this was sorted out. 
   Key scanning
   and debounce timeouts etc still there. Having all these things in ISR 
   itself isn't good
   idea.
  
   Dmitry,
   Don't you think its optimal to push the key-scanning and debounce timeout 
   code
   part of bottom half ??
  
  
  If you need debounce then you need to fire a timer and keep doing this
  until interrupt (or key state) settles. It really depends on the device.
  
 The OMAP4 keypad controller has internal timeout mechanism and doesn't need 
 any
 external timer for this.


Then I do not understand the question... If hardware takes care of
debouncing then just read the state and report the data.

-- 
Dmitry
--
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


RE: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support

2010-05-12 Thread Shilimkar, Santosh
 -Original Message-
 From: Dmitry Torokhov [mailto:dmitry.torok...@gmail.com]
 Sent: Wednesday, May 12, 2010 12:05 PM
 To: Shilimkar, Santosh
 Cc: Arce, Abraham; linux-in...@vger.kernel.org; linux-omap@vger.kernel.org
 Subject: Re: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support
 
 On Wed, May 12, 2010 at 11:49:45AM +0530, Shilimkar, Santosh wrote:
   -Original Message-
   From: Dmitry Torokhov [mailto:dmitry.torok...@gmail.com]
   Sent: Wednesday, May 12, 2010 11:33 AM
   To: Shilimkar, Santosh
   Cc: Arce, Abraham; linux-in...@vger.kernel.org; linux-omap@vger.kernel.org
   Subject: Re: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support
  
   On Wed, May 12, 2010 at 11:15:11AM +0530, Shilimkar, Santosh wrote:
 -Original Message-
 From: linux-omap-ow...@vger.kernel.org 
 [mailto:linux-omap-ow...@vger.kernel.org] On Behalf Of
   Arce,
 Abraham
 Sent: Wednesday, May 12, 2010 11:10 AM
 To: Dmitry Torokhov
 Cc: linux-in...@vger.kernel.org; linux-omap@vger.kernel.org
 Subject: RE: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support

 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

 [...]

Sorry for jumping into the comments late. Thought this was sorted out. 
Key scanning
and debounce timeouts etc still there. Having all these things in ISR 
itself isn't good
idea.
   
Dmitry,
Don't you think its optimal to push the key-scanning and debounce 
timeout code
part of bottom half ??
   
  
   If you need debounce then you need to fire a timer and keep doing this
   until interrupt (or key state) settles. It really depends on the device.
  
  The OMAP4 keypad controller has internal timeout mechanism and doesn't need 
  any
  external timer for this.
 
 
 Then I do not understand the question... If hardware takes care of
 debouncing then just read the state and report the data.
 
You have point. Debounce shouldn't be an issue. If the key scan isn't taking
Much time then I agree with your suggestion.

Abraham, Can you please how much time you are spending in the key scan loops ?

Regards,
Santosh
--
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


Re: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support

2010-05-11 Thread Kevin Hilman
Dmitry Torokhov dmitry.torok...@gmail.com writes:

 On Tue, May 11, 2010 at 12:03:44AM -0500, Arce, Abraham wrote:
 Hi again Dmitry,
 
  No worries, although at first I was surprised that Trilok spoke exactly
  the same words I did ;)
  
 
 :)
 
  +
  +/* Interrupt thread handler thread */
  +
  +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.
 
 http://www.mail-archive.com/linux-omap@vger.kernel.org/msg26352.html
 

 Thanks.

 I think Kevin meant use theaded IRQ, wherever possible [if we need
 to sleep in interrupt handler].

Actually, even interrupts that don't sleep can use threaded IRQs.  I
prefer to see threaded IRQs wherever possible.  Especially since we're
moving towards a world where all interrupts are run with interrupts
disabled, using threaded IRQs minimizes interrupts-off critical
sections.

Kevin

--
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


Re: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support

2010-05-11 Thread Dmitry Torokhov
On Tue, May 11, 2010 at 07:53:23AM -0700, Kevin Hilman wrote:
 Dmitry Torokhov dmitry.torok...@gmail.com writes:
 
  On Tue, May 11, 2010 at 12:03:44AM -0500, Arce, Abraham wrote:
  Hi again Dmitry,
  
   No worries, although at first I was surprised that Trilok spoke exactly
   the same words I did ;)
   
  
  :)
  
   +
   +/* Interrupt thread handler thread */
   +
   +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.
  
  http://www.mail-archive.com/linux-omap@vger.kernel.org/msg26352.html
  
 
  Thanks.
 
  I think Kevin meant use theaded IRQ, wherever possible [if we need
  to sleep in interrupt handler].
 
 Actually, even interrupts that don't sleep can use threaded IRQs.  I
 prefer to see threaded IRQs wherever possible.  Especially since we're
 moving towards a world where all interrupts are run with interrupts
 disabled, using threaded IRQs minimizes interrupts-off critical
 sections.
 

I think in this case threaded IRQ would just add unnecessary overhead.
There are no scanning delays, just a few register reads and writes.
Input core will take some cycles propagating the events but it disables
interrupts anyway. Setting up a separate thread and scheduling does not
make much sense here.

Also I am not sure if arches with large number of interrupts would want
to move to all threaded interrupts model.

-- 
Dmitry
--
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


Re: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support

2010-05-11 Thread Kevin Hilman
Dmitry Torokhov dmitry.torok...@gmail.com writes:

 On Tue, May 11, 2010 at 07:53:23AM -0700, Kevin Hilman wrote:
 Dmitry Torokhov dmitry.torok...@gmail.com writes:
 
  On Tue, May 11, 2010 at 12:03:44AM -0500, Arce, Abraham wrote:
  Hi again Dmitry,
  
   No worries, although at first I was surprised that Trilok spoke exactly
   the same words I did ;)
   
  
  :)
  
   +
   +/* Interrupt thread handler thread */
   +
   +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.
  
  http://www.mail-archive.com/linux-omap@vger.kernel.org/msg26352.html
  
 
  Thanks.
 
  I think Kevin meant use theaded IRQ, wherever possible [if we need
  to sleep in interrupt handler].
 
 Actually, even interrupts that don't sleep can use threaded IRQs.  I
 prefer to see threaded IRQs wherever possible.  Especially since we're
 moving towards a world where all interrupts are run with interrupts
 disabled, using threaded IRQs minimizes interrupts-off critical
 sections.
 

 I think in this case threaded IRQ would just add unnecessary overhead.
 There are no scanning delays, just a few register reads and writes.
 Input core will take some cycles propagating the events but it disables
 interrupts anyway. Setting up a separate thread and scheduling does not
 make much sense here.

 Also I am not sure if arches with large number of interrupts would want
 to move to all threaded interrupts model.

OK, it's your call for this subsystem.

Kevin
--
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


RE: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support

2010-05-11 Thread Shilimkar, Santosh
 -Original Message-
 From: linux-omap-ow...@vger.kernel.org 
 [mailto:linux-omap-ow...@vger.kernel.org] On Behalf Of Kevin
 Hilman
 Sent: Wednesday, May 12, 2010 3:10 AM
 To: Dmitry Torokhov
 Cc: Arce, Abraham; linux-in...@vger.kernel.org; linux-omap@vger.kernel.org
 Subject: Re: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support
 
 Dmitry Torokhov dmitry.torok...@gmail.com writes:
 
  On Tue, May 11, 2010 at 07:53:23AM -0700, Kevin Hilman wrote:
  Dmitry Torokhov dmitry.torok...@gmail.com writes:
 
   On Tue, May 11, 2010 at 12:03:44AM -0500, Arce, Abraham wrote:
   Hi again Dmitry,
  
No worries, although at first I was surprised that Trilok spoke 
exactly
the same words I did ;)
   
  
   :)
  
+
+/* Interrupt thread handler thread */
+
+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.
  
   http://www.mail-archive.com/linux-omap@vger.kernel.org/msg26352.html
  
  
   Thanks.
  
   I think Kevin meant use theaded IRQ, wherever possible [if we need
   to sleep in interrupt handler].
 
  Actually, even interrupts that don't sleep can use threaded IRQs.  I
  prefer to see threaded IRQs wherever possible.  Especially since we're
  moving towards a world where all interrupts are run with interrupts
  disabled, using threaded IRQs minimizes interrupts-off critical
  sections.
 
 
  I think in this case threaded IRQ would just add unnecessary overhead.
  There are no scanning delays, just a few register reads and writes.
  Input core will take some cycles propagating the events but it disables
  interrupts anyway. Setting up a separate thread and scheduling does not
  make much sense here.
 
  Also I am not sure if arches with large number of interrupts would want
  to move to all threaded interrupts model.
 
 OK, it's your call for this subsystem.
 
Abraham initial driver has top half (ISR) and bottom half (tasklet). With 
Threaded 
IRQ, we can get rid-of tasklet and handle the bottom half in thread context.
IIRC this was on of the intention of this new API.

Isn't this not good enough to use the threaded IRQ in this case.

Regards,
Santosh
--
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


RE: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support

2010-05-11 Thread Arce, Abraham
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


RE: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support

2010-05-11 Thread Shilimkar, Santosh
 -Original Message-
 From: linux-omap-ow...@vger.kernel.org 
 [mailto:linux-omap-ow...@vger.kernel.org] On Behalf Of Arce,
 Abraham
 Sent: Wednesday, May 12, 2010 11:10 AM
 To: Dmitry Torokhov
 Cc: linux-in...@vger.kernel.org; linux-omap@vger.kernel.org
 Subject: RE: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support
 
 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
 
 [...]

Sorry for jumping into the comments late. Thought this was sorted out. Key 
scanning
and debounce timeouts etc still there. Having all these things in ISR itself 
isn't good
idea.

Dmitry,
Don't you think its optimal to push the key-scanning and debounce timeout code
part of bottom half ??

Regards,
Santosh
--
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


RE: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support

2010-05-10 Thread Arce, Abraham
Hi Trilok, 

Thanks for your comments...

[snip]

  +
  +/* Interrupt thread handler thread */
  +
  +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...

 
  +   struct omap_keypad *keypad_data = dev_id;
  +   struct input_dev *input = keypad_data-input;
  +   unsigned char key_state[8];
  +   int col, row, code;
  +   u32 *new_state = (u32 *) key_state;
  +
  +   *new_state   = __raw_readl(keypad_data-base +
  +   OMAP4_KBD_FULLCODE31_0);
  +   *(new_state + 1) = __raw_readl(keypad_data-base +
  +   OMAP4_KBD_FULLCODE63_32);
  +
  +   for (col = 0; col  keypad_data-cols; col++) {
  +   for (row = 0; row  keypad_data-rows; row++) {
  +   code = MATRIX_SCAN_CODE(row, col,
  +   keypad_data-row_shift);
  +   if (code  0) {
  +   printk(KERN_INFO Spurious key %d-%d\n,
  +   col, row);
  +   continue;
  +   }
 
 MATRIX_SCAN_CODE() is static data. ISR is wrong place to report
 incorrect values in keymap...

Removed

 
  +   input_report_key(input, keypad_data-keycodes[code],
  +   key_state[col]  (1  row));
  +   }
  +   }
  +
  +   memcpy(keypad_data-key_state, key_state,
  +   sizeof(keypad_data-key_state));
  +
  +   /* enable interrupts */
  +   __raw_writel(OMAP4_DEF_IRQENABLE_EVENTEN | OMAP4_DEF_IRQENABLE_LONGKEY,
  +   keypad_data-base + OMAP4_KBD_IRQENABLE);
  +
  +   /* clear pending interrupts */
  +   __raw_writel(__raw_readl(keypad_data-base + OMAP4_KBD_IRQSTATUS),
  +   keypad_data-base + OMAP4_KBD_IRQSTATUS);
  +
  +   /* clear pending interrupts */
  +   return IRQ_HANDLED;
  +
  +}
  +
  +
  +static int __devinit omap_keypad_probe(struct platform_device *pdev)
  +{
  +   struct omap_device *od;
  +   struct omap_hwmod *oh;
  +   struct matrix_keypad_platform_data *pdata;
  +   struct input_dev *input_dev;
  +   const struct matrix_keymap_data *keymap_data;
  +   struct omap_keypad *keypad_data;
  +
  +   unsigned int status = 0, row_shift = 0, error = 0, length = 0, id = 0;
  +   unsigned short *keypad_codes;
  +
  +   int hw_mod_name_len = 16;
  +   char oh_name[hw_mod_name_len];
  +   char *name = omap4-keypad;
  +
  +   length = snprintf(oh_name, hw_mod_name_len, keyboard);
  +   WARN(length = hw_mod_name_len,
  +   String buffer overflow in keyboard device setup\n);
  +
  +   oh = omap_hwmod_lookup(oh_name);
  +   if (!oh)
  +   pr_err(Could not look up %s\n, oh_name);
  +
  +   pdata = kzalloc(sizeof(struct matrix_keypad_platform_data),
  +   GFP_KERNEL);
 
 Why is it allocated?

Moved to board file...

 
  +
  +   od = omap_device_build(name, id, oh, pdata,
  +   sizeof(struct matrix_keypad_platform_data),
  +   omap_keyboard_latency,
  +   ARRAY_SIZE(omap_keyboard_latency), 1);
  +   WARN(IS_ERR(od), Could not build omap_device for %s %s\n,
  +   name, oh_name);
  +
  +   /* platform data */
  +   pdata = pdev-dev.platform_data;
 
 Umm, here you are overriding pdata pointer... don't you leak memory
 doing this?

hwmod has been moved to board configuration so we need to get platform data

 
 
  +   if (!pdata) {
  +   dev_err(pdev-dev, no platform data defined\n);
  +   kfree(pdata);
  +   return -EINVAL;
  +   }
  +
  +   /* keymap data */
  +   keymap_data = pdata-keymap_data;
  +   if (!keymap_data) {
  +   dev_err(pdev-dev, no keymap data defined\n);
  +   kfree(keymap_data);
  +   return -EINVAL;
  +   }
  +
  +   /* omap keypad data */
  +   row_shift = get_count_order(pdata-num_col_gpios);
  +   keypad_data = kzalloc(sizeof(struct omap_keypad), GFP_KERNEL);
  +   if (!keypad_data) {
  +   error = -ENOMEM;
  +   goto failed_free_platform;
  +   }
  +
  +   /* omap keypad codes */
  +   keypad_codes = kzalloc((pdata-num_row_gpios  row_shift) *
  +   sizeof(*keypad_codes), GFP_KERNEL);
 
 Why is it al;loctaed separately? Can it be pickky-backed onto
 keypad_data?

Not getting the idea here... could you explain?

 
  +   if (!keypad_codes) {
  +   error = -ENOMEM;
  +   goto failed_free_data;
  +   }
  +
  +   /* input device allocation */
  +   input_dev = input_allocate_device();
  +   if (!input_dev) {
  +   error = -ENOMEM;
  +   goto failed_free_codes;
  +   }
  +
  +   /* base resource */
  +   keypad_data-base = oh-_rt_va;
  +   if (!keypad_data-base) {
 
 
 You could probably check this earlier, before allocating stuff.

Early means before input_allocate_device?

 
  +   error = -ENOMEM;
  +   

RE: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support

2010-05-10 Thread Arce, Abraham
Sorry for the confusion in your name Dmitry...

Thanks for your comments...

[snip]

   +
   +/* Interrupt thread handler thread */
   +
   +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...


   + struct omap_keypad *keypad_data = dev_id;
   + struct input_dev *input = keypad_data-input;
   + unsigned char key_state[8];
   + int col, row, code;
   + u32 *new_state = (u32 *) key_state;
   +
   + *new_state   = __raw_readl(keypad_data-base +
   + OMAP4_KBD_FULLCODE31_0);
   + *(new_state + 1) = __raw_readl(keypad_data-base +
   + OMAP4_KBD_FULLCODE63_32);
   +
   + for (col = 0; col  keypad_data-cols; col++) {
   + for (row = 0; row  keypad_data-rows; row++) {
   + code = MATRIX_SCAN_CODE(row, col,
   + keypad_data-row_shift);
   + if (code  0) {
   + printk(KERN_INFO Spurious key %d-%d\n,
   + col, row);
   + continue;
   + }
 
  MATRIX_SCAN_CODE() is static data. ISR is wrong place to report
  incorrect values in keymap...

Removed

   + input_report_key(input, keypad_data-keycodes[code],
   + key_state[col]  (1  row));
   + }
   + }
   +
   + memcpy(keypad_data-key_state, key_state,
   + sizeof(keypad_data-key_state));
   +
   + /* enable interrupts */
   + __raw_writel(OMAP4_DEF_IRQENABLE_EVENTEN | OMAP4_DEF_IRQENABLE_LONGKEY,
   + keypad_data-base + OMAP4_KBD_IRQENABLE);
   +
   + /* clear pending interrupts */
   + __raw_writel(__raw_readl(keypad_data-base + OMAP4_KBD_IRQSTATUS),
   + keypad_data-base + OMAP4_KBD_IRQSTATUS);
   +
   + /* clear pending interrupts */
   + return IRQ_HANDLED;
   +
   +}
   +
   +
   +static int __devinit omap_keypad_probe(struct platform_device *pdev)
   +{
   + struct omap_device *od;
   + struct omap_hwmod *oh;
   + struct matrix_keypad_platform_data *pdata;
   + struct input_dev *input_dev;
   + const struct matrix_keymap_data *keymap_data;
   + struct omap_keypad *keypad_data;
   +
   + unsigned int status = 0, row_shift = 0, error = 0, length = 0, id = 0;
   + unsigned short *keypad_codes;
   +
   + int hw_mod_name_len = 16;
   + char oh_name[hw_mod_name_len];
   + char *name = omap4-keypad;
   +
   + length = snprintf(oh_name, hw_mod_name_len, keyboard);
   + WARN(length = hw_mod_name_len,
   + String buffer overflow in keyboard device setup\n);
   +
   + oh = omap_hwmod_lookup(oh_name);
   + if (!oh)
   + pr_err(Could not look up %s\n, oh_name);
   +
   + pdata = kzalloc(sizeof(struct matrix_keypad_platform_data),
   + GFP_KERNEL);
 
  Why is it allocated?

Moved to board file...


   +
   + od = omap_device_build(name, id, oh, pdata,
   + sizeof(struct matrix_keypad_platform_data),
   + omap_keyboard_latency,
   + ARRAY_SIZE(omap_keyboard_latency), 1);
   + WARN(IS_ERR(od), Could not build omap_device for %s %s\n,
   + name, oh_name);
   +
   + /* platform data */
   + pdata = pdev-dev.platform_data;
 
  Umm, here you are overriding pdata pointer... don't you leak memory
  doing this?


hwmod has been moved to board configuration so we need to get platform data

   + if (!pdata) {
   + dev_err(pdev-dev, no platform data defined\n);
   + kfree(pdata);
   + return -EINVAL;
   + }
   +
   + /* keymap data */
   + keymap_data = pdata-keymap_data;
   + if (!keymap_data) {
   + dev_err(pdev-dev, no keymap data defined\n);
   + kfree(keymap_data);
   + return -EINVAL;
   + }
   +
   + /* omap keypad data */
   + row_shift = get_count_order(pdata-num_col_gpios);
   + keypad_data = kzalloc(sizeof(struct omap_keypad), GFP_KERNEL);
   + if (!keypad_data) {
   + error = -ENOMEM;
   + goto failed_free_platform;
   + }
   +
   + /* omap keypad codes */
   + keypad_codes = kzalloc((pdata-num_row_gpios  row_shift) *
   + sizeof(*keypad_codes), GFP_KERNEL);
 
  Why is it al;loctaed separately? Can it be pickky-backed onto
  keypad_data?
 
Not getting the idea here... could you explain?
 
   + if (!keypad_codes) {
   + error = -ENOMEM;
   + goto failed_free_data;
   + }
   +
   + /* input device allocation */
   + input_dev = input_allocate_device();
   + if (!input_dev) {
   + error = -ENOMEM;
   + goto failed_free_codes;
   + }
   +
   + /* base resource */
   + keypad_data-base = oh-_rt_va;
   + if (!keypad_data-base) {
 
 
  You could probably check this earlier, before allocating stuff.

Early means before input_allocate_device?


   + error = -ENOMEM;
   + goto failed_free_input;
   + }
   

Re: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support

2010-05-10 Thread Dmitry Torokhov
On Mon, May 10, 2010 at 11:17:50PM -0500, Arce, Abraham wrote:
 Sorry for the confusion in your name Dmitry...
 

No worries, although at first I was surprised that Trilok spoke exactly
the same words I did ;)

 Thanks for your comments...
 
 [snip]
 
+
+/* Interrupt thread handler thread */
+
+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.

 
+   struct omap_keypad *keypad_data = dev_id;
+   struct input_dev *input = keypad_data-input;
+   unsigned char key_state[8];
+   int col, row, code;
+   u32 *new_state = (u32 *) key_state;
+
+   *new_state   = __raw_readl(keypad_data-base +
+   OMAP4_KBD_FULLCODE31_0);
+   *(new_state + 1) = __raw_readl(keypad_data-base +
+   OMAP4_KBD_FULLCODE63_32);
+
+   for (col = 0; col  keypad_data-cols; col++) {
+   for (row = 0; row  keypad_data-rows; row++) {
+   code = MATRIX_SCAN_CODE(row, col,
+   keypad_data-row_shift);
+   if (code  0) {
+   printk(KERN_INFO Spurious key %d-%d\n,
+   col, row);
+   continue;
+   }
  
   MATRIX_SCAN_CODE() is static data. ISR is wrong place to report
   incorrect values in keymap...
 
 Removed
 
+   input_report_key(input, 
keypad_data-keycodes[code],
+   key_state[col]  (1  row));
+   }
+   }
+
+   memcpy(keypad_data-key_state, key_state,
+   sizeof(keypad_data-key_state));
+
+   /* enable interrupts */
+   __raw_writel(OMAP4_DEF_IRQENABLE_EVENTEN | 
OMAP4_DEF_IRQENABLE_LONGKEY,
+   keypad_data-base + OMAP4_KBD_IRQENABLE);
+
+   /* clear pending interrupts */
+   __raw_writel(__raw_readl(keypad_data-base + 
OMAP4_KBD_IRQSTATUS),
+   keypad_data-base + OMAP4_KBD_IRQSTATUS);
+
+   /* clear pending interrupts */
+   return IRQ_HANDLED;
+
+}
+
+
+static int __devinit omap_keypad_probe(struct platform_device *pdev)
+{
+   struct omap_device *od;
+   struct omap_hwmod *oh;
+   struct matrix_keypad_platform_data *pdata;
+   struct input_dev *input_dev;
+   const struct matrix_keymap_data *keymap_data;
+   struct omap_keypad *keypad_data;
+
+   unsigned int status = 0, row_shift = 0, error = 0, length = 0, 
id = 0;
+   unsigned short *keypad_codes;
+
+   int hw_mod_name_len = 16;
+   char oh_name[hw_mod_name_len];
+   char *name = omap4-keypad;
+
+   length = snprintf(oh_name, hw_mod_name_len, keyboard);
+   WARN(length = hw_mod_name_len,
+   String buffer overflow in keyboard device setup\n);
+
+   oh = omap_hwmod_lookup(oh_name);
+   if (!oh)
+   pr_err(Could not look up %s\n, oh_name);
+
+   pdata = kzalloc(sizeof(struct matrix_keypad_platform_data),
+   GFP_KERNEL);
  
   Why is it allocated?
 
 Moved to board file...
 
 
+
+   od = omap_device_build(name, id, oh, pdata,
+   sizeof(struct 
matrix_keypad_platform_data),
+   omap_keyboard_latency,
+   ARRAY_SIZE(omap_keyboard_latency), 1);
+   WARN(IS_ERR(od), Could not build omap_device for %s %s\n,
+   name, oh_name);
+
+   /* platform data */
+   pdata = pdev-dev.platform_data;
  
   Umm, here you are overriding pdata pointer... don't you leak memory
   doing this?
 
 
 hwmod has been moved to board configuration so we need to get platform data
 
+   if (!pdata) {
+   dev_err(pdev-dev, no platform data defined\n);
+   kfree(pdata);
+   return -EINVAL;
+   }
+
+   /* keymap data */
+   keymap_data = pdata-keymap_data;
+   if (!keymap_data) {
+   dev_err(pdev-dev, no keymap data defined\n);
+   kfree(keymap_data);
+   return -EINVAL;
+   }
+
+   /* omap keypad data */
+   row_shift = get_count_order(pdata-num_col_gpios);
+   keypad_data = kzalloc(sizeof(struct omap_keypad), GFP_KERNEL);
+   if (!keypad_data) {

RE: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support

2010-05-10 Thread Arce, Abraham
Hi again Dmitry,

 No worries, although at first I was surprised that Trilok spoke exactly
 the same words I did ;)
 

:)

 +
 +/* Interrupt thread handler thread */
 +
 +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.

http://www.mail-archive.com/linux-omap@vger.kernel.org/msg26352.html

 
 
 + struct omap_keypad *keypad_data = dev_id;
 + struct input_dev *input = keypad_data-input;
 + unsigned char key_state[8];
 + int col, row, code;
 + u32 *new_state = (u32 *) key_state;
 +
 + *new_state   = __raw_readl(keypad_data-base +
 + OMAP4_KBD_FULLCODE31_0);
 + *(new_state + 1) = __raw_readl(keypad_data-base +
 + OMAP4_KBD_FULLCODE63_32);
 +
 + for (col = 0; col  keypad_data-cols; col++) {
 + for (row = 0; row  keypad_data-rows; row++) {
 + code = MATRIX_SCAN_CODE(row, col,
 + keypad_data-row_shift);
 + if (code  0) {
 + printk(KERN_INFO Spurious key %d-%d\n,
 + col, row);
 + continue;
 + }
   
MATRIX_SCAN_CODE() is static data. ISR is wrong place to report
incorrect values in keymap...
 
  Removed
 
 + input_report_key(input, 
 keypad_data-keycodes[code],
 + key_state[col]  (1  row));
 + }
 + }
 +
 + memcpy(keypad_data-key_state, key_state,
 + sizeof(keypad_data-key_state));
 +
 + /* enable interrupts */
 + __raw_writel(OMAP4_DEF_IRQENABLE_EVENTEN |
 OMAP4_DEF_IRQENABLE_LONGKEY,
 + keypad_data-base + OMAP4_KBD_IRQENABLE);
 +
 + /* clear pending interrupts */
 + __raw_writel(__raw_readl(keypad_data-base + 
 OMAP4_KBD_IRQSTATUS),
 + keypad_data-base + OMAP4_KBD_IRQSTATUS);
 +
 + /* clear pending interrupts */
 + return IRQ_HANDLED;
 +
 +}
 +
 +
 +static int __devinit omap_keypad_probe(struct platform_device *pdev)
 +{
 + struct omap_device *od;
 + struct omap_hwmod *oh;
 + struct matrix_keypad_platform_data *pdata;
 + struct input_dev *input_dev;
 + const struct matrix_keymap_data *keymap_data;
 + struct omap_keypad *keypad_data;
 +
 + unsigned int status = 0, row_shift = 0, error = 0, length = 0, 
 id
 = 0;
 + unsigned short *keypad_codes;
 +
 + int hw_mod_name_len = 16;
 + char oh_name[hw_mod_name_len];
 + char *name = omap4-keypad;
 +
 + length = snprintf(oh_name, hw_mod_name_len, keyboard);
 + WARN(length = hw_mod_name_len,
 + String buffer overflow in keyboard device setup\n);
 +
 + oh = omap_hwmod_lookup(oh_name);
 + if (!oh)
 + pr_err(Could not look up %s\n, oh_name);
 +
 + pdata = kzalloc(sizeof(struct matrix_keypad_platform_data),
 + GFP_KERNEL);
   
Why is it allocated?
 
  Moved to board file...
 
 
 +
 + od = omap_device_build(name, id, oh, pdata,
 + sizeof(struct 
 matrix_keypad_platform_data),
 + omap_keyboard_latency,
 + ARRAY_SIZE(omap_keyboard_latency), 1);
 + WARN(IS_ERR(od), Could not build omap_device for %s %s\n,
 + name, oh_name);
 +
 + /* platform data */
 + pdata = pdev-dev.platform_data;
   
Umm, here you are overriding pdata pointer... don't you leak memory
doing this?
 
 
  hwmod has been moved to board configuration so we need to get platform data
 
 + if (!pdata) {
 + dev_err(pdev-dev, no platform data defined\n);
 + kfree(pdata);
 + return -EINVAL;
 + }
 +
 + /* keymap data */
 + keymap_data = pdata-keymap_data;
 + if (!keymap_data) {
 + dev_err(pdev-dev, no keymap data defined\n);
 + kfree(keymap_data);
 + return -EINVAL;
 + }
 +
 + /* omap keypad data */
 + row_shift = get_count_order(pdata-num_col_gpios);
 + keypad_data = kzalloc(sizeof(struct omap_keypad), GFP_KERNEL);
 + if (!keypad_data) {
 + error = -ENOMEM;
 + goto failed_free_platform;
 

Re: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support

2010-05-10 Thread Dmitry Torokhov
On Tue, May 11, 2010 at 12:03:44AM -0500, Arce, Abraham wrote:
 Hi again Dmitry,
 
  No worries, although at first I was surprised that Trilok spoke exactly
  the same words I did ;)
  
 
 :)
 
  +
  +/* Interrupt thread handler thread */
  +
  +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.
 
 http://www.mail-archive.com/linux-omap@vger.kernel.org/msg26352.html
 

Thanks.

I think Kevin meant use theaded IRQ, wherever possible [if we need
to sleep in interrupt handler].

Adding him to CC.

-- 
Dmitry
--
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


RE: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support

2010-05-05 Thread Arce, Abraham
Felipe,

Thanks for your comments...

[..]

 +#include plat/omap_hwmod.h
 +#include plat/omap_device.h
 
 should the platform_driver know about hwmod and omap_device ? Paul ?
 Kevin ?

Working on these changes...

 
 +struct omap_keypad {
 +
 
 unnecessary blank line.

Removed

 
 +   struct platform_device *pdev;
 
 generaly we save the struct device *.
 
 +   struct omap_hwmod *oh;
 +   const struct matrix_keypad_platform_data *pdata;
 
 you should not save the platform_data here. Generaly you should only use
 that to initialize fields on your structure. Remember that a
 platform_data will be declared as __initdata.

Removed

 
 +/* Interrupt thread primary handler, called in hard interrupt context */
 +
 +static irqreturn_t omap_keypad_interrupt(int irq, void *dev_id)
 +{
 +   struct omap_keypad *keypad_data = dev_id;
 +
 +   /* disable interrupts */
 +   __raw_writel(OMAP4_DEF_IRQDISABLE, keypad_data-base +
 +   OMAP4_KBD_IRQENABLE);
 +
 +   /* wake up handler thread */
 +   return IRQ_WAKE_THREAD;
 +
 +}
 +
 +/* Interrupt thread handler thread */
 +
 +static irqreturn_t omap_keypad_threaded(int irq, void *dev_id)
 +{
 +   struct omap_keypad *keypad_data = dev_id;
 +   struct input_dev *input = keypad_data-input;
 +   unsigned char key_state[8];
 +   int col, row, code;
 +   u32 *new_state = (u32 *) key_state;
 +
 +   *new_state   = __raw_readl(keypad_data-base +
 +   OMAP4_KBD_FULLCODE31_0);
 +   *(new_state + 1) = __raw_readl(keypad_data-base +
 +   OMAP4_KBD_FULLCODE63_32);
 +
 +   for (col = 0; col  keypad_data-cols; col++) {
 +   for (row = 0; row  keypad_data-rows; row++) {
 +   code = MATRIX_SCAN_CODE(row, col,
 +   keypad_data-row_shift);
 +   if (code  0) {
 +   printk(KERN_INFO Spurious key %d-%d\n,
 +   col, row);
 
 use dev_dbg()

Added

 
 +   continue;
 +   }
 +   input_report_key(input, keypad_data-keycodes[code],
 +   key_state[col]  (1  row));
 
 missing input_sync()

Added

 
 +static int __devinit omap_keypad_probe(struct platform_device *pdev)
 +{
 
 [..]
 
 +   length = snprintf(oh_name, hw_mod_name_len, keyboard);
 +   WARN(length = hw_mod_name_len,
 +   String buffer overflow in keyboard device setup\n);
 
 you're using snprintf() this WARN() shouldn't happen even, remove it.

Code now in board file, removed

 
 +
 +   oh = omap_hwmod_lookup(oh_name);
 +   if (!oh)
 +   pr_err(Could not look up %s\n, oh_name);
 
 I think omap_hwmod and omap_device shouldn't be here, but at least use
 dev_err();

Moving to board file...

 
 +
 +   pdata = kzalloc(sizeof(struct matrix_keypad_platform_data),
 +   GFP_KERNEL);
 
 this should come from platform code.

Working on these changes...


I'll have a function in 4430sdp board file that will setup hwmod and omap 
device called

  sdp4430_keypad_init() {
 ...
 omap_hwmod_lookup(oh_name);
 kzalloc(sizeof(struct matrix_keypad_platform_data), GFP_KERNEL);
 omap_device_build(name, id, oh, pdata,
 ...
  }

and then called within

  omap_4430sdp_init()

 
 +
 +   od = omap_device_build(name, id, oh, pdata,
 +   sizeof(struct matrix_keypad_platform_data),
 +   omap_keyboard_latency,
 +   ARRAY_SIZE(omap_keyboard_latency), 1);
 +   WARN(IS_ERR(od), Could not build omap_device for %s %s\n,
 +   name, oh_name);
 
 this too.

Moving to board file...

 
 +   status = input_register_device(keypad_data-input);
 +   if (status  0) {
 +   dev_err(pdev-dev, failed to register input device\n);
 +   goto failed_free_device;
 +   }
 +
 +   omap_keypad_config(keypad_data);
 
 registering and configuring should be done before requesting the irq.

Changed


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


RE: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support

2010-05-05 Thread Arce, Abraham
Thanks Kevin,

  Keyboard controller for OMAP4 with built-in scanning algorithm.
  The following implementations are used:
 
- matrix_keypac.c logic
- hwmod framework
- threaded irq
 
  Signed-off-by: Syed Rafiuddin rafiuddin.s...@ti.com
  Signed-off-by: Abraham Arce x0066...@ti.com
 
 Some general comments...
 
 What's missing here is a separation of the driver and the device.
 What you need is for arch code to register a platfrom_device (using
 hwmod + omap_device).  Then this driver will use the standard
 platform_device resource calls to get its base address, IRQs, etc. and
 any platform_data.
 
 IOW, as Felipe mentioned, the driver should not be doing the hwmod +
 omap_device init and registration.

As metioned to Felipe, my approach is 

  sdp4430_keypad_init() {
 ...
 omap_hwmod_lookup(oh_name);
 ...
 kzalloc(sizeof(struct matrix_keypad_platform_data), GFP_KERNEL);
 ...
 omap_device_build(name, id, oh, pdata,
 ...
  }

and then called within

  omap_4430sdp_init()


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


Re: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support

2010-04-21 Thread Dmitry Torokhov
Hi Abraham,

On Tue, Apr 13, 2010 at 08:10:48PM -0500, Arce, Abraham wrote:
 Keyboard controller for OMAP4 with built-in scanning algorithm.
 The following implementations are used:
 
   - matrix_keypac.c logic
   - hwmod framework
   - threaded irq
 
 Signed-off-by: Syed Rafiuddin rafiuddin.s...@ti.com
 Signed-off-by: Abraham Arce x0066...@ti.com
 ---
  drivers/input/keyboard/Kconfig|9 +
  drivers/input/keyboard/Makefile   |1 +
  drivers/input/keyboard/omap4-keypad.c |  367 
 +
  3 files changed, 377 insertions(+), 0 deletions(-)
  create mode 100644 drivers/input/keyboard/omap4-keypad.c
 
 diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig
 index 5049c3c..8a4103e 100644
 --- a/drivers/input/keyboard/Kconfig
 +++ b/drivers/input/keyboard/Kconfig
 @@ -390,6 +390,15 @@ config KEYBOARD_OMAP
 To compile this driver as a module, choose M here: the
 module will be called omap-keypad.
  
 +config KEYBOARD_OMAP4
 +tristate TI OMAP4 keypad support
 +depends on (ARCH_OMAP4)
 +help
 +  Say Y here if you want to use the OMAP4 keypad.
 +
 +  To compile this driver as a module, choose M here: the
 +  module will be called omap4-keypad.
 +
  config KEYBOARD_TWL4030
   tristate TI TWL4030/TWL5030/TPS659x0 keypad support
   depends on TWL4030_CORE
 diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile
 index 78654ef..1b3dfbe 100644
 --- a/drivers/input/keyboard/Makefile
 +++ b/drivers/input/keyboard/Makefile
 @@ -27,6 +27,7 @@ obj-$(CONFIG_KEYBOARD_MATRIX)   += 
 matrix_keypad.o
  obj-$(CONFIG_KEYBOARD_MAX7359)   += max7359_keypad.o
  obj-$(CONFIG_KEYBOARD_NEWTON)+= newtonkbd.o
  obj-$(CONFIG_KEYBOARD_OMAP)  += omap-keypad.o
 +obj-$(CONFIG_KEYBOARD_OMAP4) += omap4-keypad.o
  obj-$(CONFIG_KEYBOARD_OPENCORES) += opencores-kbd.o
  obj-$(CONFIG_KEYBOARD_PXA27x)+= pxa27x_keypad.o
  obj-$(CONFIG_KEYBOARD_PXA930_ROTARY) += pxa930_rotary.o
 diff --git a/drivers/input/keyboard/omap4-keypad.c 
 b/drivers/input/keyboard/omap4-keypad.c
 new file mode 100644
 index 000..b656b4f
 --- /dev/null
 +++ b/drivers/input/keyboard/omap4-keypad.c
 @@ -0,0 +1,367 @@
 +/*
 + * linux/drivers/input/keyboard/omap4-keypad.c
 + *
 + * OMAP4 Keypad Driver
 + *
 + * Copyright (C) 2010 Texas Instruments
 + *
 + * Author: Abraham Arce x0066...@ti.com
 + * Initial Code: Syed Rafiuddin rafiuddin.s...@ti.com
 + *
 + * This program is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
 + * the Free Software Foundation; either version 2 of the License, or
 + * (at your option) any later version.
 + *
 + * This program is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 + * GNU General Public License for more details.
 + *
 + * You should have received a copy of the GNU General Public License
 + * along with this program; if not, write to the Free Software
 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 + */
 +
 +#include linux/module.h
 +#include linux/init.h
 +#include linux/interrupt.h
 +#include linux/platform_device.h
 +#include linux/errno.h
 +#include linux/io.h
 +#include linux/input.h
 +#include linux/input/matrix_keypad.h
 +#include plat/omap_hwmod.h
 +#include plat/omap_device.h
 +
 +/* OMAP4 registers */
 +#define OMAP4_KBD_REVISION   0x00
 +#define OMAP4_KBD_SYSCONFIG  0x10
 +#define OMAP4_KBD_SYSSTATUS  0x14
 +#define OMAP4_KBD_IRQSTATUS  0x18
 +#define OMAP4_KBD_IRQENABLE  0x1C
 +#define OMAP4_KBD_WAKEUPENABLE   0x20
 +#define OMAP4_KBD_PENDING0x24
 +#define OMAP4_KBD_CTRL   0x28
 +#define OMAP4_KBD_DEBOUNCINGTIME 0x2C
 +#define OMAP4_KBD_LONGKEYTIME0x30
 +#define OMAP4_KBD_TIMEOUT0x34
 +#define OMAP4_KBD_STATEMACHINE   0x38
 +#define OMAP4_KBD_ROWINPUTS  0x3C
 +#define OMAP4_KBD_COLUMNOUTPUTS  0x40
 +#define OMAP4_KBD_FULLCODE31_0   0x44
 +#define OMAP4_KBD_FULLCODE63_32  0x48
 +
 +/* OMAP4 bit definitions */
 +#define OMAP4_DEF_SYSCONFIG_SOFTRST  (1  1)
 +#define OMAP4_DEF_SYSCONFIG_ENAWKUP  (1  2)
 +#define OMAP4_DEF_IRQENABLE_EVENTEN  (1  0)
 +#define OMAP4_DEF_IRQENABLE_LONGKEY  (1  1)
 +#define OMAP4_DEF_IRQENABLE_TIMEOUTEN(1  2)
 +#define OMAP4_DEF_CTRL_NOSOFTMODE(1  1)
 +#define OMAP4_DEF_CTRLPTVVALUE   (1  2)
 +#define OMAP4_DEF_CTRLPTV(1  1)
 +#define OMAP4_DEF_IRQDISABLE 0x00
 +
 +/* OMAP4 values */
 +#define OMAP4_VAL_DEBOUNCINGTIME 0x07
 +#define OMAP4_VAL_FUNCTIONALCFG  0x1E
 +
 +#define OMAP4_MASK_IRQSTATUSDISABLE  

Re: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support

2010-04-20 Thread Kevin Hilman
Arce, Abraham x0066...@ti.com writes:

 Keyboard controller for OMAP4 with built-in scanning algorithm.
 The following implementations are used:

   - matrix_keypac.c logic
   - hwmod framework
   - threaded irq

 Signed-off-by: Syed Rafiuddin rafiuddin.s...@ti.com
 Signed-off-by: Abraham Arce x0066...@ti.com

Some general comments...

What's missing here is a separation of the driver and the device.
What you need is for arch code to register a platfrom_device (using
hwmod + omap_device).  Then this driver will use the standard
platform_device resource calls to get its base address, IRQs, etc. and
any platform_data.

IOW, as Felipe mentioned, the driver should not be doing the hwmod +
omap_device init and registration.

Kevin
--
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


RE: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support

2010-04-15 Thread Arce, Abraham

Hi Trilok!

   - matrix_keypac.c logic
   - hwmod framework
 
 Do we have hwmod framework mainlined in the kernel?

Not yet but wanted to gather initial comments to be ready once framework is 
pushed

 
 
  +config KEYBOARD_OMAP4
  +        tristate TI OMAP4 keypad support
  +        depends on (ARCH_OMAP4)
 
 No need of brackets.

Removed

 
 Could you please provide default y/n option too?

Added

 
  + * linux/drivers/input/keyboard/omap4-keypad.c
 
 Better not to include file paths.

Removed path... only filename

 
  +
  +struct omap_device_pm_latency omap_keyboard_latency[] = {
 
 static?

Not sure... I'll check

snip

  +                       input_report_key(input, keypad_data-keycodes[code],
  +                                       key_state[col]  (1  row));
  +               }
  +       }
 
 where is input_sync(..)?

Added

 
  +
  +       pdata = kzalloc(sizeof(struct matrix_keypad_platform_data),
  +                               GFP_KERNEL);
 
 Please check error return here, because kzalloc can fail.

Added

snip

  +
  +       /* keymap data */
  +       keymap_data = pdata-keymap_data;
  +       if (!keymap_data) {
  +               dev_err(pdev-dev, no keymap data defined\n);
  +               kfree(keymap_data);
 
 not freeing kfree(pdata)? Please check error return path again in this driver.

I'll check error return in all code

snip

  +
  +failed_free_device:
  +       input_unregister_device(keypad_data-input);
 
 add keypad_data-input = NULL.

Added

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


Re: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support

2010-04-15 Thread Felipe Balbi

Hi,

On Wed, Apr 14, 2010 at 03:10:48AM +0200, ext Arce, Abraham wrote:

+#include linux/module.h
+#include linux/init.h
+#include linux/interrupt.h
+#include linux/platform_device.h
+#include linux/errno.h
+#include linux/io.h
+#include linux/input.h
+#include linux/input/matrix_keypad.h
+#include plat/omap_hwmod.h
+#include plat/omap_device.h


should the platform_driver know about hwmod and omap_device ? Paul ? 
Kevin ?



+struct omap_keypad {
+


unnecessary blank line.


+   struct platform_device *pdev;


generaly we save the struct device *.


+   struct omap_hwmod *oh;
+   const struct matrix_keypad_platform_data *pdata;


you should not save the platform_data here. Generaly you should only use 
that to initialize fields on your structure. Remember that a 
platform_data will be declared as __initdata.



+/* Interrupt thread primary handler, called in hard interrupt context */
+
+static irqreturn_t omap_keypad_interrupt(int irq, void *dev_id)
+{
+   struct omap_keypad *keypad_data = dev_id;
+
+   /* disable interrupts */
+   __raw_writel(OMAP4_DEF_IRQDISABLE, keypad_data-base +
+   OMAP4_KBD_IRQENABLE);
+
+   /* wake up handler thread */
+   return IRQ_WAKE_THREAD;
+
+}
+
+/* Interrupt thread handler thread */
+
+static irqreturn_t omap_keypad_threaded(int irq, void *dev_id)
+{
+   struct omap_keypad *keypad_data = dev_id;
+   struct input_dev *input = keypad_data-input;
+   unsigned char key_state[8];
+   int col, row, code;
+   u32 *new_state = (u32 *) key_state;
+
+   *new_state   = __raw_readl(keypad_data-base +
+   OMAP4_KBD_FULLCODE31_0);
+   *(new_state + 1) = __raw_readl(keypad_data-base +
+   OMAP4_KBD_FULLCODE63_32);
+
+   for (col = 0; col  keypad_data-cols; col++) {
+   for (row = 0; row  keypad_data-rows; row++) {
+   code = MATRIX_SCAN_CODE(row, col,
+   keypad_data-row_shift);
+   if (code  0) {
+   printk(KERN_INFO Spurious key %d-%d\n,
+   col, row);


use dev_dbg()


+   continue;
+   }
+   input_report_key(input, keypad_data-keycodes[code],
+   key_state[col]  (1  row));


missing input_sync()


+static int __devinit omap_keypad_probe(struct platform_device *pdev)
+{


[..]


+   length = snprintf(oh_name, hw_mod_name_len, keyboard);
+   WARN(length = hw_mod_name_len,
+   String buffer overflow in keyboard device setup\n);


you're using snprintf() this WARN() shouldn't happen even, remove it.


+
+   oh = omap_hwmod_lookup(oh_name);
+   if (!oh)
+   pr_err(Could not look up %s\n, oh_name);


I think omap_hwmod and omap_device shouldn't be here, but at least use 
dev_err();



+
+   pdata = kzalloc(sizeof(struct matrix_keypad_platform_data),
+   GFP_KERNEL);


this should come from platform code.


+
+   od = omap_device_build(name, id, oh, pdata,
+   sizeof(struct matrix_keypad_platform_data),
+   omap_keyboard_latency,
+   ARRAY_SIZE(omap_keyboard_latency), 1);
+   WARN(IS_ERR(od), Could not build omap_device for %s %s\n,
+   name, oh_name);


this too.


+   status = input_register_device(keypad_data-input);
+   if (status  0) {
+   dev_err(pdev-dev, failed to register input device\n);
+   goto failed_free_device;
+   }
+
+   omap_keypad_config(keypad_data);


registering and configuring should be done before requesting the irq.

--
balbi
--
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


Re: [RFC] [PATCH 1/3] OMAP4: Keyboard Controller Support

2010-04-14 Thread Trilok Soni
Hi Abraham,

On Wed, Apr 14, 2010 at 6:40 AM, Arce, Abraham x0066...@ti.com wrote:
 Keyboard controller for OMAP4 with built-in scanning algorithm.
 The following implementations are used:

  - matrix_keypac.c logic
  - hwmod framework

Do we have hwmod framework mainlined in the kernel?


 +config KEYBOARD_OMAP4
 +        tristate TI OMAP4 keypad support
 +        depends on (ARCH_OMAP4)

No need of brackets.

Could you please provide default y/n option too?

 + * linux/drivers/input/keyboard/omap4-keypad.c

Better not to include file paths.

 +
 +struct omap_device_pm_latency omap_keyboard_latency[] = {

static?

 +       {
 +               .deactivate_func = omap_device_idle_hwmods,
 +               .activate_func   = omap_device_enable_hwmods,
 +               .flags = OMAP_DEVICE_LATENCY_AUTO_ADJUST,
 +       },
 +};
 +static irqreturn_t omap_keypad_threaded(int irq, void *dev_id)
 +{
 +       struct omap_keypad *keypad_data = dev_id;
 +       struct input_dev *input = keypad_data-input;
 +       unsigned char key_state[8];
 +       int col, row, code;
 +       u32 *new_state = (u32 *) key_state;
 +
 +       *new_state       = __raw_readl(keypad_data-base +
 +                       OMAP4_KBD_FULLCODE31_0);
 +       *(new_state + 1) = __raw_readl(keypad_data-base +
 +                       OMAP4_KBD_FULLCODE63_32);
 +
 +       for (col = 0; col  keypad_data-cols; col++) {
 +               for (row = 0; row  keypad_data-rows; row++) {
 +                       code = MATRIX_SCAN_CODE(row, col,
 +                                       keypad_data-row_shift);
 +                       if (code  0) {
 +                               printk(KERN_INFO Spurious key %d-%d\n,
 +                                               col, row);
 +                               continue;
 +                       }
 +                       input_report_key(input, keypad_data-keycodes[code],
 +                                       key_state[col]  (1  row));
 +               }
 +       }

where is input_sync(..)?

 +
 +       pdata = kzalloc(sizeof(struct matrix_keypad_platform_data),
 +                               GFP_KERNEL);

Please check error return here, because kzalloc can fail.

 +
 +       od = omap_device_build(name, id, oh, pdata,
 +                               sizeof(struct matrix_keypad_platform_data),
 +                               omap_keyboard_latency,
 +                               ARRAY_SIZE(omap_keyboard_latency), 1);
 +       WARN(IS_ERR(od), Could not build omap_device for %s %s\n,
 +               name, oh_name);
 +
 +       /* platform data */
 +       pdata = pdev-dev.platform_data;
 +       if (!pdata) {
 +               dev_err(pdev-dev, no platform data defined\n);
 +               kfree(pdata);
 +               return -EINVAL;
 +       }
 +
 +       /* keymap data */
 +       keymap_data = pdata-keymap_data;
 +       if (!keymap_data) {
 +               dev_err(pdev-dev, no keymap data defined\n);
 +               kfree(keymap_data);

not freeing kfree(pdata)? Please check error return path again in this driver.

 +
 +       __set_bit(EV_REP, input_dev-evbit);
 +       __set_bit(KEY_OK, input_dev-keybit);
 +       __set_bit(EV_KEY, input_dev-evbit);

 +
 +       input_set_capability(input_dev, EV_MSC, MSC_SCAN);
 +       input_set_drvdata(input_dev, keypad_data);
 +
 +       status = input_register_device(keypad_data-input);
 +       if (status  0) {
 +               dev_err(pdev-dev, failed to register input device\n);
 +               goto failed_free_device;
 +       }
 +
 +       omap_keypad_config(keypad_data);
 +
 +       platform_set_drvdata(pdev, keypad_data);
 +
 +       return 0;
 +
 +failed_free_device:
 +       input_unregister_device(keypad_data-input);

add keypad_data-input = NULL.


-- 
---Trilok Soni
http://triloksoni.wordpress.com
http://www.linkedin.com/in/triloksoni
--
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