.. | .. |
---|
35 | 35 | int nval, i; |
---|
36 | 36 | |
---|
37 | 37 | device_property_read_u32(bus->dev, |
---|
38 | | - "mipi-sdw-sw-interface-revision", &prop->revision); |
---|
| 38 | + "mipi-sdw-sw-interface-revision", |
---|
| 39 | + &prop->revision); |
---|
39 | 40 | |
---|
40 | 41 | /* Find master handle */ |
---|
41 | 42 | snprintf(name, sizeof(name), |
---|
42 | | - "mipi-sdw-master-%d-subproperties", bus->link_id); |
---|
| 43 | + "mipi-sdw-link-%d-subproperties", bus->link_id); |
---|
43 | 44 | |
---|
44 | 45 | link = device_get_named_child_node(bus->dev, name); |
---|
45 | 46 | if (!link) { |
---|
.. | .. |
---|
48 | 49 | } |
---|
49 | 50 | |
---|
50 | 51 | if (fwnode_property_read_bool(link, |
---|
51 | | - "mipi-sdw-clock-stop-mode0-supported") == true) |
---|
52 | | - prop->clk_stop_mode = SDW_CLK_STOP_MODE0; |
---|
| 52 | + "mipi-sdw-clock-stop-mode0-supported")) |
---|
| 53 | + prop->clk_stop_modes |= BIT(SDW_CLK_STOP_MODE0); |
---|
53 | 54 | |
---|
54 | 55 | if (fwnode_property_read_bool(link, |
---|
55 | | - "mipi-sdw-clock-stop-mode1-supported") == true) |
---|
56 | | - prop->clk_stop_mode |= SDW_CLK_STOP_MODE1; |
---|
| 56 | + "mipi-sdw-clock-stop-mode1-supported")) |
---|
| 57 | + prop->clk_stop_modes |= BIT(SDW_CLK_STOP_MODE1); |
---|
57 | 58 | |
---|
58 | 59 | fwnode_property_read_u32(link, |
---|
59 | | - "mipi-sdw-max-clock-frequency", &prop->max_freq); |
---|
| 60 | + "mipi-sdw-max-clock-frequency", |
---|
| 61 | + &prop->max_clk_freq); |
---|
60 | 62 | |
---|
61 | | - nval = fwnode_property_read_u32_array(link, |
---|
62 | | - "mipi-sdw-clock-frequencies-supported", NULL, 0); |
---|
| 63 | + nval = fwnode_property_count_u32(link, "mipi-sdw-clock-frequencies-supported"); |
---|
63 | 64 | if (nval > 0) { |
---|
64 | | - |
---|
65 | | - prop->num_freq = nval; |
---|
66 | | - prop->freq = devm_kcalloc(bus->dev, prop->num_freq, |
---|
67 | | - sizeof(*prop->freq), GFP_KERNEL); |
---|
68 | | - if (!prop->freq) |
---|
| 65 | + prop->num_clk_freq = nval; |
---|
| 66 | + prop->clk_freq = devm_kcalloc(bus->dev, prop->num_clk_freq, |
---|
| 67 | + sizeof(*prop->clk_freq), |
---|
| 68 | + GFP_KERNEL); |
---|
| 69 | + if (!prop->clk_freq) |
---|
69 | 70 | return -ENOMEM; |
---|
70 | 71 | |
---|
71 | 72 | fwnode_property_read_u32_array(link, |
---|
72 | 73 | "mipi-sdw-clock-frequencies-supported", |
---|
73 | | - prop->freq, prop->num_freq); |
---|
| 74 | + prop->clk_freq, prop->num_clk_freq); |
---|
74 | 75 | } |
---|
75 | 76 | |
---|
76 | 77 | /* |
---|
77 | 78 | * Check the frequencies supported. If FW doesn't provide max |
---|
78 | 79 | * freq, then populate here by checking values. |
---|
79 | 80 | */ |
---|
80 | | - if (!prop->max_freq && prop->freq) { |
---|
81 | | - prop->max_freq = prop->freq[0]; |
---|
82 | | - for (i = 1; i < prop->num_freq; i++) { |
---|
83 | | - if (prop->freq[i] > prop->max_freq) |
---|
84 | | - prop->max_freq = prop->freq[i]; |
---|
| 81 | + if (!prop->max_clk_freq && prop->clk_freq) { |
---|
| 82 | + prop->max_clk_freq = prop->clk_freq[0]; |
---|
| 83 | + for (i = 1; i < prop->num_clk_freq; i++) { |
---|
| 84 | + if (prop->clk_freq[i] > prop->max_clk_freq) |
---|
| 85 | + prop->max_clk_freq = prop->clk_freq[i]; |
---|
85 | 86 | } |
---|
86 | 87 | } |
---|
87 | 88 | |
---|
88 | | - nval = fwnode_property_read_u32_array(link, |
---|
89 | | - "mipi-sdw-supported-clock-gears", NULL, 0); |
---|
| 89 | + nval = fwnode_property_count_u32(link, "mipi-sdw-supported-clock-gears"); |
---|
90 | 90 | if (nval > 0) { |
---|
91 | | - |
---|
92 | 91 | prop->num_clk_gears = nval; |
---|
93 | 92 | prop->clk_gears = devm_kcalloc(bus->dev, prop->num_clk_gears, |
---|
94 | | - sizeof(*prop->clk_gears), GFP_KERNEL); |
---|
| 93 | + sizeof(*prop->clk_gears), |
---|
| 94 | + GFP_KERNEL); |
---|
95 | 95 | if (!prop->clk_gears) |
---|
96 | 96 | return -ENOMEM; |
---|
97 | 97 | |
---|
98 | 98 | fwnode_property_read_u32_array(link, |
---|
99 | | - "mipi-sdw-supported-clock-gears", |
---|
100 | | - prop->clk_gears, prop->num_clk_gears); |
---|
| 99 | + "mipi-sdw-supported-clock-gears", |
---|
| 100 | + prop->clk_gears, |
---|
| 101 | + prop->num_clk_gears); |
---|
101 | 102 | } |
---|
102 | 103 | |
---|
103 | 104 | fwnode_property_read_u32(link, "mipi-sdw-default-frame-rate", |
---|
104 | | - &prop->default_frame_rate); |
---|
| 105 | + &prop->default_frame_rate); |
---|
105 | 106 | |
---|
106 | 107 | fwnode_property_read_u32(link, "mipi-sdw-default-frame-row-size", |
---|
107 | | - &prop->default_row); |
---|
| 108 | + &prop->default_row); |
---|
108 | 109 | |
---|
109 | 110 | fwnode_property_read_u32(link, "mipi-sdw-default-frame-col-size", |
---|
110 | | - &prop->default_col); |
---|
| 111 | + &prop->default_col); |
---|
111 | 112 | |
---|
112 | 113 | prop->dynamic_frame = fwnode_property_read_bool(link, |
---|
113 | 114 | "mipi-sdw-dynamic-frame-shape"); |
---|
114 | 115 | |
---|
115 | 116 | fwnode_property_read_u32(link, "mipi-sdw-command-error-threshold", |
---|
116 | | - &prop->err_threshold); |
---|
| 117 | + &prop->err_threshold); |
---|
117 | 118 | |
---|
118 | 119 | return 0; |
---|
119 | 120 | } |
---|
120 | 121 | EXPORT_SYMBOL(sdw_master_read_prop); |
---|
121 | 122 | |
---|
122 | 123 | static int sdw_slave_read_dp0(struct sdw_slave *slave, |
---|
123 | | - struct fwnode_handle *port, struct sdw_dp0_prop *dp0) |
---|
| 124 | + struct fwnode_handle *port, |
---|
| 125 | + struct sdw_dp0_prop *dp0) |
---|
124 | 126 | { |
---|
125 | 127 | int nval; |
---|
126 | 128 | |
---|
127 | 129 | fwnode_property_read_u32(port, "mipi-sdw-port-max-wordlength", |
---|
128 | | - &dp0->max_word); |
---|
| 130 | + &dp0->max_word); |
---|
129 | 131 | |
---|
130 | 132 | fwnode_property_read_u32(port, "mipi-sdw-port-min-wordlength", |
---|
131 | | - &dp0->min_word); |
---|
| 133 | + &dp0->min_word); |
---|
132 | 134 | |
---|
133 | | - nval = fwnode_property_read_u32_array(port, |
---|
134 | | - "mipi-sdw-port-wordlength-configs", NULL, 0); |
---|
| 135 | + nval = fwnode_property_count_u32(port, "mipi-sdw-port-wordlength-configs"); |
---|
135 | 136 | if (nval > 0) { |
---|
136 | 137 | |
---|
137 | 138 | dp0->num_words = nval; |
---|
138 | 139 | dp0->words = devm_kcalloc(&slave->dev, |
---|
139 | | - dp0->num_words, sizeof(*dp0->words), |
---|
140 | | - GFP_KERNEL); |
---|
| 140 | + dp0->num_words, sizeof(*dp0->words), |
---|
| 141 | + GFP_KERNEL); |
---|
141 | 142 | if (!dp0->words) |
---|
142 | 143 | return -ENOMEM; |
---|
143 | 144 | |
---|
.. | .. |
---|
146 | 147 | dp0->words, dp0->num_words); |
---|
147 | 148 | } |
---|
148 | 149 | |
---|
149 | | - dp0->flow_controlled = fwnode_property_read_bool( |
---|
150 | | - port, "mipi-sdw-bra-flow-controlled"); |
---|
| 150 | + dp0->BRA_flow_controlled = fwnode_property_read_bool(port, |
---|
| 151 | + "mipi-sdw-bra-flow-controlled"); |
---|
151 | 152 | |
---|
152 | | - dp0->simple_ch_prep_sm = fwnode_property_read_bool( |
---|
153 | | - port, "mipi-sdw-simplified-channel-prepare-sm"); |
---|
| 153 | + dp0->simple_ch_prep_sm = fwnode_property_read_bool(port, |
---|
| 154 | + "mipi-sdw-simplified-channel-prepare-sm"); |
---|
154 | 155 | |
---|
155 | | - dp0->device_interrupts = fwnode_property_read_bool( |
---|
156 | | - port, "mipi-sdw-imp-def-dp0-interrupts-supported"); |
---|
| 156 | + dp0->imp_def_interrupts = fwnode_property_read_bool(port, |
---|
| 157 | + "mipi-sdw-imp-def-dp0-interrupts-supported"); |
---|
157 | 158 | |
---|
158 | 159 | return 0; |
---|
159 | 160 | } |
---|
160 | 161 | |
---|
161 | 162 | static int sdw_slave_read_dpn(struct sdw_slave *slave, |
---|
162 | | - struct sdw_dpn_prop *dpn, int count, int ports, char *type) |
---|
| 163 | + struct sdw_dpn_prop *dpn, int count, int ports, |
---|
| 164 | + char *type) |
---|
163 | 165 | { |
---|
164 | 166 | struct fwnode_handle *node; |
---|
165 | 167 | u32 bit, i = 0; |
---|
.. | .. |
---|
173 | 175 | |
---|
174 | 176 | for_each_set_bit(bit, &addr, 32) { |
---|
175 | 177 | snprintf(name, sizeof(name), |
---|
176 | | - "mipi-sdw-dp-%d-%s-subproperties", bit, type); |
---|
| 178 | + "mipi-sdw-dp-%d-%s-subproperties", bit, type); |
---|
177 | 179 | |
---|
178 | 180 | dpn[i].num = bit; |
---|
179 | 181 | |
---|
.. | .. |
---|
184 | 186 | } |
---|
185 | 187 | |
---|
186 | 188 | fwnode_property_read_u32(node, "mipi-sdw-port-max-wordlength", |
---|
187 | | - &dpn[i].max_word); |
---|
| 189 | + &dpn[i].max_word); |
---|
188 | 190 | fwnode_property_read_u32(node, "mipi-sdw-port-min-wordlength", |
---|
189 | | - &dpn[i].min_word); |
---|
| 191 | + &dpn[i].min_word); |
---|
190 | 192 | |
---|
191 | | - nval = fwnode_property_read_u32_array(node, |
---|
192 | | - "mipi-sdw-port-wordlength-configs", NULL, 0); |
---|
| 193 | + nval = fwnode_property_count_u32(node, "mipi-sdw-port-wordlength-configs"); |
---|
193 | 194 | if (nval > 0) { |
---|
194 | | - |
---|
195 | 195 | dpn[i].num_words = nval; |
---|
196 | 196 | dpn[i].words = devm_kcalloc(&slave->dev, |
---|
197 | | - dpn[i].num_words, |
---|
198 | | - sizeof(*dpn[i].words), GFP_KERNEL); |
---|
| 197 | + dpn[i].num_words, |
---|
| 198 | + sizeof(*dpn[i].words), |
---|
| 199 | + GFP_KERNEL); |
---|
199 | 200 | if (!dpn[i].words) |
---|
200 | 201 | return -ENOMEM; |
---|
201 | 202 | |
---|
.. | .. |
---|
205 | 206 | } |
---|
206 | 207 | |
---|
207 | 208 | fwnode_property_read_u32(node, "mipi-sdw-data-port-type", |
---|
208 | | - &dpn[i].type); |
---|
| 209 | + &dpn[i].type); |
---|
209 | 210 | |
---|
210 | 211 | fwnode_property_read_u32(node, |
---|
211 | | - "mipi-sdw-max-grouping-supported", |
---|
212 | | - &dpn[i].max_grouping); |
---|
| 212 | + "mipi-sdw-max-grouping-supported", |
---|
| 213 | + &dpn[i].max_grouping); |
---|
213 | 214 | |
---|
214 | 215 | dpn[i].simple_ch_prep_sm = fwnode_property_read_bool(node, |
---|
215 | 216 | "mipi-sdw-simplified-channelprepare-sm"); |
---|
216 | 217 | |
---|
217 | 218 | fwnode_property_read_u32(node, |
---|
218 | | - "mipi-sdw-port-channelprepare-timeout", |
---|
219 | | - &dpn[i].ch_prep_timeout); |
---|
| 219 | + "mipi-sdw-port-channelprepare-timeout", |
---|
| 220 | + &dpn[i].ch_prep_timeout); |
---|
220 | 221 | |
---|
221 | 222 | fwnode_property_read_u32(node, |
---|
222 | 223 | "mipi-sdw-imp-def-dpn-interrupts-supported", |
---|
223 | | - &dpn[i].device_interrupts); |
---|
| 224 | + &dpn[i].imp_def_interrupts); |
---|
224 | 225 | |
---|
225 | 226 | fwnode_property_read_u32(node, "mipi-sdw-min-channel-number", |
---|
226 | | - &dpn[i].min_ch); |
---|
| 227 | + &dpn[i].min_ch); |
---|
227 | 228 | |
---|
228 | 229 | fwnode_property_read_u32(node, "mipi-sdw-max-channel-number", |
---|
229 | | - &dpn[i].max_ch); |
---|
| 230 | + &dpn[i].max_ch); |
---|
230 | 231 | |
---|
231 | | - nval = fwnode_property_read_u32_array(node, |
---|
232 | | - "mipi-sdw-channel-number-list", NULL, 0); |
---|
| 232 | + nval = fwnode_property_count_u32(node, "mipi-sdw-channel-number-list"); |
---|
233 | 233 | if (nval > 0) { |
---|
234 | | - |
---|
235 | | - dpn[i].num_ch = nval; |
---|
236 | | - dpn[i].ch = devm_kcalloc(&slave->dev, dpn[i].num_ch, |
---|
237 | | - sizeof(*dpn[i].ch), GFP_KERNEL); |
---|
238 | | - if (!dpn[i].ch) |
---|
| 234 | + dpn[i].num_channels = nval; |
---|
| 235 | + dpn[i].channels = devm_kcalloc(&slave->dev, |
---|
| 236 | + dpn[i].num_channels, |
---|
| 237 | + sizeof(*dpn[i].channels), |
---|
| 238 | + GFP_KERNEL); |
---|
| 239 | + if (!dpn[i].channels) |
---|
239 | 240 | return -ENOMEM; |
---|
240 | 241 | |
---|
241 | 242 | fwnode_property_read_u32_array(node, |
---|
242 | 243 | "mipi-sdw-channel-number-list", |
---|
243 | | - dpn[i].ch, dpn[i].num_ch); |
---|
| 244 | + dpn[i].channels, dpn[i].num_channels); |
---|
244 | 245 | } |
---|
245 | 246 | |
---|
246 | | - nval = fwnode_property_read_u32_array(node, |
---|
247 | | - "mipi-sdw-channel-combination-list", NULL, 0); |
---|
| 247 | + nval = fwnode_property_count_u32(node, "mipi-sdw-channel-combination-list"); |
---|
248 | 248 | if (nval > 0) { |
---|
249 | | - |
---|
250 | 249 | dpn[i].num_ch_combinations = nval; |
---|
251 | 250 | dpn[i].ch_combinations = devm_kcalloc(&slave->dev, |
---|
252 | 251 | dpn[i].num_ch_combinations, |
---|
.. | .. |
---|
265 | 264 | "mipi-sdw-modes-supported", &dpn[i].modes); |
---|
266 | 265 | |
---|
267 | 266 | fwnode_property_read_u32(node, "mipi-sdw-max-async-buffer", |
---|
268 | | - &dpn[i].max_async_buffer); |
---|
| 267 | + &dpn[i].max_async_buffer); |
---|
269 | 268 | |
---|
270 | 269 | dpn[i].block_pack_mode = fwnode_property_read_bool(node, |
---|
271 | 270 | "mipi-sdw-block-packing-mode"); |
---|
272 | 271 | |
---|
273 | 272 | fwnode_property_read_u32(node, "mipi-sdw-port-encoding-type", |
---|
274 | | - &dpn[i].port_encoding); |
---|
| 273 | + &dpn[i].port_encoding); |
---|
275 | 274 | |
---|
276 | 275 | /* TODO: Read audio mode */ |
---|
277 | 276 | |
---|
.. | .. |
---|
290 | 289 | struct sdw_slave_prop *prop = &slave->prop; |
---|
291 | 290 | struct device *dev = &slave->dev; |
---|
292 | 291 | struct fwnode_handle *port; |
---|
293 | | - int num_of_ports, nval, i, dp0 = 0; |
---|
| 292 | + int nval; |
---|
294 | 293 | |
---|
295 | 294 | device_property_read_u32(dev, "mipi-sdw-sw-interface-revision", |
---|
296 | | - &prop->mipi_revision); |
---|
| 295 | + &prop->mipi_revision); |
---|
297 | 296 | |
---|
298 | 297 | prop->wake_capable = device_property_read_bool(dev, |
---|
299 | 298 | "mipi-sdw-wake-up-unavailable"); |
---|
.. | .. |
---|
311 | 310 | "mipi-sdw-simplified-clockstopprepare-sm-supported"); |
---|
312 | 311 | |
---|
313 | 312 | device_property_read_u32(dev, "mipi-sdw-clockstopprepare-timeout", |
---|
314 | | - &prop->clk_stop_timeout); |
---|
| 313 | + &prop->clk_stop_timeout); |
---|
315 | 314 | |
---|
316 | 315 | device_property_read_u32(dev, "mipi-sdw-slave-channelprepare-timeout", |
---|
317 | | - &prop->ch_prep_timeout); |
---|
| 316 | + &prop->ch_prep_timeout); |
---|
318 | 317 | |
---|
319 | 318 | device_property_read_u32(dev, |
---|
320 | 319 | "mipi-sdw-clockstopprepare-hard-reset-behavior", |
---|
.. | .. |
---|
333 | 332 | "mipi-sdw-port15-read-behavior", &prop->p15_behave); |
---|
334 | 333 | |
---|
335 | 334 | device_property_read_u32(dev, "mipi-sdw-master-count", |
---|
336 | | - &prop->master_count); |
---|
| 335 | + &prop->master_count); |
---|
337 | 336 | |
---|
338 | 337 | device_property_read_u32(dev, "mipi-sdw-source-port-list", |
---|
339 | | - &prop->source_ports); |
---|
| 338 | + &prop->source_ports); |
---|
340 | 339 | |
---|
341 | 340 | device_property_read_u32(dev, "mipi-sdw-sink-port-list", |
---|
342 | | - &prop->sink_ports); |
---|
| 341 | + &prop->sink_ports); |
---|
343 | 342 | |
---|
344 | 343 | /* Read dp0 properties */ |
---|
345 | 344 | port = device_get_named_child_node(dev, "mipi-sdw-dp-0-subproperties"); |
---|
346 | 345 | if (!port) { |
---|
347 | 346 | dev_dbg(dev, "DP0 node not found!!\n"); |
---|
348 | 347 | } else { |
---|
349 | | - |
---|
350 | 348 | prop->dp0_prop = devm_kzalloc(&slave->dev, |
---|
351 | | - sizeof(*prop->dp0_prop), GFP_KERNEL); |
---|
| 349 | + sizeof(*prop->dp0_prop), |
---|
| 350 | + GFP_KERNEL); |
---|
352 | 351 | if (!prop->dp0_prop) |
---|
353 | 352 | return -ENOMEM; |
---|
354 | 353 | |
---|
355 | 354 | sdw_slave_read_dp0(slave, port, prop->dp0_prop); |
---|
356 | | - dp0 = 1; |
---|
357 | 355 | } |
---|
358 | 356 | |
---|
359 | 357 | /* |
---|
.. | .. |
---|
364 | 362 | /* Allocate memory for set bits in port lists */ |
---|
365 | 363 | nval = hweight32(prop->source_ports); |
---|
366 | 364 | prop->src_dpn_prop = devm_kcalloc(&slave->dev, nval, |
---|
367 | | - sizeof(*prop->src_dpn_prop), GFP_KERNEL); |
---|
| 365 | + sizeof(*prop->src_dpn_prop), |
---|
| 366 | + GFP_KERNEL); |
---|
368 | 367 | if (!prop->src_dpn_prop) |
---|
369 | 368 | return -ENOMEM; |
---|
370 | 369 | |
---|
371 | 370 | /* Read dpn properties for source port(s) */ |
---|
372 | 371 | sdw_slave_read_dpn(slave, prop->src_dpn_prop, nval, |
---|
373 | | - prop->source_ports, "source"); |
---|
| 372 | + prop->source_ports, "source"); |
---|
374 | 373 | |
---|
375 | 374 | nval = hweight32(prop->sink_ports); |
---|
376 | 375 | prop->sink_dpn_prop = devm_kcalloc(&slave->dev, nval, |
---|
377 | | - sizeof(*prop->sink_dpn_prop), GFP_KERNEL); |
---|
| 376 | + sizeof(*prop->sink_dpn_prop), |
---|
| 377 | + GFP_KERNEL); |
---|
378 | 378 | if (!prop->sink_dpn_prop) |
---|
379 | 379 | return -ENOMEM; |
---|
380 | 380 | |
---|
381 | 381 | /* Read dpn properties for sink port(s) */ |
---|
382 | 382 | sdw_slave_read_dpn(slave, prop->sink_dpn_prop, nval, |
---|
383 | | - prop->sink_ports, "sink"); |
---|
384 | | - |
---|
385 | | - /* some ports are bidirectional so check total ports by ORing */ |
---|
386 | | - nval = prop->source_ports | prop->sink_ports; |
---|
387 | | - num_of_ports = hweight32(nval) + dp0; /* add DP0 */ |
---|
388 | | - |
---|
389 | | - /* Allocate port_ready based on num_of_ports */ |
---|
390 | | - slave->port_ready = devm_kcalloc(&slave->dev, num_of_ports, |
---|
391 | | - sizeof(*slave->port_ready), GFP_KERNEL); |
---|
392 | | - if (!slave->port_ready) |
---|
393 | | - return -ENOMEM; |
---|
394 | | - |
---|
395 | | - /* Initialize completion */ |
---|
396 | | - for (i = 0; i < num_of_ports; i++) |
---|
397 | | - init_completion(&slave->port_ready[i]); |
---|
| 383 | + prop->sink_ports, "sink"); |
---|
398 | 384 | |
---|
399 | 385 | return 0; |
---|
400 | 386 | } |
---|