Lines Matching +full:re +full:- +full:started

1 // SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
2 // Copyright(c) 2015-22 Intel Corporation.
32 * flags reused in each byte, with master0 using the ls-byte, etc.
76 if (slave->id.part_id == wake_capable_list[i].part_id && in is_wake_capable()
77 slave->id.mfg_id == wake_capable_list[i].mfg_id) in is_wake_capable()
88 if (sdw->link_res->hw_ops->bpt_send_async) in generic_bpt_send_async()
89 return sdw->link_res->hw_ops->bpt_send_async(sdw, slave, msg); in generic_bpt_send_async()
90 return -EOPNOTSUPP; in generic_bpt_send_async()
98 if (sdw->link_res->hw_ops->bpt_wait) in generic_bpt_wait()
99 return sdw->link_res->hw_ops->bpt_wait(sdw, slave, msg); in generic_bpt_wait()
100 return -EOPNOTSUPP; in generic_bpt_wait()
108 return sdw->link_res->hw_ops->pre_bank_switch(sdw); in generic_pre_bank_switch()
116 return sdw->link_res->hw_ops->post_bank_switch(sdw); in generic_post_bank_switch()
127 bool wake_capable = slave->prop.wake_capable || is_wake_capable(slave); in generic_new_peripheral_assigned()
134 dev_num_max = SDW_INTEL_DEV_NUM_IDA_MIN - 1; in generic_new_peripheral_assigned()
139 dev_err(bus->dev, "%s: invalid dev_num %d, wake supported %d\n", in generic_new_peripheral_assigned()
140 __func__, dev_num, slave->prop.wake_capable); in generic_new_peripheral_assigned()
144 if (sdw->link_res->hw_ops->program_sdi && wake_capable) in generic_new_peripheral_assigned()
145 sdw->link_res->hw_ops->program_sdi(sdw, dev_num); in generic_new_peripheral_assigned()
150 struct sdw_master_prop *prop = &bus->prop; in sdw_master_read_intel_prop()
158 "mipi-sdw-link-%d-subproperties", bus->link_id); in sdw_master_read_intel_prop()
160 link = device_get_named_child_node(bus->dev, name); in sdw_master_read_intel_prop()
162 dev_err(bus->dev, "Master node %s not found\n", name); in sdw_master_read_intel_prop()
163 return -EIO; in sdw_master_read_intel_prop()
167 "intel-sdw-ip-clock", in sdw_master_read_intel_prop()
168 &prop->mclk_freq); in sdw_master_read_intel_prop()
171 /* use kernel parameter for BIOS or board work-arounds */ in sdw_master_read_intel_prop()
172 prop->mclk_freq /= mclk_divider; in sdw_master_read_intel_prop()
175 prop->mclk_freq /= 2; in sdw_master_read_intel_prop()
178 "intel-quirk-mask", in sdw_master_read_intel_prop()
182 prop->hw_disabled = true; in sdw_master_read_intel_prop()
184 prop->quirks = SDW_MASTER_QUIRKS_CLEAR_INITIAL_CLASH | in sdw_master_read_intel_prop()
187 intel_prop = devm_kzalloc(bus->dev, sizeof(*intel_prop), GFP_KERNEL); in sdw_master_read_intel_prop()
190 return -ENOMEM; in sdw_master_read_intel_prop()
194 intel_prop->clde = 0x0; in sdw_master_read_intel_prop()
195 intel_prop->doaise2 = 0x0; in sdw_master_read_intel_prop()
196 intel_prop->dodse2 = 0x0; in sdw_master_read_intel_prop()
197 intel_prop->clds = 0x0; in sdw_master_read_intel_prop()
198 intel_prop->clss = 0x0; in sdw_master_read_intel_prop()
199 intel_prop->doaise = 0x1; in sdw_master_read_intel_prop()
200 intel_prop->doais = 0x3; in sdw_master_read_intel_prop()
201 intel_prop->dodse = 0x0; in sdw_master_read_intel_prop()
202 intel_prop->dods = 0x1; in sdw_master_read_intel_prop()
205 "intel-sdw-clde", in sdw_master_read_intel_prop()
206 &intel_prop->clde); in sdw_master_read_intel_prop()
208 "intel-sdw-doaise2", in sdw_master_read_intel_prop()
209 &intel_prop->doaise2); in sdw_master_read_intel_prop()
211 "intel-sdw-dodse2", in sdw_master_read_intel_prop()
212 &intel_prop->dodse2); in sdw_master_read_intel_prop()
214 "intel-sdw-clds", in sdw_master_read_intel_prop()
215 &intel_prop->clds); in sdw_master_read_intel_prop()
217 "intel-sdw-clss", in sdw_master_read_intel_prop()
218 &intel_prop->clss); in sdw_master_read_intel_prop()
220 "intel-sdw-doaise", in sdw_master_read_intel_prop()
221 &intel_prop->doaise); in sdw_master_read_intel_prop()
223 "intel-sdw-doais", in sdw_master_read_intel_prop()
224 &intel_prop->doais); in sdw_master_read_intel_prop()
226 "intel-sdw-dodse", in sdw_master_read_intel_prop()
227 &intel_prop->dodse); in sdw_master_read_intel_prop()
229 "intel-sdw-dods", in sdw_master_read_intel_prop()
230 &intel_prop->dods); in sdw_master_read_intel_prop()
231 bus->vendor_specific_prop = intel_prop; in sdw_master_read_intel_prop()
233 dev_dbg(bus->dev, "doaise %#x doais %#x dodse %#x dods %#x\n", in sdw_master_read_intel_prop()
234 intel_prop->doaise, in sdw_master_read_intel_prop()
235 intel_prop->doais, in sdw_master_read_intel_prop()
236 intel_prop->dodse, in sdw_master_read_intel_prop()
237 intel_prop->dods); in sdw_master_read_intel_prop()
249 /* read Intel-specific properties */ in intel_prop_read()
261 if (slave->prop.wake_capable || is_wake_capable(slave)) in intel_get_device_num_ida()
266 bit = find_first_zero_bit(slave->bus->assigned, SDW_MAX_DEVICES); in intel_get_device_num_ida()
268 return -ENODEV; in intel_get_device_num_ida()
275 if (slave->prop.wake_capable || is_wake_capable(slave)) in intel_put_device_num_ida()
276 ida_free(&intel_peripheral_ida, slave->dev_num); in intel_put_device_num_ida()
303 struct device *dev = &auxdev->dev; in intel_link_probe()
312 return -ENOMEM; in intel_link_probe()
314 cdns = &sdw->cdns; in intel_link_probe()
315 bus = &cdns->bus; in intel_link_probe()
317 sdw->instance = auxdev->id; in intel_link_probe()
318 sdw->link_res = &ldev->link_res; in intel_link_probe()
319 cdns->dev = dev; in intel_link_probe()
320 cdns->registers = sdw->link_res->registers; in intel_link_probe()
321 cdns->ip_offset = sdw->link_res->ip_offset; in intel_link_probe()
322 cdns->instance = sdw->instance; in intel_link_probe()
323 cdns->msg_count = 0; in intel_link_probe()
326 bus->controller_id = 0; in intel_link_probe()
328 bus->link_id = auxdev->id; in intel_link_probe()
329 bus->clk_stop_timeout = 1; in intel_link_probe()
332 * paranoia check: make sure ACPI-reported number of links is aligned with in intel_link_probe()
340 if (ret <= sdw->instance) { in intel_link_probe()
341 dev_err(dev, "%s: invalid link id %d, link count %d\n", __func__, auxdev->id, ret); in intel_link_probe()
342 return -EINVAL; in intel_link_probe()
348 bus->ops = &sdw_intel_ops; in intel_link_probe()
354 sdw->cdns.bus.compute_params = sdw_compute_params; in intel_link_probe()
356 ret = sdw_bus_master_add(bus, dev, dev->fwnode); in intel_link_probe()
362 if (bus->prop.hw_disabled) in intel_link_probe()
365 bus->link_id); in intel_link_probe()
370 bus->prop.err_threshold = 0; in intel_link_probe()
377 struct device *dev = &auxdev->dev; in intel_link_startup()
380 struct sdw_bus *bus = &cdns->bus; in intel_link_startup()
386 if (bus->prop.hw_disabled) { in intel_link_startup()
389 sdw->instance); in intel_link_startup()
393 link_flags = md_flags >> (bus->link_id * 8); in intel_link_startup()
396 dev_dbg(dev, "Multi-link is disabled\n"); in intel_link_startup()
399 * hardware-based synchronization is required regardless in intel_link_startup()
400 * of the number of segments used by a stream: SSP-based in intel_link_startup()
401 * synchronization is gated by gsync when the multi-master in intel_link_startup()
404 bus->hw_sync_min_links = 1; in intel_link_startup()
406 bus->multi_link = multi_link; in intel_link_startup()
432 pm_runtime_resume(bus->dev); in intel_link_startup()
442 clock_stop_quirks = sdw->link_res->clock_stop_quirks; in intel_link_startup()
459 * there are no Slave devices populated or if the power-on is in intel_link_startup()
463 * Conditionally force the pm_runtime core to re-evaluate the in intel_link_startup()
470 pm_runtime_mark_last_busy(bus->dev); in intel_link_startup()
475 sdw->startup_done = true; in intel_link_startup()
491 struct sdw_bus *bus = &cdns->bus; in intel_link_remove()
498 if (!bus->prop.hw_disabled) { in intel_link_remove()
500 cancel_delayed_work_sync(&cdns->attach_dwork); in intel_link_remove()
508 struct device *dev = &auxdev->dev; in intel_link_process_wakeen_event()
513 bus = &sdw->cdns.bus; in intel_link_process_wakeen_event()
515 if (bus->prop.hw_disabled || !sdw->startup_done) { in intel_link_process_wakeen_event()
516 dev_dbg(dev, "SoundWire master %d is disabled or not-started, ignoring\n", in intel_link_process_wakeen_event()
517 bus->link_id); in intel_link_process_wakeen_event()
529 * Slaves re-attaching and be re-enumerated. The SoundWire physical in intel_link_process_wakeen_event()
548 if (!slave->probed) { in intel_resume_child_device()
552 if (!slave->dev_num_sticky) { in intel_resume_child_device()
570 struct sdw_bus *bus = &cdns->bus; in intel_pm_prepare()
574 if (bus->prop.hw_disabled || !sdw->startup_done) { in intel_pm_prepare()
575 dev_dbg(dev, "SoundWire master %d is disabled or not-started, ignoring\n", in intel_pm_prepare()
576 bus->link_id); in intel_pm_prepare()
580 clock_stop_quirks = sdw->link_res->clock_stop_quirks; in intel_pm_prepare()
583 pm_runtime_suspended(dev->parent) && in intel_pm_prepare()
611 * this is a no-op. in intel_pm_prepare()
614 * of code to handle an Intel-specific corner case. It is simpler in in intel_pm_prepare()
617 ret = device_for_each_child(bus->dev, NULL, intel_resume_child_device); in intel_pm_prepare()
630 struct sdw_bus *bus = &cdns->bus; in intel_suspend()
634 if (bus->prop.hw_disabled || !sdw->startup_done) { in intel_suspend()
635 dev_dbg(dev, "SoundWire master %d is disabled or not-started, ignoring\n", in intel_suspend()
636 bus->link_id); in intel_suspend()
646 clock_stop_quirks = sdw->link_res->clock_stop_quirks; in intel_suspend()
651 if (pm_runtime_status_suspended(dev->parent)) { in intel_suspend()
678 struct sdw_bus *bus = &cdns->bus; in intel_suspend_runtime()
682 if (bus->prop.hw_disabled || !sdw->startup_done) { in intel_suspend_runtime()
683 dev_dbg(dev, "SoundWire master %d is disabled or not-started, ignoring\n", in intel_suspend_runtime()
684 bus->link_id); in intel_suspend_runtime()
688 clock_stop_quirks = sdw->link_res->clock_stop_quirks; in intel_suspend_runtime()
707 ret = -EINVAL; in intel_suspend_runtime()
717 struct sdw_bus *bus = &cdns->bus; in intel_resume()
720 if (bus->prop.hw_disabled || !sdw->startup_done) { in intel_resume()
721 dev_dbg(dev, "SoundWire master %d is disabled or not-started, ignoring\n", in intel_resume()
722 bus->link_id); in intel_resume()
747 * to active because the device has just been resumed and re-enable in intel_resume()
763 pm_runtime_mark_last_busy(bus->dev); in intel_resume()
773 struct sdw_bus *bus = &cdns->bus; in intel_resume_runtime()
777 if (bus->prop.hw_disabled || !sdw->startup_done) { in intel_resume_runtime()
778 dev_dbg(dev, "SoundWire master %d is disabled or not-started, ignoring\n", in intel_resume_runtime()
779 bus->link_id); in intel_resume_runtime()
786 clock_stop_quirks = sdw->link_res->clock_stop_quirks; in intel_resume_runtime()
840 ret = -EINVAL; in intel_resume_runtime()