aboutsummaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorTom Rini <trini@konsulko.com>2022-01-30 17:12:34 -0500
committerTom Rini <trini@konsulko.com>2022-01-30 17:12:34 -0500
commite267665a7420bddbfd5833573fdfc9d0930ff515 (patch)
treedd92172de357d0843012dcdc5a1a363ad31bffb9 /drivers
parentc7d042f315d89ab2f0122920829f18a8f8897a05 (diff)
parent50d5c6428fc280c095b0edd1a612b3661b5db77d (diff)
downloadu-boot-WIP/30Jan2022.zip
u-boot-WIP/30Jan2022.tar.gz
u-boot-WIP/30Jan2022.tar.bz2
Merge branch 'master' of https://source.denx.de/u-boot/custodians/u-boot-sunxiWIP/30Jan2022
a bit delayed, the first batch of the sunxi pull request for this cycle. This is mostly collecting some patches that were lying around for a while, plus some recent fixes. Nothing too exciting at this point, but of course they should be merged nevertheless. There is the much bigger F1C100s SoC support coming up, which I hope to be able to send in the next few days, along with the removal of sunxi's lowlevel_init usage. Compile tested for all 159 sunxi boards, plus briefly tested on BananaPi M1, OrangePi Zero, Pine64 and Pine-H64.
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpio/sunxi_gpio.c62
-rw-r--r--drivers/i2c/mvtwsi.c1
-rw-r--r--drivers/mmc/sunxi_mmc.c8
-rw-r--r--drivers/spi/spi-sunxi.c3
4 files changed, 32 insertions, 42 deletions
diff --git a/drivers/gpio/sunxi_gpio.c b/drivers/gpio/sunxi_gpio.c
index caefb14..6c3c108 100644
--- a/drivers/gpio/sunxi_gpio.c
+++ b/drivers/gpio/sunxi_gpio.c
@@ -139,27 +139,6 @@ int sunxi_name_to_gpio(const char *name)
return ret ? ret : gpio;
}
-static int sunxi_gpio_direction_input(struct udevice *dev, unsigned offset)
-{
- struct sunxi_gpio_plat *plat = dev_get_plat(dev);
-
- sunxi_gpio_set_cfgbank(plat->regs, offset, SUNXI_GPIO_INPUT);
-
- return 0;
-}
-
-static int sunxi_gpio_direction_output(struct udevice *dev, unsigned offset,
- int value)
-{
- struct sunxi_gpio_plat *plat = dev_get_plat(dev);
- u32 num = GPIO_NUM(offset);
-
- sunxi_gpio_set_cfgbank(plat->regs, offset, SUNXI_GPIO_OUTPUT);
- clrsetbits_le32(&plat->regs->dat, 1 << num, value ? (1 << num) : 0);
-
- return 0;
-}
-
static int sunxi_gpio_get_value(struct udevice *dev, unsigned offset)
{
struct sunxi_gpio_plat *plat = dev_get_plat(dev);
@@ -172,16 +151,6 @@ static int sunxi_gpio_get_value(struct udevice *dev, unsigned offset)
return dat & 0x1;
}
-static int sunxi_gpio_set_value(struct udevice *dev, unsigned offset,
- int value)
-{
- struct sunxi_gpio_plat *plat = dev_get_plat(dev);
- u32 num = GPIO_NUM(offset);
-
- clrsetbits_le32(&plat->regs->dat, 1 << num, value ? (1 << num) : 0);
- return 0;
-}
-
static int sunxi_gpio_get_function(struct udevice *dev, unsigned offset)
{
struct sunxi_gpio_plat *plat = dev_get_plat(dev);
@@ -205,18 +174,41 @@ static int sunxi_gpio_xlate(struct udevice *dev, struct gpio_desc *desc,
if (ret)
return ret;
desc->offset = args->args[1];
- desc->flags = args->args[2] & GPIO_ACTIVE_LOW ? GPIOD_ACTIVE_LOW : 0;
+ desc->flags = gpio_flags_xlate(args->args[2]);
+
+ return 0;
+}
+
+static int sunxi_gpio_set_flags(struct udevice *dev, unsigned int offset,
+ ulong flags)
+{
+ struct sunxi_gpio_plat *plat = dev_get_plat(dev);
+
+ if (flags & GPIOD_IS_OUT) {
+ u32 value = !!(flags & GPIOD_IS_OUT_ACTIVE);
+ u32 num = GPIO_NUM(offset);
+
+ clrsetbits_le32(&plat->regs->dat, 1 << num, value << num);
+ sunxi_gpio_set_cfgbank(plat->regs, offset, SUNXI_GPIO_OUTPUT);
+ } else if (flags & GPIOD_IS_IN) {
+ u32 pull = 0;
+
+ if (flags & GPIOD_PULL_UP)
+ pull = 1;
+ else if (flags & GPIOD_PULL_DOWN)
+ pull = 2;
+ sunxi_gpio_set_pull_bank(plat->regs, offset, pull);
+ sunxi_gpio_set_cfgbank(plat->regs, offset, SUNXI_GPIO_INPUT);
+ }
return 0;
}
static const struct dm_gpio_ops gpio_sunxi_ops = {
- .direction_input = sunxi_gpio_direction_input,
- .direction_output = sunxi_gpio_direction_output,
.get_value = sunxi_gpio_get_value,
- .set_value = sunxi_gpio_set_value,
.get_function = sunxi_gpio_get_function,
.xlate = sunxi_gpio_xlate,
+ .set_flags = sunxi_gpio_set_flags,
};
/**
diff --git a/drivers/i2c/mvtwsi.c b/drivers/i2c/mvtwsi.c
index bad4b14..f48a4f2 100644
--- a/drivers/i2c/mvtwsi.c
+++ b/drivers/i2c/mvtwsi.c
@@ -900,6 +900,7 @@ static const struct dm_i2c_ops mvtwsi_i2c_ops = {
static const struct udevice_id mvtwsi_i2c_ids[] = {
{ .compatible = "marvell,mv64xxx-i2c", },
{ .compatible = "marvell,mv78230-i2c", },
+ { .compatible = "allwinner,sun4i-a10-i2c", },
{ .compatible = "allwinner,sun6i-a31-i2c", },
{ /* sentinel */ }
};
diff --git a/drivers/mmc/sunxi_mmc.c b/drivers/mmc/sunxi_mmc.c
index 4bf8a9b..1bb7b6d 100644
--- a/drivers/mmc/sunxi_mmc.c
+++ b/drivers/mmc/sunxi_mmc.c
@@ -702,12 +702,8 @@ static int sunxi_mmc_probe(struct udevice *dev)
return ret;
/* This GPIO is optional */
- if (!gpio_request_by_name(dev, "cd-gpios", 0, &priv->cd_gpio,
- GPIOD_IS_IN)) {
- int cd_pin = gpio_get_number(&priv->cd_gpio);
-
- sunxi_gpio_set_pull(cd_pin, SUNXI_GPIO_PULL_UP);
- }
+ gpio_request_by_name(dev, "cd-gpios", 0, &priv->cd_gpio,
+ GPIOD_IS_IN | GPIOD_PULL_UP);
upriv->mmc = &plat->mmc;
diff --git a/drivers/spi/spi-sunxi.c b/drivers/spi/spi-sunxi.c
index bc2f544..d62355e 100644
--- a/drivers/spi/spi-sunxi.c
+++ b/drivers/spi/spi-sunxi.c
@@ -249,7 +249,8 @@ static int sun4i_spi_parse_pins(struct udevice *dev)
if (pin < 0)
break;
- if (IS_ENABLED(CONFIG_MACH_SUN50I))
+ if (IS_ENABLED(CONFIG_MACH_SUN50I) ||
+ IS_ENABLED(CONFIG_SUN50I_GEN_H6))
sunxi_gpio_set_cfgpin(pin, SUN50I_GPC_SPI0);
else
sunxi_gpio_set_cfgpin(pin, SUNXI_GPC_SPI0);