1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /** 3*4882a593Smuzhiyun * Copyright (C) 2008, Creative Technology Ltd. All Rights Reserved. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * @File ctdaio.h 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * @Brief 8*4882a593Smuzhiyun * This file contains the definition of Digital Audio Input Output 9*4882a593Smuzhiyun * resource management object. 10*4882a593Smuzhiyun * 11*4882a593Smuzhiyun * @Author Liu Chun 12*4882a593Smuzhiyun * @Date May 23 2008 13*4882a593Smuzhiyun */ 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #ifndef CTDAIO_H 16*4882a593Smuzhiyun #define CTDAIO_H 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #include "ctresource.h" 19*4882a593Smuzhiyun #include "ctimap.h" 20*4882a593Smuzhiyun #include <linux/spinlock.h> 21*4882a593Smuzhiyun #include <linux/list.h> 22*4882a593Smuzhiyun #include <sound/core.h> 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun /* Define the descriptor of a daio resource */ 25*4882a593Smuzhiyun enum DAIOTYP { 26*4882a593Smuzhiyun LINEO1, 27*4882a593Smuzhiyun LINEO2, 28*4882a593Smuzhiyun LINEO3, 29*4882a593Smuzhiyun LINEO4, 30*4882a593Smuzhiyun SPDIFOO, /* S/PDIF Out (Flexijack/Optical) */ 31*4882a593Smuzhiyun LINEIM, 32*4882a593Smuzhiyun SPDIFIO, /* S/PDIF In (Flexijack/Optical) on the card */ 33*4882a593Smuzhiyun MIC, /* Dedicated mic on Titanium HD */ 34*4882a593Smuzhiyun SPDIFI1, /* S/PDIF In on internal Drive Bay */ 35*4882a593Smuzhiyun NUM_DAIOTYP 36*4882a593Smuzhiyun }; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun struct dao_rsc_ops; 39*4882a593Smuzhiyun struct dai_rsc_ops; 40*4882a593Smuzhiyun struct daio_mgr; 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun struct daio { 43*4882a593Smuzhiyun struct rsc rscl; /* Basic resource info for left TX/RX */ 44*4882a593Smuzhiyun struct rsc rscr; /* Basic resource info for right TX/RX */ 45*4882a593Smuzhiyun enum DAIOTYP type; 46*4882a593Smuzhiyun }; 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun struct dao { 49*4882a593Smuzhiyun struct daio daio; 50*4882a593Smuzhiyun const struct dao_rsc_ops *ops; /* DAO specific operations */ 51*4882a593Smuzhiyun struct imapper **imappers; 52*4882a593Smuzhiyun struct daio_mgr *mgr; 53*4882a593Smuzhiyun struct hw *hw; 54*4882a593Smuzhiyun void *ctrl_blk; 55*4882a593Smuzhiyun }; 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun struct dai { 58*4882a593Smuzhiyun struct daio daio; 59*4882a593Smuzhiyun const struct dai_rsc_ops *ops; /* DAI specific operations */ 60*4882a593Smuzhiyun struct hw *hw; 61*4882a593Smuzhiyun void *ctrl_blk; 62*4882a593Smuzhiyun }; 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun struct dao_desc { 65*4882a593Smuzhiyun unsigned int msr:4; 66*4882a593Smuzhiyun unsigned int passthru:1; 67*4882a593Smuzhiyun }; 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun struct dao_rsc_ops { 70*4882a593Smuzhiyun int (*set_spos)(struct dao *dao, unsigned int spos); 71*4882a593Smuzhiyun int (*commit_write)(struct dao *dao); 72*4882a593Smuzhiyun int (*get_spos)(struct dao *dao, unsigned int *spos); 73*4882a593Smuzhiyun int (*reinit)(struct dao *dao, const struct dao_desc *desc); 74*4882a593Smuzhiyun int (*set_left_input)(struct dao *dao, struct rsc *input); 75*4882a593Smuzhiyun int (*set_right_input)(struct dao *dao, struct rsc *input); 76*4882a593Smuzhiyun int (*clear_left_input)(struct dao *dao); 77*4882a593Smuzhiyun int (*clear_right_input)(struct dao *dao); 78*4882a593Smuzhiyun }; 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun struct dai_rsc_ops { 81*4882a593Smuzhiyun int (*set_srt_srcl)(struct dai *dai, struct rsc *src); 82*4882a593Smuzhiyun int (*set_srt_srcr)(struct dai *dai, struct rsc *src); 83*4882a593Smuzhiyun int (*set_srt_msr)(struct dai *dai, unsigned int msr); 84*4882a593Smuzhiyun int (*set_enb_src)(struct dai *dai, unsigned int enb); 85*4882a593Smuzhiyun int (*set_enb_srt)(struct dai *dai, unsigned int enb); 86*4882a593Smuzhiyun int (*commit_write)(struct dai *dai); 87*4882a593Smuzhiyun }; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun /* Define daio resource request description info */ 90*4882a593Smuzhiyun struct daio_desc { 91*4882a593Smuzhiyun unsigned int type:4; 92*4882a593Smuzhiyun unsigned int msr:4; 93*4882a593Smuzhiyun unsigned int passthru:1; 94*4882a593Smuzhiyun }; 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun struct daio_mgr { 97*4882a593Smuzhiyun struct rsc_mgr mgr; /* Basic resource manager info */ 98*4882a593Smuzhiyun struct snd_card *card; /* pointer to this card */ 99*4882a593Smuzhiyun spinlock_t mgr_lock; 100*4882a593Smuzhiyun spinlock_t imap_lock; 101*4882a593Smuzhiyun struct list_head imappers; 102*4882a593Smuzhiyun struct imapper *init_imap; 103*4882a593Smuzhiyun unsigned int init_imap_added; 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun /* request one daio resource */ 106*4882a593Smuzhiyun int (*get_daio)(struct daio_mgr *mgr, 107*4882a593Smuzhiyun const struct daio_desc *desc, struct daio **rdaio); 108*4882a593Smuzhiyun /* return one daio resource */ 109*4882a593Smuzhiyun int (*put_daio)(struct daio_mgr *mgr, struct daio *daio); 110*4882a593Smuzhiyun int (*daio_enable)(struct daio_mgr *mgr, struct daio *daio); 111*4882a593Smuzhiyun int (*daio_disable)(struct daio_mgr *mgr, struct daio *daio); 112*4882a593Smuzhiyun int (*imap_add)(struct daio_mgr *mgr, struct imapper *entry); 113*4882a593Smuzhiyun int (*imap_delete)(struct daio_mgr *mgr, struct imapper *entry); 114*4882a593Smuzhiyun int (*commit_write)(struct daio_mgr *mgr); 115*4882a593Smuzhiyun }; 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun /* Constructor and destructor of daio resource manager */ 118*4882a593Smuzhiyun int daio_mgr_create(struct hw *hw, struct daio_mgr **rdaio_mgr); 119*4882a593Smuzhiyun int daio_mgr_destroy(struct daio_mgr *daio_mgr); 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun #endif /* CTDAIO_H */ 122