Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
66040727
Commit
66040727
authored
Dec 04, 2009
by
Dmitry Torokhov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Input: dm355evm_kbd - switch to using sparse keymap library
Signed-off-by:
Dmitry Torokhov
<
dtor@mail.ru
>
parent
e97af4cb
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
57 additions
and
94 deletions
+57
-94
drivers/input/misc/Kconfig
drivers/input/misc/Kconfig
+1
-0
drivers/input/misc/dm355evm_keys.c
drivers/input/misc/dm355evm_keys.c
+56
-94
No files found.
drivers/input/misc/Kconfig
View file @
66040727
...
...
@@ -282,6 +282,7 @@ config INPUT_RB532_BUTTON
config INPUT_DM355EVM
tristate "TI DaVinci DM355 EVM Keypad and IR Remote"
depends on MFD_DM355EVM_MSP
select INPUT_SPARSEKMAP
help
Supports the pushbuttons and IR remote used with
the DM355 EVM board.
...
...
drivers/input/misc/dm355evm_keys.c
View file @
66040727
...
...
@@ -11,6 +11,7 @@
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/input.h>
#include <linux/input/sparse-keymap.h>
#include <linux/platform_device.h>
#include <linux/interrupt.h>
...
...
@@ -33,12 +34,8 @@ struct dm355evm_keys {
int
irq
;
};
/* These initial keycodes can be remapped by dm355evm_setkeycode(). */
static
struct
{
u16
event
;
u16
keycode
;
}
dm355evm_keys
[]
=
{
/* These initial keycodes can be remapped */
static
const
struct
key_entry
dm355evm_keys
[]
=
{
/*
* Pushbuttons on the EVM board ... note that the labels for these
* are SW10/SW11/etc on the PC board. The left/right orientation
...
...
@@ -47,11 +44,11 @@ static struct {
* is to the right. (That is, rotate the board counter-clockwise
* by 90 degrees from the SW10/etc and "DM355 EVM" labels.)
*/
{
0x00d8
,
KEY_OK
,
},
/* SW12 */
{
0x00b8
,
KEY_UP
,
},
/* SW13 */
{
0x00e8
,
KEY_DOWN
,
},
/* SW11 */
{
0x0078
,
KEY_LEFT
,
},
/* SW14 */
{
0x00f0
,
KEY_RIGHT
,
},
/* SW10 */
{
KE_KEY
,
0x00d8
,
{
KEY_OK
}
},
/* SW12 */
{
KE_KEY
,
0x00b8
,
{
KEY_UP
}
},
/* SW13 */
{
KE_KEY
,
0x00e8
,
{
KEY_DOWN
}
},
/* SW11 */
{
KE_KEY
,
0x0078
,
{
KEY_LEFT
}
},
/* SW14 */
{
KE_KEY
,
0x00f0
,
{
KEY_RIGHT
}
},
/* SW10 */
/*
* IR buttons ... codes assigned to match the universal remote
...
...
@@ -65,35 +62,35 @@ static struct {
* RC5 codes are 14 bits, with two start bits (0x3 prefix)
* and a toggle bit (masked out below).
*/
{
0x300c
,
KEY_POWER
,
},
/* NOTE: docs omit this */
{
0x3000
,
KEY_NUMERIC_0
,
},
{
0x3001
,
KEY_NUMERIC_1
,
},
{
0x3002
,
KEY_NUMERIC_2
,
},
{
0x3003
,
KEY_NUMERIC_3
,
},
{
0x3004
,
KEY_NUMERIC_4
,
},
{
0x3005
,
KEY_NUMERIC_5
,
},
{
0x3006
,
KEY_NUMERIC_6
,
},
{
0x3007
,
KEY_NUMERIC_7
,
},
{
0x3008
,
KEY_NUMERIC_8
,
},
{
0x3009
,
KEY_NUMERIC_9
,
},
{
0x3022
,
KEY_ENTER
,
},
{
0x30ec
,
KEY_MODE
,
},
/* "tv/vcr/..." */
{
0x300f
,
KEY_SELECT
,
},
/* "info" */
{
0x3020
,
KEY_CHANNELUP
,
},
/* "up" */
{
0x302e
,
KEY_MENU
,
},
/* "in/out" */
{
0x3011
,
KEY_VOLUMEDOWN
,
},
/* "left" */
{
0x300d
,
KEY_MUTE
,
},
/* "ok" */
{
0x3010
,
KEY_VOLUMEUP
,
},
/* "right" */
{
0x301e
,
KEY_SUBTITLE
,
},
/* "cc" */
{
0x3021
,
KEY_CHANNELDOWN
,
},
/* "down" */
{
0x3022
,
KEY_PREVIOUS
,
},
{
0x3026
,
KEY_SLEEP
,
},
{
0x3172
,
KEY_REWIND
,
},
/* NOTE: docs wrongly say 0x30ca */
{
0x3175
,
KEY_PLAY
,
},
{
0x3174
,
KEY_FASTFORWARD
,
},
{
0x3177
,
KEY_RECORD
,
},
{
0x3176
,
KEY_STOP
,
},
{
0x3169
,
KEY_PAUSE
,
},
{
KE_KEY
,
0x300c
,
{
KEY_POWER
}
},
/* NOTE: docs omit this */
{
KE_KEY
,
0x3000
,
{
KEY_NUMERIC_0
}
},
{
KE_KEY
,
0x3001
,
{
KEY_NUMERIC_1
}
},
{
KE_KEY
,
0x3002
,
{
KEY_NUMERIC_2
}
},
{
KE_KEY
,
0x3003
,
{
KEY_NUMERIC_3
}
},
{
KE_KEY
,
0x3004
,
{
KEY_NUMERIC_4
}
},
{
KE_KEY
,
0x3005
,
{
KEY_NUMERIC_5
}
},
{
KE_KEY
,
0x3006
,
{
KEY_NUMERIC_6
}
},
{
KE_KEY
,
0x3007
,
{
KEY_NUMERIC_7
}
},
{
KE_KEY
,
0x3008
,
{
KEY_NUMERIC_8
}
},
{
KE_KEY
,
0x3009
,
{
KEY_NUMERIC_9
}
},
{
KE_KEY
,
0x3022
,
{
KEY_ENTER
}
},
{
KE_KEY
,
0x30ec
,
{
KEY_MODE
}
},
/* "tv/vcr/..." */
{
KE_KEY
,
0x300f
,
{
KEY_SELECT
}
},
/* "info" */
{
KE_KEY
,
0x3020
,
{
KEY_CHANNELUP
}
},
/* "up" */
{
KE_KEY
,
0x302e
,
{
KEY_MENU
}
},
/* "in/out" */
{
KE_KEY
,
0x3011
,
{
KEY_VOLUMEDOWN
}
},
/* "left" */
{
KE_KEY
,
0x300d
,
{
KEY_MUTE
}
},
/* "ok" */
{
KE_KEY
,
0x3010
,
{
KEY_VOLUMEUP
}
},
/* "right" */
{
KE_KEY
,
0x301e
,
{
KEY_SUBTITLE
}
},
/* "cc" */
{
KE_KEY
,
0x3021
,
{
KEY_CHANNELDOWN
}
},
/* "down" */
{
KE_KEY
,
0x3022
,
{
KEY_PREVIOUS
}
},
{
KE_KEY
,
0x3026
,
{
KEY_SLEEP
}
},
{
KE_KEY
,
0x3172
,
{
KEY_REWIND
}
},
/* NOTE: docs wrongly say 0x30ca */
{
KE_KEY
,
0x3175
,
{
KEY_PLAY
}
},
{
KE_KEY
,
0x3174
,
{
KEY_FASTFORWARD
}
},
{
KE_KEY
,
0x3177
,
{
KEY_RECORD
}
},
{
KE_KEY
,
0x3176
,
{
KEY_STOP
}
},
{
KE_KEY
,
0x3169
,
{
KEY_PAUSE
}
},
};
/*
...
...
@@ -105,19 +102,18 @@ static struct {
*/
static
irqreturn_t
dm355evm_keys_irq
(
int
irq
,
void
*
_keys
)
{
struct
dm355evm_keys
*
keys
=
_keys
;
int
status
;
static
u16
last_event
;
struct
dm355evm_keys
*
keys
=
_keys
;
const
struct
key_entry
*
ke
;
unsigned
int
keycode
;
int
status
;
u16
event
;
/* For simplicity we ignore INPUT_COUNT and just read
* events until we get the "queue empty" indicator.
* Reading INPUT_LOW decrements the count.
*/
for
(;;)
{
static
u16
last_event
;
u16
event
;
int
keycode
;
int
i
;
status
=
dm355evm_msp_read
(
DM355EVM_MSP_INPUT_HIGH
);
if
(
status
<
0
)
{
dev_dbg
(
keys
->
dev
,
"input high err %d
\n
"
,
...
...
@@ -156,14 +152,9 @@ static irqreturn_t dm355evm_keys_irq(int irq, void *_keys)
/* ignore the RC5 toggle bit */
event
&=
~
0x0800
;
/* find the key, or leave it as unknown */
keycode
=
KEY_UNKNOWN
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
dm355evm_keys
);
i
++
)
{
if
(
dm355evm_keys
[
i
].
event
!=
event
)
continue
;
keycode
=
dm355evm_keys
[
i
].
keycode
;
break
;
}
/* find the key, or report it as unknown */
ke
=
sparse_keymap_entry_from_scancode
(
keys
->
input
,
event
);
keycode
=
ke
?
ke
->
keycode
:
KEY_UNKNOWN
;
dev_dbg
(
keys
->
dev
,
"input event 0x%04x--> keycode %d
\n
"
,
event
,
keycode
);
...
...
@@ -174,36 +165,8 @@ static irqreturn_t dm355evm_keys_irq(int irq, void *_keys)
input_report_key
(
keys
->
input
,
keycode
,
0
);
input_sync
(
keys
->
input
);
}
return
IRQ_HANDLED
;
}
static
int
dm355evm_setkeycode
(
struct
input_dev
*
dev
,
int
index
,
int
keycode
)
{
u16
old_keycode
;
unsigned
i
;
if
(((
unsigned
)
index
)
>=
ARRAY_SIZE
(
dm355evm_keys
))
return
-
EINVAL
;
old_keycode
=
dm355evm_keys
[
index
].
keycode
;
dm355evm_keys
[
index
].
keycode
=
keycode
;
set_bit
(
keycode
,
dev
->
keybit
);
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
dm355evm_keys
);
i
++
)
{
if
(
dm355evm_keys
[
index
].
keycode
==
old_keycode
)
goto
done
;
}
clear_bit
(
old_keycode
,
dev
->
keybit
);
done:
return
0
;
}
static
int
dm355evm_getkeycode
(
struct
input_dev
*
dev
,
int
index
,
int
*
keycode
)
{
if
(((
unsigned
)
index
)
>=
ARRAY_SIZE
(
dm355evm_keys
))
return
-
EINVAL
;
return
dm355evm_keys
[
index
].
keycode
;
return
IRQ_HANDLED
;
}
/*----------------------------------------------------------------------*/
...
...
@@ -213,7 +176,6 @@ static int __devinit dm355evm_keys_probe(struct platform_device *pdev)
struct
dm355evm_keys
*
keys
;
struct
input_dev
*
input
;
int
status
;
int
i
;
/* allocate instance struct and input dev */
keys
=
kzalloc
(
sizeof
*
keys
,
GFP_KERNEL
);
...
...
@@ -242,31 +204,30 @@ static int __devinit dm355evm_keys_probe(struct platform_device *pdev)
input
->
id
.
product
=
0x0355
;
input
->
id
.
version
=
dm355evm_msp_read
(
DM355EVM_MSP_FIRMREV
);
input
->
evbit
[
0
]
=
BIT
(
EV_KEY
);
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
dm355evm_keys
);
i
++
)
__set_bit
(
dm355evm_keys
[
i
].
keycode
,
input
->
keybit
);
input
->
setkeycode
=
dm355evm_setkeycode
;
input
->
getkeycode
=
dm355evm_getkeycode
;
status
=
sparse_keymap_setup
(
input
,
dm355evm_keys
,
NULL
);
if
(
status
)
goto
fail1
;
/* REVISIT: flush the event queue? */
status
=
request_threaded_irq
(
keys
->
irq
,
NULL
,
dm355evm_keys_irq
,
IRQF_TRIGGER_FALLING
,
dev_name
(
&
pdev
->
dev
),
keys
);
if
(
status
<
0
)
goto
fail
1
;
goto
fail
2
;
/* register */
status
=
input_register_device
(
input
);
if
(
status
<
0
)
goto
fail
2
;
goto
fail
3
;
platform_set_drvdata
(
pdev
,
keys
);
return
0
;
fail
2
:
fail
3
:
free_irq
(
keys
->
irq
,
keys
);
fail2:
sparse_keymap_free
(
input
);
fail1:
input_free_device
(
input
);
kfree
(
keys
);
...
...
@@ -280,6 +241,7 @@ static int __devexit dm355evm_keys_remove(struct platform_device *pdev)
struct
dm355evm_keys
*
keys
=
platform_get_drvdata
(
pdev
);
free_irq
(
keys
->
irq
,
keys
);
sparse_keymap_free
(
keys
->
input
);
input_unregister_device
(
keys
->
input
);
kfree
(
keys
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment