diff options
Diffstat (limited to 'target/linux/sunxi/patches-3.13/160-ahci-add-pre-start-hook.patch')
-rw-r--r-- | target/linux/sunxi/patches-3.13/160-ahci-add-pre-start-hook.patch | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/target/linux/sunxi/patches-3.13/160-ahci-add-pre-start-hook.patch b/target/linux/sunxi/patches-3.13/160-ahci-add-pre-start-hook.patch new file mode 100644 index 0000000..342c114 --- /dev/null +++ b/target/linux/sunxi/patches-3.13/160-ahci-add-pre-start-hook.patch @@ -0,0 +1,53 @@ +From 3eec76bc21d78e56ac8404b59f29dd9dbbd1528a Mon Sep 17 00:00:00 2001 +From: Oliver Schinagl <oliver@schinagl.nl> +Date: Mon, 2 Dec 2013 16:13:32 +0100 +Subject: [PATCH] libahci: Add a pre ahci_start_engine hook + +Allwinner A10 and A20 ARM SoCs have an AHCI sata controller which need a +special register to be poked before starting the DMA engine. + +This register gets reset on an ahci_stop_engine call, so there is no other +place then ahci_start_engine where this poking can be done. + +This commit adds a pre ahci_start_engine hook for use by the Allwinner AHCI +driver (and potentially other drivers in the future). + +Signed-off-by: Hans de Goede <hdegoede@redhat.com> +--- + drivers/ata/ahci.h | 2 ++ + drivers/ata/libahci.c | 4 ++++ + 2 files changed, 6 insertions(+) + +diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h +index 2289efd..1bba479 100644 +--- a/drivers/ata/ahci.h ++++ b/drivers/ata/ahci.h +@@ -323,6 +323,8 @@ struct ahci_host_priv { + u32 em_msg_type; /* EM message type */ + struct clk *clk; /* Only for platforms supporting clk */ + void *plat_data; /* Other platform data */ ++ /* Optional pre ahci_start_engine hook */ ++ void (*pre_start_engine)(struct ata_port *ap); + }; + + extern int ahci_ignore_sss; +diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c +index c482f8c..780e9df 100644 +--- a/drivers/ata/libahci.c ++++ b/drivers/ata/libahci.c +@@ -568,8 +568,12 @@ static int ahci_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val) + void ahci_start_engine(struct ata_port *ap) + { + void __iomem *port_mmio = ahci_port_base(ap); ++ struct ahci_host_priv *hpriv = ap->host->private_data; + u32 tmp; + ++ if (hpriv->pre_start_engine) ++ hpriv->pre_start_engine(ap); ++ + /* start DMA */ + tmp = readl(port_mmio + PORT_CMD); + tmp |= PORT_CMD_START; +-- +1.8.5.1 + |