All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v2 0/9] dm: led: Expand the LED interface and add a command
@ 2017-04-10 17:34 Simon Glass
  2017-04-10 17:34 ` [U-Boot] [PATCH v2 1/9] sandbox: Add some test LEDs Simon Glass
                   ` (9 more replies)
  0 siblings, 10 replies; 29+ messages in thread
From: Simon Glass @ 2017-04-10 17:34 UTC (permalink / raw)
  To: u-boot

The LED interface for driver model is a little primitive. This series
expands it to match the legacy interface and adds a command to match.

Changes in v2:
- Add new patch with blank line in the Kconfig file
- Drop the explicit assignment to LEDST_TOGGLE
- Control this feature via a new CONFIG_LED_BLINK option

Simon Glass (9):
  sandbox: Add some test LEDs
  dm: led: Add a missing blank line in the Kconfig file
  dm: led: Rename struct led_uclass_plat
  dm: led: Adjust the LED uclass
  dm: led: Add support for getting the state of an LED
  dm: led: Support toggling LEDs
  dm: led: Add support for blinking LEDs
  led: Mark existing driver as legacy
  dm: led: Add a new 'led' command

 arch/sandbox/dts/sandbox.dts    |  14 +++
 cmd/Kconfig                     |   9 ++
 cmd/Makefile                    |   3 +-
 cmd/led.c                       | 262 +++++++++++++++++-----------------------
 cmd/legacy_led.c                | 187 ++++++++++++++++++++++++++++
 configs/sandbox_defconfig       |   1 +
 configs/sandbox_noblk_defconfig |   1 +
 configs/sandbox_spl_defconfig   |   1 +
 drivers/led/Kconfig             |  10 ++
 drivers/led/led-uclass.c        |  32 ++++-
 drivers/led/led_gpio.c          |  39 +++++-
 include/led.h                   |  75 ++++++++++--
 test/dm/led.c                   |  56 ++++++++-
 13 files changed, 517 insertions(+), 173 deletions(-)
 create mode 100644 cmd/legacy_led.c

-- 
2.12.2.715.g7642488e1d-goog

^ permalink raw reply	[flat|nested] 29+ messages in thread

* [U-Boot] [PATCH v2 1/9] sandbox: Add some test LEDs
  2017-04-10 17:34 [U-Boot] [PATCH v2 0/9] dm: led: Expand the LED interface and add a command Simon Glass
@ 2017-04-10 17:34 ` Simon Glass
  2017-04-12  8:51   ` Ziping Chen
  2017-04-10 17:34 ` [U-Boot] [PATCH v2 2/9] dm: led: Add a missing blank line in the Kconfig file Simon Glass
                   ` (8 subsequent siblings)
  9 siblings, 1 reply; 29+ messages in thread
From: Simon Glass @ 2017-04-10 17:34 UTC (permalink / raw)
  To: u-boot

Add some LEDs to the standard sandbox device tree.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 arch/sandbox/dts/sandbox.dts | 14 ++++++++++++++
 cmd/{led.c => legacy_led.c}  |  0
 2 files changed, 14 insertions(+)
 rename cmd/{led.c => legacy_led.c} (100%)

diff --git a/arch/sandbox/dts/sandbox.dts b/arch/sandbox/dts/sandbox.dts
index 20614646f7..40f423da25 100644
--- a/arch/sandbox/dts/sandbox.dts
+++ b/arch/sandbox/dts/sandbox.dts
@@ -123,6 +123,20 @@
 		yres = <768>;
 	};
 
