From: Brian Norris <computersforpeace@gmail.com>
To: Jeff Garzik <jgarzik@pobox.com>
Cc: linux-ide@vger.kernel.org,
Brian Norris <computersforpeace@gmail.com>,
Tejun Heo <tj@kernel.org>
Subject: [PATCH 03/14] ahci_platform: perform platform exit in host_stop() hook
Date: Fri, 2 Nov 2012 00:46:17 -0700 [thread overview]
Message-ID: <1351842388-27210-4-git-send-email-computersforpeace@gmail.com> (raw)
In-Reply-To: <1351842388-27210-1-git-send-email-computersforpeace@gmail.com>
AHCI platform devices may provide an exit() routine, via
ahci_platform_data, that powers off the SATA core. Such a routine should
be executed from the ata_port_operations host_stop() hook. That way, the
ATA subsystem can perform any last-minute hardware cleanup (via devres,
for example), then trigger the power-off at the appropriate time.
This patch fixes bus errors triggered during module removal or device
unbinding, seen on an SoC SATA core.
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
---
drivers/ata/ahci_platform.c | 30 +++++++++++++++++++++++-------
1 file changed, 23 insertions(+), 7 deletions(-)
diff --git a/drivers/ata/ahci_platform.c b/drivers/ata/ahci_platform.c
index 8ae1c6f..05806e0 100644
--- a/drivers/ata/ahci_platform.c
+++ b/drivers/ata/ahci_platform.c
@@ -25,6 +25,8 @@
#include <linux/ahci_platform.h>
#include "ahci.h"
+static void ahci_host_stop(struct ata_host *host);
+
enum ahci_type {
AHCI, /* standard platform ahci */
IMX53_AHCI, /* ahci on i.mx53 */
@@ -47,6 +49,15 @@ static struct platform_device_id ahci_devtype[] = {
};
MODULE_DEVICE_TABLE(platform, ahci_devtype);
+struct ata_port_operations ahci_platform_ops = {
+ .inherits = &ahci_ops,
+ .host_stop = ahci_host_stop,
+};
+
+struct ata_port_operations ahci_platform_retry_srst_ops = {
+ .inherits = &ahci_pmp_retry_srst_ops,
+ .host_stop = ahci_host_stop,
+};
static const struct ata_port_info ahci_port_info[] = {
/* by features */
@@ -54,20 +65,20 @@ static const struct ata_port_info ahci_port_info[] = {
.flags = AHCI_FLAG_COMMON,
.pio_mask = ATA_PIO4,
.udma_mask = ATA_UDMA6,
- .port_ops = &ahci_ops,
+ .port_ops = &ahci_platform_ops,
},
[IMX53_AHCI] = {
.flags = AHCI_FLAG_COMMON,
.pio_mask = ATA_PIO4,
.udma_mask = ATA_UDMA6,
- .port_ops = &ahci_pmp_retry_srst_ops,
+ .port_ops = &ahci_platform_retry_srst_ops,
},
[STRICT_AHCI] = {
AHCI_HFLAGS (AHCI_HFLAG_DELAY_ENGINE),
.flags = AHCI_FLAG_COMMON,
.pio_mask = ATA_PIO4,
.udma_mask = ATA_UDMA6,
- .port_ops = &ahci_ops,
+ .port_ops = &ahci_platform_ops,
},
};
@@ -221,12 +232,19 @@ free_clk:
static int __devexit ahci_remove(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
- struct ahci_platform_data *pdata = dev_get_platdata(dev);
struct ata_host *host = dev_get_drvdata(dev);
- struct ahci_host_priv *hpriv = host->private_data;
ata_host_detach(host);
+ return 0;
+}
+
+static void ahci_host_stop(struct ata_host *host)
+{
+ struct device *dev = host->dev;
+ struct ahci_platform_data *pdata = dev_get_platdata(dev);
+ struct ahci_host_priv *hpriv = host->private_data;
+
if (pdata && pdata->exit)
pdata->exit(dev);
@@ -234,8 +252,6 @@ static int __devexit ahci_remove(struct platform_device *pdev)
clk_disable_unprepare(hpriv->clk);
clk_put(hpriv->clk);
}
-
- return 0;
}
#ifdef CONFIG_PM
--
1.7.11.3
next prev parent reply other threads:[~2012-11-02 7:46 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-02 7:46 [PATCH 00/14] ahci/libata: clean up platform device removal Brian Norris
2012-11-02 7:46 ` [PATCH 01/14] ahci_platform: enable hotplug unbinding Brian Norris
2012-11-02 7:46 ` [PATCH 02/14] ahci_platform: convert to module_platform_driver Brian Norris
2012-11-02 7:46 ` Brian Norris [this message]
2012-11-02 7:46 ` [PATCH 04/14] libata: implement ata_platform_remove_one() Brian Norris
2012-11-02 11:07 ` Sergei Shtylyov
2012-11-02 19:05 ` Brian Norris
2012-11-02 19:09 ` [PATCH v2 " Brian Norris
2012-11-02 19:29 ` [PATCH v3 " Brian Norris
2012-11-02 20:12 ` [PATCH v2 " Sergei Shtylyov
2012-11-02 19:29 ` Brian Norris
2012-11-02 7:46 ` [PATCH 05/14] ahci_platform: utilize common ata_platform_remove_one() Brian Norris
2012-11-02 7:46 ` [PATCH 06/14] pata_ixp4xx_cf: " Brian Norris
2012-11-02 7:46 ` [PATCH 07/14] pata_mpc52xx: " Brian Norris
2012-11-02 7:46 ` [PATCH 08/14] pata_of_platform: " Brian Norris
2012-11-02 7:46 ` [PATCH 09/14] pata_platform: " Brian Norris
2012-11-02 7:46 ` [PATCH 10/14] ata_platform: remove unused remove function Brian Norris
2012-11-02 7:46 ` [PATCH 11/14] pata_palmld: utilize common ata_platform_remove_one() Brian Norris
2012-11-02 7:46 ` [PATCH 12/14] sata_highbank: " Brian Norris
2012-11-02 19:12 ` [PATCH v2 " Brian Norris
2012-12-03 10:17 ` Jeff Garzik
2012-12-03 18:12 ` Brian Norris
2012-11-02 7:46 ` [PATCH 13/14] pata_octeon_cf: perform host detach, removal on exit Brian Norris
2012-11-02 7:46 ` [PATCH 14/14] libata: use pci_get_drvdata() helper Brian Norris
2012-11-02 17:01 ` [PATCH 00/14] ahci/libata: clean up platform device removal Tejun Heo
2012-11-02 19:03 ` Brian Norris
2012-11-02 19:04 ` Tejun Heo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1351842388-27210-4-git-send-email-computersforpeace@gmail.com \
--to=computersforpeace@gmail.com \
--cc=jgarzik@pobox.com \
--cc=linux-ide@vger.kernel.org \
--cc=tj@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.