2 * PCI sound skeleton example
4 * (c) 1998 Red Hat Software
6 * This software may be used and distributed according to the
7 * terms of the GNU General Public License, incorporated herein by
10 * This example is designed to be built in the linux/drivers/sound
11 * directory as part of a kernel build. The example is modular only
12 * drop me a note once you have a working modular driver and want
13 * to integrate it with the main code.
14 * -- Alan <alan@redhat.com>
16 * This is a first draft. Please report any errors, corrections or
20 #include <linux/module.h>
21 #include <linux/delay.h>
22 #include <linux/errno.h>
24 #include <linux/kernel.h>
25 #include <linux/pci.h>
29 #include "sound_config.h"
32 * Define our PCI vendor ID here
35 #ifndef PCI_VENDOR_MYIDENT
36 #define PCI_VENDOR_MYIDENT 0x125D
39 * PCI identity for the card.
42 #define PCI_DEVICE_ID_MYIDENT_MYCARD1 0x1969
45 #define CARD_NAME "ExampleWave 3D Pro Ultra ThingyWotsit"
50 * Each address_info object holds the information about one of
51 * our card resources. In this case the MSS emulation of our
52 * ficticious card. Its used to manage and attach things.
55 static struct address_info mss_data
[MAX_CARDS
];
59 * Install the actual card. This is an example
62 static int mycard_install(struct pci_dev
*pcidev
)
74 * Our imaginary code has its I/O on PCI address 0, a
75 * MSS on PCI address 1 and an MPU on address 2
77 * For the example we will only initialise the MSS
80 iobase
= pci_resource_start(pcidev
, 0);
81 mssbase
= pci_resource_start(pcidev
, 1);
82 mpubase
= pci_resource_start(pcidev
, 2);
89 * Wait for completion. udelay() waits in microseconds
95 * Ok card ready. Begin setup proper. You might for example
96 * load the firmware here
99 dma
= card_specific_magic(ioaddr
);
102 * Turn on legacy mode (example), There are also byte and
103 * dword (32bit) PCI configuration function calls
106 pci_read_config_word(pcidev
, 0x40, &w
);
107 w
&=~(1<<15); /* legacy decode on */
108 w
|=(1<<14); /* Reserved write as 1 in this case */
109 w
|=(1<<3)|(1<<1)|(1<<0); /* SB on , FM on, MPU on */
110 pci_write_config_word(pcidev
, 0x40, w
);
113 * Let the user know we found his toy.
116 printk(KERN_INFO
"Programmed "CARD_NAME
" at 0x%X to legacy mode.\n",
120 * Now set it up the description of the card
123 mss_data
[cards
].io_base
= mssbase
;
124 mss_data
[cards
].irq
= pcidev
->irq
;
125 mss_data
[cards
].dma
= dma
;
128 * Check there is an MSS present
131 if(ad1848_detect(mssbase
, NULL
, mss_data
[cards
].osp
)==0)
138 mss_data
[cards
].slots
[3] = ad1848_init("MyCard MSS 16bit",
153 * This loop walks the PCI configuration database and finds where
154 * the sound cards are.
157 int init_mycard(void)
159 struct pci_dev
*pcidev
=NULL
;
162 while((pcidev
= pci_find_device(PCI_VENDOR_MYIDENT
, PCI_DEVICE_ID_MYIDENT_MYCARD1
, pcidev
))!=NULL
)
164 if (pci_enable_device(pcidev
))
166 count
+=mycard_install(pcidev
);
179 * This function is called when the user or kernel loads the
180 * module into memory.
184 int init_module(void)
188 printk(KERN_ERR
"No "CARD_NAME
" cards found.\n");
196 * This is called when it is removed. It will only be removed
197 * when its use count is 0.
200 void cleanup_module(void)
202 for(i
=0;i
< cards
; i
++)
205 * Free attached resources
208 ad1848_unload(mss_data
[i
].io_base
,
214 * And disconnect the device from the kernel
216 sound_unload_audiodevice(mss_data
[i
].slots
[3]);