mirror of
https://github.com/AsahiLinux/u-boot
synced 2025-02-16 05:58:49 +00:00
dm: button: add support for linux_code in button-gpio.c driver
Linux event code must be used in input devices, using buttons. Signed-off-by: Dzmitry Sankouski <dsankouski@gmail.com> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
298ffdd5d6
commit
ea6fdc1359
5 changed files with 57 additions and 1 deletions
|
@ -172,11 +172,13 @@
|
||||||
btn1 {
|
btn1 {
|
||||||
gpios = <&gpio_a 3 0>;
|
gpios = <&gpio_a 3 0>;
|
||||||
label = "button1";
|
label = "button1";
|
||||||
|
linux,code = <BTN_1>;
|
||||||
};
|
};
|
||||||
|
|
||||||
btn2 {
|
btn2 {
|
||||||
gpios = <&gpio_a 4 0>;
|
gpios = <&gpio_a 4 0>;
|
||||||
label = "button2";
|
label = "button2";
|
||||||
|
linux,code = <BTN_2>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
|
|
||||||
struct button_gpio_priv {
|
struct button_gpio_priv {
|
||||||
struct gpio_desc gpio;
|
struct gpio_desc gpio;
|
||||||
|
int linux_code;
|
||||||
};
|
};
|
||||||
|
|
||||||
static enum button_state_t button_gpio_get_state(struct udevice *dev)
|
static enum button_state_t button_gpio_get_state(struct udevice *dev)
|
||||||
|
@ -29,6 +30,17 @@ static enum button_state_t button_gpio_get_state(struct udevice *dev)
|
||||||
return ret ? BUTTON_ON : BUTTON_OFF;
|
return ret ? BUTTON_ON : BUTTON_OFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int button_gpio_get_code(struct udevice *dev)
|
||||||
|
{
|
||||||
|
struct button_gpio_priv *priv = dev_get_priv(dev);
|
||||||
|
int code = priv->linux_code;
|
||||||
|
|
||||||
|
if (!code)
|
||||||
|
return -ENODATA;
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static int button_gpio_probe(struct udevice *dev)
|
static int button_gpio_probe(struct udevice *dev)
|
||||||
{
|
{
|
||||||
struct button_uc_plat *uc_plat = dev_get_uclass_plat(dev);
|
struct button_uc_plat *uc_plat = dev_get_uclass_plat(dev);
|
||||||
|
@ -43,7 +55,9 @@ static int button_gpio_probe(struct udevice *dev)
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
return 0;
|
ret = dev_read_u32(dev, "linux,code", &priv->linux_code);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int button_gpio_remove(struct udevice *dev)
|
static int button_gpio_remove(struct udevice *dev)
|
||||||
|
@ -92,6 +106,7 @@ static int button_gpio_bind(struct udevice *parent)
|
||||||
|
|
||||||
static const struct button_ops button_gpio_ops = {
|
static const struct button_ops button_gpio_ops = {
|
||||||
.get_state = button_gpio_get_state,
|
.get_state = button_gpio_get_state,
|
||||||
|
.get_code = button_gpio_get_code,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct udevice_id button_gpio_ids[] = {
|
static const struct udevice_id button_gpio_ids[] = {
|
||||||
|
|
|
@ -38,6 +38,16 @@ enum button_state_t button_get_state(struct udevice *dev)
|
||||||
return ops->get_state(dev);
|
return ops->get_state(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int button_get_code(struct udevice *dev)
|
||||||
|
{
|
||||||
|
struct button_ops *ops = button_get_ops(dev);
|
||||||
|
|
||||||
|
if (!ops->get_code)
|
||||||
|
return -ENOSYS;
|
||||||
|
|
||||||
|
return ops->get_code(dev);
|
||||||
|
}
|
||||||
|
|
||||||
UCLASS_DRIVER(button) = {
|
UCLASS_DRIVER(button) = {
|
||||||
.id = UCLASS_BUTTON,
|
.id = UCLASS_BUTTON,
|
||||||
.name = "button",
|
.name = "button",
|
||||||
|
|
|
@ -37,6 +37,14 @@ struct button_ops {
|
||||||
* @return button state button_state_t, or -ve on error
|
* @return button state button_state_t, or -ve on error
|
||||||
*/
|
*/
|
||||||
enum button_state_t (*get_state)(struct udevice *dev);
|
enum button_state_t (*get_state)(struct udevice *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get_code() - get linux event code of a button
|
||||||
|
*
|
||||||
|
* @dev: button device to change
|
||||||
|
* @return button code, or -ENODATA on error
|
||||||
|
*/
|
||||||
|
int (*get_code)(struct udevice *dev);
|
||||||
};
|
};
|
||||||
|
|
||||||
#define button_get_ops(dev) ((struct button_ops *)(dev)->driver->ops)
|
#define button_get_ops(dev) ((struct button_ops *)(dev)->driver->ops)
|
||||||
|
@ -58,4 +66,12 @@ int button_get_by_label(const char *label, struct udevice **devp);
|
||||||
*/
|
*/
|
||||||
enum button_state_t button_get_state(struct udevice *dev);
|
enum button_state_t button_get_state(struct udevice *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* button_get_code() - get linux event code of a button
|
||||||
|
*
|
||||||
|
* @dev: button device to change
|
||||||
|
* @return button code, or -ve on error
|
||||||
|
*/
|
||||||
|
int button_get_code(struct udevice *dev);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include <power/sandbox_pmic.h>
|
#include <power/sandbox_pmic.h>
|
||||||
#include <asm/gpio.h>
|
#include <asm/gpio.h>
|
||||||
#include <dm/test.h>
|
#include <dm/test.h>
|
||||||
|
#include <dt-bindings/input/input.h>
|
||||||
#include <test/ut.h>
|
#include <test/ut.h>
|
||||||
|
|
||||||
/* Base test of the button uclass */
|
/* Base test of the button uclass */
|
||||||
|
@ -85,6 +86,18 @@ static int dm_test_button_label(struct unit_test_state *uts)
|
||||||
}
|
}
|
||||||
DM_TEST(dm_test_button_label, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
|
DM_TEST(dm_test_button_label, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
|
||||||
|
|
||||||
|
/* Test button has linux,code */
|
||||||
|
static int dm_test_button_linux_code(struct unit_test_state *uts)
|
||||||
|
{
|
||||||
|
struct udevice *dev;
|
||||||
|
|
||||||
|
ut_assertok(uclass_get_device(UCLASS_BUTTON, 1, &dev));
|
||||||
|
ut_asserteq(BTN_1, button_get_code(dev));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
DM_TEST(dm_test_button_linux_code, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
|
||||||
|
|
||||||
/* Test adc-keys driver */
|
/* Test adc-keys driver */
|
||||||
static int dm_test_button_keys_adc(struct unit_test_state *uts)
|
static int dm_test_button_keys_adc(struct unit_test_state *uts)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Reference in a new issue