2 * Copyright (c) 1998, 1999 Takanori Watanabe
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 #include <sys/cdefs.h>
28 __FBSDID("$FreeBSD$");
30 #include <sys/param.h>
31 #include <sys/systm.h>
32 #include <sys/kernel.h>
33 #include <machine/bus.h>
36 #include <sys/module.h>
39 #include <machine/resource.h>
40 #include <dev/smbus/smbconf.h>
44 /*This should be removed if force_pci_map_int supported*/
45 #include <sys/interrupt.h>
47 #include <dev/pci/pcireg.h>
48 #include <dev/pci/pcivar.h>
49 #include <pci/intpmreg.h>
51 #include "opt_intpm.h"
59 { 0x71138086,"Intel 82371AB Power management controller"},
60 { 0x719b8086,"Intel 82443MX Power management controller"},
62 /* Not a good idea yet, this stops isab0 functioning */
63 { 0x02001166,"ServerWorks OSB4 PCI to ISA Bridge"},
68 static int intsmb_probe(device_t);
69 static int intsmb_attach(device_t);
71 static int intsmb_intr(device_t dev);
72 static int intsmb_slvintr(device_t dev);
73 static void intsmb_alrintr(device_t dev);
74 static int intsmb_callback(device_t dev, int index, caddr_t data);
75 static int intsmb_quick(device_t dev, u_char slave, int how);
76 static int intsmb_sendb(device_t dev, u_char slave, char byte);
77 static int intsmb_recvb(device_t dev, u_char slave, char *byte);
78 static int intsmb_writeb(device_t dev, u_char slave, char cmd, char byte);
79 static int intsmb_writew(device_t dev, u_char slave, char cmd, short word);
80 static int intsmb_readb(device_t dev, u_char slave, char cmd, char *byte);
81 static int intsmb_readw(device_t dev, u_char slave, char cmd, short *word);
82 static int intsmb_pcall(device_t dev, u_char slave, char cmd, short sdata, short *rdata);
83 static int intsmb_bwrite(device_t dev, u_char slave, char cmd, u_char count, char *buf);
84 static int intsmb_bread(device_t dev, u_char slave, char cmd, u_char count, char *buf);
85 static void intsmb_start(device_t dev,u_char cmd,int nointr);
86 static int intsmb_stop(device_t dev);
87 static int intsmb_stop_poll(device_t dev);
88 static int intsmb_free(device_t dev);
89 static int intpm_probe (device_t dev);
90 static int intpm_attach (device_t dev);
91 static devclass_t intsmb_devclass;
93 static device_method_t intpm_methods[]={
94 DEVMETHOD(device_probe,intsmb_probe),
95 DEVMETHOD(device_attach,intsmb_attach),
97 DEVMETHOD(bus_print_child, bus_generic_print_child),
99 DEVMETHOD(smbus_callback,intsmb_callback),
100 DEVMETHOD(smbus_quick,intsmb_quick),
101 DEVMETHOD(smbus_sendb,intsmb_sendb),
102 DEVMETHOD(smbus_recvb,intsmb_recvb),
103 DEVMETHOD(smbus_writeb,intsmb_writeb),
104 DEVMETHOD(smbus_writew,intsmb_writew),
105 DEVMETHOD(smbus_readb,intsmb_readb),
106 DEVMETHOD(smbus_readw,intsmb_readw),
107 DEVMETHOD(smbus_pcall,intsmb_pcall),
108 DEVMETHOD(smbus_bwrite,intsmb_bwrite),
109 DEVMETHOD(smbus_bread,intsmb_bread),
113 struct intpm_pci_softc{
114 bus_space_tag_t smbst;
115 bus_space_handle_t smbsh;
116 bus_space_tag_t pmst;
117 bus_space_handle_t pmsh;
123 struct intpm_pci_softc *pci_sc;
125 bus_space_handle_t sh;
130 static driver_t intpm_driver = {
133 sizeof(struct intsmb_softc),
136 static devclass_t intpm_devclass;
137 static device_method_t intpm_pci_methods[] = {
138 DEVMETHOD(device_probe,intpm_probe),
139 DEVMETHOD(device_attach,intpm_attach),
142 static driver_t intpm_pci_driver = {
145 sizeof(struct intpm_pci_softc)
149 intsmb_probe(device_t dev)
151 struct intsmb_softc *sc =(struct intsmb_softc *) device_get_softc(dev);
152 sc->smbus=device_add_child(dev, "smbus", -1);
154 return (EINVAL); /* XXX don't know what to return else */
155 device_set_desc(dev,"Intel PIIX4 SMBUS Interface");
157 return (BUS_PROBE_DEFAULT); /* XXX don't know what to return else */
160 intsmb_attach(device_t dev)
162 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
163 sc->pci_sc=device_get_softc(device_get_parent(dev));
165 sc->sh=sc->pci_sc->smbsh;
166 sc->st=sc->pci_sc->smbst;
167 sc->pci_sc->smbus=dev;
168 device_probe_and_attach(sc->smbus);
171 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBSLVCNT,
172 PIIX4_SMBSLVCNT_ALTEN);
178 intsmb_callback(device_t dev, int index, caddr_t data)
184 case SMB_REQUEST_BUS:
186 case SMB_RELEASE_BUS:
194 /*counterpart of smbtx_smb_free*/
196 intsmb_free(device_t dev){
198 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
199 if((bus_space_read_1(sc->st,sc->sh,PIIX4_SMBHSTSTS)&
200 PIIX4_SMBHSTSTAT_BUSY)
202 ||(bus_space_read_1(sc->st,sc->sh,PIIX4_SMBSLVSTS)&
203 PIIX4_SMBSLVSTS_BUSY)
209 /*Disable Intrrupt in slave part*/
211 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBSLVCNT,0);
213 /*Reset INTR Flag to prepare INTR*/
214 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTSTS,
215 (PIIX4_SMBHSTSTAT_INTR|
216 PIIX4_SMBHSTSTAT_ERR|
217 PIIX4_SMBHSTSTAT_BUSC|
218 PIIX4_SMBHSTSTAT_FAIL)
225 intsmb_intr(device_t dev)
227 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
229 status=bus_space_read_1(sc->st,sc->sh,PIIX4_SMBHSTSTS);
230 if(status&PIIX4_SMBHSTSTAT_BUSY){
234 if(status&(PIIX4_SMBHSTSTAT_INTR|
235 PIIX4_SMBHSTSTAT_ERR|
236 PIIX4_SMBHSTSTAT_BUSC|
237 PIIX4_SMBHSTSTAT_FAIL)){
239 tmp=bus_space_read_1(sc->st,sc->sh,PIIX4_SMBHSTCNT);
240 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTCNT,
241 tmp&~PIIX4_SMBHSTCNT_INTREN);
248 return 1;/* Not Completed*/
251 intsmb_slvintr(device_t dev)
253 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
256 status=bus_space_read_1(sc->st,sc->sh,PIIX4_SMBSLVSTS);
257 if(status&PIIX4_SMBSLVSTS_BUSY)
259 if(status&PIIX4_SMBSLVSTS_ALART){
262 }else if(status&~(PIIX4_SMBSLVSTS_ALART|PIIX4_SMBSLVSTS_SDW2
263 |PIIX4_SMBSLVSTS_SDW1)){
266 /*Reset Status Register*/
267 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBSLVSTS,PIIX4_SMBSLVSTS_ALART|
268 PIIX4_SMBSLVSTS_SDW2|PIIX4_SMBSLVSTS_SDW1|
269 PIIX4_SMBSLVSTS_SLV);
273 static void intsmb_alrintr(device_t dev)
275 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
281 /*stop generating INTR from ALART*/
282 slvcnt=bus_space_read_1(sc->st,sc->sh,PIIX4_SMBSLVCNT);
284 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBSLVCNT,
285 slvcnt&~PIIX4_SMBSLVCNT_ALTEN) ;
288 /*ask bus who assert it and then ask it what's the matter. */
290 error=intsmb_free(dev);
292 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTADD,SMBALTRESP
294 intsmb_start(dev,PIIX4_SMBHSTCNT_PROT_BYTE,1);
295 if(!(error=intsmb_stop_poll(dev))){
297 addr=bus_space_read_1(sc->st,sc->sh,
299 printf("ALART_RESPONSE: 0x%x\n", addr);
305 /*Re-enable INTR from ALART*/
306 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBSLVCNT,
307 slvcnt|PIIX4_SMBSLVCNT_ALTEN) ;
314 intsmb_start(device_t dev,unsigned char cmd,int nointr)
316 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
318 tmp=bus_space_read_1(sc->st,sc->sh,PIIX4_SMBHSTCNT);
321 tmp |=PIIX4_SMBHSTCNT_START;
322 /*While not in autoconfiguration Intrrupt Enabled*/
324 tmp |=PIIX4_SMBHSTCNT_INTREN;
325 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTCNT,tmp);
328 /*Polling Code. Polling is not encouraged
329 * because It is required to wait for the device get busy.
330 *(29063505.pdf from Intel)
331 * But during boot,intrrupt cannot be used.
332 * so use polling code while in autoconfiguration.
336 intsmb_stop_poll(device_t dev){
338 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
341 * In smbtx driver ,Simply waiting.
342 * This loops 100-200 times.
344 for(i=0;i<0x7fff;i++){
345 if((bus_space_read_1(sc->st,sc->sh,PIIX4_SMBHSTSTS)
346 &PIIX4_SMBHSTSTAT_BUSY)){
350 for(i=0;i<0x7fff;i++){
352 status=bus_space_read_1(sc->st,sc->sh,PIIX4_SMBHSTSTS);
353 if(!(status&PIIX4_SMBHSTSTAT_BUSY)){
355 error=(status&PIIX4_SMBHSTSTAT_ERR)?EIO :
356 (status&PIIX4_SMBHSTSTAT_BUSC)?EBUSY:
357 (status&PIIX4_SMBHSTSTAT_FAIL)?EIO:0;
358 if(error==0&&!(status&PIIX4_SMBHSTSTAT_INTR)){
359 printf("unknown cause why?");
367 tmp=bus_space_read_1(sc->st,sc->sh,PIIX4_SMBHSTCNT);
368 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTCNT,
369 tmp&~PIIX4_SMBHSTCNT_INTREN);
374 *wait for completion and return result.
377 intsmb_stop(device_t dev){
380 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
382 /*So that it can use device during probing device on SMBus.*/
383 error=intsmb_stop_poll(dev);
386 if(!tsleep(sc,(PWAIT)|PCATCH,"SMBWAI",hz/8)){
388 status=bus_space_read_1(sc->st,sc->sh,PIIX4_SMBHSTSTS);
389 if(!(status&PIIX4_SMBHSTSTAT_BUSY)){
390 error=(status&PIIX4_SMBHSTSTAT_ERR)?EIO :
391 (status&PIIX4_SMBHSTSTAT_BUSC)?EBUSY:
392 (status&PIIX4_SMBHSTSTAT_FAIL)?EIO:0;
393 if(error==0&&!(status&PIIX4_SMBHSTSTAT_INTR)){
394 printf("intsmb%d:unknown cause why?\n",
395 device_get_unit(dev));
398 bus_space_write_1(sc->st,sc->sh,
399 PIIX4_SMBSLVCNT,PIIX4_SMBSLVCNT_ALTEN);
405 /*Timeout Procedure*/
408 /*Re-enable supressed intrrupt from slave part*/
409 bus_space_write_1(sc->st,sc->sh,
410 PIIX4_SMBSLVCNT,PIIX4_SMBSLVCNT_ALTEN);
416 intsmb_quick(device_t dev, u_char slave, int how)
420 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
422 /*Quick command is part of Address, I think*/
434 error=intsmb_free(dev);
436 bus_space_write_1(sc->st,sc->sh,
437 PIIX4_SMBHSTADD,data);
438 intsmb_start(dev,PIIX4_SMBHSTCNT_PROT_QUICK,0);
439 error=intsmb_stop(dev);
447 intsmb_sendb(device_t dev, u_char slave, char byte)
450 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
451 error=intsmb_free(dev);
453 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTADD,slave&~LSB);
454 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTCMD,byte);
455 intsmb_start(dev,PIIX4_SMBHSTCNT_PROT_BYTE,0);
456 error=intsmb_stop(dev);
461 intsmb_recvb(device_t dev, u_char slave, char *byte)
464 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
465 error=intsmb_free(dev);
467 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTADD,slave
469 intsmb_start(dev,PIIX4_SMBHSTCNT_PROT_BYTE,0);
470 if(!(error=intsmb_stop(dev))){
471 #ifdef RECV_IS_IN_CMD
472 /*Linux SMBus stuff also troubles
473 Because Intel's datasheet will not make clear.
475 *byte=bus_space_read_1(sc->st,sc->sh,
478 *byte=bus_space_read_1(sc->st,sc->sh,
486 intsmb_writeb(device_t dev, u_char slave, char cmd, char byte)
489 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
490 error=intsmb_free(dev);
492 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTADD,slave&~LSB);
493 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTCMD,cmd);
494 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTDAT0,byte);
495 intsmb_start(dev,PIIX4_SMBHSTCNT_PROT_BDATA,0);
496 error=intsmb_stop(dev);
501 intsmb_writew(device_t dev, u_char slave, char cmd, short word)
504 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
505 error=intsmb_free(dev);
507 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTADD,slave&~LSB);
508 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTCMD,cmd);
509 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTDAT0,
511 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTDAT1,
513 intsmb_start(dev,PIIX4_SMBHSTCNT_PROT_WDATA,0);
514 error=intsmb_stop(dev);
520 intsmb_readb(device_t dev, u_char slave, char cmd, char *byte)
523 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
524 error=intsmb_free(dev);
526 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTADD,slave|LSB);
527 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTCMD,cmd);
528 intsmb_start(dev,PIIX4_SMBHSTCNT_PROT_BDATA,0);
529 if(!(error=intsmb_stop(dev))){
530 *byte=bus_space_read_1(sc->st,sc->sh,
537 intsmb_readw(device_t dev, u_char slave, char cmd, short *word)
540 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
541 error=intsmb_free(dev);
543 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTADD,slave|LSB);
544 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTCMD,cmd);
545 intsmb_start(dev,PIIX4_SMBHSTCNT_PROT_WDATA,0);
546 if(!(error=intsmb_stop(dev))){
547 *word=bus_space_read_1(sc->st,sc->sh,PIIX4_SMBHSTDAT0)&0xff;
548 *word|=(bus_space_read_1(sc->st,sc->sh,PIIX4_SMBHSTDAT1)&0xff)<<8;
554 * Data sheet claims that it implements all function, but also claims
555 * that it implements 7 function and not mention PCALL. So I don't know
556 * whether it will work.
559 intsmb_pcall(device_t dev, u_char slave, char cmd, short sdata, short *rdata)
563 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
564 error=intsmb_free(dev);
566 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTADD,slave&~LSB);
567 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTCMD,cmd);
568 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTDAT0,sdata&0xff);
569 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTDAT1,(sdata&0xff)>>8);
570 intsmb_start(dev,PIIX4_SMBHSTCNT_PROT_WDATA,0);
572 if(!(error=intsmb_stop(dev))){
573 *rdata=bus_space_read_1(sc->st,sc->sh,PIIX4_SMBHSTDAT0)&0xff;
574 *rdata|=(bus_space_read_1(sc->st,sc->sh,PIIX4_SMBHSTDAT1)&0xff)<<8;
582 intsmb_bwrite(device_t dev, u_char slave, char cmd, u_char count, char *buf)
585 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
586 error=intsmb_free(dev);
587 if(count>SMBBLOCKTRANS_MAX||count==0)
590 /*Reset internal array index*/
591 bus_space_read_1(sc->st,sc->sh,PIIX4_SMBHSTCNT);
593 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTADD,slave&~LSB);
594 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTCMD,cmd);
595 for(i=0;i<count;i++){
596 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBBLKDAT,buf[i]);
598 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTDAT0,count);
599 intsmb_start(dev,PIIX4_SMBHSTCNT_PROT_BLOCK,0);
600 error=intsmb_stop(dev);
606 intsmb_bread(device_t dev, u_char slave, char cmd, u_char count, char *buf)
609 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
610 error=intsmb_free(dev);
611 if(count>SMBBLOCKTRANS_MAX||count==0)
614 /*Reset internal array index*/
615 bus_space_read_1(sc->st,sc->sh,PIIX4_SMBHSTCNT);
617 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTADD,slave|LSB);
618 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTCMD,cmd);
619 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTDAT0,count);
620 intsmb_start(dev,PIIX4_SMBHSTCNT_PROT_BLOCK,0);
621 error=intsmb_stop(dev);
623 bzero(buf,count);/*Is it needed?*/
624 count= bus_space_read_1(sc->st,sc->sh,
626 if(count!=0&&count<=SMBBLOCKTRANS_MAX){
627 for(i=0;i<count;i++){
628 buf[i]=bus_space_read_1(sc->st,
641 DRIVER_MODULE(intsmb, intpm , intpm_driver, intsmb_devclass, 0, 0);
644 static void intpm_intr(void *arg);
646 intpm_attach(device_t dev)
649 int unit=device_get_unit(dev);
654 struct intpm_pci_softc *sciic;
655 device_t smbinterface;
657 struct resource *res;
659 sciic=device_get_softc(dev);
664 rid=PCI_BASE_ADDR_SMB;
665 res=bus_alloc_resource_any(dev,SYS_RES_IOPORT,&rid,RF_ACTIVE);
667 device_printf(dev,"Could not allocate Bus space\n");
670 sciic->smbst=rman_get_bustag(res);
671 sciic->smbsh=rman_get_bushandle(res);
674 device_printf(dev,"%s %lx\n",
675 (sciic->smbst==I386_BUS_SPACE_IO)?
676 "I/O mapped":"Memory",
677 rman_get_start(res));
681 #ifndef NO_CHANGE_PCICONF
682 pci_write_config(dev,PCIR_INTLINE,0x9,1);
683 pci_write_config(dev,PCI_HST_CFG_SMB,
684 PCI_INTR_SMB_IRQ9|PCI_INTR_SMB_ENABLE,1);
686 value=pci_read_config(dev,PCI_HST_CFG_SMB,1);
688 case PCI_INTR_SMB_SMI:
691 case PCI_INTR_SMB_IRQ9:
697 device_printf(dev,"intr %s %s ",str,((value&1)? "enabled":"disabled"));
698 value=pci_read_config(dev,PCI_REVID_SMB,1);
699 printf("revision %d\n",value);
701 * Install intr HANDLER here
704 res=bus_alloc_resource(dev,SYS_RES_IRQ,&rid,9,9,1,RF_SHAREABLE|RF_ACTIVE);
706 device_printf(dev,"could not allocate irq");
709 error=bus_setup_intr(dev,res,INTR_TYPE_MISC, (driver_intr_t *) intpm_intr,sciic,&ih);
711 device_printf(dev,"Failed to map intr\n");
714 smbinterface=device_add_child(dev,"intsmb",unit);
716 printf("intsmb%d:could not add SMBus device\n",unit);
718 device_probe_and_attach(smbinterface);
721 value=pci_read_config(dev,PCI_BASE_ADDR_PM,4);
722 printf("intpm%d: PM %s %x \n",unit,(value&1)?"I/O mapped":"Memory",value&0xfffe);
726 intpm_probe(device_t dev)
728 struct _pcsid *ep =pci_ids;
729 u_int32_t device_id=pci_get_devid(dev);
731 while (ep->type && ep->type != device_id)
734 device_set_desc(dev,ep->desc);
735 bus_set_resource(dev,SYS_RES_IRQ,0,9,1); /* XXX setup intr resource */
736 return (BUS_PROBE_DEFAULT);
741 DRIVER_MODULE(intpm, pci , intpm_pci_driver, intpm_devclass, 0, 0);
742 MODULE_DEPEND(intpm, smbus, SMBUS_MINVER, SMBUS_PREFVER, SMBUS_MAXVER);
743 MODULE_VERSION(intpm, 1);
745 static void intpm_intr(void *arg)
747 struct intpm_pci_softc *sc;
748 sc=(struct intpm_pci_softc *)arg;
749 intsmb_intr(sc->smbus);
750 intsmb_slvintr(sc->smbus);