Lines Matching +full:soundwire +full:- +full:controller
1 // SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
2 // Copyright(c) 2015-17 Intel Corporation.
17 #include <linux/soundwire/sdw_intel.h>
41 "mipi-sdw-link-%d-subproperties", i); in is_link_enabled()
48 "intel-quirk-mask", in is_link_enabled()
59 struct sdw_intel_link_res *link = ctx->links; in sdw_intel_cleanup()
66 link_mask = ctx->link_mask; in sdw_intel_cleanup()
68 for (i = 0; i < ctx->count; i++, link++) { in sdw_intel_cleanup()
72 if (link->pdev) { in sdw_intel_cleanup()
73 pm_runtime_disable(&link->pdev->dev); in sdw_intel_cleanup()
74 platform_device_unregister(link->pdev); in sdw_intel_cleanup()
77 if (!link->clock_stop_quirks) in sdw_intel_cleanup()
78 pm_runtime_put_noidle(link->dev); in sdw_intel_cleanup()
91 if (acpi_bus_get_device(info->handle, &adev)) in sdw_intel_scan_controller()
92 return -EINVAL; in sdw_intel_scan_controller()
94 /* Found controller, find links supported */ in sdw_intel_scan_controller()
97 "mipi-sdw-master-count", &count, 1); in sdw_intel_scan_controller()
101 * hardware, but in that step we cannot assume SoundWire IP is in sdw_intel_scan_controller()
105 * 'master-count' property then all the inits based on link in sdw_intel_scan_controller()
112 dev_err(&adev->dev, in sdw_intel_scan_controller()
113 "Failed to read mipi-sdw-master-count: %d\n", ret); in sdw_intel_scan_controller()
114 return -EINVAL; in sdw_intel_scan_controller()
119 dev_err(&adev->dev, "Link count %d exceeds max %d\n", in sdw_intel_scan_controller()
121 return -EINVAL; in sdw_intel_scan_controller()
125 dev_warn(&adev->dev, "No SoundWire links detected\n"); in sdw_intel_scan_controller()
126 return -EINVAL; in sdw_intel_scan_controller()
128 dev_dbg(&adev->dev, "ACPI reports %d SDW Link devices\n", count); in sdw_intel_scan_controller()
130 info->count = count; in sdw_intel_scan_controller()
131 info->link_mask = 0; in sdw_intel_scan_controller()
135 dev_dbg(&adev->dev, in sdw_intel_scan_controller()
141 dev_dbg(&adev->dev, in sdw_intel_scan_controller()
146 info->link_mask |= BIT(i); in sdw_intel_scan_controller()
157 * sdw_intel_enable_irq() - enable/disable Intel SoundWire IRQ
181 list_for_each_entry(link, &ctx->link_list, list) in sdw_intel_thread()
182 sdw_cdns_irq(irq, link->cdns); in sdw_intel_thread()
184 sdw_intel_enable_irq(ctx->mmio_base, true); in sdw_intel_thread()
208 if (acpi_bus_get_device(res->handle, &adev)) in sdw_intel_probe_controller()
211 if (!res->count) in sdw_intel_probe_controller()
214 count = res->count; in sdw_intel_probe_controller()
215 dev_dbg(&adev->dev, "Creating %d SDW Link devices\n", count); in sdw_intel_probe_controller()
217 ctx = devm_kzalloc(&adev->dev, sizeof(*ctx), GFP_KERNEL); in sdw_intel_probe_controller()
221 ctx->count = count; in sdw_intel_probe_controller()
222 ctx->links = devm_kcalloc(&adev->dev, ctx->count, in sdw_intel_probe_controller()
223 sizeof(*ctx->links), GFP_KERNEL); in sdw_intel_probe_controller()
224 if (!ctx->links) in sdw_intel_probe_controller()
227 ctx->count = count; in sdw_intel_probe_controller()
228 ctx->mmio_base = res->mmio_base; in sdw_intel_probe_controller()
229 ctx->link_mask = res->link_mask; in sdw_intel_probe_controller()
230 ctx->handle = res->handle; in sdw_intel_probe_controller()
231 mutex_init(&ctx->shim_lock); in sdw_intel_probe_controller()
233 link = ctx->links; in sdw_intel_probe_controller()
234 link_mask = ctx->link_mask; in sdw_intel_probe_controller()
236 INIT_LIST_HEAD(&ctx->link_list); in sdw_intel_probe_controller()
241 dev_dbg(&adev->dev, in sdw_intel_probe_controller()
246 link->mmio_base = res->mmio_base; in sdw_intel_probe_controller()
247 link->registers = res->mmio_base + SDW_LINK_BASE in sdw_intel_probe_controller()
249 link->shim = res->mmio_base + SDW_SHIM_BASE; in sdw_intel_probe_controller()
250 link->alh = res->mmio_base + SDW_ALH_BASE; in sdw_intel_probe_controller()
252 link->ops = res->ops; in sdw_intel_probe_controller()
253 link->dev = res->dev; in sdw_intel_probe_controller()
255 link->clock_stop_quirks = res->clock_stop_quirks; in sdw_intel_probe_controller()
256 link->shim_lock = &ctx->shim_lock; in sdw_intel_probe_controller()
257 link->shim_mask = &ctx->shim_mask; in sdw_intel_probe_controller()
258 link->link_mask = link_mask; in sdw_intel_probe_controller()
262 pdevinfo.parent = res->parent; in sdw_intel_probe_controller()
263 pdevinfo.name = "intel-sdw"; in sdw_intel_probe_controller()
271 dev_err(&adev->dev, in sdw_intel_probe_controller()
276 link->pdev = pdev; in sdw_intel_probe_controller()
277 link->cdns = platform_get_drvdata(pdev); in sdw_intel_probe_controller()
279 list_add_tail(&link->list, &ctx->link_list); in sdw_intel_probe_controller()
280 bus = &link->cdns->bus; in sdw_intel_probe_controller()
282 list_for_each(node, &bus->slaves) in sdw_intel_probe_controller()
286 ctx->ids = devm_kcalloc(&adev->dev, num_slaves, in sdw_intel_probe_controller()
287 sizeof(*ctx->ids), GFP_KERNEL); in sdw_intel_probe_controller()
288 if (!ctx->ids) in sdw_intel_probe_controller()
291 ctx->num_slaves = num_slaves; in sdw_intel_probe_controller()
293 list_for_each_entry(link, &ctx->link_list, list) { in sdw_intel_probe_controller()
294 bus = &link->cdns->bus; in sdw_intel_probe_controller()
295 list_for_each_entry(slave, &bus->slaves, node) { in sdw_intel_probe_controller()
296 ctx->ids[i].id = slave->id; in sdw_intel_probe_controller()
297 ctx->ids[i].link_id = bus->link_id; in sdw_intel_probe_controller()
305 ctx->count = i; in sdw_intel_probe_controller()
319 if (acpi_bus_get_device(ctx->handle, &adev)) in sdw_intel_startup_controller()
320 return -EINVAL; in sdw_intel_startup_controller()
323 caps = ioread32(ctx->mmio_base + SDW_SHIM_BASE + SDW_SHIM_LCAP); in sdw_intel_startup_controller()
327 if (caps < ctx->count) { in sdw_intel_startup_controller()
328 dev_err(&adev->dev, in sdw_intel_startup_controller()
330 return -EINVAL; in sdw_intel_startup_controller()
333 if (!ctx->links) in sdw_intel_startup_controller()
334 return -EINVAL; in sdw_intel_startup_controller()
336 link = ctx->links; in sdw_intel_startup_controller()
337 link_mask = ctx->link_mask; in sdw_intel_startup_controller()
340 for (i = 0; i < ctx->count; i++, link++) { in sdw_intel_startup_controller()
344 intel_master_startup(link->pdev); in sdw_intel_startup_controller()
346 if (!link->clock_stop_quirks) { in sdw_intel_startup_controller()
350 * power rails to the SoundWire IP are not in sdw_intel_startup_controller()
353 pm_runtime_get_noresume(link->dev); in sdw_intel_startup_controller()
377 info->handle = handle; in sdw_intel_acpi_cb()
381 * device can be found, but only one of them is the SoundWire in sdw_intel_acpi_cb()
382 * controller. The SNDW device is always exposed with in sdw_intel_acpi_cb()
384 * SoundWire link so filter accordingly in sdw_intel_acpi_cb()
394 * sdw_intel_acpi_scan() - SoundWire Intel init routine
399 * links to enable. A follow-up use of sdw_intel_probe() and
408 info->handle = NULL; in sdw_intel_acpi_scan()
413 if (ACPI_FAILURE(status) || info->handle == NULL) in sdw_intel_acpi_scan()
414 return -ENODEV; in sdw_intel_acpi_scan()
421 * sdw_intel_probe() - SoundWire Intel probe routine
424 * This registers a platform device for each Master handled by the controller,
425 * and SoundWire Master and Slave devices will be created by the platform
438 * sdw_intel_startup() - SoundWire Intel startup
439 * @ctx: SoundWire context allocated in the probe
441 * Startup Intel SoundWire controller. This function will be called after
450 * sdw_intel_exit() - SoundWire Intel exit
451 * @ctx: SoundWire context allocated in the probe
453 * Delete the controller instances created and cleanup
467 if (!ctx->links) in sdw_intel_process_wakeen_event()
470 link = ctx->links; in sdw_intel_process_wakeen_event()
471 link_mask = ctx->link_mask; in sdw_intel_process_wakeen_event()
474 for (i = 0; i < ctx->count; i++, link++) { in sdw_intel_process_wakeen_event()
478 intel_master_process_wakeen_event(link->pdev); in sdw_intel_process_wakeen_event()
484 MODULE_DESCRIPTION("Intel Soundwire Init Library");