1 // SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
2 // Copyright(c) 2015-17 Intel Corporation.
5 * SDW Intel Init Routines
7 * Initializes and creates SDW devices based on ACPI and Hardware values
10 #include <linux/acpi.h>
11 #include <linux/export.h>
12 #include <linux/interrupt.h>
14 #include <linux/module.h>
15 #include <linux/platform_device.h>
16 #include <linux/pm_runtime.h>
17 #include <linux/soundwire/sdw_intel.h>
18 #include "cadence_master.h"
21 #define SDW_LINK_TYPE 4 /* from Intel ACPI documentation */
22 #define SDW_MAX_LINKS 4
23 #define SDW_SHIM_LCAP 0x0
24 #define SDW_SHIM_BASE 0x2C000
25 #define SDW_ALH_BASE 0x2C800
26 #define SDW_LINK_BASE 0x30000
27 #define SDW_LINK_SIZE 0x10000
29 static int ctrl_link_mask
;
30 module_param_named(sdw_link_mask
, ctrl_link_mask
, int, 0444);
31 MODULE_PARM_DESC(sdw_link_mask
, "Intel link mask (one bit per link)");
33 static bool is_link_enabled(struct fwnode_handle
*fw_node
, int i
)
35 struct fwnode_handle
*link
;
39 /* Find master handle */
40 snprintf(name
, sizeof(name
),
41 "mipi-sdw-link-%d-subproperties", i
);
43 link
= fwnode_get_named_child_node(fw_node
, name
);
47 fwnode_property_read_u32(link
,
51 if (quirk_mask
& SDW_INTEL_QUIRK_MASK_BUS_DISABLE
)
57 static int sdw_intel_cleanup(struct sdw_intel_ctx
*ctx
)
59 struct sdw_intel_link_res
*link
= ctx
->links
;
66 link_mask
= ctx
->link_mask
;
68 for (i
= 0; i
< ctx
->count
; i
++, link
++) {
69 if (!(link_mask
& BIT(i
)))
73 pm_runtime_disable(&link
->pdev
->dev
);
74 platform_device_unregister(link
->pdev
);
77 if (!link
->clock_stop_quirks
)
78 pm_runtime_put_noidle(link
->dev
);
85 sdw_intel_scan_controller(struct sdw_intel_acpi_info
*info
)
87 struct acpi_device
*adev
;
91 if (acpi_bus_get_device(info
->handle
, &adev
))
94 /* Found controller, find links supported */
96 ret
= fwnode_property_read_u8_array(acpi_fwnode_handle(adev
),
97 "mipi-sdw-master-count", &count
, 1);
100 * In theory we could check the number of links supported in
101 * hardware, but in that step we cannot assume SoundWire IP is
104 * In addition, if the BIOS doesn't even provide this
105 * 'master-count' property then all the inits based on link
106 * masks will fail as well.
108 * We will check the hardware capabilities in the startup() step
113 "Failed to read mipi-sdw-master-count: %d\n", ret
);
117 /* Check count is within bounds */
118 if (count
> SDW_MAX_LINKS
) {
119 dev_err(&adev
->dev
, "Link count %d exceeds max %d\n",
120 count
, SDW_MAX_LINKS
);
125 dev_warn(&adev
->dev
, "No SoundWire links detected\n");
128 dev_dbg(&adev
->dev
, "ACPI reports %d SDW Link devices\n", count
);
133 for (i
= 0; i
< count
; i
++) {
134 if (ctrl_link_mask
&& !(ctrl_link_mask
& BIT(i
))) {
136 "Link %d masked, will not be enabled\n", i
);
140 if (!is_link_enabled(acpi_fwnode_handle(adev
), i
)) {
142 "Link %d not selected in firmware\n", i
);
146 info
->link_mask
|= BIT(i
);
152 #define HDA_DSP_REG_ADSPIC2 (0x10)
153 #define HDA_DSP_REG_ADSPIS2 (0x14)
154 #define HDA_DSP_REG_ADSPIC2_SNDW BIT(5)
157 * sdw_intel_enable_irq() - enable/disable Intel SoundWire IRQ
158 * @mmio_base: The mmio base of the control register
159 * @enable: true if enable
161 void sdw_intel_enable_irq(void __iomem
*mmio_base
, bool enable
)
165 val
= readl(mmio_base
+ HDA_DSP_REG_ADSPIC2
);
168 val
|= HDA_DSP_REG_ADSPIC2_SNDW
;
170 val
&= ~HDA_DSP_REG_ADSPIC2_SNDW
;
172 writel(val
, mmio_base
+ HDA_DSP_REG_ADSPIC2
);
174 EXPORT_SYMBOL_NS(sdw_intel_enable_irq
, SOUNDWIRE_INTEL_INIT
);
176 irqreturn_t
sdw_intel_thread(int irq
, void *dev_id
)
178 struct sdw_intel_ctx
*ctx
= dev_id
;
179 struct sdw_intel_link_res
*link
;
181 list_for_each_entry(link
, &ctx
->link_list
, list
)
182 sdw_cdns_irq(irq
, link
->cdns
);
184 sdw_intel_enable_irq(ctx
->mmio_base
, true);
187 EXPORT_SYMBOL_NS(sdw_intel_thread
, SOUNDWIRE_INTEL_INIT
);
189 static struct sdw_intel_ctx
190 *sdw_intel_probe_controller(struct sdw_intel_res
*res
)
192 struct platform_device_info pdevinfo
;
193 struct platform_device
*pdev
;
194 struct sdw_intel_link_res
*link
;
195 struct sdw_intel_ctx
*ctx
;
196 struct acpi_device
*adev
;
197 struct sdw_slave
*slave
;
198 struct list_head
*node
;
208 if (acpi_bus_get_device(res
->handle
, &adev
))
215 dev_dbg(&adev
->dev
, "Creating %d SDW Link devices\n", count
);
217 ctx
= devm_kzalloc(&adev
->dev
, sizeof(*ctx
), GFP_KERNEL
);
222 ctx
->links
= devm_kcalloc(&adev
->dev
, ctx
->count
,
223 sizeof(*ctx
->links
), GFP_KERNEL
);
228 ctx
->mmio_base
= res
->mmio_base
;
229 ctx
->link_mask
= res
->link_mask
;
230 ctx
->handle
= res
->handle
;
231 mutex_init(&ctx
->shim_lock
);
234 link_mask
= ctx
->link_mask
;
236 INIT_LIST_HEAD(&ctx
->link_list
);
238 /* Create SDW Master devices */
239 for (i
= 0; i
< count
; i
++, link
++) {
240 if (!(link_mask
& BIT(i
))) {
242 "Link %d masked, will not be enabled\n", i
);
246 link
->mmio_base
= res
->mmio_base
;
247 link
->registers
= res
->mmio_base
+ SDW_LINK_BASE
248 + (SDW_LINK_SIZE
* i
);
249 link
->shim
= res
->mmio_base
+ SDW_SHIM_BASE
;
250 link
->alh
= res
->mmio_base
+ SDW_ALH_BASE
;
252 link
->ops
= res
->ops
;
253 link
->dev
= res
->dev
;
255 link
->clock_stop_quirks
= res
->clock_stop_quirks
;
256 link
->shim_lock
= &ctx
->shim_lock
;
257 link
->shim_mask
= &ctx
->shim_mask
;
258 link
->link_mask
= link_mask
;
260 memset(&pdevinfo
, 0, sizeof(pdevinfo
));
262 pdevinfo
.parent
= res
->parent
;
263 pdevinfo
.name
= "intel-sdw";
265 pdevinfo
.fwnode
= acpi_fwnode_handle(adev
);
266 pdevinfo
.data
= link
;
267 pdevinfo
.size_data
= sizeof(*link
);
269 pdev
= platform_device_register_full(&pdevinfo
);
272 "platform device creation failed: %ld\n",
277 link
->cdns
= platform_get_drvdata(pdev
);
279 list_add_tail(&link
->list
, &ctx
->link_list
);
280 bus
= &link
->cdns
->bus
;
281 /* Calculate number of slaves */
282 list_for_each(node
, &bus
->slaves
)
286 ctx
->ids
= devm_kcalloc(&adev
->dev
, num_slaves
,
287 sizeof(*ctx
->ids
), GFP_KERNEL
);
291 ctx
->num_slaves
= num_slaves
;
293 list_for_each_entry(link
, &ctx
->link_list
, list
) {
294 bus
= &link
->cdns
->bus
;
295 list_for_each_entry(slave
, &bus
->slaves
, node
) {
296 ctx
->ids
[i
].id
= slave
->id
;
297 ctx
->ids
[i
].link_id
= bus
->link_id
;
306 sdw_intel_cleanup(ctx
);
311 sdw_intel_startup_controller(struct sdw_intel_ctx
*ctx
)
313 struct acpi_device
*adev
;
314 struct sdw_intel_link_res
*link
;
319 if (acpi_bus_get_device(ctx
->handle
, &adev
))
322 /* Check SNDWLCAP.LCOUNT */
323 caps
= ioread32(ctx
->mmio_base
+ SDW_SHIM_BASE
+ SDW_SHIM_LCAP
);
324 caps
&= GENMASK(2, 0);
326 /* Check HW supported vs property value */
327 if (caps
< ctx
->count
) {
329 "BIOS master count is larger than hardware capabilities\n");
337 link_mask
= ctx
->link_mask
;
339 /* Startup SDW Master devices */
340 for (i
= 0; i
< ctx
->count
; i
++, link
++) {
341 if (!(link_mask
& BIT(i
)))
344 intel_master_startup(link
->pdev
);
346 if (!link
->clock_stop_quirks
) {
348 * we need to prevent the parent PCI device
349 * from entering pm_runtime suspend, so that
350 * power rails to the SoundWire IP are not
353 pm_runtime_get_noresume(link
->dev
);
360 static acpi_status
sdw_intel_acpi_cb(acpi_handle handle
, u32 level
,
361 void *cdata
, void **return_value
)
363 struct sdw_intel_acpi_info
*info
= cdata
;
364 struct acpi_device
*adev
;
368 status
= acpi_evaluate_integer(handle
, METHOD_NAME__ADR
, NULL
, &adr
);
369 if (ACPI_FAILURE(status
))
370 return AE_OK
; /* keep going */
372 if (acpi_bus_get_device(handle
, &adev
)) {
373 pr_err("%s: Couldn't find ACPI handle\n", __func__
);
377 info
->handle
= handle
;
380 * On some Intel platforms, multiple children of the HDAS
381 * device can be found, but only one of them is the SoundWire
382 * controller. The SNDW device is always exposed with
383 * Name(_ADR, 0x40000000), with bits 31..28 representing the
384 * SoundWire link so filter accordingly
386 if (FIELD_GET(GENMASK(31, 28), adr
) != SDW_LINK_TYPE
)
387 return AE_OK
; /* keep going */
389 /* device found, stop namespace walk */
390 return AE_CTRL_TERMINATE
;
394 * sdw_intel_acpi_scan() - SoundWire Intel init routine
395 * @parent_handle: ACPI parent handle
396 * @info: description of what firmware/DSDT tables expose
398 * This scans the namespace and queries firmware to figure out which
399 * links to enable. A follow-up use of sdw_intel_probe() and
400 * sdw_intel_startup() is required for creation of devices and bus
403 int sdw_intel_acpi_scan(acpi_handle
*parent_handle
,
404 struct sdw_intel_acpi_info
*info
)
408 status
= acpi_walk_namespace(ACPI_TYPE_DEVICE
,
412 if (ACPI_FAILURE(status
))
415 return sdw_intel_scan_controller(info
);
417 EXPORT_SYMBOL_NS(sdw_intel_acpi_scan
, SOUNDWIRE_INTEL_INIT
);
420 * sdw_intel_probe() - SoundWire Intel probe routine
421 * @res: resource data
423 * This registers a platform device for each Master handled by the controller,
424 * and SoundWire Master and Slave devices will be created by the platform
425 * device probe. All the information necessary is stored in the context, and
426 * the res argument pointer can be freed after this step.
427 * This function will be called after sdw_intel_acpi_scan() by SOF probe.
430 *sdw_intel_probe(struct sdw_intel_res
*res
)
432 return sdw_intel_probe_controller(res
);
434 EXPORT_SYMBOL_NS(sdw_intel_probe
, SOUNDWIRE_INTEL_INIT
);
437 * sdw_intel_startup() - SoundWire Intel startup
438 * @ctx: SoundWire context allocated in the probe
440 * Startup Intel SoundWire controller. This function will be called after
441 * Intel Audio DSP is powered up.
443 int sdw_intel_startup(struct sdw_intel_ctx
*ctx
)
445 return sdw_intel_startup_controller(ctx
);
447 EXPORT_SYMBOL_NS(sdw_intel_startup
, SOUNDWIRE_INTEL_INIT
);
449 * sdw_intel_exit() - SoundWire Intel exit
450 * @ctx: SoundWire context allocated in the probe
452 * Delete the controller instances created and cleanup
454 void sdw_intel_exit(struct sdw_intel_ctx
*ctx
)
456 sdw_intel_cleanup(ctx
);
458 EXPORT_SYMBOL_NS(sdw_intel_exit
, SOUNDWIRE_INTEL_INIT
);
460 void sdw_intel_process_wakeen_event(struct sdw_intel_ctx
*ctx
)
462 struct sdw_intel_link_res
*link
;
470 link_mask
= ctx
->link_mask
;
472 /* Startup SDW Master devices */
473 for (i
= 0; i
< ctx
->count
; i
++, link
++) {
474 if (!(link_mask
& BIT(i
)))
477 intel_master_process_wakeen_event(link
->pdev
);
480 EXPORT_SYMBOL_NS(sdw_intel_process_wakeen_event
, SOUNDWIRE_INTEL_INIT
);
482 MODULE_LICENSE("Dual BSD/GPL");
483 MODULE_DESCRIPTION("Intel Soundwire Init Library");