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 ctresource.h 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * @Brief 8*4882a593Smuzhiyun * This file contains the definition of generic hardware resources for 9*4882a593Smuzhiyun * resource management. 10*4882a593Smuzhiyun * 11*4882a593Smuzhiyun * @Author Liu Chun 12*4882a593Smuzhiyun * @Date May 13 2008 13*4882a593Smuzhiyun */ 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #ifndef CTRESOURCE_H 16*4882a593Smuzhiyun #define CTRESOURCE_H 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #include <linux/types.h> 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun enum RSCTYP { 21*4882a593Smuzhiyun SRC, 22*4882a593Smuzhiyun SRCIMP, 23*4882a593Smuzhiyun AMIXER, 24*4882a593Smuzhiyun SUM, 25*4882a593Smuzhiyun DAIO, 26*4882a593Smuzhiyun NUM_RSCTYP /* This must be the last one and less than 16 */ 27*4882a593Smuzhiyun }; 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun struct rsc_ops; 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun struct rsc { 32*4882a593Smuzhiyun u32 idx:12; /* The index of a resource */ 33*4882a593Smuzhiyun u32 type:4; /* The type (RSCTYP) of a resource */ 34*4882a593Smuzhiyun u32 conj:12; /* Current conjugate index */ 35*4882a593Smuzhiyun u32 msr:4; /* The Master Sample Rate a resource working on */ 36*4882a593Smuzhiyun void *ctrl_blk; /* Chip specific control info block for a resource */ 37*4882a593Smuzhiyun struct hw *hw; /* Chip specific object for hardware access means */ 38*4882a593Smuzhiyun const struct rsc_ops *ops; /* Generic resource operations */ 39*4882a593Smuzhiyun }; 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun struct rsc_ops { 42*4882a593Smuzhiyun void (*master)(struct rsc *rsc); /* Move to master resource */ 43*4882a593Smuzhiyun void (*next_conj)(struct rsc *rsc); /* Move to next conjugate resource */ 44*4882a593Smuzhiyun int (*index)(const struct rsc *rsc); /* Return the index of resource */ 45*4882a593Smuzhiyun /* Return the output slot number */ 46*4882a593Smuzhiyun int (*output_slot)(const struct rsc *rsc); 47*4882a593Smuzhiyun }; 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun int 50*4882a593Smuzhiyun rsc_init(struct rsc *rsc, u32 idx, enum RSCTYP type, u32 msr, struct hw *hw); 51*4882a593Smuzhiyun int rsc_uninit(struct rsc *rsc); 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun struct rsc_mgr { 54*4882a593Smuzhiyun enum RSCTYP type; /* The type (RSCTYP) of resource to manage */ 55*4882a593Smuzhiyun unsigned int amount; /* The total amount of a kind of resource */ 56*4882a593Smuzhiyun unsigned int avail; /* The amount of currently available resources */ 57*4882a593Smuzhiyun unsigned char *rscs; /* The bit-map for resource allocation */ 58*4882a593Smuzhiyun void *ctrl_blk; /* Chip specific control info block */ 59*4882a593Smuzhiyun struct hw *hw; /* Chip specific object for hardware access */ 60*4882a593Smuzhiyun }; 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun /* Resource management is based on bit-map mechanism */ 63*4882a593Smuzhiyun int rsc_mgr_init(struct rsc_mgr *mgr, enum RSCTYP type, 64*4882a593Smuzhiyun unsigned int amount, struct hw *hw); 65*4882a593Smuzhiyun int rsc_mgr_uninit(struct rsc_mgr *mgr); 66*4882a593Smuzhiyun int mgr_get_resource(struct rsc_mgr *mgr, unsigned int n, unsigned int *ridx); 67*4882a593Smuzhiyun int mgr_put_resource(struct rsc_mgr *mgr, unsigned int n, unsigned int idx); 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun #endif /* CTRESOURCE_H */ 70