Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * Copyright (C) 2008, Creative Technology Ltd. All Rights Reserved.
0004  *
0005  * @File    ctsrc.h
0006  *
0007  * @Brief
0008  * This file contains the definition of the Sample Rate Convertor
0009  * resource management object.
0010  *
0011  * @Author  Liu Chun
0012  * @Date    May 13 2008
0013  */
0014 
0015 #ifndef CTSRC_H
0016 #define CTSRC_H
0017 
0018 #include "ctresource.h"
0019 #include "ctimap.h"
0020 #include <linux/spinlock.h>
0021 #include <linux/list.h>
0022 #include <sound/core.h>
0023 
0024 #define SRC_STATE_OFF   0x0
0025 #define SRC_STATE_INIT  0x4
0026 #define SRC_STATE_RUN   0x5
0027 
0028 #define SRC_SF_U8   0x0
0029 #define SRC_SF_S16  0x1
0030 #define SRC_SF_S24  0x2
0031 #define SRC_SF_S32  0x3
0032 #define SRC_SF_F32  0x4
0033 
0034 /* Define the descriptor of a src resource */
0035 enum SRCMODE {
0036     MEMRD,      /* Read data from host memory */
0037     MEMWR,      /* Write data to host memory */
0038     ARCRW,      /* Read from and write to audio ring channel */
0039     NUM_SRCMODES
0040 };
0041 
0042 struct src_rsc_ops;
0043 
0044 struct src {
0045     struct rsc rsc; /* Basic resource info */
0046     struct src *intlv; /* Pointer to next interleaved SRC in a series */
0047     const struct src_rsc_ops *ops; /* SRC specific operations */
0048     /* Number of contiguous srcs for interleaved usage */
0049     unsigned char multi;
0050     unsigned char mode; /* Working mode of this SRC resource */
0051 };
0052 
0053 struct src_rsc_ops {
0054     int (*set_state)(struct src *src, unsigned int state);
0055     int (*set_bm)(struct src *src, unsigned int bm);
0056     int (*set_sf)(struct src *src, unsigned int sf);
0057     int (*set_pm)(struct src *src, unsigned int pm);
0058     int (*set_rom)(struct src *src, unsigned int rom);
0059     int (*set_vo)(struct src *src, unsigned int vo);
0060     int (*set_st)(struct src *src, unsigned int st);
0061     int (*set_bp)(struct src *src, unsigned int bp);
0062     int (*set_cisz)(struct src *src, unsigned int cisz);
0063     int (*set_ca)(struct src *src, unsigned int ca);
0064     int (*set_sa)(struct src *src, unsigned int sa);
0065     int (*set_la)(struct src *src, unsigned int la);
0066     int (*set_pitch)(struct src *src, unsigned int pitch);
0067     int (*set_clr_zbufs)(struct src *src);
0068     int (*commit_write)(struct src *src);
0069     int (*get_ca)(struct src *src);
0070     int (*init)(struct src *src);
0071     struct src* (*next_interleave)(struct src *src);
0072 };
0073 
0074 /* Define src resource request description info */
0075 struct src_desc {
0076     /* Number of contiguous master srcs for interleaved usage */
0077     unsigned char multi;
0078     unsigned char msr;
0079     unsigned char mode; /* Working mode of the requested srcs */
0080 };
0081 
0082 /* Define src manager object */
0083 struct src_mgr {
0084     struct rsc_mgr mgr; /* Basic resource manager info */
0085     struct snd_card *card;  /* pointer to this card */
0086     spinlock_t mgr_lock;
0087 
0088      /* request src resource */
0089     int (*get_src)(struct src_mgr *mgr,
0090                const struct src_desc *desc, struct src **rsrc);
0091     /* return src resource */
0092     int (*put_src)(struct src_mgr *mgr, struct src *src);
0093     int (*src_enable_s)(struct src_mgr *mgr, struct src *src);
0094     int (*src_enable)(struct src_mgr *mgr, struct src *src);
0095     int (*src_disable)(struct src_mgr *mgr, struct src *src);
0096     int (*commit_write)(struct src_mgr *mgr);
0097 };
0098 
0099 /* Define the descriptor of a SRC Input Mapper resource */
0100 struct srcimp_mgr;
0101 struct srcimp_rsc_ops;
0102 
0103 struct srcimp {
0104     struct rsc rsc;
0105     unsigned char idx[8];
0106     struct imapper *imappers;
0107     unsigned int mapped; /* A bit-map indicating which conj rsc is mapped */
0108     struct srcimp_mgr *mgr;
0109     const struct srcimp_rsc_ops *ops;
0110 };
0111 
0112 struct srcimp_rsc_ops {
0113     int (*map)(struct srcimp *srcimp, struct src *user, struct rsc *input);
0114     int (*unmap)(struct srcimp *srcimp);
0115 };
0116 
0117 /* Define SRCIMP resource request description info */
0118 struct srcimp_desc {
0119     unsigned int msr;
0120 };
0121 
0122 struct srcimp_mgr {
0123     struct rsc_mgr mgr; /* Basic resource manager info */
0124     struct snd_card *card;  /* pointer to this card */
0125     spinlock_t mgr_lock;
0126     spinlock_t imap_lock;
0127     struct list_head imappers;
0128     struct imapper *init_imap;
0129     unsigned int init_imap_added;
0130 
0131      /* request srcimp resource */
0132     int (*get_srcimp)(struct srcimp_mgr *mgr,
0133               const struct srcimp_desc *desc,
0134               struct srcimp **rsrcimp);
0135     /* return srcimp resource */
0136     int (*put_srcimp)(struct srcimp_mgr *mgr, struct srcimp *srcimp);
0137     int (*imap_add)(struct srcimp_mgr *mgr, struct imapper *entry);
0138     int (*imap_delete)(struct srcimp_mgr *mgr, struct imapper *entry);
0139 };
0140 
0141 /* Constructor and destructor of SRC resource manager */
0142 int src_mgr_create(struct hw *hw, struct src_mgr **rsrc_mgr);
0143 int src_mgr_destroy(struct src_mgr *src_mgr);
0144 /* Constructor and destructor of SRCIMP resource manager */
0145 int srcimp_mgr_create(struct hw *hw, struct srcimp_mgr **rsrc_mgr);
0146 int srcimp_mgr_destroy(struct srcimp_mgr *srcimp_mgr);
0147 
0148 #endif /* CTSRC_H */