mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
3.1 KiB
117 lines
3.1 KiB
/* SPDX-License-Identifier: GPL-2.0 */ |
|
/* |
|
* System Trace Module (STM) infrastructure |
|
* Copyright (c) 2014, Intel Corporation. |
|
* |
|
* STM class implements generic infrastructure for System Trace Module devices |
|
* as defined in MIPI STPv2 specification. |
|
*/ |
|
|
|
#ifndef _STM_STM_H_ |
|
#define _STM_STM_H_ |
|
|
|
#include <linux/configfs.h> |
|
|
|
struct stp_policy; |
|
struct stp_policy_node; |
|
struct stm_protocol_driver; |
|
|
|
int stp_configfs_init(void); |
|
void stp_configfs_exit(void); |
|
|
|
void *stp_policy_node_priv(struct stp_policy_node *pn); |
|
|
|
struct stp_master { |
|
unsigned int nr_free; |
|
unsigned long chan_map[]; |
|
}; |
|
|
|
struct stm_device { |
|
struct device dev; |
|
struct module *owner; |
|
struct stp_policy *policy; |
|
struct mutex policy_mutex; |
|
int major; |
|
unsigned int sw_nmasters; |
|
struct stm_data *data; |
|
struct mutex link_mutex; |
|
spinlock_t link_lock; |
|
struct list_head link_list; |
|
/* framing protocol in use */ |
|
const struct stm_protocol_driver *pdrv; |
|
const struct config_item_type *pdrv_node_type; |
|
/* master allocation */ |
|
spinlock_t mc_lock; |
|
struct stp_master *masters[]; |
|
}; |
|
|
|
#define to_stm_device(_d) \ |
|
container_of((_d), struct stm_device, dev) |
|
|
|
struct stp_policy_node * |
|
stp_policy_node_lookup(struct stm_device *stm, char *s); |
|
void stp_policy_node_put(struct stp_policy_node *policy_node); |
|
void stp_policy_unbind(struct stp_policy *policy); |
|
|
|
void stp_policy_node_get_ranges(struct stp_policy_node *policy_node, |
|
unsigned int *mstart, unsigned int *mend, |
|
unsigned int *cstart, unsigned int *cend); |
|
|
|
const struct config_item_type * |
|
get_policy_node_type(struct configfs_attribute **attrs); |
|
|
|
struct stm_output { |
|
spinlock_t lock; |
|
unsigned int master; |
|
unsigned int channel; |
|
unsigned int nr_chans; |
|
void *pdrv_private; |
|
}; |
|
|
|
struct stm_file { |
|
struct stm_device *stm; |
|
struct stm_output output; |
|
}; |
|
|
|
struct stm_device *stm_find_device(const char *name); |
|
void stm_put_device(struct stm_device *stm); |
|
|
|
struct stm_source_device { |
|
struct device dev; |
|
struct stm_source_data *data; |
|
spinlock_t link_lock; |
|
struct stm_device __rcu *link; |
|
struct list_head link_entry; |
|
/* one output per stm_source device */ |
|
struct stm_output output; |
|
}; |
|
|
|
#define to_stm_source_device(_d) \ |
|
container_of((_d), struct stm_source_device, dev) |
|
|
|
void *to_pdrv_policy_node(struct config_item *item); |
|
|
|
struct stm_protocol_driver { |
|
struct module *owner; |
|
const char *name; |
|
ssize_t (*write)(struct stm_data *data, |
|
struct stm_output *output, unsigned int chan, |
|
const char *buf, size_t count); |
|
void (*policy_node_init)(void *arg); |
|
int (*output_open)(void *priv, struct stm_output *output); |
|
void (*output_close)(struct stm_output *output); |
|
ssize_t priv_sz; |
|
struct configfs_attribute **policy_attr; |
|
}; |
|
|
|
int stm_register_protocol(const struct stm_protocol_driver *pdrv); |
|
void stm_unregister_protocol(const struct stm_protocol_driver *pdrv); |
|
int stm_lookup_protocol(const char *name, |
|
const struct stm_protocol_driver **pdrv, |
|
const struct config_item_type **type); |
|
void stm_put_protocol(const struct stm_protocol_driver *pdrv); |
|
ssize_t stm_data_write(struct stm_data *data, unsigned int m, |
|
unsigned int c, bool ts_first, const void *buf, |
|
size_t count); |
|
|
|
#endif /* _STM_STM_H_ */
|
|
|