diff options
author | Michal Simek <michal.simek@xilinx.com> | 2016-09-08 15:06:22 +0200 |
---|---|---|
committer | Michal Simek <michal.simek@xilinx.com> | 2016-12-20 09:15:27 +0100 |
commit | 49c4c78e70a2285992c67f468bb6ad461f26ab00 (patch) | |
tree | 87fbfbcbc8e5367e87a90f90a3bd3383f811e31b /drivers/block | |
parent | e8a016b53731bba820246c9509ce8ef74c944560 (diff) | |
download | u-boot-imx-49c4c78e70a2285992c67f468bb6ad461f26ab00.zip u-boot-imx-49c4c78e70a2285992c67f468bb6ad461f26ab00.tar.gz u-boot-imx-49c4c78e70a2285992c67f468bb6ad461f26ab00.tar.bz2 |
block: Move ceva driver to DM
This patch also includes ARM64 zynqmp changes:
- Remove platform non DM initialization
- Remove hardcoded sata base address
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'drivers/block')
-rw-r--r-- | drivers/block/Kconfig | 9 | ||||
-rw-r--r-- | drivers/block/sata_ceva.c | 41 |
2 files changed, 48 insertions, 2 deletions
diff --git a/drivers/block/Kconfig b/drivers/block/Kconfig index 7b82ba6..88e66e2 100644 --- a/drivers/block/Kconfig +++ b/drivers/block/Kconfig @@ -39,4 +39,13 @@ config BLOCK_CACHE menu "SATA/SCSI device support" +config SATA_CEVA + bool "Ceva Sata controller" + depends on AHCI + depends on DM_SCSI + help + This option enables Ceva Sata controller hard IP available on Xilinx + ZynqMP. Support up to 2 external devices. Complient with SATA 3.1 and + AHCI 1.3 specifications with hot-plug detect feature. + endmenu diff --git a/drivers/block/sata_ceva.c b/drivers/block/sata_ceva.c index dcc3b90..9b54664 100644 --- a/drivers/block/sata_ceva.c +++ b/drivers/block/sata_ceva.c @@ -5,6 +5,7 @@ * SPDX-License-Identifier: GPL-2.0+ */ #include <common.h> +#include <dm.h> #include <netdev.h> #include <ahci.h> #include <scsi.h> @@ -73,10 +74,9 @@ #define DRV_NAME "ahci-ceva" #define CEVA_FLAG_BROKEN_GEN2 1 -int init_sata(int dev) +static int ceva_init_sata(ulong mmio) { ulong tmp; - ulong mmio = ZYNQMP_SATA_BASEADDR; int i; /* @@ -111,3 +111,40 @@ int init_sata(int dev) } return 0; } + +static int sata_ceva_probe(struct udevice *dev) +{ + struct scsi_platdata *plat = dev_get_platdata(dev); + + ceva_init_sata(plat->base); + return 0; +} + +static const struct udevice_id sata_ceva_ids[] = { + { .compatible = "ceva,ahci-1v84" }, + { } +}; + +static int sata_ceva_ofdata_to_platdata(struct udevice *dev) +{ + struct scsi_platdata *plat = dev_get_platdata(dev); + + plat->base = dev_get_addr(dev); + if (plat->base == FDT_ADDR_T_NONE) + return -EINVAL; + + /* Hardcode number for ceva sata controller */ + plat->max_lun = 1; /* Actually two but untested */ + plat->max_id = 2; + + return 0; +} + +U_BOOT_DRIVER(ceva_host_blk) = { + .name = "ceva_sata", + .id = UCLASS_SCSI, + .of_match = sata_ceva_ids, + .probe = sata_ceva_probe, + .ofdata_to_platdata = sata_ceva_ofdata_to_platdata, + .platdata_auto_alloc_size = sizeof(struct scsi_platdata), +}; |