Implement a sata driver for Synopsys DWC sata device based on U-boot driver model.
Signed-off-by: Mugunthan V N <mugunthan...@ti.com> Reviewed-by: Tom Rini <tr...@konsulko.com> --- drivers/block/Kconfig | 7 +++++ drivers/block/Makefile | 2 ++ drivers/block/dwc_ahci.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+) create mode 100644 drivers/block/dwc_ahci.c diff --git a/drivers/block/Kconfig b/drivers/block/Kconfig index 990f768..915c1eb 100644 --- a/drivers/block/Kconfig +++ b/drivers/block/Kconfig @@ -7,3 +7,10 @@ config DISK types can use this, such as AHCI/SATA. It does not provide any standard operations at present. The block device interface has not been converted to driver model. + +config DWC_AHCI + bool "Enable Synopsys DWC AHCI driver support" + depends on DISK + help + Enable this driver to support Sata devices through + Synopsys DWC AHCI module. diff --git a/drivers/block/Makefile b/drivers/block/Makefile index 5eb87e0..c8c876d 100644 --- a/drivers/block/Makefile +++ b/drivers/block/Makefile @@ -6,6 +6,8 @@ # obj-$(CONFIG_DISK) += disk-uclass.o +obj-$(CONFIG_DWC_AHCI) += dwc_ahci.o + obj-$(CONFIG_SCSI_AHCI) += ahci.o obj-$(CONFIG_DWC_AHSATA) += dwc_ahsata.o obj-$(CONFIG_FSL_SATA) += fsl_sata.o diff --git a/drivers/block/dwc_ahci.c b/drivers/block/dwc_ahci.c new file mode 100644 index 0000000..66ab234 --- /dev/null +++ b/drivers/block/dwc_ahci.c @@ -0,0 +1,71 @@ +/* + * DWC SATA platform driver + * + * (C) Copyright 2016 + * Texas Instruments Incorporated, <www.ti.com> + * + * Author: Mugunthan V N <mugunthan...@ti.com> + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include <common.h> +#include <dm.h> +#include <ahci.h> +#include <sata.h> +#include <asm/arch/sata.h> +#include <asm/io.h> + +struct dwc_ahci_priv { + void *base; + void *wrapper_base; +}; + +static int dwc_ahci_ofdata_to_platdata(struct udevice *dev) +{ + struct dwc_ahci_priv *priv = dev_get_priv(dev); + fdt_addr_t addr; + + priv->base = (void *)dev_get_addr(dev); + + addr = dev_get_addr_index(dev, 1); + priv->wrapper_base = (addr != FDT_ADDR_T_NONE) ? (void *)addr : NULL; + + return 0; +} + +static int dwc_ahci_probe(struct udevice *dev) +{ + struct dwc_ahci_priv *priv = dev_get_priv(dev); + int ret; + + if (priv->wrapper_base) { + u32 val = TI_SATA_IDLE_NO | TI_SATA_STANDBY_NO; + + /* Enable SATA module, No Idle, No Standby */ + writel(val, priv->wrapper_base + TI_SATA_SYSCONFIG); + } + + ret = enable_sata_phy(); + if (ret) { + error("Sata phy enable failed\n"); + return ret; + } + + return ahci_init(priv->base); +} + +static const struct udevice_id dwc_ahci_ids[] = { + { .compatible = "snps,dwc-ahci" }, + { } +}; + +U_BOOT_DRIVER(dwc_ahci) = { + .name = "dwc_ahci", + .id = UCLASS_DISK, + .of_match = dwc_ahci_ids, + .ofdata_to_platdata = dwc_ahci_ofdata_to_platdata, + .probe = dwc_ahci_probe, + .priv_auto_alloc_size = sizeof(struct dwc_ahci_priv), + .flags = DM_FLAG_ALLOC_PRIV_DMA, +}; -- 2.7.0.75.g3ee1e0f _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot