]>
Commit | Line | Data |
---|---|---|
28920b1f PH |
1 | /* |
2 | * (C) Copyright 2001 | |
3 | * Rob Taylor, Flying Pig Systems. robt@flyingpig.com. | |
4 | * | |
5 | * (C) Copyright 2000-2011 | |
6 | * Wolfgang Denk, DENX Software Engineering, wd@denx.de. | |
7 | * | |
1a459660 | 8 | * SPDX-License-Identifier: GPL-2.0+ |
28920b1f PH |
9 | */ |
10 | ||
11 | #include <common.h> | |
12 | #include <ide.h> | |
13 | #include <ata.h> | |
0a4a64c0 | 14 | #include <asm/io.h> |
28920b1f PH |
15 | |
16 | #define EIEIO __asm__ volatile ("eieio") | |
17 | #define SYNC __asm__ volatile ("sync") | |
18 | ||
19 | void ide_input_swap_data(int dev, ulong *sect_buf, int words) | |
20 | { | |
21 | uchar i; | |
22 | volatile uchar *pbuf_even = | |
23 | (uchar *) (ATA_CURR_BASE(dev) + ATA_DATA_EVEN); | |
24 | volatile uchar *pbuf_odd = | |
25 | (uchar *) (ATA_CURR_BASE(dev) + ATA_DATA_ODD); | |
26 | ushort *dbuf = (ushort *) sect_buf; | |
27 | ||
28 | while (words--) { | |
29 | for (i = 0; i < 2; i++) { | |
30 | *(((uchar *) (dbuf)) + 1) = *pbuf_even; | |
31 | *(uchar *) dbuf = *pbuf_odd; | |
32 | dbuf += 1; | |
33 | } | |
34 | } | |
35 | } | |
36 | ||
37 | void ide_input_data(int dev, ulong *sect_buf, int words) | |
38 | { | |
39 | uchar *dbuf; | |
40 | volatile uchar *pbuf_even; | |
41 | volatile uchar *pbuf_odd; | |
42 | ||
43 | pbuf_even = (uchar *) (ATA_CURR_BASE(dev) + ATA_DATA_EVEN); | |
44 | pbuf_odd = (uchar *) (ATA_CURR_BASE(dev) + ATA_DATA_ODD); | |
45 | dbuf = (uchar *) sect_buf; | |
46 | while (words--) { | |
47 | *dbuf++ = *pbuf_even; | |
48 | EIEIO; | |
49 | SYNC; | |
50 | *dbuf++ = *pbuf_odd; | |
51 | EIEIO; | |
52 | SYNC; | |
53 | *dbuf++ = *pbuf_even; | |
54 | EIEIO; | |
55 | SYNC; | |
56 | *dbuf++ = *pbuf_odd; | |
57 | EIEIO; | |
58 | SYNC; | |
59 | } | |
60 | } | |
61 | ||
62 | void ide_input_data_shorts(int dev, ushort *sect_buf, int shorts) | |
63 | { | |
64 | uchar *dbuf; | |
65 | volatile uchar *pbuf_even; | |
66 | volatile uchar *pbuf_odd; | |
67 | ||
68 | pbuf_even = (uchar *) (ATA_CURR_BASE(dev) + ATA_DATA_EVEN); | |
69 | pbuf_odd = (uchar *) (ATA_CURR_BASE(dev) + ATA_DATA_ODD); | |
70 | dbuf = (uchar *) sect_buf; | |
71 | while (shorts--) { | |
72 | EIEIO; | |
73 | *dbuf++ = *pbuf_even; | |
74 | EIEIO; | |
75 | *dbuf++ = *pbuf_odd; | |
76 | } | |
77 | } | |
78 | ||
79 | void ide_output_data(int dev, const ulong *sect_buf, int words) | |
80 | { | |
81 | uchar *dbuf; | |
82 | volatile uchar *pbuf_even; | |
83 | volatile uchar *pbuf_odd; | |
84 | ||
85 | pbuf_even = (uchar *) (ATA_CURR_BASE(dev) + ATA_DATA_EVEN); | |
86 | pbuf_odd = (uchar *) (ATA_CURR_BASE(dev) + ATA_DATA_ODD); | |
87 | dbuf = (uchar *) sect_buf; | |
88 | while (words--) { | |
89 | EIEIO; | |
90 | *pbuf_even = *dbuf++; | |
91 | EIEIO; | |
92 | *pbuf_odd = *dbuf++; | |
93 | EIEIO; | |
94 | *pbuf_even = *dbuf++; | |
95 | EIEIO; | |
96 | *pbuf_odd = *dbuf++; | |
97 | } | |
98 | } | |
99 | ||
100 | void ide_output_data_shorts(int dev, ushort *sect_buf, int shorts) | |
101 | { | |
102 | uchar *dbuf; | |
103 | volatile uchar *pbuf_even; | |
104 | volatile uchar *pbuf_odd; | |
105 | ||
106 | pbuf_even = (uchar *) (ATA_CURR_BASE(dev) + ATA_DATA_EVEN); | |
107 | pbuf_odd = (uchar *) (ATA_CURR_BASE(dev) + ATA_DATA_ODD); | |
108 | dbuf = (uchar *) sect_buf; | |
109 | while (shorts--) { | |
110 | EIEIO; | |
111 | *pbuf_even = *dbuf++; | |
112 | EIEIO; | |
113 | *pbuf_odd = *dbuf++; | |
114 | } | |
115 | } | |
0a4a64c0 PH |
116 | |
117 | void ide_led(uchar led, uchar status) | |
118 | { | |
119 | u_char val; | |
120 | /* We have one PCMCIA slot and use LED H4 for the IDE Interface */ | |
121 | val = readb(BCSR_BASE + 0x04); | |
122 | if (status) /* led on */ | |
123 | val |= B_CTRL_LED0; | |
124 | else | |
125 | val &= ~B_CTRL_LED0; | |
126 | ||
127 | writeb(val, BCSR_BASE + 0x04); | |
128 | } |