2 * AdLib FM card driver.
5 #include <sound/driver.h>
6 #include <linux/kernel.h>
7 #include <linux/module.h>
8 #include <linux/platform_device.h>
9 #include <sound/core.h>
10 #include <sound/initval.h>
11 #include <sound/opl3.h>
13 #define CRD_NAME "AdLib FM"
14 #define DRV_NAME "snd_adlib"
16 MODULE_DESCRIPTION(CRD_NAME
);
17 MODULE_AUTHOR("Rene Herman");
18 MODULE_LICENSE("GPL");
20 static int index
[SNDRV_CARDS
] = SNDRV_DEFAULT_IDX
;
21 static char *id
[SNDRV_CARDS
] = SNDRV_DEFAULT_STR
;
22 static int enable
[SNDRV_CARDS
] = SNDRV_DEFAULT_ENABLE
;
23 static long port
[SNDRV_CARDS
] = SNDRV_DEFAULT_PORT
;
25 module_param_array(index
, int, NULL
, 0444);
26 MODULE_PARM_DESC(index
, "Index value for " CRD_NAME
" soundcard.");
27 module_param_array(id
, charp
, NULL
, 0444);
28 MODULE_PARM_DESC(id
, "ID string for " CRD_NAME
" soundcard.");
29 module_param_array(enable
, bool, NULL
, 0444);
30 MODULE_PARM_DESC(enable
, "Enable " CRD_NAME
" soundcard.");
31 module_param_array(port
, long, NULL
, 0444);
32 MODULE_PARM_DESC(port
, "Port # for " CRD_NAME
" driver.");
34 static struct platform_device
*devices
[SNDRV_CARDS
];
36 static void snd_adlib_free(struct snd_card
*card
)
38 release_and_free_resource(card
->private_data
);
41 static int __devinit
snd_adlib_probe(struct platform_device
*device
)
43 struct snd_card
*card
;
44 struct snd_opl3
*opl3
;
46 int error
, i
= device
->id
;
48 if (port
[i
] == SNDRV_AUTO_PORT
) {
49 snd_printk(KERN_ERR DRV_NAME
": please specify port\n");
54 card
= snd_card_new(index
[i
], id
[i
], THIS_MODULE
, 0);
56 snd_printk(KERN_ERR DRV_NAME
": could not create card\n");
61 card
->private_data
= request_region(port
[i
], 4, CRD_NAME
);
62 if (!card
->private_data
) {
63 snd_printk(KERN_ERR DRV_NAME
": could not grab ports\n");
67 card
->private_free
= snd_adlib_free
;
69 error
= snd_opl3_create(card
, port
[i
], port
[i
] + 2, OPL3_HW_AUTO
, 1, &opl3
);
71 snd_printk(KERN_ERR DRV_NAME
": could not create OPL\n");
75 error
= snd_opl3_hwdep_new(opl3
, 0, 0, NULL
);
77 snd_printk(KERN_ERR DRV_NAME
": could not create FM\n");
81 strcpy(card
->driver
, DRV_NAME
);
82 strcpy(card
->shortname
, CRD_NAME
);
83 sprintf(card
->longname
, CRD_NAME
" at %#lx", port
[i
]);
85 snd_card_set_dev(card
, &device
->dev
);
87 error
= snd_card_register(card
);
89 snd_printk(KERN_ERR DRV_NAME
": could not register card\n");
93 platform_set_drvdata(device
, card
);
96 out1
: snd_card_free(card
);
100 static int __devexit
snd_adlib_remove(struct platform_device
*device
)
102 snd_card_free(platform_get_drvdata(device
));
103 platform_set_drvdata(device
, NULL
);
107 static struct platform_driver snd_adlib_driver
= {
108 .probe
= snd_adlib_probe
,
109 .remove
= __devexit_p(snd_adlib_remove
),
116 static int __init
alsa_card_adlib_init(void)
120 if (platform_driver_register(&snd_adlib_driver
) < 0) {
121 snd_printk(KERN_ERR DRV_NAME
": could not register driver\n");
125 for (cards
= 0, i
= 0; i
< SNDRV_CARDS
; i
++) {
126 struct platform_device
*device
;
131 device
= platform_device_register_simple(DRV_NAME
, i
, NULL
, 0);
135 if (!platform_get_drvdata(device
)) {
136 platform_device_unregister(device
);
146 printk(KERN_ERR CRD_NAME
" soundcard not found or device busy\n");
148 platform_driver_unregister(&snd_adlib_driver
);
154 static void __exit
alsa_card_adlib_exit(void)
158 for (i
= 0; i
< SNDRV_CARDS
; i
++)
159 platform_device_unregister(devices
[i
]);
160 platform_driver_unregister(&snd_adlib_driver
);
163 module_init(alsa_card_adlib_init
);
164 module_exit(alsa_card_adlib_exit
);