static int __init probe_sgalaxy( struct address_info *ai )
{
- if ( check_region( ai->io_base, 8 ) ) {
+ struct resource *ports;
+ int n;
+
+ if (!request_region(ai->io_base, 4, "WSS config")) {
printk(KERN_ERR "sgalaxy: WSS IO port 0x%03x not available\n", ai->io_base);
return 0;
}
-
- if ( ad1848_detect( ai->io_base+4, NULL, ai->osp ) )
- return probe_ms_sound(ai); /* The card is already active, check irq etc... */
- if ( check_region( ai->ai_sgbase, 0x10 ) ) {
+ ports = request_region(ai->io_base + 4, 4, "ad1848");
+ if (!ports) {
+ printk(KERN_ERR "sgalaxy: WSS IO port 0x%03x not available\n", ai->io_base);
+ release_region(ai->io_base, 4);
+ return 0;
+ }
+
+ if (!request_region( ai->ai_sgbase, 0x10, "SoundGalaxy SB")) {
printk(KERN_ERR "sgalaxy: SB IO port 0x%03x not available\n", ai->ai_sgbase);
+ release_region(ai->io_base + 4, 4);
+ release_region(ai->io_base, 4);
return 0;
}
+ if (ad1848_detect(ports, NULL, ai->osp))
+ goto out; /* The card is already active, check irq etc... */
+
/* switch to MSS/WSS mode */
sb_rst( ai->ai_sgbase );
sleep( HZ/10 );
- return probe_ms_sound(ai);
-}
+out:
+ if (!probe_ms_sound(ai, ports)) {
+ release_region(ai->io_base + 4, 4);
+ release_region(ai->io_base, 4);
+ release_region(ai->ai_sgbase, 0x10);
+ return 0;
+ }
-static void __init attach_sgalaxy( struct address_info *ai )
-{
- int n;
-
- request_region( ai->ai_sgbase, 0x10, "SoundGalaxy SB" );
-
- attach_ms_sound(ai, THIS_MODULE);
+ attach_ms_sound(ai, ports, THIS_MODULE);
n=ai->slots[0];
if (n!=-1 && audio_devs[n]->mixer_dev != -1 ) {
AD1848_REROUTE( SOUND_MIXER_LINE2, SOUND_MIXER_SYNTH ); /* FM+Wavetable*/
AD1848_REROUTE( SOUND_MIXER_LINE3, SOUND_MIXER_CD ); /* CD */
}
+ return 1;
}
static void __exit unload_sgalaxy( struct address_info *ai )
static int __initdata dma2 = -1;
static int __initdata sgbase = -1;
-MODULE_PARM(io,"i");
-MODULE_PARM(irq,"i");
-MODULE_PARM(dma,"i");
-MODULE_PARM(dma2,"i");
-MODULE_PARM(sgbase,"i");
+module_param(io, int, 0);
+module_param(irq, int, 0);
+module_param(dma, int, 0);
+module_param(dma2, int, 0);
+module_param(sgbase, int, 0);
static int __init init_sgalaxy(void)
{
if ( probe_sgalaxy(&cfg) == 0 )
return -ENODEV;
- attach_sgalaxy(&cfg);
-
return 0;
}