summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Gibbs <richard.gibbs@calxeda.com>2013-08-24 10:10:47 -0500
committerTom Rini <trini@ti.com>2013-09-06 13:09:07 -0400
commit2915a0223ae9632c9f555809ed20b3257ea47949 (patch)
treefa0af40eae314c9f13eca6f30d14343755548e0c
parent4412db46468d5965da736d06f84d13e68a6e0b51 (diff)
downloadu-boot-imx-2915a0223ae9632c9f555809ed20b3257ea47949.zip
u-boot-imx-2915a0223ae9632c9f555809ed20b3257ea47949.tar.gz
u-boot-imx-2915a0223ae9632c9f555809ed20b3257ea47949.tar.bz2
ahci: use ports implemented map instead of num_ports
The AHCI driver was incorrectly using the Capabilities register NP (number of ports) field to determine which ports to activate. This commit changes it to correctly use the PORTS_IMPL register as a port map. Signed-off-by: Richard Gibbs <richard.gibbs@calxeda.com> Reviewed-by: Tom Rini <trini@ti.com>
-rw-r--r--drivers/block/ahci.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/block/ahci.c b/drivers/block/ahci.c
index e455ba5..02ba02f 100644
--- a/drivers/block/ahci.c
+++ b/drivers/block/ahci.c
@@ -119,6 +119,7 @@ static int ahci_host_init(struct ahci_probe_ent *probe_ent)
u32 tmp, cap_save, cmd;
int i, j;
volatile u8 *port_mmio;
+ u32 port_map;
debug("ahci_host_init: start\n");
@@ -160,6 +161,7 @@ static int ahci_host_init(struct ahci_probe_ent *probe_ent)
#endif
probe_ent->cap = readl(mmio + HOST_CAP);
probe_ent->port_map = readl(mmio + HOST_PORTS_IMPL);
+ port_map = probe_ent->port_map;
probe_ent->n_ports = (probe_ent->cap & 0x1f) + 1;
debug("cap 0x%x port_map 0x%x n_ports %d\n",
@@ -169,6 +171,8 @@ static int ahci_host_init(struct ahci_probe_ent *probe_ent)
probe_ent->n_ports = CONFIG_SYS_SCSI_MAX_SCSI_ID;
for (i = 0; i < probe_ent->n_ports; i++) {
+ if (!(port_map & (1 << i)))
+ continue;
probe_ent->port[i].port_mmio = ahci_port_base((u32) mmio, i);
port_mmio = (u8 *) probe_ent->port[i].port_mmio;
ahci_setup_port(&probe_ent->port[i], (unsigned long)mmio, i);