diff options
author | Tom Rini <trini@konsulko.com> | 2021-01-27 19:39:31 +0300 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2021-01-27 19:39:31 +0300 |
commit | 8b195f4b716e4d802768e0e2cd63b417a4690b7f (patch) | |
tree | ee95cc34be28ab8a49b4fb9f6d99a893006c810f /drivers | |
parent | 290e40b2aa96e13b19292d81146063e036028931 (diff) | |
parent | 177cecdc4edcda5881cf217e21568d921b630bf5 (diff) | |
download | u-boot-8b195f4b716e4d802768e0e2cd63b417a4690b7f.tar.xz |
Merge https://gitlab.denx.de/u-boot/custodians/u-boot-marvell
- Espressobin: Disable slot when emmc is not present (Pali)
- DS414; config header cleanup (Phil)
- PCI: auto-config enhancement (Phil)
- pci_mvebu: Also map IO region (Phil)
- serial: a3720: Implement pending method for output direction (Pali)
- turris_mox: Enable a few commands (Marek)
- helios4 & ClearFog changes (Dennis)
- Plus some minor misc changes
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpio/Kconfig | 2 | ||||
-rw-r--r-- | drivers/mmc/xenon_sdhci.c | 19 | ||||
-rw-r--r-- | drivers/pci/pci-aardvark.c | 5 | ||||
-rw-r--r-- | drivers/pci/pci_auto.c | 9 | ||||
-rw-r--r-- | drivers/pci/pci_mvebu.c | 28 | ||||
-rw-r--r-- | drivers/serial/serial_mvebu_a3700.c | 10 |
6 files changed, 62 insertions, 11 deletions
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index 7e94759a79..d24884739b 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig @@ -374,7 +374,7 @@ config SIFIVE_GPIO config MVEBU_GPIO bool "Marvell MVEBU GPIO driver" - depends on DM_GPIO && ARCH_MVEBU + depends on DM_GPIO && (ARCH_MVEBU || ARCH_KIRKWOOD) default y help Say yes here to support Marvell MVEBU (Armada XP/38x) GPIOs. diff --git a/drivers/mmc/xenon_sdhci.c b/drivers/mmc/xenon_sdhci.c index 14fec4b8e7..d635694401 100644 --- a/drivers/mmc/xenon_sdhci.c +++ b/drivers/mmc/xenon_sdhci.c @@ -338,6 +338,16 @@ static void xenon_mmc_enable_slot(struct sdhci_host *host, u8 slot) sdhci_writel(host, var, SDHC_SYS_OP_CTRL); } +/* Disable specific slot */ +static void xenon_mmc_disable_slot(struct sdhci_host *host, u8 slot) +{ + u32 var; + + var = sdhci_readl(host, SDHC_SYS_OP_CTRL); + var &= ~(SLOT_MASK(slot) << SLOT_ENABLE_SHIFT); + sdhci_writel(host, var, SDHC_SYS_OP_CTRL); +} + /* Enable Parallel Transfer Mode */ static void xenon_mmc_enable_parallel_tran(struct sdhci_host *host, u8 slot) { @@ -503,6 +513,14 @@ static int xenon_sdhci_probe(struct udevice *dev) return ret; } +static int xenon_sdhci_remove(struct udevice *dev) +{ + struct sdhci_host *host = dev_get_priv(dev); + + xenon_mmc_disable_slot(host, XENON_MMC_SLOT_ID_HYPERION); + return 0; +} + static int xenon_sdhci_of_to_plat(struct udevice *dev) { struct sdhci_host *host = dev_get_priv(dev); @@ -552,6 +570,7 @@ U_BOOT_DRIVER(xenon_sdhci_drv) = { .ops = &sdhci_ops, .bind = xenon_sdhci_bind, .probe = xenon_sdhci_probe, + .remove = xenon_sdhci_remove, .priv_auto = sizeof(struct xenon_sdhci_priv), .plat_auto = sizeof(struct xenon_sdhci_plat), }; diff --git a/drivers/pci/pci-aardvark.c b/drivers/pci/pci-aardvark.c index 1534efb88e..8713b88461 100644 --- a/drivers/pci/pci-aardvark.c +++ b/drivers/pci/pci-aardvark.c @@ -448,7 +448,6 @@ static int pcie_advk_write_config(struct udevice *bus, pci_dev_t bdf, advk_writel(pcie, 1, PIO_START); if (!pcie_advk_wait_pio(pcie)) { - dev_dbg(pcie->dev, "- wait pio timeout\n"); return -EINVAL; } @@ -630,12 +629,12 @@ static int pcie_advk_probe(struct udevice *dev) * clock should be gated as well. */ if (dm_gpio_is_valid(&pcie->reset_gpio)) { - dev_dbg(pcie->dev, "Toggle PCIE Reset GPIO ...\n"); + dev_dbg(dev, "Toggle PCIE Reset GPIO ...\n"); dm_gpio_set_value(&pcie->reset_gpio, 1); mdelay(200); dm_gpio_set_value(&pcie->reset_gpio, 0); } else { - dev_warn(pcie->dev, "PCIE Reset on GPIO support is missing\n"); + dev_warn(dev, "PCIE Reset on GPIO support is missing\n"); } pcie->first_busno = dev_seq(dev); diff --git a/drivers/pci/pci_auto.c b/drivers/pci/pci_auto.c index 68ef4e8092..b37dd994e5 100644 --- a/drivers/pci/pci_auto.c +++ b/drivers/pci/pci_auto.c @@ -47,16 +47,17 @@ void dm_pciauto_setup_device(struct udevice *dev, int bars_num, dm_pci_write_config32(dev, bar, 0xffffffff); dm_pci_read_config32(dev, bar, &bar_response); - /* If BAR is not implemented go to the next BAR */ - if (!bar_response) + /* If BAR is not implemented (or invalid) go to the next BAR */ + if (!bar_response || bar_response == 0xffffffff) continue; found_mem64 = 0; /* Check the BAR type and set our address mask */ if (bar_response & PCI_BASE_ADDRESS_SPACE) { - bar_size = ((~(bar_response & PCI_BASE_ADDRESS_IO_MASK)) - & 0xffff) + 1; + bar_size = bar_response & PCI_BASE_ADDRESS_IO_MASK; + bar_size &= ~(bar_size - 1); + if (!enum_only) bar_res = io; diff --git a/drivers/pci/pci_mvebu.c b/drivers/pci/pci_mvebu.c index cf6e0a2e7c..374c4aa243 100644 --- a/drivers/pci/pci_mvebu.c +++ b/drivers/pci/pci_mvebu.c @@ -73,6 +73,7 @@ struct mvebu_pcie { void __iomem *membase; struct resource mem; void __iomem *iobase; + struct resource io; u32 port; u32 lane; int devfn; @@ -81,6 +82,8 @@ struct mvebu_pcie { char name[16]; unsigned int mem_target; unsigned int mem_attr; + unsigned int io_target; + unsigned int io_attr; }; /* @@ -90,6 +93,7 @@ struct mvebu_pcie { */ static void __iomem *mvebu_pcie_membase = (void __iomem *)MBUS_PCI_MEM_BASE; #define PCIE_MEM_SIZE (128 << 20) +static void __iomem *mvebu_pcie_iobase = (void __iomem *)MBUS_PCI_IO_BASE; static inline bool mvebu_pcie_link_up(struct mvebu_pcie *pcie) { @@ -306,12 +310,24 @@ static int mvebu_pcie_probe(struct udevice *dev) (u32)pcie->mem.start, PCIE_MEM_SIZE); } + pcie->io.start = (u32)mvebu_pcie_iobase; + pcie->io.end = pcie->io.start + MBUS_PCI_IO_SIZE - 1; + mvebu_pcie_iobase += MBUS_PCI_IO_SIZE; + + if (mvebu_mbus_add_window_by_id(pcie->io_target, pcie->io_attr, + (phys_addr_t)pcie->io.start, + MBUS_PCI_IO_SIZE)) { + printf("PCIe unable to add mbus window for IO at %08x+%08x\n", + (u32)pcie->io.start, MBUS_PCI_IO_SIZE); + } + /* Setup windows and configure host bridge */ mvebu_pcie_setup_wins(pcie); /* Master + slave enable. */ reg = readl(pcie->base + PCIE_CMD_OFF); reg |= PCI_COMMAND_MEMORY; + reg |= PCI_COMMAND_IO; reg |= PCI_COMMAND_MASTER; reg |= BIT(10); /* disable interrupts */ writel(reg, pcie->base + PCIE_CMD_OFF); @@ -323,7 +339,9 @@ static int mvebu_pcie_probe(struct udevice *dev) 0, 0, gd->ram_size, PCI_REGION_MEM | PCI_REGION_SYS_MEMORY); - hose->region_count = 2; + pci_set_region(hose->regions + 2, pcie->io.start, + pcie->io.start, MBUS_PCI_IO_SIZE, PCI_REGION_IO); + hose->region_count = 3; /* Set BAR0 to internal registers */ writel(SOC_REGS_PHY_BASE, pcie->base + PCIE_BAR_LO_OFF(0)); @@ -442,6 +460,14 @@ static int mvebu_pcie_of_to_plat(struct udevice *dev) goto err; } + ret = mvebu_get_tgt_attr(dev_ofnode(dev->parent), pcie->devfn, + IORESOURCE_IO, + &pcie->io_target, &pcie->io_attr); + if (ret < 0) { + printf("%s: cannot get tgt/attr for IO window\n", pcie->name); + goto err; + } + /* Parse PCIe controller register base from DT */ ret = mvebu_pcie_port_parse_dt(dev_ofnode(dev), pcie); if (ret < 0) diff --git a/drivers/serial/serial_mvebu_a3700.c b/drivers/serial/serial_mvebu_a3700.c index 5a1d40e0a6..8f404879a5 100644 --- a/drivers/serial/serial_mvebu_a3700.c +++ b/drivers/serial/serial_mvebu_a3700.c @@ -23,6 +23,7 @@ struct mvebu_plat { #define UART_POSSR_REG 0x14 #define UART_STATUS_RX_RDY 0x10 +#define UART_STATUS_TX_EMPTY 0x40 #define UART_STATUS_TXFIFO_FULL 0x800 #define UART_CTRL_RXFIFO_RESET 0x4000 @@ -59,8 +60,13 @@ static int mvebu_serial_pending(struct udevice *dev, bool input) struct mvebu_plat *plat = dev_get_plat(dev); void __iomem *base = plat->base; - if (readl(base + UART_STATUS_REG) & UART_STATUS_RX_RDY) - return 1; + if (input) { + if (readl(base + UART_STATUS_REG) & UART_STATUS_RX_RDY) + return 1; + } else { + if (!(readl(base + UART_STATUS_REG) & UART_STATUS_TX_EMPTY)) + return 1; + } return 0; } |