1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * EP93XX PATA controller driver.
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (c) 2012, Metasoft s.c.
6*4882a593Smuzhiyun * Rafal Prylowski <prylowski@metasoft.pl>
7*4882a593Smuzhiyun *
8*4882a593Smuzhiyun * Based on pata_scc.c, pata_icside.c and on earlier version of EP93XX
9*4882a593Smuzhiyun * PATA driver by Lennert Buytenhek and Alessandro Zummo.
10*4882a593Smuzhiyun * Read/Write timings, resource management and other improvements
11*4882a593Smuzhiyun * from driver by Joao Ramos and Bartlomiej Zolnierkiewicz.
12*4882a593Smuzhiyun * DMA engine support based on spi-ep93xx.c by Mika Westerberg.
13*4882a593Smuzhiyun *
14*4882a593Smuzhiyun * Original copyrights:
15*4882a593Smuzhiyun *
16*4882a593Smuzhiyun * Support for Cirrus Logic's EP93xx (EP9312, EP9315) CPUs
17*4882a593Smuzhiyun * PATA host controller driver.
18*4882a593Smuzhiyun *
19*4882a593Smuzhiyun * Copyright (c) 2009, Bartlomiej Zolnierkiewicz
20*4882a593Smuzhiyun *
21*4882a593Smuzhiyun * Heavily based on the ep93xx-ide.c driver:
22*4882a593Smuzhiyun *
23*4882a593Smuzhiyun * Copyright (c) 2009, Joao Ramos <joao.ramos@inov.pt>
24*4882a593Smuzhiyun * INESC Inovacao (INOV)
25*4882a593Smuzhiyun *
26*4882a593Smuzhiyun * EP93XX PATA controller driver.
27*4882a593Smuzhiyun * Copyright (C) 2007 Lennert Buytenhek <buytenh@wantstofly.org>
28*4882a593Smuzhiyun *
29*4882a593Smuzhiyun * An ATA driver for the Cirrus Logic EP93xx PATA controller.
30*4882a593Smuzhiyun *
31*4882a593Smuzhiyun * Based on an earlier version by Alessandro Zummo, which is:
32*4882a593Smuzhiyun * Copyright (C) 2006 Tower Technologies
33*4882a593Smuzhiyun */
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun #include <linux/err.h>
36*4882a593Smuzhiyun #include <linux/kernel.h>
37*4882a593Smuzhiyun #include <linux/module.h>
38*4882a593Smuzhiyun #include <linux/blkdev.h>
39*4882a593Smuzhiyun #include <scsi/scsi_host.h>
40*4882a593Smuzhiyun #include <linux/ata.h>
41*4882a593Smuzhiyun #include <linux/libata.h>
42*4882a593Smuzhiyun #include <linux/platform_device.h>
43*4882a593Smuzhiyun #include <linux/delay.h>
44*4882a593Smuzhiyun #include <linux/dmaengine.h>
45*4882a593Smuzhiyun #include <linux/ktime.h>
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun #include <linux/platform_data/dma-ep93xx.h>
48*4882a593Smuzhiyun #include <linux/soc/cirrus/ep93xx.h>
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun #define DRV_NAME "ep93xx-ide"
51*4882a593Smuzhiyun #define DRV_VERSION "1.0"
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun enum {
54*4882a593Smuzhiyun /* IDE Control Register */
55*4882a593Smuzhiyun IDECTRL = 0x00,
56*4882a593Smuzhiyun IDECTRL_CS0N = (1 << 0),
57*4882a593Smuzhiyun IDECTRL_CS1N = (1 << 1),
58*4882a593Smuzhiyun IDECTRL_DIORN = (1 << 5),
59*4882a593Smuzhiyun IDECTRL_DIOWN = (1 << 6),
60*4882a593Smuzhiyun IDECTRL_INTRQ = (1 << 9),
61*4882a593Smuzhiyun IDECTRL_IORDY = (1 << 10),
62*4882a593Smuzhiyun /*
63*4882a593Smuzhiyun * the device IDE register to be accessed is selected through
64*4882a593Smuzhiyun * IDECTRL register's specific bitfields 'DA', 'CS1N' and 'CS0N':
65*4882a593Smuzhiyun * b4 b3 b2 b1 b0
66*4882a593Smuzhiyun * A2 A1 A0 CS1N CS0N
67*4882a593Smuzhiyun * the values filled in this structure allows the value to be directly
68*4882a593Smuzhiyun * ORed to the IDECTRL register, hence giving directly the A[2:0] and
69*4882a593Smuzhiyun * CS1N/CS0N values for each IDE register.
70*4882a593Smuzhiyun * The values correspond to the transformation:
71*4882a593Smuzhiyun * ((real IDE address) << 2) | CS1N value << 1 | CS0N value
72*4882a593Smuzhiyun */
73*4882a593Smuzhiyun IDECTRL_ADDR_CMD = 0 + 2, /* CS1 */
74*4882a593Smuzhiyun IDECTRL_ADDR_DATA = (ATA_REG_DATA << 2) + 2,
75*4882a593Smuzhiyun IDECTRL_ADDR_ERROR = (ATA_REG_ERR << 2) + 2,
76*4882a593Smuzhiyun IDECTRL_ADDR_FEATURE = (ATA_REG_FEATURE << 2) + 2,
77*4882a593Smuzhiyun IDECTRL_ADDR_NSECT = (ATA_REG_NSECT << 2) + 2,
78*4882a593Smuzhiyun IDECTRL_ADDR_LBAL = (ATA_REG_LBAL << 2) + 2,
79*4882a593Smuzhiyun IDECTRL_ADDR_LBAM = (ATA_REG_LBAM << 2) + 2,
80*4882a593Smuzhiyun IDECTRL_ADDR_LBAH = (ATA_REG_LBAH << 2) + 2,
81*4882a593Smuzhiyun IDECTRL_ADDR_DEVICE = (ATA_REG_DEVICE << 2) + 2,
82*4882a593Smuzhiyun IDECTRL_ADDR_STATUS = (ATA_REG_STATUS << 2) + 2,
83*4882a593Smuzhiyun IDECTRL_ADDR_COMMAND = (ATA_REG_CMD << 2) + 2,
84*4882a593Smuzhiyun IDECTRL_ADDR_ALTSTATUS = (0x06 << 2) + 1, /* CS0 */
85*4882a593Smuzhiyun IDECTRL_ADDR_CTL = (0x06 << 2) + 1, /* CS0 */
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun /* IDE Configuration Register */
88*4882a593Smuzhiyun IDECFG = 0x04,
89*4882a593Smuzhiyun IDECFG_IDEEN = (1 << 0),
90*4882a593Smuzhiyun IDECFG_PIO = (1 << 1),
91*4882a593Smuzhiyun IDECFG_MDMA = (1 << 2),
92*4882a593Smuzhiyun IDECFG_UDMA = (1 << 3),
93*4882a593Smuzhiyun IDECFG_MODE_SHIFT = 4,
94*4882a593Smuzhiyun IDECFG_MODE_MASK = (0xf << 4),
95*4882a593Smuzhiyun IDECFG_WST_SHIFT = 8,
96*4882a593Smuzhiyun IDECFG_WST_MASK = (0x3 << 8),
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun /* MDMA Operation Register */
99*4882a593Smuzhiyun IDEMDMAOP = 0x08,
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun /* UDMA Operation Register */
102*4882a593Smuzhiyun IDEUDMAOP = 0x0c,
103*4882a593Smuzhiyun IDEUDMAOP_UEN = (1 << 0),
104*4882a593Smuzhiyun IDEUDMAOP_RWOP = (1 << 1),
105*4882a593Smuzhiyun
106*4882a593Smuzhiyun /* PIO/MDMA/UDMA Data Registers */
107*4882a593Smuzhiyun IDEDATAOUT = 0x10,
108*4882a593Smuzhiyun IDEDATAIN = 0x14,
109*4882a593Smuzhiyun IDEMDMADATAOUT = 0x18,
110*4882a593Smuzhiyun IDEMDMADATAIN = 0x1c,
111*4882a593Smuzhiyun IDEUDMADATAOUT = 0x20,
112*4882a593Smuzhiyun IDEUDMADATAIN = 0x24,
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun /* UDMA Status Register */
115*4882a593Smuzhiyun IDEUDMASTS = 0x28,
116*4882a593Smuzhiyun IDEUDMASTS_DMAIDE = (1 << 16),
117*4882a593Smuzhiyun IDEUDMASTS_INTIDE = (1 << 17),
118*4882a593Smuzhiyun IDEUDMASTS_SBUSY = (1 << 18),
119*4882a593Smuzhiyun IDEUDMASTS_NDO = (1 << 24),
120*4882a593Smuzhiyun IDEUDMASTS_NDI = (1 << 25),
121*4882a593Smuzhiyun IDEUDMASTS_N4X = (1 << 26),
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun /* UDMA Debug Status Register */
124*4882a593Smuzhiyun IDEUDMADEBUG = 0x2c,
125*4882a593Smuzhiyun };
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun struct ep93xx_pata_data {
128*4882a593Smuzhiyun const struct platform_device *pdev;
129*4882a593Smuzhiyun void __iomem *ide_base;
130*4882a593Smuzhiyun struct ata_timing t;
131*4882a593Smuzhiyun bool iordy;
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun unsigned long udma_in_phys;
134*4882a593Smuzhiyun unsigned long udma_out_phys;
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun struct dma_chan *dma_rx_channel;
137*4882a593Smuzhiyun struct ep93xx_dma_data dma_rx_data;
138*4882a593Smuzhiyun struct dma_chan *dma_tx_channel;
139*4882a593Smuzhiyun struct ep93xx_dma_data dma_tx_data;
140*4882a593Smuzhiyun };
141*4882a593Smuzhiyun
ep93xx_pata_clear_regs(void __iomem * base)142*4882a593Smuzhiyun static void ep93xx_pata_clear_regs(void __iomem *base)
143*4882a593Smuzhiyun {
144*4882a593Smuzhiyun writel(IDECTRL_CS0N | IDECTRL_CS1N | IDECTRL_DIORN |
145*4882a593Smuzhiyun IDECTRL_DIOWN, base + IDECTRL);
146*4882a593Smuzhiyun
147*4882a593Smuzhiyun writel(0, base + IDECFG);
148*4882a593Smuzhiyun writel(0, base + IDEMDMAOP);
149*4882a593Smuzhiyun writel(0, base + IDEUDMAOP);
150*4882a593Smuzhiyun writel(0, base + IDEDATAOUT);
151*4882a593Smuzhiyun writel(0, base + IDEDATAIN);
152*4882a593Smuzhiyun writel(0, base + IDEMDMADATAOUT);
153*4882a593Smuzhiyun writel(0, base + IDEMDMADATAIN);
154*4882a593Smuzhiyun writel(0, base + IDEUDMADATAOUT);
155*4882a593Smuzhiyun writel(0, base + IDEUDMADATAIN);
156*4882a593Smuzhiyun writel(0, base + IDEUDMADEBUG);
157*4882a593Smuzhiyun }
158*4882a593Smuzhiyun
ep93xx_pata_check_iordy(void __iomem * base)159*4882a593Smuzhiyun static bool ep93xx_pata_check_iordy(void __iomem *base)
160*4882a593Smuzhiyun {
161*4882a593Smuzhiyun return !!(readl(base + IDECTRL) & IDECTRL_IORDY);
162*4882a593Smuzhiyun }
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun /*
165*4882a593Smuzhiyun * According to EP93xx User's Guide, WST field of IDECFG specifies number
166*4882a593Smuzhiyun * of HCLK cycles to hold the data bus after a PIO write operation.
167*4882a593Smuzhiyun * It should be programmed to guarantee following delays:
168*4882a593Smuzhiyun *
169*4882a593Smuzhiyun * PIO Mode [ns]
170*4882a593Smuzhiyun * 0 30
171*4882a593Smuzhiyun * 1 20
172*4882a593Smuzhiyun * 2 15
173*4882a593Smuzhiyun * 3 10
174*4882a593Smuzhiyun * 4 5
175*4882a593Smuzhiyun *
176*4882a593Smuzhiyun * Maximum possible value for HCLK is 100MHz.
177*4882a593Smuzhiyun */
ep93xx_pata_get_wst(int pio_mode)178*4882a593Smuzhiyun static int ep93xx_pata_get_wst(int pio_mode)
179*4882a593Smuzhiyun {
180*4882a593Smuzhiyun int val;
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun if (pio_mode == 0)
183*4882a593Smuzhiyun val = 3;
184*4882a593Smuzhiyun else if (pio_mode < 3)
185*4882a593Smuzhiyun val = 2;
186*4882a593Smuzhiyun else
187*4882a593Smuzhiyun val = 1;
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun return val << IDECFG_WST_SHIFT;
190*4882a593Smuzhiyun }
191*4882a593Smuzhiyun
ep93xx_pata_enable_pio(void __iomem * base,int pio_mode)192*4882a593Smuzhiyun static void ep93xx_pata_enable_pio(void __iomem *base, int pio_mode)
193*4882a593Smuzhiyun {
194*4882a593Smuzhiyun writel(IDECFG_IDEEN | IDECFG_PIO |
195*4882a593Smuzhiyun ep93xx_pata_get_wst(pio_mode) |
196*4882a593Smuzhiyun (pio_mode << IDECFG_MODE_SHIFT), base + IDECFG);
197*4882a593Smuzhiyun }
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun /*
200*4882a593Smuzhiyun * Based on delay loop found in mach-pxa/mp900.c.
201*4882a593Smuzhiyun *
202*4882a593Smuzhiyun * Single iteration should take 5 cpu cycles. This is 25ns assuming the
203*4882a593Smuzhiyun * fastest ep93xx cpu speed (200MHz) and is better optimized for PIO4 timings
204*4882a593Smuzhiyun * than eg. 20ns.
205*4882a593Smuzhiyun */
ep93xx_pata_delay(unsigned long count)206*4882a593Smuzhiyun static void ep93xx_pata_delay(unsigned long count)
207*4882a593Smuzhiyun {
208*4882a593Smuzhiyun __asm__ volatile (
209*4882a593Smuzhiyun "0:\n"
210*4882a593Smuzhiyun "mov r0, r0\n"
211*4882a593Smuzhiyun "subs %0, %1, #1\n"
212*4882a593Smuzhiyun "bge 0b\n"
213*4882a593Smuzhiyun : "=r" (count)
214*4882a593Smuzhiyun : "0" (count)
215*4882a593Smuzhiyun );
216*4882a593Smuzhiyun }
217*4882a593Smuzhiyun
ep93xx_pata_wait_for_iordy(void __iomem * base,unsigned long t2)218*4882a593Smuzhiyun static unsigned long ep93xx_pata_wait_for_iordy(void __iomem *base,
219*4882a593Smuzhiyun unsigned long t2)
220*4882a593Smuzhiyun {
221*4882a593Smuzhiyun /*
222*4882a593Smuzhiyun * According to ATA specification, IORDY pin can be first sampled
223*4882a593Smuzhiyun * tA = 35ns after activation of DIOR-/DIOW-. Maximum IORDY pulse
224*4882a593Smuzhiyun * width is tB = 1250ns.
225*4882a593Smuzhiyun *
226*4882a593Smuzhiyun * We are already t2 delay loop iterations after activation of
227*4882a593Smuzhiyun * DIOR-/DIOW-, so we set timeout to (1250 + 35) / 25 - t2 additional
228*4882a593Smuzhiyun * delay loop iterations.
229*4882a593Smuzhiyun */
230*4882a593Smuzhiyun unsigned long start = (1250 + 35) / 25 - t2;
231*4882a593Smuzhiyun unsigned long counter = start;
232*4882a593Smuzhiyun
233*4882a593Smuzhiyun while (!ep93xx_pata_check_iordy(base) && counter--)
234*4882a593Smuzhiyun ep93xx_pata_delay(1);
235*4882a593Smuzhiyun return start - counter;
236*4882a593Smuzhiyun }
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun /* common part at start of ep93xx_pata_read/write() */
ep93xx_pata_rw_begin(void __iomem * base,unsigned long addr,unsigned long t1)239*4882a593Smuzhiyun static void ep93xx_pata_rw_begin(void __iomem *base, unsigned long addr,
240*4882a593Smuzhiyun unsigned long t1)
241*4882a593Smuzhiyun {
242*4882a593Smuzhiyun writel(IDECTRL_DIOWN | IDECTRL_DIORN | addr, base + IDECTRL);
243*4882a593Smuzhiyun ep93xx_pata_delay(t1);
244*4882a593Smuzhiyun }
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun /* common part at end of ep93xx_pata_read/write() */
ep93xx_pata_rw_end(void __iomem * base,unsigned long addr,bool iordy,unsigned long t0,unsigned long t2,unsigned long t2i)247*4882a593Smuzhiyun static void ep93xx_pata_rw_end(void __iomem *base, unsigned long addr,
248*4882a593Smuzhiyun bool iordy, unsigned long t0, unsigned long t2,
249*4882a593Smuzhiyun unsigned long t2i)
250*4882a593Smuzhiyun {
251*4882a593Smuzhiyun ep93xx_pata_delay(t2);
252*4882a593Smuzhiyun /* lengthen t2 if needed */
253*4882a593Smuzhiyun if (iordy)
254*4882a593Smuzhiyun t2 += ep93xx_pata_wait_for_iordy(base, t2);
255*4882a593Smuzhiyun writel(IDECTRL_DIOWN | IDECTRL_DIORN | addr, base + IDECTRL);
256*4882a593Smuzhiyun if (t0 > t2 && t0 - t2 > t2i)
257*4882a593Smuzhiyun ep93xx_pata_delay(t0 - t2);
258*4882a593Smuzhiyun else
259*4882a593Smuzhiyun ep93xx_pata_delay(t2i);
260*4882a593Smuzhiyun }
261*4882a593Smuzhiyun
ep93xx_pata_read(struct ep93xx_pata_data * drv_data,unsigned long addr,bool reg)262*4882a593Smuzhiyun static u16 ep93xx_pata_read(struct ep93xx_pata_data *drv_data,
263*4882a593Smuzhiyun unsigned long addr,
264*4882a593Smuzhiyun bool reg)
265*4882a593Smuzhiyun {
266*4882a593Smuzhiyun void __iomem *base = drv_data->ide_base;
267*4882a593Smuzhiyun const struct ata_timing *t = &drv_data->t;
268*4882a593Smuzhiyun unsigned long t0 = reg ? t->cyc8b : t->cycle;
269*4882a593Smuzhiyun unsigned long t2 = reg ? t->act8b : t->active;
270*4882a593Smuzhiyun unsigned long t2i = reg ? t->rec8b : t->recover;
271*4882a593Smuzhiyun
272*4882a593Smuzhiyun ep93xx_pata_rw_begin(base, addr, t->setup);
273*4882a593Smuzhiyun writel(IDECTRL_DIOWN | addr, base + IDECTRL);
274*4882a593Smuzhiyun /*
275*4882a593Smuzhiyun * The IDEDATAIN register is loaded from the DD pins at the positive
276*4882a593Smuzhiyun * edge of the DIORN signal. (EP93xx UG p27-14)
277*4882a593Smuzhiyun */
278*4882a593Smuzhiyun ep93xx_pata_rw_end(base, addr, drv_data->iordy, t0, t2, t2i);
279*4882a593Smuzhiyun return readl(base + IDEDATAIN);
280*4882a593Smuzhiyun }
281*4882a593Smuzhiyun
282*4882a593Smuzhiyun /* IDE register read */
ep93xx_pata_read_reg(struct ep93xx_pata_data * drv_data,unsigned long addr)283*4882a593Smuzhiyun static u16 ep93xx_pata_read_reg(struct ep93xx_pata_data *drv_data,
284*4882a593Smuzhiyun unsigned long addr)
285*4882a593Smuzhiyun {
286*4882a593Smuzhiyun return ep93xx_pata_read(drv_data, addr, true);
287*4882a593Smuzhiyun }
288*4882a593Smuzhiyun
289*4882a593Smuzhiyun /* PIO data read */
ep93xx_pata_read_data(struct ep93xx_pata_data * drv_data,unsigned long addr)290*4882a593Smuzhiyun static u16 ep93xx_pata_read_data(struct ep93xx_pata_data *drv_data,
291*4882a593Smuzhiyun unsigned long addr)
292*4882a593Smuzhiyun {
293*4882a593Smuzhiyun return ep93xx_pata_read(drv_data, addr, false);
294*4882a593Smuzhiyun }
295*4882a593Smuzhiyun
ep93xx_pata_write(struct ep93xx_pata_data * drv_data,u16 value,unsigned long addr,bool reg)296*4882a593Smuzhiyun static void ep93xx_pata_write(struct ep93xx_pata_data *drv_data,
297*4882a593Smuzhiyun u16 value, unsigned long addr,
298*4882a593Smuzhiyun bool reg)
299*4882a593Smuzhiyun {
300*4882a593Smuzhiyun void __iomem *base = drv_data->ide_base;
301*4882a593Smuzhiyun const struct ata_timing *t = &drv_data->t;
302*4882a593Smuzhiyun unsigned long t0 = reg ? t->cyc8b : t->cycle;
303*4882a593Smuzhiyun unsigned long t2 = reg ? t->act8b : t->active;
304*4882a593Smuzhiyun unsigned long t2i = reg ? t->rec8b : t->recover;
305*4882a593Smuzhiyun
306*4882a593Smuzhiyun ep93xx_pata_rw_begin(base, addr, t->setup);
307*4882a593Smuzhiyun /*
308*4882a593Smuzhiyun * Value from IDEDATAOUT register is driven onto the DD pins when
309*4882a593Smuzhiyun * DIOWN is low. (EP93xx UG p27-13)
310*4882a593Smuzhiyun */
311*4882a593Smuzhiyun writel(value, base + IDEDATAOUT);
312*4882a593Smuzhiyun writel(IDECTRL_DIORN | addr, base + IDECTRL);
313*4882a593Smuzhiyun ep93xx_pata_rw_end(base, addr, drv_data->iordy, t0, t2, t2i);
314*4882a593Smuzhiyun }
315*4882a593Smuzhiyun
316*4882a593Smuzhiyun /* IDE register write */
ep93xx_pata_write_reg(struct ep93xx_pata_data * drv_data,u16 value,unsigned long addr)317*4882a593Smuzhiyun static void ep93xx_pata_write_reg(struct ep93xx_pata_data *drv_data,
318*4882a593Smuzhiyun u16 value, unsigned long addr)
319*4882a593Smuzhiyun {
320*4882a593Smuzhiyun ep93xx_pata_write(drv_data, value, addr, true);
321*4882a593Smuzhiyun }
322*4882a593Smuzhiyun
323*4882a593Smuzhiyun /* PIO data write */
ep93xx_pata_write_data(struct ep93xx_pata_data * drv_data,u16 value,unsigned long addr)324*4882a593Smuzhiyun static void ep93xx_pata_write_data(struct ep93xx_pata_data *drv_data,
325*4882a593Smuzhiyun u16 value, unsigned long addr)
326*4882a593Smuzhiyun {
327*4882a593Smuzhiyun ep93xx_pata_write(drv_data, value, addr, false);
328*4882a593Smuzhiyun }
329*4882a593Smuzhiyun
ep93xx_pata_set_piomode(struct ata_port * ap,struct ata_device * adev)330*4882a593Smuzhiyun static void ep93xx_pata_set_piomode(struct ata_port *ap,
331*4882a593Smuzhiyun struct ata_device *adev)
332*4882a593Smuzhiyun {
333*4882a593Smuzhiyun struct ep93xx_pata_data *drv_data = ap->host->private_data;
334*4882a593Smuzhiyun struct ata_device *pair = ata_dev_pair(adev);
335*4882a593Smuzhiyun /*
336*4882a593Smuzhiyun * Calculate timings for the delay loop, assuming ep93xx cpu speed
337*4882a593Smuzhiyun * is 200MHz (maximum possible for ep93xx). If actual cpu speed is
338*4882a593Smuzhiyun * slower, we will wait a bit longer in each delay.
339*4882a593Smuzhiyun * Additional division of cpu speed by 5, because single iteration
340*4882a593Smuzhiyun * of our delay loop takes 5 cpu cycles (25ns).
341*4882a593Smuzhiyun */
342*4882a593Smuzhiyun unsigned long T = 1000000 / (200 / 5);
343*4882a593Smuzhiyun
344*4882a593Smuzhiyun ata_timing_compute(adev, adev->pio_mode, &drv_data->t, T, 0);
345*4882a593Smuzhiyun if (pair && pair->pio_mode) {
346*4882a593Smuzhiyun struct ata_timing t;
347*4882a593Smuzhiyun ata_timing_compute(pair, pair->pio_mode, &t, T, 0);
348*4882a593Smuzhiyun ata_timing_merge(&t, &drv_data->t, &drv_data->t,
349*4882a593Smuzhiyun ATA_TIMING_SETUP | ATA_TIMING_8BIT);
350*4882a593Smuzhiyun }
351*4882a593Smuzhiyun drv_data->iordy = ata_pio_need_iordy(adev);
352*4882a593Smuzhiyun
353*4882a593Smuzhiyun ep93xx_pata_enable_pio(drv_data->ide_base,
354*4882a593Smuzhiyun adev->pio_mode - XFER_PIO_0);
355*4882a593Smuzhiyun }
356*4882a593Smuzhiyun
357*4882a593Smuzhiyun /* Note: original code is ata_sff_check_status */
ep93xx_pata_check_status(struct ata_port * ap)358*4882a593Smuzhiyun static u8 ep93xx_pata_check_status(struct ata_port *ap)
359*4882a593Smuzhiyun {
360*4882a593Smuzhiyun struct ep93xx_pata_data *drv_data = ap->host->private_data;
361*4882a593Smuzhiyun
362*4882a593Smuzhiyun return ep93xx_pata_read_reg(drv_data, IDECTRL_ADDR_STATUS);
363*4882a593Smuzhiyun }
364*4882a593Smuzhiyun
ep93xx_pata_check_altstatus(struct ata_port * ap)365*4882a593Smuzhiyun static u8 ep93xx_pata_check_altstatus(struct ata_port *ap)
366*4882a593Smuzhiyun {
367*4882a593Smuzhiyun struct ep93xx_pata_data *drv_data = ap->host->private_data;
368*4882a593Smuzhiyun
369*4882a593Smuzhiyun return ep93xx_pata_read_reg(drv_data, IDECTRL_ADDR_ALTSTATUS);
370*4882a593Smuzhiyun }
371*4882a593Smuzhiyun
372*4882a593Smuzhiyun /* Note: original code is ata_sff_tf_load */
ep93xx_pata_tf_load(struct ata_port * ap,const struct ata_taskfile * tf)373*4882a593Smuzhiyun static void ep93xx_pata_tf_load(struct ata_port *ap,
374*4882a593Smuzhiyun const struct ata_taskfile *tf)
375*4882a593Smuzhiyun {
376*4882a593Smuzhiyun struct ep93xx_pata_data *drv_data = ap->host->private_data;
377*4882a593Smuzhiyun unsigned int is_addr = tf->flags & ATA_TFLAG_ISADDR;
378*4882a593Smuzhiyun
379*4882a593Smuzhiyun if (tf->ctl != ap->last_ctl) {
380*4882a593Smuzhiyun ep93xx_pata_write_reg(drv_data, tf->ctl, IDECTRL_ADDR_CTL);
381*4882a593Smuzhiyun ap->last_ctl = tf->ctl;
382*4882a593Smuzhiyun ata_wait_idle(ap);
383*4882a593Smuzhiyun }
384*4882a593Smuzhiyun
385*4882a593Smuzhiyun if (is_addr && (tf->flags & ATA_TFLAG_LBA48)) {
386*4882a593Smuzhiyun ep93xx_pata_write_reg(drv_data, tf->hob_feature,
387*4882a593Smuzhiyun IDECTRL_ADDR_FEATURE);
388*4882a593Smuzhiyun ep93xx_pata_write_reg(drv_data, tf->hob_nsect,
389*4882a593Smuzhiyun IDECTRL_ADDR_NSECT);
390*4882a593Smuzhiyun ep93xx_pata_write_reg(drv_data, tf->hob_lbal,
391*4882a593Smuzhiyun IDECTRL_ADDR_LBAL);
392*4882a593Smuzhiyun ep93xx_pata_write_reg(drv_data, tf->hob_lbam,
393*4882a593Smuzhiyun IDECTRL_ADDR_LBAM);
394*4882a593Smuzhiyun ep93xx_pata_write_reg(drv_data, tf->hob_lbah,
395*4882a593Smuzhiyun IDECTRL_ADDR_LBAH);
396*4882a593Smuzhiyun }
397*4882a593Smuzhiyun
398*4882a593Smuzhiyun if (is_addr) {
399*4882a593Smuzhiyun ep93xx_pata_write_reg(drv_data, tf->feature,
400*4882a593Smuzhiyun IDECTRL_ADDR_FEATURE);
401*4882a593Smuzhiyun ep93xx_pata_write_reg(drv_data, tf->nsect, IDECTRL_ADDR_NSECT);
402*4882a593Smuzhiyun ep93xx_pata_write_reg(drv_data, tf->lbal, IDECTRL_ADDR_LBAL);
403*4882a593Smuzhiyun ep93xx_pata_write_reg(drv_data, tf->lbam, IDECTRL_ADDR_LBAM);
404*4882a593Smuzhiyun ep93xx_pata_write_reg(drv_data, tf->lbah, IDECTRL_ADDR_LBAH);
405*4882a593Smuzhiyun }
406*4882a593Smuzhiyun
407*4882a593Smuzhiyun if (tf->flags & ATA_TFLAG_DEVICE)
408*4882a593Smuzhiyun ep93xx_pata_write_reg(drv_data, tf->device,
409*4882a593Smuzhiyun IDECTRL_ADDR_DEVICE);
410*4882a593Smuzhiyun
411*4882a593Smuzhiyun ata_wait_idle(ap);
412*4882a593Smuzhiyun }
413*4882a593Smuzhiyun
414*4882a593Smuzhiyun /* Note: original code is ata_sff_tf_read */
ep93xx_pata_tf_read(struct ata_port * ap,struct ata_taskfile * tf)415*4882a593Smuzhiyun static void ep93xx_pata_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
416*4882a593Smuzhiyun {
417*4882a593Smuzhiyun struct ep93xx_pata_data *drv_data = ap->host->private_data;
418*4882a593Smuzhiyun
419*4882a593Smuzhiyun tf->command = ep93xx_pata_check_status(ap);
420*4882a593Smuzhiyun tf->feature = ep93xx_pata_read_reg(drv_data, IDECTRL_ADDR_FEATURE);
421*4882a593Smuzhiyun tf->nsect = ep93xx_pata_read_reg(drv_data, IDECTRL_ADDR_NSECT);
422*4882a593Smuzhiyun tf->lbal = ep93xx_pata_read_reg(drv_data, IDECTRL_ADDR_LBAL);
423*4882a593Smuzhiyun tf->lbam = ep93xx_pata_read_reg(drv_data, IDECTRL_ADDR_LBAM);
424*4882a593Smuzhiyun tf->lbah = ep93xx_pata_read_reg(drv_data, IDECTRL_ADDR_LBAH);
425*4882a593Smuzhiyun tf->device = ep93xx_pata_read_reg(drv_data, IDECTRL_ADDR_DEVICE);
426*4882a593Smuzhiyun
427*4882a593Smuzhiyun if (tf->flags & ATA_TFLAG_LBA48) {
428*4882a593Smuzhiyun ep93xx_pata_write_reg(drv_data, tf->ctl | ATA_HOB,
429*4882a593Smuzhiyun IDECTRL_ADDR_CTL);
430*4882a593Smuzhiyun tf->hob_feature = ep93xx_pata_read_reg(drv_data,
431*4882a593Smuzhiyun IDECTRL_ADDR_FEATURE);
432*4882a593Smuzhiyun tf->hob_nsect = ep93xx_pata_read_reg(drv_data,
433*4882a593Smuzhiyun IDECTRL_ADDR_NSECT);
434*4882a593Smuzhiyun tf->hob_lbal = ep93xx_pata_read_reg(drv_data,
435*4882a593Smuzhiyun IDECTRL_ADDR_LBAL);
436*4882a593Smuzhiyun tf->hob_lbam = ep93xx_pata_read_reg(drv_data,
437*4882a593Smuzhiyun IDECTRL_ADDR_LBAM);
438*4882a593Smuzhiyun tf->hob_lbah = ep93xx_pata_read_reg(drv_data,
439*4882a593Smuzhiyun IDECTRL_ADDR_LBAH);
440*4882a593Smuzhiyun ep93xx_pata_write_reg(drv_data, tf->ctl, IDECTRL_ADDR_CTL);
441*4882a593Smuzhiyun ap->last_ctl = tf->ctl;
442*4882a593Smuzhiyun }
443*4882a593Smuzhiyun }
444*4882a593Smuzhiyun
445*4882a593Smuzhiyun /* Note: original code is ata_sff_exec_command */
ep93xx_pata_exec_command(struct ata_port * ap,const struct ata_taskfile * tf)446*4882a593Smuzhiyun static void ep93xx_pata_exec_command(struct ata_port *ap,
447*4882a593Smuzhiyun const struct ata_taskfile *tf)
448*4882a593Smuzhiyun {
449*4882a593Smuzhiyun struct ep93xx_pata_data *drv_data = ap->host->private_data;
450*4882a593Smuzhiyun
451*4882a593Smuzhiyun ep93xx_pata_write_reg(drv_data, tf->command,
452*4882a593Smuzhiyun IDECTRL_ADDR_COMMAND);
453*4882a593Smuzhiyun ata_sff_pause(ap);
454*4882a593Smuzhiyun }
455*4882a593Smuzhiyun
456*4882a593Smuzhiyun /* Note: original code is ata_sff_dev_select */
ep93xx_pata_dev_select(struct ata_port * ap,unsigned int device)457*4882a593Smuzhiyun static void ep93xx_pata_dev_select(struct ata_port *ap, unsigned int device)
458*4882a593Smuzhiyun {
459*4882a593Smuzhiyun struct ep93xx_pata_data *drv_data = ap->host->private_data;
460*4882a593Smuzhiyun u8 tmp = ATA_DEVICE_OBS;
461*4882a593Smuzhiyun
462*4882a593Smuzhiyun if (device != 0)
463*4882a593Smuzhiyun tmp |= ATA_DEV1;
464*4882a593Smuzhiyun
465*4882a593Smuzhiyun ep93xx_pata_write_reg(drv_data, tmp, IDECTRL_ADDR_DEVICE);
466*4882a593Smuzhiyun ata_sff_pause(ap); /* needed; also flushes, for mmio */
467*4882a593Smuzhiyun }
468*4882a593Smuzhiyun
469*4882a593Smuzhiyun /* Note: original code is ata_sff_set_devctl */
ep93xx_pata_set_devctl(struct ata_port * ap,u8 ctl)470*4882a593Smuzhiyun static void ep93xx_pata_set_devctl(struct ata_port *ap, u8 ctl)
471*4882a593Smuzhiyun {
472*4882a593Smuzhiyun struct ep93xx_pata_data *drv_data = ap->host->private_data;
473*4882a593Smuzhiyun
474*4882a593Smuzhiyun ep93xx_pata_write_reg(drv_data, ctl, IDECTRL_ADDR_CTL);
475*4882a593Smuzhiyun }
476*4882a593Smuzhiyun
477*4882a593Smuzhiyun /* Note: original code is ata_sff_data_xfer */
ep93xx_pata_data_xfer(struct ata_queued_cmd * qc,unsigned char * buf,unsigned int buflen,int rw)478*4882a593Smuzhiyun static unsigned int ep93xx_pata_data_xfer(struct ata_queued_cmd *qc,
479*4882a593Smuzhiyun unsigned char *buf,
480*4882a593Smuzhiyun unsigned int buflen, int rw)
481*4882a593Smuzhiyun {
482*4882a593Smuzhiyun struct ata_port *ap = qc->dev->link->ap;
483*4882a593Smuzhiyun struct ep93xx_pata_data *drv_data = ap->host->private_data;
484*4882a593Smuzhiyun u16 *data = (u16 *)buf;
485*4882a593Smuzhiyun unsigned int words = buflen >> 1;
486*4882a593Smuzhiyun
487*4882a593Smuzhiyun /* Transfer multiple of 2 bytes */
488*4882a593Smuzhiyun while (words--)
489*4882a593Smuzhiyun if (rw == READ)
490*4882a593Smuzhiyun *data++ = cpu_to_le16(
491*4882a593Smuzhiyun ep93xx_pata_read_data(
492*4882a593Smuzhiyun drv_data, IDECTRL_ADDR_DATA));
493*4882a593Smuzhiyun else
494*4882a593Smuzhiyun ep93xx_pata_write_data(drv_data, le16_to_cpu(*data++),
495*4882a593Smuzhiyun IDECTRL_ADDR_DATA);
496*4882a593Smuzhiyun
497*4882a593Smuzhiyun /* Transfer trailing 1 byte, if any. */
498*4882a593Smuzhiyun if (unlikely(buflen & 0x01)) {
499*4882a593Smuzhiyun unsigned char pad[2] = { };
500*4882a593Smuzhiyun
501*4882a593Smuzhiyun buf += buflen - 1;
502*4882a593Smuzhiyun
503*4882a593Smuzhiyun if (rw == READ) {
504*4882a593Smuzhiyun *pad = cpu_to_le16(
505*4882a593Smuzhiyun ep93xx_pata_read_data(
506*4882a593Smuzhiyun drv_data, IDECTRL_ADDR_DATA));
507*4882a593Smuzhiyun *buf = pad[0];
508*4882a593Smuzhiyun } else {
509*4882a593Smuzhiyun pad[0] = *buf;
510*4882a593Smuzhiyun ep93xx_pata_write_data(drv_data, le16_to_cpu(*pad),
511*4882a593Smuzhiyun IDECTRL_ADDR_DATA);
512*4882a593Smuzhiyun }
513*4882a593Smuzhiyun words++;
514*4882a593Smuzhiyun }
515*4882a593Smuzhiyun
516*4882a593Smuzhiyun return words << 1;
517*4882a593Smuzhiyun }
518*4882a593Smuzhiyun
519*4882a593Smuzhiyun /* Note: original code is ata_devchk */
ep93xx_pata_device_is_present(struct ata_port * ap,unsigned int device)520*4882a593Smuzhiyun static bool ep93xx_pata_device_is_present(struct ata_port *ap,
521*4882a593Smuzhiyun unsigned int device)
522*4882a593Smuzhiyun {
523*4882a593Smuzhiyun struct ep93xx_pata_data *drv_data = ap->host->private_data;
524*4882a593Smuzhiyun u8 nsect, lbal;
525*4882a593Smuzhiyun
526*4882a593Smuzhiyun ap->ops->sff_dev_select(ap, device);
527*4882a593Smuzhiyun
528*4882a593Smuzhiyun ep93xx_pata_write_reg(drv_data, 0x55, IDECTRL_ADDR_NSECT);
529*4882a593Smuzhiyun ep93xx_pata_write_reg(drv_data, 0xaa, IDECTRL_ADDR_LBAL);
530*4882a593Smuzhiyun
531*4882a593Smuzhiyun ep93xx_pata_write_reg(drv_data, 0xaa, IDECTRL_ADDR_NSECT);
532*4882a593Smuzhiyun ep93xx_pata_write_reg(drv_data, 0x55, IDECTRL_ADDR_LBAL);
533*4882a593Smuzhiyun
534*4882a593Smuzhiyun ep93xx_pata_write_reg(drv_data, 0x55, IDECTRL_ADDR_NSECT);
535*4882a593Smuzhiyun ep93xx_pata_write_reg(drv_data, 0xaa, IDECTRL_ADDR_LBAL);
536*4882a593Smuzhiyun
537*4882a593Smuzhiyun nsect = ep93xx_pata_read_reg(drv_data, IDECTRL_ADDR_NSECT);
538*4882a593Smuzhiyun lbal = ep93xx_pata_read_reg(drv_data, IDECTRL_ADDR_LBAL);
539*4882a593Smuzhiyun
540*4882a593Smuzhiyun if ((nsect == 0x55) && (lbal == 0xaa))
541*4882a593Smuzhiyun return true;
542*4882a593Smuzhiyun
543*4882a593Smuzhiyun return false;
544*4882a593Smuzhiyun }
545*4882a593Smuzhiyun
546*4882a593Smuzhiyun /* Note: original code is ata_sff_wait_after_reset */
ep93xx_pata_wait_after_reset(struct ata_link * link,unsigned int devmask,unsigned long deadline)547*4882a593Smuzhiyun static int ep93xx_pata_wait_after_reset(struct ata_link *link,
548*4882a593Smuzhiyun unsigned int devmask,
549*4882a593Smuzhiyun unsigned long deadline)
550*4882a593Smuzhiyun {
551*4882a593Smuzhiyun struct ata_port *ap = link->ap;
552*4882a593Smuzhiyun struct ep93xx_pata_data *drv_data = ap->host->private_data;
553*4882a593Smuzhiyun unsigned int dev0 = devmask & (1 << 0);
554*4882a593Smuzhiyun unsigned int dev1 = devmask & (1 << 1);
555*4882a593Smuzhiyun int rc, ret = 0;
556*4882a593Smuzhiyun
557*4882a593Smuzhiyun ata_msleep(ap, ATA_WAIT_AFTER_RESET);
558*4882a593Smuzhiyun
559*4882a593Smuzhiyun /* always check readiness of the master device */
560*4882a593Smuzhiyun rc = ata_sff_wait_ready(link, deadline);
561*4882a593Smuzhiyun /*
562*4882a593Smuzhiyun * -ENODEV means the odd clown forgot the D7 pulldown resistor
563*4882a593Smuzhiyun * and TF status is 0xff, bail out on it too.
564*4882a593Smuzhiyun */
565*4882a593Smuzhiyun if (rc)
566*4882a593Smuzhiyun return rc;
567*4882a593Smuzhiyun
568*4882a593Smuzhiyun /*
569*4882a593Smuzhiyun * if device 1 was found in ata_devchk, wait for register
570*4882a593Smuzhiyun * access briefly, then wait for BSY to clear.
571*4882a593Smuzhiyun */
572*4882a593Smuzhiyun if (dev1) {
573*4882a593Smuzhiyun int i;
574*4882a593Smuzhiyun
575*4882a593Smuzhiyun ap->ops->sff_dev_select(ap, 1);
576*4882a593Smuzhiyun
577*4882a593Smuzhiyun /*
578*4882a593Smuzhiyun * Wait for register access. Some ATAPI devices fail
579*4882a593Smuzhiyun * to set nsect/lbal after reset, so don't waste too
580*4882a593Smuzhiyun * much time on it. We're gonna wait for !BSY anyway.
581*4882a593Smuzhiyun */
582*4882a593Smuzhiyun for (i = 0; i < 2; i++) {
583*4882a593Smuzhiyun u8 nsect, lbal;
584*4882a593Smuzhiyun
585*4882a593Smuzhiyun nsect = ep93xx_pata_read_reg(drv_data,
586*4882a593Smuzhiyun IDECTRL_ADDR_NSECT);
587*4882a593Smuzhiyun lbal = ep93xx_pata_read_reg(drv_data,
588*4882a593Smuzhiyun IDECTRL_ADDR_LBAL);
589*4882a593Smuzhiyun if (nsect == 1 && lbal == 1)
590*4882a593Smuzhiyun break;
591*4882a593Smuzhiyun msleep(50); /* give drive a breather */
592*4882a593Smuzhiyun }
593*4882a593Smuzhiyun
594*4882a593Smuzhiyun rc = ata_sff_wait_ready(link, deadline);
595*4882a593Smuzhiyun if (rc) {
596*4882a593Smuzhiyun if (rc != -ENODEV)
597*4882a593Smuzhiyun return rc;
598*4882a593Smuzhiyun ret = rc;
599*4882a593Smuzhiyun }
600*4882a593Smuzhiyun }
601*4882a593Smuzhiyun /* is all this really necessary? */
602*4882a593Smuzhiyun ap->ops->sff_dev_select(ap, 0);
603*4882a593Smuzhiyun if (dev1)
604*4882a593Smuzhiyun ap->ops->sff_dev_select(ap, 1);
605*4882a593Smuzhiyun if (dev0)
606*4882a593Smuzhiyun ap->ops->sff_dev_select(ap, 0);
607*4882a593Smuzhiyun
608*4882a593Smuzhiyun return ret;
609*4882a593Smuzhiyun }
610*4882a593Smuzhiyun
611*4882a593Smuzhiyun /* Note: original code is ata_bus_softreset */
ep93xx_pata_bus_softreset(struct ata_port * ap,unsigned int devmask,unsigned long deadline)612*4882a593Smuzhiyun static int ep93xx_pata_bus_softreset(struct ata_port *ap, unsigned int devmask,
613*4882a593Smuzhiyun unsigned long deadline)
614*4882a593Smuzhiyun {
615*4882a593Smuzhiyun struct ep93xx_pata_data *drv_data = ap->host->private_data;
616*4882a593Smuzhiyun
617*4882a593Smuzhiyun ep93xx_pata_write_reg(drv_data, ap->ctl, IDECTRL_ADDR_CTL);
618*4882a593Smuzhiyun udelay(20); /* FIXME: flush */
619*4882a593Smuzhiyun ep93xx_pata_write_reg(drv_data, ap->ctl | ATA_SRST, IDECTRL_ADDR_CTL);
620*4882a593Smuzhiyun udelay(20); /* FIXME: flush */
621*4882a593Smuzhiyun ep93xx_pata_write_reg(drv_data, ap->ctl, IDECTRL_ADDR_CTL);
622*4882a593Smuzhiyun ap->last_ctl = ap->ctl;
623*4882a593Smuzhiyun
624*4882a593Smuzhiyun return ep93xx_pata_wait_after_reset(&ap->link, devmask, deadline);
625*4882a593Smuzhiyun }
626*4882a593Smuzhiyun
ep93xx_pata_release_dma(struct ep93xx_pata_data * drv_data)627*4882a593Smuzhiyun static void ep93xx_pata_release_dma(struct ep93xx_pata_data *drv_data)
628*4882a593Smuzhiyun {
629*4882a593Smuzhiyun if (drv_data->dma_rx_channel) {
630*4882a593Smuzhiyun dma_release_channel(drv_data->dma_rx_channel);
631*4882a593Smuzhiyun drv_data->dma_rx_channel = NULL;
632*4882a593Smuzhiyun }
633*4882a593Smuzhiyun if (drv_data->dma_tx_channel) {
634*4882a593Smuzhiyun dma_release_channel(drv_data->dma_tx_channel);
635*4882a593Smuzhiyun drv_data->dma_tx_channel = NULL;
636*4882a593Smuzhiyun }
637*4882a593Smuzhiyun }
638*4882a593Smuzhiyun
ep93xx_pata_dma_filter(struct dma_chan * chan,void * filter_param)639*4882a593Smuzhiyun static bool ep93xx_pata_dma_filter(struct dma_chan *chan, void *filter_param)
640*4882a593Smuzhiyun {
641*4882a593Smuzhiyun if (ep93xx_dma_chan_is_m2p(chan))
642*4882a593Smuzhiyun return false;
643*4882a593Smuzhiyun
644*4882a593Smuzhiyun chan->private = filter_param;
645*4882a593Smuzhiyun return true;
646*4882a593Smuzhiyun }
647*4882a593Smuzhiyun
ep93xx_pata_dma_init(struct ep93xx_pata_data * drv_data)648*4882a593Smuzhiyun static void ep93xx_pata_dma_init(struct ep93xx_pata_data *drv_data)
649*4882a593Smuzhiyun {
650*4882a593Smuzhiyun const struct platform_device *pdev = drv_data->pdev;
651*4882a593Smuzhiyun dma_cap_mask_t mask;
652*4882a593Smuzhiyun struct dma_slave_config conf;
653*4882a593Smuzhiyun
654*4882a593Smuzhiyun dma_cap_zero(mask);
655*4882a593Smuzhiyun dma_cap_set(DMA_SLAVE, mask);
656*4882a593Smuzhiyun
657*4882a593Smuzhiyun /*
658*4882a593Smuzhiyun * Request two channels for IDE. Another possibility would be
659*4882a593Smuzhiyun * to request only one channel, and reprogram it's direction at
660*4882a593Smuzhiyun * start of new transfer.
661*4882a593Smuzhiyun */
662*4882a593Smuzhiyun drv_data->dma_rx_data.port = EP93XX_DMA_IDE;
663*4882a593Smuzhiyun drv_data->dma_rx_data.direction = DMA_DEV_TO_MEM;
664*4882a593Smuzhiyun drv_data->dma_rx_data.name = "ep93xx-pata-rx";
665*4882a593Smuzhiyun drv_data->dma_rx_channel = dma_request_channel(mask,
666*4882a593Smuzhiyun ep93xx_pata_dma_filter, &drv_data->dma_rx_data);
667*4882a593Smuzhiyun if (!drv_data->dma_rx_channel)
668*4882a593Smuzhiyun return;
669*4882a593Smuzhiyun
670*4882a593Smuzhiyun drv_data->dma_tx_data.port = EP93XX_DMA_IDE;
671*4882a593Smuzhiyun drv_data->dma_tx_data.direction = DMA_MEM_TO_DEV;
672*4882a593Smuzhiyun drv_data->dma_tx_data.name = "ep93xx-pata-tx";
673*4882a593Smuzhiyun drv_data->dma_tx_channel = dma_request_channel(mask,
674*4882a593Smuzhiyun ep93xx_pata_dma_filter, &drv_data->dma_tx_data);
675*4882a593Smuzhiyun if (!drv_data->dma_tx_channel) {
676*4882a593Smuzhiyun dma_release_channel(drv_data->dma_rx_channel);
677*4882a593Smuzhiyun return;
678*4882a593Smuzhiyun }
679*4882a593Smuzhiyun
680*4882a593Smuzhiyun /* Configure receive channel direction and source address */
681*4882a593Smuzhiyun memset(&conf, 0, sizeof(conf));
682*4882a593Smuzhiyun conf.direction = DMA_DEV_TO_MEM;
683*4882a593Smuzhiyun conf.src_addr = drv_data->udma_in_phys;
684*4882a593Smuzhiyun conf.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
685*4882a593Smuzhiyun if (dmaengine_slave_config(drv_data->dma_rx_channel, &conf)) {
686*4882a593Smuzhiyun dev_err(&pdev->dev, "failed to configure rx dma channel\n");
687*4882a593Smuzhiyun ep93xx_pata_release_dma(drv_data);
688*4882a593Smuzhiyun return;
689*4882a593Smuzhiyun }
690*4882a593Smuzhiyun
691*4882a593Smuzhiyun /* Configure transmit channel direction and destination address */
692*4882a593Smuzhiyun memset(&conf, 0, sizeof(conf));
693*4882a593Smuzhiyun conf.direction = DMA_MEM_TO_DEV;
694*4882a593Smuzhiyun conf.dst_addr = drv_data->udma_out_phys;
695*4882a593Smuzhiyun conf.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
696*4882a593Smuzhiyun if (dmaengine_slave_config(drv_data->dma_tx_channel, &conf)) {
697*4882a593Smuzhiyun dev_err(&pdev->dev, "failed to configure tx dma channel\n");
698*4882a593Smuzhiyun ep93xx_pata_release_dma(drv_data);
699*4882a593Smuzhiyun }
700*4882a593Smuzhiyun }
701*4882a593Smuzhiyun
ep93xx_pata_dma_start(struct ata_queued_cmd * qc)702*4882a593Smuzhiyun static void ep93xx_pata_dma_start(struct ata_queued_cmd *qc)
703*4882a593Smuzhiyun {
704*4882a593Smuzhiyun struct dma_async_tx_descriptor *txd;
705*4882a593Smuzhiyun struct ep93xx_pata_data *drv_data = qc->ap->host->private_data;
706*4882a593Smuzhiyun void __iomem *base = drv_data->ide_base;
707*4882a593Smuzhiyun struct ata_device *adev = qc->dev;
708*4882a593Smuzhiyun u32 v = qc->dma_dir == DMA_TO_DEVICE ? IDEUDMAOP_RWOP : 0;
709*4882a593Smuzhiyun struct dma_chan *channel = qc->dma_dir == DMA_TO_DEVICE
710*4882a593Smuzhiyun ? drv_data->dma_tx_channel : drv_data->dma_rx_channel;
711*4882a593Smuzhiyun
712*4882a593Smuzhiyun txd = dmaengine_prep_slave_sg(channel, qc->sg, qc->n_elem, qc->dma_dir,
713*4882a593Smuzhiyun DMA_CTRL_ACK);
714*4882a593Smuzhiyun if (!txd) {
715*4882a593Smuzhiyun dev_err(qc->ap->dev, "failed to prepare slave for sg dma\n");
716*4882a593Smuzhiyun return;
717*4882a593Smuzhiyun }
718*4882a593Smuzhiyun txd->callback = NULL;
719*4882a593Smuzhiyun txd->callback_param = NULL;
720*4882a593Smuzhiyun
721*4882a593Smuzhiyun if (dmaengine_submit(txd) < 0) {
722*4882a593Smuzhiyun dev_err(qc->ap->dev, "failed to submit dma transfer\n");
723*4882a593Smuzhiyun return;
724*4882a593Smuzhiyun }
725*4882a593Smuzhiyun dma_async_issue_pending(channel);
726*4882a593Smuzhiyun
727*4882a593Smuzhiyun /*
728*4882a593Smuzhiyun * When enabling UDMA operation, IDEUDMAOP register needs to be
729*4882a593Smuzhiyun * programmed in three step sequence:
730*4882a593Smuzhiyun * 1) set or clear the RWOP bit,
731*4882a593Smuzhiyun * 2) perform dummy read of the register,
732*4882a593Smuzhiyun * 3) set the UEN bit.
733*4882a593Smuzhiyun */
734*4882a593Smuzhiyun writel(v, base + IDEUDMAOP);
735*4882a593Smuzhiyun readl(base + IDEUDMAOP);
736*4882a593Smuzhiyun writel(v | IDEUDMAOP_UEN, base + IDEUDMAOP);
737*4882a593Smuzhiyun
738*4882a593Smuzhiyun writel(IDECFG_IDEEN | IDECFG_UDMA |
739*4882a593Smuzhiyun ((adev->xfer_mode - XFER_UDMA_0) << IDECFG_MODE_SHIFT),
740*4882a593Smuzhiyun base + IDECFG);
741*4882a593Smuzhiyun }
742*4882a593Smuzhiyun
ep93xx_pata_dma_stop(struct ata_queued_cmd * qc)743*4882a593Smuzhiyun static void ep93xx_pata_dma_stop(struct ata_queued_cmd *qc)
744*4882a593Smuzhiyun {
745*4882a593Smuzhiyun struct ep93xx_pata_data *drv_data = qc->ap->host->private_data;
746*4882a593Smuzhiyun void __iomem *base = drv_data->ide_base;
747*4882a593Smuzhiyun
748*4882a593Smuzhiyun /* terminate all dma transfers, if not yet finished */
749*4882a593Smuzhiyun dmaengine_terminate_all(drv_data->dma_rx_channel);
750*4882a593Smuzhiyun dmaengine_terminate_all(drv_data->dma_tx_channel);
751*4882a593Smuzhiyun
752*4882a593Smuzhiyun /*
753*4882a593Smuzhiyun * To properly stop IDE-DMA, IDEUDMAOP register must to be cleared
754*4882a593Smuzhiyun * and IDECTRL register must be set to default value.
755*4882a593Smuzhiyun */
756*4882a593Smuzhiyun writel(0, base + IDEUDMAOP);
757*4882a593Smuzhiyun writel(readl(base + IDECTRL) | IDECTRL_DIOWN | IDECTRL_DIORN |
758*4882a593Smuzhiyun IDECTRL_CS0N | IDECTRL_CS1N, base + IDECTRL);
759*4882a593Smuzhiyun
760*4882a593Smuzhiyun ep93xx_pata_enable_pio(drv_data->ide_base,
761*4882a593Smuzhiyun qc->dev->pio_mode - XFER_PIO_0);
762*4882a593Smuzhiyun
763*4882a593Smuzhiyun ata_sff_dma_pause(qc->ap);
764*4882a593Smuzhiyun }
765*4882a593Smuzhiyun
ep93xx_pata_dma_setup(struct ata_queued_cmd * qc)766*4882a593Smuzhiyun static void ep93xx_pata_dma_setup(struct ata_queued_cmd *qc)
767*4882a593Smuzhiyun {
768*4882a593Smuzhiyun qc->ap->ops->sff_exec_command(qc->ap, &qc->tf);
769*4882a593Smuzhiyun }
770*4882a593Smuzhiyun
ep93xx_pata_dma_status(struct ata_port * ap)771*4882a593Smuzhiyun static u8 ep93xx_pata_dma_status(struct ata_port *ap)
772*4882a593Smuzhiyun {
773*4882a593Smuzhiyun struct ep93xx_pata_data *drv_data = ap->host->private_data;
774*4882a593Smuzhiyun u32 val = readl(drv_data->ide_base + IDEUDMASTS);
775*4882a593Smuzhiyun
776*4882a593Smuzhiyun /*
777*4882a593Smuzhiyun * UDMA Status Register bits:
778*4882a593Smuzhiyun *
779*4882a593Smuzhiyun * DMAIDE - DMA request signal from UDMA state machine,
780*4882a593Smuzhiyun * INTIDE - INT line generated by UDMA because of errors in the
781*4882a593Smuzhiyun * state machine,
782*4882a593Smuzhiyun * SBUSY - UDMA state machine busy, not in idle state,
783*4882a593Smuzhiyun * NDO - error for data-out not completed,
784*4882a593Smuzhiyun * NDI - error for data-in not completed,
785*4882a593Smuzhiyun * N4X - error for data transferred not multiplies of four
786*4882a593Smuzhiyun * 32-bit words.
787*4882a593Smuzhiyun * (EP93xx UG p27-17)
788*4882a593Smuzhiyun */
789*4882a593Smuzhiyun if (val & IDEUDMASTS_NDO || val & IDEUDMASTS_NDI ||
790*4882a593Smuzhiyun val & IDEUDMASTS_N4X || val & IDEUDMASTS_INTIDE)
791*4882a593Smuzhiyun return ATA_DMA_ERR;
792*4882a593Smuzhiyun
793*4882a593Smuzhiyun /* read INTRQ (INT[3]) pin input state */
794*4882a593Smuzhiyun if (readl(drv_data->ide_base + IDECTRL) & IDECTRL_INTRQ)
795*4882a593Smuzhiyun return ATA_DMA_INTR;
796*4882a593Smuzhiyun
797*4882a593Smuzhiyun if (val & IDEUDMASTS_SBUSY || val & IDEUDMASTS_DMAIDE)
798*4882a593Smuzhiyun return ATA_DMA_ACTIVE;
799*4882a593Smuzhiyun
800*4882a593Smuzhiyun return 0;
801*4882a593Smuzhiyun }
802*4882a593Smuzhiyun
803*4882a593Smuzhiyun /* Note: original code is ata_sff_softreset */
ep93xx_pata_softreset(struct ata_link * al,unsigned int * classes,unsigned long deadline)804*4882a593Smuzhiyun static int ep93xx_pata_softreset(struct ata_link *al, unsigned int *classes,
805*4882a593Smuzhiyun unsigned long deadline)
806*4882a593Smuzhiyun {
807*4882a593Smuzhiyun struct ata_port *ap = al->ap;
808*4882a593Smuzhiyun unsigned int slave_possible = ap->flags & ATA_FLAG_SLAVE_POSS;
809*4882a593Smuzhiyun unsigned int devmask = 0;
810*4882a593Smuzhiyun int rc;
811*4882a593Smuzhiyun u8 err;
812*4882a593Smuzhiyun
813*4882a593Smuzhiyun /* determine if device 0/1 are present */
814*4882a593Smuzhiyun if (ep93xx_pata_device_is_present(ap, 0))
815*4882a593Smuzhiyun devmask |= (1 << 0);
816*4882a593Smuzhiyun if (slave_possible && ep93xx_pata_device_is_present(ap, 1))
817*4882a593Smuzhiyun devmask |= (1 << 1);
818*4882a593Smuzhiyun
819*4882a593Smuzhiyun /* select device 0 again */
820*4882a593Smuzhiyun ap->ops->sff_dev_select(al->ap, 0);
821*4882a593Smuzhiyun
822*4882a593Smuzhiyun /* issue bus reset */
823*4882a593Smuzhiyun rc = ep93xx_pata_bus_softreset(ap, devmask, deadline);
824*4882a593Smuzhiyun /* if link is ocuppied, -ENODEV too is an error */
825*4882a593Smuzhiyun if (rc && (rc != -ENODEV || sata_scr_valid(al))) {
826*4882a593Smuzhiyun ata_link_err(al, "SRST failed (errno=%d)\n", rc);
827*4882a593Smuzhiyun return rc;
828*4882a593Smuzhiyun }
829*4882a593Smuzhiyun
830*4882a593Smuzhiyun /* determine by signature whether we have ATA or ATAPI devices */
831*4882a593Smuzhiyun classes[0] = ata_sff_dev_classify(&al->device[0], devmask & (1 << 0),
832*4882a593Smuzhiyun &err);
833*4882a593Smuzhiyun if (slave_possible && err != 0x81)
834*4882a593Smuzhiyun classes[1] = ata_sff_dev_classify(&al->device[1],
835*4882a593Smuzhiyun devmask & (1 << 1), &err);
836*4882a593Smuzhiyun
837*4882a593Smuzhiyun return 0;
838*4882a593Smuzhiyun }
839*4882a593Smuzhiyun
840*4882a593Smuzhiyun /* Note: original code is ata_sff_drain_fifo */
ep93xx_pata_drain_fifo(struct ata_queued_cmd * qc)841*4882a593Smuzhiyun static void ep93xx_pata_drain_fifo(struct ata_queued_cmd *qc)
842*4882a593Smuzhiyun {
843*4882a593Smuzhiyun int count;
844*4882a593Smuzhiyun struct ata_port *ap;
845*4882a593Smuzhiyun struct ep93xx_pata_data *drv_data;
846*4882a593Smuzhiyun
847*4882a593Smuzhiyun /* We only need to flush incoming data when a command was running */
848*4882a593Smuzhiyun if (qc == NULL || qc->dma_dir == DMA_TO_DEVICE)
849*4882a593Smuzhiyun return;
850*4882a593Smuzhiyun
851*4882a593Smuzhiyun ap = qc->ap;
852*4882a593Smuzhiyun drv_data = ap->host->private_data;
853*4882a593Smuzhiyun /* Drain up to 64K of data before we give up this recovery method */
854*4882a593Smuzhiyun for (count = 0; (ap->ops->sff_check_status(ap) & ATA_DRQ)
855*4882a593Smuzhiyun && count < 65536; count += 2)
856*4882a593Smuzhiyun ep93xx_pata_read_reg(drv_data, IDECTRL_ADDR_DATA);
857*4882a593Smuzhiyun
858*4882a593Smuzhiyun /* Can become DEBUG later */
859*4882a593Smuzhiyun if (count)
860*4882a593Smuzhiyun ata_port_dbg(ap, "drained %d bytes to clear DRQ.\n", count);
861*4882a593Smuzhiyun
862*4882a593Smuzhiyun }
863*4882a593Smuzhiyun
ep93xx_pata_port_start(struct ata_port * ap)864*4882a593Smuzhiyun static int ep93xx_pata_port_start(struct ata_port *ap)
865*4882a593Smuzhiyun {
866*4882a593Smuzhiyun struct ep93xx_pata_data *drv_data = ap->host->private_data;
867*4882a593Smuzhiyun
868*4882a593Smuzhiyun /*
869*4882a593Smuzhiyun * Set timings to safe values at startup (= number of ns from ATA
870*4882a593Smuzhiyun * specification), we'll switch to properly calculated values later.
871*4882a593Smuzhiyun */
872*4882a593Smuzhiyun drv_data->t = *ata_timing_find_mode(XFER_PIO_0);
873*4882a593Smuzhiyun return 0;
874*4882a593Smuzhiyun }
875*4882a593Smuzhiyun
876*4882a593Smuzhiyun static struct scsi_host_template ep93xx_pata_sht = {
877*4882a593Smuzhiyun ATA_BASE_SHT(DRV_NAME),
878*4882a593Smuzhiyun /* ep93xx dma implementation limit */
879*4882a593Smuzhiyun .sg_tablesize = 32,
880*4882a593Smuzhiyun /* ep93xx dma can't transfer 65536 bytes at once */
881*4882a593Smuzhiyun .dma_boundary = 0x7fff,
882*4882a593Smuzhiyun };
883*4882a593Smuzhiyun
884*4882a593Smuzhiyun static struct ata_port_operations ep93xx_pata_port_ops = {
885*4882a593Smuzhiyun .inherits = &ata_bmdma_port_ops,
886*4882a593Smuzhiyun
887*4882a593Smuzhiyun .qc_prep = ata_noop_qc_prep,
888*4882a593Smuzhiyun
889*4882a593Smuzhiyun .softreset = ep93xx_pata_softreset,
890*4882a593Smuzhiyun .hardreset = ATA_OP_NULL,
891*4882a593Smuzhiyun
892*4882a593Smuzhiyun .sff_dev_select = ep93xx_pata_dev_select,
893*4882a593Smuzhiyun .sff_set_devctl = ep93xx_pata_set_devctl,
894*4882a593Smuzhiyun .sff_check_status = ep93xx_pata_check_status,
895*4882a593Smuzhiyun .sff_check_altstatus = ep93xx_pata_check_altstatus,
896*4882a593Smuzhiyun .sff_tf_load = ep93xx_pata_tf_load,
897*4882a593Smuzhiyun .sff_tf_read = ep93xx_pata_tf_read,
898*4882a593Smuzhiyun .sff_exec_command = ep93xx_pata_exec_command,
899*4882a593Smuzhiyun .sff_data_xfer = ep93xx_pata_data_xfer,
900*4882a593Smuzhiyun .sff_drain_fifo = ep93xx_pata_drain_fifo,
901*4882a593Smuzhiyun .sff_irq_clear = ATA_OP_NULL,
902*4882a593Smuzhiyun
903*4882a593Smuzhiyun .set_piomode = ep93xx_pata_set_piomode,
904*4882a593Smuzhiyun
905*4882a593Smuzhiyun .bmdma_setup = ep93xx_pata_dma_setup,
906*4882a593Smuzhiyun .bmdma_start = ep93xx_pata_dma_start,
907*4882a593Smuzhiyun .bmdma_stop = ep93xx_pata_dma_stop,
908*4882a593Smuzhiyun .bmdma_status = ep93xx_pata_dma_status,
909*4882a593Smuzhiyun
910*4882a593Smuzhiyun .cable_detect = ata_cable_unknown,
911*4882a593Smuzhiyun .port_start = ep93xx_pata_port_start,
912*4882a593Smuzhiyun };
913*4882a593Smuzhiyun
ep93xx_pata_probe(struct platform_device * pdev)914*4882a593Smuzhiyun static int ep93xx_pata_probe(struct platform_device *pdev)
915*4882a593Smuzhiyun {
916*4882a593Smuzhiyun struct ep93xx_pata_data *drv_data;
917*4882a593Smuzhiyun struct ata_host *host;
918*4882a593Smuzhiyun struct ata_port *ap;
919*4882a593Smuzhiyun int irq;
920*4882a593Smuzhiyun struct resource *mem_res;
921*4882a593Smuzhiyun void __iomem *ide_base;
922*4882a593Smuzhiyun int err;
923*4882a593Smuzhiyun
924*4882a593Smuzhiyun err = ep93xx_ide_acquire_gpio(pdev);
925*4882a593Smuzhiyun if (err)
926*4882a593Smuzhiyun return err;
927*4882a593Smuzhiyun
928*4882a593Smuzhiyun /* INT[3] (IRQ_EP93XX_EXT3) line connected as pull down */
929*4882a593Smuzhiyun irq = platform_get_irq(pdev, 0);
930*4882a593Smuzhiyun if (irq < 0) {
931*4882a593Smuzhiyun err = irq;
932*4882a593Smuzhiyun goto err_rel_gpio;
933*4882a593Smuzhiyun }
934*4882a593Smuzhiyun
935*4882a593Smuzhiyun mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
936*4882a593Smuzhiyun ide_base = devm_ioremap_resource(&pdev->dev, mem_res);
937*4882a593Smuzhiyun if (IS_ERR(ide_base)) {
938*4882a593Smuzhiyun err = PTR_ERR(ide_base);
939*4882a593Smuzhiyun goto err_rel_gpio;
940*4882a593Smuzhiyun }
941*4882a593Smuzhiyun
942*4882a593Smuzhiyun drv_data = devm_kzalloc(&pdev->dev, sizeof(*drv_data), GFP_KERNEL);
943*4882a593Smuzhiyun if (!drv_data) {
944*4882a593Smuzhiyun err = -ENXIO;
945*4882a593Smuzhiyun goto err_rel_gpio;
946*4882a593Smuzhiyun }
947*4882a593Smuzhiyun
948*4882a593Smuzhiyun drv_data->pdev = pdev;
949*4882a593Smuzhiyun drv_data->ide_base = ide_base;
950*4882a593Smuzhiyun drv_data->udma_in_phys = mem_res->start + IDEUDMADATAIN;
951*4882a593Smuzhiyun drv_data->udma_out_phys = mem_res->start + IDEUDMADATAOUT;
952*4882a593Smuzhiyun ep93xx_pata_dma_init(drv_data);
953*4882a593Smuzhiyun
954*4882a593Smuzhiyun /* allocate host */
955*4882a593Smuzhiyun host = ata_host_alloc(&pdev->dev, 1);
956*4882a593Smuzhiyun if (!host) {
957*4882a593Smuzhiyun err = -ENXIO;
958*4882a593Smuzhiyun goto err_rel_dma;
959*4882a593Smuzhiyun }
960*4882a593Smuzhiyun
961*4882a593Smuzhiyun ep93xx_pata_clear_regs(ide_base);
962*4882a593Smuzhiyun
963*4882a593Smuzhiyun host->private_data = drv_data;
964*4882a593Smuzhiyun
965*4882a593Smuzhiyun ap = host->ports[0];
966*4882a593Smuzhiyun ap->dev = &pdev->dev;
967*4882a593Smuzhiyun ap->ops = &ep93xx_pata_port_ops;
968*4882a593Smuzhiyun ap->flags |= ATA_FLAG_SLAVE_POSS;
969*4882a593Smuzhiyun ap->pio_mask = ATA_PIO4;
970*4882a593Smuzhiyun
971*4882a593Smuzhiyun /*
972*4882a593Smuzhiyun * Maximum UDMA modes:
973*4882a593Smuzhiyun * EP931x rev.E0 - UDMA2
974*4882a593Smuzhiyun * EP931x rev.E1 - UDMA3
975*4882a593Smuzhiyun * EP931x rev.E2 - UDMA4
976*4882a593Smuzhiyun *
977*4882a593Smuzhiyun * MWDMA support was removed from EP931x rev.E2,
978*4882a593Smuzhiyun * so this driver supports only UDMA modes.
979*4882a593Smuzhiyun */
980*4882a593Smuzhiyun if (drv_data->dma_rx_channel && drv_data->dma_tx_channel) {
981*4882a593Smuzhiyun int chip_rev = ep93xx_chip_revision();
982*4882a593Smuzhiyun
983*4882a593Smuzhiyun if (chip_rev == EP93XX_CHIP_REV_E1)
984*4882a593Smuzhiyun ap->udma_mask = ATA_UDMA3;
985*4882a593Smuzhiyun else if (chip_rev == EP93XX_CHIP_REV_E2)
986*4882a593Smuzhiyun ap->udma_mask = ATA_UDMA4;
987*4882a593Smuzhiyun else
988*4882a593Smuzhiyun ap->udma_mask = ATA_UDMA2;
989*4882a593Smuzhiyun }
990*4882a593Smuzhiyun
991*4882a593Smuzhiyun /* defaults, pio 0 */
992*4882a593Smuzhiyun ep93xx_pata_enable_pio(ide_base, 0);
993*4882a593Smuzhiyun
994*4882a593Smuzhiyun dev_info(&pdev->dev, "version " DRV_VERSION "\n");
995*4882a593Smuzhiyun
996*4882a593Smuzhiyun /* activate host */
997*4882a593Smuzhiyun err = ata_host_activate(host, irq, ata_bmdma_interrupt, 0,
998*4882a593Smuzhiyun &ep93xx_pata_sht);
999*4882a593Smuzhiyun if (err == 0)
1000*4882a593Smuzhiyun return 0;
1001*4882a593Smuzhiyun
1002*4882a593Smuzhiyun err_rel_dma:
1003*4882a593Smuzhiyun ep93xx_pata_release_dma(drv_data);
1004*4882a593Smuzhiyun err_rel_gpio:
1005*4882a593Smuzhiyun ep93xx_ide_release_gpio(pdev);
1006*4882a593Smuzhiyun return err;
1007*4882a593Smuzhiyun }
1008*4882a593Smuzhiyun
ep93xx_pata_remove(struct platform_device * pdev)1009*4882a593Smuzhiyun static int ep93xx_pata_remove(struct platform_device *pdev)
1010*4882a593Smuzhiyun {
1011*4882a593Smuzhiyun struct ata_host *host = platform_get_drvdata(pdev);
1012*4882a593Smuzhiyun struct ep93xx_pata_data *drv_data = host->private_data;
1013*4882a593Smuzhiyun
1014*4882a593Smuzhiyun ata_host_detach(host);
1015*4882a593Smuzhiyun ep93xx_pata_release_dma(drv_data);
1016*4882a593Smuzhiyun ep93xx_pata_clear_regs(drv_data->ide_base);
1017*4882a593Smuzhiyun ep93xx_ide_release_gpio(pdev);
1018*4882a593Smuzhiyun return 0;
1019*4882a593Smuzhiyun }
1020*4882a593Smuzhiyun
1021*4882a593Smuzhiyun static struct platform_driver ep93xx_pata_platform_driver = {
1022*4882a593Smuzhiyun .driver = {
1023*4882a593Smuzhiyun .name = DRV_NAME,
1024*4882a593Smuzhiyun },
1025*4882a593Smuzhiyun .probe = ep93xx_pata_probe,
1026*4882a593Smuzhiyun .remove = ep93xx_pata_remove,
1027*4882a593Smuzhiyun };
1028*4882a593Smuzhiyun
1029*4882a593Smuzhiyun module_platform_driver(ep93xx_pata_platform_driver);
1030*4882a593Smuzhiyun
1031*4882a593Smuzhiyun MODULE_AUTHOR("Alessandro Zummo, Lennert Buytenhek, Joao Ramos, "
1032*4882a593Smuzhiyun "Bartlomiej Zolnierkiewicz, Rafal Prylowski");
1033*4882a593Smuzhiyun MODULE_DESCRIPTION("low-level driver for cirrus ep93xx IDE controller");
1034*4882a593Smuzhiyun MODULE_LICENSE("GPL");
1035*4882a593Smuzhiyun MODULE_VERSION(DRV_VERSION);
1036*4882a593Smuzhiyun MODULE_ALIAS("platform:pata_ep93xx");
1037