Blame view
drivers/ide/via82cxxx.c
13.8 KB
1da177e4c Linux-2.6.12-rc2 |
1 |
/* |
1da177e4c Linux-2.6.12-rc2 |
2 3 4 5 |
* VIA IDE driver for Linux. Supported southbridges: * * vt82c576, vt82c586, vt82c586a, vt82c586b, vt82c596a, vt82c596b, * vt82c686, vt82c686a, vt82c686b, vt8231, vt8233, vt8233c, vt8233a, |
a7dec1e0d [PATCH] Missing P... |
6 |
* vt8235, vt8237, vt8237a |
1da177e4c Linux-2.6.12-rc2 |
7 8 |
* * Copyright (c) 2000-2002 Vojtech Pavlik |
75b1d9753 ide: convert ide_... |
9 |
* Copyright (c) 2007 Bartlomiej Zolnierkiewicz |
1da177e4c Linux-2.6.12-rc2 |
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
* * Based on the work of: * Michel Aubry * Jeff Garzik * Andre Hedrick * * Documentation: * Obsolete device documentation publically available from via.com.tw * Current device documentation available under NDA only */ /* * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published by * the Free Software Foundation. */ |
1da177e4c Linux-2.6.12-rc2 |
26 27 |
#include <linux/module.h> #include <linux/kernel.h> |
1da177e4c Linux-2.6.12-rc2 |
28 29 30 |
#include <linux/pci.h> #include <linux/init.h> #include <linux/ide.h> |
bdab00b73 via82cxxx: backpo... |
31 |
#include <linux/dmi.h> |
74a9d5f1d [PATCH] Remove in... |
32 |
#ifdef CONFIG_PPC_CHRP |
1da177e4c Linux-2.6.12-rc2 |
33 34 |
#include <asm/processor.h> #endif |
ced3ec8aa ide: prefix messa... |
35 |
#define DRV_NAME "via82cxxx" |
1da177e4c Linux-2.6.12-rc2 |
36 37 38 39 40 41 42 43 44 45 |
#define VIA_IDE_ENABLE 0x40 #define VIA_IDE_CONFIG 0x41 #define VIA_FIFO_CONFIG 0x43 #define VIA_MISC_1 0x44 #define VIA_MISC_2 0x45 #define VIA_MISC_3 0x46 #define VIA_DRIVE_TIMING 0x48 #define VIA_8BIT_TIMING 0x4e #define VIA_ADDRESS_SETUP 0x4c #define VIA_UDMA_TIMING 0x50 |
75b1d9753 ide: convert ide_... |
46 47 48 49 50 51 |
#define VIA_BAD_PREQ 0x01 /* Crashes if PREQ# till DDACK# set */ #define VIA_BAD_CLK66 0x02 /* 66 MHz clock doesn't work correctly */ #define VIA_SET_FIFO 0x04 /* Needs to have FIFO split set */ #define VIA_NO_UNMASK 0x08 /* Doesn't work with IRQ unmasking on */ #define VIA_BAD_ID 0x10 /* Has wrong vendor ID (0x1107) */ #define VIA_BAD_AST 0x20 /* Don't touch Address Setup Timing */ |
1da177e4c Linux-2.6.12-rc2 |
52 53 54 55 56 57 58 59 60 61 |
/* * VIA SouthBridge chips. */ static struct via_isa_bridge { char *name; u16 id; u8 rev_min; u8 rev_max; |
75b1d9753 ide: convert ide_... |
62 63 |
u8 udma_mask; u8 flags; |
1da177e4c Linux-2.6.12-rc2 |
64 |
} via_isa_bridges[] = { |
5993856e5 via82cxxx: Add VI... |
65 |
{ "vx855", PCI_DEVICE_ID_VIA_VX855, 0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST }, |
b311ec4ae [libata, IDE] add... |
66 |
{ "vx800", PCI_DEVICE_ID_VIA_VX800, 0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST }, |
75b1d9753 ide: convert ide_... |
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
{ "cx700", PCI_DEVICE_ID_VIA_CX700, 0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST }, { "vt8237s", PCI_DEVICE_ID_VIA_8237S, 0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST }, { "vt6410", PCI_DEVICE_ID_VIA_6410, 0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST }, { "vt8251", PCI_DEVICE_ID_VIA_8251, 0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST }, { "vt8237", PCI_DEVICE_ID_VIA_8237, 0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST }, { "vt8237a", PCI_DEVICE_ID_VIA_8237A, 0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST }, { "vt8235", PCI_DEVICE_ID_VIA_8235, 0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST }, { "vt8233a", PCI_DEVICE_ID_VIA_8233A, 0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST }, { "vt8233c", PCI_DEVICE_ID_VIA_8233C_0, 0x00, 0x2f, ATA_UDMA5, }, { "vt8233", PCI_DEVICE_ID_VIA_8233_0, 0x00, 0x2f, ATA_UDMA5, }, { "vt8231", PCI_DEVICE_ID_VIA_8231, 0x00, 0x2f, ATA_UDMA5, }, { "vt82c686b", PCI_DEVICE_ID_VIA_82C686, 0x40, 0x4f, ATA_UDMA5, }, { "vt82c686a", PCI_DEVICE_ID_VIA_82C686, 0x10, 0x2f, ATA_UDMA4, }, { "vt82c686", PCI_DEVICE_ID_VIA_82C686, 0x00, 0x0f, ATA_UDMA2, VIA_BAD_CLK66 }, { "vt82c596b", PCI_DEVICE_ID_VIA_82C596, 0x10, 0x2f, ATA_UDMA4, }, { "vt82c596a", PCI_DEVICE_ID_VIA_82C596, 0x00, 0x0f, ATA_UDMA2, VIA_BAD_CLK66 }, { "vt82c586b", PCI_DEVICE_ID_VIA_82C586_0, 0x47, 0x4f, ATA_UDMA2, VIA_SET_FIFO }, { "vt82c586b", PCI_DEVICE_ID_VIA_82C586_0, 0x40, 0x46, ATA_UDMA2, VIA_SET_FIFO | VIA_BAD_PREQ }, { "vt82c586b", PCI_DEVICE_ID_VIA_82C586_0, 0x30, 0x3f, ATA_UDMA2, VIA_SET_FIFO }, { "vt82c586a", PCI_DEVICE_ID_VIA_82C586_0, 0x20, 0x2f, ATA_UDMA2, VIA_SET_FIFO }, { "vt82c586", PCI_DEVICE_ID_VIA_82C586_0, 0x00, 0x0f, 0x00, VIA_SET_FIFO }, { "vt82c576", PCI_DEVICE_ID_VIA_82C576, 0x00, 0x2f, 0x00, VIA_SET_FIFO | VIA_NO_UNMASK }, { "vt82c576", PCI_DEVICE_ID_VIA_82C576, 0x00, 0x2f, 0x00, VIA_SET_FIFO | VIA_NO_UNMASK | VIA_BAD_ID }, |
1da177e4c Linux-2.6.12-rc2 |
90 91 |
{ NULL } }; |
1da177e4c Linux-2.6.12-rc2 |
92 |
static unsigned int via_clock; |
75b1d9753 ide: convert ide_... |
93 |
static char *via_dma[] = { "16", "25", "33", "44", "66", "100", "133" }; |
1da177e4c Linux-2.6.12-rc2 |
94 |
|
7462cbff7 [PATCH] via82cxxx... |
95 96 97 98 99 |
struct via82cxxx_dev { struct via_isa_bridge *via_config; unsigned int via_80w; }; |
1da177e4c Linux-2.6.12-rc2 |
100 101 102 103 104 105 106 107 |
/** * via_set_speed - write timing registers * @dev: PCI device * @dn: device * @timing: IDE timing data to use * * via_set_speed writes timing values to the chipset registers */ |
7462cbff7 [PATCH] via82cxxx... |
108 |
static void via_set_speed(ide_hwif_t *hwif, u8 dn, struct ide_timing *timing) |
1da177e4c Linux-2.6.12-rc2 |
109 |
{ |
36501650e ide: keep pointer... |
110 |
struct pci_dev *dev = to_pci_dev(hwif->dev); |
ee77325b0 via82cxxx: conver... |
111 112 |
struct ide_host *host = pci_get_drvdata(dev); struct via82cxxx_dev *vdev = host->host_priv; |
1da177e4c Linux-2.6.12-rc2 |
113 |
u8 t; |
7462cbff7 [PATCH] via82cxxx... |
114 |
if (~vdev->via_config->flags & VIA_BAD_AST) { |
1da177e4c Linux-2.6.12-rc2 |
115 |
pci_read_config_byte(dev, VIA_ADDRESS_SETUP, &t); |
d6cddd3ca ide: eliminate FI... |
116 |
t = (t & ~(3 << ((3 - dn) << 1))) | ((clamp_val(timing->setup, 1, 4) - 1) << ((3 - dn) << 1)); |
1da177e4c Linux-2.6.12-rc2 |
117 118 119 120 |
pci_write_config_byte(dev, VIA_ADDRESS_SETUP, t); } pci_write_config_byte(dev, VIA_8BIT_TIMING + (1 - (dn >> 1)), |
d6cddd3ca ide: eliminate FI... |
121 |
((clamp_val(timing->act8b, 1, 16) - 1) << 4) | (clamp_val(timing->rec8b, 1, 16) - 1)); |
1da177e4c Linux-2.6.12-rc2 |
122 123 |
pci_write_config_byte(dev, VIA_DRIVE_TIMING + (3 - dn), |
d6cddd3ca ide: eliminate FI... |
124 |
((clamp_val(timing->active, 1, 16) - 1) << 4) | (clamp_val(timing->recover, 1, 16) - 1)); |
1da177e4c Linux-2.6.12-rc2 |
125 |
|
75b1d9753 ide: convert ide_... |
126 |
switch (vdev->via_config->udma_mask) { |
d6cddd3ca ide: eliminate FI... |
127 128 129 130 |
case ATA_UDMA2: t = timing->udma ? (0xe0 | (clamp_val(timing->udma, 2, 5) - 2)) : 0x03; break; case ATA_UDMA4: t = timing->udma ? (0xe8 | (clamp_val(timing->udma, 2, 9) - 2)) : 0x0f; break; case ATA_UDMA5: t = timing->udma ? (0xe0 | (clamp_val(timing->udma, 2, 9) - 2)) : 0x07; break; case ATA_UDMA6: t = timing->udma ? (0xe0 | (clamp_val(timing->udma, 2, 9) - 2)) : 0x07; break; |
75b1d9753 ide: convert ide_... |
131 |
default: return; |
1da177e4c Linux-2.6.12-rc2 |
132 133 134 135 136 137 138 139 140 141 |
} pci_write_config_byte(dev, VIA_UDMA_TIMING + (3 - dn), t); } /** * via_set_drive - configure transfer mode * @drive: Drive to set up * @speed: desired speed * |
88b2b32ba ide: move ide_con... |
142 143 |
* via_set_drive() computes timing values configures the chipset to * a desired transfer mode. It also can be called by upper layers. |
1da177e4c Linux-2.6.12-rc2 |
144 |
*/ |
88b2b32ba ide: move ide_con... |
145 |
static void via_set_drive(ide_drive_t *drive, const u8 speed) |
1da177e4c Linux-2.6.12-rc2 |
146 |
{ |
36501650e ide: keep pointer... |
147 |
ide_hwif_t *hwif = drive->hwif; |
7e59ea21a ide: check drive-... |
148 |
ide_drive_t *peer = ide_get_pair_dev(drive); |
36501650e ide: keep pointer... |
149 |
struct pci_dev *dev = to_pci_dev(hwif->dev); |
ee77325b0 via82cxxx: conver... |
150 151 |
struct ide_host *host = pci_get_drvdata(dev); struct via82cxxx_dev *vdev = host->host_priv; |
1da177e4c Linux-2.6.12-rc2 |
152 153 |
struct ide_timing t, p; unsigned int T, UT; |
1da177e4c Linux-2.6.12-rc2 |
154 |
T = 1000000000 / via_clock; |
75b1d9753 ide: convert ide_... |
155 156 157 158 159 160 |
switch (vdev->via_config->udma_mask) { case ATA_UDMA2: UT = T; break; case ATA_UDMA4: UT = T/2; break; case ATA_UDMA5: UT = T/3; break; case ATA_UDMA6: UT = T/4; break; default: UT = T; |
1da177e4c Linux-2.6.12-rc2 |
161 162 163 |
} ide_timing_compute(drive, speed, &t, T, UT); |
7e59ea21a ide: check drive-... |
164 |
if (peer) { |
1da177e4c Linux-2.6.12-rc2 |
165 166 167 |
ide_timing_compute(peer, peer->current_speed, &p, T, UT); ide_timing_merge(&p, &t, &t, IDE_TIMING_8BIT); } |
898ec223f ide: remove HWIF(... |
168 |
via_set_speed(hwif, drive->dn, &t); |
1da177e4c Linux-2.6.12-rc2 |
169 170 171 |
} /** |
88b2b32ba ide: move ide_con... |
172 |
* via_set_pio_mode - set host controller for PIO mode |
26bcb879c ide: add ide_set{... |
173 174 |
* @drive: drive * @pio: PIO mode number |
1da177e4c Linux-2.6.12-rc2 |
175 176 177 |
* * A callback from the upper layers for PIO-only tuning. */ |
26bcb879c ide: add ide_set{... |
178 |
static void via_set_pio_mode(ide_drive_t *drive, const u8 pio) |
1da177e4c Linux-2.6.12-rc2 |
179 |
{ |
26bcb879c ide: add ide_set{... |
180 |
via_set_drive(drive, XFER_PIO_0 + pio); |
1da177e4c Linux-2.6.12-rc2 |
181 |
} |
7462cbff7 [PATCH] via82cxxx... |
182 183 184 |
static struct via_isa_bridge *via_config_find(struct pci_dev **isa) { struct via_isa_bridge *via_config; |
7462cbff7 [PATCH] via82cxxx... |
185 186 |
for (via_config = via_isa_bridges; via_config->id; via_config++) |
652aa1629 [PATCH] IDE: more... |
187 |
if ((*isa = pci_get_device(PCI_VENDOR_ID_VIA + |
7462cbff7 [PATCH] via82cxxx... |
188 189 |
!!(via_config->flags & VIA_BAD_ID), via_config->id, NULL))) { |
44c10138f PCI: Change all d... |
190 191 |
if ((*isa)->revision >= via_config->rev_min && (*isa)->revision <= via_config->rev_max) |
7462cbff7 [PATCH] via82cxxx... |
192 |
break; |
652aa1629 [PATCH] IDE: more... |
193 |
pci_dev_put(*isa); |
7462cbff7 [PATCH] via82cxxx... |
194 195 196 |
} return via_config; |
1da177e4c Linux-2.6.12-rc2 |
197 |
} |
cd36beec0 [PATCH] via82cxxx... |
198 199 200 |
/* * Check and handle 80-wire cable presence */ |
feb22b7f8 ide: add proper P... |
201 |
static void via_cable_detect(struct via82cxxx_dev *vdev, u32 u) |
cd36beec0 [PATCH] via82cxxx... |
202 203 |
{ int i; |
75b1d9753 ide: convert ide_... |
204 205 |
switch (vdev->via_config->udma_mask) { case ATA_UDMA4: |
cd36beec0 [PATCH] via82cxxx... |
206 207 208 209 210 211 212 213 214 215 216 |
for (i = 24; i >= 0; i -= 8) if (((u >> (i & 16)) & 8) && ((u >> i) & 0x20) && (((u >> i) & 7) < 2)) { /* * 2x PCI clock and * UDMA w/ < 3T/cycle */ vdev->via_80w |= (1 << (1 - (i >> 4))); } break; |
75b1d9753 ide: convert ide_... |
217 |
case ATA_UDMA5: |
cd36beec0 [PATCH] via82cxxx... |
218 219 220 221 222 223 224 225 226 227 |
for (i = 24; i >= 0; i -= 8) if (((u >> i) & 0x10) || (((u >> i) & 0x20) && (((u >> i) & 7) < 4))) { /* BIOS 80-wire bit or * UDMA w/ < 60ns/cycle */ vdev->via_80w |= (1 << (1 - (i >> 4))); } break; |
75b1d9753 ide: convert ide_... |
228 |
case ATA_UDMA6: |
cd36beec0 [PATCH] via82cxxx... |
229 230 231 232 233 234 235 236 237 238 239 240 |
for (i = 24; i >= 0; i -= 8) if (((u >> i) & 0x10) || (((u >> i) & 0x20) && (((u >> i) & 7) < 6))) { /* BIOS 80-wire bit or * UDMA w/ < 60ns/cycle */ vdev->via_80w |= (1 << (1 - (i >> 4))); } break; } } |
1da177e4c Linux-2.6.12-rc2 |
241 242 243 |
/** * init_chipset_via82cxxx - initialization handler * @dev: PCI device |
1da177e4c Linux-2.6.12-rc2 |
244 245 246 247 |
* * The initialization callback. Here we determine the IDE chip type * and initialize its drive independent registers. */ |
2ed0ef543 ide: fix ->init_c... |
248 |
static int init_chipset_via82cxxx(struct pci_dev *dev) |
1da177e4c Linux-2.6.12-rc2 |
249 |
{ |
ee77325b0 via82cxxx: conver... |
250 251 |
struct ide_host *host = pci_get_drvdata(dev); struct via82cxxx_dev *vdev = host->host_priv; |
37525bebc via82cxxx: cleanu... |
252 |
struct via_isa_bridge *via_config = vdev->via_config; |
1da177e4c Linux-2.6.12-rc2 |
253 |
u8 t, v; |
cd36beec0 [PATCH] via82cxxx... |
254 |
u32 u; |
1da177e4c Linux-2.6.12-rc2 |
255 |
/* |
cd36beec0 [PATCH] via82cxxx... |
256 |
* Detect cable and configure Clk66 |
1da177e4c Linux-2.6.12-rc2 |
257 |
*/ |
cd36beec0 [PATCH] via82cxxx... |
258 259 260 |
pci_read_config_dword(dev, VIA_UDMA_TIMING, &u); via_cable_detect(vdev, u); |
1da177e4c Linux-2.6.12-rc2 |
261 |
|
75b1d9753 ide: convert ide_... |
262 |
if (via_config->udma_mask == ATA_UDMA4) { |
7462cbff7 [PATCH] via82cxxx... |
263 |
/* Enable Clk66 */ |
7462cbff7 [PATCH] via82cxxx... |
264 265 |
pci_write_config_dword(dev, VIA_UDMA_TIMING, u|0x80008); } else if (via_config->flags & VIA_BAD_CLK66) { |
1da177e4c Linux-2.6.12-rc2 |
266 |
/* Would cause trouble on 596a and 686 */ |
1da177e4c Linux-2.6.12-rc2 |
267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 |
pci_write_config_dword(dev, VIA_UDMA_TIMING, u & ~0x80008); } /* * Check whether interfaces are enabled. */ pci_read_config_byte(dev, VIA_IDE_ENABLE, &v); /* * Set up FIFO sizes and thresholds. */ pci_read_config_byte(dev, VIA_FIFO_CONFIG, &t); /* Disable PREQ# till DDACK# */ if (via_config->flags & VIA_BAD_PREQ) { /* Would crash on 586b rev 41 */ t &= 0x7f; } /* Fix FIFO split between channels */ if (via_config->flags & VIA_SET_FIFO) { t &= (t & 0x9f); switch (v & 3) { case 2: t |= 0x00; break; /* 16 on primary */ case 1: t |= 0x60; break; /* 16 on secondary */ case 3: t |= 0x20; break; /* 8 pri 8 sec */ } } pci_write_config_byte(dev, VIA_FIFO_CONFIG, t); |
1da177e4c Linux-2.6.12-rc2 |
299 300 |
return 0; } |
bdab00b73 via82cxxx: backpo... |
301 302 303 |
/* * Cable special cases */ |
1855256c4 drivers/firmware:... |
304 |
static const struct dmi_system_id cable_dmi_table[] = { |
bdab00b73 via82cxxx: backpo... |
305 306 307 308 309 310 311 312 313 |
{ .ident = "Acer Ferrari 3400", .matches = { DMI_MATCH(DMI_BOARD_VENDOR, "Acer,Inc."), DMI_MATCH(DMI_BOARD_NAME, "Ferrari 3400"), }, }, { } }; |
58e47bb17 via82cxxx: add Ar... |
314 |
static int via_cable_override(struct pci_dev *pdev) |
bdab00b73 via82cxxx: backpo... |
315 316 317 318 |
{ /* Systems by DMI */ if (dmi_check_system(cable_dmi_table)) return 1; |
58e47bb17 via82cxxx: add Ar... |
319 320 321 322 323 |
/* Arima W730-K8/Targa Visionary 811/... */ if (pdev->subsystem_vendor == 0x161F && pdev->subsystem_device == 0x2032) return 1; |
bdab00b73 via82cxxx: backpo... |
324 325 |
return 0; } |
f454cbe8c ide: ->cable_dete... |
326 |
static u8 via82cxxx_cable_detect(ide_hwif_t *hwif) |
bdab00b73 via82cxxx: backpo... |
327 |
{ |
36501650e ide: keep pointer... |
328 |
struct pci_dev *pdev = to_pci_dev(hwif->dev); |
ee77325b0 via82cxxx: conver... |
329 330 |
struct ide_host *host = pci_get_drvdata(pdev); struct via82cxxx_dev *vdev = host->host_priv; |
bdab00b73 via82cxxx: backpo... |
331 |
|
58e47bb17 via82cxxx: add Ar... |
332 |
if (via_cable_override(pdev)) |
bdab00b73 via82cxxx: backpo... |
333 334 335 336 337 338 339 |
return ATA_CBL_PATA40_SHORT; if ((vdev->via_80w >> hwif->channel) & 1) return ATA_CBL_PATA80; else return ATA_CBL_PATA40; } |
ac95beedf ide: add struct i... |
340 341 342 343 344 |
static const struct ide_port_ops via_port_ops = { .set_pio_mode = via_set_pio_mode, .set_dma_mode = via_set_drive, .cable_detect = via82cxxx_cable_detect, }; |
1da177e4c Linux-2.6.12-rc2 |
345 |
|
856204360 ide: constify str... |
346 |
static const struct ide_port_info via82cxxx_chipset __devinitdata = { |
ced3ec8aa ide: prefix messa... |
347 |
.name = DRV_NAME, |
6157332ed via82cxxx: keep l... |
348 |
.init_chipset = init_chipset_via82cxxx, |
6157332ed via82cxxx: keep l... |
349 |
.enablebits = { { 0x40, 0x02, 0x02 }, { 0x40, 0x01, 0x01 } }, |
ac95beedf ide: add struct i... |
350 |
.port_ops = &via_port_ops, |
6157332ed via82cxxx: keep l... |
351 |
.host_flags = IDE_HFLAG_PIO_NO_BLACKLIST | |
6157332ed via82cxxx: keep l... |
352 |
IDE_HFLAG_POST_SET_MODE | |
5e71d9c5a ide: IDE_HFLAG_BO... |
353 |
IDE_HFLAG_IO_32BIT, |
6157332ed via82cxxx: keep l... |
354 355 356 |
.pio_mask = ATA_PIO5, .swdma_mask = ATA_SWDMA2, .mwdma_mask = ATA_MWDMA2, |
1da177e4c Linux-2.6.12-rc2 |
357 358 359 360 |
}; static int __devinit via_init_one(struct pci_dev *dev, const struct pci_device_id *id) { |
23a1b2a78 [PATCH] via82cxxx... |
361 362 |
struct pci_dev *isa = NULL; struct via_isa_bridge *via_config; |
ee77325b0 via82cxxx: conver... |
363 364 |
struct via82cxxx_dev *vdev; int rc; |
6157332ed via82cxxx: keep l... |
365 |
u8 idx = id->driver_data; |
039788e15 ide: replace ide_... |
366 |
struct ide_port_info d; |
6157332ed via82cxxx: keep l... |
367 368 |
d = via82cxxx_chipset; |
8acf28c09 ide: add IDE_HFLA... |
369 |
|
23a1b2a78 [PATCH] via82cxxx... |
370 371 372 373 |
/* * Find the ISA bridge and check we know what it is. */ via_config = via_config_find(&isa); |
23a1b2a78 [PATCH] via82cxxx... |
374 |
if (!via_config->id) { |
ced3ec8aa ide: prefix messa... |
375 376 |
printk(KERN_WARNING DRV_NAME " %s: unknown chipset, skipping ", |
28cfd8af5 ide: include PCI ... |
377 |
pci_name(dev)); |
23a1b2a78 [PATCH] via82cxxx... |
378 379 |
return -ENODEV; } |
8acf28c09 ide: add IDE_HFLA... |
380 |
|
37525bebc via82cxxx: cleanu... |
381 382 383 |
/* * Print the boot message. */ |
ced3ec8aa ide: prefix messa... |
384 385 |
printk(KERN_INFO DRV_NAME " %s: VIA %s (rev %02x) IDE %sDMA%s ", |
28cfd8af5 ide: include PCI ... |
386 |
pci_name(dev), via_config->name, isa->revision, |
37525bebc via82cxxx: cleanu... |
387 388 |
via_config->udma_mask ? "U" : "MW", via_dma[via_config->udma_mask ? |
28cfd8af5 ide: include PCI ... |
389 |
(fls(via_config->udma_mask) - 1) : 0]); |
37525bebc via82cxxx: cleanu... |
390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 |
pci_dev_put(isa); /* * Determine system bus clock. */ via_clock = (ide_pci_clk ? ide_pci_clk : 33) * 1000; switch (via_clock) { case 33000: via_clock = 33333; break; case 37000: via_clock = 37500; break; case 41000: via_clock = 41666; break; } if (via_clock < 20000 || via_clock > 50000) { |
ced3ec8aa ide: prefix messa... |
405 |
printk(KERN_WARNING DRV_NAME ": User given PCI clock speed " |
37525bebc via82cxxx: cleanu... |
406 407 |
"impossible (%d), using 33 MHz instead. ", via_clock); |
37525bebc via82cxxx: cleanu... |
408 409 |
via_clock = 33333; } |
6157332ed via82cxxx: keep l... |
410 411 |
if (idx == 0) d.host_flags |= IDE_HFLAG_NO_AUTODMA; |
caea7602f ide: add IDE_HFLA... |
412 |
else |
6157332ed via82cxxx: keep l... |
413 414 415 416 |
d.enablebits[1].reg = d.enablebits[0].reg = 0; if ((via_config->flags & VIA_NO_UNMASK) == 0) d.host_flags |= IDE_HFLAG_UNMASK_IRQS; |
caea7602f ide: add IDE_HFLA... |
417 |
|
6157332ed via82cxxx: keep l... |
418 |
d.udma_mask = via_config->udma_mask; |
8acf28c09 ide: add IDE_HFLA... |
419 |
|
ee77325b0 via82cxxx: conver... |
420 421 |
vdev = kzalloc(sizeof(*vdev), GFP_KERNEL); if (!vdev) { |
ced3ec8aa ide: prefix messa... |
422 423 424 |
printk(KERN_ERR DRV_NAME " %s: out of memory :( ", pci_name(dev)); |
ee77325b0 via82cxxx: conver... |
425 426 |
return -ENOMEM; } |
37525bebc via82cxxx: cleanu... |
427 |
vdev->via_config = via_config; |
ee77325b0 via82cxxx: conver... |
428 429 430 431 432 |
rc = ide_pci_init_one(dev, &d, vdev); if (rc) kfree(vdev); return rc; |
1da177e4c Linux-2.6.12-rc2 |
433 |
} |
585f67e73 via82cxxx: add ->... |
434 435 436 437 438 439 440 441 |
static void __devexit via_remove(struct pci_dev *dev) { struct ide_host *host = pci_get_drvdata(dev); struct via82cxxx_dev *vdev = host->host_priv; ide_pci_remove(dev); kfree(vdev); } |
9cbcc5e3c ide: use PCI_VDEV... |
442 443 444 |
static const struct pci_device_id via_pci_tbl[] = { { PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_82C576_1), 0 }, { PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_82C586_1), 0 }, |
84f7e451e via82cxxx: add ne... |
445 |
{ PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_CX700_IDE), 0 }, |
5993856e5 via82cxxx: Add VI... |
446 |
{ PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_VX855_IDE), 0 }, |
9cbcc5e3c ide: use PCI_VDEV... |
447 448 |
{ PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_6410), 1 }, { PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_SATA_EIDE), 1 }, |
1da177e4c Linux-2.6.12-rc2 |
449 450 451 |
{ 0, }, }; MODULE_DEVICE_TABLE(pci, via_pci_tbl); |
a9ab09e26 ide: use unique n... |
452 |
static struct pci_driver via_pci_driver = { |
1da177e4c Linux-2.6.12-rc2 |
453 454 455 |
.name = "VIA_IDE", .id_table = via_pci_tbl, .probe = via_init_one, |
a69999e28 drivers/ide/pci/:... |
456 |
.remove = __devexit_p(via_remove), |
feb22b7f8 ide: add proper P... |
457 458 |
.suspend = ide_pci_suspend, .resume = ide_pci_resume, |
1da177e4c Linux-2.6.12-rc2 |
459 |
}; |
82ab1eece ide: add missing ... |
460 |
static int __init via_ide_init(void) |
1da177e4c Linux-2.6.12-rc2 |
461 |
{ |
a9ab09e26 ide: use unique n... |
462 |
return ide_pci_register_driver(&via_pci_driver); |
1da177e4c Linux-2.6.12-rc2 |
463 |
} |
585f67e73 via82cxxx: add ->... |
464 465 |
static void __exit via_ide_exit(void) { |
a9ab09e26 ide: use unique n... |
466 |
pci_unregister_driver(&via_pci_driver); |
585f67e73 via82cxxx: add ->... |
467 |
} |
1da177e4c Linux-2.6.12-rc2 |
468 |
module_init(via_ide_init); |
585f67e73 via82cxxx: add ->... |
469 |
module_exit(via_ide_exit); |
1da177e4c Linux-2.6.12-rc2 |
470 471 472 473 |
MODULE_AUTHOR("Vojtech Pavlik, Michel Aubry, Jeff Garzik, Andre Hedrick"); MODULE_DESCRIPTION("PCI driver module for VIA IDE"); MODULE_LICENSE("GPL"); |