Blame view

drivers/ata/pata_octeon_cf.c 27.3 KB
3c929c6f5   David Daney   libata: New drive...
1
2
3
4
5
6
7
  /*
   * Driver for the Octeon bootbus compact flash.
   *
   * This file is subject to the terms and conditions of the GNU General Public
   * License.  See the file "COPYING" in the main directory of this archive
   * for more details.
   *
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
8
   * Copyright (C) 2005 - 2012 Cavium Inc.
3c929c6f5   David Daney   libata: New drive...
9
10
11
12
13
14
   * Copyright (C) 2008 Wind River Systems
   */
  
  #include <linux/kernel.h>
  #include <linux/module.h>
  #include <linux/libata.h>
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
15
  #include <linux/hrtimer.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
16
  #include <linux/slab.h>
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
17
18
19
  #include <linux/irq.h>
  #include <linux/of.h>
  #include <linux/of_platform.h>
3c929c6f5   David Daney   libata: New drive...
20
  #include <linux/platform_device.h>
3c929c6f5   David Daney   libata: New drive...
21
  #include <scsi/scsi_host.h>
1007c4bc0   David Daney   ata: pata_octeon_...
22
  #include <asm/byteorder.h>
3c929c6f5   David Daney   libata: New drive...
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
  #include <asm/octeon/octeon.h>
  
  /*
   * The Octeon bootbus compact flash interface is connected in at least
   * 3 different configurations on various evaluation boards:
   *
   * -- 8  bits no irq, no DMA
   * -- 16 bits no irq, no DMA
   * -- 16 bits True IDE mode with DMA, but no irq.
   *
   * In the last case the DMA engine can generate an interrupt when the
   * transfer is complete.  For the first two cases only PIO is supported.
   *
   */
  
  #define DRV_NAME	"pata_octeon_cf"
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
39
40
41
42
  #define DRV_VERSION	"2.2"
  
  /* Poll interval in nS. */
  #define OCTEON_CF_BUSY_POLL_INTERVAL 500000
3c929c6f5   David Daney   libata: New drive...
43

43f01da0f   David Daney   MIPS/OCTEON/ata: ...
44
45
46
47
  #define DMA_CFG 0
  #define DMA_TIM 0x20
  #define DMA_INT 0x38
  #define DMA_INT_EN 0x50
3c929c6f5   David Daney   libata: New drive...
48
49
  
  struct octeon_cf_port {
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
50
  	struct hrtimer delayed_finish;
3c929c6f5   David Daney   libata: New drive...
51
52
  	struct ata_port *ap;
  	int dma_finished;
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
53
54
55
56
57
  	void		*c0;
  	unsigned int cs0;
  	unsigned int cs1;
  	bool is_true_ide;
  	u64 dma_base;
3c929c6f5   David Daney   libata: New drive...
58
59
60
61
62
  };
  
  static struct scsi_host_template octeon_cf_sht = {
  	ATA_PIO_SHT(DRV_NAME),
  };
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
63
64
65
66
  static int enable_dma;
  module_param(enable_dma, int, 0444);
  MODULE_PARM_DESC(enable_dma,
  		 "Enable use of DMA on interfaces that support it (0=no dma [default], 1=use dma)");
3c929c6f5   David Daney   libata: New drive...
67
68
69
70
71
72
73
74
75
76
77
78
  /**
   * Convert nanosecond based time to setting used in the
   * boot bus timing register, based on timing multiple
   */
  static unsigned int ns_to_tim_reg(unsigned int tim_mult, unsigned int nsecs)
  {
  	unsigned int val;
  
  	/*
  	 * Compute # of eclock periods to get desired duration in
  	 * nanoseconds.
  	 */
1fa25ab2c   David Daney   ATA: pata_octeon_...
79
  	val = DIV_ROUND_UP(nsecs * (octeon_get_io_clock_rate() / 1000000),
3c929c6f5   David Daney   libata: New drive...
80
81
82
83
  			  1000 * tim_mult);
  
  	return val;
  }
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
84
  static void octeon_cf_set_boot_reg_cfg(int cs, unsigned int multiplier)
