board: arm: Add support for Broadcom BCM7445
Add support for loading U-Boot on the Broadcom 7445 SoC. This port assumes Broadcom's BOLT bootloader is acting as the second stage bootloader, and U-Boot is acting as the third stage bootloader, loaded as an ELF program by BOLT. Signed-off-by: Thomas Fitzsimmons <fitzsim@fitzsim.org> Cc: Stefan Roese <sr@denx.de> Cc: Tom Rini <trini@konsulko.com> Cc: Florian Fainelli <f.fainelli@gmail.com>
This commit is contained in:
committed by
Tom Rini
parent
d154ca6003
commit
894c3ad27f
@@ -379,6 +379,17 @@ config MMC_SDHCI_BCM2835
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config MMC_SDHCI_BCMSTB
|
||||
tristate "SDHCI support for the BCMSTB SD/MMC Controller"
|
||||
depends on MMC_SDHCI
|
||||
help
|
||||
This selects the Broadcom set-top box SD/MMC controller.
|
||||
|
||||
If you have a BCMSTB platform with SD or MMC devices,
|
||||
say Y here.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config MMC_SDHCI_CADENCE
|
||||
bool "SDHCI support for the Cadence SD/SDIO/eMMC controller"
|
||||
depends on BLK && DM_MMC
|
||||
|
||||
@@ -45,6 +45,7 @@ obj-$(CONFIG_STM32_SDMMC2) += stm32_sdmmc2.o
|
||||
obj-$(CONFIG_MMC_SDHCI) += sdhci.o
|
||||
obj-$(CONFIG_MMC_SDHCI_ATMEL) += atmel_sdhci.o
|
||||
obj-$(CONFIG_MMC_SDHCI_BCM2835) += bcm2835_sdhci.o
|
||||
obj-$(CONFIG_MMC_SDHCI_BCMSTB) += bcmstb_sdhci.o
|
||||
obj-$(CONFIG_MMC_SDHCI_CADENCE) += sdhci-cadence.o
|
||||
obj-$(CONFIG_MMC_SDHCI_KONA) += kona_sdhci.o
|
||||
obj-$(CONFIG_MMC_SDHCI_MSM) += msm_sdhci.o
|
||||
|
||||
67
drivers/mmc/bcmstb_sdhci.c
Normal file
67
drivers/mmc/bcmstb_sdhci.c
Normal file
@@ -0,0 +1,67 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* (C) Copyright 2018 Cisco Systems, Inc.
|
||||
*
|
||||
* Author: Thomas Fitzsimmons <fitzsim@fitzsim.org>
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <mach/sdhci.h>
|
||||
#include <malloc.h>
|
||||
#include <sdhci.h>
|
||||
|
||||
/*
|
||||
* The BCMSTB SDHCI has a quirk in that its actual maximum frequency
|
||||
* capability is 100 MHz. The divisor that is eventually written to
|
||||
* SDHCI_CLOCK_CONTROL is calculated based on what the MMC device
|
||||
* reports, and relative to this maximum frequency.
|
||||
*
|
||||
* This define used to be set to 52000000 (52 MHz), the desired
|
||||
* maximum frequency, but that would result in the communication
|
||||
* actually running at 100 MHz (seemingly without issue), which is
|
||||
* out-of-spec.
|
||||
*
|
||||
* Now, by setting this to 0 (auto-detect), 100 MHz will be read from
|
||||
* the capabilities register, and the resulting divisor will be
|
||||
* doubled, meaning that the clock control register will be set to the
|
||||
* in-spec 52 MHz value.
|
||||
*/
|
||||
#define BCMSTB_SDHCI_MAXIMUM_CLOCK_FREQUENCY 0
|
||||
/*
|
||||
* When the minimum clock frequency is set to 0 (auto-detect), U-Boot
|
||||
* sets it to 100 MHz divided by SDHCI_MAX_DIV_SPEC_300, or 48,875 Hz,
|
||||
* which results in the controller timing out when trying to
|
||||
* communicate with the MMC device. Hard-code this value to 400000
|
||||
* (400 kHz) to prevent this.
|
||||
*/
|
||||
#define BCMSTB_SDHCI_MINIMUM_CLOCK_FREQUENCY 400000
|
||||
|
||||
static char *BCMSTB_SDHCI_NAME = "bcmstb-sdhci";
|
||||
|
||||
/*
|
||||
* This driver has only been tested with eMMC devices; SD devices may
|
||||
* not work.
|
||||
*/
|
||||
int bcmstb_sdhci_init(phys_addr_t regbase)
|
||||
{
|
||||
struct sdhci_host *host = NULL;
|
||||
|
||||
host = (struct sdhci_host *)malloc(sizeof(struct sdhci_host));
|
||||
if (!host) {
|
||||
printf("%s: Failed to allocate memory\n", __func__);
|
||||
return 1;
|
||||
}
|
||||
memset(host, 0, sizeof(*host));
|
||||
|
||||
host->name = BCMSTB_SDHCI_NAME;
|
||||
host->ioaddr = (void *)regbase;
|
||||
host->quirks = 0;
|
||||
|
||||
host->cfg.part_type = PART_TYPE_DOS;
|
||||
|
||||
host->version = sdhci_readw(host, SDHCI_HOST_VERSION);
|
||||
|
||||
return add_sdhci(host,
|
||||
BCMSTB_SDHCI_MAXIMUM_CLOCK_FREQUENCY,
|
||||
BCMSTB_SDHCI_MINIMUM_CLOCK_FREQUENCY);
|
||||
}
|
||||
Reference in New Issue
Block a user