From mboxrd@z Thu Jan 1 00:00:00 1970 From: Nikita Kiryanov Date: Wed, 26 Nov 2014 19:38:00 +0200 Subject: [U-Boot] [PATCH] sata: fix reset_sata for dwc_ahsata In-Reply-To: <1417002047-4644-1-git-send-email-smoch@web.de> References: <54752EB7.9060108@web.de> <1417002047-4644-1-git-send-email-smoch@web.de> Message-ID: <54760FF8.6050002@compulab.co.il> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de 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 > --- > Cc: Tom Rini > Cc: Nikita Kiryanov > Cc: Simon Glass > Cc: guillaume.gardet at free.fr > Cc: Stefano Babic > --- > 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; > } > > -- Regards, Nikita Kiryanov