diff options
author | Quinn Jensen <quinn.jensen@freescale.com> | 2007-10-24 21:24:33 -0600 |
---|---|---|
committer | Quinn Jensen <quinn.jensen@freescale.com> | 2007-10-24 21:24:33 -0600 |
commit | 74ca9a1a15a6caa56439abc2f7252a599d5c2757 (patch) | |
tree | 17e0485ef830353cee3104c1e9daf13b89fb4391 /drivers | |
parent | 9ebdc89fa07c17119ce06db8128a5d60341bf922 (diff) |
CR DSPhl24421 Add power handlers to libata pata_fsl driver
PATCH for CR DSPhl24421 Add power handlers to libata pata_fsl driver.
Applies to linux 2.6.22 kernel for MX platforms.
http://www.bitshrine.org/gpp/linux-2.6.22-mx-CR-DSPhl24421-Add-power-handlers-to-libata.patch
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/ata/pata_fsl.c | 58 |
1 files changed, 53 insertions, 5 deletions
diff --git a/drivers/ata/pata_fsl.c b/drivers/ata/pata_fsl.c index 63de60731773..94e3d054be98 100644 --- a/drivers/ata/pata_fsl.c +++ b/drivers/ata/pata_fsl.c @@ -473,13 +473,9 @@ static int __devexit pata_fsl_remove(struct platform_device *pdev) pdev->dev.platform_data; u8 *ata_regs = priv->fsl_ata_regs; - /* Disable interrupts. */ - __raw_writel(0, ata_regs + FSL_ATA_INT_EN); + __raw_writel(0, ata_regs + FSL_ATA_INT_EN); /* Disable interrupts */ mb(); - /* - * Clean up and free everything. - */ ata_host_detach(host); if (plat->exit) @@ -490,9 +486,61 @@ static int __devexit pata_fsl_remove(struct platform_device *pdev) return 0; } +#ifdef CONFIG_PM +static int pata_fsl_suspend(struct platform_device *pdev, pm_message_t state) +{ + struct ata_host *host = dev_get_drvdata(&pdev->dev); + struct pata_fsl_priv *priv = host->private_data; + struct fsl_ata_platform_data *plat = (struct fsl_ata_platform_data *) + pdev->dev.platform_data; + u8 *ata_regs = priv->fsl_ata_regs; + + /* Disable interrupts. */ + __raw_writel(0, ata_regs + FSL_ATA_INT_EN); + mb(); + + if (plat->exit) + plat->exit(); + + return 0; +} + +static int pata_fsl_resume(struct platform_device *pdev) +{ + struct ata_host *host = dev_get_drvdata(&pdev->dev); + struct pata_fsl_priv *priv = host->private_data; + struct fsl_ata_platform_data *plat = (struct fsl_ata_platform_data *) + pdev->dev.platform_data; + u8 *ata_regs = priv->fsl_ata_regs; + + if (plat->init && plat->init(pdev)) { + return -ENODEV; + } + + /* Deassert the reset bit to enable the interface */ + __raw_writel(FSL_ATA_CTRL_ATA_RST_B, ata_regs + FSL_ATA_CONTROL); + mb(); + + /* Set initial timing and mode */ + set_ata_bus_timing(XFER_PIO_4, pdev); + + /* + * Enable hardware interrupts. + */ + __raw_writel(FSL_ATA_INTR_ATA_INTRQ2, ata_regs + FSL_ATA_INT_EN); + mb(); + + return 0; +} +#endif + static struct platform_driver pata_fsl_driver = { .probe = pata_fsl_probe, .remove = __devexit_p(pata_fsl_remove), +#ifdef CONFIG_PM + .suspend = pata_fsl_suspend, + .resume = pata_fsl_resume, +#endif .driver = { .name = DRV_NAME, .owner = THIS_MODULE, |