aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/pci/it821x.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ide/pci/it821x.c')
-rw-r--r--drivers/ide/pci/it821x.c47
1 files changed, 28 insertions, 19 deletions
diff --git a/drivers/ide/pci/it821x.c b/drivers/ide/pci/it821x.c
index e610a5340fdc..c0797b82ce78 100644
--- a/drivers/ide/pci/it821x.c
+++ b/drivers/ide/pci/it821x.c
@@ -113,7 +113,8 @@ static int it8212_noraid;
113 113
114static void it821x_program(ide_drive_t *drive, u16 timing) 114static void it821x_program(ide_drive_t *drive, u16 timing)
115{ 115{
116 ide_hwif_t *hwif = drive->hwif; 116 ide_hwif_t *hwif = drive->hwif;
117 struct pci_dev *dev = to_pci_dev(hwif->dev);
117 struct it821x_dev *itdev = ide_get_hwifdata(hwif); 118 struct it821x_dev *itdev = ide_get_hwifdata(hwif);
118 int channel = hwif->channel; 119 int channel = hwif->channel;
119 u8 conf; 120 u8 conf;
@@ -123,7 +124,8 @@ static void it821x_program(ide_drive_t *drive, u16 timing)
123 conf = timing >> 8; 124 conf = timing >> 8;
124 else 125 else
125 conf = timing & 0xFF; 126 conf = timing & 0xFF;
126 pci_write_config_byte(hwif->pci_dev, 0x54 + 4 * channel, conf); 127
128 pci_write_config_byte(dev, 0x54 + 4 * channel, conf);
127} 129}
128 130
129/** 131/**
@@ -137,7 +139,8 @@ static void it821x_program(ide_drive_t *drive, u16 timing)
137 139
138static void it821x_program_udma(ide_drive_t *drive, u16 timing) 140static void it821x_program_udma(ide_drive_t *drive, u16 timing)
139{ 141{
140 ide_hwif_t *hwif = drive->hwif; 142 ide_hwif_t *hwif = drive->hwif;
143 struct pci_dev *dev = to_pci_dev(hwif->dev);
141 struct it821x_dev *itdev = ide_get_hwifdata(hwif); 144 struct it821x_dev *itdev = ide_get_hwifdata(hwif);
142 int channel = hwif->channel; 145 int channel = hwif->channel;
143 int unit = drive->select.b.unit; 146 int unit = drive->select.b.unit;
@@ -148,11 +151,12 @@ static void it821x_program_udma(ide_drive_t *drive, u16 timing)
148 conf = timing >> 8; 151 conf = timing >> 8;
149 else 152 else
150 conf = timing & 0xFF; 153 conf = timing & 0xFF;
151 if(itdev->timing10 == 0) 154
152 pci_write_config_byte(hwif->pci_dev, 0x56 + 4 * channel + unit, conf); 155 if (itdev->timing10 == 0)
156 pci_write_config_byte(dev, 0x56 + 4 * channel + unit, conf);
153 else { 157 else {
154 pci_write_config_byte(hwif->pci_dev, 0x56 + 4 * channel, conf); 158 pci_write_config_byte(dev, 0x56 + 4 * channel, conf);
155 pci_write_config_byte(hwif->pci_dev, 0x56 + 4 * channel + 1, conf); 159 pci_write_config_byte(dev, 0x56 + 4 * channel + 1, conf);
156 } 160 }
157} 161}
158 162
@@ -167,6 +171,7 @@ static void it821x_program_udma(ide_drive_t *drive, u16 timing)
167static void it821x_clock_strategy(ide_drive_t *drive) 171static void it821x_clock_strategy(ide_drive_t *drive)
168{ 172{
169 ide_hwif_t *hwif = drive->hwif; 173 ide_hwif_t *hwif = drive->hwif;
174 struct pci_dev *dev = to_pci_dev(hwif->dev);
170 struct it821x_dev *itdev = ide_get_hwifdata(hwif); 175 struct it821x_dev *itdev = ide_get_hwifdata(hwif);
171 176
172 u8 unit = drive->select.b.unit; 177 u8 unit = drive->select.b.unit;
@@ -205,10 +210,11 @@ static void it821x_clock_strategy(ide_drive_t *drive)
205 itdev->clock_mode = ATA_50; 210 itdev->clock_mode = ATA_50;
206 sel = 1; 211 sel = 1;
207 } 212 }
208 pci_read_config_byte(hwif->pci_dev, 0x50, &v); 213
214 pci_read_config_byte(dev, 0x50, &v);
209 v &= ~(1 << (1 + hwif->channel)); 215 v &= ~(1 << (1 + hwif->channel));
210 v |= sel << (1 + hwif->channel); 216 v |= sel << (1 + hwif->channel);
211 pci_write_config_byte(hwif->pci_dev, 0x50, v); 217 pci_write_config_byte(dev, 0x50, v);
212 218
213 /* 219 /*
214 * Reprogram the UDMA/PIO of the pair drive for the switch 220 * Reprogram the UDMA/PIO of the pair drive for the switch
@@ -282,7 +288,8 @@ static void it821x_set_pio_mode(ide_drive_t *drive, const u8 pio)
282 288
283static void it821x_tune_mwdma (ide_drive_t *drive, byte mode_wanted) 289static void it821x_tune_mwdma (ide_drive_t *drive, byte mode_wanted)
284{ 290{
285 ide_hwif_t *hwif = drive->hwif; 291 ide_hwif_t *hwif = drive->hwif;
292 struct pci_dev *dev = to_pci_dev(hwif->dev);
286 struct it821x_dev *itdev = (void *)ide_get_hwifdata(hwif); 293 struct it821x_dev *itdev = (void *)ide_get_hwifdata(hwif);
287 int unit = drive->select.b.unit; 294 int unit = drive->select.b.unit;
288 int channel = hwif->channel; 295 int channel = hwif->channel;
@@ -297,12 +304,12 @@ static void it821x_tune_mwdma (ide_drive_t *drive, byte mode_wanted)
297 itdev->udma[unit] = UDMA_OFF; 304 itdev->udma[unit] = UDMA_OFF;
298 305
299 /* UDMA bits off - Revision 0x10 do them in pairs */ 306 /* UDMA bits off - Revision 0x10 do them in pairs */
300 pci_read_config_byte(hwif->pci_dev, 0x50, &conf); 307 pci_read_config_byte(dev, 0x50, &conf);
301 if(itdev->timing10) 308 if (itdev->timing10)
302 conf |= channel ? 0x60: 0x18; 309 conf |= channel ? 0x60: 0x18;
303 else 310 else
304 conf |= 1 << (3 + 2 * channel + unit); 311 conf |= 1 << (3 + 2 * channel + unit);
305 pci_write_config_byte(hwif->pci_dev, 0x50, conf); 312 pci_write_config_byte(dev, 0x50, conf);
306 313
307 it821x_clock_strategy(drive); 314 it821x_clock_strategy(drive);
308 /* FIXME: do we need to program this ? */ 315 /* FIXME: do we need to program this ? */
@@ -320,7 +327,8 @@ static void it821x_tune_mwdma (ide_drive_t *drive, byte mode_wanted)
320 327
321static void it821x_tune_udma (ide_drive_t *drive, byte mode_wanted) 328static void it821x_tune_udma (ide_drive_t *drive, byte mode_wanted)
322{ 329{
323 ide_hwif_t *hwif = drive->hwif; 330 ide_hwif_t *hwif = drive->hwif;
331 struct pci_dev *dev = to_pci_dev(hwif->dev);
324 struct it821x_dev *itdev = ide_get_hwifdata(hwif); 332 struct it821x_dev *itdev = ide_get_hwifdata(hwif);
325 int unit = drive->select.b.unit; 333 int unit = drive->select.b.unit;
326 int channel = hwif->channel; 334 int channel = hwif->channel;
@@ -337,12 +345,12 @@ static void it821x_tune_udma (ide_drive_t *drive, byte mode_wanted)
337 itdev->udma[unit] |= 0x8080; /* UDMA 5/6 select on */ 345 itdev->udma[unit] |= 0x8080; /* UDMA 5/6 select on */
338 346
339 /* UDMA on. Again revision 0x10 must do the pair */ 347 /* UDMA on. Again revision 0x10 must do the pair */
340 pci_read_config_byte(hwif->pci_dev, 0x50, &conf); 348 pci_read_config_byte(dev, 0x50, &conf);
341 if(itdev->timing10) 349 if (itdev->timing10)
342 conf &= channel ? 0x9F: 0xE7; 350 conf &= channel ? 0x9F: 0xE7;
343 else 351 else
344 conf &= ~ (1 << (3 + 2 * channel + unit)); 352 conf &= ~ (1 << (3 + 2 * channel + unit));
345 pci_write_config_byte(hwif->pci_dev, 0x50, conf); 353 pci_write_config_byte(dev, 0x50, conf);
346 354
347 it821x_clock_strategy(drive); 355 it821x_clock_strategy(drive);
348 it821x_program_udma(drive, itdev->udma[unit]); 356 it821x_program_udma(drive, itdev->udma[unit]);
@@ -520,6 +528,7 @@ static void __devinit it821x_quirkproc(ide_drive_t *drive)
520 528
521static void __devinit init_hwif_it821x(ide_hwif_t *hwif) 529static void __devinit init_hwif_it821x(ide_hwif_t *hwif)
522{ 530{
531 struct pci_dev *dev = to_pci_dev(hwif->dev);
523 struct it821x_dev *idev = kzalloc(sizeof(struct it821x_dev), GFP_KERNEL); 532 struct it821x_dev *idev = kzalloc(sizeof(struct it821x_dev), GFP_KERNEL);
524 u8 conf; 533 u8 conf;
525 534
@@ -532,7 +541,7 @@ static void __devinit init_hwif_it821x(ide_hwif_t *hwif)
532 541
533 ide_set_hwifdata(hwif, idev); 542 ide_set_hwifdata(hwif, idev);
534 543
535 pci_read_config_byte(hwif->pci_dev, 0x50, &conf); 544 pci_read_config_byte(dev, 0x50, &conf);
536 if (conf & 1) { 545 if (conf & 1) {
537 idev->smart = 1; 546 idev->smart = 1;
538 hwif->host_flags |= IDE_HFLAG_NO_ATAPI_DMA; 547 hwif->host_flags |= IDE_HFLAG_NO_ATAPI_DMA;
@@ -555,7 +564,7 @@ static void __devinit init_hwif_it821x(ide_hwif_t *hwif)
555 * this is necessary. 564 * this is necessary.
556 */ 565 */
557 566
558 pci_read_config_byte(hwif->pci_dev, 0x08, &conf); 567 pci_read_config_byte(dev, 0x08, &conf);
559 if (conf == 0x10) { 568 if (conf == 0x10) {
560 idev->timing10 = 1; 569 idev->timing10 = 1;
561 hwif->host_flags |= IDE_HFLAG_NO_ATAPI_DMA; 570 hwif->host_flags |= IDE_HFLAG_NO_ATAPI_DMA;