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