mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-26 06:30:39 +00:00
gpio: mpc8xxx: don't modify gpdat when setting gpio as input
Since some chips don't support reading back the value of output gpios from the gpdat register, we should not do a RMW cycle (i.e., the clrbits_be32) on the gpdat register when setting a gpio as input, as that might accidentally change the value of some other (still configured as output) gpio. The extra indirection through mpc8xxx_gpio_set_in() does not help readability, so just fold the gpdir update into mpc8xxx_gpio_direction_input(). Signed-off-by: Rasmus Villemoes <rasmus.villemoes@prevas.dk>
This commit is contained in:
parent
71a3e5c51c
commit
1d7ad9fa05
1 changed files with 4 additions and 8 deletions
|
@ -57,13 +57,6 @@ static inline u32 mpc8xxx_gpio_get_dir(struct ccsr_gpio *base, u32 mask)
|
|||
return in_be32(&base->gpdir) & mask;
|
||||
}
|
||||
|
||||
static inline void mpc8xxx_gpio_set_in(struct ccsr_gpio *base, u32 gpios)
|
||||
{
|
||||
clrbits_be32(&base->gpdat, gpios);
|
||||
/* GPDIR register 0 -> input */
|
||||
clrbits_be32(&base->gpdir, gpios);
|
||||
}
|
||||
|
||||
static inline void mpc8xxx_gpio_set_low(struct ccsr_gpio *base, u32 gpios)
|
||||
{
|
||||
clrbits_be32(&base->gpdat, gpios);
|
||||
|
@ -100,8 +93,11 @@ static inline void mpc8xxx_gpio_open_drain_off(struct ccsr_gpio *base,
|
|||
static int mpc8xxx_gpio_direction_input(struct udevice *dev, uint gpio)
|
||||
{
|
||||
struct mpc8xxx_gpio_data *data = dev_get_priv(dev);
|
||||
u32 mask = gpio_mask(gpio);
|
||||
|
||||
/* GPDIR register 0 -> input */
|
||||
clrbits_be32(&data->base->gpdir, mask);
|
||||
|
||||
mpc8xxx_gpio_set_in(data->base, gpio_mask(gpio));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue