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