
Hi Soeren,
On 11/26/2014 01:40 PM, Soeren Moch wrote:
- fix crash when sata device is not initialized
- remove disable_sata_clock() since it is not clear which clock for which device should be disabled here
- call disable_sata_clock() for mx6 in preboot_os instead
Signed-off-by: Soeren Moch smoch@web.de
Cc: Tom Rini trini@ti.com Cc: Nikita Kiryanov nikita@compulab.co.il Cc: Simon Glass sjg@chromium.org Cc: guillaume.gardet@free.fr Cc: Stefano Babic sbabic@denx.de
arch/arm/imx-common/cpu.c | 3 +++ drivers/block/dwc_ahsata.c | 14 ++++++++------ 2 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/arch/arm/imx-common/cpu.c b/arch/arm/imx-common/cpu.c index b58df7d..28ccd29 100644 --- a/arch/arm/imx-common/cpu.c +++ b/arch/arm/imx-common/cpu.c @@ -206,6 +206,9 @@ void arch_preboot_os(void) { #if defined(CONFIG_CMD_SATA) sata_stop(); +#if defined(CONFIG_MX6)
- disable_sata_clock();
+#endif
I think a more proper way to do this might be to mirror the init sequence completely. The simplest init sequence calls setup_sata() somewhere before sata_initialize() is invoked, and the distribution of labor is: - arch/arm/imx-common/sata.c:setup_sata() Turns on clocks - common/cmd_sata.c: sata_initialize() Calls driver init
The inverse would be: - common/cmd_sata.c: sata_stop() Calls driver reset - arch/arm/imx-common/sata.c:disable_sata() Turns off clocks
Thus disable_sata() would need to be defined in arch/arm/imx-common/sata.c; it will call disable_sata_clock(), and be used in cm_fx6's version of stop_sata().
It's a little convoluted, but consistent with the existing code flow, and it also fixes the MX53 problems because arch/arm/imx-common/sata.c is not compiled for this platform.
#endif #if defined(CONFIG_VIDEO_IPUV3) /* disable video before launching O/S */ diff --git a/drivers/block/dwc_ahsata.c b/drivers/block/dwc_ahsata.c index 9a2b547..9e925d1 100644 --- a/drivers/block/dwc_ahsata.c +++ b/drivers/block/dwc_ahsata.c @@ -594,22 +594,24 @@ int init_sata(int dev)
int reset_sata(int dev) {
- struct ahci_probe_ent *probe_ent =
(struct ahci_probe_ent *)sata_dev_desc[dev].priv;
- struct sata_host_regs *host_mmio =
(struct sata_host_regs *)probe_ent->mmio_base;
struct ahci_probe_ent *probe_ent;
struct sata_host_regs *host_mmio;
if (dev < 0 || dev > (CONFIG_SYS_SATA_MAX_DEVICE - 1)) { printf("The sata index %d is out of ranges\n\r", dev); return -1; }
probe_ent = (struct ahci_probe_ent *)sata_dev_desc[dev].priv;
if (NULL == probe_ent)
/* not initialized, so nothing to reset */
return 0;
host_mmio = probe_ent->mmio_base;
The lack of casting generates a warning during compilation: drivers/block/dwc_ahsata.c:610:12: warning: assignment makes pointer from integer without a cast [enabled by default] host_mmio = probe_ent->mmio_base; ^
setbits_le32(&host_mmio->ghc, SATA_HOST_GHC_HR); while (readl(&host_mmio->ghc) & SATA_HOST_GHC_HR) udelay(100);
- disable_sata_clock();
- return 0; }