xref: /OK3568_Linux_fs/kernel/drivers/ata/pata_ep93xx.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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