162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2008, Creative Technology Ltd. All Rights Reserved. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * @File ctdaio.h 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * @Brief 862306a36Sopenharmony_ci * This file contains the definition of Digital Audio Input Output 962306a36Sopenharmony_ci * resource management object. 1062306a36Sopenharmony_ci * 1162306a36Sopenharmony_ci * @Author Liu Chun 1262306a36Sopenharmony_ci * @Date May 23 2008 1362306a36Sopenharmony_ci */ 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#ifndef CTDAIO_H 1662306a36Sopenharmony_ci#define CTDAIO_H 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#include "ctresource.h" 1962306a36Sopenharmony_ci#include "ctimap.h" 2062306a36Sopenharmony_ci#include <linux/spinlock.h> 2162306a36Sopenharmony_ci#include <linux/list.h> 2262306a36Sopenharmony_ci#include <sound/core.h> 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci/* Define the descriptor of a daio resource */ 2562306a36Sopenharmony_cienum DAIOTYP { 2662306a36Sopenharmony_ci LINEO1, 2762306a36Sopenharmony_ci LINEO2, 2862306a36Sopenharmony_ci LINEO3, 2962306a36Sopenharmony_ci LINEO4, 3062306a36Sopenharmony_ci SPDIFOO, /* S/PDIF Out (Flexijack/Optical) */ 3162306a36Sopenharmony_ci LINEIM, 3262306a36Sopenharmony_ci SPDIFIO, /* S/PDIF In (Flexijack/Optical) on the card */ 3362306a36Sopenharmony_ci MIC, /* Dedicated mic on Titanium HD */ 3462306a36Sopenharmony_ci SPDIFI1, /* S/PDIF In on internal Drive Bay */ 3562306a36Sopenharmony_ci NUM_DAIOTYP 3662306a36Sopenharmony_ci}; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cistruct dao_rsc_ops; 3962306a36Sopenharmony_cistruct dai_rsc_ops; 4062306a36Sopenharmony_cistruct daio_mgr; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_cistruct daio { 4362306a36Sopenharmony_ci struct rsc rscl; /* Basic resource info for left TX/RX */ 4462306a36Sopenharmony_ci struct rsc rscr; /* Basic resource info for right TX/RX */ 4562306a36Sopenharmony_ci enum DAIOTYP type; 4662306a36Sopenharmony_ci}; 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_cistruct dao { 4962306a36Sopenharmony_ci struct daio daio; 5062306a36Sopenharmony_ci const struct dao_rsc_ops *ops; /* DAO specific operations */ 5162306a36Sopenharmony_ci struct imapper **imappers; 5262306a36Sopenharmony_ci struct daio_mgr *mgr; 5362306a36Sopenharmony_ci struct hw *hw; 5462306a36Sopenharmony_ci void *ctrl_blk; 5562306a36Sopenharmony_ci}; 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_cistruct dai { 5862306a36Sopenharmony_ci struct daio daio; 5962306a36Sopenharmony_ci const struct dai_rsc_ops *ops; /* DAI specific operations */ 6062306a36Sopenharmony_ci struct hw *hw; 6162306a36Sopenharmony_ci void *ctrl_blk; 6262306a36Sopenharmony_ci}; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_cistruct dao_desc { 6562306a36Sopenharmony_ci unsigned int msr:4; 6662306a36Sopenharmony_ci unsigned int passthru:1; 6762306a36Sopenharmony_ci}; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_cistruct dao_rsc_ops { 7062306a36Sopenharmony_ci int (*set_spos)(struct dao *dao, unsigned int spos); 7162306a36Sopenharmony_ci int (*commit_write)(struct dao *dao); 7262306a36Sopenharmony_ci int (*get_spos)(struct dao *dao, unsigned int *spos); 7362306a36Sopenharmony_ci int (*reinit)(struct dao *dao, const struct dao_desc *desc); 7462306a36Sopenharmony_ci int (*set_left_input)(struct dao *dao, struct rsc *input); 7562306a36Sopenharmony_ci int (*set_right_input)(struct dao *dao, struct rsc *input); 7662306a36Sopenharmony_ci int (*clear_left_input)(struct dao *dao); 7762306a36Sopenharmony_ci int (*clear_right_input)(struct dao *dao); 7862306a36Sopenharmony_ci}; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_cistruct dai_rsc_ops { 8162306a36Sopenharmony_ci int (*set_srt_srcl)(struct dai *dai, struct rsc *src); 8262306a36Sopenharmony_ci int (*set_srt_srcr)(struct dai *dai, struct rsc *src); 8362306a36Sopenharmony_ci int (*set_srt_msr)(struct dai *dai, unsigned int msr); 8462306a36Sopenharmony_ci int (*set_enb_src)(struct dai *dai, unsigned int enb); 8562306a36Sopenharmony_ci int (*set_enb_srt)(struct dai *dai, unsigned int enb); 8662306a36Sopenharmony_ci int (*commit_write)(struct dai *dai); 8762306a36Sopenharmony_ci}; 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci/* Define daio resource request description info */ 9062306a36Sopenharmony_cistruct daio_desc { 9162306a36Sopenharmony_ci unsigned int type:4; 9262306a36Sopenharmony_ci unsigned int msr:4; 9362306a36Sopenharmony_ci unsigned int passthru:1; 9462306a36Sopenharmony_ci}; 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_cistruct daio_mgr { 9762306a36Sopenharmony_ci struct rsc_mgr mgr; /* Basic resource manager info */ 9862306a36Sopenharmony_ci struct snd_card *card; /* pointer to this card */ 9962306a36Sopenharmony_ci spinlock_t mgr_lock; 10062306a36Sopenharmony_ci spinlock_t imap_lock; 10162306a36Sopenharmony_ci struct list_head imappers; 10262306a36Sopenharmony_ci struct imapper *init_imap; 10362306a36Sopenharmony_ci unsigned int init_imap_added; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci /* request one daio resource */ 10662306a36Sopenharmony_ci int (*get_daio)(struct daio_mgr *mgr, 10762306a36Sopenharmony_ci const struct daio_desc *desc, struct daio **rdaio); 10862306a36Sopenharmony_ci /* return one daio resource */ 10962306a36Sopenharmony_ci int (*put_daio)(struct daio_mgr *mgr, struct daio *daio); 11062306a36Sopenharmony_ci int (*daio_enable)(struct daio_mgr *mgr, struct daio *daio); 11162306a36Sopenharmony_ci int (*daio_disable)(struct daio_mgr *mgr, struct daio *daio); 11262306a36Sopenharmony_ci int (*imap_add)(struct daio_mgr *mgr, struct imapper *entry); 11362306a36Sopenharmony_ci int (*imap_delete)(struct daio_mgr *mgr, struct imapper *entry); 11462306a36Sopenharmony_ci int (*commit_write)(struct daio_mgr *mgr); 11562306a36Sopenharmony_ci}; 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci/* Constructor and destructor of daio resource manager */ 11862306a36Sopenharmony_ciint daio_mgr_create(struct hw *hw, struct daio_mgr **rdaio_mgr); 11962306a36Sopenharmony_ciint daio_mgr_destroy(struct daio_mgr *daio_mgr); 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci#endif /* CTDAIO_H */ 122