Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
03366e7b
Commit
03366e7b
authored
Feb 06, 2008
by
Dmitry Torokhov
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'pxa-keypad'
parents
c18bab80
e0f2677f
Changes
6
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
633 additions
and
292 deletions
+633
-292
drivers/input/keyboard/Kconfig
drivers/input/keyboard/Kconfig
+4
-4
drivers/input/keyboard/Makefile
drivers/input/keyboard/Makefile
+1
-1
drivers/input/keyboard/pxa27x_keyboard.c
drivers/input/keyboard/pxa27x_keyboard.c
+0
-274
drivers/input/keyboard/pxa27x_keypad.c
drivers/input/keyboard/pxa27x_keypad.c
+572
-0
include/asm-arm/arch-pxa/pxa27x_keyboard.h
include/asm-arm/arch-pxa/pxa27x_keyboard.h
+0
-13
include/asm-arm/arch-pxa/pxa27x_keypad.h
include/asm-arm/arch-pxa/pxa27x_keypad.h
+56
-0
No files found.
drivers/input/keyboard/Kconfig
View file @
03366e7b
...
...
@@ -260,13 +260,13 @@ config KEYBOARD_OMAP
module will be called omap-keypad.
config KEYBOARD_PXA27x
tristate "PXA27x
keyboar
d support"
depends on PXA27x
tristate "PXA27x
/PXA3xx keypa
d support"
depends on PXA27x
|| PXA3xx
help
Enable support for PXA27x
matrix keyboar
d controller
Enable support for PXA27x
/PXA3xx keypa
d controller
To compile this driver as a module, choose M here: the
module will be called pxa27x_key
boar
d.
module will be called pxa27x_key
pa
d.
config KEYBOARD_AAED2000
tristate "AAED-2000 keyboard"
...
...
drivers/input/keyboard/Makefile
View file @
03366e7b
...
...
@@ -19,7 +19,7 @@ obj-$(CONFIG_KEYBOARD_TOSA) += tosakbd.o
obj-$(CONFIG_KEYBOARD_HIL)
+=
hil_kbd.o
obj-$(CONFIG_KEYBOARD_HIL_OLD)
+=
hilkbd.o
obj-$(CONFIG_KEYBOARD_OMAP)
+=
omap-keypad.o
obj-$(CONFIG_KEYBOARD_PXA27x)
+=
pxa27x_key
boar
d.o
obj-$(CONFIG_KEYBOARD_PXA27x)
+=
pxa27x_key
pa
d.o
obj-$(CONFIG_KEYBOARD_AAED2000)
+=
aaed2000_kbd.o
obj-$(CONFIG_KEYBOARD_GPIO)
+=
gpio_keys.o
obj-$(CONFIG_KEYBOARD_HP6XX)
+=
jornada680_kbd.o
...
...
drivers/input/keyboard/pxa27x_keyboard.c
deleted
100644 → 0
View file @
c18bab80
/*
* linux/drivers/input/keyboard/pxa27x_keyboard.c
*
* Driver for the pxa27x matrix keyboard controller.
*
* Created: Feb 22, 2007
* Author: Rodolfo Giometti <giometti@linux.it>
*
* Based on a previous implementations by Kevin O'Connor
* <kevin_at_koconnor.net> and Alex Osborne <bobofdoom@gmail.com> and
* on some suggestions by Nicolas Pitre <nico@cam.org>.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/input.h>
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/clk.h>
#include <linux/err.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
#include <asm/mach/map.h>
#include <asm/arch/hardware.h>
#include <asm/arch/pxa-regs.h>
#include <asm/arch/irqs.h>
#include <asm/arch/pxa27x_keyboard.h>
#define DRIVER_NAME "pxa27x-keyboard"
#define KPASMKP(col) (col/2 == 0 ? KPASMKP0 : \
col/2 == 1 ? KPASMKP1 : \
col/2 == 2 ? KPASMKP2 : KPASMKP3)
#define KPASMKPx_MKC(row, col) (1 << (row + 16 * (col % 2)))
static
struct
clk
*
pxakbd_clk
;
static
irqreturn_t
pxakbd_irq_handler
(
int
irq
,
void
*
dev_id
)
{
struct
platform_device
*
pdev
=
dev_id
;
struct
pxa27x_keyboard_platform_data
*
pdata
=
pdev
->
dev
.
platform_data
;
struct
input_dev
*
input_dev
=
platform_get_drvdata
(
pdev
);
unsigned
long
kpc
=
KPC
;
int
p
,
row
,
col
,
rel
;
if
(
kpc
&
KPC_DI
)
{
unsigned
long
kpdk
=
KPDK
;
if
(
!
(
kpdk
&
KPDK_DKP
))
{
/* better luck next time */
}
else
if
(
kpc
&
KPC_REE0
)
{
unsigned
long
kprec
=
KPREC
;
KPREC
=
0x7f
;
if
(
kprec
&
KPREC_OF0
)
rel
=
(
kprec
&
0xff
)
+
0x7f
;
else
if
(
kprec
&
KPREC_UF0
)
rel
=
(
kprec
&
0xff
)
-
0x7f
-
0xff
;
else
rel
=
(
kprec
&
0xff
)
-
0x7f
;
if
(
rel
)
{
input_report_rel
(
input_dev
,
REL_WHEEL
,
rel
);
input_sync
(
input_dev
);
}
}
}
if
(
kpc
&
KPC_MI
)
{
/* report the status of every button */
for
(
row
=
0
;
row
<
pdata
->
nr_rows
;
row
++
)
{
for
(
col
=
0
;
col
<
pdata
->
nr_cols
;
col
++
)
{
p
=
KPASMKP
(
col
)
&
KPASMKPx_MKC
(
row
,
col
)
?
1
:
0
;
pr_debug
(
"keycode %x - pressed %x
\n
"
,
pdata
->
keycodes
[
row
][
col
],
p
);
input_report_key
(
input_dev
,
pdata
->
keycodes
[
row
][
col
],
p
);
}
}
input_sync
(
input_dev
);
}
return
IRQ_HANDLED
;
}
static
int
pxakbd_open
(
struct
input_dev
*
dev
)
{
/* Set keypad control register */
KPC
|=
(
KPC_ASACT
|
KPC_MS_ALL
|
(
2
<<
6
)
|
KPC_REE0
|
KPC_DK_DEB_SEL
|
KPC_ME
|
KPC_MIE
|
KPC_DE
|
KPC_DIE
);
KPC
&=
~
KPC_AS
;
/* disable automatic scan */
KPC
&=
~
KPC_IMKP
;
/* do not ignore multiple keypresses */
/* Set rotary count to mid-point value */
KPREC
=
0x7F
;
/* Enable unit clock */
clk_enable
(
pxakbd_clk
);
return
0
;
}
static
void
pxakbd_close
(
struct
input_dev
*
dev
)
{
/* Disable clock unit */
clk_disable
(
pxakbd_clk
);
}
#ifdef CONFIG_PM
static
int
pxakbd_suspend
(
struct
platform_device
*
pdev
,
pm_message_t
state
)
{
struct
pxa27x_keyboard_platform_data
*
pdata
=
pdev
->
dev
.
platform_data
;
/* Save controller status */
pdata
->
reg_kpc
=
KPC
;
pdata
->
reg_kprec
=
KPREC
;
return
0
;
}
static
int
pxakbd_resume
(
struct
platform_device
*
pdev
)
{
struct
pxa27x_keyboard_platform_data
*
pdata
=
pdev
->
dev
.
platform_data
;
struct
input_dev
*
input_dev
=
platform_get_drvdata
(
pdev
);
mutex_lock
(
&
input_dev
->
mutex
);
if
(
input_dev
->
users
)
{
/* Restore controller status */
KPC
=
pdata
->
reg_kpc
;
KPREC
=
pdata
->
reg_kprec
;
/* Enable unit clock */
clk_disable
(
pxakbd_clk
);
clk_enable
(
pxakbd_clk
);
}
mutex_unlock
(
&
input_dev
->
mutex
);
return
0
;
}
#else
#define pxakbd_suspend NULL
#define pxakbd_resume NULL
#endif
static
int
__devinit
pxakbd_probe
(
struct
platform_device
*
pdev
)
{
struct
pxa27x_keyboard_platform_data
*
pdata
=
pdev
->
dev
.
platform_data
;
struct
input_dev
*
input_dev
;
int
i
,
row
,
col
,
error
;
pxakbd_clk
=
clk_get
(
&
pdev
->
dev
,
"KBDCLK"
);
if
(
IS_ERR
(
pxakbd_clk
))
{
error
=
PTR_ERR
(
pxakbd_clk
);
goto
err_clk
;
}
/* Create and register the input driver. */
input_dev
=
input_allocate_device
();
if
(
!
input_dev
)
{
printk
(
KERN_ERR
"Cannot request keypad device
\n
"
);
error
=
-
ENOMEM
;
goto
err_alloc
;
}
input_dev
->
name
=
DRIVER_NAME
;
input_dev
->
id
.
bustype
=
BUS_HOST
;
input_dev
->
open
=
pxakbd_open
;
input_dev
->
close
=
pxakbd_close
;
input_dev
->
dev
.
parent
=
&
pdev
->
dev
;
input_dev
->
evbit
[
0
]
=
BIT_MASK
(
EV_KEY
)
|
BIT_MASK
(
EV_REP
)
|
BIT_MASK
(
EV_REL
);
input_dev
->
relbit
[
BIT_WORD
(
REL_WHEEL
)]
=
BIT_MASK
(
REL_WHEEL
);
for
(
row
=
0
;
row
<
pdata
->
nr_rows
;
row
++
)
{
for
(
col
=
0
;
col
<
pdata
->
nr_cols
;
col
++
)
{
int
code
=
pdata
->
keycodes
[
row
][
col
];
if
(
code
>
0
)
set_bit
(
code
,
input_dev
->
keybit
);
}
}
error
=
request_irq
(
IRQ_KEYPAD
,
pxakbd_irq_handler
,
IRQF_DISABLED
,
DRIVER_NAME
,
pdev
);
if
(
error
)
{
printk
(
KERN_ERR
"Cannot request keypad IRQ
\n
"
);
goto
err_free_dev
;
}
platform_set_drvdata
(
pdev
,
input_dev
);
/* Register the input device */
error
=
input_register_device
(
input_dev
);
if
(
error
)
goto
err_free_irq
;
/* Setup GPIOs. */
for
(
i
=
0
;
i
<
pdata
->
nr_rows
+
pdata
->
nr_cols
;
i
++
)
pxa_gpio_mode
(
pdata
->
gpio_modes
[
i
]);
/*
* Store rows/cols info into keyboard registers.
*/
KPC
|=
(
pdata
->
nr_rows
-
1
)
<<
26
;
KPC
|=
(
pdata
->
nr_cols
-
1
)
<<
23
;
for
(
col
=
0
;
col
<
pdata
->
nr_cols
;
col
++
)
KPC
|=
KPC_MS0
<<
col
;
return
0
;
err_free_irq:
platform_set_drvdata
(
pdev
,
NULL
);
free_irq
(
IRQ_KEYPAD
,
pdev
);
err_free_dev:
input_free_device
(
input_dev
);
err_alloc:
clk_put
(
pxakbd_clk
);
err_clk:
return
error
;
}
static
int
__devexit
pxakbd_remove
(
struct
platform_device
*
pdev
)
{
struct
input_dev
*
input_dev
=
platform_get_drvdata
(
pdev
);
input_unregister_device
(
input_dev
);
free_irq
(
IRQ_KEYPAD
,
pdev
);
clk_put
(
pxakbd_clk
);
platform_set_drvdata
(
pdev
,
NULL
);
return
0
;
}
static
struct
platform_driver
pxakbd_driver
=
{
.
probe
=
pxakbd_probe
,
.
remove
=
__devexit_p
(
pxakbd_remove
),
.
suspend
=
pxakbd_suspend
,
.
resume
=
pxakbd_resume
,
.
driver
=
{
.
name
=
DRIVER_NAME
,
},
};
static
int
__init
pxakbd_init
(
void
)
{
return
platform_driver_register
(
&
pxakbd_driver
);
}
static
void
__exit
pxakbd_exit
(
void
)
{
platform_driver_unregister
(
&
pxakbd_driver
);
}
module_init
(
pxakbd_init
);
module_exit
(
pxakbd_exit
);
MODULE_DESCRIPTION
(
"PXA27x Matrix Keyboard Driver"
);
MODULE_LICENSE
(
"GPL"
);
drivers/input/keyboard/pxa27x_keypad.c
0 → 100644
View file @
03366e7b
This diff is collapsed.
Click to expand it.
include/asm-arm/arch-pxa/pxa27x_keyboard.h
deleted
100644 → 0
View file @
c18bab80
#define PXAKBD_MAXROW 8
#define PXAKBD_MAXCOL 8
struct
pxa27x_keyboard_platform_data
{
int
nr_rows
,
nr_cols
;
int
keycodes
[
PXAKBD_MAXROW
][
PXAKBD_MAXCOL
];
int
gpio_modes
[
PXAKBD_MAXROW
+
PXAKBD_MAXCOL
];
#ifdef CONFIG_PM
u32
reg_kpc
;
u32
reg_kprec
;
#endif
};
include/asm-arm/arch-pxa/pxa27x_keypad.h
0 → 100644
View file @
03366e7b
#ifndef __ASM_ARCH_PXA27x_KEYPAD_H
#define __ASM_ARCH_PXA27x_KEYPAD_H
#include <linux/input.h>
#define MAX_MATRIX_KEY_ROWS (8)
#define MAX_MATRIX_KEY_COLS (8)
/* pxa3xx keypad platform specific parameters
*
* NOTE:
* 1. direct_key_num indicates the number of keys in the direct keypad
* _plus_ the number of rotary-encoder sensor inputs, this can be
* left as 0 if only rotary encoders are enabled, the driver will
* automatically calculate this
*
* 2. direct_key_map is the key code map for the direct keys, if rotary
* encoder(s) are enabled, direct key 0/1(2/3) will be ignored
*
* 3. rotary can be either interpreted as a relative input event (e.g.
* REL_WHEEL/REL_HWHEEL) or specific keys (e.g. UP/DOWN/LEFT/RIGHT)
*
* 4. matrix key and direct key will use the same debounce_interval by
* default, which should be sufficient in most cases
*/
struct
pxa27x_keypad_platform_data
{
/* code map for the matrix keys */
unsigned
int
matrix_key_rows
;
unsigned
int
matrix_key_cols
;
unsigned
int
*
matrix_key_map
;
int
matrix_key_map_size
;
/* direct keys */
int
direct_key_num
;
unsigned
int
direct_key_map
[
8
];
/* rotary encoders 0 */
int
enable_rotary0
;
int
rotary0_rel_code
;
int
rotary0_up_key
;
int
rotary0_down_key
;
/* rotary encoders 1 */
int
enable_rotary1
;
int
rotary1_rel_code
;
int
rotary1_up_key
;
int
rotary1_down_key
;
/* key debounce interval */
unsigned
int
debounce_interval
;
};
#define KEY(row, col, val) (((row) << 28) | ((col) << 24) | (val))
#endif
/* __ASM_ARCH_PXA27x_KEYPAD_H */
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