+	leds {
+		compatible = "gpio-leds";
+
+		iracibble {
+			gpios = <&gpio_a 1 0>;
+			label = "sandbox:red";
+		};
+
+		martinet {
+			gpios = <&gpio_a 2 0>;
+			label = "sandbox:green";
+		};
+	};
+
 	pci: pci-controller {
 		compatible = "sandbox,pci";
 		device_type = "pci";
diff --git a/cmd/led.c b/cmd/legacy_led.c
similarity index 100%
rename from cmd/led.c
rename to cmd/legacy_led.c
-- 
2.12.2.715.g7642488e1d-goog

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [U-Boot] [PATCH v2 2/9] dm: led: Add a missing blank line in the Kconfig file
  2017-04-10 17:34 [U-Boot] [PATCH v2 0/9] dm: led: Expand the LED interface and add a command Simon Glass
  2017-04-10 17:34 ` [U-Boot] [PATCH v2 1/9] sandbox: Add some test LEDs Simon Glass
@ 2017-04-10 17:34 ` Simon Glass
  2017-04-12  8:51   ` Ziping Chen
  2017-04-10 17:34 ` [U-Boot] [PATCH v2 3/9] dm: led: Rename struct led_uclass_plat Simon Glass
                   ` (7 subsequent siblings)
  9 siblings, 1 reply; 29+ messages in thread
From: Simon Glass @ 2017-04-10 17:34 UTC (permalink / raw)
  To: u-boot

There should be a blank line between each option. Add one before LED_GPIO.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2:
- Add new patch with blank line in the Kconfig file

 drivers/led/Kconfig | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/led/Kconfig b/drivers/led/Kconfig
index 609b1fa3fe..0ef45bc06a 100644
--- a/drivers/led/Kconfig
+++ b/drivers/led/Kconfig
@@ -17,6 +17,7 @@ config SPL_LED
 	  If this is acceptable and you have a need to use LEDs in SPL,
 	  enable this option. You will need to enable device tree in SPL
 	  for this to work.
+
 config LED_GPIO
 	bool "LED support for GPIO-connected LEDs"
 	depends on LED && DM_GPIO
-- 
2.12.2.715.g7642488e1d-goog

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [U-Boot] [PATCH v2 3/9] dm: led: Rename struct led_uclass_plat
  2017-04-10 17:34 [U-Boot] [PATCH v2 0/9] dm: led: Expand the LED interface and add a command Simon Glass
  2017-04-10 17:34 ` [U-Boot] [PATCH v2 1/9] sandbox: Add some test LEDs Simon Glass
  2017-04-10 17:34 ` [U-Boot] [PATCH v2 2/9] dm: led: Add a missing blank line in the Kconfig file Simon Glass
@ 2017-04-10 17:34 ` Simon Glass
  2017-04-12  8:51   ` Ziping Chen
  2017-04-10 17:34 ` [U-Boot] [PATCH v2 4/9] dm: led: Adjust the LED uclass Simon Glass
                   ` (6 subsequent siblings)
  9 siblings, 1 reply; 29+ messages in thread
From: Simon Glass @ 2017-04-10 17:34 UTC (permalink / raw)
  To: u-boot

These structures are normally named with 'uc' instead of 'uclass'. Change
this one for consistency.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 drivers/led/led-uclass.c | 4 ++--
 drivers/led/led_gpio.c   | 4 ++--
 include/led.h            | 4 ++--
 3 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/led/led-uclass.c b/drivers/led/led-uclass.c
index 784ac870e2..ca4f98c0b3 100644
--- a/drivers/led/led-uclass.c
+++ b/drivers/led/led-uclass.c
@@ -22,7 +22,7 @@ int led_get_by_label(const char *label, struct udevice **devp)
 	if (ret)
 		return ret;
 	uclass_foreach_dev(dev, uc) {
-		struct led_uclass_plat *uc_plat = dev_get_uclass_platdata(dev);
+		struct led_uc_plat *uc_plat = dev_get_uclass_platdata(dev);
 
 		/* Ignore the top-level LED node */
 		if (uc_plat->label && !strcmp(label, uc_plat->label))
@@ -45,5 +45,5 @@ int led_set_on(struct udevice *dev, int on)
 UCLASS_DRIVER(led) = {
 	.id		= UCLASS_LED,
 	.name		= "led",
-	.per_device_platdata_auto_alloc_size = sizeof(struct led_uclass_plat),
+	.per_device_platdata_auto_alloc_size = sizeof(struct led_uc_plat),
 };
diff --git a/drivers/led/led_gpio.c b/drivers/led/led_gpio.c
index 5b119903f5..97b5da35cd 100644
--- a/drivers/led/led_gpio.c
+++ b/drivers/led/led_gpio.c
@@ -30,7 +30,7 @@ static int gpio_led_set_on(struct udevice *dev, int on)
 
 static int led_gpio_probe(struct udevice *dev)
 {
-	struct led_uclass_plat *uc_plat = dev_get_uclass_platdata(dev);
+	struct led_uc_plat *uc_plat = dev_get_uclass_platdata(dev);
 	struct led_gpio_priv *priv = dev_get_priv(dev);
 
 	/* Ignore the top-level LED node */
@@ -65,7 +65,7 @@ static int led_gpio_bind(struct udevice *parent)
 	for (node = fdt_first_subnode(blob, dev_of_offset(parent));
 	     node > 0;
 	     node = fdt_next_subnode(blob, node)) {
-		struct led_uclass_plat *uc_plat;
+		struct led_uc_plat *uc_plat;
 		const char *label;
 
 		label = fdt_getprop(blob, node, "label", NULL);
diff --git a/include/led.h b/include/led.h
index b929d0ca3c..a856b3d9ff 100644
--- a/include/led.h
+++ b/include/led.h
@@ -9,11 +9,11 @@
 #define __LED_H
 
 /**
- * struct led_uclass_plat - Platform data the uclass stores about each device
+ * struct led_uc_plat - Platform data the uclass stores about each device
  *
  * @label:	LED label
  */
-struct led_uclass_plat {
+struct led_uc_plat {
 	const char *label;
 };
 
-- 
2.12.2.715.g7642488e1d-goog

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [U-Boot] [PATCH v2 4/9] dm: led: Adjust the LED uclass
  2017-04-10 17:34 [U-Boot] [PATCH v2 0/9] dm: led: Expand the LED interface and add a command Simon Glass
                   ` (2 preceding siblings ...)
  2017-04-10 17:34 ` [U-Boot] [PATCH v2 3/9] dm: led: Rename struct led_uclass_plat Simon Glass
@ 2017-04-10 17:34 ` Simon Glass
  2017-04-12  8:52   ` Ziping Chen
  2017-04-10 17:34 ` [U-Boot] [PATCH v2 5/9] dm: led: Add support for getting the state of an LED Simon Glass
                   ` (5 subsequent siblings)
  9 siblings, 1 reply; 29+ messages in thread
From: Simon Glass @ 2017-04-10 17:34 UTC (permalink / raw)
  To: u-boot

At present this is very simple, supporting only on and off. We want to
also support toggling and blinking. As a first step, change the name of
the main method and use an enum to indicate the state.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 drivers/led/led-uclass.c |  6 +++---
 drivers/led/led_gpio.c   |  6 +++---
 include/led.h            | 19 +++++++++++++------
 test/dm/led.c            |  5 +++--
 4 files changed, 22 insertions(+), 14 deletions(-)

diff --git a/drivers/led/led-uclass.c b/drivers/led/led-uclass.c
index ca4f98c0b3..b30346913b 100644
--- a/drivers/led/led-uclass.c
+++ b/drivers/led/led-uclass.c
@@ -32,14 +32,14 @@ int led_get_by_label(const char *label, struct udevice **devp)
 	return -ENODEV;
 }
 
-int led_set_on(struct udevice *dev, int on)
+int led_set_state(struct udevice *dev, enum led_state_t state)
 {
 	struct led_ops *ops = led_get_ops(dev);
 
-	if (!ops->set_on)
+	if (!ops->set_state)
 		return -ENOSYS;
 
-	return ops->set_on(dev, on);
+	return ops->set_state(dev, state);
 }
 
 UCLASS_DRIVER(led) = {
diff --git a/drivers/led/led_gpio.c b/drivers/led/led_gpio.c
index 97b5da35cd..af8133d3c7 100644
--- a/drivers/led/led_gpio.c
+++ b/drivers/led/led_gpio.c
@@ -18,14 +18,14 @@ struct led_gpio_priv {
 	struct gpio_desc gpio;
 };
 
-static int gpio_led_set_on(struct udevice *dev, int on)
+static int gpio_led_set_state(struct udevice *dev, enum led_state_t state)
 {
 	struct led_gpio_priv *priv = dev_get_priv(dev);
 
 	if (!dm_gpio_is_valid(&priv->gpio))
 		return -EREMOTEIO;
 
-	return dm_gpio_set_value(&priv->gpio, on);
+	return dm_gpio_set_value(&priv->gpio, state);
 }
 
 static int led_gpio_probe(struct udevice *dev)
@@ -87,7 +87,7 @@ static int led_gpio_bind(struct udevice *parent)
 }
 
 static const struct led_ops gpio_led_ops = {
-	.set_on		= gpio_led_set_on,
+	.set_state	= gpio_led_set_state,
 };
 
 static const struct udevice_id led_gpio_ids[] = {
diff --git a/include/led.h b/include/led.h
index a856b3d9ff..8af87ea8ea 100644
--- a/include/led.h
+++ b/include/led.h
@@ -17,15 +17,22 @@ struct led_uc_plat {
 	const char *label;
 };
 
+enum led_state_t {
+	LEDST_OFF = 0,
+	LEDST_ON = 1,
+
+	LEDST_COUNT,
+};
+
 struct led_ops {
 	/**
-	 * set_on() - set the state of an LED
+	 * set_state() - set the state of an LED
 	 *
 	 * @dev:	LED device to change
-	 * @on:		1 to turn the LED on, 0 to turn it off
+	 * @state:	LED state to set
 	 * @return 0 if OK, -ve on error
 	 */
-	int (*set_on)(struct udevice *dev, int on);
+	int (*set_state)(struct udevice *dev, enum led_state_t state);
 };
 
 #define led_get_ops(dev)	((struct led_ops *)(dev)->driver->ops)
@@ -40,12 +47,12 @@ struct led_ops {
 int led_get_by_label(const char *label, struct udevice **devp);
 
 /**
- * led_set_on() - set the state of an LED
+ * led_set_state() - set the state of an LED
  *
  * @dev:	LED device to change
- * @on:		1 to turn the LED on, 0 to turn it off
+ * @state:	LED state to set
  * @return 0 if OK, -ve on error
  */
-int led_set_on(struct udevice *dev, int on);
+int led_set_state(struct udevice *dev, enum led_state_t state);
 
 #endif
diff --git a/test/dm/led.c b/test/dm/led.c
index 8ee075cf1c..ebb9b46584 100644
--- a/test/dm/led.c
+++ b/test/dm/led.c
@@ -41,9 +41,10 @@ static int dm_test_led_gpio(struct unit_test_state *uts)
 	ut_assertok(uclass_get_device(UCLASS_LED, 1, &dev));
 	ut_assertok(uclass_get_device(UCLASS_GPIO, 1, &gpio));
 	ut_asserteq(0, sandbox_gpio_get_value(gpio, offset));
-	led_set_on(dev, 1);
+	ut_assertok(led_set_state(dev, LEDST_ON));
 	ut_asserteq(1, sandbox_gpio_get_value(gpio, offset));
-	led_set_on(dev, 0);
+
+	ut_assertok(led_set_state(dev, LEDST_OFF));
 	ut_asserteq(0, sandbox_gpio_get_value(gpio, offset));
 
 	return 0;
-- 
2.12.2.715.g7642488e1d-goog

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [U-Boot] [PATCH v2 5/9] dm: led: Add support for getting the state of an LED
  2017-04-10 17:34 [U-Boot] [PATCH v2 0/9] dm: led: Expand the LED interface and add a command Simon Glass
                   ` (3 preceding siblings ...)
  2017-04-10 17:34 ` [U-Boot] [PATCH v2 4/9] dm: led: Adjust the LED uclass Simon Glass
@ 2017-04-10 17:34 ` Simon Glass
  2017-04-12  8:52   ` Ziping Chen
  2017-04-10 17:34 ` [U-Boot] [PATCH v2 6/9] dm: led: Support toggling LEDs Simon Glass
                   ` (4 subsequent siblings)
  9 siblings, 1 reply; 29+ messages in thread
From: Simon Glass @ 2017-04-10 17:34 UTC (permalink / raw)
  To: u-boot

It is useful to be able to read the LED as well as write it. Add this to
the uclass and update the GPIO driver.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 drivers/led/led-uclass.c | 10 ++++++++++
 drivers/led/led_gpio.c   | 22 ++++++++++++++++++++++
 include/led.h            | 16 ++++++++++++++++
 test/dm/led.c            |  2 ++
 4 files changed, 50 insertions(+)

diff --git a/drivers/led/led-uclass.c b/drivers/led/led-uclass.c
index b30346913b..ea5fbabadf 100644
--- a/drivers/led/led-uclass.c
+++ b/drivers/led/led-uclass.c
@@ -42,6 +42,16 @@ int led_set_state(struct udevice *dev, enum led_state_t state)
 	return ops->set_state(dev, state);
 }
 
+enum led_state_t led_get_state(struct udevice *dev)
+{
+	struct led_ops *ops = led_get_ops(dev);
+
+	if (!ops->get_state)
+		return -ENOSYS;
+
+	return ops->get_state(dev);
+}
+
 UCLASS_DRIVER(led) = {
 	.id		= UCLASS_LED,
 	.name		= "led",
diff --git a/drivers/led/led_gpio.c b/drivers/led/led_gpio.c
index af8133d3c7..789d15600f 100644
--- a/drivers/led/led_gpio.c
+++ b/drivers/led/led_gpio.c
@@ -24,10 +24,31 @@ static int gpio_led_set_state(struct udevice *dev, enum led_state_t state)
 
 	if (!dm_gpio_is_valid(&priv->gpio))
 		return -EREMOTEIO;
+	switch (state) {
+	case LEDST_OFF:
+	case LEDST_ON:
+		break;
+	default:
+		return -ENOSYS;
+	}
 
 	return dm_gpio_set_value(&priv->gpio, state);
 }
 
+static enum led_state_t gpio_led_get_state(struct udevice *dev)
+{
+	struct led_gpio_priv *priv = dev_get_priv(dev);
+	int ret;
+
+	if (!dm_gpio_is_valid(&priv->gpio))
+		return -EREMOTEIO;
+	ret = dm_gpio_get_value(&priv->gpio);
+	if (ret < 0)
+		return ret;
+
+	return ret ? LEDST_ON : LEDST_OFF;
+}
+
 static int led_gpio_probe(struct udevice *dev)
 {
 	struct led_uc_plat *uc_plat = dev_get_uclass_platdata(dev);
@@ -88,6 +109,7 @@ static int led_gpio_bind(struct udevice *parent)
 
 static const struct led_ops gpio_led_ops = {
 	.set_state	= gpio_led_set_state,
+	.get_state	= gpio_led_get_state,
 };
 
 static const struct udevice_id led_gpio_ids[] = {
diff --git a/include/led.h b/include/led.h
index 8af87ea8ea..bbab4d14c9 100644
--- a/include/led.h
+++ b/include/led.h
@@ -33,6 +33,14 @@ struct led_ops {
 	 * @return 0 if OK, -ve on error
 	 */
 	int (*set_state)(struct udevice *dev, enum led_state_t state);
+
+	/**
+	 * led_get_state() - get the state of an LED
+	 *
+	 * @dev:	LED device to change
+	 * @return LED state led_state_t, or -ve on error
+	 */
+	enum led_state_t (*get_state)(struct udevice *dev);
 };
 
 #define led_get_ops(dev)	((struct led_ops *)(dev)->driver->ops)
@@ -55,4 +63,12 @@ int led_get_by_label(const char *label, struct udevice **devp);
  */
 int led_set_state(struct udevice *dev, enum led_state_t state);
 
+/**
+ * led_get_state() - get the state of an LED
+ *
+ * @dev:	LED device to change
+ * @return LED state led_state_t, or -ve on error
+ */
+enum led_state_t led_get_state(struct udevice *dev);
+
 #endif
diff --git a/test/dm/led.c b/test/dm/led.c
index ebb9b46584..68aa39bd4d 100644
--- a/test/dm/led.c
+++ b/test/dm/led.c
@@ -43,9 +43,11 @@ static int dm_test_led_gpio(struct unit_test_state *uts)
 	ut_asserteq(0, sandbox_gpio_get_value(gpio, offset));
 	ut_assertok(led_set_state(dev, LEDST_ON));
 	ut_asserteq(1, sandbox_gpio_get_value(gpio, offset));
+	ut_asserteq(LEDST_ON, led_get_state(dev));
 
 	ut_assertok(led_set_state(dev, LEDST_OFF));
 	ut_asserteq(0, sandbox_gpio_get_value(gpio, offset));
+	ut_asserteq(LEDST_OFF, led_get_state(dev));
 
 	return 0;
 }
-- 
2.12.2.715.g7642488e1d-goog

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [U-Boot] [PATCH v2 6/9] dm: led: Support toggling LEDs
  2017-04-10 17:34 [U-Boot] [PATCH v2 0/9] dm: led: Expand the LED interface and add a command Simon Glass
                   ` (4 preceding siblings ...)
  2017-04-10 17:34 ` [U-Boot] [PATCH v2 5/9] dm: led: Add support for getting the state of an LED Simon Glass
@ 2017-04-10 17:34 ` Simon Glass
  2017-04-12  8:52   ` Ziping Chen
  2017-04-10 17:34 ` [U-Boot] [PATCH v2 7/9] dm: led: Add support for blinking LEDs Simon Glass
                   ` (3 subsequent siblings)
  9 siblings, 1 reply; 29+ messages in thread
From: Simon Glass @ 2017-04-10 17:34 UTC (permalink / raw)
  To: u-boot

Add support for toggling an LED into the uclass interface. This can be
efficiently implemented by the driver.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2:
- Drop the explicit assignment to LEDST_TOGGLE

 drivers/led/led_gpio.c |  7 +++++++
 include/led.h          |  1 +
 test/dm/led.c          | 25 +++++++++++++++++++++++++
 3 files changed, 33 insertions(+)

diff --git a/drivers/led/led_gpio.c b/drivers/led/led_gpio.c
index 789d15600f..4106ecb679 100644
--- a/drivers/led/led_gpio.c
+++ b/drivers/led/led_gpio.c
@@ -21,6 +21,7 @@ struct led_gpio_priv {
 static int gpio_led_set_state(struct udevice *dev, enum led_state_t state)
 {
 	struct led_gpio_priv *priv = dev_get_priv(dev);
+	int ret;
 
 	if (!dm_gpio_is_valid(&priv->gpio))
 		return -EREMOTEIO;
@@ -28,6 +29,12 @@ static int gpio_led_set_state(struct udevice *dev, enum led_state_t state)
 	case LEDST_OFF:
 	case LEDST_ON:
 		break;
+	case LEDST_TOGGLE:
+		ret = dm_gpio_get_value(&priv->gpio);
+		if (ret < 0)
+			return ret;
+		state = !ret;
+		break;
 	default:
 		return -ENOSYS;
 	}
diff --git a/include/led.h b/include/led.h
index bbab4d14c9..8c107e28e7 100644
--- a/include/led.h
+++ b/include/led.h
@@ -20,6 +20,7 @@ struct led_uc_plat {
 enum led_state_t {
 	LEDST_OFF = 0,
 	LEDST_ON = 1,
+	LEDST_TOGGLE,
 
 	LEDST_COUNT,
 };
diff --git a/test/dm/led.c b/test/dm/led.c
index 68aa39bd4d..2cc24127e2 100644
--- a/test/dm/led.c
+++ b/test/dm/led.c
@@ -53,6 +53,31 @@ static int dm_test_led_gpio(struct unit_test_state *uts)
 }
 DM_TEST(dm_test_led_gpio, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
 
+/* Test that we can toggle LEDs */
+static int dm_test_led_toggle(struct unit_test_state *uts)
+{
+	const int offset = 1;
+	struct udevice *dev, *gpio;
+
+	/*
+	 * Check that we can manipulate an LED. LED 1 is connected to GPIO
+	 * bank gpio_a, offset 1.
+	 */
+	ut_assertok(uclass_get_device(UCLASS_LED, 1, &dev));
+	ut_assertok(uclass_get_device(UCLASS_GPIO, 1, &gpio));
+	ut_asserteq(0, sandbox_gpio_get_value(gpio, offset));
+	ut_assertok(led_set_state(dev, LEDST_TOGGLE));
+	ut_asserteq(1, sandbox_gpio_get_value(gpio, offset));
+	ut_asserteq(LEDST_ON, led_get_state(dev));
+
+	ut_assertok(led_set_state(dev, LEDST_TOGGLE));
+	ut_asserteq(0, sandbox_gpio_get_value(gpio, offset));
+	ut_asserteq(LEDST_OFF, led_get_state(dev));
+
+	return 0;
+}
+DM_TEST(dm_test_led_toggle, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
+
 /* Test obtaining an LED by label */
 static int dm_test_led_label(struct unit_test_state *uts)
 {
-- 
2.12.2.715.g7642488e1d-goog

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [U-Boot] [PATCH v2 7/9] dm: led: Add support for blinking LEDs
  2017-04-10 17:34 [U-Boot] [PATCH v2 0/9] dm: led: Expand the LED interface and add a command Simon Glass
                   ` (5 preceding siblings ...)
  2017-04-10 17:34 ` [U-Boot] [PATCH v2 6/9] dm: led: Support toggling LEDs Simon Glass
@ 2017-04-10 17:34 ` Simon Glass
  2017-04-12  8:52   ` Ziping Chen
  2017-04-10 17:34 ` [U-Boot] [PATCH v2 8/9] led: Mark existing driver as legacy Simon Glass
                   ` (2 subsequent siblings)
  9 siblings, 1 reply; 29+ messages in thread
From: Simon Glass @ 2017-04-10 17:34 UTC (permalink / raw)
  To: u-boot

Allow LEDs to be blinked if the driver supports it. Enable this for
sandbox so that the tests run.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2:
- Control this feature via a new CONFIG_LED_BLINK option

 configs/sandbox_defconfig       |  1 +
 configs/sandbox_noblk_defconfig |  1 +
 configs/sandbox_spl_defconfig   |  1 +
 drivers/led/Kconfig             |  9 +++++++++
 drivers/led/led-uclass.c        | 12 ++++++++++++
 include/led.h                   | 35 +++++++++++++++++++++++++++++++++++
 test/dm/led.c                   | 24 ++++++++++++++++++++++++
 7 files changed, 83 insertions(+)

diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig
index 7f3f5ac809..9814ea3b81 100644
--- a/configs/sandbox_defconfig
+++ b/configs/sandbox_defconfig
@@ -83,6 +83,7 @@ CONFIG_I2C_ARB_GPIO_CHALLENGE=y
 CONFIG_CROS_EC_KEYB=y
 CONFIG_I8042_KEYB=y
 CONFIG_LED=y
+CONFIG_LED_BLINK=y
 CONFIG_LED_GPIO=y
 CONFIG_DM_MAILBOX=y
 CONFIG_SANDBOX_MBOX=y
diff --git a/configs/sandbox_noblk_defconfig b/configs/sandbox_noblk_defconfig
index 3f8e70d523..bba744332c 100644
--- a/configs/sandbox_noblk_defconfig
+++ b/configs/sandbox_noblk_defconfig
@@ -92,6 +92,7 @@ CONFIG_I2C_ARB_GPIO_CHALLENGE=y
 CONFIG_CROS_EC_KEYB=y
 CONFIG_I8042_KEYB=y
 CONFIG_LED=y
+CONFIG_LED_BLINK=y
 CONFIG_LED_GPIO=y
 CONFIG_CROS_EC=y
 CONFIG_CROS_EC_I2C=y
diff --git a/configs/sandbox_spl_defconfig b/configs/sandbox_spl_defconfig
index ade67143b1..6fe21254fd 100644
--- a/configs/sandbox_spl_defconfig
+++ b/configs/sandbox_spl_defconfig
@@ -94,6 +94,7 @@ CONFIG_I2C_ARB_GPIO_CHALLENGE=y
 CONFIG_CROS_EC_KEYB=y
 CONFIG_I8042_KEYB=y
 CONFIG_LED=y
+CONFIG_LED_BLINK=y
 CONFIG_LED_GPIO=y
 CONFIG_DM_MAILBOX=y
 CONFIG_SANDBOX_MBOX=y
diff --git a/drivers/led/Kconfig b/drivers/led/Kconfig
index 0ef45bc06a..309372ab56 100644
--- a/drivers/led/Kconfig
+++ b/drivers/led/Kconfig
@@ -9,6 +9,15 @@ config LED
 	  can provide access to board-specific LEDs. Use of the device tree
 	  for configuration is encouraged.
 
+config LED_BLINK
+	bool "Support LED blinking"
+	depends on LED
+	help
+	  Some drivers can support automatic blinking of LEDs with a given
+	  period, without needing timers or extra code to handle the timing.
+	  This option enables support for this which adds slightly to the
+	  code size.
+
 config SPL_LED
 	bool "Enable LED support in SPL"
 	depends on SPL && SPL_DM
diff --git a/drivers/led/led-uclass.c b/drivers/led/led-uclass.c
index ea5fbabadf..78ab76050d 100644
--- a/drivers/led/led-uclass.c
+++ b/drivers/led/led-uclass.c
@@ -52,6 +52,18 @@ enum led_state_t led_get_state(struct udevice *dev)
 	return ops->get_state(dev);
 }
 
+#ifdef CONFIG_LED_BLINK
+int led_set_period(struct udevice *dev, int period_ms)
+{
+	struct led_ops *ops = led_get_ops(dev);
+
+	if (!ops->set_period)
+		return -ENOSYS;
+
+	return ops->set_period(dev, period_ms);
+}
+#endif
+
 UCLASS_DRIVER(led) = {
 	.id		= UCLASS_LED,
 	.name		= "led",
diff --git a/include/led.h b/include/led.h
index 8c107e28e7..c67af22591 100644
--- a/include/led.h
+++ b/include/led.h
@@ -17,10 +17,22 @@ struct led_uc_plat {
 	const char *label;
 };
 
+/**
+ * struct led_uc_priv - Private data the uclass stores about each device
+ *
+ * @period_ms:	Flash period in milliseconds
+ */
+struct led_uc_priv {
+	int period_ms;
+};
+
 enum led_state_t {
 	LEDST_OFF = 0,
 	LEDST_ON = 1,
 	LEDST_TOGGLE,
+#ifdef CONFIG_LED_BLINK
+	LEDST_BLINK,
+#endif
 
 	LEDST_COUNT,
 };
@@ -42,6 +54,20 @@ struct led_ops {
 	 * @return LED state led_state_t, or -ve on error
 	 */
 	enum led_state_t (*get_state)(struct udevice *dev);
+
+#ifdef CONFIG_LED_BLINK
+	/**
+	 * led_set_period() - set the blink period of an LED
+	 *
+	 * Thie records the period if supported, or returns -ENOSYS if not.
+	 * To start the LED blinking, use set_state().
+	 *
+	 * @dev:	LED device to change
+	 * @period_ms:	LED blink period in milliseconds
+	 * @return 0 if OK, -ve on error
+	 */
+	int (*set_period)(struct udevice *dev, int period_ms);
+#endif
 };
 
 #define led_get_ops(dev)	((struct led_ops *)(dev)->driver->ops)
@@ -72,4 +98,13 @@ int led_set_state(struct udevice *dev, enum led_state_t state);
  */
 enum led_state_t led_get_state(struct udevice *dev);
 
+/**
+ * led_set_period() - set the blink period of an LED
+ *
+ * @dev:	LED device to change
+ * @period_ms:	LED blink period in milliseconds
+ * @return 0 if OK, -ve on error
+ */
+int led_set_period(struct udevice *dev, int period_ms);
+
 #endif
diff --git a/test/dm/led.c b/test/dm/led.c
index 2cc24127e2..fde700be38 100644
--- a/test/dm/led.c
+++ b/test/dm/led.c
@@ -98,3 +98,27 @@ static int dm_test_led_label(struct unit_test_state *uts)
 	return 0;
 }
 DM_TEST(dm_test_led_label, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
+
+/* Test LED blinking */
+#ifdef CONFIG_LED_BLINK
+static int dm_test_led_blink(struct unit_test_state *uts)
+{
+	const int offset = 1;
+	struct udevice *dev, *gpio;
+
+	/*
+	 * Check that we get an error when trying to blink an LED, since it is
+	 * not supported by the GPIO LED driver.
+	 */
+	ut_assertok(uclass_get_device(UCLASS_LED, 1, &dev));
+	ut_assertok(uclass_get_device(UCLASS_GPIO, 1, &gpio));
+	ut_asserteq(0, sandbox_gpio_get_value(gpio, offset));
+	ut_asserteq(-ENOSYS, led_set_state(dev, LEDST_BLINK));
+	ut_asserteq(0, sandbox_gpio_get_value(gpio, offset));
+	ut_asserteq(LEDST_OFF, led_get_state(dev));
+	ut_asserteq(-ENOSYS, led_set_period(dev, 100));
+
+	return 0;
+}
+DM_TEST(dm_test_led_blink, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
+#endif
-- 
2.12.2.715.g7642488e1d-goog

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [U-Boot] [PATCH v2 8/9] led: Mark existing driver as legacy
  2017-04-10 17:34 [U-Boot] [PATCH v2 0/9] dm: led: Expand the LED interface and add a command Simon Glass
                   ` (6 preceding siblings ...)
  2017-04-10 17:34 ` [U-Boot] [PATCH v2 7/9] dm: led: Add support for blinking LEDs Simon Glass
@ 2017-04-10 17:34 ` Simon Glass
  2017-04-12  8:53   ` Ziping Chen
  2017-04-10 17:34 ` [U-Boot] [PATCH v2 9/9] dm: led: Add a new 'led' command Simon Glass
  2017-04-12  8:51 ` [U-Boot] [PATCH v2 0/9] dm: led: Expand the LED interface and add a command Ziping Chen
  9 siblings, 1 reply; 29+ messages in thread
From: Simon Glass @ 2017-04-10 17:34 UTC (permalink / raw)
  To: u-boot

The existing 'led' command does not support driver model. Rename it to
indicate that it is legacy code.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 cmd/Makefile     | 2 +-
 cmd/legacy_led.c | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/cmd/Makefile b/cmd/Makefile
index ef1406b3f8..19d450e0fb 100644
--- a/cmd/Makefile
+++ b/cmd/Makefile
@@ -78,7 +78,7 @@ obj-$(CONFIG_CMD_ITEST) += itest.o
 obj-$(CONFIG_CMD_JFFS2) += jffs2.o
 obj-$(CONFIG_CMD_CRAMFS) += cramfs.o
 obj-$(CONFIG_CMD_LDRINFO) += ldrinfo.o
-obj-$(CONFIG_LED_STATUS_CMD) += led.o
+obj-$(CONFIG_LED_STATUS_CMD) += legacy_led.o
 obj-$(CONFIG_CMD_LICENSE) += license.o
 obj-y += load.o
 obj-$(CONFIG_LOGBUFFER) += log.o
diff --git a/cmd/legacy_led.c b/cmd/legacy_led.c
index 951a5e242f..1ec2e43e50 100644
--- a/cmd/legacy_led.c
+++ b/cmd/legacy_led.c
@@ -86,7 +86,7 @@ void __weak __led_blink(led_id_t mask, int freq)
 {
 }
 
-int do_led (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+int do_legacy_led(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
 	int i, match = 0;
 	enum led_cmd cmd;
@@ -148,7 +148,7 @@ int do_led (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 }
 
 U_BOOT_CMD(
-	led, 4, 1, do_led,
+	led, 4, 1, do_legacy_led,
 	"["
 #ifdef CONFIG_LED_STATUS_BOARD_SPECIFIC
 #ifdef CONFIG_LED_STATUS0
-- 
2.12.2.715.g7642488e1d-goog

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [U-Boot] [PATCH v2 9/9] dm: led: Add a new 'led' command
  2017-04-10 17:34 [U-Boot] [PATCH v2 0/9] dm: led: Expand the LED interface and add a command Simon Glass
                   ` (7 preceding siblings ...)
  2017-04-10 17:34 ` [U-Boot] [PATCH v2 8/9] led: Mark existing driver as legacy Simon Glass
@ 2017-04-10 17:34 ` Simon Glass
  2017-04-12  8:53   ` Ziping Chen
  2017-04-12  8:51 ` [U-Boot] [PATCH v2 0/9] dm: led: Expand the LED interface and add a command Ziping Chen
  9 siblings, 1 reply; 29+ messages in thread
From: Simon Glass @ 2017-04-10 17:34 UTC (permalink / raw)
  To: u-boot

When driver model is used for LEDs, provide a command to allow LED access.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 cmd/Kconfig  |   9 ++++
 cmd/Makefile |   1 +
 cmd/led.c    | 145 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 155 insertions(+)
 create mode 100644 cmd/led.c

diff --git a/cmd/Kconfig b/cmd/Kconfig
index 661ae7a98c..13dc46a174 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -667,6 +667,15 @@ config CMD_CACHE
 	help
 	  Enable the "icache" and "dcache" commands
 
+config CMD_LED
+	bool "led"
+	default y if LED
+	help
+	  Enable the 'led' command which allows for control of LEDs supported
+	  by the board. The LEDs can be listed with 'led list' and controlled
+	  with led on/off/togle/blink. Any LED drivers can be controlled with
+	  this command, e.g. led_gpio.
+
 config CMD_TIME
 	bool "time"
 	help
diff --git a/cmd/Makefile b/cmd/Makefile
index 19d450e0fb..3cb0cfde7b 100644
--- a/cmd/Makefile
+++ b/cmd/Makefile
@@ -79,6 +79,7 @@ obj-$(CONFIG_CMD_JFFS2) += jffs2.o
 obj-$(CONFIG_CMD_CRAMFS) += cramfs.o
 obj-$(CONFIG_CMD_LDRINFO) += ldrinfo.o
 obj-$(CONFIG_LED_STATUS_CMD) += legacy_led.o
+obj-$(CONFIG_CMD_LED) += led.o
 obj-$(CONFIG_CMD_LICENSE) += license.o
 obj-y += load.o
 obj-$(CONFIG_LOGBUFFER) += log.o
diff --git a/cmd/led.c b/cmd/led.c
new file mode 100644
index 0000000000..84173f86f2
--- /dev/null
+++ b/cmd/led.c
@@ -0,0 +1,145 @@
+/*
+ * Copyright (c) 2017 Google, Inc
+ * Written by Simon Glass <sjg@chromium.org>
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#include <common.h>
+#include <command.h>
+#include <dm.h>
+#include <led.h>
+#include <dm/uclass-internal.h>
+
+#define LED_TOGGLE LEDST_COUNT
+
+static const char *const state_label[] = {
+	[LEDST_OFF]	= "off",
+	[LEDST_ON]	= "on",
+	[LEDST_TOGGLE]	= "toggle",
+#ifdef CONFIG_LED_BLINK
+	[LEDST_BLINK]	= "blink",
+#endif
+};
+
+enum led_state_t get_led_cmd(char *var)
+{
+	int i;
+
+	for (i = 0; i < LEDST_COUNT; i++) {
+		if (!strncmp(var, state_label[i], strlen(var)))
+			return i;
+	}
+
+	return -1;
+}
+
+static int show_led_state(struct udevice *dev)
+{
+	int ret;
+
+	ret = led_get_state(dev);
+	if (ret >= LEDST_COUNT)
+		ret = -EINVAL;
+	if (ret >= 0)
+		printf("%s\n", state_label[ret]);
+
+	return ret;
+}
+
+static int list_leds(void)
+{
+	struct udevice *dev;
+	int ret;
+
+	for (uclass_find_first_device(UCLASS_LED, &dev);
+	     dev;
+	     uclass_find_next_device(&dev)) {
+		struct led_uc_plat *plat = dev_get_uclass_platdata(dev);
+
+		if (!plat->label)
+			continue;
+		printf("%-15s ", plat->label);
+		if (device_active(dev)) {
+			ret = show_led_state(dev);
+			if (ret < 0)
+				printf("Error %d\n", ret);
+		} else {
+			printf("<inactive>\n");
+		}
+	}
+
+	return 0;
+}
+
+int do_led(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+	enum led_state_t cmd;
+	const char *led_label;
+	struct udevice *dev;
+#ifdef CONFIG_LED_BLINK
+	int freq_ms = 0;
+#endif
+	int ret;
+
+	/* Validate arguments */
+	if (argc < 2)
+		return CMD_RET_USAGE;
+	led_label = argv[1];
+	if (*led_label == 'l')
+		return list_leds();
+
+	cmd = argc > 2 ? get_led_cmd(argv[2]) : LEDST_COUNT;
+	if (cmd < 0)
+		return CMD_RET_USAGE;
+#ifdef CONFIG_LED_BLINK
+	if (cmd == LEDST_BLINK) {
+		if (argc < 4)
+			return CMD_RET_USAGE;
+		freq_ms = simple_strtoul(argv[3], NULL, 10);
+	}
+#endif
+	ret = led_get_by_label(led_label, &dev);
+	if (ret) {
+		printf("LED '%s' not found (err=%d)\n", led_label, ret);
+		return CMD_RET_FAILURE;
+	}
+	switch (cmd) {
+	case LEDST_OFF:
+	case LEDST_ON:
+	case LEDST_TOGGLE:
+		ret = led_set_state(dev, cmd);
+		break;
+#ifdef CONFIG_LED_BLINK
+	case LEDST_BLINK:
+		ret = led_set_period(dev, freq_ms);
+		if (!ret)
+			ret = led_set_state(dev, LEDST_BLINK);
+		break;
+#endif
+	case LEDST_COUNT:
+		printf("LED '%s': ", led_label);
+		ret = show_led_state(dev);
+		break;
+	}
+	if (ret < 0) {
+		printf("LED '%s' operation failed (err=%d)\n", led_label, ret);
+		return CMD_RET_FAILURE;
+	}
+
+	return 0;
+}
+
+#ifdef CONFIG_LED_BLINK
+#define BLINK "|blink [blink-freq in ms]"
+#else
+#define BLINK ""
+#endif
+
+U_BOOT_CMD(
+	led, 4, 1, do_led,
+	"manage LEDs",
+	"<led_label> on|off|toggle" BLINK "\tChange LED state\n"
+	"led [<led_label>\tGet LED state\n"
+	"led list\t\tshow a list of LEDs"
+);
-- 
2.12.2.715.g7642488e1d-goog

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [U-Boot] [PATCH v2 0/9] dm: led: Expand the LED interface and add a command
  2017-04-10 17:34 [U-Boot] [PATCH v2 0/9] dm: led: Expand the LED interface and add a command Simon Glass
                   ` (8 preceding siblings ...)
  2017-04-10 17:34 ` [U-Boot] [PATCH v2 9/9] dm: led: Add a new 'led' command Simon Glass
