Commit b3ab5787 authored by Nikita Shubin's avatar Nikita Shubin Committed by Arnd Bergmann

input: keypad: ep93xx: add DT support for Cirrus EP93xx

- drop flags, they were not used anyway
- add OF ID match table
- process "autorepeat", "debounce-delay-ms", prescale from device tree
- drop platform data usage and it's header
- keymap goes from device tree now on
Signed-off-by: default avatarNikita Shubin <nikita.shubin@maquefel.me>
Acked-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
Acked-by: default avatarVinod Koul <vkoul@kernel.org>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parent 9cefdd1a
...@@ -697,52 +697,6 @@ void __init ep93xx_register_keypad(struct ep93xx_keypad_platform_data *data) ...@@ -697,52 +697,6 @@ void __init ep93xx_register_keypad(struct ep93xx_keypad_platform_data *data)
platform_device_register(&ep93xx_keypad_device); 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; 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);
/************************************************************************* /*************************************************************************
* EP93xx I2S audio peripheral handling * EP93xx I2S audio peripheral handling
*************************************************************************/ *************************************************************************/
......
...@@ -6,20 +6,13 @@ ...@@ -6,20 +6,13 @@
* *
* Based on the pxa27x matrix keypad controller by Rodolfo Giometti. * Based on the pxa27x matrix keypad controller by Rodolfo Giometti.
* *
* NOTE:
*
* The 3-key reset is triggered by pressing the 3 keys in
* Row 0, Columns 2, 4, and 7 at the same time. This action can
* be disabled by setting the EP93XX_KEYPAD_DISABLE_3_KEY flag.
*
* Normal operation for the matrix does not autorepeat the key press.
* This action can be enabled by setting the EP93XX_KEYPAD_AUTOREPEAT
* flag.
*/ */
#include <linux/bits.h> #include <linux/bits.h>
#include <linux/mod_devicetable.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/property.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/io.h> #include <linux/io.h>
...@@ -27,7 +20,6 @@ ...@@ -27,7 +20,6 @@
#include <linux/input/matrix_keypad.h> #include <linux/input/matrix_keypad.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/soc/cirrus/ep93xx.h> #include <linux/soc/cirrus/ep93xx.h>
#include <linux/platform_data/keypad-ep93xx.h>
#include <linux/pm_wakeirq.h> #include <linux/pm_wakeirq.h>
/* /*
...@@ -61,12 +53,16 @@ ...@@ -61,12 +53,16 @@
#define KEY_REG_KEY1_MASK GENMASK(5, 0) #define KEY_REG_KEY1_MASK GENMASK(5, 0)
#define KEY_REG_KEY1_SHIFT 0 #define KEY_REG_KEY1_SHIFT 0
#define EP93XX_MATRIX_ROWS (8)
#define EP93XX_MATRIX_COLS (8)
#define EP93XX_MATRIX_SIZE (EP93XX_MATRIX_ROWS * EP93XX_MATRIX_COLS) #define EP93XX_MATRIX_SIZE (EP93XX_MATRIX_ROWS * EP93XX_MATRIX_COLS)
struct ep93xx_keypad { struct ep93xx_keypad {
struct ep93xx_keypad_platform_data *pdata;
struct input_dev *input_dev; struct input_dev *input_dev;
struct clk *clk; struct clk *clk;
unsigned int debounce;
u16 prescale;
void __iomem *mmio_base; void __iomem *mmio_base;
...@@ -133,23 +129,11 @@ static irqreturn_t ep93xx_keypad_irq_handler(int irq, void *dev_id) ...@@ -133,23 +129,11 @@ static irqreturn_t ep93xx_keypad_irq_handler(int irq, void *dev_id)
static void ep93xx_keypad_config(struct ep93xx_keypad *keypad) static void ep93xx_keypad_config(struct ep93xx_keypad *keypad)
{ {
struct ep93xx_keypad_platform_data *pdata = keypad->pdata;
unsigned int val = 0; unsigned int val = 0;
clk_set_rate(keypad->clk, pdata->clk_rate); val |= (keypad->debounce << KEY_INIT_DBNC_SHIFT) & KEY_INIT_DBNC_MASK;
if (pdata->flags & EP93XX_KEYPAD_DISABLE_3_KEY)
val |= KEY_INIT_DIS3KY;
if (pdata->flags & EP93XX_KEYPAD_DIAG_MODE)
val |= KEY_INIT_DIAG;
if (pdata->flags & EP93XX_KEYPAD_BACK_DRIVE)
val |= KEY_INIT_BACK;
if (pdata->flags & EP93XX_KEYPAD_TEST_MODE)
val |= KEY_INIT_T2;
val |= ((pdata->debounce << KEY_INIT_DBNC_SHIFT) & KEY_INIT_DBNC_MASK);
val |= ((pdata->prescale << KEY_INIT_PRSCL_SHIFT) & KEY_INIT_PRSCL_MASK); val |= (keypad->prescale << KEY_INIT_PRSCL_SHIFT) & KEY_INIT_PRSCL_MASK;
__raw_writel(val, keypad->mmio_base + KEY_INIT); __raw_writel(val, keypad->mmio_base + KEY_INIT);
} }
...@@ -220,17 +204,10 @@ static int ep93xx_keypad_resume(struct device *dev) ...@@ -220,17 +204,10 @@ static int ep93xx_keypad_resume(struct device *dev)
static DEFINE_SIMPLE_DEV_PM_OPS(ep93xx_keypad_pm_ops, static DEFINE_SIMPLE_DEV_PM_OPS(ep93xx_keypad_pm_ops,
ep93xx_keypad_suspend, ep93xx_keypad_resume); ep93xx_keypad_suspend, ep93xx_keypad_resume);
static void ep93xx_keypad_release_gpio_action(void *_pdev)
{
struct platform_device *pdev = _pdev;
ep93xx_keypad_release_gpio(pdev);
}
static int ep93xx_keypad_probe(struct platform_device *pdev) static int ep93xx_keypad_probe(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev;
struct ep93xx_keypad *keypad; struct ep93xx_keypad *keypad;
const struct matrix_keymap_data *keymap_data;
struct input_dev *input_dev; struct input_dev *input_dev;
int err; int err;
...@@ -238,14 +215,6 @@ static int ep93xx_keypad_probe(struct platform_device *pdev) ...@@ -238,14 +215,6 @@ static int ep93xx_keypad_probe(struct platform_device *pdev)
if (!keypad) if (!keypad)
return -ENOMEM; return -ENOMEM;
keypad->pdata = dev_get_platdata(&pdev->dev);
if (!keypad->pdata)
return -EINVAL;
keymap_data = keypad->pdata->keymap_data;
if (!keymap_data)
return -EINVAL;
keypad->irq = platform_get_irq(pdev, 0); keypad->irq = platform_get_irq(pdev, 0);
if (keypad->irq < 0) if (keypad->irq < 0)
return keypad->irq; return keypad->irq;
...@@ -254,19 +223,13 @@ static int ep93xx_keypad_probe(struct platform_device *pdev) ...@@ -254,19 +223,13 @@ static int ep93xx_keypad_probe(struct platform_device *pdev)
if (IS_ERR(keypad->mmio_base)) if (IS_ERR(keypad->mmio_base))
return PTR_ERR(keypad->mmio_base); return PTR_ERR(keypad->mmio_base);
err = ep93xx_keypad_acquire_gpio(pdev);
if (err)
return err;
err = devm_add_action_or_reset(&pdev->dev,
ep93xx_keypad_release_gpio_action, pdev);
if (err)
return err;
keypad->clk = devm_clk_get(&pdev->dev, NULL); keypad->clk = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(keypad->clk)) if (IS_ERR(keypad->clk))
return PTR_ERR(keypad->clk); return PTR_ERR(keypad->clk);
device_property_read_u32(dev, "debounce-delay-ms", &keypad->debounce);
device_property_read_u16(dev, "cirrus,prescale", &keypad->prescale);
input_dev = devm_input_allocate_device(&pdev->dev); input_dev = devm_input_allocate_device(&pdev->dev);
if (!input_dev) if (!input_dev)
return -ENOMEM; return -ENOMEM;
...@@ -278,13 +241,13 @@ static int ep93xx_keypad_probe(struct platform_device *pdev) ...@@ -278,13 +241,13 @@ static int ep93xx_keypad_probe(struct platform_device *pdev)
input_dev->open = ep93xx_keypad_open; input_dev->open = ep93xx_keypad_open;
input_dev->close = ep93xx_keypad_close; input_dev->close = ep93xx_keypad_close;
err = matrix_keypad_build_keymap(keymap_data, NULL, err = matrix_keypad_build_keymap(NULL, NULL,
EP93XX_MATRIX_ROWS, EP93XX_MATRIX_COLS, EP93XX_MATRIX_ROWS, EP93XX_MATRIX_COLS,
keypad->keycodes, input_dev); keypad->keycodes, input_dev);
if (err) if (err)
return err; return err;
if (keypad->pdata->flags & EP93XX_KEYPAD_AUTOREPEAT) if (device_property_read_bool(&pdev->dev, "autorepeat"))
__set_bit(EV_REP, input_dev->evbit); __set_bit(EV_REP, input_dev->evbit);
input_set_drvdata(input_dev, keypad); input_set_drvdata(input_dev, keypad);
...@@ -313,10 +276,17 @@ static void ep93xx_keypad_remove(struct platform_device *pdev) ...@@ -313,10 +276,17 @@ static void ep93xx_keypad_remove(struct platform_device *pdev)
dev_pm_clear_wake_irq(&pdev->dev); dev_pm_clear_wake_irq(&pdev->dev);
} }
static const struct of_device_id ep93xx_keypad_of_ids[] = {
{ .compatible = "cirrus,ep9307-keypad" },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, ep93xx_keypad_of_ids);
static struct platform_driver ep93xx_keypad_driver = { static struct platform_driver ep93xx_keypad_driver = {
.driver = { .driver = {
.name = "ep93xx-keypad", .name = "ep93xx-keypad",
.pm = pm_sleep_ptr(&ep93xx_keypad_pm_ops), .pm = pm_sleep_ptr(&ep93xx_keypad_pm_ops),
.of_match_table = ep93xx_keypad_of_ids,
}, },
.probe = ep93xx_keypad_probe, .probe = ep93xx_keypad_probe,
.remove_new = ep93xx_keypad_remove, .remove_new = ep93xx_keypad_remove,
......
...@@ -41,8 +41,6 @@ int ep93xx_pwm_acquire_gpio(struct platform_device *pdev); ...@@ -41,8 +41,6 @@ int ep93xx_pwm_acquire_gpio(struct platform_device *pdev);
void ep93xx_pwm_release_gpio(struct platform_device *pdev); void ep93xx_pwm_release_gpio(struct platform_device *pdev);
int ep93xx_ide_acquire_gpio(struct platform_device *pdev); int ep93xx_ide_acquire_gpio(struct platform_device *pdev);
void ep93xx_ide_release_gpio(struct platform_device *pdev); void ep93xx_ide_release_gpio(struct platform_device *pdev);
int ep93xx_keypad_acquire_gpio(struct platform_device *pdev);
void ep93xx_keypad_release_gpio(struct platform_device *pdev);
int ep93xx_i2s_acquire(void); int ep93xx_i2s_acquire(void);
void ep93xx_i2s_release(void); void ep93xx_i2s_release(void);
unsigned int ep93xx_chip_revision(void); unsigned int ep93xx_chip_revision(void);
...@@ -52,8 +50,6 @@ static inline int ep93xx_pwm_acquire_gpio(struct platform_device *pdev) { return ...@@ -52,8 +50,6 @@ static inline int ep93xx_pwm_acquire_gpio(struct platform_device *pdev) { return
static inline void ep93xx_pwm_release_gpio(struct platform_device *pdev) {} static inline void ep93xx_pwm_release_gpio(struct platform_device *pdev) {}
static inline int ep93xx_ide_acquire_gpio(struct platform_device *pdev) { return 0; } static inline int ep93xx_ide_acquire_gpio(struct platform_device *pdev) { return 0; }
static inline void ep93xx_ide_release_gpio(struct platform_device *pdev) {} static inline void ep93xx_ide_release_gpio(struct platform_device *pdev) {}
static inline int ep93xx_keypad_acquire_gpio(struct platform_device *pdev) { return 0; }
static inline void ep93xx_keypad_release_gpio(struct platform_device *pdev) {}
static inline int ep93xx_i2s_acquire(void) { return 0; } static inline int ep93xx_i2s_acquire(void) { return 0; }
static inline void ep93xx_i2s_release(void) {} static inline void ep93xx_i2s_release(void) {}
static inline unsigned int ep93xx_chip_revision(void) { return 0; } static inline unsigned int ep93xx_chip_revision(void) { return 0; }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment