brintos

brintos / linux-shallow public Read only

0
0
Text · 6.2 KiB · fda6b24 Raw
215 lines · c
1/* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */2/* Copyright(c) 2015-17 Intel Corporation. */3 4#ifndef __SDW_BUS_H5#define __SDW_BUS_H6 7#define DEFAULT_BANK_SWITCH_TIMEOUT 30008#define DEFAULT_PROBE_TIMEOUT       20009 10u64 sdw_dmi_override_adr(struct sdw_bus *bus, u64 addr);11 12#if IS_ENABLED(CONFIG_ACPI)13int sdw_acpi_find_slaves(struct sdw_bus *bus);14#else15static inline int sdw_acpi_find_slaves(struct sdw_bus *bus)16{17	return -ENOTSUPP;18}19#endif20 21int sdw_of_find_slaves(struct sdw_bus *bus);22void sdw_extract_slave_id(struct sdw_bus *bus,23			  u64 addr, struct sdw_slave_id *id);24int sdw_slave_add(struct sdw_bus *bus, struct sdw_slave_id *id,25		  struct fwnode_handle *fwnode);26int sdw_master_device_add(struct sdw_bus *bus, struct device *parent,27			  struct fwnode_handle *fwnode);28int sdw_master_device_del(struct sdw_bus *bus);29 30#ifdef CONFIG_DEBUG_FS31void sdw_bus_debugfs_init(struct sdw_bus *bus);32void sdw_bus_debugfs_exit(struct sdw_bus *bus);33void sdw_slave_debugfs_init(struct sdw_slave *slave);34void sdw_slave_debugfs_exit(struct sdw_slave *slave);35void sdw_debugfs_init(void);36void sdw_debugfs_exit(void);37#else38static inline void sdw_bus_debugfs_init(struct sdw_bus *bus) {}39static inline void sdw_bus_debugfs_exit(struct sdw_bus *bus) {}40static inline void sdw_slave_debugfs_init(struct sdw_slave *slave) {}41static inline void sdw_slave_debugfs_exit(struct sdw_slave *slave) {}42static inline void sdw_debugfs_init(void) {}43static inline void sdw_debugfs_exit(void) {}44#endif45 46enum {47	SDW_MSG_FLAG_READ = 0,48	SDW_MSG_FLAG_WRITE,49};50 51/**52 * struct sdw_msg - Message structure53 * @addr: Register address accessed in the Slave54 * @len: number of messages55 * @dev_num: Slave device number56 * @addr_page1: SCP address page 1 Slave register57 * @addr_page2: SCP address page 2 Slave register58 * @flags: transfer flags, indicate if xfer is read or write59 * @buf: message data buffer60 * @ssp_sync: Send message at SSP (Stream Synchronization Point)61 * @page: address requires paging62 */63struct sdw_msg {64	u16 addr;65	u16 len;66	u8 dev_num;67	u8 addr_page1;68	u8 addr_page2;69	u8 flags;70	u8 *buf;71	bool ssp_sync;72	bool page;73};74 75#define SDW_DOUBLE_RATE_FACTOR		276#define SDW_STRM_RATE_GROUPING		177 78extern int sdw_rows[SDW_FRAME_ROWS];79extern int sdw_cols[SDW_FRAME_COLS];80 81int sdw_find_row_index(int row);82int sdw_find_col_index(int col);83 84/**85 * sdw_port_runtime: Runtime port parameters for Master or Slave86 *87 * @num: Port number. For audio streams, valid port number ranges from88 * [1,14]89 * @ch_mask: Channel mask90 * @transport_params: Transport parameters91 * @port_params: Port parameters92 * @port_node: List node for Master or Slave port_list93 *94 * SoundWire spec has no mention of ports for Master interface but the95 * concept is logically extended.96 */97struct sdw_port_runtime {98	int num;99	int ch_mask;100	struct sdw_transport_params transport_params;101	struct sdw_port_params port_params;102	struct list_head port_node;103};104 105/**106 * sdw_slave_runtime: Runtime Stream parameters for Slave107 *108 * @slave: Slave handle109 * @direction: Data direction for Slave110 * @ch_count: Number of channels handled by the Slave for111 * this stream112 * @m_rt_node: sdw_master_runtime list node113 * @port_list: List of Slave Ports configured for this stream114 */115struct sdw_slave_runtime {116	struct sdw_slave *slave;117	enum sdw_data_direction direction;118	unsigned int ch_count;119	struct list_head m_rt_node;120	struct list_head port_list;121};122 123/**124 * sdw_master_runtime: Runtime stream parameters for Master125 *126 * @bus: Bus handle127 * @stream: Stream runtime handle128 * @direction: Data direction for Master129 * @ch_count: Number of channels handled by the Master for130 * this stream, can be zero.131 * @slave_rt_list: Slave runtime list132 * @port_list: List of Master Ports configured for this stream, can be zero.133 * @stream_node: sdw_stream_runtime master_list node134 * @bus_node: sdw_bus m_rt_list node135 */136struct sdw_master_runtime {137	struct sdw_bus *bus;138	struct sdw_stream_runtime *stream;139	enum sdw_data_direction direction;140	unsigned int ch_count;141	struct list_head slave_rt_list;142	struct list_head port_list;143	struct list_head stream_node;144	struct list_head bus_node;145};146 147struct sdw_transport_data {148	int hstart;149	int hstop;150	int block_offset;151	int sub_block_offset;152};153 154struct sdw_dpn_prop *sdw_get_slave_dpn_prop(struct sdw_slave *slave,155					    enum sdw_data_direction direction,156					    unsigned int port_num);157int sdw_configure_dpn_intr(struct sdw_slave *slave, int port,158			   bool enable, int mask);159 160int sdw_transfer(struct sdw_bus *bus, struct sdw_msg *msg);161int sdw_transfer_defer(struct sdw_bus *bus, struct sdw_msg *msg);162 163#define SDW_READ_INTR_CLEAR_RETRY	10164 165int sdw_fill_msg(struct sdw_msg *msg, struct sdw_slave *slave,166		 u32 addr, size_t count, u16 dev_num, u8 flags, u8 *buf);167 168/* Fill transport parameter data structure */169static inline void sdw_fill_xport_params(struct sdw_transport_params *params,170					 int port_num, bool grp_ctrl_valid,171					 int grp_ctrl, int sample_int,172					 int off1, int off2,173					 int hstart, int hstop,174					 int pack_mode, int lane_ctrl)175{176	params->port_num = port_num;177	params->blk_grp_ctrl_valid = grp_ctrl_valid;178	params->blk_grp_ctrl = grp_ctrl;179	params->sample_interval = sample_int;180	params->offset1 = off1;181	params->offset2 = off2;182	params->hstart = hstart;183	params->hstop = hstop;184	params->blk_pkg_mode = pack_mode;185	params->lane_ctrl = lane_ctrl;186}187 188/* Fill port parameter data structure */189static inline void sdw_fill_port_params(struct sdw_port_params *params,190					int port_num, int bps,191					int flow_mode, int data_mode)192{193	params->num = port_num;194	params->bps = bps;195	params->flow_mode = flow_mode;196	params->data_mode = data_mode;197}198 199/* broadcast read/write for tests */200int sdw_bread_no_pm_unlocked(struct sdw_bus *bus, u16 dev_num, u32 addr);201int sdw_bwrite_no_pm_unlocked(struct sdw_bus *bus, u16 dev_num, u32 addr, u8 value);202 203/*204 * At the moment we only track Master-initiated hw_reset.205 * Additional fields can be added as needed206 */207#define SDW_UNATTACH_REQUEST_MASTER_RESET	BIT(0)208 209void sdw_clear_slave_status(struct sdw_bus *bus, u32 request);210int sdw_slave_modalias(const struct sdw_slave *slave, char *buf, size_t size);211void sdw_compute_slave_ports(struct sdw_master_runtime *m_rt,212			     struct sdw_transport_data *t_data);213 214#endif /* __SDW_BUS_H */215