Commit | Line | Data |
---|---|---|
7c3cd189 VK |
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 | #if IS_ENABLED(CONFIG_ACPI) | |
8 | int sdw_acpi_find_slaves(struct sdw_bus *bus); | |
9 | #else | |
10 | static inline int sdw_acpi_find_slaves(struct sdw_bus *bus) | |
11 | { | |
12 | return -ENOTSUPP; | |
13 | } | |
14 | #endif | |
15 | ||
16 | void sdw_extract_slave_id(struct sdw_bus *bus, | |
17 | u64 addr, struct sdw_slave_id *id); | |
18 | ||
9d715fa0 VK |
19 | enum { |
20 | SDW_MSG_FLAG_READ = 0, | |
21 | SDW_MSG_FLAG_WRITE, | |
22 | }; | |
23 | ||
24 | /** | |
25 | * struct sdw_msg - Message structure | |
26 | * @addr: Register address accessed in the Slave | |
27 | * @len: number of messages | |
28 | * @dev_num: Slave device number | |
29 | * @addr_page1: SCP address page 1 Slave register | |
30 | * @addr_page2: SCP address page 2 Slave register | |
31 | * @flags: transfer flags, indicate if xfer is read or write | |
32 | * @buf: message data buffer | |
33 | * @ssp_sync: Send message at SSP (Stream Synchronization Point) | |
34 | * @page: address requires paging | |
35 | */ | |
36 | struct sdw_msg { | |
37 | u16 addr; | |
38 | u16 len; | |
39 | u8 dev_num; | |
40 | u8 addr_page1; | |
41 | u8 addr_page2; | |
42 | u8 flags; | |
43 | u8 *buf; | |
44 | bool ssp_sync; | |
45 | bool page; | |
46 | }; | |
47 | ||
bbe7379d SK |
48 | /** |
49 | * sdw_port_runtime: Runtime port parameters for Master or Slave | |
50 | * | |
51 | * @num: Port number. For audio streams, valid port number ranges from | |
52 | * [1,14] | |
53 | * @ch_mask: Channel mask | |
54 | * @transport_params: Transport parameters | |
55 | * @port_params: Port parameters | |
56 | * @port_node: List node for Master or Slave port_list | |
57 | * | |
58 | * SoundWire spec has no mention of ports for Master interface but the | |
59 | * concept is logically extended. | |
60 | */ | |
61 | struct sdw_port_runtime { | |
62 | int num; | |
63 | int ch_mask; | |
64 | struct sdw_transport_params transport_params; | |
65 | struct sdw_port_params port_params; | |
66 | struct list_head port_node; | |
67 | }; | |
68 | ||
89e59053 SK |
69 | /** |
70 | * sdw_slave_runtime: Runtime Stream parameters for Slave | |
71 | * | |
72 | * @slave: Slave handle | |
73 | * @direction: Data direction for Slave | |
74 | * @ch_count: Number of channels handled by the Slave for | |
75 | * this stream | |
76 | * @m_rt_node: sdw_master_runtime list node | |
bbe7379d | 77 | * @port_list: List of Slave Ports configured for this stream |
89e59053 SK |
78 | */ |
79 | struct sdw_slave_runtime { | |
80 | struct sdw_slave *slave; | |
81 | enum sdw_data_direction direction; | |
82 | unsigned int ch_count; | |
83 | struct list_head m_rt_node; | |
bbe7379d | 84 | struct list_head port_list; |
89e59053 SK |
85 | }; |
86 | ||
87 | /** | |
88 | * sdw_master_runtime: Runtime stream parameters for Master | |
89 | * | |
90 | * @bus: Bus handle | |
91 | * @stream: Stream runtime handle | |
92 | * @direction: Data direction for Master | |
93 | * @ch_count: Number of channels handled by the Master for | |
94 | * this stream, can be zero. | |
95 | * @slave_rt_list: Slave runtime list | |
bbe7379d | 96 | * @port_list: List of Master Ports configured for this stream, can be zero. |
89e59053 SK |
97 | * @bus_node: sdw_bus m_rt_list node |
98 | */ | |
99 | struct sdw_master_runtime { | |
100 | struct sdw_bus *bus; | |
101 | struct sdw_stream_runtime *stream; | |
102 | enum sdw_data_direction direction; | |
103 | unsigned int ch_count; | |
104 | struct list_head slave_rt_list; | |
bbe7379d | 105 | struct list_head port_list; |
89e59053 SK |
106 | struct list_head bus_node; |
107 | }; | |
108 | ||
9d715fa0 VK |
109 | int sdw_transfer(struct sdw_bus *bus, struct sdw_msg *msg); |
110 | int sdw_transfer_defer(struct sdw_bus *bus, struct sdw_msg *msg, | |
111 | struct sdw_defer *defer); | |
112 | ||
b0a9c37b VK |
113 | #define SDW_READ_INTR_CLEAR_RETRY 10 |
114 | ||
9d715fa0 VK |
115 | int sdw_fill_msg(struct sdw_msg *msg, struct sdw_slave *slave, |
116 | u32 addr, size_t count, u16 dev_num, u8 flags, u8 *buf); | |
117 | ||
d52d7a1b SK |
118 | /* Read-Modify-Write Slave register */ |
119 | static inline int | |
120 | sdw_update(struct sdw_slave *slave, u32 addr, u8 mask, u8 val) | |
121 | { | |
122 | int tmp; | |
123 | ||
124 | tmp = sdw_read(slave, addr); | |
125 | if (tmp < 0) | |
126 | return tmp; | |
127 | ||
128 | tmp = (tmp & ~mask) | val; | |
129 | return sdw_write(slave, addr, tmp); | |
130 | } | |
131 | ||
7c3cd189 | 132 | #endif /* __SDW_BUS_H */ |