mirror of
https://github.com/u-boot/u-boot.git
synced 2024-11-24 12:44:23 +08:00
ahci: introduce ahci_reset()
Extract controller reset code from ahci_host_init() into separate ahci_reset(). Signed-off-by: Dmitry Lifshitz <lifshitz@compulab.co.il> Reviewed-by: Tom Rini <trini@ti.com>
This commit is contained in:
parent
2a10f8b948
commit
6b68888a33
@ -137,6 +137,33 @@ static void sunxi_dma_init(volatile u8 *port_mmio)
|
||||
}
|
||||
#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)
|
||||
{
|
||||
#ifndef CONFIG_SCSI_AHCI_PLAT
|
||||
@ -156,23 +183,9 @@ static int ahci_host_init(struct ahci_probe_ent *probe_ent)
|
||||
cap_save &= ((1 << 28) | (1 << 17));
|
||||
cap_save |= (1 << 27); /* Staggered Spin-up. Not needed. */
|
||||
|
||||
/* global controller reset */
|
||||
tmp = readl(mmio + HOST_CTL);
|
||||
if ((tmp & HOST_RESET) == 0)
|
||||
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);
|
||||
ret = ahci_reset(probe_ent->mmio_base);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
writel_with_flush(HOST_AHCI_EN, mmio + HOST_CTL);
|
||||
writel(cap_save, mmio + HOST_CAP);
|
||||
|
@ -161,5 +161,6 @@ struct ahci_probe_ent {
|
||||
};
|
||||
|
||||
int ahci_init(u32 base);
|
||||
int ahci_reset(u32 base);
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user