1*9ea393d8SAlexander Shishkin /* SPDX-License-Identifier: GPL-2.0 */ 27bd1d409SAlexander Shishkin /* 37bd1d409SAlexander Shishkin * System Trace Module (STM) infrastructure 47bd1d409SAlexander Shishkin * Copyright (c) 2014, Intel Corporation. 57bd1d409SAlexander Shishkin * 67bd1d409SAlexander Shishkin * STM class implements generic infrastructure for System Trace Module devices 77bd1d409SAlexander Shishkin * as defined in MIPI STPv2 specification. 87bd1d409SAlexander Shishkin */ 97bd1d409SAlexander Shishkin 107bd1d409SAlexander Shishkin #ifndef _STM_STM_H_ 117bd1d409SAlexander Shishkin #define _STM_STM_H_ 127bd1d409SAlexander Shishkin 137bd1d409SAlexander Shishkin struct stp_policy; 147bd1d409SAlexander Shishkin struct stp_policy_node; 157bd1d409SAlexander Shishkin 167bd1d409SAlexander Shishkin struct stp_policy_node * 177bd1d409SAlexander Shishkin stp_policy_node_lookup(struct stm_device *stm, char *s); 187bd1d409SAlexander Shishkin void stp_policy_node_put(struct stp_policy_node *policy_node); 197bd1d409SAlexander Shishkin void stp_policy_unbind(struct stp_policy *policy); 207bd1d409SAlexander Shishkin 217bd1d409SAlexander Shishkin void stp_policy_node_get_ranges(struct stp_policy_node *policy_node, 227bd1d409SAlexander Shishkin unsigned int *mstart, unsigned int *mend, 237bd1d409SAlexander Shishkin unsigned int *cstart, unsigned int *cend); 247bd1d409SAlexander Shishkin int stp_configfs_init(void); 257bd1d409SAlexander Shishkin void stp_configfs_exit(void); 267bd1d409SAlexander Shishkin 277bd1d409SAlexander Shishkin struct stp_master { 287bd1d409SAlexander Shishkin unsigned int nr_free; 297bd1d409SAlexander Shishkin unsigned long chan_map[0]; 307bd1d409SAlexander Shishkin }; 317bd1d409SAlexander Shishkin 327bd1d409SAlexander Shishkin struct stm_device { 337bd1d409SAlexander Shishkin struct device dev; 347bd1d409SAlexander Shishkin struct module *owner; 357bd1d409SAlexander Shishkin struct stp_policy *policy; 367bd1d409SAlexander Shishkin struct mutex policy_mutex; 377bd1d409SAlexander Shishkin int major; 387bd1d409SAlexander Shishkin unsigned int sw_nmasters; 397bd1d409SAlexander Shishkin struct stm_data *data; 40c74f7e82SAlexander Shishkin struct mutex link_mutex; 417bd1d409SAlexander Shishkin spinlock_t link_lock; 427bd1d409SAlexander Shishkin struct list_head link_list; 437bd1d409SAlexander Shishkin /* master allocation */ 447bd1d409SAlexander Shishkin spinlock_t mc_lock; 457bd1d409SAlexander Shishkin struct stp_master *masters[0]; 467bd1d409SAlexander Shishkin }; 477bd1d409SAlexander Shishkin 487bd1d409SAlexander Shishkin #define to_stm_device(_d) \ 497bd1d409SAlexander Shishkin container_of((_d), struct stm_device, dev) 507bd1d409SAlexander Shishkin 517bd1d409SAlexander Shishkin struct stm_output { 52cde4ad83SAlexander Shishkin spinlock_t lock; 537bd1d409SAlexander Shishkin unsigned int master; 547bd1d409SAlexander Shishkin unsigned int channel; 557bd1d409SAlexander Shishkin unsigned int nr_chans; 567bd1d409SAlexander Shishkin }; 577bd1d409SAlexander Shishkin 587bd1d409SAlexander Shishkin struct stm_file { 597bd1d409SAlexander Shishkin struct stm_device *stm; 607bd1d409SAlexander Shishkin struct stp_policy_node *policy_node; 617bd1d409SAlexander Shishkin struct stm_output output; 627bd1d409SAlexander Shishkin }; 637bd1d409SAlexander Shishkin 647bd1d409SAlexander Shishkin struct stm_device *stm_find_device(const char *name); 657bd1d409SAlexander Shishkin void stm_put_device(struct stm_device *stm); 667bd1d409SAlexander Shishkin 677bd1d409SAlexander Shishkin struct stm_source_device { 687bd1d409SAlexander Shishkin struct device dev; 697bd1d409SAlexander Shishkin struct stm_source_data *data; 707bd1d409SAlexander Shishkin spinlock_t link_lock; 710df771deSAlexander Shishkin struct stm_device __rcu *link; 727bd1d409SAlexander Shishkin struct list_head link_entry; 737bd1d409SAlexander Shishkin /* one output per stm_source device */ 747bd1d409SAlexander Shishkin struct stp_policy_node *policy_node; 757bd1d409SAlexander Shishkin struct stm_output output; 767bd1d409SAlexander Shishkin }; 777bd1d409SAlexander Shishkin 787bd1d409SAlexander Shishkin #define to_stm_source_device(_d) \ 797bd1d409SAlexander Shishkin container_of((_d), struct stm_source_device, dev) 807bd1d409SAlexander Shishkin 817bd1d409SAlexander Shishkin #endif /* _STM_STM_H_ */ 82