1*7bd1d409SAlexander Shishkin /* 2*7bd1d409SAlexander Shishkin * System Trace Module (STM) infrastructure 3*7bd1d409SAlexander Shishkin * Copyright (c) 2014, Intel Corporation. 4*7bd1d409SAlexander Shishkin * 5*7bd1d409SAlexander Shishkin * This program is free software; you can redistribute it and/or modify it 6*7bd1d409SAlexander Shishkin * under the terms and conditions of the GNU General Public License, 7*7bd1d409SAlexander Shishkin * version 2, as published by the Free Software Foundation. 8*7bd1d409SAlexander Shishkin * 9*7bd1d409SAlexander Shishkin * This program is distributed in the hope it will be useful, but WITHOUT 10*7bd1d409SAlexander Shishkin * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11*7bd1d409SAlexander Shishkin * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12*7bd1d409SAlexander Shishkin * more details. 13*7bd1d409SAlexander Shishkin * 14*7bd1d409SAlexander Shishkin * STM class implements generic infrastructure for System Trace Module devices 15*7bd1d409SAlexander Shishkin * as defined in MIPI STPv2 specification. 16*7bd1d409SAlexander Shishkin */ 17*7bd1d409SAlexander Shishkin 18*7bd1d409SAlexander Shishkin #ifndef _STM_STM_H_ 19*7bd1d409SAlexander Shishkin #define _STM_STM_H_ 20*7bd1d409SAlexander Shishkin 21*7bd1d409SAlexander Shishkin struct stp_policy; 22*7bd1d409SAlexander Shishkin struct stp_policy_node; 23*7bd1d409SAlexander Shishkin 24*7bd1d409SAlexander Shishkin struct stp_policy_node * 25*7bd1d409SAlexander Shishkin stp_policy_node_lookup(struct stm_device *stm, char *s); 26*7bd1d409SAlexander Shishkin void stp_policy_node_put(struct stp_policy_node *policy_node); 27*7bd1d409SAlexander Shishkin void stp_policy_unbind(struct stp_policy *policy); 28*7bd1d409SAlexander Shishkin 29*7bd1d409SAlexander Shishkin void stp_policy_node_get_ranges(struct stp_policy_node *policy_node, 30*7bd1d409SAlexander Shishkin unsigned int *mstart, unsigned int *mend, 31*7bd1d409SAlexander Shishkin unsigned int *cstart, unsigned int *cend); 32*7bd1d409SAlexander Shishkin int stp_configfs_init(void); 33*7bd1d409SAlexander Shishkin void stp_configfs_exit(void); 34*7bd1d409SAlexander Shishkin 35*7bd1d409SAlexander Shishkin struct stp_master { 36*7bd1d409SAlexander Shishkin unsigned int nr_free; 37*7bd1d409SAlexander Shishkin unsigned long chan_map[0]; 38*7bd1d409SAlexander Shishkin }; 39*7bd1d409SAlexander Shishkin 40*7bd1d409SAlexander Shishkin struct stm_device { 41*7bd1d409SAlexander Shishkin struct device dev; 42*7bd1d409SAlexander Shishkin struct module *owner; 43*7bd1d409SAlexander Shishkin struct stp_policy *policy; 44*7bd1d409SAlexander Shishkin struct mutex policy_mutex; 45*7bd1d409SAlexander Shishkin int major; 46*7bd1d409SAlexander Shishkin unsigned int sw_nmasters; 47*7bd1d409SAlexander Shishkin struct stm_data *data; 48*7bd1d409SAlexander Shishkin spinlock_t link_lock; 49*7bd1d409SAlexander Shishkin struct list_head link_list; 50*7bd1d409SAlexander Shishkin /* master allocation */ 51*7bd1d409SAlexander Shishkin spinlock_t mc_lock; 52*7bd1d409SAlexander Shishkin struct stp_master *masters[0]; 53*7bd1d409SAlexander Shishkin }; 54*7bd1d409SAlexander Shishkin 55*7bd1d409SAlexander Shishkin #define to_stm_device(_d) \ 56*7bd1d409SAlexander Shishkin container_of((_d), struct stm_device, dev) 57*7bd1d409SAlexander Shishkin 58*7bd1d409SAlexander Shishkin struct stm_output { 59*7bd1d409SAlexander Shishkin unsigned int master; 60*7bd1d409SAlexander Shishkin unsigned int channel; 61*7bd1d409SAlexander Shishkin unsigned int nr_chans; 62*7bd1d409SAlexander Shishkin }; 63*7bd1d409SAlexander Shishkin 64*7bd1d409SAlexander Shishkin struct stm_file { 65*7bd1d409SAlexander Shishkin struct stm_device *stm; 66*7bd1d409SAlexander Shishkin struct stp_policy_node *policy_node; 67*7bd1d409SAlexander Shishkin struct stm_output output; 68*7bd1d409SAlexander Shishkin }; 69*7bd1d409SAlexander Shishkin 70*7bd1d409SAlexander Shishkin struct stm_device *stm_find_device(const char *name); 71*7bd1d409SAlexander Shishkin void stm_put_device(struct stm_device *stm); 72*7bd1d409SAlexander Shishkin 73*7bd1d409SAlexander Shishkin struct stm_source_device { 74*7bd1d409SAlexander Shishkin struct device dev; 75*7bd1d409SAlexander Shishkin struct stm_source_data *data; 76*7bd1d409SAlexander Shishkin spinlock_t link_lock; 77*7bd1d409SAlexander Shishkin struct stm_device *link; 78*7bd1d409SAlexander Shishkin struct list_head link_entry; 79*7bd1d409SAlexander Shishkin /* one output per stm_source device */ 80*7bd1d409SAlexander Shishkin struct stp_policy_node *policy_node; 81*7bd1d409SAlexander Shishkin struct stm_output output; 82*7bd1d409SAlexander Shishkin }; 83*7bd1d409SAlexander Shishkin 84*7bd1d409SAlexander Shishkin #define to_stm_source_device(_d) \ 85*7bd1d409SAlexander Shishkin container_of((_d), struct stm_source_device, dev) 86*7bd1d409SAlexander Shishkin 87*7bd1d409SAlexander Shishkin #endif /* _STM_STM_H_ */ 88