
In order to test get_alt_function ops, add sandbox_gpio_set_function() and sandbox_gpio_set_alternate_function() to be able to configure a pin not as a GPIO and to select the alternate function index.
Signed-off-by: Patrice Chotard patrice.chotard@st.com Reviewed-by: Simon Glass sjg@chromium.org ---
Changes in v3: - Rename get_alternate_function to get_alt_function
Changes in v2: - Rename get_function_number to get_alternate_function in test/dm/gpio.c, drivers/gpio/sandbox.c and in arch/sandbox/include/asm/gpio.h
arch/sandbox/include/asm/gpio.h | 24 ++++++++++++++++++++++++ drivers/gpio/sandbox.c | 29 ++++++++++++++++++++++++++++- test/dm/gpio.c | 13 +++++++++++++ 3 files changed, 65 insertions(+), 1 deletion(-)
diff --git a/arch/sandbox/include/asm/gpio.h b/arch/sandbox/include/asm/gpio.h index de8ac37f4262..217f6435b8bd 100644 --- a/arch/sandbox/include/asm/gpio.h +++ b/arch/sandbox/include/asm/gpio.h @@ -82,4 +82,28 @@ int sandbox_gpio_get_direction(struct udevice *dev, unsigned int offset); int sandbox_gpio_set_direction(struct udevice *dev, unsigned int offset, int output);
+/** + * Set the simulated usage of a pin, as a GPIO or not (used only in sandbox + * test code) + * + * @param dev device to use + * @param offset GPIO offset within bank + * @param value 0 to set as GPIO, 1 to set as not a GPIO + * @return -1 on error, 0 if ok + */ +int sandbox_gpio_set_function(struct udevice *dev, unsigned int offset, + int value); + +/** + * Set the simulated alt function of a pin when pin is not used as a GPIO + * (used only in sandbox test code) + * + * @param dev device to use + * @param offset GPIO offset within bank + * @param value pin alternate function number + * @return -1 on error, 0 if ok + */ +int sandbox_gpio_set_alt_function(struct udevice *dev, + unsigned int offset, + int value); #endif diff --git a/drivers/gpio/sandbox.c b/drivers/gpio/sandbox.c index e7bed17d0db0..55b7a2579db6 100644 --- a/drivers/gpio/sandbox.c +++ b/drivers/gpio/sandbox.c @@ -15,6 +15,8 @@ #define SANDBOX_GPIO_OUTPUT BIT(0) /* Currently set as an output */ #define SANDBOX_GPIO_HIGH BIT(1) /* Currently set high */ #define SANDBOX_GPIO_ODR BIT(2) /* Currently set to open drain mode */ +#define SANDBOX_GPIO_FUNC BIT(3) /* Currently set as not used as GPIO */ +#define SANDBOX_GPIO_FUNC_NB BIT(4) /* Currently set as function number 1 */
struct gpio_state { const char *label; /* label given by requester */ @@ -90,6 +92,19 @@ int sandbox_gpio_set_direction(struct udevice *dev, unsigned offset, int output) return set_gpio_flag(dev, offset, SANDBOX_GPIO_OUTPUT, output); }
+int sandbox_gpio_set_function(struct udevice *dev, unsigned int offset, + int value) +{ + return set_gpio_flag(dev, offset, SANDBOX_GPIO_FUNC, value); +} + +int sandbox_gpio_set_alt_function(struct udevice *dev, + unsigned int offset, + int value) +{ + return set_gpio_flag(dev, offset, SANDBOX_GPIO_FUNC_NB, value); +} + /* * These functions implement the public interface within U-Boot */ @@ -158,11 +173,22 @@ static int sb_gpio_set_open_drain(struct udevice *dev, unsigned offset, int valu
static int sb_gpio_get_function(struct udevice *dev, unsigned offset) { - if (get_gpio_flag(dev, offset, SDBX_GPIO_OUTPUT)) + if (get_gpio_flag(dev, offset, SANDBOX_GPIO_FUNC)) + return GPIOF_FUNC; + + if (get_gpio_flag(dev, offset, SANDBOX_GPIO_OUTPUT)) return GPIOF_OUTPUT; return GPIOF_INPUT; }
+static int sb_gpio_get_alt_function(struct udevice *dev, + unsigned int offset) +{ + debug("%s: offset:%u\n", __func__, offset); + + return get_gpio_flag(dev, offset, SANDBOX_GPIO_FUNC_NB); +} + static int sb_gpio_xlate(struct udevice *dev, struct gpio_desc *desc, struct ofnode_phandle_args *args) { @@ -189,6 +215,7 @@ static const struct dm_gpio_ops gpio_sandbox_ops = { .get_open_drain = sb_gpio_get_open_drain, .set_open_drain = sb_gpio_set_open_drain, .get_function = sb_gpio_get_function, + .get_alt_function = sb_gpio_get_alt_function, .xlate = sb_gpio_xlate, };
diff --git a/test/dm/gpio.c b/test/dm/gpio.c index bb4b20cea938..302342c2e0ce 100644 --- a/test/dm/gpio.c +++ b/test/dm/gpio.c @@ -92,6 +92,19 @@ static int dm_test_gpio(struct unit_test_state *uts) ut_assertok(gpio_get_status(dev, offset, buf, sizeof(buf))); ut_asserteq_str("b4: input: 0 [ ]", buf);
+ /* + * Make it not used as GPIO, select function + * (by default function number 0 is active) + */ + sandbox_gpio_set_function(dev, offset, 1); + ut_assertok(gpio_get_status(dev, offset, buf, sizeof(buf))); + ut_asserteq_str("b4: func: 0", buf); + + /* select function number 1 */ + sandbox_gpio_set_alt_function(dev, offset, 1); + ut_assertok(gpio_get_status(dev, offset, buf, sizeof(buf))); + ut_asserteq_str("b4: func: 1", buf); + /* Check the 'a' bank also */ ut_assertok(gpio_lookup_name("a15", &dev, &offset, &gpio)); ut_asserteq_str(dev->name, "base-gpios");