|
@@ -31,6 +31,7 @@
|
|
|
|
|
|
#include <mach/hardware.h>
|
|
|
#include <mach/fb.h>
|
|
|
+#include <mach/ep93xx_keypad.h>
|
|
|
|
|
|
#include <asm/mach/map.h>
|
|
|
#include <asm/mach/time.h>
|
|
@@ -728,6 +729,82 @@ void __init ep93xx_register_fb(struct ep93xxfb_mach_info *data)
|
|
|
platform_device_register(&ep93xx_fb_device);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+/*************************************************************************
|
|
|
+ * EP93xx matrix keypad peripheral handling
|
|
|
+ *************************************************************************/
|
|
|
+static struct resource ep93xx_keypad_resource[] = {
|
|
|
+ {
|
|
|
+ .start = EP93XX_KEY_MATRIX_PHYS_BASE,
|
|
|
+ .end = EP93XX_KEY_MATRIX_PHYS_BASE + 0x0c - 1,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ }, {
|
|
|
+ .start = IRQ_EP93XX_KEY,
|
|
|
+ .end = IRQ_EP93XX_KEY,
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device ep93xx_keypad_device = {
|
|
|
+ .name = "ep93xx-keypad",
|
|
|
+ .id = -1,
|
|
|
+ .num_resources = ARRAY_SIZE(ep93xx_keypad_resource),
|
|
|
+ .resource = ep93xx_keypad_resource,
|
|
|
+};
|
|
|
+
|
|
|
+void __init ep93xx_register_keypad(struct ep93xx_keypad_platform_data *data)
|
|
|
+{
|
|
|
+ ep93xx_keypad_device.dev.platform_data = data;
|
|
|
+ platform_device_register(&ep93xx_keypad_device);
|
|
|
+}
|
|
|
+
|
|
|
+int ep93xx_keypad_acquire_gpio(struct platform_device *pdev)
|
|
|
+{
|
|
|
+ int err;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ for (i = 0; i < 8; i++) {
|
|
|
+ err = gpio_request(EP93XX_GPIO_LINE_C(i), dev_name(&pdev->dev));
|
|
|
+ if (err)
|
|
|
+ goto fail_gpio_c;
|
|
|
+ err = gpio_request(EP93XX_GPIO_LINE_D(i), dev_name(&pdev->dev));
|
|
|
+ if (err)
|
|
|
+ goto fail_gpio_d;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Enable the keypad controller; GPIO ports C and D used for keypad */
|
|
|
+ ep93xx_devcfg_clear_bits(EP93XX_SYSCON_DEVCFG_KEYS |
|
|
|
+ EP93XX_SYSCON_DEVCFG_GONK);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+
|
|
|
+fail_gpio_d:
|
|
|
+ gpio_free(EP93XX_GPIO_LINE_C(i));
|
|
|
+fail_gpio_c:
|
|
|
+ for ( ; i >= 0; --i) {
|
|
|
+ gpio_free(EP93XX_GPIO_LINE_C(i));
|
|
|
+ gpio_free(EP93XX_GPIO_LINE_D(i));
|
|
|
+ }
|
|
|
+ return err;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(ep93xx_keypad_acquire_gpio);
|
|
|
+
|
|
|
+void ep93xx_keypad_release_gpio(struct platform_device *pdev)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+
|
|
|
+ for (i = 0; i < 8; i++) {
|
|
|
+ gpio_free(EP93XX_GPIO_LINE_C(i));
|
|
|
+ gpio_free(EP93XX_GPIO_LINE_D(i));
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Disable the keypad controller; GPIO ports C and D used for GPIO */
|
|
|
+ ep93xx_devcfg_set_bits(EP93XX_SYSCON_DEVCFG_KEYS |
|
|
|
+ EP93XX_SYSCON_DEVCFG_GONK);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(ep93xx_keypad_release_gpio);
|
|
|
+
|
|
|
+
|
|
|
extern void ep93xx_gpio_init(void);
|
|
|
|
|
|
void __init ep93xx_init_devices(void)
|