summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDzmitry Sankouski <dsankouski@gmail.com>2023-01-22 18:21:24 +0300
committerTom Rini <trini@konsulko.com>2023-02-10 12:50:01 -0500
commitea6fdc135954186ada5df9cca3f063a9a785d1b2 (patch)
tree7da52a5aafa491db923bb77352acaf08f268cd97
parent298ffdd5d65c4d67b958080c1a712f8f1c923af3 (diff)
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>
-rw-r--r--arch/sandbox/dts/test.dts2
-rw-r--r--drivers/button/button-gpio.c17
-rw-r--r--drivers/button/button-uclass.c10
-rw-r--r--include/button.h16
-rw-r--r--test/dm/button.c13
5 files changed, 57 insertions, 1 deletions
diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts
index 716e8c7185..88d4d3cb98 100644
--- a/arch/sandbox/dts/test.dts
+++ b/arch/sandbox/dts/test.dts
@@ -172,11 +172,13 @@
btn1 {
gpios = <&gpio_a 3 0>;
label = "button1";
+ linux,code = <BTN_1>;
};
btn2 {
gpios = <&gpio_a 4 0>;
label = "button2";
+ linux,code = <BTN_2>;
};
};
diff --git a/drivers/button/button-gpio.c b/drivers/button/button-gpio.c
index dbb000622c..7b5b3affe2 100644
--- a/drivers/button/button-gpio.c
+++ b/drivers/button/button-gpio.c
@@ -13,6 +13,7 @@
struct button_gpio_priv {
struct gpio_desc gpio;
+ int linux_code;
};
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;
}
+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)
{
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)
return ret;
- return 0;
+ ret = dev_read_u32(dev, "linux,code", &priv->linux_code);
+
+ return ret;
}
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 = {
.get_state = button_gpio_get_state,
+ .get_code = button_gpio_get_code,
};
static const struct udevice_id button_gpio_ids[] = {
diff --git a/drivers/button/button-uclass.c b/drivers/button/button-uclass.c
index e33ed7d01d..032191d61a 100644
--- a/drivers/button/button-uclass.c
+++ b/drivers/button/button-uclass.c
@@ -38,6 +38,16 @@ enum button_state_t button_get_state(struct udevice *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) = {
.id = UCLASS_BUTTON,
.name = "button",
diff --git a/include/button.h b/include/button.h
index 96e6b1901f..207f4a0f4d 100644
--- a/include/button.h
+++ b/include/button.h
@@ -37,6 +37,14 @@ struct button_ops {
* @return button state button_state_t, or -ve on error
*/
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)
@@ -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);
+/**
+ * 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
diff --git a/test/dm/button.c b/test/dm/button.c
index e76c1ad030..3318668df2 100644
--- a/test/dm/button.c
+++ b/test/dm/button.c
@@ -13,6 +13,7 @@
#include <power/sandbox_pmic.h>
#include <asm/gpio.h>
#include <dm/test.h>
+#include <dt-bindings/input/input.h>
#include <test/ut.h>
/* 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);
+/* 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 */
static int dm_test_button_keys_adc(struct unit_test_state *uts)
{