@ 2017-04-12  8:51 ` Ziping Chen
  9 siblings, 0 replies; 29+ messages in thread
From: Ziping Chen @ 2017-04-12  8:51 UTC (permalink / raw)
  To: u-boot

2017-04-11 1:34 GMT+08:00 Simon Glass <sjg@chromium.org>:

> The LED interface for driver model is a little primitive. This series
> expands it to match the legacy interface and adds a command to match.
>
> Changes in v2:
> - Add new patch with blank line in the Kconfig file
> - Drop the explicit assignment to LEDST_TOGGLE
> - Control this feature via a new CONFIG_LED_BLINK option
>
> Simon Glass (9):
>   sandbox: Add some test LEDs
>   dm: led: Add a missing blank line in the Kconfig file
>   dm: led: Rename struct led_uclass_plat
>   dm: led: Adjust the LED uclass
>   dm: led: Add support for getting the state of an LED
>   dm: led: Support toggling LEDs
>   dm: led: Add support for blinking LEDs
>   led: Mark existing driver as legacy
>   dm: led: Add a new 'led' command
>
>  arch/sandbox/dts/sandbox.dts    |  14 +++
>  cmd/Kconfig                     |   9 ++
>  cmd/Makefile                    |   3 +-
>  cmd/led.c                       | 262 +++++++++++++++++-------------
> ----------
>  cmd/legacy_led.c                | 187 ++++++++++++++++++++++++++++
>  configs/sandbox_defconfig       |   1 +
>  configs/sandbox_noblk_defconfig |   1 +
>  configs/sandbox_spl_defconfig   |   1 +
>  drivers/led/Kconfig             |  10 ++
>  drivers/led/led-uclass.c        |  32 ++++-
>  drivers/led/led_gpio.c          |  39 +++++-
>  include/led.h                   |  75 ++++++++++--
>  test/dm/led.c                   |  56 ++++++++-
>  13 files changed, 517 insertions(+), 173 deletions(-)
>  create mode 100644 cmd/legacy_led.c
>
> --
> 2.12.2.715.g7642488e1d-goog
>
>
Reviewed-by: Ziping Chen <techping.chan@gmail.com>

^ permalink raw reply	[flat|nested] 29+ messages in thread

* [U-Boot] [PATCH v2 1/9] sandbox: Add some test LEDs
  2017-04-10 17:34 ` [U-Boot] [PATCH v2 1/9] sandbox: Add some test LEDs Simon Glass
