Skip to content
Snippets Groups Projects
Commit 6b68888a authored by Dmitry Lifshitz's avatar Dmitry Lifshitz Committed by Tom Rini
Browse files

ahci: introduce ahci_reset()


Extract controller reset code from ahci_host_init() into separate
ahci_reset().

Signed-off-by: default avatarDmitry Lifshitz <lifshitz@compulab.co.il>
Reviewed-by: default avatarTom Rini <trini@ti.com>
parent 2a10f8b9
No related branches found
No related tags found
No related merge requests found
...@@ -137,6 +137,33 @@ static void sunxi_dma_init(volatile u8 *port_mmio) ...@@ -137,6 +137,33 @@ static void sunxi_dma_init(volatile u8 *port_mmio)
} }
#endif #endif
int ahci_reset(u32 base)
{
int i = 1000;
u32 host_ctl_reg = base + HOST_CTL;
u32 tmp = readl(host_ctl_reg); /* global controller reset */
if ((tmp & HOST_RESET) == 0)
writel_with_flush(tmp | HOST_RESET, host_ctl_reg);
/*
* reset must complete within 1 second, or
* the hardware should be considered fried.
*/
do {
udelay(1000);
tmp = readl(host_ctl_reg);
i--;
} while ((i > 0) && (tmp & HOST_RESET));
if (i == 0) {
printf("controller reset failed (0x%x)\n", tmp);
return -1;
}
return 0;
}
static int ahci_host_init(struct ahci_probe_ent *probe_ent) static int ahci_host_init(struct ahci_probe_ent *probe_ent)
{ {
#ifndef CONFIG_SCSI_AHCI_PLAT #ifndef CONFIG_SCSI_AHCI_PLAT
...@@ -156,23 +183,9 @@ static int ahci_host_init(struct ahci_probe_ent *probe_ent) ...@@ -156,23 +183,9 @@ static int ahci_host_init(struct ahci_probe_ent *probe_ent)
cap_save &= ((1 << 28) | (1 << 17)); cap_save &= ((1 << 28) | (1 << 17));
cap_save |= (1 << 27); /* Staggered Spin-up. Not needed. */ cap_save |= (1 << 27); /* Staggered Spin-up. Not needed. */
/* global controller reset */ ret = ahci_reset(probe_ent->mmio_base);
tmp = readl(mmio + HOST_CTL); if (ret)
if ((tmp & HOST_RESET) == 0) return ret;
writel_with_flush(tmp | HOST_RESET, mmio + HOST_CTL);
/* reset must complete within 1 second, or
* the hardware should be considered fried.
*/
i = 1000;
do {
udelay(1000);
tmp = readl(mmio + HOST_CTL);
if (!i--) {
debug("controller reset failed (0x%x)\n", tmp);
return -1;
}
} while (tmp & HOST_RESET);
writel_with_flush(HOST_AHCI_EN, mmio + HOST_CTL); writel_with_flush(HOST_AHCI_EN, mmio + HOST_CTL);
writel(cap_save, mmio + HOST_CAP); writel(cap_save, mmio + HOST_CAP);
......
...@@ -161,5 +161,6 @@ struct ahci_probe_ent { ...@@ -161,5 +161,6 @@ struct ahci_probe_ent {
}; };
int ahci_init(u32 base); int ahci_init(u32 base);
int ahci_reset(u32 base);
#endif #endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment