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 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 38 static inline void sdw_bus_debugfs_init(struct sdw_bus *bus) {} 39 static inline void sdw_bus_debugfs_exit(struct sdw_bus *bus) {} 40 static inline void sdw_slave_debugfs_init(struct sdw_slave *slave) {} 41 static inline void sdw_slave_debugfs_exit(struct sdw_slave *slave) {} 42 static inline void sdw_debugfs_init(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_dpn_prop *sdw_get_slave_dpn_prop(struct sdw_slave *slave, 148 enum sdw_data_direction direction, 149 unsigned int port_num); 150 int sdw_configure_dpn_intr(struct sdw_slave *slave, int port, 151 bool enable, int mask); 152 153 int sdw_transfer(struct sdw_bus *bus, struct sdw_msg *msg); 154 int sdw_transfer_defer(struct sdw_bus *bus, struct sdw_msg *msg, 155 struct sdw_defer *defer); 156 157 #define SDW_READ_INTR_CLEAR_RETRY 10 158 159 int sdw_fill_msg(struct sdw_msg *msg, struct sdw_slave *slave, 160 u32 addr, size_t count, u16 dev_num, u8 flags, u8 *buf); 161 162 /* Retrieve and return channel count from channel mask */ 163 static inline int sdw_ch_mask_to_ch(int ch_mask) 164 { 165 int c = 0; 166 167 for (c = 0; ch_mask; ch_mask >>= 1) 168 c += ch_mask & 1; 169 170 return c; 171 } 172 173 /* Fill transport parameter data structure */ 174 static inline void sdw_fill_xport_params(struct sdw_transport_params *params, 175 int port_num, bool grp_ctrl_valid, 176 int grp_ctrl, int sample_int, 177 int off1, int off2, 178 int hstart, int hstop, 179 int pack_mode, int lane_ctrl) 180 { 181 params->port_num = port_num; 182 params->blk_grp_ctrl_valid = grp_ctrl_valid; 183 params->blk_grp_ctrl = grp_ctrl; 184 params->sample_interval = sample_int; 185 params->offset1 = off1; 186 params->offset2 = off2; 187 params->hstart = hstart; 188 params->hstop = hstop; 189 params->blk_pkg_mode = pack_mode; 190 params->lane_ctrl = lane_ctrl; 191 } 192 193 /* Fill port parameter data structure */ 194 static inline void sdw_fill_port_params(struct sdw_port_params *params, 195 int port_num, int bps, 196 int flow_mode, int data_mode) 197 { 198 params->num = port_num; 199 params->bps = bps; 200 params->flow_mode = flow_mode; 201 params->data_mode = data_mode; 202 } 203 204 /* Read-Modify-Write Slave register */ 205 static inline int sdw_update(struct sdw_slave *slave, u32 addr, u8 mask, u8 val) 206 { 207 int tmp; 208 209 tmp = sdw_read(slave, addr); 210 if (tmp < 0) 211 return tmp; 212 213 tmp = (tmp & ~mask) | val; 214 return sdw_write(slave, addr, tmp); 215 } 216 217 /* broadcast read/write for tests */ 218 int sdw_bread_no_pm_unlocked(struct sdw_bus *bus, u16 dev_num, u32 addr); 219 int sdw_bwrite_no_pm_unlocked(struct sdw_bus *bus, u16 dev_num, u32 addr, u8 value); 220 221 /* 222 * At the moment we only track Master-initiated hw_reset. 223 * Additional fields can be added as needed 224 */ 225 #define SDW_UNATTACH_REQUEST_MASTER_RESET BIT(0) 226 227 void sdw_clear_slave_status(struct sdw_bus *bus, u32 request); 228 int sdw_slave_modalias(const struct sdw_slave *slave, char *buf, size_t size); 229 230 #endif /* __SDW_BUS_H */ 231