]> git.baikalelectronics.ru Git - uboot.git/commitdiff
dm: button: add support for linux_code in button-gpio.c driver
authorDzmitry Sankouski <dsankouski@gmail.com>
Sun, 22 Jan 2023 15:21:24 +0000 (18:21 +0300)
committerTom Rini <trini@konsulko.com>
Fri, 10 Feb 2023 17:50:01 +0000 (12:50 -0500)
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>
arch/sandbox/dts/test.dts
drivers/button/button-gpio.c
drivers/button/button-uclass.c
include/button.h
test/dm/button.c

index 716e8c718565a409fe4dbbc079fd6700e7c68c98..88d4d3cb9834e5decc43abe64a9d4948c27ee438 100644 (file)
                btn1 {
                        gpios = <&gpio_a 3 0>;
                        label = "button1";
+                       linux,code = <BTN_1>;
                };
 
                btn2 {
                        gpios = <&gpio_a 4 0>;
                        label = "button2";
+                       linux,code = <BTN_2>;
                };
        };
 
index dbb000622c7812a7be2262c4a1e772990be7af92..7b5b3affe2ddab2aea0601053ec4e7aab19d8c1b 100644 (file)
@@ -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[] = {
index e33ed7d01d1f0cbfc5773d1082b9c01486552d0f..032191d61abc58a21ca0dfaac0a16262071d124f 100644 (file)
@@ -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",
index 96e6b1901fc5d506b77a0f8f499fd20db1b90c38..207f4a0f4dbd83b0d9b63e4d6756bccf8e95174a 100644 (file)
@@ -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
index e76c1ad030a5a15f3d68221f6086eefc216885cc..3318668df25abc8b6c6b4a91da0d02fd915657c1 100644 (file)
@@ -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)
 {