diff options
Diffstat (limited to 'drivers/ide/pci/pdc202xx_new.c')
-rw-r--r-- | drivers/ide/pci/pdc202xx_new.c | 483 |
1 files changed, 375 insertions, 108 deletions
diff --git a/drivers/ide/pci/pdc202xx_new.c b/drivers/ide/pci/pdc202xx_new.c index 3ca581063f72..7cb48576e479 100644 --- a/drivers/ide/pci/pdc202xx_new.c +++ b/drivers/ide/pci/pdc202xx_new.c | |||
@@ -39,6 +39,14 @@ | |||
39 | 39 | ||
40 | #define PDC202_DEBUG_CABLE 0 | 40 | #define PDC202_DEBUG_CABLE 0 |
41 | 41 | ||
42 | #undef DEBUG | ||
43 | |||
44 | #ifdef DEBUG | ||
45 | #define DBG(fmt, args...) printk("%s: " fmt, __FUNCTION__, ## args) | ||
46 | #else | ||
47 | #define DBG(fmt, args...) | ||
48 | #endif | ||
49 | |||
42 | static const char *pdc_quirk_drives[] = { | 50 | static const char *pdc_quirk_drives[] = { |
43 | "QUANTUM FIREBALLlct08 08", | 51 | "QUANTUM FIREBALLlct08 08", |
44 | "QUANTUM FIREBALLP KA6.4", | 52 | "QUANTUM FIREBALLP KA6.4", |
@@ -51,37 +59,11 @@ static const char *pdc_quirk_drives[] = { | |||
51 | NULL | 59 | NULL |
52 | }; | 60 | }; |
53 | 61 | ||
54 | #define set_2regs(a, b) \ | 62 | static u8 max_dma_rate(struct pci_dev *pdev) |
55 | do { \ | ||
56 | hwif->OUTB((a + adj), indexreg); \ | ||
57 | hwif->OUTB(b, datareg); \ | ||
58 | } while(0) | ||
59 | |||
60 | #define set_ultra(a, b, c) \ | ||
61 | do { \ | ||
62 | set_2regs(0x10,(a)); \ | ||
63 | set_2regs(0x11,(b)); \ | ||
64 | set_2regs(0x12,(c)); \ | ||
65 | } while(0) | ||
66 | |||
67 | #define set_ata2(a, b) \ | ||
68 | do { \ | ||
69 | set_2regs(0x0e,(a)); \ | ||
70 | set_2regs(0x0f,(b)); \ | ||
71 | } while(0) | ||
72 | |||
73 | #define set_pio(a, b, c) \ | ||
74 | do { \ | ||
75 | set_2regs(0x0c,(a)); \ | ||
76 | set_2regs(0x0d,(b)); \ | ||
77 | set_2regs(0x13,(c)); \ | ||
78 | } while(0) | ||
79 | |||
80 | static u8 pdcnew_ratemask (ide_drive_t *drive) | ||
81 | { | 63 | { |
82 | u8 mode; | 64 | u8 mode; |
83 | 65 | ||
84 | switch(HWIF(drive)->pci_dev->device) { | 66 | switch(pdev->device) { |
85 | case PCI_DEVICE_ID_PROMISE_20277: | 67 | case PCI_DEVICE_ID_PROMISE_20277: |
86 | case PCI_DEVICE_ID_PROMISE_20276: | 68 | case PCI_DEVICE_ID_PROMISE_20276: |
87 | case PCI_DEVICE_ID_PROMISE_20275: | 69 | case PCI_DEVICE_ID_PROMISE_20275: |
@@ -96,12 +78,21 @@ static u8 pdcnew_ratemask (ide_drive_t *drive) | |||
96 | default: | 78 | default: |
97 | return 0; | 79 | return 0; |
98 | } | 80 | } |
99 | if (!eighty_ninty_three(drive)) | 81 | |
100 | mode = min(mode, (u8)1); | ||
101 | return mode; | 82 | return mode; |
102 | } | 83 | } |
103 | 84 | ||
104 | static int check_in_drive_lists (ide_drive_t *drive, const char **list) | 85 | static u8 pdcnew_ratemask(ide_drive_t *drive) |
86 | { | ||
87 | u8 mode = max_dma_rate(HWIF(drive)->pci_dev); | ||
88 | |||
89 | if (!eighty_ninty_three(drive)) | ||
90 | mode = min_t(u8, mode, 1); | ||
91 | |||
92 | return mode; | ||
93 | } | ||
94 | |||
95 | static int check_in_drive_lists(ide_drive_t *drive, const char **list) | ||
105 | { | 96 | { |
106 | struct hd_driveid *id = drive->id; | 97 | struct hd_driveid *id = drive->id; |
107 | 98 | ||
@@ -121,43 +112,141 @@ static int check_in_drive_lists (ide_drive_t *drive, const char **list) | |||
121 | return 0; | 112 | return 0; |
122 | } | 113 | } |
123 | 114 | ||
124 | static int pdcnew_new_tune_chipset (ide_drive_t *drive, u8 xferspeed) | 115 | /** |
116 | * get_indexed_reg - Get indexed register | ||
117 | * @hwif: for the port address | ||
118 | * @index: index of the indexed register | ||
119 | */ | ||
120 | static u8 get_indexed_reg(ide_hwif_t *hwif, u8 index) | ||
121 | { | ||
122 | u8 value; | ||
123 | |||
124 | hwif->OUTB(index, hwif->dma_vendor1); | ||
125 | value = hwif->INB(hwif->dma_vendor3); | ||
126 | |||
127 | DBG("index[%02X] value[%02X]\n", index, value); | ||
128 | return value; | ||
129 | } | ||
130 | |||
131 | /** | ||
132 | * set_indexed_reg - Set indexed register | ||
133 | * @hwif: for the port address | ||
134 | * @index: index of the indexed register | ||
135 | */ | ||
136 | static void set_indexed_reg(ide_hwif_t *hwif, u8 index, u8 value) | ||
137 | { | ||
138 | hwif->OUTB(index, hwif->dma_vendor1); | ||
139 | hwif->OUTB(value, hwif->dma_vendor3); | ||
140 | DBG("index[%02X] value[%02X]\n", index, value); | ||
141 | } | ||
142 | |||
143 | /* | ||
144 | * ATA Timing Tables based on 133 MHz PLL output clock. | ||
145 | * | ||
146 | * If the PLL outputs 100 MHz clock, the ASIC hardware will set | ||
147 | * the timing registers automatically when "set features" command is | ||
148 | * issued to the device. However, if the PLL output clock is 133 MHz, | ||
149 | * the following tables must be used. | ||
150 | */ | ||
151 | static struct pio_timing { | ||
152 | u8 reg0c, reg0d, reg13; | ||
153 | } pio_timings [] = { | ||
154 | { 0xfb, 0x2b, 0xac }, /* PIO mode 0, IORDY off, Prefetch off */ | ||
155 | { 0x46, 0x29, 0xa4 }, /* PIO mode 1, IORDY off, Prefetch off */ | ||
156 | { 0x23, 0x26, 0x64 }, /* PIO mode 2, IORDY off, Prefetch off */ | ||
157 | { 0x27, 0x0d, 0x35 }, /* PIO mode 3, IORDY on, Prefetch off */ | ||
158 | { 0x23, 0x09, 0x25 }, /* PIO mode 4, IORDY on, Prefetch off */ | ||
159 | }; | ||
160 | |||
161 | static struct mwdma_timing { | ||
162 | u8 reg0e, reg0f; | ||
163 | } mwdma_timings [] = { | ||
164 | { 0xdf, 0x5f }, /* MWDMA mode 0 */ | ||
165 | { 0x6b, 0x27 }, /* MWDMA mode 1 */ | ||
166 | { 0x69, 0x25 }, /* MWDMA mode 2 */ | ||
167 | }; | ||
168 | |||
169 | static struct udma_timing { | ||
170 | u8 reg10, reg11, reg12; | ||
171 | } udma_timings [] = { | ||
172 | { 0x4a, 0x0f, 0xd5 }, /* UDMA mode 0 */ | ||
173 | { 0x3a, 0x0a, 0xd0 }, /* UDMA mode 1 */ | ||
174 | { 0x2a, 0x07, 0xcd }, /* UDMA mode 2 */ | ||
175 | { 0x1a, 0x05, 0xcd }, /* UDMA mode 3 */ | ||
176 | { 0x1a, 0x03, 0xcd }, /* UDMA mode 4 */ | ||
177 | { 0x1a, 0x02, 0xcb }, /* UDMA mode 5 */ | ||
178 | { 0x1a, 0x01, 0xcb }, /* UDMA mode 6 */ | ||
179 | }; | ||
180 | |||
181 | static int pdcnew_tune_chipset(ide_drive_t *drive, u8 speed) | ||
125 | { | 182 | { |
126 | ide_hwif_t *hwif = HWIF(drive); | 183 | ide_hwif_t *hwif = HWIF(drive); |
127 | unsigned long indexreg = hwif->dma_vendor1; | 184 | u8 adj = (drive->dn & 1) ? 0x08 : 0x00; |
128 | unsigned long datareg = hwif->dma_vendor3; | 185 | int err; |
129 | u8 thold = 0x10; | ||
130 | u8 adj = (drive->dn%2) ? 0x08 : 0x00; | ||
131 | u8 speed = ide_rate_filter(pdcnew_ratemask(drive), xferspeed); | ||
132 | |||
133 | if (speed == XFER_UDMA_2) { | ||
134 | hwif->OUTB((thold + adj), indexreg); | ||
135 | hwif->OUTB((hwif->INB(datareg) & 0x7f), datareg); | ||
136 | } | ||
137 | 186 | ||
138 | switch (speed) { | 187 | speed = ide_rate_filter(pdcnew_ratemask(drive), speed); |
139 | case XFER_UDMA_7: | 188 | |
140 | speed = XFER_UDMA_6; | 189 | /* |
141 | case XFER_UDMA_6: set_ultra(0x1a, 0x01, 0xcb); break; | 190 | * Issue SETFEATURES_XFER to the drive first. PDC202xx hardware will |
142 | case XFER_UDMA_5: set_ultra(0x1a, 0x02, 0xcb); break; | 191 | * automatically set the timing registers based on 100 MHz PLL output. |
143 | case XFER_UDMA_4: set_ultra(0x1a, 0x03, 0xcd); break; | 192 | */ |
144 | case XFER_UDMA_3: set_ultra(0x1a, 0x05, 0xcd); break; | 193 | err = ide_config_drive_speed(drive, speed); |
145 | case XFER_UDMA_2: set_ultra(0x2a, 0x07, 0xcd); break; | 194 | |
146 | case XFER_UDMA_1: set_ultra(0x3a, 0x0a, 0xd0); break; | 195 | /* |
147 | case XFER_UDMA_0: set_ultra(0x4a, 0x0f, 0xd5); break; | 196 | * As we set up the PLL to output 133 MHz for UltraDMA/133 capable |
148 | case XFER_MW_DMA_2: set_ata2(0x69, 0x25); break; | 197 | * chips, we must override the default register settings... |
149 | case XFER_MW_DMA_1: set_ata2(0x6b, 0x27); break; | 198 | */ |
150 | case XFER_MW_DMA_0: set_ata2(0xdf, 0x5f); break; | 199 | if (max_dma_rate(hwif->pci_dev) == 4) { |
151 | case XFER_PIO_4: set_pio(0x23, 0x09, 0x25); break; | 200 | u8 mode = speed & 0x07; |
152 | case XFER_PIO_3: set_pio(0x27, 0x0d, 0x35); break; | 201 | |
153 | case XFER_PIO_2: set_pio(0x23, 0x26, 0x64); break; | 202 | switch (speed) { |
154 | case XFER_PIO_1: set_pio(0x46, 0x29, 0xa4); break; | 203 | case XFER_UDMA_6: |
155 | case XFER_PIO_0: set_pio(0xfb, 0x2b, 0xac); break; | 204 | case XFER_UDMA_5: |
156 | default: | 205 | case XFER_UDMA_4: |
157 | ; | 206 | case XFER_UDMA_3: |
158 | } | 207 | case XFER_UDMA_2: |
208 | case XFER_UDMA_1: | ||
209 | case XFER_UDMA_0: | ||
210 | set_indexed_reg(hwif, 0x10 + adj, | ||
211 | udma_timings[mode].reg10); | ||
212 | set_indexed_reg(hwif, 0x11 + adj, | ||
213 | udma_timings[mode].reg11); | ||
214 | set_indexed_reg(hwif, 0x12 + adj, | ||
215 | udma_timings[mode].reg12); | ||
216 | break; | ||
217 | |||
218 | case XFER_MW_DMA_2: | ||
219 | case XFER_MW_DMA_1: | ||
220 | case XFER_MW_DMA_0: | ||
221 | set_indexed_reg(hwif, 0x0e + adj, | ||
222 | mwdma_timings[mode].reg0e); | ||
223 | set_indexed_reg(hwif, 0x0f + adj, | ||
224 | mwdma_timings[mode].reg0f); | ||
225 | break; | ||
226 | case XFER_PIO_4: | ||
227 | case XFER_PIO_3: | ||
228 | case XFER_PIO_2: | ||
229 | case XFER_PIO_1: | ||
230 | case XFER_PIO_0: | ||
231 | set_indexed_reg(hwif, 0x0c + adj, | ||
232 | pio_timings[mode].reg0c); | ||
233 | set_indexed_reg(hwif, 0x0d + adj, | ||
234 | pio_timings[mode].reg0d); | ||
235 | set_indexed_reg(hwif, 0x13 + adj, | ||
236 | pio_timings[mode].reg13); | ||
237 | break; | ||
238 | default: | ||
239 | printk(KERN_ERR "pdc202xx_new: " | ||
240 | "Unknown speed %d ignored\n", speed); | ||
241 | } | ||
242 | } else if (speed == XFER_UDMA_2) { | ||
243 | /* Set tHOLD bit to 0 if using UDMA mode 2 */ | ||
244 | u8 tmp = get_indexed_reg(hwif, 0x10 + adj); | ||
159 | 245 | ||
160 | return (ide_config_drive_speed(drive, speed)); | 246 | set_indexed_reg(hwif, 0x10 + adj, tmp & 0x7f); |
247 | } | ||
248 | |||
249 | return err; | ||
161 | } | 250 | } |
162 | 251 | ||
163 | /* 0 1 2 3 4 5 6 7 8 | 252 | /* 0 1 2 3 4 5 6 7 8 |
@@ -170,36 +259,42 @@ static int pdcnew_new_tune_chipset (ide_drive_t *drive, u8 xferspeed) | |||
170 | static void pdcnew_tune_drive(ide_drive_t *drive, u8 pio) | 259 | static void pdcnew_tune_drive(ide_drive_t *drive, u8 pio) |
171 | { | 260 | { |
172 | pio = ide_get_best_pio_mode(drive, pio, 4, NULL); | 261 | pio = ide_get_best_pio_mode(drive, pio, 4, NULL); |
173 | (void)pdcnew_new_tune_chipset(drive, XFER_PIO_0 + pio); | 262 | (void)pdcnew_tune_chipset(drive, XFER_PIO_0 + pio); |
174 | } | 263 | } |
175 | 264 | ||
176 | static u8 pdcnew_new_cable_detect (ide_hwif_t *hwif) | 265 | static u8 pdcnew_cable_detect(ide_hwif_t *hwif) |
177 | { | 266 | { |
178 | hwif->OUTB(0x0b, hwif->dma_vendor1); | 267 | return get_indexed_reg(hwif, 0x0b) & 0x04; |
179 | return ((u8)((hwif->INB(hwif->dma_vendor3) & 0x04))); | ||
180 | } | 268 | } |
181 | static int config_chipset_for_dma (ide_drive_t *drive) | 269 | |
270 | static int config_chipset_for_dma(ide_drive_t *drive) | ||
182 | { | 271 | { |
183 | struct hd_driveid *id = drive->id; | 272 | struct hd_driveid *id = drive->id; |
184 | ide_hwif_t *hwif = HWIF(drive); | 273 | ide_hwif_t *hwif = HWIF(drive); |
185 | u8 speed = -1; | 274 | u8 ultra_66 = (id->dma_ultra & 0x0078) ? 1 : 0; |
186 | u8 cable; | 275 | u8 cable = pdcnew_cable_detect(hwif); |
187 | 276 | u8 speed; | |
188 | u8 ultra_66 = ((id->dma_ultra & 0x0010) || | ||
189 | (id->dma_ultra & 0x0008)) ? 1 : 0; | ||
190 | |||
191 | cable = pdcnew_new_cable_detect(hwif); | ||
192 | 277 | ||
193 | if (ultra_66 && cable) { | 278 | if (ultra_66 && cable) { |
194 | printk(KERN_WARNING "Warning: %s channel requires an 80-pin cable for operation.\n", hwif->channel ? "Secondary":"Primary"); | 279 | printk(KERN_WARNING "Warning: %s channel " |
280 | "requires an 80-pin cable for operation.\n", | ||
281 | hwif->channel ? "Secondary" : "Primary"); | ||
195 | printk(KERN_WARNING "%s reduced to Ultra33 mode.\n", drive->name); | 282 | printk(KERN_WARNING "%s reduced to Ultra33 mode.\n", drive->name); |
196 | } | 283 | } |
197 | 284 | ||
198 | if (drive->media != ide_disk) | 285 | if (drive->media != ide_disk) |
199 | return 0; | 286 | return 0; |
200 | if (id->capability & 4) { /* IORDY_EN & PREFETCH_EN */ | 287 | |
201 | hwif->OUTB((0x13 + ((drive->dn%2) ? 0x08 : 0x00)), hwif->dma_vendor1); | 288 | if (id->capability & 4) { |
202 | hwif->OUTB((hwif->INB(hwif->dma_vendor3)|0x03), hwif->dma_vendor3); | 289 | /* |
290 | * Set IORDY_EN & PREFETCH_EN (this seems to have | ||
291 | * NO real effect since this register is reloaded | ||
292 | * by hardware when the transfer mode is selected) | ||
293 | */ | ||
294 | u8 tmp, adj = (drive->dn & 1) ? 0x08 : 0x00; | ||
295 | |||
296 | tmp = get_indexed_reg(hwif, 0x13 + adj); | ||
297 | set_indexed_reg(hwif, 0x13 + adj, tmp | 0x03); | ||
203 | } | 298 | } |
204 | 299 | ||
205 | speed = ide_dma_speed(drive, pdcnew_ratemask(drive)); | 300 | speed = ide_dma_speed(drive, pdcnew_ratemask(drive)); |
@@ -211,7 +306,7 @@ static int config_chipset_for_dma (ide_drive_t *drive) | |||
211 | return ide_dma_enable(drive); | 306 | return ide_dma_enable(drive); |
212 | } | 307 | } |
213 | 308 | ||
214 | static int pdcnew_config_drive_xfer_rate (ide_drive_t *drive) | 309 | static int pdcnew_config_drive_xfer_rate(ide_drive_t *drive) |
215 | { | 310 | { |
216 | ide_hwif_t *hwif = HWIF(drive); | 311 | ide_hwif_t *hwif = HWIF(drive); |
217 | struct hd_driveid *id = drive->id; | 312 | struct hd_driveid *id = drive->id; |
@@ -236,9 +331,9 @@ fast_ata_pio: | |||
236 | return 0; | 331 | return 0; |
237 | } | 332 | } |
238 | 333 | ||
239 | static int pdcnew_quirkproc (ide_drive_t *drive) | 334 | static int pdcnew_quirkproc(ide_drive_t *drive) |
240 | { | 335 | { |
241 | return ((int) check_in_drive_lists(drive, pdc_quirk_drives)); | 336 | return check_in_drive_lists(drive, pdc_quirk_drives); |
242 | } | 337 | } |
243 | 338 | ||
244 | static int pdcnew_ide_dma_lostirq(ide_drive_t *drive) | 339 | static int pdcnew_ide_dma_lostirq(ide_drive_t *drive) |
@@ -255,21 +350,100 @@ static int pdcnew_ide_dma_timeout(ide_drive_t *drive) | |||
255 | return __ide_dma_timeout(drive); | 350 | return __ide_dma_timeout(drive); |
256 | } | 351 | } |
257 | 352 | ||
258 | static void pdcnew_new_reset (ide_drive_t *drive) | 353 | static void pdcnew_reset(ide_drive_t *drive) |
259 | { | 354 | { |
260 | /* | 355 | /* |
261 | * Deleted this because it is redundant from the caller. | 356 | * Deleted this because it is redundant from the caller. |
262 | */ | 357 | */ |
263 | printk(KERN_WARNING "PDC202XX: %s channel reset.\n", | 358 | printk(KERN_WARNING "pdc202xx_new: %s channel reset.\n", |
264 | HWIF(drive)->channel ? "Secondary" : "Primary"); | 359 | HWIF(drive)->channel ? "Secondary" : "Primary"); |
265 | } | 360 | } |
266 | 361 | ||
362 | /** | ||
363 | * read_counter - Read the byte count registers | ||
364 | * @dma_base: for the port address | ||
365 | */ | ||
366 | static long __devinit read_counter(u32 dma_base) | ||
367 | { | ||
368 | u32 pri_dma_base = dma_base, sec_dma_base = dma_base + 0x08; | ||
369 | u8 cnt0, cnt1, cnt2, cnt3; | ||
370 | long count = 0, last; | ||
371 | int retry = 3; | ||
372 | |||
373 | do { | ||
374 | last = count; | ||
375 | |||
376 | /* Read the current count */ | ||
377 | outb(0x20, pri_dma_base + 0x01); | ||
378 | cnt0 = inb(pri_dma_base + 0x03); | ||
379 | outb(0x21, pri_dma_base + 0x01); | ||
380 | cnt1 = inb(pri_dma_base + 0x03); | ||
381 | outb(0x20, sec_dma_base + 0x01); | ||
382 | cnt2 = inb(sec_dma_base + 0x03); | ||
383 | outb(0x21, sec_dma_base + 0x01); | ||
384 | cnt3 = inb(sec_dma_base + 0x03); | ||
385 | |||
386 | count = (cnt3 << 23) | (cnt2 << 15) | (cnt1 << 8) | cnt0; | ||
387 | |||
388 | /* | ||
389 | * The 30-bit decrementing counter is read in 4 pieces. | ||
390 | * Incorrect value may be read when the most significant bytes | ||
391 | * are changing... | ||
392 | */ | ||
393 | } while (retry-- && (((last ^ count) & 0x3fff8000) || last < count)); | ||
394 | |||
395 | DBG("cnt0[%02X] cnt1[%02X] cnt2[%02X] cnt3[%02X]\n", | ||
396 | cnt0, cnt1, cnt2, cnt3); | ||
397 | |||
398 | return count; | ||
399 | } | ||
400 | |||
401 | /** | ||
402 | * detect_pll_input_clock - Detect the PLL input clock in Hz. | ||
403 | * @dma_base: for the port address | ||
404 | * E.g. 16949000 on 33 MHz PCI bus, i.e. half of the PCI clock. | ||
405 | */ | ||
406 | static long __devinit detect_pll_input_clock(unsigned long dma_base) | ||
407 | { | ||
408 | long start_count, end_count; | ||
409 | long pll_input; | ||
410 | u8 scr1; | ||
411 | |||
412 | start_count = read_counter(dma_base); | ||
413 | |||
414 | /* Start the test mode */ | ||
415 | outb(0x01, dma_base + 0x01); | ||
416 | scr1 = inb(dma_base + 0x03); | ||
417 | DBG("scr1[%02X]\n", scr1); | ||
418 | outb(scr1 | 0x40, dma_base + 0x03); | ||
419 | |||
420 | /* Let the counter run for 10 ms. */ | ||
421 | mdelay(10); | ||
422 | |||
423 | end_count = read_counter(dma_base); | ||
424 | |||
425 | /* Stop the test mode */ | ||
426 | outb(0x01, dma_base + 0x01); | ||
427 | scr1 = inb(dma_base + 0x03); | ||
428 | DBG("scr1[%02X]\n", scr1); | ||
429 | outb(scr1 & ~0x40, dma_base + 0x03); | ||
430 | |||
431 | /* | ||
432 | * Calculate the input clock in Hz | ||
433 | * (the clock counter is 30 bit wide and counts down) | ||
434 | */ | ||
435 | pll_input = ((start_count - end_count) & 0x3ffffff) * 100; | ||
436 | |||
437 | DBG("start[%ld] end[%ld]\n", start_count, end_count); | ||
438 | |||
439 | return pll_input; | ||
440 | } | ||
441 | |||
267 | #ifdef CONFIG_PPC_PMAC | 442 | #ifdef CONFIG_PPC_PMAC |
268 | static void __devinit apple_kiwi_init(struct pci_dev *pdev) | 443 | static void __devinit apple_kiwi_init(struct pci_dev *pdev) |
269 | { | 444 | { |
270 | struct device_node *np = pci_device_to_OF_node(pdev); | 445 | struct device_node *np = pci_device_to_OF_node(pdev); |
271 | unsigned int class_rev = 0; | 446 | unsigned int class_rev = 0; |
272 | void __iomem *mmio; | ||
273 | u8 conf; | 447 | u8 conf; |
274 | 448 | ||
275 | if (np == NULL || !device_is_compatible(np, "kiwi-root")) | 449 | if (np == NULL || !device_is_compatible(np, "kiwi-root")) |
@@ -280,30 +454,20 @@ static void __devinit apple_kiwi_init(struct pci_dev *pdev) | |||
280 | 454 | ||
281 | if (class_rev >= 0x03) { | 455 | if (class_rev >= 0x03) { |
282 | /* Setup chip magic config stuff (from darwin) */ | 456 | /* Setup chip magic config stuff (from darwin) */ |
283 | pci_read_config_byte(pdev, 0x40, &conf); | 457 | pci_read_config_byte (pdev, 0x40, &conf); |
284 | pci_write_config_byte(pdev, 0x40, conf | 0x01); | 458 | pci_write_config_byte(pdev, 0x40, (conf | 0x01)); |
285 | } | ||
286 | mmio = ioremap(pci_resource_start(pdev, 5), | ||
287 | pci_resource_len(pdev, 5)); | ||
288 | |||
289 | /* Setup some PLL stuffs */ | ||
290 | switch (pdev->device) { | ||
291 | case PCI_DEVICE_ID_PROMISE_20270: | ||
292 | writew(0x0d2b, mmio + 0x1202); | ||
293 | mdelay(30); | ||
294 | break; | ||
295 | case PCI_DEVICE_ID_PROMISE_20271: | ||
296 | writew(0x0826, mmio + 0x1202); | ||
297 | mdelay(30); | ||
298 | break; | ||
299 | } | 459 | } |
300 | |||
301 | iounmap(mmio); | ||
302 | } | 460 | } |
303 | #endif /* CONFIG_PPC_PMAC */ | 461 | #endif /* CONFIG_PPC_PMAC */ |
304 | 462 | ||
305 | static unsigned int __devinit init_chipset_pdcnew(struct pci_dev *dev, const char *name) | 463 | static unsigned int __devinit init_chipset_pdcnew(struct pci_dev *dev, const char *name) |
306 | { | 464 | { |
465 | unsigned long dma_base = pci_resource_start(dev, 4); | ||
466 | unsigned long sec_dma_base = dma_base + 0x08; | ||
467 | long pll_input, pll_output, ratio; | ||
468 | int f, r; | ||
469 | u8 pll_ctl0, pll_ctl1; | ||
470 | |||
307 | if (dev->resource[PCI_ROM_RESOURCE].start) { | 471 | if (dev->resource[PCI_ROM_RESOURCE].start) { |
308 | pci_write_config_dword(dev, PCI_ROM_ADDRESS, | 472 | pci_write_config_dword(dev, PCI_ROM_ADDRESS, |
309 | dev->resource[PCI_ROM_RESOURCE].start | PCI_ROM_ADDRESS_ENABLE); | 473 | dev->resource[PCI_ROM_RESOURCE].start | PCI_ROM_ADDRESS_ENABLE); |
@@ -315,6 +479,106 @@ static unsigned int __devinit init_chipset_pdcnew(struct pci_dev *dev, const cha | |||
315 | apple_kiwi_init(dev); | 479 | apple_kiwi_init(dev); |
316 | #endif | 480 | #endif |
317 | 481 | ||
482 | /* Calculate the required PLL output frequency */ | ||
483 | switch(max_dma_rate(dev)) { | ||
484 | case 4: /* it's 133 MHz for Ultra133 chips */ | ||
485 | pll_output = 133333333; | ||
486 | break; | ||
487 | case 3: /* and 100 MHz for Ultra100 chips */ | ||
488 | default: | ||
489 | pll_output = 100000000; | ||
490 | break; | ||
491 | } | ||
492 | |||
493 | /* | ||
494 | * Detect PLL input clock. | ||
495 | * On some systems, where PCI bus is running at non-standard clock rate | ||
496 | * (e.g. 25 or 40 MHz), we have to adjust the cycle time. | ||
497 | * PDC20268 and newer chips employ PLL circuit to help correct timing | ||
498 | * registers setting. | ||
499 | */ | ||
500 | pll_input = detect_pll_input_clock(dma_base); | ||
501 | printk("%s: PLL input clock is %ld kHz\n", name, pll_input / 1000); | ||
502 | |||
503 | /* Sanity check */ | ||
504 | if (unlikely(pll_input < 5000000L || pll_input > 70000000L)) { | ||
505 | printk(KERN_ERR "%s: Bad PLL input clock %ld Hz, giving up!\n", | ||
506 | name, pll_input); | ||
507 | goto out; | ||
508 | } | ||
509 | |||
510 | #ifdef DEBUG | ||
511 | DBG("pll_output is %ld Hz\n", pll_output); | ||
512 | |||
513 | /* Show the current clock value of PLL control register | ||
514 | * (maybe already configured by the BIOS) | ||
515 | */ | ||
516 | outb(0x02, sec_dma_base + 0x01); | ||
517 | pll_ctl0 = inb(sec_dma_base + 0x03); | ||
518 | outb(0x03, sec_dma_base + 0x01); | ||
519 | pll_ctl1 = inb(sec_dma_base + 0x03); | ||
520 | |||
521 | DBG("pll_ctl[%02X][%02X]\n", pll_ctl0, pll_ctl1); | ||
522 | #endif | ||
523 | |||
524 | /* | ||
525 | * Calculate the ratio of F, R and NO | ||
526 | * POUT = (F + 2) / (( R + 2) * NO) | ||
527 | */ | ||
528 | ratio = pll_output / (pll_input / 1000); | ||
529 | if (ratio < 8600L) { /* 8.6x */ | ||
530 | /* Using NO = 0x01, R = 0x0d */ | ||
531 | r = 0x0d; | ||
532 | } else if (ratio < 12900L) { /* 12.9x */ | ||
533 | /* Using NO = 0x01, R = 0x08 */ | ||
534 | r = 0x08; | ||
535 | } else if (ratio < 16100L) { /* 16.1x */ | ||
536 | /* Using NO = 0x01, R = 0x06 */ | ||
537 | r = 0x06; | ||
538 | } else if (ratio < 64000L) { /* 64x */ | ||
539 | r = 0x00; | ||
540 | } else { | ||
541 | /* Invalid ratio */ | ||
542 | printk(KERN_ERR "%s: Bad ratio %ld, giving up!\n", name, ratio); | ||
543 | goto out; | ||
544 | } | ||
545 | |||
546 | f = (ratio * (r + 2)) / 1000 - 2; | ||
547 | |||
548 | DBG("F[%d] R[%d] ratio*1000[%ld]\n", f, r, ratio); | ||
549 | |||
550 | if (unlikely(f < 0 || f > 127)) { | ||
551 | /* Invalid F */ | ||
552 | printk(KERN_ERR "%s: F[%d] invalid!\n", name, f); | ||
553 | goto out; | ||
554 | } | ||
555 | |||
556 | pll_ctl0 = (u8) f; | ||
557 | pll_ctl1 = (u8) r; | ||
558 | |||
559 | DBG("Writing pll_ctl[%02X][%02X]\n", pll_ctl0, pll_ctl1); | ||
560 | |||
561 | outb(0x02, sec_dma_base + 0x01); | ||
562 | outb(pll_ctl0, sec_dma_base + 0x03); | ||
563 | outb(0x03, sec_dma_base + 0x01); | ||
564 | outb(pll_ctl1, sec_dma_base + 0x03); | ||
565 | |||
566 | /* Wait the PLL circuit to be stable */ | ||
567 | mdelay(30); | ||
568 | |||
569 | #ifdef DEBUG | ||
570 | /* | ||
571 | * Show the current clock value of PLL control register | ||
572 | */ | ||
573 | outb(0x02, sec_dma_base + 0x01); | ||
574 | pll_ctl0 = inb(sec_dma_base + 0x03); | ||
575 | outb(0x03, sec_dma_base + 0x01); | ||
576 | pll_ctl1 = inb(sec_dma_base + 0x03); | ||
577 | |||
578 | DBG("pll_ctl[%02X][%02X]\n", pll_ctl0, pll_ctl1); | ||
579 | #endif | ||
580 | |||
581 | out: | ||
318 | return dev->irq; | 582 | return dev->irq; |
319 | } | 583 | } |
320 | 584 | ||
@@ -324,8 +588,8 @@ static void __devinit init_hwif_pdc202new(ide_hwif_t *hwif) | |||
324 | 588 | ||
325 | hwif->tuneproc = &pdcnew_tune_drive; | 589 | hwif->tuneproc = &pdcnew_tune_drive; |
326 | hwif->quirkproc = &pdcnew_quirkproc; | 590 | hwif->quirkproc = &pdcnew_quirkproc; |
327 | hwif->speedproc = &pdcnew_new_tune_chipset; | 591 | hwif->speedproc = &pdcnew_tune_chipset; |
328 | hwif->resetproc = &pdcnew_new_reset; | 592 | hwif->resetproc = &pdcnew_reset; |
329 | 593 | ||
330 | hwif->drives[0].autotune = hwif->drives[1].autotune = 1; | 594 | hwif->drives[0].autotune = hwif->drives[1].autotune = 1; |
331 | 595 | ||
@@ -337,11 +601,14 @@ static void __devinit init_hwif_pdc202new(ide_hwif_t *hwif) | |||
337 | hwif->ide_dma_check = &pdcnew_config_drive_xfer_rate; | 601 | hwif->ide_dma_check = &pdcnew_config_drive_xfer_rate; |
338 | hwif->ide_dma_lostirq = &pdcnew_ide_dma_lostirq; | 602 | hwif->ide_dma_lostirq = &pdcnew_ide_dma_lostirq; |
339 | hwif->ide_dma_timeout = &pdcnew_ide_dma_timeout; | 603 | hwif->ide_dma_timeout = &pdcnew_ide_dma_timeout; |
340 | if (!(hwif->udma_four)) | 604 | |
341 | hwif->udma_four = (pdcnew_new_cable_detect(hwif)) ? 0 : 1; | 605 | if (!hwif->udma_four) |
606 | hwif->udma_four = pdcnew_cable_detect(hwif) ? 0 : 1; | ||
607 | |||
342 | if (!noautodma) | 608 | if (!noautodma) |
343 | hwif->autodma = 1; | 609 | hwif->autodma = 1; |
344 | hwif->drives[0].autodma = hwif->drives[1].autodma = hwif->autodma; | 610 | hwif->drives[0].autodma = hwif->drives[1].autodma = hwif->autodma; |
611 | |||
345 | #if PDC202_DEBUG_CABLE | 612 | #if PDC202_DEBUG_CABLE |
346 | printk(KERN_DEBUG "%s: %s-pin cable\n", | 613 | printk(KERN_DEBUG "%s: %s-pin cable\n", |
347 | hwif->name, hwif->udma_four ? "80" : "40"); | 614 | hwif->name, hwif->udma_four ? "80" : "40"); |