blob: 3c91cc2e2caf0bd56e03fea6865017696a0b1b75 [file] [log] [blame]
Patrick Georgie72a8a32012-11-06 11:05:09 +01001/*
2 * This file is part of the coreboot project.
3 *
4 * Copyright (C) 2008-2009 coresystems GmbH
5 * 2012 secunet Security Networks AG
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License as
9 * published by the Free Software Foundation; version 2 of
10 * the License.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22#include <console/console.h>
23#include <device/device.h>
24#include <device/pci.h>
25#include <device/pci_ids.h>
26#include <pc80/mc146818rtc.h>
27#include <pc80/isa-dma.h>
28#include <pc80/i8259.h>
29#include <arch/io.h>
30#include <arch/ioapic.h>
31#include <arch/acpi.h>
32#include <cpu/cpu.h>
33#include <cpu/x86/smm.h>
34#include "i82801ix.h"
35
36#define NMI_OFF 0
37
38#define ENABLE_ACPI_MODE_IN_COREBOOT 0
39#define TEST_SMM_FLASH_LOCKDOWN 0
40
41typedef struct southbridge_intel_i82801ix_config config_t;
42
43static void i82801ix_enable_apic(struct device *dev)
44{
45 u8 dummy;
46 u32 reg32;
47 volatile u32 *ioapic_index = (volatile u32 *)(IO_APIC_ADDR);
48 volatile u32 *ioapic_data = (volatile u32 *)(IO_APIC_ADDR + 0x10);
49
50 /* Enable IOAPIC. Keep APIC Range Select at zero. */
51 RCBA8(0x31ff) = 0x03;
52 /* We have to read 0x31ff back if bit0 changed. */
53 dummy = RCBA8(0x31ff);
54
55 /* Lock maximum redirection entries (MRE), R/WO register. */
56 *ioapic_index = 0x01;
57 reg32 = *ioapic_data;
58 *ioapic_index = 0x01;
59 *ioapic_data = reg32;
60
61 setup_ioapic(IO_APIC_ADDR, 2); /* ICH7 code uses id 2. */
62}
63
64static void i82801ix_enable_serial_irqs(struct device *dev)
65{
66 /* Set packet length and toggle silent mode bit for one frame. */
67 pci_write_config8(dev, D31F0_SERIRQ_CNTL,
68 (1 << 7) | (1 << 6) | ((21 - 17) << 2) | (0 << 0));
69}
70
71/* PIRQ[n]_ROUT[3:0] - PIRQ Routing Control
72 * 0x00 - 0000 = Reserved
73 * 0x01 - 0001 = Reserved
74 * 0x02 - 0010 = Reserved
75 * 0x03 - 0011 = IRQ3
76 * 0x04 - 0100 = IRQ4
77 * 0x05 - 0101 = IRQ5
78 * 0x06 - 0110 = IRQ6
79 * 0x07 - 0111 = IRQ7
80 * 0x08 - 1000 = Reserved
81 * 0x09 - 1001 = IRQ9
82 * 0x0A - 1010 = IRQ10
83 * 0x0B - 1011 = IRQ11
84 * 0x0C - 1100 = IRQ12
85 * 0x0D - 1101 = Reserved
86 * 0x0E - 1110 = IRQ14
87 * 0x0F - 1111 = IRQ15
88 * PIRQ[n]_ROUT[7] - PIRQ Routing Control
89 * 0x80 - The PIRQ is not routed.
90 */
91
92static void i82801ix_pirq_init(device_t dev)
93{
94 device_t irq_dev;
95 /* Get the chip configuration */
96 config_t *config = dev->chip_info;
97
98 pci_write_config8(dev, D31F0_PIRQA_ROUT, config->pirqa_routing);
99 pci_write_config8(dev, D31F0_PIRQB_ROUT, config->pirqb_routing);
100 pci_write_config8(dev, D31F0_PIRQC_ROUT, config->pirqc_routing);
101 pci_write_config8(dev, D31F0_PIRQD_ROUT, config->pirqd_routing);
102
103 pci_write_config8(dev, D31F0_PIRQE_ROUT, config->pirqe_routing);
104 pci_write_config8(dev, D31F0_PIRQF_ROUT, config->pirqf_routing);
105 pci_write_config8(dev, D31F0_PIRQG_ROUT, config->pirqg_routing);
106 pci_write_config8(dev, D31F0_PIRQH_ROUT, config->pirqh_routing);
107
108 /* Eric Biederman once said we should let the OS do this.
109 * I am not so sure anymore he was right.
110 */
111
112 for(irq_dev = all_devices; irq_dev; irq_dev = irq_dev->next) {
113 u8 int_pin=0, int_line=0;
114
115 if (!irq_dev->enabled || irq_dev->path.type != DEVICE_PATH_PCI)
116 continue;
117
118 int_pin = pci_read_config8(irq_dev, PCI_INTERRUPT_PIN);
119
120 switch (int_pin) {
121 case 1: /* INTA# */ int_line = config->pirqa_routing; break;
122 case 2: /* INTB# */ int_line = config->pirqb_routing; break;
123 case 3: /* INTC# */ int_line = config->pirqc_routing; break;
124 case 4: /* INTD# */ int_line = config->pirqd_routing; break;
125 }
126
127 if (!int_line)
128 continue;
129
130 pci_write_config8(irq_dev, PCI_INTERRUPT_LINE, int_line);
131 }
132}
133
134static void i82801ix_gpi_routing(device_t dev)
135{
136 /* Get the chip configuration */
137 config_t *config = dev->chip_info;
138 u32 reg32 = 0;
139
140 /* An array would be much nicer here, or some
141 * other method of doing this.
142 */
143 reg32 |= (config->gpi0_routing & 0x03) << 0;
144 reg32 |= (config->gpi1_routing & 0x03) << 2;
145 reg32 |= (config->gpi2_routing & 0x03) << 4;
146 reg32 |= (config->gpi3_routing & 0x03) << 6;
147 reg32 |= (config->gpi4_routing & 0x03) << 8;
148 reg32 |= (config->gpi5_routing & 0x03) << 10;
149 reg32 |= (config->gpi6_routing & 0x03) << 12;
150 reg32 |= (config->gpi7_routing & 0x03) << 14;
151 reg32 |= (config->gpi8_routing & 0x03) << 16;
152 reg32 |= (config->gpi9_routing & 0x03) << 18;
153 reg32 |= (config->gpi10_routing & 0x03) << 20;
154 reg32 |= (config->gpi11_routing & 0x03) << 22;
155 reg32 |= (config->gpi12_routing & 0x03) << 24;
156 reg32 |= (config->gpi13_routing & 0x03) << 26;
157 reg32 |= (config->gpi14_routing & 0x03) << 28;
158 reg32 |= (config->gpi15_routing & 0x03) << 30;
159
160 pci_write_config32(dev, D31F0_GPIO_ROUT, reg32);
161}
162
163static void i82801ix_power_options(device_t dev)
164{
165 u8 reg8;
166 u16 reg16, pmbase;
167 u32 reg32;
168 const char *state;
169 /* Get the chip configuration */
170 config_t *config = dev->chip_info;
171
172 int pwr_on=CONFIG_MAINBOARD_POWER_ON_AFTER_POWER_FAIL;
173 int nmi_option;
174
175 /* BIOS must program... */
176 reg32 = pci_read_config32(dev, 0xac);
177 pci_write_config32(dev, 0xac, reg32 | (1 << 30) | (3 << 8));
178
179 /* Which state do we want to goto after g3 (power restored)?
180 * 0 == S0 Full On
181 * 1 == S5 Soft Off
182 *
183 * If the option is not existent (Laptops), use MAINBOARD_POWER_ON.
184 */
185 if (get_option(&pwr_on, "power_on_after_fail") < 0)
186 pwr_on = MAINBOARD_POWER_ON;
187
188 reg8 = pci_read_config8(dev, D31F0_GEN_PMCON_3);
189 reg8 &= 0xfe;
190 switch (pwr_on) {
191 case MAINBOARD_POWER_OFF:
192 reg8 |= 1;
193 state = "off";
194 break;
195 case MAINBOARD_POWER_ON:
196 reg8 &= ~1;
197 state = "on";
198 break;
199 case MAINBOARD_POWER_KEEP:
200 reg8 &= ~1;
201 state = "state keep";
202 break;
203 default:
204 state = "undefined";
205 }
206
207 reg8 |= (3 << 4); /* avoid #S4 assertions */
208 reg8 &= ~(1 << 3); /* minimum asssertion is 1 to 2 RTCCLK */
209
210 pci_write_config8(dev, D31F0_GEN_PMCON_3, reg8);
211 printk(BIOS_INFO, "Set power %s after power failure.\n", state);
212
213 /* Set up NMI on errors. */
214 reg8 = inb(0x61);
215 reg8 &= 0x0f; /* Higher Nibble must be 0 */
216 reg8 &= ~(1 << 3); /* IOCHK# NMI Enable */
217 // reg8 &= ~(1 << 2); /* PCI SERR# Enable */
218 reg8 |= (1 << 2); /* PCI SERR# Disable for now */
219 outb(reg8, 0x61);
220
221 reg8 = inb(0x74); /* Read from 0x74 as 0x70 is write only. */
222 nmi_option = NMI_OFF;
223 get_option(&nmi_option, "nmi");
224 if (nmi_option) {
225 printk(BIOS_INFO, "NMI sources enabled.\n");
226 reg8 &= ~(1 << 7); /* Set NMI. */
227 } else {
228 printk(BIOS_INFO, "NMI sources disabled.\n");
229 reg8 |= ( 1 << 7); /* Can't mask NMI from PCI-E and NMI_NOW */
230 }
231 outb(reg8, 0x70);
232
233 /* Enable CPU_SLP# and Intel Speedstep, set SMI# rate down */
234 reg16 = pci_read_config16(dev, D31F0_GEN_PMCON_1);
235 reg16 &= ~(3 << 0); // SMI# rate 1 minute
236 reg16 |= (1 << 2); // CLKRUN_EN - Mobile/Ultra only
237 reg16 |= (1 << 3); // Speedstep Enable - Mobile/Ultra only
238 reg16 |= (1 << 5); // CPUSLP_EN Desktop only
239
240 if (config->c4onc3_enable)
241 reg16 |= (1 << 7);
242
243 // another laptop wants this?
244 // reg16 &= ~(1 << 10); // BIOS_PCI_EXP_EN - Desktop/Mobile only
245 reg16 |= (1 << 10); // BIOS_PCI_EXP_EN - Desktop/Mobile only
246#if DEBUG_PERIODIC_SMIS
247 /* Set DEBUG_PERIODIC_SMIS in i82801ix.h to debug using
248 * periodic SMIs.
249 */
250 reg16 |= (3 << 0); // Periodic SMI every 8s
251#endif
252 if (config->c5_enable)
253 reg16 |= (1 << 11); /* Enable C5, C6 and PMSYNC# */
254 pci_write_config16(dev, D31F0_GEN_PMCON_1, reg16);
255
256 /* Set exit timings for C5/C6. */
257 if (config->c5_enable) {
258 reg8 = pci_read_config8(dev, D31F0_C5_EXIT_TIMING);
259 reg8 &= ~((7 << 3) | (7 << 0));
260 if (config->c6_enable)
261 reg8 |= (5 << 3) | (3 << 0); /* 38-44us PMSYNC# to STPCLK#,
262 95-102us DPRSTP# to STP_CPU# */
263 else
264 reg8 |= (0 << 3) | (1 << 0); /* 16-17us PMSYNC# to STPCLK#,
265 34-40us DPRSTP# to STP_CPU# */
266 pci_write_config8(dev, D31F0_C5_EXIT_TIMING, reg8);
267 }
268
269 // Set the board's GPI routing.
270 i82801ix_gpi_routing(dev);
271
272 pmbase = pci_read_config16(dev, 0x40) & 0xfffe;
273
274 outl(config->gpe0_en, pmbase + 0x28);
275 outw(config->alt_gp_smi_en, pmbase + 0x38);
276
277 /* Set up power management block and determine sleep mode */
278 reg16 = inw(pmbase + 0x00); /* PM1_STS */
279 outw(reg16, pmbase + 0x00); /* Clear status bits. At least bit11 (power
280 button override) must be cleared or SCI
281 will be constantly fired and OSPM must
282 not know about it (ACPI spec says to
283 ignore the bit). */
284 reg32 = inl(pmbase + 0x04); // PM1_CNT
285 reg32 &= ~(7 << 10); // SLP_TYP
286 outl(reg32, pmbase + 0x04);
287
288 /* Set duty cycle for hardware throttling (defaults to 0x0: 50%). */
289 reg32 = inl(pmbase + 0x10);
290 reg32 &= ~(7 << 5);
291 reg32 |= (config->throttle_duty & 7) << 5;
292 outl(reg32, pmbase + 0x10);
293}
294
295static void i82801ix_configure_cstates(device_t dev)
296{
297 u8 reg8;
298
299 reg8 = pci_read_config8(dev, D31F0_CxSTATE_CNF);
300 reg8 |= (1 << 4) | (1 << 3) | (1 << 2); // Enable Popup & Popdown
301 pci_write_config8(dev, D31F0_CxSTATE_CNF, reg8);
302
303 // Set Deeper Sleep configuration to recommended values
304 reg8 = pci_read_config8(dev, D31F0_C4TIMING_CNT);
305 reg8 &= 0xf0;
306 reg8 |= (2 << 2); // Deeper Sleep to Stop CPU: 34-40us
307 reg8 |= (2 << 0); // Deeper Sleep to Sleep: 15us
308 pci_write_config8(dev, D31F0_C4TIMING_CNT, reg8);
309
310 /* We could enable slow-C4 exit here, if someone needs it? */
311}
312
313static void i82801ix_rtc_init(struct device *dev)
314{
315 u8 reg8;
316 int rtc_failed;
317
318 reg8 = pci_read_config8(dev, D31F0_GEN_PMCON_3);
319 rtc_failed = reg8 & RTC_BATTERY_DEAD;
320 if (rtc_failed) {
321 reg8 &= ~RTC_BATTERY_DEAD;
322 pci_write_config8(dev, D31F0_GEN_PMCON_3, reg8);
323 }
324 printk(BIOS_DEBUG, "rtc_failed = 0x%x\n", rtc_failed);
325
326 rtc_init(rtc_failed);
327}
328
329static void enable_hpet(void)
330{
331 u32 reg32;
332
333 /* Move HPET to default address 0xfed00000 and enable it */
334 reg32 = RCBA32(RCBA_HPTC);
335 reg32 |= (1 << 7); // HPET Address Enable
336 reg32 &= ~(3 << 0);
337 RCBA32(RCBA_HPTC) = reg32;
338}
339
340static void enable_clock_gating(void)
341{
342 u32 reg32;
343
344 /* Enable DMI dynamic clock gating. */
345 RCBA32(RCBA_DMIC) |= 3;
346
347 /* Enable Clock Gating for most devices. */
348 reg32 = RCBA32(RCBA_CG);
349 reg32 |= (1 << 31); /* LPC dynamic clock gating */
350 /* USB UHCI dynamic clock gating: */
351 reg32 |= (1 << 29) | (1 << 28);
352 /* SATA dynamic clock gating [0-3]: */
353 reg32 |= (1 << 27) | (1 << 26) | (1 << 25) | (1 << 24);
354 reg32 |= (1 << 23); /* LAN static clock gating (if LAN disabled) */
355 reg32 |= (1 << 22); /* HD audio dynamic clock gating */
356 reg32 &= ~(1 << 21); /* No HD audio static clock gating */
357 reg32 &= ~(1 << 20); /* No USB EHCI static clock gating */
358 reg32 |= (1 << 19); /* USB EHCI dynamic clock gating */
359 /* More SATA dynamic clock gating [4-5]: */
360 reg32 |= (1 << 18) | (1 << 17);
361 reg32 |= (1 << 16); /* PCI dynamic clock gating */
362 /* PCIe, DMI dynamic clock gating: */
363 reg32 |= (1 << 4) | (1 << 3) | (1 << 2) | (1 << 1);
364 reg32 |= (1 << 0); /* PCIe root port static clock gating */
365 RCBA32(RCBA_CG) = reg32;
366
367 /* Enable SPI dynamic clock gating. */
368 RCBA32(0x38c0) |= 7;
369}
370
371#if CONFIG_HAVE_SMI_HANDLER
372static void i82801ix_lock_smm(struct device *dev)
373{
374#if TEST_SMM_FLASH_LOCKDOWN
375 u8 reg8;
376#endif
377
378 if (acpi_slp_type != 3) {
379#if ENABLE_ACPI_MODE_IN_COREBOOT
380 printk(BIOS_DEBUG, "Enabling ACPI via APMC:\n");
381 outb(APM_CNT_ACPI_ENABLE, APM_CNT); // Enable ACPI mode
382 printk(BIOS_DEBUG, "done.\n");
383#else
384 printk(BIOS_DEBUG, "Disabling ACPI via APMC:\n");
385 outb(APM_CNT_ACPI_DISABLE, APM_CNT); // Disable ACPI mode
386 printk(BIOS_DEBUG, "done.\n");
387#endif
388 } else {
389 printk(BIOS_DEBUG, "S3 wakeup, enabling ACPI via APMC\n");
390 outb(APM_CNT_ACPI_ENABLE, APM_CNT);
391 }
392 /* Don't allow evil boot loaders, kernels, or
393 * userspace applications to deceive us:
394 */
395 smm_lock();
396
397#if TEST_SMM_FLASH_LOCKDOWN
398 /* Now try this: */
399 printk(BIOS_DEBUG, "Locking BIOS to RO... ");
400 reg8 = pci_read_config8(dev, 0xdc); /* BIOS_CNTL */
401 printk(BIOS_DEBUG, " BLE: %s; BWE: %s\n", (reg8&2)?"on":"off",
402 (reg8&1)?"rw":"ro");
403 reg8 &= ~(1 << 0); /* clear BIOSWE */
404 pci_write_config8(dev, 0xdc, reg8);
405 reg8 |= (1 << 1); /* set BLE */
406 pci_write_config8(dev, 0xdc, reg8);
407 printk(BIOS_DEBUG, "ok.\n");
408 reg8 = pci_read_config8(dev, 0xdc); /* BIOS_CNTL */
409 printk(BIOS_DEBUG, " BLE: %s; BWE: %s\n", (reg8&2)?"on":"off",
410 (reg8&1)?"rw":"ro");
411
412 printk(BIOS_DEBUG, "Writing:\n");
413 *(volatile u8 *)0xfff00000 = 0x00;
414 printk(BIOS_DEBUG, "Testing:\n");
415 reg8 |= (1 << 0); /* set BIOSWE */
416 pci_write_config8(dev, 0xdc, reg8);
417
418 reg8 = pci_read_config8(dev, 0xdc); /* BIOS_CNTL */
419 printk(BIOS_DEBUG, " BLE: %s; BWE: %s\n", (reg8&2)?"on":"off",
420 (reg8&1)?"rw":"ro");
421 printk(BIOS_DEBUG, "Done.\n");
422#endif
423}
424#endif
425
426static void lpc_init(struct device *dev)
427{
428 printk(BIOS_DEBUG, "i82801ix: lpc_init\n");
429
430 /* Set the value for PCI command register. */
431 pci_write_config16(dev, PCI_COMMAND, 0x000f);
432
433 /* IO APIC initialization. */
434 i82801ix_enable_apic(dev);
435
436 i82801ix_enable_serial_irqs(dev);
437
438 /* Setup the PIRQ. */
439 i82801ix_pirq_init(dev);
440
441 /* Setup power options. */
442 i82801ix_power_options(dev);
443
444 /* Configure Cx state registers */
445 if (LPC_IS_MOBILE(dev))
446 i82801ix_configure_cstates(dev);
447
448 /* Initialize the real time clock. */
449 i82801ix_rtc_init(dev);
450
451 /* Initialize ISA DMA. */
452 isa_dma_init();
453
454 /* Initialize the High Precision Event Timers, if present. */
455 enable_hpet();
456
457 /* Initialize Clock Gating */
458 enable_clock_gating();
459
460 setup_i8259();
461
462 /* The OS should do this? */
463 /* Interrupt 9 should be level triggered (SCI) */
464 i8259_configure_irq_trigger(9, 1);
465
466#if CONFIG_HAVE_SMI_HANDLER
467 i82801ix_lock_smm(dev);
468#endif
469}
470
471static void i82801ix_lpc_read_resources(device_t dev)
472{
473 /*
474 * I/O Resources
475 *
476 * 0x0000 - 0x000f....ISA DMA
477 * 0x0010 - 0x001f....ISA DMA aliases
478 * 0x0020 ~ 0x003d....PIC
479 * 0x002e - 0x002f....Maybe Super I/O
480 * 0x0040 - 0x0043....Timer
481 * 0x004e - 0x004f....Maybe Super I/O
482 * 0x0050 - 0x0053....Timer aliases
483 * 0x0061.............NMI_SC
484 * 0x0070.............NMI_EN (readable in alternative access mode)
485 * 0x0070 - 0x0077....RTC
486 * 0x0080 - 0x008f....ISA DMA
487 * 0x0090 ~ 0x009f....ISA DMA aliases
488 * 0x0092.............Fast A20 and Init
489 * 0x00a0 ~ 0x00bd....PIC
490 * 0x00b2 - 0x00b3....APM
491 * 0x00c0 ~ 0x00de....ISA DMA
492 * 0x00c1 ~ 0x00df....ISA DMA aliases
493 * 0x00f0.............Coprocessor Error
494 * (0x0400-0x041f)....SMBus (SMBUS_IO_BASE, during raminit)
495 * 0x04d0 - 0x04d1....PIC
496 * 0x0500 - 0x057f....PM (DEFAULT_PMBASE)
497 * 0x0580 - 0x05bf....SB GPIO (DEFAULT_GPIOBASE)
498 * 0x05c0 - 0x05ff....SB GPIO cont. (mobile only)
499 * 0x0cf8 - 0x0cff....PCI
500 * 0x0cf9.............Reset Control
501 */
502
503 struct resource *res;
504
505 /* Get the normal PCI resources of this device. */
506 pci_dev_read_resources(dev);
507
508 /* Add an extra subtractive resource for both memory and I/O. */
509 res = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
510 res->base = 0;
511 res->size = 0x1000;
512 res->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
513 IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
514
515 res = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
516 res->base = 0xff800000;
517 res->size = 0x00800000; /* 8 MB for flash */
518 res->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
519 IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
520
521 res = new_resource(dev, 3); /* IOAPIC */
522 res->base = IO_APIC_ADDR;
523 res->size = 0x00001000;
524 res->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
525}
526
527static void set_subsystem(device_t dev, unsigned vendor, unsigned device)
528{
529 if (!vendor || !device) {
530 pci_write_config32(dev, PCI_SUBSYSTEM_VENDOR_ID,
531 pci_read_config32(dev, PCI_VENDOR_ID));
532 } else {
533 pci_write_config32(dev, PCI_SUBSYSTEM_VENDOR_ID,
534 ((device & 0xffff) << 16) | (vendor & 0xffff));
535 }
536}
537
538static struct pci_operations pci_ops = {
539 .set_subsystem = set_subsystem,
540};
541
542static struct device_operations device_ops = {
543 .read_resources = i82801ix_lpc_read_resources,
544 .set_resources = pci_dev_set_resources,
545 .enable_resources = pci_dev_enable_resources,
546 .init = lpc_init,
547 .scan_bus = scan_static_bus,
548 .ops_pci = &pci_ops,
549};
550
551static const unsigned short pci_device_ids[] = {
552 0x2912, /* ICH9DH */
553 0x2914, /* ICH9DO */
554 0x2916, /* ICH9R */
555 0x2918, /* ICH9 */
556 0x2917, /* ICH9M-E */
557 0x2919, /* ICH9M */
558 0
559};
560
561static const struct pci_driver ich9_lpc __pci_driver = {
562 .ops = &device_ops,
563 .vendor = PCI_VENDOR_ID_INTEL,
564 .devices = pci_device_ids,
565};
566