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 ctamixer.h 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * @Brief 862306a36Sopenharmony_ci * This file contains the definition of the Audio Mixer 962306a36Sopenharmony_ci * resource management object. 1062306a36Sopenharmony_ci * 1162306a36Sopenharmony_ci * @Author Liu Chun 1262306a36Sopenharmony_ci * @Date May 21 2008 1362306a36Sopenharmony_ci */ 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#ifndef CTAMIXER_H 1662306a36Sopenharmony_ci#define CTAMIXER_H 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#include "ctresource.h" 1962306a36Sopenharmony_ci#include <linux/spinlock.h> 2062306a36Sopenharmony_ci#include <sound/core.h> 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci/* Define the descriptor of a summation node resource */ 2362306a36Sopenharmony_cistruct sum { 2462306a36Sopenharmony_ci struct rsc rsc; /* Basic resource info */ 2562306a36Sopenharmony_ci unsigned char idx[8]; 2662306a36Sopenharmony_ci}; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci/* Define sum resource request description info */ 2962306a36Sopenharmony_cistruct sum_desc { 3062306a36Sopenharmony_ci unsigned int msr; 3162306a36Sopenharmony_ci}; 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_cistruct sum_mgr { 3462306a36Sopenharmony_ci struct rsc_mgr mgr; /* Basic resource manager info */ 3562306a36Sopenharmony_ci struct snd_card *card; /* pointer to this card */ 3662306a36Sopenharmony_ci spinlock_t mgr_lock; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci /* request one sum resource */ 3962306a36Sopenharmony_ci int (*get_sum)(struct sum_mgr *mgr, 4062306a36Sopenharmony_ci const struct sum_desc *desc, struct sum **rsum); 4162306a36Sopenharmony_ci /* return one sum resource */ 4262306a36Sopenharmony_ci int (*put_sum)(struct sum_mgr *mgr, struct sum *sum); 4362306a36Sopenharmony_ci}; 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci/* Constructor and destructor of daio resource manager */ 4662306a36Sopenharmony_ciint sum_mgr_create(struct hw *hw, struct sum_mgr **rsum_mgr); 4762306a36Sopenharmony_ciint sum_mgr_destroy(struct sum_mgr *sum_mgr); 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci/* Define the descriptor of a amixer resource */ 5062306a36Sopenharmony_cistruct amixer_rsc_ops; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cistruct amixer { 5362306a36Sopenharmony_ci struct rsc rsc; /* Basic resource info */ 5462306a36Sopenharmony_ci unsigned char idx[8]; 5562306a36Sopenharmony_ci struct rsc *input; /* pointer to a resource acting as source */ 5662306a36Sopenharmony_ci struct sum *sum; /* Put amixer output to this summation node */ 5762306a36Sopenharmony_ci const struct amixer_rsc_ops *ops; /* AMixer specific operations */ 5862306a36Sopenharmony_ci}; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_cistruct amixer_rsc_ops { 6162306a36Sopenharmony_ci int (*set_input)(struct amixer *amixer, struct rsc *rsc); 6262306a36Sopenharmony_ci int (*set_scale)(struct amixer *amixer, unsigned int scale); 6362306a36Sopenharmony_ci int (*set_invalid_squash)(struct amixer *amixer, unsigned int iv); 6462306a36Sopenharmony_ci int (*set_sum)(struct amixer *amixer, struct sum *sum); 6562306a36Sopenharmony_ci int (*commit_write)(struct amixer *amixer); 6662306a36Sopenharmony_ci /* Only for interleaved recording */ 6762306a36Sopenharmony_ci int (*commit_raw_write)(struct amixer *amixer); 6862306a36Sopenharmony_ci int (*setup)(struct amixer *amixer, struct rsc *input, 6962306a36Sopenharmony_ci unsigned int scale, struct sum *sum); 7062306a36Sopenharmony_ci int (*get_scale)(struct amixer *amixer); 7162306a36Sopenharmony_ci}; 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci/* Define amixer resource request description info */ 7462306a36Sopenharmony_cistruct amixer_desc { 7562306a36Sopenharmony_ci unsigned int msr; 7662306a36Sopenharmony_ci}; 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_cistruct amixer_mgr { 7962306a36Sopenharmony_ci struct rsc_mgr mgr; /* Basic resource manager info */ 8062306a36Sopenharmony_ci struct snd_card *card; /* pointer to this card */ 8162306a36Sopenharmony_ci spinlock_t mgr_lock; 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci /* request one amixer resource */ 8462306a36Sopenharmony_ci int (*get_amixer)(struct amixer_mgr *mgr, 8562306a36Sopenharmony_ci const struct amixer_desc *desc, 8662306a36Sopenharmony_ci struct amixer **ramixer); 8762306a36Sopenharmony_ci /* return one amixer resource */ 8862306a36Sopenharmony_ci int (*put_amixer)(struct amixer_mgr *mgr, struct amixer *amixer); 8962306a36Sopenharmony_ci}; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci/* Constructor and destructor of amixer resource manager */ 9262306a36Sopenharmony_ciint amixer_mgr_create(struct hw *hw, struct amixer_mgr **ramixer_mgr); 9362306a36Sopenharmony_ciint amixer_mgr_destroy(struct amixer_mgr *amixer_mgr); 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci#endif /* CTAMIXER_H */ 96