| /* | 
|  * Copyright (C) 2016 Stefan Roese <sr@denx.de> | 
|  * | 
|  * SPDX-License-Identifier:    GPL-2.0+ | 
|  */ | 
|   | 
| #include <common.h> | 
| #include <ahci.h> | 
| #include <dm.h> | 
|   | 
| DECLARE_GLOBAL_DATA_PTR; | 
|   | 
| /* | 
|  * Dummy implementation that can be overwritten by a board | 
|  * specific function | 
|  */ | 
| __weak int board_ahci_enable(void) | 
| { | 
|     return 0; | 
| } | 
|   | 
| #ifdef CONFIG_ARMADA_8K | 
| /* CP110 has different AHCI port addresses */ | 
| void __iomem *ahci_port_base(void __iomem *base, u32 port) | 
| { | 
|     return base + 0x10000 + (port * 0x10000); | 
| } | 
| #endif | 
|   | 
| static int mvebu_ahci_probe(struct udevice *dev) | 
| { | 
|     /* | 
|      * Board specific SATA / AHCI enable code, e.g. enable the | 
|      * AHCI power or deassert reset | 
|      */ | 
|     board_ahci_enable(); | 
|   | 
|     ahci_init(devfdt_get_addr_ptr(dev)); | 
|   | 
|     return 0; | 
| } | 
|   | 
| static const struct udevice_id mvebu_ahci_ids[] = { | 
|     { .compatible = "marvell,armada-3700-ahci" }, | 
|     { .compatible = "marvell,armada-8k-ahci" }, | 
|     { } | 
| }; | 
|   | 
| U_BOOT_DRIVER(ahci_mvebu_drv) = { | 
|     .name        = "ahci_mvebu", | 
|     .id        = UCLASS_AHCI, | 
|     .of_match    = mvebu_ahci_ids, | 
|     .probe        = mvebu_ahci_probe, | 
| }; |