]>
Commit | Line | Data |
---|---|---|
83d290c5 | 1 | // SPDX-License-Identifier: GPL-2.0+ |
02a4b429 JJH |
2 | /* |
3 | * DWC SATA platform driver | |
4 | * | |
5 | * (C) Copyright 2016 | |
6 | * Texas Instruments Incorporated, <www.ti.com> | |
7 | * | |
8 | * Author: Mugunthan V N <[email protected]> | |
02a4b429 JJH |
9 | */ |
10 | ||
11 | #include <common.h> | |
12 | #include <dm.h> | |
13 | #include <ahci.h> | |
14 | #include <scsi.h> | |
15 | #include <sata.h> | |
16 | #include <asm/arch/sata.h> | |
17 | #include <asm/io.h> | |
18 | #include <generic-phy.h> | |
19 | ||
02a4b429 JJH |
20 | struct dwc_ahci_priv { |
21 | void *base; | |
22 | void *wrapper_base; | |
23 | }; | |
24 | ||
64563f53 JJH |
25 | static int dwc_ahci_bind(struct udevice *dev) |
26 | { | |
27 | struct udevice *scsi_dev; | |
28 | ||
29 | return ahci_bind_scsi(dev, &scsi_dev); | |
30 | } | |
31 | ||
02a4b429 JJH |
32 | static int dwc_ahci_ofdata_to_platdata(struct udevice *dev) |
33 | { | |
34 | struct dwc_ahci_priv *priv = dev_get_priv(dev); | |
02a4b429 JJH |
35 | fdt_addr_t addr; |
36 | ||
7208396b | 37 | priv->base = map_physmem(devfdt_get_addr(dev), sizeof(void *), |
02a4b429 JJH |
38 | MAP_NOCACHE); |
39 | ||
a821c4af | 40 | addr = devfdt_get_addr_index(dev, 1); |
02a4b429 JJH |
41 | if (addr != FDT_ADDR_T_NONE) { |
42 | priv->wrapper_base = map_physmem(addr, sizeof(void *), | |
43 | MAP_NOCACHE); | |
44 | } else { | |
45 | priv->wrapper_base = NULL; | |
46 | } | |
47 | ||
48 | return 0; | |
49 | } | |
50 | ||
51 | static int dwc_ahci_probe(struct udevice *dev) | |
52 | { | |
53 | struct dwc_ahci_priv *priv = dev_get_priv(dev); | |
54 | int ret; | |
55 | struct phy phy; | |
56 | ||
57 | ret = generic_phy_get_by_name(dev, "sata-phy", &phy); | |
58 | if (ret) { | |
9b643e31 | 59 | pr_err("can't get the phy from DT\n"); |
02a4b429 JJH |
60 | return ret; |
61 | } | |
62 | ||
63 | ret = generic_phy_init(&phy); | |
64 | if (ret) { | |
9b643e31 | 65 | pr_err("unable to initialize the sata phy\n"); |
02a4b429 JJH |
66 | return ret; |
67 | } | |
68 | ||
69 | ret = generic_phy_power_on(&phy); | |
70 | if (ret) { | |
9b643e31 | 71 | pr_err("unable to power on the sata phy\n"); |
02a4b429 JJH |
72 | return ret; |
73 | } | |
74 | ||
75 | if (priv->wrapper_base) { | |
76 | u32 val = TI_SATA_IDLE_NO | TI_SATA_STANDBY_NO; | |
77 | ||
78 | /* Enable SATA module, No Idle, No Standby */ | |
79 | writel(val, priv->wrapper_base + TI_SATA_SYSCONFIG); | |
80 | } | |
81 | ||
64563f53 | 82 | return ahci_probe_scsi(dev, (ulong)priv->base); |
02a4b429 JJH |
83 | } |
84 | ||
85 | static const struct udevice_id dwc_ahci_ids[] = { | |
86 | { .compatible = "snps,dwc-ahci" }, | |
87 | { } | |
88 | }; | |
89 | ||
90 | U_BOOT_DRIVER(dwc_ahci) = { | |
91 | .name = "dwc_ahci", | |
64563f53 | 92 | .id = UCLASS_AHCI, |
02a4b429 | 93 | .of_match = dwc_ahci_ids, |
64563f53 | 94 | .bind = dwc_ahci_bind, |
02a4b429 | 95 | .ofdata_to_platdata = dwc_ahci_ofdata_to_platdata, |
f6ab5a92 | 96 | .ops = &scsi_ops, |
02a4b429 JJH |
97 | .probe = dwc_ahci_probe, |
98 | .priv_auto_alloc_size = sizeof(struct dwc_ahci_priv), | |
02a4b429 | 99 | }; |