2019-05-27 08:55:05 +02:00
// SPDX-License-Identifier: GPL-2.0-or-later
2005-04-16 15:20:36 -07:00
/*
2007-10-15 09:50:19 +02:00
* Copyright ( c ) by Jaroslav Kysela < perex @ perex . cz >
2005-04-16 15:20:36 -07:00
* and ( c ) 1999 Steve Ratcliffe < steve @ parabola . demon . co . uk >
* Copyright ( C ) 1999 - 2000 Takashi Iwai < tiwai @ suse . de >
*
* Emu8000 synth plug - in routine
*/
# include "emu8000_local.h"
# include <linux/init.h>
2011-07-15 12:38:28 -04:00
# include <linux/module.h>
2005-04-16 15:20:36 -07:00
# include <sound/initval.h>
MODULE_AUTHOR ( " Takashi Iwai, Steve Ratcliffe " ) ;
MODULE_DESCRIPTION ( " Emu8000 synth plug-in routine " ) ;
MODULE_LICENSE ( " GPL " ) ;
/*----------------------------------------------------------------*/
/*
* create a new hardware dependent device for Emu8000
*/
2015-02-12 13:43:22 +01:00
static int snd_emu8000_probe ( struct device * _dev )
2005-04-16 15:20:36 -07:00
{
2015-02-12 13:43:22 +01:00
struct snd_seq_device * dev = to_seq_dev ( _dev ) ;
2005-11-17 14:34:36 +01:00
struct snd_emu8000 * hw ;
struct snd_emux * emu ;
2005-04-16 15:20:36 -07:00
2005-11-17 14:34:36 +01:00
hw = * ( struct snd_emu8000 * * ) SNDRV_SEQ_DEVICE_ARGPTR ( dev ) ;
2005-04-16 15:20:36 -07:00
if ( hw = = NULL )
return - EINVAL ;
if ( hw - > emu )
return - EBUSY ; /* already exists..? */
if ( snd_emux_new ( & emu ) < 0 )
return - ENOMEM ;
hw - > emu = emu ;
snd_emu8000_ops_setup ( hw ) ;
emu - > hw = hw ;
emu - > max_voices = EMU8000_DRAM_VOICES ;
emu - > num_ports = hw - > seq_ports ;
if ( hw - > memhdr ) {
2005-10-20 18:26:44 +02:00
snd_printk ( KERN_ERR " memhdr is already initialized!? \n " ) ;
2005-04-16 15:20:36 -07:00
snd_util_memhdr_free ( hw - > memhdr ) ;
}
hw - > memhdr = snd_util_memhdr_new ( hw - > mem_size ) ;
if ( hw - > memhdr = = NULL ) {
snd_emux_free ( emu ) ;
hw - > emu = NULL ;
return - ENOMEM ;
}
emu - > memhdr = hw - > memhdr ;
emu - > midi_ports = hw - > seq_ports < 2 ? hw - > seq_ports : 2 ; /* number of virmidi ports */
emu - > midi_devidx = 1 ;
emu - > linear_panning = 1 ;
emu - > hwdep_idx = 2 ; /* FIXED */
if ( snd_emux_register ( emu , dev - > card , hw - > index , " Emu8000 " ) < 0 ) {
snd_emux_free ( emu ) ;
snd_util_memhdr_free ( hw - > memhdr ) ;
hw - > emu = NULL ;
hw - > memhdr = NULL ;
return - ENOMEM ;
}
if ( hw - > mem_size > 0 )
snd_emu8000_pcm_new ( dev - > card , hw , 1 ) ;
dev - > driver_data = hw ;
return 0 ;
}
/*
* free all resources
*/
2015-02-12 13:43:22 +01:00
static int snd_emu8000_remove ( struct device * _dev )
2005-04-16 15:20:36 -07:00
{
2015-02-12 13:43:22 +01:00
struct snd_seq_device * dev = to_seq_dev ( _dev ) ;
2005-11-17 14:34:36 +01:00
struct snd_emu8000 * hw ;
2005-04-16 15:20:36 -07:00
if ( dev - > driver_data = = NULL )
return 0 ; /* no synth was allocated actually */
hw = dev - > driver_data ;
if ( hw - > pcm )
snd_device_free ( dev - > card , hw - > pcm ) ;
2015-01-03 21:02:32 +01:00
snd_emux_free ( hw - > emu ) ;
2014-11-21 19:32:02 +01:00
snd_util_memhdr_free ( hw - > memhdr ) ;
2005-04-16 15:20:36 -07:00
hw - > emu = NULL ;
hw - > memhdr = NULL ;
return 0 ;
}
/*
* INIT part
*/
2015-02-12 13:43:22 +01:00
static struct snd_seq_driver emu8000_driver = {
. driver = {
. name = KBUILD_MODNAME ,
. probe = snd_emu8000_probe ,
. remove = snd_emu8000_remove ,
} ,
. id = SNDRV_SEQ_DEV_ID_EMU8000 ,
. argsize = sizeof ( struct snd_emu8000 * ) ,
} ;
module_snd_seq_driver ( emu8000_driver ) ;