2019-05-31 01:09:25 -07:00
/* SPDX-License-Identifier: GPL-2.0-only */
2009-05-14 08:05:58 +02:00
/**
* Copyright ( C ) 2008 , Creative Technology Ltd . All Rights Reserved .
*
* @ File ctsrc . h
*
* @ Brief
* This file contains the definition of the Sample Rate Convertor
* resource management object .
*
* @ Author Liu Chun
* @ Date May 13 2008
*/
# ifndef CTSRC_H
# define CTSRC_H
# include "ctresource.h"
# include "ctimap.h"
# include <linux/spinlock.h>
# include <linux/list.h>
2014-09-29 14:33:23 +05:30
# include <sound/core.h>
2009-05-14 08:05:58 +02:00
# define SRC_STATE_OFF 0x0
# define SRC_STATE_INIT 0x4
# define SRC_STATE_RUN 0x5
# define SRC_SF_U8 0x0
# define SRC_SF_S16 0x1
# define SRC_SF_S24 0x2
# define SRC_SF_S32 0x3
# define SRC_SF_F32 0x4
/* Define the descriptor of a src resource */
enum SRCMODE {
MEMRD , /* Read data from host memory */
MEMWR , /* Write data to host memory */
ARCRW , /* Read from and write to audio ring channel */
NUM_SRCMODES
} ;
struct src_rsc_ops ;
struct src {
struct rsc rsc ; /* Basic resource info */
struct src * intlv ; /* Pointer to next interleaved SRC in a series */
2015-11-08 23:40:41 +01:00
const struct src_rsc_ops * ops ; /* SRC specific operations */
2009-05-14 08:05:58 +02:00
/* Number of contiguous srcs for interleaved usage */
unsigned char multi ;
unsigned char mode ; /* Working mode of this SRC resource */
} ;
struct src_rsc_ops {
int ( * set_state ) ( struct src * src , unsigned int state ) ;
int ( * set_bm ) ( struct src * src , unsigned int bm ) ;
int ( * set_sf ) ( struct src * src , unsigned int sf ) ;
int ( * set_pm ) ( struct src * src , unsigned int pm ) ;
int ( * set_rom ) ( struct src * src , unsigned int rom ) ;
int ( * set_vo ) ( struct src * src , unsigned int vo ) ;
int ( * set_st ) ( struct src * src , unsigned int st ) ;
int ( * set_bp ) ( struct src * src , unsigned int bp ) ;
int ( * set_cisz ) ( struct src * src , unsigned int cisz ) ;
int ( * set_ca ) ( struct src * src , unsigned int ca ) ;
int ( * set_sa ) ( struct src * src , unsigned int sa ) ;
int ( * set_la ) ( struct src * src , unsigned int la ) ;
int ( * set_pitch ) ( struct src * src , unsigned int pitch ) ;
int ( * set_clr_zbufs ) ( struct src * src ) ;
int ( * commit_write ) ( struct src * src ) ;
int ( * get_ca ) ( struct src * src ) ;
int ( * init ) ( struct src * src ) ;
struct src * ( * next_interleave ) ( struct src * src ) ;
} ;
/* Define src resource request description info */
struct src_desc {
/* Number of contiguous master srcs for interleaved usage */
unsigned char multi ;
unsigned char msr ;
unsigned char mode ; /* Working mode of the requested srcs */
} ;
/* Define src manager object */
struct src_mgr {
struct rsc_mgr mgr ; /* Basic resource manager info */
2014-09-29 14:33:23 +05:30
struct snd_card * card ; /* pointer to this card */
2009-05-14 08:05:58 +02:00
spinlock_t mgr_lock ;
/* request src resource */
int ( * get_src ) ( struct src_mgr * mgr ,
const struct src_desc * desc , struct src * * rsrc ) ;
/* return src resource */
int ( * put_src ) ( struct src_mgr * mgr , struct src * src ) ;
int ( * src_enable_s ) ( struct src_mgr * mgr , struct src * src ) ;
int ( * src_enable ) ( struct src_mgr * mgr , struct src * src ) ;
int ( * src_disable ) ( struct src_mgr * mgr , struct src * src ) ;
int ( * commit_write ) ( struct src_mgr * mgr ) ;
} ;
/* Define the descriptor of a SRC Input Mapper resource */
struct srcimp_mgr ;
struct srcimp_rsc_ops ;
struct srcimp {
struct rsc rsc ;
unsigned char idx [ 8 ] ;
struct imapper * imappers ;
unsigned int mapped ; /* A bit-map indicating which conj rsc is mapped */
struct srcimp_mgr * mgr ;
2015-11-08 23:40:41 +01:00
const struct srcimp_rsc_ops * ops ;
2009-05-14 08:05:58 +02:00
} ;
struct srcimp_rsc_ops {
int ( * map ) ( struct srcimp * srcimp , struct src * user , struct rsc * input ) ;
int ( * unmap ) ( struct srcimp * srcimp ) ;
} ;
/* Define SRCIMP resource request description info */
struct srcimp_desc {
unsigned int msr ;
} ;
struct srcimp_mgr {
struct rsc_mgr mgr ; /* Basic resource manager info */
2014-09-29 14:33:23 +05:30
struct snd_card * card ; /* pointer to this card */
2009-05-14 08:05:58 +02:00
spinlock_t mgr_lock ;
spinlock_t imap_lock ;
struct list_head imappers ;
struct imapper * init_imap ;
unsigned int init_imap_added ;
/* request srcimp resource */
int ( * get_srcimp ) ( struct srcimp_mgr * mgr ,
const struct srcimp_desc * desc ,
struct srcimp * * rsrcimp ) ;
/* return srcimp resource */
int ( * put_srcimp ) ( struct srcimp_mgr * mgr , struct srcimp * srcimp ) ;
int ( * imap_add ) ( struct srcimp_mgr * mgr , struct imapper * entry ) ;
int ( * imap_delete ) ( struct srcimp_mgr * mgr , struct imapper * entry ) ;
} ;
/* Constructor and destructor of SRC resource manager */
2014-09-29 14:33:21 +05:30
int src_mgr_create ( struct hw * hw , struct src_mgr * * rsrc_mgr ) ;
2009-05-14 08:05:58 +02:00
int src_mgr_destroy ( struct src_mgr * src_mgr ) ;
/* Constructor and destructor of SRCIMP resource manager */
2014-09-29 14:33:21 +05:30
int srcimp_mgr_create ( struct hw * hw , struct srcimp_mgr * * rsrc_mgr ) ;
2009-05-14 08:05:58 +02:00
int srcimp_mgr_destroy ( struct srcimp_mgr * srcimp_mgr ) ;
# endif /* CTSRC_H */