1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef SOUND_FIREWIRE_CMP_H_INCLUDED 3*4882a593Smuzhiyun #define SOUND_FIREWIRE_CMP_H_INCLUDED 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <linux/mutex.h> 6*4882a593Smuzhiyun #include <linux/types.h> 7*4882a593Smuzhiyun #include "iso-resources.h" 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun struct fw_unit; 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun enum cmp_direction { 12*4882a593Smuzhiyun CMP_INPUT = 0, 13*4882a593Smuzhiyun CMP_OUTPUT, 14*4882a593Smuzhiyun }; 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun /** 17*4882a593Smuzhiyun * struct cmp_connection - manages an isochronous connection to a device 18*4882a593Smuzhiyun * @speed: the connection's actual speed 19*4882a593Smuzhiyun * 20*4882a593Smuzhiyun * This structure manages (using CMP) an isochronous stream between the local 21*4882a593Smuzhiyun * computer and a device's input plug (iPCR) and output plug (oPCR). 22*4882a593Smuzhiyun * 23*4882a593Smuzhiyun * There is no corresponding oPCR created on the local computer, so it is not 24*4882a593Smuzhiyun * possible to overlay connections on top of this one. 25*4882a593Smuzhiyun */ 26*4882a593Smuzhiyun struct cmp_connection { 27*4882a593Smuzhiyun int speed; 28*4882a593Smuzhiyun /* private: */ 29*4882a593Smuzhiyun bool connected; 30*4882a593Smuzhiyun struct mutex mutex; 31*4882a593Smuzhiyun struct fw_iso_resources resources; 32*4882a593Smuzhiyun __be32 last_pcr_value; 33*4882a593Smuzhiyun unsigned int pcr_index; 34*4882a593Smuzhiyun unsigned int max_speed; 35*4882a593Smuzhiyun enum cmp_direction direction; 36*4882a593Smuzhiyun }; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun int cmp_connection_init(struct cmp_connection *connection, 39*4882a593Smuzhiyun struct fw_unit *unit, 40*4882a593Smuzhiyun enum cmp_direction direction, 41*4882a593Smuzhiyun unsigned int pcr_index); 42*4882a593Smuzhiyun int cmp_connection_check_used(struct cmp_connection *connection, bool *used); 43*4882a593Smuzhiyun void cmp_connection_destroy(struct cmp_connection *connection); 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun int cmp_connection_reserve(struct cmp_connection *connection, 46*4882a593Smuzhiyun unsigned int max_payload); 47*4882a593Smuzhiyun void cmp_connection_release(struct cmp_connection *connection); 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun int cmp_connection_establish(struct cmp_connection *connection); 50*4882a593Smuzhiyun int cmp_connection_update(struct cmp_connection *connection); 51*4882a593Smuzhiyun void cmp_connection_break(struct cmp_connection *connection); 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun #endif 54