3c929c6f5   David Daney   libata: New drive...
85
86
  {
  	union cvmx_mio_boot_reg_cfgx reg_cfg;
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
  	unsigned int tim_mult;
  
  	switch (multiplier) {
  	case 8:
  		tim_mult = 3;
  		break;
  	case 4:
  		tim_mult = 0;
  		break;
  	case 2:
  		tim_mult = 2;
  		break;
  	default:
  		tim_mult = 1;
  		break;
  	}
3c929c6f5   David Daney   libata: New drive...
103
104
  	reg_cfg.u64 = cvmx_read_csr(CVMX_MIO_BOOT_REG_CFGX(cs));
  	reg_cfg.s.dmack = 0;	/* Don't assert DMACK on access */
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
105
  	reg_cfg.s.tim_mult = tim_mult;	/* Timing mutiplier */
3c929c6f5   David Daney   libata: New drive...
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
  	reg_cfg.s.rd_dly = 0;	/* Sample on falling edge of BOOT_OE */
  	reg_cfg.s.sam = 0;	/* Don't combine write and output enable */
  	reg_cfg.s.we_ext = 0;	/* No write enable extension */
  	reg_cfg.s.oe_ext = 0;	/* No read enable extension */
  	reg_cfg.s.en = 1;	/* Enable this region */
  	reg_cfg.s.orbit = 0;	/* Don't combine with previous region */
  	reg_cfg.s.ale = 0;	/* Don't do address multiplexing */
  	cvmx_write_csr(CVMX_MIO_BOOT_REG_CFGX(cs), reg_cfg.u64);
  }
  
  /**
   * Called after libata determines the needed PIO mode. This
   * function programs the Octeon bootbus regions to support the
   * timing requirements of the PIO mode.
   *
   * @ap:     ATA port information
   * @dev:    ATA device
   */
  static void octeon_cf_set_piomode(struct ata_port *ap, struct ata_device *dev)
  {
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
126
  	struct octeon_cf_port *cf_port = ap->private_data;
3c929c6f5   David Daney   libata: New drive...
127
  	union cvmx_mio_boot_reg_timx reg_tim;
3c929c6f5   David Daney   libata: New drive...
128
129
  	int T;
  	struct ata_timing timing;
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
130
  	unsigned int div;
3c929c6f5   David Daney   libata: New drive...
131
132
133
134
  	int use_iordy;
  	int trh;
  	int pause;
  	/* These names are timing parameters from the ATA spec */
3c929c6f5   David Daney   libata: New drive...
135
  	int t2;
3c929c6f5   David Daney   libata: New drive...
136

43f01da0f   David Daney   MIPS/OCTEON/ata: ...
137
138
139
140
141
142
143
144
145
  	/*
  	 * A divisor value of four will overflow the timing fields at
  	 * clock rates greater than 800MHz
  	 */
  	if (octeon_get_io_clock_rate() <= 800000000)
  		div = 4;
  	else
  		div = 8;
  	T = (int)((1000000000000LL * div) / octeon_get_io_clock_rate());
3c929c6f5   David Daney   libata: New drive...
146

02d9d3cba   Harman Kalra   ata: Replace BUG(...
147
  	BUG_ON(ata_timing_compute(dev, dev->pio_mode, &timing, T, T));
3c929c6f5   David Daney   libata: New drive...
148

3c929c6f5   David Daney   libata: New drive...
149
150
151
  	t2 = timing.active;
  	if (t2)
  		t2--;
3c929c6f5   David Daney   libata: New drive...
152

43f01da0f   David Daney   MIPS/OCTEON/ata: ...
153
  	trh = ns_to_tim_reg(div, 20);
3c929c6f5   David Daney   libata: New drive...
154
155
  	if (trh)
  		trh--;
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
156
157
158
159
  	pause = (int)timing.cycle - (int)timing.active -
  		(int)timing.setup - trh;
  	if (pause < 0)
  		pause = 0;
3c929c6f5   David Daney   libata: New drive...
160
161
  	if (pause)
  		pause--;
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
162
163
  	octeon_cf_set_boot_reg_cfg(cf_port->cs0, div);
  	if (cf_port->is_true_ide)
3c929c6f5   David Daney   libata: New drive...
164
  		/* True IDE mode, program both chip selects.  */
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
165
  		octeon_cf_set_boot_reg_cfg(cf_port->cs1, div);
3c929c6f5   David Daney   libata: New drive...
166
167
168
  
  
  	use_iordy = ata_pio_need_iordy(dev);
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
169
  	reg_tim.u64 = cvmx_read_csr(CVMX_MIO_BOOT_REG_TIMX(cf_port->cs0));
3c929c6f5   David Daney   libata: New drive...
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
  	/* Disable page mode */
  	reg_tim.s.pagem = 0;
  	/* Enable dynamic timing */
  	reg_tim.s.waitm = use_iordy;
  	/* Pages are disabled */
  	reg_tim.s.pages = 0;
  	/* We don't use multiplexed address mode */
  	reg_tim.s.ale = 0;
  	/* Not used */
  	reg_tim.s.page = 0;
  	/* Time after IORDY to coninue to assert the data */
  	reg_tim.s.wait = 0;
  	/* Time to wait to complete the cycle. */
  	reg_tim.s.pause = pause;
  	/* How long to hold after a write to de-assert CE. */
  	reg_tim.s.wr_hld = trh;
  	/* How long to wait after a read to de-assert CE. */
  	reg_tim.s.rd_hld = trh;
  	/* How long write enable is asserted */
  	reg_tim.s.we = t2;
  	/* How long read enable is asserted */
  	reg_tim.s.oe = t2;
  	/* Time after CE that read/write starts */
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
193
  	reg_tim.s.ce = ns_to_tim_reg(div, 5);
3c929c6f5   David Daney   libata: New drive...
194
195
196
197
  	/* Time before CE that address is valid */
  	reg_tim.s.adr = 0;
  
  	/* Program the bootbus region timing for the data port chip select. */
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
198
199
  	cvmx_write_csr(CVMX_MIO_BOOT_REG_TIMX(cf_port->cs0), reg_tim.u64);
  	if (cf_port->is_true_ide)
3c929c6f5   David Daney   libata: New drive...
200
  		/* True IDE mode, program both chip selects.  */
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
201
202
  		cvmx_write_csr(CVMX_MIO_BOOT_REG_TIMX(cf_port->cs1),
  			       reg_tim.u64);
3c929c6f5   David Daney   libata: New drive...
203
204
205
206
  }
  
  static void octeon_cf_set_dmamode(struct ata_port *ap, struct ata_device *dev)
  {
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
207
208
  	struct octeon_cf_port *cf_port = ap->private_data;
  	union cvmx_mio_boot_pin_defs pin_defs;
3c929c6f5   David Daney   libata: New drive...
209
210
211
212
213
214
215
216
  	union cvmx_mio_boot_dma_timx dma_tim;
  	unsigned int oe_a;
  	unsigned int oe_n;
  	unsigned int dma_ackh;
  	unsigned int dma_arq;
  	unsigned int pause;
  	unsigned int T0, Tkr, Td;
  	unsigned int tim_mult;
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
217
  	int c;
3c929c6f5   David Daney   libata: New drive...
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
  
  	const struct ata_timing *timing;
  
  	timing = ata_timing_find_mode(dev->dma_mode);
  	T0	= timing->cycle;
  	Td	= timing->active;
  	Tkr	= timing->recover;
  	dma_ackh = timing->dmack_hold;
  
  	dma_tim.u64 = 0;
  	/* dma_tim.s.tim_mult = 0 --> 4x */
  	tim_mult = 4;
  
  	/* not spec'ed, value in eclocks, not affected by tim_mult */
  	dma_arq = 8;
  	pause = 25 - dma_arq * 1000 /
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
234
  		(octeon_get_io_clock_rate() / 1000000); /* Tz */
3c929c6f5   David Daney   libata: New drive...
235
236
237
238
  
  	oe_a = Td;
  	/* Tkr from cf spec, lengthened to meet T0 */
  	oe_n = max(T0 - oe_a, Tkr);
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
239
240
241
242
243
244
245
  	pin_defs.u64 = cvmx_read_csr(CVMX_MIO_BOOT_PIN_DEFS);
  
  	/* DMA channel number. */
  	c = (cf_port->dma_base & 8) >> 3;
  
  	/* Invert the polarity if the default is 0*/
  	dma_tim.s.dmack_pi = (pin_defs.u64 & (1ull << (11 + c))) ? 0 : 1;
3c929c6f5   David Daney   libata: New drive...
246
247
248
249
250
251
252
253
  
  	dma_tim.s.oe_n = ns_to_tim_reg(tim_mult, oe_n);
  	dma_tim.s.oe_a = ns_to_tim_reg(tim_mult, oe_a);
  
  	/*
  	 * This is tI, C.F. spec. says 0, but Sony CF card requires
  	 * more, we use 20 nS.
  	 */
87c8b22be   Joe Perches   drivers/ata: Remo...
254
  	dma_tim.s.dmack_s = ns_to_tim_reg(tim_mult, 20);
3c929c6f5   David Daney   libata: New drive...
255
256
257
258
259
260
261
262
263
264
265
266
267
268
  	dma_tim.s.dmack_h = ns_to_tim_reg(tim_mult, dma_ackh);
  
  	dma_tim.s.dmarq = dma_arq;
  	dma_tim.s.pause = ns_to_tim_reg(tim_mult, pause);
  
  	dma_tim.s.rd_dly = 0;	/* Sample right on edge */
  
  	/*  writes only */
  	dma_tim.s.we_n = ns_to_tim_reg(tim_mult, oe_n);
  	dma_tim.s.we_a = ns_to_tim_reg(tim_mult, oe_a);
  
  	pr_debug("ns to ticks (mult %d) of %d is: %d
  ", tim_mult, 60,
  		 ns_to_tim_reg(tim_mult, 60));
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
269
270
  	pr_debug("oe_n: %d, oe_a: %d, dmack_s: %d, dmack_h: %d, dmarq: %d, pause: %d
  ",
3c929c6f5   David Daney   libata: New drive...
271
272
  		 dma_tim.s.oe_n, dma_tim.s.oe_a, dma_tim.s.dmack_s,
  		 dma_tim.s.dmack_h, dma_tim.s.dmarq, dma_tim.s.pause);
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
273
  	cvmx_write_csr(cf_port->dma_base + DMA_TIM, dma_tim.u64);
3c929c6f5   David Daney   libata: New drive...
274
275
276
277
278
  }
  
  /**
   * Handle an 8 bit I/O request.
   *
989e0aac1   Bartlomiej Zolnierkiewicz   ata: pass queued ...
279
   * @qc:         Queued command
3c929c6f5   David Daney   libata: New drive...
280
281
282
283
   * @buffer:     Data buffer
   * @buflen:     Length of the buffer.
   * @rw:         True to write.
   */
989e0aac1   Bartlomiej Zolnierkiewicz   ata: pass queued ...
284
  static unsigned int octeon_cf_data_xfer8(struct ata_queued_cmd *qc,
3c929c6f5   David Daney   libata: New drive...
285
286
287
288
  					 unsigned char *buffer,
  					 unsigned int buflen,
  					 int rw)
  {
989e0aac1   Bartlomiej Zolnierkiewicz   ata: pass queued ...
289
  	struct ata_port *ap		= qc->dev->link->ap;
3c929c6f5   David Daney   libata: New drive...
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
  	void __iomem *data_addr		= ap->ioaddr.data_addr;
  	unsigned long words;
  	int count;
  
  	words = buflen;
  	if (rw) {
  		count = 16;
  		while (words--) {
  			iowrite8(*buffer, data_addr);
  			buffer++;
  			/*
  			 * Every 16 writes do a read so the bootbus
  			 * FIFO doesn't fill up.
  			 */
  			if (--count == 0) {
  				ioread8(ap->ioaddr.altstatus_addr);
  				count = 16;
  			}
  		}
  	} else {
  		ioread8_rep(data_addr, buffer, words);
  	}
  	return buflen;
  }
  
  /**
   * Handle a 16 bit I/O request.
   *
989e0aac1   Bartlomiej Zolnierkiewicz   ata: pass queued ...
318
   * @qc:         Queued command
3c929c6f5   David Daney   libata: New drive...
319
320
321
322
   * @buffer:     Data buffer
   * @buflen:     Length of the buffer.
   * @rw:         True to write.
   */
989e0aac1   Bartlomiej Zolnierkiewicz   ata: pass queued ...
323
  static unsigned int octeon_cf_data_xfer16(struct ata_queued_cmd *qc,
3c929c6f5   David Daney   libata: New drive...
324
325
326
327
  					  unsigned char *buffer,
  					  unsigned int buflen,
  					  int rw)
  {
989e0aac1   Bartlomiej Zolnierkiewicz   ata: pass queued ...
328
  	struct ata_port *ap		= qc->dev->link->ap;
3c929c6f5   David Daney   libata: New drive...
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
  	void __iomem *data_addr		= ap->ioaddr.data_addr;
  	unsigned long words;
  	int count;
  
  	words = buflen / 2;
  	if (rw) {
  		count = 16;
  		while (words--) {
  			iowrite16(*(uint16_t *)buffer, data_addr);
  			buffer += sizeof(uint16_t);
  			/*
  			 * Every 16 writes do a read so the bootbus
  			 * FIFO doesn't fill up.
  			 */
  			if (--count == 0) {
  				ioread8(ap->ioaddr.altstatus_addr);
  				count = 16;
  			}
  		}
  	} else {
  		while (words--) {
  			*(uint16_t *)buffer = ioread16(data_addr);
  			buffer += sizeof(uint16_t);
  		}
  	}
  	/* Transfer trailing 1 byte, if any. */
  	if (unlikely(buflen & 0x01)) {
  		__le16 align_buf[1] = { 0 };
  
  		if (rw == READ) {
  			align_buf[0] = cpu_to_le16(ioread16(data_addr));
  			memcpy(buffer, align_buf, 1);
  		} else {
  			memcpy(align_buf, buffer, 1);
  			iowrite16(le16_to_cpu(align_buf[0]), data_addr);
  		}
  		words++;
  	}
  	return buflen;
  }
  
  /**
   * Read the taskfile for 16bit non-True IDE only.
   */
  static void octeon_cf_tf_read16(struct ata_port *ap, struct ata_taskfile *tf)
  {
  	u16 blob;
  	/* The base of the registers is at ioaddr.data_addr. */
  	void __iomem *base = ap->ioaddr.data_addr;
  
  	blob = __raw_readw(base + 0xc);
  	tf->feature = blob >> 8;
  
  	blob = __raw_readw(base + 2);
  	tf->nsect = blob & 0xff;
  	tf->lbal = blob >> 8;
  
  	blob = __raw_readw(base + 4);
  	tf->lbam = blob & 0xff;
  	tf->lbah = blob >> 8;
  
  	blob = __raw_readw(base + 6);
  	tf->device = blob & 0xff;
  	tf->command = blob >> 8;
  
  	if (tf->flags & ATA_TFLAG_LBA48) {
  		if (likely(ap->ioaddr.ctl_addr)) {
  			iowrite8(tf->ctl | ATA_HOB, ap->ioaddr.ctl_addr);
  
  			blob = __raw_readw(base + 0xc);
  			tf->hob_feature = blob >> 8;
  
  			blob = __raw_readw(base + 2);
  			tf->hob_nsect = blob & 0xff;
  			tf->hob_lbal = blob >> 8;
  
  			blob = __raw_readw(base + 4);
  			tf->hob_lbam = blob & 0xff;
  			tf->hob_lbah = blob >> 8;
  
  			iowrite8(tf->ctl, ap->ioaddr.ctl_addr);
  			ap->last_ctl = tf->ctl;
  		} else {
  			WARN_ON(1);
  		}
  	}
  }
  
  static u8 octeon_cf_check_status16(struct ata_port *ap)
  {
  	u16 blob;
  	void __iomem *base = ap->ioaddr.data_addr;
  
  	blob = __raw_readw(base + 6);
  	return blob >> 8;
  }
  
  static int octeon_cf_softreset16(struct ata_link *link, unsigned int *classes,
  				 unsigned long deadline)
  {
  	struct ata_port *ap = link->ap;
  	void __iomem *base = ap->ioaddr.data_addr;
  	int rc;
  	u8 err;
  
  	DPRINTK("about to softreset
  ");
  	__raw_writew(ap->ctl, base + 0xe);
  	udelay(20);
  	__raw_writew(ap->ctl | ATA_SRST, base + 0xe);
  	udelay(20);
  	__raw_writew(ap->ctl, base + 0xe);
  
  	rc = ata_sff_wait_after_reset(link, 1, deadline);
  	if (rc) {
a9a79dfec   Joe Perches   ata: Convert ata_...
444
445
  		ata_link_err(link, "SRST failed (errno=%d)
  ", rc);
3c929c6f5   David Daney   libata: New drive...
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
  		return rc;
  	}
  
  	/* determine by signature whether we have ATA or ATAPI devices */
  	classes[0] = ata_sff_dev_classify(&link->device[0], 1, &err);
  	DPRINTK("EXIT, classes[0]=%u [1]=%u
  ", classes[0], classes[1]);
  	return 0;
  }
  
  /**
   * Load the taskfile for 16bit non-True IDE only.  The device_addr is
   * not loaded, we do this as part of octeon_cf_exec_command16.
   */
  static void octeon_cf_tf_load16(struct ata_port *ap,
  				const struct ata_taskfile *tf)
  {
  	unsigned int is_addr = tf->flags & ATA_TFLAG_ISADDR;
  	/* The base of the registers is at ioaddr.data_addr. */
  	void __iomem *base = ap->ioaddr.data_addr;
  
  	if (tf->ctl != ap->last_ctl) {
  		iowrite8(tf->ctl, ap->ioaddr.ctl_addr);
  		ap->last_ctl = tf->ctl;
  		ata_wait_idle(ap);
  	}
  	if (is_addr && (tf->flags & ATA_TFLAG_LBA48)) {
  		__raw_writew(tf->hob_feature << 8, base + 0xc);
  		__raw_writew(tf->hob_nsect | tf->hob_lbal << 8, base + 2);
  		__raw_writew(tf->hob_lbam | tf->hob_lbah << 8, base + 4);
  		VPRINTK("hob: feat 0x%X nsect 0x%X, lba 0x%X 0x%X 0x%X
  ",
  			tf->hob_feature,
  			tf->hob_nsect,
  			tf->hob_lbal,
  			tf->hob_lbam,
  			tf->hob_lbah);
  	}
  	if (is_addr) {
  		__raw_writew(tf->feature << 8, base + 0xc);
  		__raw_writew(tf->nsect | tf->lbal << 8, base + 2);
  		__raw_writew(tf->lbam | tf->lbah << 8, base + 4);
  		VPRINTK("feat 0x%X nsect 0x%X, lba 0x%X 0x%X 0x%X
  ",
  			tf->feature,
  			tf->nsect,
  			tf->lbal,
  			tf->lbam,
  			tf->lbah);
  	}
  	ata_wait_idle(ap);
  }
  
  
  static void octeon_cf_dev_select(struct ata_port *ap, unsigned int device)
  {
  /*  There is only one device, do nothing. */
  	return;
  }
  
  /*
   * Issue ATA command to host controller.  The device_addr is also sent
   * as it must be written in a combined write with the command.
   */
  static void octeon_cf_exec_command16(struct ata_port *ap,
  				const struct ata_taskfile *tf)
  {
  	/* The base of the registers is at ioaddr.data_addr. */
  	void __iomem *base = ap->ioaddr.data_addr;
  	u16 blob;
  
  	if (tf->flags & ATA_TFLAG_DEVICE) {
  		VPRINTK("device 0x%X
  ", tf->device);
  		blob = tf->device;
  	} else {
  		blob = 0;
  	}
  
  	DPRINTK("ata%u: cmd 0x%X
  ", ap->print_id, tf->command);
  	blob |= (tf->command << 8);
  	__raw_writew(blob, base + 6);
  
  
  	ata_wait_idle(ap);
  }
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
533
  static void octeon_cf_ata_port_noaction(struct ata_port *ap)
3c929c6f5   David Daney   libata: New drive...
534
  {
3c929c6f5   David Daney   libata: New drive...
535
  }
3c929c6f5   David Daney   libata: New drive...
536
537
538
539
  static void octeon_cf_dma_setup(struct ata_queued_cmd *qc)
  {
  	struct ata_port *ap = qc->ap;
  	struct octeon_cf_port *cf_port;
2d1299aad   David Daney   libata: Remove so...
540
  	cf_port = ap->private_data;
3c929c6f5   David Daney   libata: New drive...
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
  	DPRINTK("ENTER
  ");
  	/* issue r/w command */
  	qc->cursg = qc->sg;
  	cf_port->dma_finished = 0;
  	ap->ops->sff_exec_command(ap, &qc->tf);
  	DPRINTK("EXIT
  ");
  }
  
  /**
   * Start a DMA transfer that was already setup
   *
   * @qc:     Information about the DMA
   */
  static void octeon_cf_dma_start(struct ata_queued_cmd *qc)
  {
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
558
  	struct octeon_cf_port *cf_port = qc->ap->private_data;
3c929c6f5   David Daney   libata: New drive...
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
  	union cvmx_mio_boot_dma_cfgx mio_boot_dma_cfg;
  	union cvmx_mio_boot_dma_intx mio_boot_dma_int;
  	struct scatterlist *sg;
  
  	VPRINTK("%d scatterlists
  ", qc->n_elem);
  
  	/* Get the scatter list entry we need to DMA into */
  	sg = qc->cursg;
  	BUG_ON(!sg);
  
  	/*
  	 * Clear the DMA complete status.
  	 */
  	mio_boot_dma_int.u64 = 0;
  	mio_boot_dma_int.s.done = 1;
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
575
  	cvmx_write_csr(cf_port->dma_base + DMA_INT, mio_boot_dma_int.u64);
3c929c6f5   David Daney   libata: New drive...
576
577
  
  	/* Enable the interrupt.  */
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
578
  	cvmx_write_csr(cf_port->dma_base + DMA_INT_EN, mio_boot_dma_int.u64);
3c929c6f5   David Daney   libata: New drive...
579
580
581
  
  	/* Set the direction of the DMA */
  	mio_boot_dma_cfg.u64 = 0;
1007c4bc0   David Daney   ata: pata_octeon_...
582
583
584
  #ifdef __LITTLE_ENDIAN
  	mio_boot_dma_cfg.s.endian = 1;
  #endif
3c929c6f5   David Daney   libata: New drive...
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
  	mio_boot_dma_cfg.s.en = 1;
  	mio_boot_dma_cfg.s.rw = ((qc->tf.flags & ATA_TFLAG_WRITE) != 0);
  
  	/*
  	 * Don't stop the DMA if the device deasserts DMARQ. Many
  	 * compact flashes deassert DMARQ for a short time between
  	 * sectors. Instead of stopping and restarting the DMA, we'll
  	 * let the hardware do it. If the DMA is really stopped early
  	 * due to an error condition, a later timeout will force us to
  	 * stop.
  	 */
  	mio_boot_dma_cfg.s.clr = 0;
  
  	/* Size is specified in 16bit words and minus one notation */
  	mio_boot_dma_cfg.s.size = sg_dma_len(sg) / 2 - 1;
  
  	/* We need to swap the high and low bytes of every 16 bits */
  	mio_boot_dma_cfg.s.swap8 = 1;
  
  	mio_boot_dma_cfg.s.adr = sg_dma_address(sg);
  
  	VPRINTK("%s %d bytes address=%p
  ",
  		(mio_boot_dma_cfg.s.rw) ? "write" : "read", sg->length,
  		(void *)(unsigned long)mio_boot_dma_cfg.s.adr);
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
610
  	cvmx_write_csr(cf_port->dma_base + DMA_CFG, mio_boot_dma_cfg.u64);
3c929c6f5   David Daney   libata: New drive...
611
612
613
614
615
616
617
618
619
620
621
622
  }
  
  /**
   *
   *	LOCKING:
   *	spin_lock_irqsave(host lock)
   *
   */
  static unsigned int octeon_cf_dma_finished(struct ata_port *ap,
  					struct ata_queued_cmd *qc)
  {
  	struct ata_eh_info *ehi = &ap->link.eh_info;
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
623
  	struct octeon_cf_port *cf_port = ap->private_data;
3c929c6f5   David Daney   libata: New drive...
624
625
  	union cvmx_mio_boot_dma_cfgx dma_cfg;
  	union cvmx_mio_boot_dma_intx dma_int;
3c929c6f5   David Daney   libata: New drive...
626
627
628
629
630
631
632
633
634
  	u8 status;
  
  	VPRINTK("ata%u: protocol %d task_state %d
  ",
  		ap->print_id, qc->tf.protocol, ap->hsm_task_state);
  
  
  	if (ap->hsm_task_state != HSM_ST_LAST)
  		return 0;
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
635
  	dma_cfg.u64 = cvmx_read_csr(cf_port->dma_base + DMA_CFG);
3c929c6f5   David Daney   libata: New drive...
636
637
638
639
640
641
642
643
644
  	if (dma_cfg.s.size != 0xfffff) {
  		/* Error, the transfer was not complete.  */
  		qc->err_mask |= AC_ERR_HOST_BUS;
  		ap->hsm_task_state = HSM_ST_ERR;
  	}
  
  	/* Stop and clear the dma engine.  */
  	dma_cfg.u64 = 0;
  	dma_cfg.s.size = -1;
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
645
  	cvmx_write_csr(cf_port->dma_base + DMA_CFG, dma_cfg.u64);
3c929c6f5   David Daney   libata: New drive...
646
647
648
  
  	/* Disable the interrupt.  */
  	dma_int.u64 = 0;
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
649
  	cvmx_write_csr(cf_port->dma_base + DMA_INT_EN, dma_int.u64);
3c929c6f5   David Daney   libata: New drive...
650
651
652
  
  	/* Clear the DMA complete status */
  	dma_int.s.done = 1;
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
653
  	cvmx_write_csr(cf_port->dma_base + DMA_INT, dma_int.u64);
3c929c6f5   David Daney   libata: New drive...
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
  
  	status = ap->ops->sff_check_status(ap);
  
  	ata_sff_hsm_move(ap, qc, status, 0);
  
  	if (unlikely(qc->err_mask) && (qc->tf.protocol == ATA_PROT_DMA))
  		ata_ehi_push_desc(ehi, "DMA stat 0x%x", status);
  
  	return 1;
  }
  
  /*
   * Check if any queued commands have more DMAs, if so start the next
   * transfer, else do end of transfer handling.
   */
  static irqreturn_t octeon_cf_interrupt(int irq, void *dev_instance)
  {
  	struct ata_host *host = dev_instance;
  	struct octeon_cf_port *cf_port;
  	int i;
  	unsigned int handled = 0;
  	unsigned long flags;
  
  	spin_lock_irqsave(&host->lock, flags);
  
  	DPRINTK("ENTER
  ");
  	for (i = 0; i < host->n_ports; i++) {
  		u8 status;
  		struct ata_port *ap;
  		struct ata_queued_cmd *qc;
  		union cvmx_mio_boot_dma_intx dma_int;
  		union cvmx_mio_boot_dma_cfgx dma_cfg;
3c929c6f5   David Daney   libata: New drive...
687
688
  
  		ap = host->ports[i];
2d1299aad   David Daney   libata: Remove so...
689
  		cf_port = ap->private_data;
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
690
691
692
  
  		dma_int.u64 = cvmx_read_csr(cf_port->dma_base + DMA_INT);
  		dma_cfg.u64 = cvmx_read_csr(cf_port->dma_base + DMA_CFG);
3c929c6f5   David Daney   libata: New drive...
693
694
  
  		qc = ata_qc_from_tag(ap, ap->link.active_tag);
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
695
696
697
698
699
700
  		if (!qc || (qc->tf.flags & ATA_TFLAG_POLLING))
  			continue;
  
  		if (dma_int.s.done && !dma_cfg.s.en) {
  			if (!sg_is_last(qc->cursg)) {
  				qc->cursg = sg_next(qc->cursg);
3c929c6f5   David Daney   libata: New drive...
701
  				handled = 1;
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
702
703
  				octeon_cf_dma_start(qc);
  				continue;
3c929c6f5   David Daney   libata: New drive...
704
  			} else {
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
705
  				cf_port->dma_finished = 1;
3c929c6f5   David Daney   libata: New drive...
706
707
  			}
  		}
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
  		if (!cf_port->dma_finished)
  			continue;
  		status = ioread8(ap->ioaddr.altstatus_addr);
  		if (status & (ATA_BUSY | ATA_DRQ)) {
  			/*
  			 * We are busy, try to handle it later.  This
  			 * is the DMA finished interrupt, and it could
  			 * take a little while for the card to be
  			 * ready for more commands.
  			 */
  			/* Clear DMA irq. */
  			dma_int.u64 = 0;
  			dma_int.s.done = 1;
  			cvmx_write_csr(cf_port->dma_base + DMA_INT,
  				       dma_int.u64);
  			hrtimer_start_range_ns(&cf_port->delayed_finish,
  					       ns_to_ktime(OCTEON_CF_BUSY_POLL_INTERVAL),
  					       OCTEON_CF_BUSY_POLL_INTERVAL / 5,
  					       HRTIMER_MODE_REL);
  			handled = 1;
  		} else {
  			handled |= octeon_cf_dma_finished(ap, qc);
  		}
3c929c6f5   David Daney   libata: New drive...
731
732
733
734
735
736
  	}
  	spin_unlock_irqrestore(&host->lock, flags);
  	DPRINTK("EXIT
  ");
  	return IRQ_RETVAL(handled);
  }
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
737
  static enum hrtimer_restart octeon_cf_delayed_finish(struct hrtimer *hrt)
3c929c6f5   David Daney   libata: New drive...
738
  {
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
739
  	struct octeon_cf_port *cf_port = container_of(hrt,
3c929c6f5   David Daney   libata: New drive...
740
  						      struct octeon_cf_port,
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
741
  						      delayed_finish);
3c929c6f5   David Daney   libata: New drive...
742
743
744
745
746
  	struct ata_port *ap = cf_port->ap;
  	struct ata_host *host = ap->host;
  	struct ata_queued_cmd *qc;
  	unsigned long flags;
  	u8 status;
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
747
  	enum hrtimer_restart rv = HRTIMER_NORESTART;
3c929c6f5   David Daney   libata: New drive...
748
749
750
751
752
753
754
755
756
757
758
759
760
761
  
  	spin_lock_irqsave(&host->lock, flags);
  
  	/*
  	 * If the port is not waiting for completion, it must have
  	 * handled it previously.  The hsm_task_state is
  	 * protected by host->lock.
  	 */
  	if (ap->hsm_task_state != HSM_ST_LAST || !cf_port->dma_finished)
  		goto out;
  
  	status = ioread8(ap->ioaddr.altstatus_addr);
  	if (status & (ATA_BUSY | ATA_DRQ)) {
  		/* Still busy, try again. */
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
762
763
764
  		hrtimer_forward_now(hrt,
  				    ns_to_ktime(OCTEON_CF_BUSY_POLL_INTERVAL));
  		rv = HRTIMER_RESTART;
3c929c6f5   David Daney   libata: New drive...
765
766
767
  		goto out;
  	}
  	qc = ata_qc_from_tag(ap, ap->link.active_tag);
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
768
  	if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING)))
3c929c6f5   David Daney   libata: New drive...
769
770
771
  		octeon_cf_dma_finished(ap, qc);
  out:
  	spin_unlock_irqrestore(&host->lock, flags);
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
772
  	return rv;
3c929c6f5   David Daney   libata: New drive...
773
774
775
776
777
778
779
780
781
782
783
784
785
  }
  
  static void octeon_cf_dev_config(struct ata_device *dev)
  {
  	/*
  	 * A maximum of 2^20 - 1 16 bit transfers are possible with
  	 * the bootbus DMA.  So we need to throttle max_sectors to
  	 * (2^12 - 1 == 4095) to assure that this can never happen.
  	 */
  	dev->max_sectors = min(dev->max_sectors, 4095U);
  }
  
  /*
3c929c6f5   David Daney   libata: New drive...
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
   * We don't do ATAPI DMA so return 0.
   */
  static int octeon_cf_check_atapi_dma(struct ata_queued_cmd *qc)
  {
  	return 0;
  }
  
  static unsigned int octeon_cf_qc_issue(struct ata_queued_cmd *qc)
  {
  	struct ata_port *ap = qc->ap;
  
  	switch (qc->tf.protocol) {
  	case ATA_PROT_DMA:
  		WARN_ON(qc->tf.flags & ATA_TFLAG_POLLING);
  
  		ap->ops->sff_tf_load(ap, &qc->tf);  /* load tf registers */
  		octeon_cf_dma_setup(qc);	    /* set up dma */
  		octeon_cf_dma_start(qc);	    /* initiate dma */
  		ap->hsm_task_state = HSM_ST_LAST;
  		break;
  
  	case ATAPI_PROT_DMA:
  		dev_err(ap->dev, "Error, ATAPI not supported
  ");
  		BUG();
  
  	default:
  		return ata_sff_qc_issue(qc);
  	}
  
  	return 0;
  }
  
  static struct ata_port_operations octeon_cf_ops = {
  	.inherits		= &ata_sff_port_ops,
  	.check_atapi_dma	= octeon_cf_check_atapi_dma,
  	.qc_prep		= ata_noop_qc_prep,
  	.qc_issue		= octeon_cf_qc_issue,
  	.sff_dev_select		= octeon_cf_dev_select,
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
825
826
  	.sff_irq_on		= octeon_cf_ata_port_noaction,
  	.sff_irq_clear		= octeon_cf_ata_port_noaction,
3c929c6f5   David Daney   libata: New drive...
827
828
829
830
831
  	.cable_detect		= ata_cable_40wire,
  	.set_piomode		= octeon_cf_set_piomode,
  	.set_dmamode		= octeon_cf_set_dmamode,
  	.dev_config		= octeon_cf_dev_config,
  };
0ec249146   Greg Kroah-Hartman   Drivers: ata: rem...
832
  static int octeon_cf_probe(struct platform_device *pdev)
3c929c6f5   David Daney   libata: New drive...
833
834
  {
  	struct resource *res_cs0, *res_cs1;
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
835
836
837
838
839
  	bool is_16bit;
  	const __be32 *cs_num;
  	struct property *reg_prop;
  	int n_addr, n_size, reg_len;
  	struct device_node *node;
3c929c6f5   David Daney   libata: New drive...
840
841
842
843
  	void __iomem *cs0;
  	void __iomem *cs1 = NULL;
  	struct ata_host *host;
  	struct ata_port *ap;
3c929c6f5   David Daney   libata: New drive...
844
845
846
847
  	int irq = 0;
  	irq_handler_t irq_handler = NULL;
  	void __iomem *base;
  	struct octeon_cf_port *cf_port;
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
848
  	int rv = -ENOMEM;
be1dc3fb2   Sergei Shtylyov   pata_octeon_cf: u...
849
  	u32 bus_width;
3c929c6f5   David Daney   libata: New drive...
850

43f01da0f   David Daney   MIPS/OCTEON/ata: ...
851
852
  	node = pdev->dev.of_node;
  	if (node == NULL)
3c929c6f5   David Daney   libata: New drive...
853
  		return -EINVAL;
7a56c0ba2   Bartlomiej Zolnierkiewicz   pata_octeon_cf: u...
854
  	cf_port = devm_kzalloc(&pdev->dev, sizeof(*cf_port), GFP_KERNEL);
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
855
856
  	if (!cf_port)
  		return -ENOMEM;
3c929c6f5   David Daney   libata: New drive...
857

be1dc3fb2   Sergei Shtylyov   pata_octeon_cf: u...
858
  	cf_port->is_true_ide = of_property_read_bool(node, "cavium,true-ide");
3c929c6f5   David Daney   libata: New drive...
859

be1dc3fb2   Sergei Shtylyov   pata_octeon_cf: u...
860
861
  	if (of_property_read_u32(node, "cavium,bus-width", &bus_width) == 0)
  		is_16bit = (bus_width == 16);
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
862
863
  	else
  		is_16bit = false;
3c929c6f5   David Daney   libata: New drive...
864

43f01da0f   David Daney   MIPS/OCTEON/ata: ...
865
866
  	n_addr = of_n_addr_cells(node);
  	n_size = of_n_size_cells(node);
3c929c6f5   David Daney   libata: New drive...
867

43f01da0f   David Daney   MIPS/OCTEON/ata: ...
868
  	reg_prop = of_find_property(node, "reg", &reg_len);
7a56c0ba2   Bartlomiej Zolnierkiewicz   pata_octeon_cf: u...
869
870
  	if (!reg_prop || reg_len < sizeof(__be32))
  		return -EINVAL;
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
  	cs_num = reg_prop->value;
  	cf_port->cs0 = be32_to_cpup(cs_num);
  
  	if (cf_port->is_true_ide) {
  		struct device_node *dma_node;
  		dma_node = of_parse_phandle(node,
  					    "cavium,dma-engine-handle", 0);
  		if (dma_node) {
  			struct platform_device *dma_dev;
  			dma_dev = of_find_device_by_node(dma_node);
  			if (dma_dev) {
  				struct resource *res_dma;
  				int i;
  				res_dma = platform_get_resource(dma_dev, IORESOURCE_MEM, 0);
  				if (!res_dma) {
  					of_node_put(dma_node);
7a56c0ba2   Bartlomiej Zolnierkiewicz   pata_octeon_cf: u...
887
  					return -EINVAL;
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
888
889
890
  				}
  				cf_port->dma_base = (u64)devm_ioremap_nocache(&pdev->dev, res_dma->start,
  									 resource_size(res_dma));
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
891
892
  				if (!cf_port->dma_base) {
  					of_node_put(dma_node);
7a56c0ba2   Bartlomiej Zolnierkiewicz   pata_octeon_cf: u...
893
  					return -EINVAL;
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
894
895
896
897
898
899
900
901
902
903
  				}
  
  				irq_handler = octeon_cf_interrupt;
  				i = platform_get_irq(dma_dev, 0);
  				if (i > 0)
  					irq = i;
  			}
  			of_node_put(dma_node);
  		}
  		res_cs1 = platform_get_resource(pdev, IORESOURCE_MEM, 1);
7a56c0ba2   Bartlomiej Zolnierkiewicz   pata_octeon_cf: u...
904
905
  		if (!res_cs1)
  			return -EINVAL;
3c929c6f5   David Daney   libata: New drive...
906
  		cs1 = devm_ioremap_nocache(&pdev->dev, res_cs1->start,
b1cbe7d62   Alexandru Gheorghiu   pata_octeon_cf: U...
907
  					   resource_size(res_cs1));
3c929c6f5   David Daney   libata: New drive...
908
  		if (!cs1)
7a56c0ba2   Bartlomiej Zolnierkiewicz   pata_octeon_cf: u...
909
910
911
912
  			return rv;
  
  		if (reg_len < (n_addr + n_size + 1) * sizeof(__be32))
  			return -EINVAL;
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
913

43f01da0f   David Daney   MIPS/OCTEON/ata: ...
914
915
  		cs_num += n_addr + n_size;
  		cf_port->cs1 = be32_to_cpup(cs_num);
3c929c6f5   David Daney   libata: New drive...
916
  	}
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
917
  	res_cs0 = platform_get_resource(pdev, IORESOURCE_MEM, 0);
7a56c0ba2   Bartlomiej Zolnierkiewicz   pata_octeon_cf: u...
918
919
  	if (!res_cs0)
  		return -EINVAL;
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
920
921
922
  
  	cs0 = devm_ioremap_nocache(&pdev->dev, res_cs0->start,
  				   resource_size(res_cs0));
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
923
  	if (!cs0)
7a56c0ba2   Bartlomiej Zolnierkiewicz   pata_octeon_cf: u...
924
  		return rv;
3c929c6f5   David Daney   libata: New drive...
925
926
927
928
  
  	/* allocate host */
  	host = ata_host_alloc(&pdev->dev, 1);
  	if (!host)
7a56c0ba2   Bartlomiej Zolnierkiewicz   pata_octeon_cf: u...
929
  		return rv;
3c929c6f5   David Daney   libata: New drive...
930
931
932
  
  	ap = host->ports[0];
  	ap->private_data = cf_port;
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
933
  	pdev->dev.platform_data = cf_port;
3c929c6f5   David Daney   libata: New drive...
934
935
  	cf_port->ap = ap;
  	ap->ops = &octeon_cf_ops;
14bdef982   Erik Inge Bolsø   [libata] convert ...
936
  	ap->pio_mask = ATA_PIO6;
9cbe056f6   Sergei Shtylyov   libata: remove AT...
937
  	ap->flags |= ATA_FLAG_NO_ATAPI | ATA_FLAG_PIO_POLLING;
3c929c6f5   David Daney   libata: New drive...
938

43f01da0f   David Daney   MIPS/OCTEON/ata: ...
939
940
  	if (!is_16bit) {
  		base = cs0 + 0x800;
3c929c6f5   David Daney   libata: New drive...
941
942
943
944
945
946
  		ap->ioaddr.cmd_addr	= base;
  		ata_sff_std_ports(&ap->ioaddr);
  
  		ap->ioaddr.altstatus_addr = base + 0xe;
  		ap->ioaddr.ctl_addr	= base + 0xe;
  		octeon_cf_ops.sff_data_xfer = octeon_cf_data_xfer8;
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
947
948
  	} else if (cf_port->is_true_ide) {
  		base = cs0;
3c929c6f5   David Daney   libata: New drive...
949
950
951
952
953
954
955
956
957
958
959
960
961
962
  		ap->ioaddr.cmd_addr	= base + (ATA_REG_CMD << 1) + 1;
  		ap->ioaddr.data_addr	= base + (ATA_REG_DATA << 1);
  		ap->ioaddr.error_addr	= base + (ATA_REG_ERR << 1) + 1;
  		ap->ioaddr.feature_addr	= base + (ATA_REG_FEATURE << 1) + 1;
  		ap->ioaddr.nsect_addr	= base + (ATA_REG_NSECT << 1) + 1;
  		ap->ioaddr.lbal_addr	= base + (ATA_REG_LBAL << 1) + 1;
  		ap->ioaddr.lbam_addr	= base + (ATA_REG_LBAM << 1) + 1;
  		ap->ioaddr.lbah_addr	= base + (ATA_REG_LBAH << 1) + 1;
  		ap->ioaddr.device_addr	= base + (ATA_REG_DEVICE << 1) + 1;
  		ap->ioaddr.status_addr	= base + (ATA_REG_STATUS << 1) + 1;
  		ap->ioaddr.command_addr	= base + (ATA_REG_CMD << 1) + 1;
  		ap->ioaddr.altstatus_addr = cs1 + (6 << 1) + 1;
  		ap->ioaddr.ctl_addr	= cs1 + (6 << 1) + 1;
  		octeon_cf_ops.sff_data_xfer = octeon_cf_data_xfer16;
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
963
  		ap->mwdma_mask	= enable_dma ? ATA_MWDMA4 : 0;
3c929c6f5   David Daney   libata: New drive...
964

43f01da0f   David Daney   MIPS/OCTEON/ata: ...
965
966
967
968
  		/* True IDE mode needs a timer to poll for not-busy.  */
  		hrtimer_init(&cf_port->delayed_finish, CLOCK_MONOTONIC,
  			     HRTIMER_MODE_REL);
  		cf_port->delayed_finish.function = octeon_cf_delayed_finish;
3c929c6f5   David Daney   libata: New drive...
969
970
  	} else {
  		/* 16 bit but not True IDE */
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
971
  		base = cs0 + 0x800;
3c929c6f5   David Daney   libata: New drive...
972
973
974
975
976
977
978
979
980
981
982
983
984
  		octeon_cf_ops.sff_data_xfer	= octeon_cf_data_xfer16;
  		octeon_cf_ops.softreset		= octeon_cf_softreset16;
  		octeon_cf_ops.sff_check_status	= octeon_cf_check_status16;
  		octeon_cf_ops.sff_tf_read	= octeon_cf_tf_read16;
  		octeon_cf_ops.sff_tf_load	= octeon_cf_tf_load16;
  		octeon_cf_ops.sff_exec_command	= octeon_cf_exec_command16;
  
  		ap->ioaddr.data_addr	= base + ATA_REG_DATA;
  		ap->ioaddr.nsect_addr	= base + ATA_REG_NSECT;
  		ap->ioaddr.lbal_addr	= base + ATA_REG_LBAL;
  		ap->ioaddr.ctl_addr	= base + 0xe;
  		ap->ioaddr.altstatus_addr = base + 0xe;
  	}
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
985
  	cf_port->c0 = ap->ioaddr.ctl_addr;
105f4ade6   Russell King   DMA-API: ata: pat...
986
987
988
  	rv = dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
  	if (rv)
  		return rv;
3c929c6f5   David Daney   libata: New drive...
989
990
  
  	ata_port_desc(ap, "cmd %p ctl %p", base, ap->ioaddr.ctl_addr);
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
991
992
993
994
  	dev_info(&pdev->dev, "version " DRV_VERSION" %d bit%s.
  ",
  		 is_16bit ? 16 : 8,
  		 cf_port->is_true_ide ? ", True IDE" : "");
3c929c6f5   David Daney   libata: New drive...
995

43f01da0f   David Daney   MIPS/OCTEON/ata: ...
996
997
  	return ata_host_activate(host, irq, irq_handler,
  				 IRQF_SHARED, &octeon_cf_sht);
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
998
999
1000
1001
1002
1003
  }
  
  static void octeon_cf_shutdown(struct device *dev)
  {
  	union cvmx_mio_boot_dma_cfgx dma_cfg;
  	union cvmx_mio_boot_dma_intx dma_int;
61b8c345a   Jingoo Han   ata: use dev_get_...
1004
  	struct octeon_cf_port *cf_port = dev_get_platdata(dev);
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
  
  	if (cf_port->dma_base) {
  		/* Stop and clear the dma engine.  */
  		dma_cfg.u64 = 0;
  		dma_cfg.s.size = -1;
  		cvmx_write_csr(cf_port->dma_base + DMA_CFG, dma_cfg.u64);
  
  		/* Disable the interrupt.  */
  		dma_int.u64 = 0;
  		cvmx_write_csr(cf_port->dma_base + DMA_INT_EN, dma_int.u64);
  
  		/* Clear the DMA complete status */
  		dma_int.s.done = 1;
  		cvmx_write_csr(cf_port->dma_base + DMA_INT, dma_int.u64);
  
  		__raw_writeb(0, cf_port->c0);
  		udelay(20);
  		__raw_writeb(ATA_SRST, cf_port->c0);
  		udelay(20);
  		__raw_writeb(0, cf_port->c0);
  		mdelay(100);
  	}
3c929c6f5   David Daney   libata: New drive...
1027
  }
79af3ae6e   Arvind Yadav   ata: pata_octeon_...
1028
  static const struct of_device_id octeon_cf_match[] = {
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
1029
1030
1031
1032
1033
  	{
  		.compatible = "cavium,ebt3000-compact-flash",
  	},
  	{},
  };
4710f2fac   Aaro Koskinen   pata_octeon_cf: f...
1034
  MODULE_DEVICE_TABLE(of, octeon_cf_match);
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
1035

3c929c6f5   David Daney   libata: New drive...
1036
1037
1038
1039
  static struct platform_driver octeon_cf_driver = {
  	.probe		= octeon_cf_probe,
  	.driver		= {
  		.name	= DRV_NAME,
43f01da0f   David Daney   MIPS/OCTEON/ata: ...
1040
1041
  		.of_match_table = octeon_cf_match,
  		.shutdown = octeon_cf_shutdown
3c929c6f5   David Daney   libata: New drive...
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
  	},
  };
  
  static int __init octeon_cf_init(void)
  {
  	return platform_driver_register(&octeon_cf_driver);
  }
  
  
  MODULE_AUTHOR("David Daney <ddaney@caviumnetworks.com>");
  MODULE_DESCRIPTION("low-level driver for Cavium OCTEON Compact Flash PATA");
  MODULE_LICENSE("GPL");
  MODULE_VERSION(DRV_VERSION);
  MODULE_ALIAS("platform:" DRV_NAME);
  
  module_init(octeon_cf_init);