From: Simon Glass Date: Sat, 4 Oct 2014 17:29:49 +0000 (-0600) Subject: dm: gpio: Add gpio_requestf() helper for printf() strings X-Git-Url: http://git.dujemihanovic.xyz/?a=commitdiff_plain;h=d44f597b12b8f8099c3c52c3eb09540966cafe79;p=u-boot.git dm: gpio: Add gpio_requestf() helper for printf() strings Add a helper which permits a printf()-style format string for the requester string. Signed-off-by: Simon Glass --- diff --git a/doc/driver-model/README.txt b/doc/driver-model/README.txt index 1ff454aeb4..f4395c188a 100644 --- a/doc/driver-model/README.txt +++ b/doc/driver-model/README.txt @@ -95,7 +95,7 @@ are provided in test/dm. To run them, try: You should see something like this: <...U-Boot banner...> - Running 26 driver model tests + Running 27 driver model tests Test: dm_test_autobind Test: dm_test_autoprobe Test: dm_test_bus_children @@ -117,6 +117,7 @@ You should see something like this: Test: dm_test_gpio extra-gpios: get_value: error: gpio b5 not reserved Test: dm_test_gpio_anon + Test: dm_test_gpio_requestf Test: dm_test_leak Test: dm_test_lifecycle Test: dm_test_operations diff --git a/drivers/gpio/gpio-uclass.c b/drivers/gpio/gpio-uclass.c index 6367093210..45e9a5ad22 100644 --- a/drivers/gpio/gpio-uclass.c +++ b/drivers/gpio/gpio-uclass.c @@ -130,6 +130,27 @@ int gpio_request(unsigned gpio, const char *label) return 0; } +/** + * gpio_requestf() - [COMPAT] Request GPIO + * @gpio: GPIO number + * @fmt: Format string for the requested GPIO + * @...: Arguments for the printf() format string + * + * This function implements the API that's compatible with current + * GPIO API used in U-Boot. The request is forwarded to particular + * GPIO driver. Returns 0 on success, negative value on error. + */ +int gpio_requestf(unsigned gpio, const char *fmt, ...) +{ + va_list args; + char buf[40]; + + va_start(args, fmt); + vscnprintf(buf, sizeof(buf), fmt, args); + va_end(args); + return gpio_request(gpio, buf); +} + /** * gpio_free() - [COMPAT] Relinquish GPIO * gpio: GPIO number diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h index 693bb56f77..8af760e777 100644 --- a/include/asm-generic/gpio.h +++ b/include/asm-generic/gpio.h @@ -145,6 +145,16 @@ int gpio_get_function(struct udevice *dev, int offset, const char **namep); */ int gpio_get_raw_function(struct udevice *dev, int offset, const char **namep); +/** + * gpio_requestf() - request a GPIO using a format string for the owner + * + * This is a helper function for gpio_request(). It allows you to provide + * a printf()-format string for the GPIO owner. It calls gpio_request() with + * the string that is created + */ +int gpio_requestf(unsigned gpio, const char *fmt, ...) + __attribute__ ((format (__printf__, 2, 3))); + /** * struct struct dm_gpio_ops - Driver model GPIO operations * diff --git a/test/dm/gpio.c b/test/dm/gpio.c index ad56ca5fab..5174cede24 100644 --- a/test/dm/gpio.c +++ b/test/dm/gpio.c @@ -120,3 +120,21 @@ static int dm_test_gpio_anon(struct dm_test_state *dms) return 0; } DM_TEST(dm_test_gpio_anon, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); + +/* Test that gpio_requestf() works as expected */ +static int dm_test_gpio_requestf(struct dm_test_state *dms) +{ + unsigned int offset, gpio; + struct udevice *dev; + char buf[80]; + + ut_assertok(gpio_lookup_name("b5", &dev, &offset, &gpio)); + ut_assertok(gpio_requestf(gpio, "testing %d %s", 1, "hi")); + sandbox_gpio_set_direction(dev, offset, 1); + sandbox_gpio_set_value(dev, offset, 1); + ut_assertok(gpio_get_status(dev, offset, buf, sizeof(buf))); + ut_asserteq_str("b5: output: 1 [x] testing 1 hi", buf); + + return 0; +} +DM_TEST(dm_test_gpio_requestf, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);