@ 2017-04-12  8:51   ` Ziping Chen
  2017-04-15 16:07     ` Simon Glass
  0 siblings, 1 reply; 29+ messages in thread
From: Ziping Chen @ 2017-04-12  8:51 UTC (permalink / raw)
  To: u-boot

2017-04-11 1:34 GMT+08:00 Simon Glass <sjg@chromium.org>:

> Add some LEDs to the standard sandbox device tree.
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
>
> Changes in v2: None
>
>  arch/sandbox/dts/sandbox.dts | 14 ++++++++++++++
>  cmd/{led.c => legacy_led.c}  |  0
>  2 files changed, 14 insertions(+)
>  rename cmd/{led.c => legacy_led.c} (100%)
>
> diff --git a/arch/sandbox/dts/sandbox.dts b/arch/sandbox/dts/sandbox.dts
> index 20614646f7..40f423da25 100644
> --- a/arch/sandbox/dts/sandbox.dts
> +++ b/arch/sandbox/dts/sandbox.dts
> @@ -123,6 +123,20 @@
>                 yres = <768>;
>         };
>
> +       leds {
> +               compatible = "gpio-leds";
> +
> +               iracibble {
> +                       gpios = <&gpio_a 1 0>;
> +                       label = "sandbox:red";
> +               };
> +
> +               martinet {
> +                       gpios = <&gpio_a 2 0>;
> +                       label = "sandbox:green";
> +               };
> +       };
> +
>         pci: pci-controller {
>                 compatible = "sandbox,pci";
>                 device_type = "pci";
> diff --git a/cmd/led.c b/cmd/legacy_led.c
> similarity index 100%
> rename from cmd/led.c
> rename to cmd/legacy_led.c
> --
> 2.12.2.715.g7642488e1d-goog
>
>
Reviewed-by: Ziping Chen <techping.chan@gmail.com>

^ permalink raw reply	[flat|nested] 29+ messages in thread

* [U-Boot] [PATCH v2 2/9] dm: led: Add a missing blank line in the Kconfig file
  2017-04-10 17:34 ` [U-Boot] [PATCH v2 2/9] dm: led: Add a missing blank line in the Kconfig file Simon Glass
@ 2017-04-12  8:51   ` Ziping Chen
  2017-04-15 16:07     ` Simon Glass
  0 siblings, 1 reply; 29+ messages in thread
From: Ziping Chen @ 2017-04-12  8:51 UTC (permalink / raw)
  To: u-boot

2017-04-11 1:34 GMT+08:00 Simon Glass <sjg@chromium.org>:

> There should be a blank line between each option. Add one before LED_GPIO.
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
>
> Changes in v2:
> - Add new patch with blank line in the Kconfig file
>
>  drivers/led/Kconfig | 1 +
>  1 file changed, 1 insertion(+)
>
> diff --git a/drivers/led/Kconfig b/drivers/led/Kconfig
> index 609b1fa3fe..0ef45bc06a 100644
> --- a/drivers/led/Kconfig
> +++ b/drivers/led/Kconfig
> @@ -17,6 +17,7 @@ config SPL_LED
>           If this is acceptable and you have a need to use LEDs in SPL,
>           enable this option. You will need to enable device tree in SPL
>           for this to work.
> +
>  config LED_GPIO
>         bool "LED support for GPIO-connected LEDs"
>         depends on LED && DM_GPIO
> --
> 2.12.2.715.g7642488e1d-goog
>
>
Reviewed-by: Ziping Chen <techping.chan@gmail.com>

^ permalink raw reply	[flat|nested] 29+ messages in thread

* [U-Boot] [PATCH v2 3/9] dm: led: Rename struct led_uclass_plat
  2017-04-10 17:34 ` [U-Boot] [PATCH v2 3/9] dm: led: Rename struct led_uclass_plat Simon Glass
@ 2017-04-12  8:51   ` Ziping Chen
  2017-04-15 16:07     ` Simon Glass
  0 siblings, 1 reply; 29+ messages in thread
From: Ziping Chen @ 2017-04-12  8:51 UTC (permalink / raw)
  To: u-boot

2017-04-11 1:34 GMT+08:00 Simon Glass <sjg@chromium.org>:

> These structures are normally named with 'uc' instead of 'uclass'. Change
> this one for consistency.
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
>
> Changes in v2: None
>
>  drivers/led/led-uclass.c | 4 ++--
>  drivers/led/led_gpio.c   | 4 ++--
>  include/led.h            | 4 ++--
>  3 files changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/led/led-uclass.c b/drivers/led/led-uclass.c
> index 784ac870e2..ca4f98c0b3 100644
> --- a/drivers/led/led-uclass.c
> +++ b/drivers/led/led-uclass.c
> @@ -22,7 +22,7 @@ int led_get_by_label(const char *label, struct udevice
> **devp)
>         if (ret)
>                 return ret;
>         uclass_foreach_dev(dev, uc) {
> -               struct led_uclass_plat *uc_plat =
> dev_get_uclass_platdata(dev);
> +               struct led_uc_plat *uc_plat = dev_get_uclass_platdata(dev);
>
>                 /* Ignore the top-level LED node */
>                 if (uc_plat->label && !strcmp(label, uc_plat->label))
> @@ -45,5 +45,5 @@ int led_set_on(struct udevice *dev, int on)
>  UCLASS_DRIVER(led) = {
>         .id             = UCLASS_LED,
>         .name           = "led",
> -       .per_device_platdata_auto_alloc_size = sizeof(struct
> led_uclass_plat),
> +       .per_device_platdata_auto_alloc_size = sizeof(struct led_uc_plat),
>  };
> diff --git a/drivers/led/led_gpio.c b/drivers/led/led_gpio.c
> index 5b119903f5..97b5da35cd 100644
> --- a/drivers/led/led_gpio.c
> +++ b/drivers/led/led_gpio.c
> @@ -30,7 +30,7 @@ static int gpio_led_set_on(struct udevice *dev, int on)
>
>  static int led_gpio_probe(struct udevice *dev)
>  {
> -       struct led_uclass_plat *uc_plat = dev_get_uclass_platdata(dev);
> +       struct led_uc_plat *uc_plat = dev_get_uclass_platdata(dev);
>         struct led_gpio_priv *priv = dev_get_priv(dev);
>
>         /* Ignore the top-level LED node */
> @@ -65,7 +65,7 @@ static int led_gpio_bind(struct udevice *parent)
>         for (node = fdt_first_subnode(blob, dev_of_offset(parent));
>              node > 0;
>              node = fdt_next_subnode(blob, node)) {
> -               struct led_uclass_plat *uc_plat;
> +               struct led_uc_plat *uc_plat;
>                 const char *label;
>
>                 label = fdt_getprop(blob, node, "label", NULL);
> diff --git a/include/led.h b/include/led.h
> index b929d0ca3c..a856b3d9ff 100644
> --- a/include/led.h
> +++ b/include/led.h
> @@ -9,11 +9,11 @@
>  #define __LED_H
>
>  /**
> - * struct led_uclass_plat - Platform data the uclass stores about each
> device
> + * struct led_uc_plat - Platform data the uclass stores about each device
>   *
>   * @label:     LED label
>   */
> -struct led_uclass_plat {
> +struct led_uc_plat {
>         const char *label;
>  };
>
> --
> 2.12.2.715.g7642488e1d-goog
>
>
Reviewed-by: Ziping Chen <techping.chan@gmail.com>

^ permalink raw reply	[flat|nested] 29+ messages in thread

* [U-Boot] [PATCH v2 4/9] dm: led: Adjust the LED uclass
  2017-04-10 17:34 ` [U-Boot] [PATCH v2 4/9] dm: led: Adjust the LED uclass Simon Glass
@ 2017-04-12  8:52   ` Ziping Chen
  2017-04-15 16:07     ` Simon Glass
  0 siblings, 1 reply; 29+ messages in thread
From: Ziping Chen @ 2017-04-12  8:52 UTC (permalink / raw)
  To: u-boot

2017-04-11 1:34 GMT+08:00 Simon Glass <sjg@chromium.org>:

> At present this is very simple, supporting only on and off. We want to
> also support toggling and blinking. As a first step, change the name of
> the main method and use an enum to indicate the state.
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
>
> Changes in v2: None
>
>  drivers/led/led-uclass.c |  6 +++---
>  drivers/led/led_gpio.c   |  6 +++---
>  include/led.h            | 19 +++++++++++++------
>  test/dm/led.c            |  5 +++--
>  4 files changed, 22 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/led/led-uclass.c b/drivers/led/led-uclass.c
> index ca4f98c0b3..b30346913b 100644
> --- a/drivers/led/led-uclass.c
> +++ b/drivers/led/led-uclass.c
> @@ -32,14 +32,14 @@ int led_get_by_label(const char *label, struct udevice
> **devp)
>         return -ENODEV;
>  }
>
> -int led_set_on(struct udevice *dev, int on)
> +int led_set_state(struct udevice *dev, enum led_state_t state)
>  {
>         struct led_ops *ops = led_get_ops(dev);
>
> -       if (!ops->set_on)
> +       if (!ops->set_state)
>                 return -ENOSYS;
>
> -       return ops->set_on(dev, on);
> +       return ops->set_state(dev, state);
>  }
>
>  UCLASS_DRIVER(led) = {
> diff --git a/drivers/led/led_gpio.c b/drivers/led/led_gpio.c
> index 97b5da35cd..af8133d3c7 100644
> --- a/drivers/led/led_gpio.c
> +++ b/drivers/led/led_gpio.c
> @@ -18,14 +18,14 @@ struct led_gpio_priv {
>         struct gpio_desc gpio;
>  };
>
> -static int gpio_led_set_on(struct udevice *dev, int on)
> +static int gpio_led_set_state(struct udevice *dev, enum led_state_t state)
>  {
>         struct led_gpio_priv *priv = dev_get_priv(dev);
>
>         if (!dm_gpio_is_valid(&priv->gpio))
>                 return -EREMOTEIO;
>
> -       return dm_gpio_set_value(&priv->gpio, on);
> +       return dm_gpio_set_value(&priv->gpio, state);
>  }
>
>  static int led_gpio_probe(struct udevice *dev)
> @@ -87,7 +87,7 @@ static int led_gpio_bind(struct udevice *parent)
>  }
>
>  static const struct led_ops gpio_led_ops = {
> -       .set_on         = gpio_led_set_on,
> +       .set_state      = gpio_led_set_state,
>  };
>
>  static const struct udevice_id led_gpio_ids[] = {
> diff --git a/include/led.h b/include/led.h
> index a856b3d9ff..8af87ea8ea 100644
> --- a/include/led.h
> +++ b/include/led.h
> @@ -17,15 +17,22 @@ struct led_uc_plat {
>         const char *label;
>  };
>
> +enum led_state_t {
> +       LEDST_OFF = 0,
> +       LEDST_ON = 1,
> +
> +       LEDST_COUNT,
> +};
> +
>  struct led_ops {
>         /**
> -        * set_on() - set the state of an LED
> +        * set_state() - set the state of an LED
>          *
>          * @dev:        LED device to change
> -        * @on:         1 to turn the LED on, 0 to turn it off
> +        * @state:      LED state to set
>          * @return 0 if OK, -ve on error
>          */
> -       int (*set_on)(struct udevice *dev, int on);
> +       int (*set_state)(struct udevice *dev, enum led_state_t state);
>  };
>
>  #define led_get_ops(dev)       ((struct led_ops *)(dev)->driver->ops)
> @@ -40,12 +47,12 @@ struct led_ops {
>  int led_get_by_label(const char *label, struct udevice **devp);
>
>  /**
> - * led_set_on() - set the state of an LED
> + * led_set_state() - set the state of an LED
>   *
>   * @dev:       LED device to change
> - * @on:                1 to turn the LED on, 0 to turn it off
> + * @state:     LED state to set
>   * @return 0 if OK, -ve on error
>   */
> -int led_set_on(struct udevice *dev, int on);
> +int led_set_state(struct udevice *dev, enum led_state_t state);
>
>  #endif
> diff --git a/test/dm/led.c b/test/dm/led.c
> index 8ee075cf1c..ebb9b46584 100644
> --- a/test/dm/led.c
> +++ b/test/dm/led.c
> @@ -41,9 +41,10 @@ static int dm_test_led_gpio(struct unit_test_state *uts)
>         ut_assertok(uclass_get_device(UCLASS_LED, 1, &dev));
>         ut_assertok(uclass_get_device(UCLASS_GPIO, 1, &gpio));
>         ut_asserteq(0, sandbox_gpio_get_value(gpio, offset));
> -       led_set_on(dev, 1);
> +       ut_assertok(led_set_state(dev, LEDST_ON));
>         ut_asserteq(1, sandbox_gpio_get_value(gpio, offset));
> -       led_set_on(dev, 0);
> +
> +       ut_assertok(led_set_state(dev, LEDST_OFF));
>         ut_asserteq(0, sandbox_gpio_get_value(gpio, offset));
>
>         return 0;
> --
> 2.12.2.715.g7642488e1d-goog
>
>
Reviewed-by: Ziping Chen <techping.chan@gmail.com>

^ permalink raw reply	[flat|nested] 29+ messages in thread

* [U-Boot] [PATCH v2 5/9] dm: led: Add support for getting the state of an LED
  2017-04-10 17:34 ` [U-Boot] [PATCH v2 5/9] dm: led: Add support for getting the state of an LED Simon Glass
@ 2017-04-12  8:52   ` Ziping Chen
  2017-04-15 16:08     ` Simon Glass
  0 siblings, 1 reply; 29+ messages in thread
From: Ziping Chen @ 2017-04-12  8:52 UTC (permalink / raw)
  To: u-boot

2017-04-11 1:34 GMT+08:00 Simon Glass <sjg@chromium.org>:

> It is useful to be able to read the LED as well as write it. Add this to
> the uclass and update the GPIO driver.
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
>
> Changes in v2: None
>
>  drivers/led/led-uclass.c | 10 ++++++++++
>  drivers/led/led_gpio.c   | 22 ++++++++++++++++++++++
>  include/led.h            | 16 ++++++++++++++++
>  test/dm/led.c            |  2 ++
>  4 files changed, 50 insertions(+)
>
> diff --git a/drivers/led/led-uclass.c b/drivers/led/led-uclass.c
> index b30346913b..ea5fbabadf 100644
> --- a/drivers/led/led-uclass.c
> +++ b/drivers/led/led-uclass.c
> @@ -42,6 +42,16 @@ int led_set_state(struct udevice *dev, enum led_state_t
> state)
>         return ops->set_state(dev, state);
>  }
>
> +enum led_state_t led_get_state(struct udevice *dev)
> +{
> +       struct led_ops *ops = led_get_ops(dev);
> +
> +       if (!ops->get_state)
> +               return -ENOSYS;
> +
> +       return ops->get_state(dev);
> +}
> +
>  UCLASS_DRIVER(led) = {
>         .id             = UCLASS_LED,
>         .name           = "led",
> diff --git a/drivers/led/led_gpio.c b/drivers/led/led_gpio.c
> index af8133d3c7..789d15600f 100644
> --- a/drivers/led/led_gpio.c
> +++ b/drivers/led/led_gpio.c
> @@ -24,10 +24,31 @@ static int gpio_led_set_state(struct udevice *dev,
> enum led_state_t state)
>
>         if (!dm_gpio_is_valid(&priv->gpio))
>                 return -EREMOTEIO;
> +       switch (state) {
> +       case LEDST_OFF:
> +       case LEDST_ON:
> +               break;
> +       default:
> +               return -ENOSYS;
> +       }
>
>         return dm_gpio_set_value(&priv->gpio, state);
>  }
>
> +static enum led_state_t gpio_led_get_state(struct udevice *dev)
> +{
> +       struct led_gpio_priv *priv = dev_get_priv(dev);
> +       int ret;
> +
> +       if (!dm_gpio_is_valid(&priv->gpio))
> +               return -EREMOTEIO;
> +       ret = dm_gpio_get_value(&priv->gpio);
> +       if (ret < 0)
> +               return ret;
> +
> +       return ret ? LEDST_ON : LEDST_OFF;
> +}
> +
>  static int led_gpio_probe(struct udevice *dev)
>  {
>         struct led_uc_plat *uc_plat = dev_get_uclass_platdata(dev);
> @@ -88,6 +109,7 @@ static int led_gpio_bind(struct udevice *parent)
>
>  static const struct led_ops gpio_led_ops = {
>         .set_state      = gpio_led_set_state,
> +       .get_state      = gpio_led_get_state,
>  };
>
>  static const struct udevice_id led_gpio_ids[] = {
> diff --git a/include/led.h b/include/led.h
> index 8af87ea8ea..bbab4d14c9 100644
> --- a/include/led.h
> +++ b/include/led.h
> @@ -33,6 +33,14 @@ struct led_ops {
>          * @return 0 if OK, -ve on error
>          */
>         int (*set_state)(struct udevice *dev, enum led_state_t state);
> +
> +       /**
> +        * led_get_state() - get the state of an LED
> +        *
> +        * @dev:        LED device to change
> +        * @return LED state led_state_t, or -ve on error
> +        */
> +       enum led_state_t (*get_state)(struct udevice *dev);
>  };
>
>  #define led_get_ops(dev)       ((struct led_ops *)(dev)->driver->ops)
> @@ -55,4 +63,12 @@ int led_get_by_label(const char *label, struct udevice
> **devp);
>   */
>  int led_set_state(struct udevice *dev, enum led_state_t state);
>
> +/**
> + * led_get_state() - get the state of an LED
> + *
> + * @dev:       LED device to change
> + * @return LED state led_state_t, or -ve on error
> + */
> +enum led_state_t led_get_state(struct udevice *dev);
> +
>  #endif
> diff --git a/test/dm/led.c b/test/dm/led.c
> index ebb9b46584..68aa39bd4d 100644
> --- a/test/dm/led.c
> +++ b/test/dm/led.c
> @@ -43,9 +43,11 @@ static int dm_test_led_gpio(struct unit_test_state *uts)
>         ut_asserteq(0, sandbox_gpio_get_value(gpio, offset));
>         ut_assertok(led_set_state(dev, LEDST_ON));
>         ut_asserteq(1, sandbox_gpio_get_value(gpio, offset));
> +       ut_asserteq(LEDST_ON, led_get_state(dev));
>
>         ut_assertok(led_set_state(dev, LEDST_OFF));
>         ut_asserteq(0, sandbox_gpio_get_value(gpio, offset));
> +       ut_asserteq(LEDST_OFF, led_get_state(dev));
>
>         return 0;
>  }
> --
> 2.12.2.715.g7642488e1d-goog
>
>
Reviewed-by: Ziping Chen <techping.chan@gmail.com>

^ permalink raw reply	[flat|nested] 29+ messages in thread

* [U-Boot] [PATCH v2 6/9] dm: led: Support toggling LEDs
  2017-04-10 17:34 ` [U-Boot] [PATCH v2 6/9] dm: led: Support toggling LEDs Simon Glass
@ 2017-04-12  8:52   ` Ziping Chen
  2017-04-15 16:08     ` Simon Glass
  0 siblings, 1 reply; 29+ messages in thread
From: Ziping Chen @ 2017-04-12  8:52 UTC (permalink / raw)
  To: u-boot

2017-04-11 1:34 GMT+08:00 Simon Glass <sjg@chromium.org>:

> Add support for toggling an LED into the uclass interface. This can be
> efficiently implemented by the driver.
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
>
> Changes in v2:
> - Drop the explicit assignment to LEDST_TOGGLE
>
>  drivers/led/led_gpio.c |  7 +++++++
>  include/led.h          |  1 +
>  test/dm/led.c          | 25 +++++++++++++++++++++++++
>  3 files changed, 33 insertions(+)
>
> diff --git a/drivers/led/led_gpio.c b/drivers/led/led_gpio.c
> index 789d15600f..4106ecb679 100644
> --- a/drivers/led/led_gpio.c
> +++ b/drivers/led/led_gpio.c
> @@ -21,6 +21,7 @@ struct led_gpio_priv {
>  static int gpio_led_set_state(struct udevice *dev, enum led_state_t state)
>  {
>         struct led_gpio_priv *priv = dev_get_priv(dev);
> +       int ret;
>
>         if (!dm_gpio_is_valid(&priv->gpio))
>                 return -EREMOTEIO;
> @@ -28,6 +29,12 @@ static int gpio_led_set_state(struct udevice *dev, enum
> led_state_t state)
>         case LEDST_OFF:
>         case LEDST_ON:
>                 break;
> +       case LEDST_TOGGLE:
> +               ret = dm_gpio_get_value(&priv->gpio);
> +               if (ret < 0)
> +                       return ret;
> +               state = !ret;
> +               break;
>         default:
>                 return -ENOSYS;
>         }
> diff --git a/include/led.h b/include/led.h
> index bbab4d14c9..8c107e28e7 100644
> --- a/include/led.h
> +++ b/include/led.h
> @@ -20,6 +20,7 @@ struct led_uc_plat {
>  enum led_state_t {
>         LEDST_OFF = 0,
>         LEDST_ON = 1,
> +       LEDST_TOGGLE,
>
>         LEDST_COUNT,
>  };
> diff --git a/test/dm/led.c b/test/dm/led.c
> index 68aa39bd4d..2cc24127e2 100644
> --- a/test/dm/led.c
> +++ b/test/dm/led.c
> @@ -53,6 +53,31 @@ static int dm_test_led_gpio(struct unit_test_state *uts)
>  }
>  DM_TEST(dm_test_led_gpio, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
>
> +/* Test that we can toggle LEDs */
> +static int dm_test_led_toggle(struct unit_test_state *uts)
> +{
> +       const int offset = 1;
> +       struct udevice *dev, *gpio;
> +
> +       /*
> +        * Check that we can manipulate an LED. LED 1 is connected to GPIO
> +        * bank gpio_a, offset 1.
> +        */
> +       ut_assertok(uclass_get_device(UCLASS_LED, 1, &dev));
> +       ut_assertok(uclass_get_device(UCLASS_GPIO, 1, &gpio));
> +       ut_asserteq(0, sandbox_gpio_get_value(gpio, offset));
> +       ut_assertok(led_set_state(dev, LEDST_TOGGLE));
> +       ut_asserteq(1, sandbox_gpio_get_value(gpio, offset));
> +       ut_asserteq(LEDST_ON, led_get_state(dev));
> +
> +       ut_assertok(led_set_state(dev, LEDST_TOGGLE));
> +       ut_asserteq(0, sandbox_gpio_get_value(gpio, offset));
> +       ut_asserteq(LEDST_OFF, led_get_state(dev));
> +
> +       return 0;
> +}
> +DM_TEST(dm_test_led_toggle, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
> +
>  /* Test obtaining an LED by label */
>  static int dm_test_led_label(struct unit_test_state *uts)
>  {
> --
> 2.12.2.715.g7642488e1d-goog
>
>
Reviewed-by: Ziping Chen <techping.chan@gmail.com>

^ permalink raw reply	[flat|nested] 29+ messages in thread

* [U-Boot] [PATCH v2 7/9] dm: led: Add support for blinking LEDs
  2017-04-10 17:34 ` [U-Boot] [PATCH v2 7/9] dm: led: Add support for blinking LEDs Simon Glass
@ 2017-04-12  8:52   ` Ziping Chen
  2017-04-15 16:08     ` Simon Glass
  0 siblings, 1 reply; 29+ messages in thread
From: Ziping Chen @ 2017-04-12  8:52 UTC (permalink / raw)
  To: u-boot

2017-04-11 1:34 GMT+08:00 Simon Glass <sjg@chromium.org>:

> Allow LEDs to be blinked if the driver supports it. Enable this for
> sandbox so that the tests run.
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
>
> Changes in v2:
> - Control this feature via a new CONFIG_LED_BLINK option
>
>  configs/sandbox_defconfig       |  1 +
>  configs/sandbox_noblk_defconfig |  1 +
>  configs/sandbox_spl_defconfig   |  1 +
>  drivers/led/Kconfig             |  9 +++++++++
>  drivers/led/led-uclass.c        | 12 ++++++++++++
>  include/led.h                   | 35 +++++++++++++++++++++++++++++++++++
>  test/dm/led.c                   | 24 ++++++++++++++++++++++++
>  7 files changed, 83 insertions(+)
>
> diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig
> index 7f3f5ac809..9814ea3b81 100644
> --- a/configs/sandbox_defconfig
> +++ b/configs/sandbox_defconfig
> @@ -83,6 +83,7 @@ CONFIG_I2C_ARB_GPIO_CHALLENGE=y
>  CONFIG_CROS_EC_KEYB=y
>  CONFIG_I8042_KEYB=y
>  CONFIG_LED=y
> +CONFIG_LED_BLINK=y
>  CONFIG_LED_GPIO=y
>  CONFIG_DM_MAILBOX=y
>  CONFIG_SANDBOX_MBOX=y
> diff --git a/configs/sandbox_noblk_defconfig b/configs/sandbox_noblk_
> defconfig
> index 3f8e70d523..bba744332c 100644
> --- a/configs/sandbox_noblk_defconfig
> +++ b/configs/sandbox_noblk_defconfig
> @@ -92,6 +92,7 @@ CONFIG_I2C_ARB_GPIO_CHALLENGE=y
>  CONFIG_CROS_EC_KEYB=y
>  CONFIG_I8042_KEYB=y
>  CONFIG_LED=y
> +CONFIG_LED_BLINK=y
>  CONFIG_LED_GPIO=y
>  CONFIG_CROS_EC=y
>  CONFIG_CROS_EC_I2C=y
> diff --git a/configs/sandbox_spl_defconfig b/configs/sandbox_spl_defconfig
> index ade67143b1..6fe21254fd 100644
> --- a/configs/sandbox_spl_defconfig
> +++ b/configs/sandbox_spl_defconfig
> @@ -94,6 +94,7 @@ CONFIG_I2C_ARB_GPIO_CHALLENGE=y
>  CONFIG_CROS_EC_KEYB=y
>  CONFIG_I8042_KEYB=y
>  CONFIG_LED=y
> +CONFIG_LED_BLINK=y
>  CONFIG_LED_GPIO=y
>  CONFIG_DM_MAILBOX=y
>  CONFIG_SANDBOX_MBOX=y
> diff --git a/drivers/led/Kconfig b/drivers/led/Kconfig
> index 0ef45bc06a..309372ab56 100644
> --- a/drivers/led/Kconfig
> +++ b/drivers/led/Kconfig
> @@ -9,6 +9,15 @@ config LED
>           can provide access to board-specific LEDs. Use of the device tree
>           for configuration is encouraged.
>
> +config LED_BLINK
> +       bool "Support LED blinking"
> +       depends on LED
> +       help
> +         Some drivers can support automatic blinking of LEDs with a given
> +         period, without needing timers or extra code to handle the
> timing.
> +         This option enables support for this which adds slightly to the
> +         code size.
> +
>  config SPL_LED
>         bool "Enable LED support in SPL"
>         depends on SPL && SPL_DM
> diff --git a/drivers/led/led-uclass.c b/drivers/led/led-uclass.c
> index ea5fbabadf..78ab76050d 100644
> --- a/drivers/led/led-uclass.c
> +++ b/drivers/led/led-uclass.c
> @@ -52,6 +52,18 @@ enum led_state_t led_get_state(struct udevice *dev)
>         return ops->get_state(dev);
>  }
>
> +#ifdef CONFIG_LED_BLINK
> +int led_set_period(struct udevice *dev, int period_ms)
> +{
> +       struct led_ops *ops = led_get_ops(dev);
> +
> +       if (!ops->set_period)
> +               return -ENOSYS;
> +
> +       return ops->set_period(dev, period_ms);
> +}
> +#endif
> +
>  UCLASS_DRIVER(led) = {
>         .id             = UCLASS_LED,
>         .name           = "led",
> diff --git a/include/led.h b/include/led.h
> index 8c107e28e7..c67af22591 100644
> --- a/include/led.h
> +++ b/include/led.h
> @@ -17,10 +17,22 @@ struct led_uc_plat {
>         const char *label;
>  };
>
> +/**
> + * struct led_uc_priv - Private data the uclass stores about each device
> + *
> + * @period_ms: Flash period in milliseconds
> + */
> +struct led_uc_priv {
> +       int period_ms;
> +};
> +
>  enum led_state_t {
>         LEDST_OFF = 0,
>         LEDST_ON = 1,
>         LEDST_TOGGLE,
> +#ifdef CONFIG_LED_BLINK
> +       LEDST_BLINK,
> +#endif
>
>         LEDST_COUNT,
>  };
> @@ -42,6 +54,20 @@ struct led_ops {
>          * @return LED state led_state_t, or -ve on error
>          */
>         enum led_state_t (*get_state)(struct udevice *dev);
> +
> +#ifdef CONFIG_LED_BLINK
> +       /**
> +        * led_set_period() - set the blink period of an LED
> +        *
> +        * Thie records the period if supported, or returns -ENOSYS if not.
> +        * To start the LED blinking, use set_state().
> +        *
> +        * @dev:        LED device to change
> +        * @period_ms:  LED blink period in milliseconds
> +        * @return 0 if OK, -ve on error
> +        */
> +       int (*set_period)(struct udevice *dev, int period_ms);
> +#endif
>  };
>
>  #define led_get_ops(dev)       ((struct led_ops *)(dev)->driver->ops)
> @@ -72,4 +98,13 @@ int led_set_state(struct udevice *dev, enum led_state_t
> state);
>   */
>  enum led_state_t led_get_state(struct udevice *dev);
>
> +/**
> + * led_set_period() - set the blink period of an LED
> + *
> + * @dev:       LED device to change
> + * @period_ms: LED blink period in milliseconds
> + * @return 0 if OK, -ve on error
> + */
> +int led_set_period(struct udevice *dev, int period_ms);
> +
>  #endif
> diff --git a/test/dm/led.c b/test/dm/led.c
> index 2cc24127e2..fde700be38 100644
> --- a/test/dm/led.c
> +++ b/test/dm/led.c
> @@ -98,3 +98,27 @@ static int dm_test_led_label(struct unit_test_state
> *uts)
>         return 0;
>  }
>  DM_TEST(dm_test_led_label, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
> +
> +/* Test LED blinking */
> +#ifdef CONFIG_LED_BLINK
> +static int dm_test_led_blink(struct unit_test_state *uts)
> +{
> +       const int offset = 1;
> +       struct udevice *dev, *gpio;
> +
> +       /*
> +        * Check that we get an error when trying to blink an LED, since
> it is
> +        * not supported by the GPIO LED driver.
> +        */
> +       ut_assertok(uclass_get_device(UCLASS_LED, 1, &dev));
> +       ut_assertok(uclass_get_device(UCLASS_GPIO, 1, &gpio));
> +       ut_asserteq(0, sandbox_gpio_get_value(gpio, offset));
> +       ut_asserteq(-ENOSYS, led_set_state(dev, LEDST_BLINK));
> +       ut_asserteq(0, sandbox_gpio_get_value(gpio, offset));
> +       ut_asserteq(LEDST_OFF, led_get_state(dev));
> +       ut_asserteq(-ENOSYS, led_set_period(dev, 100));
> +
> +       return 0;
> +}
> +DM_TEST(dm_test_led_blink, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
> +#endif
> --
> 2.12.2.715.g7642488e1d-goog
>
>
Reviewed-by: Ziping Chen <techping.chan@gmail.com>

^ permalink raw reply	[flat|nested] 29+ messages in thread

* [U-Boot] [PATCH v2 8/9] led: Mark existing driver as legacy
  2017-04-10 17:34 ` [U-Boot] [PATCH v2 8/9] led: Mark existing driver as legacy Simon Glass
@ 2017-04-12  8:53   ` Ziping Chen
  2017-04-15 16:08     ` Simon Glass
  0 siblings, 1 reply; 29+ messages in thread
From: Ziping Chen @ 2017-04-12  8:53 UTC (permalink / raw)
  To: u-boot

2017-04-11 1:34 GMT+08:00 Simon Glass <sjg@chromium.org>:

> The existing 'led' command does not support driver model. Rename it to
> indicate that it is legacy code.
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
>
> Changes in v2: None
>
>  cmd/Makefile     | 2 +-
>  cmd/legacy_led.c | 4 ++--
>  2 files changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/cmd/Makefile b/cmd/Makefile
> index ef1406b3f8..19d450e0fb 100644
> --- a/cmd/Makefile
> +++ b/cmd/Makefile
> @@ -78,7 +78,7 @@ obj-$(CONFIG_CMD_ITEST) += itest.o
>  obj-$(CONFIG_CMD_JFFS2) += jffs2.o
>  obj-$(CONFIG_CMD_CRAMFS) += cramfs.o
>  obj-$(CONFIG_CMD_LDRINFO) += ldrinfo.o
> -obj-$(CONFIG_LED_STATUS_CMD) += led.o
> +obj-$(CONFIG_LED_STATUS_CMD) += legacy_led.o
>  obj-$(CONFIG_CMD_LICENSE) += license.o
>  obj-y += load.o
>  obj-$(CONFIG_LOGBUFFER) += log.o
> diff --git a/cmd/legacy_led.c b/cmd/legacy_led.c
> index 951a5e242f..1ec2e43e50 100644
> --- a/cmd/legacy_led.c
> +++ b/cmd/legacy_led.c
> @@ -86,7 +86,7 @@ void __weak __led_blink(led_id_t mask, int freq)
>  {
>  }
>
> -int do_led (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
> +int do_legacy_led(cmd_tbl_t *cmdtp, int flag, int argc, char * const
> argv[])
>  {
>         int i, match = 0;
>         enum led_cmd cmd;
> @@ -148,7 +148,7 @@ int do_led (cmd_tbl_t *cmdtp, int flag, int argc, char
> * const argv[])
>  }
>
>  U_BOOT_CMD(
> -       led, 4, 1, do_led,
> +       led, 4, 1, do_legacy_led,
>         "["
>  #ifdef CONFIG_LED_STATUS_BOARD_SPECIFIC
>  #ifdef CONFIG_LED_STATUS0
> --
> 2.12.2.715.g7642488e1d-goog
>
>
Reviewed-by: Ziping Chen <techping.chan@gmail.com>

^ permalink raw reply	[flat|nested] 29+ messages in thread

* [U-Boot] [PATCH v2 9/9] dm: led: Add a new 'led' command
  2017-04-10 17:34 ` [U-Boot] [PATCH v2 9/9] dm: led: Add a new 'led' command Simon Glass
@ 2017-04-12  8:53   ` Ziping Chen
  2017-04-15 16:08     ` Simon Glass
  0 siblings, 1 reply; 29+ messages in thread
From: Ziping Chen @ 2017-04-12  8:53 UTC (permalink / raw)
  To: u-boot

2017-04-11 1:34 GMT+08:00 Simon Glass <sjg@chromium.org>:

> When driver model is used for LEDs, provide a command to allow LED access.
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
>
> Changes in v2: None
>
>  cmd/Kconfig  |   9 ++++
>  cmd/Makefile |   1 +
>  cmd/led.c    | 145 ++++++++++++++++++++++++++++++
> +++++++++++++++++++++++++++++
>  3 files changed, 155 insertions(+)
>  create mode 100644 cmd/led.c
>
> diff --git a/cmd/Kconfig b/cmd/Kconfig
> index 661ae7a98c..13dc46a174 100644
> --- a/cmd/Kconfig
> +++ b/cmd/Kconfig
> @@ -667,6 +667,15 @@ config CMD_CACHE
>         help
>           Enable the "icache" and "dcache" commands
>
> +config CMD_LED
> +       bool "led"
> +       default y if LED
> +       help
> +         Enable the 'led' command which allows for control of LEDs
> supported
> +         by the board. The LEDs can be listed with 'led list' and
> controlled
> +         with led on/off/togle/blink. Any LED drivers can be controlled
> with
> +         this command, e.g. led_gpio.
> +
>  config CMD_TIME
>         bool "time"
>         help
> diff --git a/cmd/Makefile b/cmd/Makefile
> index 19d450e0fb..3cb0cfde7b 100644
> --- a/cmd/Makefile
> +++ b/cmd/Makefile
> @@ -79,6 +79,7 @@ obj-$(CONFIG_CMD_JFFS2) += jffs2.o
>  obj-$(CONFIG_CMD_CRAMFS) += cramfs.o
>  obj-$(CONFIG_CMD_LDRINFO) += ldrinfo.o
>  obj-$(CONFIG_LED_STATUS_CMD) += legacy_led.o
> +obj-$(CONFIG_CMD_LED) += led.o
>  obj-$(CONFIG_CMD_LICENSE) += license.o
>  obj-y += load.o
>  obj-$(CONFIG_LOGBUFFER) += log.o
> diff --git a/cmd/led.c b/cmd/led.c
> new file mode 100644
> index 0000000000..84173f86f2
> --- /dev/null
> +++ b/cmd/led.c
> @@ -0,0 +1,145 @@
> +/*
> + * Copyright (c) 2017 Google, Inc
> + * Written by Simon Glass <sjg@chromium.org>
> + *
> + * SPDX-License-Identifier:     GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <command.h>
> +#include <dm.h>
> +#include <led.h>
> +#include <dm/uclass-internal.h>
> +
> +#define LED_TOGGLE LEDST_COUNT
> +
> +static const char *const state_label[] = {
> +       [LEDST_OFF]     = "off",
> +       [LEDST_ON]      = "on",
> +       [LEDST_TOGGLE]  = "toggle",
> +#ifdef CONFIG_LED_BLINK
> +       [LEDST_BLINK]   = "blink",
> +#endif
> +};
> +
> +enum led_state_t get_led_cmd(char *var)
> +{
> +       int i;
> +
> +       for (i = 0; i < LEDST_COUNT; i++) {
> +               if (!strncmp(var, state_label[i], strlen(var)))
> +                       return i;
> +       }
> +
> +       return -1;
> +}
> +
> +static int show_led_state(struct udevice *dev)
> +{
> +       int ret;
> +
> +       ret = led_get_state(dev);
> +       if (ret >= LEDST_COUNT)
> +               ret = -EINVAL;
> +       if (ret >= 0)
> +               printf("%s\n", state_label[ret]);
> +
> +       return ret;
> +}
> +
> +static int list_leds(void)
> +{
> +       struct udevice *dev;
> +       int ret;
> +
> +       for (uclass_find_first_device(UCLASS_LED, &dev);
> +            dev;
> +            uclass_find_next_device(&dev)) {
> +               struct led_uc_plat *plat = dev_get_uclass_platdata(dev);
> +
> +               if (!plat->label)
> +                       continue;
> +               printf("%-15s ", plat->label);
> +               if (device_active(dev)) {
> +                       ret = show_led_state(dev);
> +                       if (ret < 0)
> +                               printf("Error %d\n", ret);
> +               } else {
> +                       printf("<inactive>\n");
> +               }
> +       }
> +
> +       return 0;
> +}
> +
> +int do_led(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
> +{
> +       enum led_state_t cmd;
> +       const char *led_label;
> +       struct udevice *dev;
> +#ifdef CONFIG_LED_BLINK
> +       int freq_ms = 0;
> +#endif
> +       int ret;
> +
> +       /* Validate arguments */
> +       if (argc < 2)
> +               return CMD_RET_USAGE;
> +       led_label = argv[1];
> +       if (*led_label == 'l')
> +               return list_leds();
> +
> +       cmd = argc > 2 ? get_led_cmd(argv[2]) : LEDST_COUNT;
> +       if (cmd < 0)
> +               return CMD_RET_USAGE;
> +#ifdef CONFIG_LED_BLINK
> +       if (cmd == LEDST_BLINK) {
> +               if (argc < 4)
> +                       return CMD_RET_USAGE;
> +               freq_ms = simple_strtoul(argv[3], NULL, 10);
> +       }
> +#endif
> +       ret = led_get_by_label(led_label, &dev);
> +       if (ret) {
> +               printf("LED '%s' not found (err=%d)\n", led_label, ret);
> +               return CMD_RET_FAILURE;
> +       }
> +       switch (cmd) {
> +       case LEDST_OFF:
> +       case LEDST_ON:
> +       case LEDST_TOGGLE:
> +               ret = led_set_state(dev, cmd);
> +               break;
> +#ifdef CONFIG_LED_BLINK
> +       case LEDST_BLINK:
> +               ret = led_set_period(dev, freq_ms);
> +               if (!ret)
> +                       ret = led_set_state(dev, LEDST_BLINK);
> +               break;
> +#endif
> +       case LEDST_COUNT:
> +               printf("LED '%s': ", led_label);
> +               ret = show_led_state(dev);
> +               break;
> +       }
> +       if (ret < 0) {
> +               printf("LED '%s' operation failed (err=%d)\n", led_label,
> ret);
> +               return CMD_RET_FAILURE;
> +       }
> +
> +       return 0;
> +}
> +
> +#ifdef CONFIG_LED_BLINK
> +#define BLINK "|blink [blink-freq in ms]"
> +#else
> +#define BLINK ""
> +#endif
> +
> +U_BOOT_CMD(
> +       led, 4, 1, do_led,
> +       "manage LEDs",
> +       "<led_label> on|off|toggle" BLINK "\tChange LED state\n"
> +       "led [<led_label>\tGet LED state\n"
> +       "led list\t\tshow a list of LEDs"
> +);
> --
> 2.12.2.715.g7642488e1d-goog
>
>
Reviewed-by: Ziping Chen <techping.chan@gmail.com>

^ permalink raw reply	[flat|nested] 29+ messages in thread

* [U-Boot] [PATCH v2 1/9] sandbox: Add some test LEDs
  2017-04-12  8:51   ` Ziping Chen
@ 2017-04-15 16:07     ` Simon Glass
  0 siblings, 0 replies; 29+ messages in thread
From: Simon Glass @ 2017-04-15 16:07 UTC (permalink / raw)
  To: u-boot

On 12 April 2017 at 02:51, Ziping Chen <techping.chan@gmail.com> wrote:
>
>
> 2017-04-11 1:34 GMT+08:00 Simon Glass <sjg@chromium.org>:
>>
>> Add some LEDs to the standard sandbox device tree.
>>
>> Signed-off-by: Simon Glass <sjg@chromium.org>
>> ---
>>
>> Changes in v2: None
>>
>>  arch/sandbox/dts/sandbox.dts | 14 ++++++++++++++
>>  cmd/{led.c => legacy_led.c}  |  0
>>  2 files changed, 14 insertions(+)
>>  rename cmd/{led.c => legacy_led.c} (100%)
>>
>> diff --git a/arch/sandbox/dts/sandbox.dts b/arch/sandbox/dts/sandbox.dts
>> index 20614646f7..40f423da25 100644
>> --- a/arch/sandbox/dts/sandbox.dts
>> +++ b/arch/sandbox/dts/sandbox.dts
>> @@ -123,6 +123,20 @@
>>                 yres = <768>;
>>         };
>>
>> +       leds {
>> +               compatible = "gpio-leds";
>> +
>> +               iracibble {
>> +                       gpios = <&gpio_a 1 0>;
>> +                       label = "sandbox:red";
>> +               };
>> +
>> +               martinet {
>> +                       gpios = <&gpio_a 2 0>;
>> +                       label = "sandbox:green";
>> +               };
>> +       };
>> +
>>         pci: pci-controller {
>>                 compatible = "sandbox,pci";
>>                 device_type = "pci";
>> diff --git a/cmd/led.c b/cmd/legacy_led.c
>> similarity index 100%
>> rename from cmd/led.c
>> rename to cmd/legacy_led.c
>> --
>> 2.12.2.715.g7642488e1d-goog
>>
>
> Reviewed-by: Ziping Chen <techping.chan@gmail.com>

Applied to u-boot-dm.

^ permalink raw reply	[flat|nested] 29+ messages in thread

* [U-Boot] [PATCH v2 2/9] dm: led: Add a missing blank line in the Kconfig file
  2017-04-12  8:51   ` Ziping Chen
@ 2017-04-15 16:07     ` Simon Glass
  0 siblings, 0 replies; 29+ messages in thread
From: Simon Glass @ 2017-04-15 16:07 UTC (permalink / raw)
  To: u-boot

On 12 April 2017 at 02:51, Ziping Chen <techping.chan@gmail.com> wrote:
>
>
> 2017-04-11 1:34 GMT+08:00 Simon Glass <sjg@chromium.org>:
>>
>> There should be a blank line between each option. Add one before LED_GPIO.
>>
>> Signed-off-by: Simon Glass <sjg@chromium.org>
>> ---
>>
>> Changes in v2:
>> - Add new patch with blank line in the Kconfig file
>>
>>  drivers/led/Kconfig | 1 +
>>  1 file changed, 1 insertion(+)
>>
>> diff --git a/drivers/led/Kconfig b/drivers/led/Kconfig
>> index 609b1fa3fe..0ef45bc06a 100644
>> --- a/drivers/led/Kconfig
>> +++ b/drivers/led/Kconfig
>> @@ -17,6 +17,7 @@ config SPL_LED
>>           If this is acceptable and you have a need to use LEDs in SPL,
>>           enable this option. You will need to enable device tree in SPL
>>           for this to work.
>> +
>>  config LED_GPIO
>>         bool "LED support for GPIO-connected LEDs"
>>         depends on LED && DM_GPIO
>> --
>> 2.12.2.715.g7642488e1d-goog
>>
>
> Reviewed-by: Ziping Chen <techping.chan@gmail.com>

^ permalink raw reply	[flat|nested] 29+ messages in thread

* [U-Boot] [PATCH v2 3/9] dm: led: Rename struct led_uclass_plat
  2017-04-12  8:51   ` Ziping Chen
@ 2017-04-15 16:07     ` Simon Glass
  0 siblings, 0 replies; 29+ messages in thread
From: Simon Glass @ 2017-04-15 16:07 UTC (permalink / raw)
  To: u-boot

On 12 April 2017 at 02:51, Ziping Chen <techping.chan@gmail.com> wrote:
>
>
> 2017-04-11 1:34 GMT+08:00 Simon Glass <sjg@chromium.org>:
>>
>> These structures are normally named with 'uc' instead of 'uclass'. Change
>> this one for consistency.
>>
>> Signed-off-by: Simon Glass <sjg@chromium.org>
>> ---
>>
>> Changes in v2: None
>>
>>  drivers/led/led-uclass.c | 4 ++--
>>  drivers/led/led_gpio.c   | 4 ++--
>>  include/led.h            | 4 ++--
>>  3 files changed, 6 insertions(+), 6 deletions(-)
>>
>
> Reviewed-by: Ziping Chen <techping.chan@gmail.com>

Applied to u-boot-dm

^ permalink raw reply	[flat|nested] 29+ messages in thread

* [U-Boot] [PATCH v2 4/9] dm: led: Adjust the LED uclass
  2017-04-12  8:52   ` Ziping Chen
@ 2017-04-15 16:07     ` Simon Glass
  0 siblings, 0 replies; 29+ messages in thread
From: Simon Glass @ 2017-04-15 16:07 UTC (permalink / raw)
  To: u-boot

On 12 April 2017 at 02:52, Ziping Chen <techping.chan@gmail.com> wrote:
>
>
> 2017-04-11 1:34 GMT+08:00 Simon Glass <sjg@chromium.org>:
>>
>> At present this is very simple, supporting only on and off. We want to
>> also support toggling and blinking. As a first step, change the name of
>> the main method and use an enum to indicate the state.
>>
>> Signed-off-by: Simon Glass <sjg@chromium.org>
>> ---
>>
>> Changes in v2: None
>>
>>  drivers/led/led-uclass.c |  6 +++---
>>  drivers/led/led_gpio.c   |  6 +++---
>>  include/led.h            | 19 +++++++++++++------
>>  test/dm/led.c            |  5 +++--
>>  4 files changed, 22 insertions(+), 14 deletions(-)
>>
>
> Reviewed-by: Ziping Chen <techping.chan@gmail.com>

Applied to u-boot-dm

^ permalink raw reply	[flat|nested] 29+ messages in thread

* [U-Boot] [PATCH v2 5/9] dm: led: Add support for getting the state of an LED
  2017-04-12  8:52   ` Ziping Chen
@ 2017-04-15 16:08     ` Simon Glass
  0 siblings, 0 replies; 29+ messages in thread
From: Simon Glass @ 2017-04-15 16:08 UTC (permalink / raw)
  To: u-boot

On 12 April 2017 at 02:52, Ziping Chen <techping.chan@gmail.com> wrote:
>
>
> 2017-04-11 1:34 GMT+08:00 Simon Glass <sjg@chromium.org>:
>>
>> It is useful to be able to read the LED as well as write it. Add this to
>> the uclass and update the GPIO driver.
>>
>> Signed-off-by: Simon Glass <sjg@chromium.org>
>> ---
>>
>> Changes in v2: None
>>
>>  drivers/led/led-uclass.c | 10 ++++++++++
>>  drivers/led/led_gpio.c   | 22 ++++++++++++++++++++++
>>  include/led.h            | 16 ++++++++++++++++
>>  test/dm/led.c            |  2 ++
>>  4 files changed, 50 insertions(+)
>>
>
> Reviewed-by: Ziping Chen <techping.chan@gmail.com>
>

Applied to u-boot-dm

^ permalink raw reply	[flat|nested] 29+ messages in thread

* [U-Boot] [PATCH v2 6/9] dm: led: Support toggling LEDs
  2017-04-12  8:52   ` Ziping Chen
@ 2017-04-15 16:08     ` Simon Glass
  0 siblings, 0 replies; 29+ messages in thread
From: Simon Glass @ 2017-04-15 16:08 UTC (permalink / raw)
  To: u-boot

On 12 April 2017 at 02:52, Ziping Chen <techping.chan@gmail.com> wrote:
>
>
> 2017-04-11 1:34 GMT+08:00 Simon Glass <sjg@chromium.org>:
>>
>> Add support for toggling an LED into the uclass interface. This can be
>> efficiently implemented by the driver.
>>
>> Signed-off-by: Simon Glass <sjg@chromium.org>
>> ---
>>
>> Changes in v2:
>> - Drop the explicit assignment to LEDST_TOGGLE
>>
>>  drivers/led/led_gpio.c |  7 +++++++
>>  include/led.h          |  1 +
>>  test/dm/led.c          | 25 +++++++++++++++++++++++++
>>  3 files changed, 33 insertions(+)
>>
>
> Reviewed-by: Ziping Chen <techping.chan@gmail.com>

Applied to u-boot-dm

^ permalink raw reply	[flat|nested] 29+ messages in thread

* [U-Boot] [PATCH v2 7/9] dm: led: Add support for blinking LEDs
  2017-04-12  8:52   ` Ziping Chen
@ 2017-04-15 16:08     ` Simon Glass
  0 siblings, 0 replies; 29+ messages in thread
From: Simon Glass @ 2017-04-15 16:08 UTC (permalink / raw)
  To: u-boot

On 12 April 2017 at 02:52, Ziping Chen <techping.chan@gmail.com> wrote:
>
>
> 2017-04-11 1:34 GMT+08:00 Simon Glass <sjg@chromium.org>:
>>
>> Allow LEDs to be blinked if the driver supports it. Enable this for
>> sandbox so that the tests run.
>>
>> Signed-off-by: Simon Glass <sjg@chromium.org>
>> ---
>>
>> Changes in v2:
>> - Control this feature via a new CONFIG_LED_BLINK option
>>
>>  configs/sandbox_defconfig       |  1 +
>>  configs/sandbox_noblk_defconfig |  1 +
>>  configs/sandbox_spl_defconfig   |  1 +
>>  drivers/led/Kconfig             |  9 +++++++++
>>  drivers/led/led-uclass.c        | 12 ++++++++++++
>>  include/led.h                   | 35 +++++++++++++++++++++++++++++++++++
>>  test/dm/led.c                   | 24 ++++++++++++++++++++++++
>>  7 files changed, 83 insertions(+)
>>
>
> Reviewed-by: Ziping Chen <techping.chan@gmail.com>
>

Applied to u-boot-dm

^ permalink raw reply	[flat|nested] 29+ messages in thread

* [U-Boot] [PATCH v2 8/9] led: Mark existing driver as legacy
  2017-04-12  8:53   ` Ziping Chen
@ 2017-04-15 16:08     ` Simon Glass
  0 siblings, 0 replies; 29+ messages in thread
From: Simon Glass @ 2017-04-15 16:08 UTC (permalink / raw)
  To: u-boot

On 12 April 2017 at 02:53, Ziping Chen <techping.chan@gmail.com> wrote:
>
>
> 2017-04-11 1:34 GMT+08:00 Simon Glass <sjg@chromium.org>:
>>
>> The existing 'led' command does not support driver model. Rename it to
>> indicate that it is legacy code.
>>
>> Signed-off-by: Simon Glass <sjg@chromium.org>
>> ---
>>
>> Changes in v2: None
>>
>>  cmd/Makefile     | 2 +-
>>  cmd/legacy_led.c | 4 ++--
>>  2 files changed, 3 insertions(+), 3 deletions(-)
>>
>
> Reviewed-by: Ziping Chen <techping.chan@gmail.com>

Applied to u-boot-dm

^ permalink raw reply	[flat|nested] 29+ messages in thread

* [U-Boot] [PATCH v2 9/9] dm: led: Add a new 'led' command
  2017-04-12  8:53   ` Ziping Chen
@ 2017-04-15 16:08     ` Simon Glass
  0 siblings, 0 replies; 29+ messages in thread
From: Simon Glass @ 2017-04-15 16:08 UTC (permalink / raw)
  To: u-boot

On 12 April 2017 at 02:53, Ziping Chen <techping.chan@gmail.com> wrote:
>
>
> 2017-04-11 1:34 GMT+08:00 Simon Glass <sjg@chromium.org>:
>>
>> When driver model is used for LEDs, provide a command to allow LED access.
>>
>> Signed-off-by: Simon Glass <sjg@chromium.org>
>> ---
>>
>> Changes in v2: None
>>
>>  cmd/Kconfig  |   9 ++++
>>  cmd/Makefile |   1 +
>>  cmd/led.c    | 145
>> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>  3 files changed, 155 insertions(+)
>>  create mode 100644 cmd/led.c
>>
>>
>
> Reviewed-by: Ziping Chen <techping.chan@gmail.com>

Applied to u-boot-dm

^ permalink raw reply	[flat|nested] 29+ messages in thread

end of thread, other threads:[~2017-04-15 16:08 UTC | newest]

Thread overview: 29+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-04-10 17:34 [U-Boot] [PATCH v2 0/9] dm: led: Expand the LED interface and add a command Simon Glass
2017-04-10 17:34 ` [U-Boot] [PATCH v2 1/9] sandbox: Add some test LEDs Simon Glass
2017-04-12  8:51   ` Ziping Chen
2017-04-15 16:07     ` Simon Glass
2017-04-10 17:34 ` [U-Boot] [PATCH v2 2/9] dm: led: Add a missing blank line in the Kconfig file Simon Glass
2017-04-12  8:51   ` Ziping Chen
2017-04-15 16:07     ` Simon Glass
2017-04-10 17:34 ` [U-Boot] [PATCH v2 3/9] dm: led: Rename struct led_uclass_plat Simon Glass
2017-04-12  8:51   ` Ziping Chen
2017-04-15 16:07     ` Simon Glass
2017-04-10 17:34 ` [U-Boot] [PATCH v2 4/9] dm: led: Adjust the LED uclass Simon Glass
2017-04-12  8:52   ` Ziping Chen
2017-04-15 16:07     ` Simon Glass
2017-04-10 17:34 ` [U-Boot] [PATCH v2 5/9] dm: led: Add support for getting the state of an LED Simon Glass
2017-04-12  8:52   ` Ziping Chen
2017-04-15 16:08     ` Simon Glass
2017-04-10 17:34 ` [U-Boot] [PATCH v2 6/9] dm: led: Support toggling LEDs Simon Glass
2017-04-12  8:52   ` Ziping Chen
2017-04-15 16:08     ` Simon Glass
2017-04-10 17:34 ` [U-Boot] [PATCH v2 7/9] dm: led: Add support for blinking LEDs Simon Glass
2017-04-12  8:52   ` Ziping Chen
2017-04-15 16:08     ` Simon Glass
2017-04-10 17:34 ` [U-Boot] [PATCH v2 8/9] led: Mark existing driver as legacy Simon Glass
2017-04-12  8:53   ` Ziping Chen
2017-04-15 16:08     ` Simon Glass
2017-04-10 17:34 ` [U-Boot] [PATCH v2 9/9] dm: led: Add a new 'led' command Simon Glass
2017-04-12  8:53   ` Ziping Chen
2017-04-15 16:08     ` Simon Glass
2017-04-12  8:51 ` [U-Boot] [PATCH v2 0/9] dm: led: Expand the LED interface and add a command Ziping Chen

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.