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
26 * $FreeBSD: src/sys/pci/intpm.c,v 1.16.2.1 2001/12/23 08:17:47 pirzyk Exp $
27 * $DragonFly: src/sys/dev/powermng/i386/intpm/intpm.c,v 1.9 2005/10/12 17:35:54 dillon Exp $
30 #include <sys/param.h>
31 #include <sys/systm.h>
32 #include <sys/kernel.h>
33 #include <machine/bus_pio.h>
34 #include <machine/bus_memio.h>
35 #include <machine/bus.h>
37 #include <machine/clock.h>
39 #include <sys/module.h>
42 #include <sys/malloc.h>
45 #include <sys/thread2.h>
46 #include <machine/resource.h>
47 #include <bus/smbus/smbconf.h>
51 /*This should be removed if force_pci_map_int supported*/
52 #include <sys/interrupt.h>
54 #include <bus/pci/pcireg.h>
55 #include <bus/pci/pcivar.h>
58 #include "opt_intpm.h"
66 { 0x71138086,"Intel 82371AB Power management controller"},
67 { 0x719b8086,"Intel 82443MX Power management controller"},
70 static int intsmb_probe(device_t);
71 static int intsmb_attach(device_t);
73 static int intsmb_intr(device_t dev);
74 static int intsmb_slvintr(device_t dev);
75 static void intsmb_alrintr(device_t dev);
76 static int intsmb_callback(device_t dev, int index, caddr_t data);
77 static int intsmb_quick(device_t dev, u_char slave, int how);
78 static int intsmb_sendb(device_t dev, u_char slave, char byte);
79 static int intsmb_recvb(device_t dev, u_char slave, char *byte);
80 static int intsmb_writeb(device_t dev, u_char slave, char cmd, char byte);
81 static int intsmb_writew(device_t dev, u_char slave, char cmd, short word);
82 static int intsmb_readb(device_t dev, u_char slave, char cmd, char *byte);
83 static int intsmb_readw(device_t dev, u_char slave, char cmd, short *word);
84 static int intsmb_pcall(device_t dev, u_char slave, char cmd, short sdata, short *rdata);
85 static int intsmb_bwrite(device_t dev, u_char slave, char cmd, u_char count, char *buf);
86 static int intsmb_bread(device_t dev, u_char slave, char cmd, u_char count, char *buf);
87 static void intsmb_start(device_t dev,u_char cmd,int nointr);
88 static int intsmb_stop(device_t dev);
89 static int intsmb_stop_poll(device_t dev);
90 static int intsmb_free(device_t dev);
91 static int intpm_probe (device_t dev);
92 static int intpm_attach (device_t dev);
93 static devclass_t intsmb_devclass;
95 static device_method_t intpm_methods[]={
96 DEVMETHOD(device_probe,intsmb_probe),
97 DEVMETHOD(device_attach,intsmb_attach),
99 DEVMETHOD(bus_print_child, bus_generic_print_child),
101 DEVMETHOD(smbus_callback,intsmb_callback),
102 DEVMETHOD(smbus_quick,intsmb_quick),
103 DEVMETHOD(smbus_sendb,intsmb_sendb),
104 DEVMETHOD(smbus_recvb,intsmb_recvb),
105 DEVMETHOD(smbus_writeb,intsmb_writeb),
106 DEVMETHOD(smbus_writew,intsmb_writew),
107 DEVMETHOD(smbus_readb,intsmb_readb),
108 DEVMETHOD(smbus_readw,intsmb_readw),
109 DEVMETHOD(smbus_pcall,intsmb_pcall),
110 DEVMETHOD(smbus_bwrite,intsmb_bwrite),
111 DEVMETHOD(smbus_bread,intsmb_bread),
115 struct intpm_pci_softc{
116 bus_space_tag_t smbst;
117 bus_space_handle_t smbsh;
118 bus_space_tag_t pmst;
119 bus_space_handle_t pmsh;
126 struct intpm_pci_softc *pci_sc;
128 bus_space_handle_t sh;
133 static driver_t intpm_driver = {
136 sizeof(struct intsmb_softc),
139 static devclass_t intpm_devclass;
140 static device_method_t intpm_pci_methods[] = {
141 DEVMETHOD(device_probe,intpm_probe),
142 DEVMETHOD(device_attach,intpm_attach),
145 static driver_t intpm_pci_driver = {
148 sizeof(struct intpm_pci_softc)
152 intsmb_probe(device_t dev)
154 struct intsmb_softc *sc =(struct intsmb_softc *) device_get_softc(dev);
155 sc->smbus=smbus_alloc_bus(dev);
157 return (EINVAL); /* XXX don't know what to return else */
158 device_set_desc(dev,"Intel PIIX4 SMBUS Interface");
160 return (0); /* XXX don't know what to return else */
163 intsmb_attach(device_t dev)
165 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
166 sc->pci_sc=device_get_softc(device_get_parent(dev));
168 sc->sh=sc->pci_sc->smbsh;
169 sc->st=sc->pci_sc->smbst;
170 sc->pci_sc->smbus=dev;
171 device_probe_and_attach(sc->smbus);
174 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBSLVCNT,
175 PIIX4_SMBSLVCNT_ALTEN);
181 intsmb_callback(device_t dev, int index, caddr_t data)
187 case SMB_REQUEST_BUS:
189 case SMB_RELEASE_BUS:
197 /*counterpart of smbtx_smb_free*/
199 intsmb_free(device_t dev){
200 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
201 if((bus_space_read_1(sc->st,sc->sh,PIIX4_SMBHSTSTS)&
202 PIIX4_SMBHSTSTAT_BUSY)
204 ||(bus_space_read_1(sc->st,sc->sh,PIIX4_SMBSLVSTS)&
205 PIIX4_SMBSLVSTS_BUSY)
211 /*Disable Intrrupt in slave part*/
213 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBSLVCNT,0);
215 /*Reset INTR Flag to prepare INTR*/
216 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTSTS,
217 (PIIX4_SMBHSTSTAT_INTR|
218 PIIX4_SMBHSTSTAT_ERR|
219 PIIX4_SMBHSTSTAT_BUSC|
220 PIIX4_SMBHSTSTAT_FAIL)
227 intsmb_intr(device_t dev)
229 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
231 status=bus_space_read_1(sc->st,sc->sh,PIIX4_SMBHSTSTS);
232 if(status&PIIX4_SMBHSTSTAT_BUSY){
236 if(status&(PIIX4_SMBHSTSTAT_INTR|
237 PIIX4_SMBHSTSTAT_ERR|
238 PIIX4_SMBHSTSTAT_BUSC|
239 PIIX4_SMBHSTSTAT_FAIL)){
241 tmp=bus_space_read_1(sc->st,sc->sh,PIIX4_SMBHSTCNT);
242 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTCNT,
243 tmp&~PIIX4_SMBHSTCNT_INTREN);
250 return 1;/* Not Completed*/
253 intsmb_slvintr(device_t dev)
255 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
258 status=bus_space_read_1(sc->st,sc->sh,PIIX4_SMBSLVSTS);
259 if(status&PIIX4_SMBSLVSTS_BUSY)
261 if(status&PIIX4_SMBSLVSTS_ALART){
264 }else if(status&~(PIIX4_SMBSLVSTS_ALART|PIIX4_SMBSLVSTS_SDW2
265 |PIIX4_SMBSLVSTS_SDW1)){
268 /*Reset Status Register*/
269 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBSLVSTS,PIIX4_SMBSLVSTS_ALART|
270 PIIX4_SMBSLVSTS_SDW2|PIIX4_SMBSLVSTS_SDW1|
271 PIIX4_SMBSLVSTS_SLV);
275 static void intsmb_alrintr(device_t dev)
277 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
283 /*stop generating INTR from ALART*/
284 slvcnt=bus_space_read_1(sc->st,sc->sh,PIIX4_SMBSLVCNT);
286 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBSLVCNT,
287 slvcnt&~PIIX4_SMBSLVCNT_ALTEN) ;
290 /*ask bus who assert it and then ask it what's the matter. */
292 error=intsmb_free(dev);
294 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTADD,SMBALTRESP
296 intsmb_start(dev,PIIX4_SMBHSTCNT_PROT_BYTE,1);
297 if(!(error=intsmb_stop_poll(dev))){
299 addr = bus_space_read_1(sc->st,sc->sh,
301 printf("ALART_RESPONSE: %#x\n", addr);
307 /*Re-enable INTR from ALART*/
308 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBSLVCNT,
309 slvcnt|PIIX4_SMBSLVCNT_ALTEN) ;
316 intsmb_start(device_t dev,unsigned char cmd,int nointr)
318 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
320 tmp=bus_space_read_1(sc->st,sc->sh,PIIX4_SMBHSTCNT);
323 tmp |=PIIX4_SMBHSTCNT_START;
324 /*While not in autoconfiguration Intrrupt Enabled*/
326 tmp |=PIIX4_SMBHSTCNT_INTREN;
327 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTCNT,tmp);
330 /*Polling Code. Polling is not encouraged
331 * because It is required to wait for the device get busy.
332 *(29063505.pdf from Intel)
333 * But during boot,intrrupt cannot be used.
334 * so use polling code while in autoconfiguration.
338 intsmb_stop_poll(device_t dev){
340 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
343 * In smbtx driver ,Simply waiting.
344 * This loops 100-200 times.
346 for(i=0;i<0x7fff;i++){
347 if((bus_space_read_1(sc->st,sc->sh,PIIX4_SMBHSTSTS)
348 &PIIX4_SMBHSTSTAT_BUSY)){
352 for(i=0;i<0x7fff;i++){
354 status=bus_space_read_1(sc->st,sc->sh,PIIX4_SMBHSTSTS);
355 if(!(status&PIIX4_SMBHSTSTAT_BUSY)){
357 error=(status&PIIX4_SMBHSTSTAT_ERR)?EIO :
358 (status&PIIX4_SMBHSTSTAT_BUSC)?EBUSY:
359 (status&PIIX4_SMBHSTSTAT_FAIL)?EIO:0;
360 if(error==0&&!(status&PIIX4_SMBHSTSTAT_INTR)){
361 printf("unknown cause why?");
369 tmp=bus_space_read_1(sc->st,sc->sh,PIIX4_SMBHSTCNT);
370 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTCNT,
371 tmp&~PIIX4_SMBHSTCNT_INTREN);
376 *wait for completion and return result.
379 intsmb_stop(device_t dev){
381 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
383 /*So that it can use device during probing device on SMBus.*/
384 error=intsmb_stop_poll(dev);
387 if(!tsleep(sc, PCATCH, "SMBWAI", hz/8)){
389 status=bus_space_read_1(sc->st,sc->sh,PIIX4_SMBHSTSTS);
390 if(!(status&PIIX4_SMBHSTSTAT_BUSY)){
391 error=(status&PIIX4_SMBHSTSTAT_ERR)?EIO :
392 (status&PIIX4_SMBHSTSTAT_BUSC)?EBUSY:
393 (status&PIIX4_SMBHSTSTAT_FAIL)?EIO:0;
394 if(error==0&&!(status&PIIX4_SMBHSTSTAT_INTR)){
395 printf("intsmb%d:unknown cause why?\n",
396 device_get_unit(dev));
399 bus_space_write_1(sc->st,sc->sh,
400 PIIX4_SMBSLVCNT,PIIX4_SMBSLVCNT_ALTEN);
406 /*Timeout Procedure*/
409 /*Re-enable supressed intrrupt from slave part*/
410 bus_space_write_1(sc->st,sc->sh,
411 PIIX4_SMBSLVCNT,PIIX4_SMBSLVCNT_ALTEN);
417 intsmb_quick(device_t dev, u_char slave, int how)
421 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
423 /*Quick command is part of Address, I think*/
435 error=intsmb_free(dev);
437 bus_space_write_1(sc->st,sc->sh,
438 PIIX4_SMBHSTADD,data);
439 intsmb_start(dev,PIIX4_SMBHSTCNT_PROT_QUICK,0);
440 error=intsmb_stop(dev);
448 intsmb_sendb(device_t dev, u_char slave, char byte)
451 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
452 error=intsmb_free(dev);
454 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTADD,slave&~LSB);
455 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTCMD,byte);
456 intsmb_start(dev,PIIX4_SMBHSTCNT_PROT_BYTE,0);
457 error=intsmb_stop(dev);
462 intsmb_recvb(device_t dev, u_char slave, char *byte)
465 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
466 error=intsmb_free(dev);
468 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTADD,slave
470 intsmb_start(dev,PIIX4_SMBHSTCNT_PROT_BYTE,0);
471 if(!(error=intsmb_stop(dev))){
472 #ifdef RECV_IS_IN_CMD
473 /*Linux SMBus stuff also troubles
474 Because Intel's datasheet will not make clear.
476 *byte=bus_space_read_1(sc->st,sc->sh,
479 *byte=bus_space_read_1(sc->st,sc->sh,
487 intsmb_writeb(device_t dev, u_char slave, char cmd, char byte)
490 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
491 error=intsmb_free(dev);
493 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTADD,slave&~LSB);
494 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTCMD,cmd);
495 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTDAT0,byte);
496 intsmb_start(dev,PIIX4_SMBHSTCNT_PROT_BDATA,0);
497 error=intsmb_stop(dev);
502 intsmb_writew(device_t dev, u_char slave, char cmd, short word)
505 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
506 error=intsmb_free(dev);
508 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTADD,slave&~LSB);
509 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTCMD,cmd);
510 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTDAT0,
512 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTDAT1,
514 intsmb_start(dev,PIIX4_SMBHSTCNT_PROT_WDATA,0);
515 error=intsmb_stop(dev);
521 intsmb_readb(device_t dev, u_char slave, char cmd, char *byte)
524 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
525 error=intsmb_free(dev);
527 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTADD,slave|LSB);
528 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTCMD,cmd);
529 intsmb_start(dev,PIIX4_SMBHSTCNT_PROT_BDATA,0);
530 if(!(error=intsmb_stop(dev))){
531 *byte=bus_space_read_1(sc->st,sc->sh,
538 intsmb_readw(device_t dev, u_char slave, char cmd, short *word)
541 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
542 error=intsmb_free(dev);
544 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTADD,slave|LSB);
545 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTCMD,cmd);
546 intsmb_start(dev,PIIX4_SMBHSTCNT_PROT_WDATA,0);
547 if(!(error=intsmb_stop(dev))){
548 *word=bus_space_read_1(sc->st,sc->sh,PIIX4_SMBHSTDAT0)&0xff;
549 *word|=(bus_space_read_1(sc->st,sc->sh,PIIX4_SMBHSTDAT1)&0xff)<<8;
555 * Data sheet claims that it implements all function, but also claims
556 * that it implements 7 function and not mention PCALL. So I don't know
557 * whether it will work.
560 intsmb_pcall(device_t dev, u_char slave, char cmd, short sdata, short *rdata)
564 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
565 error=intsmb_free(dev);
567 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTADD,slave&~LSB);
568 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTCMD,cmd);
569 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTDAT0,sdata&0xff);
570 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTDAT1,(sdata&0xff)>>8);
571 intsmb_start(dev,PIIX4_SMBHSTCNT_PROT_WDATA,0);
573 if(!(error=intsmb_stop(dev))){
574 *rdata=bus_space_read_1(sc->st,sc->sh,PIIX4_SMBHSTDAT0)&0xff;
575 *rdata|=(bus_space_read_1(sc->st,sc->sh,PIIX4_SMBHSTDAT1)&0xff)<<8;
583 intsmb_bwrite(device_t dev, u_char slave, char cmd, u_char count, char *buf)
586 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
587 error=intsmb_free(dev);
588 if(count>SMBBLOCKTRANS_MAX||count==0)
591 /*Reset internal array index*/
592 bus_space_read_1(sc->st,sc->sh,PIIX4_SMBHSTCNT);
594 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTADD,slave&~LSB);
595 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTCMD,cmd);
596 for(i=0;i<count;i++){
597 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBBLKDAT,buf[i]);
599 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTDAT0,count);
600 intsmb_start(dev,PIIX4_SMBHSTCNT_PROT_BLOCK,0);
601 error=intsmb_stop(dev);
607 intsmb_bread(device_t dev, u_char slave, char cmd, u_char count, char *buf)
610 struct intsmb_softc *sc = (struct intsmb_softc *)device_get_softc(dev);
611 error=intsmb_free(dev);
612 if(count>SMBBLOCKTRANS_MAX||count==0)
615 /*Reset internal array index*/
616 bus_space_read_1(sc->st,sc->sh,PIIX4_SMBHSTCNT);
618 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTADD,slave|LSB);
619 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTCMD,cmd);
620 bus_space_write_1(sc->st,sc->sh,PIIX4_SMBHSTDAT0,count);
621 intsmb_start(dev,PIIX4_SMBHSTCNT_PROT_BLOCK,0);
622 error=intsmb_stop(dev);
624 bzero(buf,count);/*Is it needed?*/
625 count= bus_space_read_1(sc->st,sc->sh,
627 if(count!=0&&count<=SMBBLOCKTRANS_MAX){
628 for(i=0;i<count;i++){
629 buf[i]=bus_space_read_1(sc->st,
642 DRIVER_MODULE(intsmb, intpm , intpm_driver, intsmb_devclass, 0, 0);
645 static void intpm_intr (void *arg);
647 intpm_attach(device_t dev)
650 int unit=device_get_unit(dev);
655 struct intpm_pci_softc *sciic;
656 device_t smbinterface;
658 struct resource *res;
660 sciic=device_get_softc(dev);
665 rid=PCI_BASE_ADDR_SMB;
666 res=bus_alloc_resource(dev,SYS_RES_IOPORT,&rid,
669 device_printf(dev,"Could not allocate Bus space\n");
672 sciic->smbst=rman_get_bustag(res);
673 sciic->smbsh=rman_get_bushandle(res);
675 device_printf(dev,"%s %x\n",
676 (sciic->smbst==I386_BUS_SPACE_IO)?
677 "I/O mapped":"Memory",
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, 0,
710 (driver_intr_t *)intpm_intr, sciic,
713 device_printf(dev,"Failed to map intr\n");
716 smbinterface=device_add_child(dev,"intsmb",unit);
718 printf("intsmb%d:could not add SMBus device\n",unit);
720 device_probe_and_attach(smbinterface);
723 value=pci_read_config(dev,PCI_BASE_ADDR_PM,4);
724 printf("intpm%d: PM %s %x \n",unit,(value&1)?"I/O mapped":"Memory",value&0xfffe);
728 intpm_probe(device_t dev)
730 struct _pcsid *ep =pci_ids;
731 u_int32_t device_id=pci_get_devid(dev);
733 while (ep->type && ep->type != device_id)
736 device_set_desc(dev,ep->desc);
737 bus_set_resource(dev,SYS_RES_IRQ,0,9,1); /* XXX setup intr resource */
743 DRIVER_MODULE(intpm, pci , intpm_pci_driver, intpm_devclass, 0, 0);
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);