diff options
| author | Dzmitry Sankouski <dsankouski@gmail.com> | 2023-01-22 18:21:24 +0300 | 
|---|---|---|
| committer | Tom Rini <trini@konsulko.com> | 2023-02-10 12:50:01 -0500 | 
| commit | ea6fdc135954186ada5df9cca3f063a9a785d1b2 (patch) | |
| tree | 7da52a5aafa491db923bb77352acaf08f268cd97 | |
| parent | 298ffdd5d65c4d67b958080c1a712f8f1c923af3 (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.dts | 2 | ||||
| -rw-r--r-- | drivers/button/button-gpio.c | 17 | ||||
| -rw-r--r-- | drivers/button/button-uclass.c | 10 | ||||
| -rw-r--r-- | include/button.h | 16 | ||||
| -rw-r--r-- | test/dm/button.c | 13 | 
5 files changed, 57 insertions, 1 deletions
| diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts index 716e8c71856..88d4d3cb983 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 dbb000622c7..7b5b3affe2d 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 e33ed7d01d1..032191d61ab 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 96e6b1901fc..207f4a0f4db 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 e76c1ad030a..3318668df25 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)  { | 
