Merge branch '2020-07-05-gpio-regression-fix'

- Merge a fix to the gpio uclass and a test for it.
This commit is contained in:
Tom Rini 2020-07-05 08:06:52 -04:00
commit 04da1cd807
7 changed files with 51 additions and 4 deletions

View File

@ -343,6 +343,26 @@
#gpio-cells = <1>; #gpio-cells = <1>;
gpio-bank-name = "a"; gpio-bank-name = "a";
sandbox,gpio-count = <20>; sandbox,gpio-count = <20>;
hog_input_active_low {
gpio-hog;
input;
gpios = <0 GPIO_ACTIVE_LOW>;
};
hog_input_active_high {
gpio-hog;
input;
gpios = <1 GPIO_ACTIVE_HIGH>;
};
hog_output_low {
gpio-hog;
output-low;
gpios = <2 GPIO_ACTIVE_HIGH>;
};
hog_output_high {
gpio-hog;
output-high;
gpios = <3 GPIO_ACTIVE_HIGH>;
};
}; };
gpio_b: extra-gpios { gpio_b: extra-gpios {

View File

@ -97,6 +97,7 @@ CONFIG_DM_DEMO_SIMPLE=y
CONFIG_DM_DEMO_SHAPE=y CONFIG_DM_DEMO_SHAPE=y
CONFIG_BOARD=y CONFIG_BOARD=y
CONFIG_BOARD_SANDBOX=y CONFIG_BOARD_SANDBOX=y
CONFIG_GPIO_HOG=y
CONFIG_PM8916_GPIO=y CONFIG_PM8916_GPIO=y
CONFIG_SANDBOX_GPIO=y CONFIG_SANDBOX_GPIO=y
CONFIG_I2C_CROS_EC_TUNNEL=y CONFIG_I2C_CROS_EC_TUNNEL=y

View File

@ -114,6 +114,7 @@ CONFIG_BOARD_SANDBOX=y
CONFIG_DMA=y CONFIG_DMA=y
CONFIG_DMA_CHANNELS=y CONFIG_DMA_CHANNELS=y
CONFIG_SANDBOX_DMA=y CONFIG_SANDBOX_DMA=y
CONFIG_GPIO_HOG=y
CONFIG_PM8916_GPIO=y CONFIG_PM8916_GPIO=y
CONFIG_SANDBOX_GPIO=y CONFIG_SANDBOX_GPIO=y
CONFIG_DM_HWSPINLOCK=y CONFIG_DM_HWSPINLOCK=y

View File

@ -82,6 +82,7 @@ CONFIG_DM_DEMO_SIMPLE=y
CONFIG_DM_DEMO_SHAPE=y CONFIG_DM_DEMO_SHAPE=y
CONFIG_BOARD=y CONFIG_BOARD=y
CONFIG_BOARD_SANDBOX=y CONFIG_BOARD_SANDBOX=y
CONFIG_GPIO_HOG=y
CONFIG_PM8916_GPIO=y CONFIG_PM8916_GPIO=y
CONFIG_SANDBOX_GPIO=y CONFIG_SANDBOX_GPIO=y
CONFIG_I2C_CROS_EC_TUNNEL=y CONFIG_I2C_CROS_EC_TUNNEL=y

View File

@ -101,6 +101,7 @@ CONFIG_DM_DEMO_SHAPE=y
CONFIG_BOARD=y CONFIG_BOARD=y
CONFIG_BOARD_SANDBOX=y CONFIG_BOARD_SANDBOX=y
CONFIG_SPL_FIRMWARE=y CONFIG_SPL_FIRMWARE=y
CONFIG_GPIO_HOG=y
CONFIG_PM8916_GPIO=y CONFIG_PM8916_GPIO=y
CONFIG_SANDBOX_GPIO=y CONFIG_SANDBOX_GPIO=y
CONFIG_I2C_CROS_EC_TUNNEL=y CONFIG_I2C_CROS_EC_TUNNEL=y

View File

@ -600,6 +600,10 @@ static int _dm_gpio_set_dir_flags(struct gpio_desc *desc, ulong flags)
} }
} }
/* save the flags also in descriptor */
if (!ret)
desc->flags = flags;
return ret; return ret;
} }
@ -615,10 +619,6 @@ int dm_gpio_set_dir_flags(struct gpio_desc *desc, ulong flags)
flags |= desc->flags; flags |= desc->flags;
ret = _dm_gpio_set_dir_flags(desc, flags); ret = _dm_gpio_set_dir_flags(desc, flags);
/* update the descriptor flags */
if (ret)
desc->flags = flags;
return ret; return ret;
} }

View File

@ -20,6 +20,7 @@ static int dm_test_gpio(struct unit_test_state *uts)
unsigned int offset, gpio; unsigned int offset, gpio;
struct dm_gpio_ops *ops; struct dm_gpio_ops *ops;
struct udevice *dev; struct udevice *dev;
struct gpio_desc *desc;
const char *name; const char *name;
int offset_count; int offset_count;
char buf[80]; char buf[80];
@ -109,6 +110,28 @@ static int dm_test_gpio(struct unit_test_state *uts)
ut_asserteq_str("a", name); ut_asserteq_str("a", name);
ut_asserteq(20, offset_count); ut_asserteq(20, offset_count);
/* add gpio hog tests */
ut_assertok(gpio_hog_lookup_name("hog_input_active_low", &desc));
ut_asserteq(GPIOD_IS_IN | GPIOD_ACTIVE_LOW, desc->flags);
ut_asserteq(0, desc->offset);
ut_asserteq(1, dm_gpio_get_value(desc));
ut_assertok(gpio_hog_lookup_name("hog_input_active_high", &desc));
ut_asserteq(GPIOD_IS_IN, desc->flags);
ut_asserteq(1, desc->offset);
ut_asserteq(0, dm_gpio_get_value(desc));
ut_assertok(gpio_hog_lookup_name("hog_output_low", &desc));
ut_asserteq(GPIOD_IS_OUT, desc->flags);
ut_asserteq(2, desc->offset);
ut_asserteq(0, dm_gpio_get_value(desc));
ut_assertok(dm_gpio_set_value(desc, 1));
ut_asserteq(1, dm_gpio_get_value(desc));
ut_assertok(gpio_hog_lookup_name("hog_output_high", &desc));
ut_asserteq(GPIOD_IS_OUT, desc->flags);
ut_asserteq(3, desc->offset);
ut_asserteq(1, dm_gpio_get_value(desc));
ut_assertok(dm_gpio_set_value(desc, 0));
ut_asserteq(0, dm_gpio_get_value(desc));
return 0; return 0;
} }
DM_TEST(dm_test_gpio, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); DM_TEST(dm_test_gpio, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);