1  /* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */
2  /* Copyright(c) 2015-17 Intel Corporation. */
3  
4  #ifndef __SDW_BUS_H
5  #define __SDW_BUS_H
6  
7  #define DEFAULT_BANK_SWITCH_TIMEOUT 3000
8  #define DEFAULT_PROBE_TIMEOUT       2000
9  
10  u64 sdw_dmi_override_adr(struct sdw_bus *bus, u64 addr);
11  
12  #if IS_ENABLED(CONFIG_ACPI)
13  int sdw_acpi_find_slaves(struct sdw_bus *bus);
14  #else
sdw_acpi_find_slaves(struct sdw_bus * bus)15  static inline int sdw_acpi_find_slaves(struct sdw_bus *bus)
16  {
17  	return -ENOTSUPP;
18  }
19  #endif
20  
21  int sdw_of_find_slaves(struct sdw_bus *bus);
22  void sdw_extract_slave_id(struct sdw_bus *bus,
23  			  u64 addr, struct sdw_slave_id *id);
24  int sdw_slave_add(struct sdw_bus *bus, struct sdw_slave_id *id,
25  		  struct fwnode_handle *fwnode);
26  int sdw_master_device_add(struct sdw_bus *bus, struct device *parent,
27  			  struct fwnode_handle *fwnode);
28  int sdw_master_device_del(struct sdw_bus *bus);
29  
30  #ifdef CONFIG_DEBUG_FS
31  void sdw_bus_debugfs_init(struct sdw_bus *bus);
32  void sdw_bus_debugfs_exit(struct sdw_bus *bus);
33  void sdw_slave_debugfs_init(struct sdw_slave *slave);
34  void sdw_slave_debugfs_exit(struct sdw_slave *slave);
35  void sdw_debugfs_init(void);
36  void sdw_debugfs_exit(void);
37  #else
sdw_bus_debugfs_init(struct sdw_bus * bus)38  static inline void sdw_bus_debugfs_init(struct sdw_bus *bus) {}
sdw_bus_debugfs_exit(struct sdw_bus * bus)39  static inline void sdw_bus_debugfs_exit(struct sdw_bus *bus) {}
sdw_slave_debugfs_init(struct sdw_slave * slave)40  static inline void sdw_slave_debugfs_init(struct sdw_slave *slave) {}
sdw_slave_debugfs_exit(struct sdw_slave * slave)41  static inline void sdw_slave_debugfs_exit(struct sdw_slave *slave) {}
sdw_debugfs_init(void)42  static inline void sdw_debugfs_init(void) {}
sdw_debugfs_exit(void)43  static inline void sdw_debugfs_exit(void) {}
44  #endif
45  
46  enum {
47  	SDW_MSG_FLAG_READ = 0,
48  	SDW_MSG_FLAG_WRITE,
49  };
50  
51  /**
52   * struct sdw_msg - Message structure
53   * @addr: Register address accessed in the Slave
54   * @len: number of messages
55   * @dev_num: Slave device number
56   * @addr_page1: SCP address page 1 Slave register
57   * @addr_page2: SCP address page 2 Slave register
58   * @flags: transfer flags, indicate if xfer is read or write
59   * @buf: message data buffer
60   * @ssp_sync: Send message at SSP (Stream Synchronization Point)
61   * @page: address requires paging
62   */
63  struct 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		2
76  #define SDW_STRM_RATE_GROUPING		1
77  
78  extern int sdw_rows[SDW_FRAME_ROWS];
79  extern int sdw_cols[SDW_FRAME_COLS];
80  
81  int sdw_find_row_index(int row);
82  int sdw_find_col_index(int col);
83  
84  /**
85   * sdw_port_runtime: Runtime port parameters for Master or Slave
86   *
87   * @num: Port number. For audio streams, valid port number ranges from
88   * [1,14]
89   * @ch_mask: Channel mask
90   * @transport_params: Transport parameters
91   * @port_params: Port parameters
92   * @port_node: List node for Master or Slave port_list
93   *
94   * SoundWire spec has no mention of ports for Master interface but the
95   * concept is logically extended.
96   */
97  struct 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 Slave
107   *
108   * @slave: Slave handle
109   * @direction: Data direction for Slave
110   * @ch_count: Number of channels handled by the Slave for
111   * this stream
112   * @m_rt_node: sdw_master_runtime list node
113   * @port_list: List of Slave Ports configured for this stream
114   */
115  struct 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 Master
125   *
126   * @bus: Bus handle
127   * @stream: Stream runtime handle
128   * @direction: Data direction for Master
129   * @ch_count: Number of channels handled by the Master for
130   * this stream, can be zero.
131   * @slave_rt_list: Slave runtime list
132   * @port_list: List of Master Ports configured for this stream, can be zero.
133   * @stream_node: sdw_stream_runtime master_list node
134   * @bus_node: sdw_bus m_rt_list node
135   */
136  struct 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  
147  struct sdw_transport_data {
148  	int hstart;
149  	int hstop;
150  	int block_offset;
151  	int sub_block_offset;
152  };
153  
154  struct sdw_dpn_prop *sdw_get_slave_dpn_prop(struct sdw_slave *slave,
155  					    enum sdw_data_direction direction,
156  					    unsigned int port_num);
157  int sdw_configure_dpn_intr(struct sdw_slave *slave, int port,
158  			   bool enable, int mask);
159  
160  int sdw_transfer(struct sdw_bus *bus, struct sdw_msg *msg);
161  int sdw_transfer_defer(struct sdw_bus *bus, struct sdw_msg *msg);
162  
163  #define SDW_READ_INTR_CLEAR_RETRY	10
164  
165  int 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 */
sdw_fill_xport_params(struct sdw_transport_params * params,int port_num,bool grp_ctrl_valid,int grp_ctrl,int sample_int,int off1,int off2,int hstart,int hstop,int pack_mode,int lane_ctrl)169  static 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 */
sdw_fill_port_params(struct sdw_port_params * params,int port_num,int bps,int flow_mode,int data_mode)189  static 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 */
200  int sdw_bread_no_pm_unlocked(struct sdw_bus *bus, u16 dev_num, u32 addr);
201  int 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 needed
206   */
207  #define SDW_UNATTACH_REQUEST_MASTER_RESET	BIT(0)
208  
209  void sdw_clear_slave_status(struct sdw_bus *bus, u32 request);
210  int sdw_slave_modalias(const struct sdw_slave *slave, char *buf, size_t size);
211  void sdw_compute_slave_ports(struct sdw_master_runtime *m_rt,
212  			     struct sdw_transport_data *t_data);
213  
214  #endif /* __SDW_BUS_H */
215