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
|
#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)
|
|||||||
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 {
|
|||||||
};
|
};
|
||||||
|
|
||||||
int ahci_init(u32 base);
|
int ahci_init(u32 base);
|
||||||
|
int ahci_reset(u32 base);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user