2019-05-27 09:55:05 +03:00
// SPDX-License-Identifier: GPL-2.0-or-later
2005-04-17 02:20:36 +04:00
/*
2007-10-15 11:50:19 +04:00
* Copyright ( c ) by Jaroslav Kysela < perex @ perex . cz >
2005-04-17 02:20:36 +04:00
* GUS ' s memory access via proc filesystem
*/
# include <linux/slab.h>
# include <sound/core.h>
# include <sound/gus.h>
# include <sound/info.h>
2005-11-17 16:36:44 +03:00
struct gus_proc_private {
2005-04-17 02:20:36 +04:00
int rom ; /* data are in ROM */
unsigned int address ;
unsigned int size ;
2005-11-17 16:36:44 +03:00
struct snd_gus_card * gus ;
} ;
2005-04-17 02:20:36 +04:00
2010-04-13 13:22:01 +04:00
static ssize_t snd_gf1_mem_proc_dump ( struct snd_info_entry * entry ,
void * file_private_data ,
struct file * file , char __user * buf ,
size_t count , loff_t pos )
2005-04-17 02:20:36 +04:00
{
2005-11-17 16:36:44 +03:00
struct gus_proc_private * priv = entry - > private_data ;
struct snd_gus_card * gus = priv - > gus ;
2005-04-17 02:20:36 +04:00
int err ;
2010-04-13 13:33:54 +04:00
err = snd_gus_dram_read ( gus , buf , pos , count , priv - > rom ) ;
if ( err < 0 )
return err ;
return count ;
2005-04-17 02:20:36 +04:00
}
2005-11-17 16:36:44 +03:00
static void snd_gf1_mem_proc_free ( struct snd_info_entry * entry )
2005-04-17 02:20:36 +04:00
{
2005-11-17 16:36:44 +03:00
struct gus_proc_private * priv = entry - > private_data ;
2005-04-17 02:20:36 +04:00
kfree ( priv ) ;
}
2020-01-03 11:16:44 +03:00
static const struct snd_info_entry_ops snd_gf1_mem_proc_ops = {
2005-04-17 02:20:36 +04:00
. read = snd_gf1_mem_proc_dump ,
} ;
2005-11-17 16:36:44 +03:00
int snd_gf1_mem_proc_init ( struct snd_gus_card * gus )
2005-04-17 02:20:36 +04:00
{
int idx ;
char name [ 16 ] ;
2005-11-17 16:36:44 +03:00
struct gus_proc_private * priv ;
struct snd_info_entry * entry ;
2005-04-17 02:20:36 +04:00
for ( idx = 0 ; idx < 4 ; idx + + ) {
if ( gus - > gf1 . mem_alloc . banks_8 [ idx ] . size > 0 ) {
2005-09-09 16:21:17 +04:00
priv = kzalloc ( sizeof ( * priv ) , GFP_KERNEL ) ;
2005-04-17 02:20:36 +04:00
if ( priv = = NULL )
return - ENOMEM ;
priv - > gus = gus ;
sprintf ( name , " gus-ram-%i " , idx ) ;
if ( ! snd_card_proc_new ( gus - > card , name , & entry ) ) {
entry - > content = SNDRV_INFO_CONTENT_DATA ;
entry - > private_data = priv ;
entry - > private_free = snd_gf1_mem_proc_free ;
entry - > c . ops = & snd_gf1_mem_proc_ops ;
priv - > address = gus - > gf1 . mem_alloc . banks_8 [ idx ] . address ;
priv - > size = entry - > size = gus - > gf1 . mem_alloc . banks_8 [ idx ] . size ;
}
}
}
for ( idx = 0 ; idx < 4 ; idx + + ) {
if ( gus - > gf1 . rom_present & ( 1 < < idx ) ) {
2005-09-09 16:21:17 +04:00
priv = kzalloc ( sizeof ( * priv ) , GFP_KERNEL ) ;
2005-04-17 02:20:36 +04:00
if ( priv = = NULL )
return - ENOMEM ;
priv - > rom = 1 ;
priv - > gus = gus ;
sprintf ( name , " gus-rom-%i " , idx ) ;
if ( ! snd_card_proc_new ( gus - > card , name , & entry ) ) {
entry - > content = SNDRV_INFO_CONTENT_DATA ;
entry - > private_data = priv ;
entry - > private_free = snd_gf1_mem_proc_free ;
entry - > c . ops = & snd_gf1_mem_proc_ops ;
priv - > address = idx * 4096 * 1024 ;
priv - > size = entry - > size = gus - > gf1 . rom_memory ;
}
}
}
return 0 ;
}