2006-06-21 15:42:43 +02:00
/*
* Apple Onboard Audio Alsa helpers
*
* Copyright 2006 Johannes Berg < johannes @ sipsolutions . net >
*
* GPL v2 , can be found in COPYING .
*/
# include <linux/module.h>
2008-10-23 15:47:56 +02:00
# include "alsa.h"
2006-06-21 15:42:43 +02:00
static int index = - 1 ;
module_param ( index , int , 0444 ) ;
MODULE_PARM_DESC ( index , " index for AOA sound card. " ) ;
static struct aoa_card * aoa_card ;
2006-12-07 08:24:12 +01:00
int aoa_alsa_init ( char * name , struct module * mod , struct device * dev )
2006-06-21 15:42:43 +02:00
{
struct snd_card * alsa_card ;
int err ;
if ( aoa_card )
/* cannot be EEXIST due to usage in aoa_fabric_register */
return - EBUSY ;
2008-12-28 16:45:02 +01:00
err = snd_card_create ( index , name , mod , sizeof ( struct aoa_card ) ,
& alsa_card ) ;
if ( err < 0 )
return err ;
2006-06-21 15:42:43 +02:00
aoa_card = alsa_card - > private_data ;
aoa_card - > alsa_card = alsa_card ;
2006-12-07 08:24:12 +01:00
alsa_card - > dev = dev ;
2006-06-21 15:42:43 +02:00
strlcpy ( alsa_card - > driver , " AppleOnbdAudio " , sizeof ( alsa_card - > driver ) ) ;
strlcpy ( alsa_card - > shortname , name , sizeof ( alsa_card - > shortname ) ) ;
strlcpy ( alsa_card - > longname , name , sizeof ( alsa_card - > longname ) ) ;
strlcpy ( alsa_card - > mixername , name , sizeof ( alsa_card - > mixername ) ) ;
err = snd_card_register ( aoa_card - > alsa_card ) ;
if ( err < 0 ) {
printk ( KERN_ERR " snd-aoa: couldn't register alsa card \n " ) ;
snd_card_free ( aoa_card - > alsa_card ) ;
aoa_card = NULL ;
return err ;
}
return 0 ;
}
struct snd_card * aoa_get_card ( void )
{
if ( aoa_card )
return aoa_card - > alsa_card ;
return NULL ;
}
EXPORT_SYMBOL_GPL ( aoa_get_card ) ;
void aoa_alsa_cleanup ( void )
{
if ( aoa_card ) {
snd_card_free ( aoa_card - > alsa_card ) ;
aoa_card = NULL ;
}
}
int aoa_snd_device_new ( snd_device_type_t type ,
2006-10-05 15:07:23 +02:00
void * device_data , struct snd_device_ops * ops )
2006-06-21 15:42:43 +02:00
{
struct snd_card * card = aoa_get_card ( ) ;
int err ;
2008-10-23 15:47:56 +02:00
2006-06-21 15:42:43 +02:00
if ( ! card ) return - ENOMEM ;
err = snd_device_new ( card , type , device_data , ops ) ;
if ( err ) {
printk ( KERN_ERR " snd-aoa: failed to create snd device (%d) \n " , err ) ;
return err ;
}
err = snd_device_register ( card , device_data ) ;
if ( err ) {
printk ( KERN_ERR " snd-aoa: failed to register "
" snd device (%d) \n " , err ) ;
printk ( KERN_ERR " snd-aoa: have you forgotten the "
" dev_register callback? \n " ) ;
snd_device_free ( card , device_data ) ;
}
return err ;
}
EXPORT_SYMBOL_GPL ( aoa_snd_device_new ) ;
int aoa_snd_ctl_add ( struct snd_kcontrol * control )
{
int err ;
if ( ! aoa_card ) return - ENODEV ;
err = snd_ctl_add ( aoa_card - > alsa_card , control ) ;
if ( err )
printk ( KERN_ERR " snd-aoa: failed to add alsa control (%d) \n " ,
err ) ;
return err ;
}
EXPORT_SYMBOL_GPL ( aoa_snd_ctl_add ) ;