forked from Minki/linux
e4401abb34
The SoundWire Linux devices are created purely based on information provided by platform firmware (e.g. ACPI DSDT table). When the kernel finds a matching driver for the device address (_ADR), the probe will initialize required data structures and initialize pm ops. When the SoundWire link is started at a later point, the physical devices will synchronize on the SoundWire frames and report their attachment status, thereby triggering the enumeration and initialization of device registers. This two-step solution was a conscious design decision to allow e.g. a driver to use sideband mechanisms to turn power rails on. This can also allow OEMs to describe multiple platforms with the same DSDT table, the devices that are not physically present in hardware. The drawback of this approach is a bit of confusion, with more devices than are actually present in hardware. This results in 'ghost' devices, for which the driver successfully probes, but that will not generate any traffic on the bus. suspend-resume transitions are handled by drivers, and skipped when the devices are not physically present. This patch provides a work-around for a second-level of confusion in platform firmware: some platforms only use HDaudio links, but nevertheless expose SoundWire 'ghost' devices. This results in error messages in the Intel driver while trying to suspend/resume these links. The simplest solution is to add a boolean status flag to skip all suspend/resume/wake sequences if the link was never started. Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com> Link: https://lore.kernel.org/r/20210818024954.16873-3-yung-chuan.liao@linux.intel.com Signed-off-by: Vinod Koul <vkoul@kernel.org>
62 lines
1.8 KiB
C
62 lines
1.8 KiB
C
/* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */
|
|
/* Copyright(c) 2015-17 Intel Corporation. */
|
|
|
|
#ifndef __SDW_INTEL_LOCAL_H
|
|
#define __SDW_INTEL_LOCAL_H
|
|
|
|
/**
|
|
* struct sdw_intel_link_res - Soundwire Intel link resource structure,
|
|
* typically populated by the controller driver.
|
|
* @mmio_base: mmio base of SoundWire registers
|
|
* @registers: Link IO registers base
|
|
* @shim: Audio shim pointer
|
|
* @alh: ALH (Audio Link Hub) pointer
|
|
* @irq: Interrupt line
|
|
* @ops: Shim callback ops
|
|
* @dev: device implementing hw_params and free callbacks
|
|
* @shim_lock: mutex to handle access to shared SHIM registers
|
|
* @shim_mask: global pointer to check SHIM register initialization
|
|
* @clock_stop_quirks: mask defining requested behavior on pm_suspend
|
|
* @link_mask: global mask needed for power-up/down sequences
|
|
* @cdns: Cadence master descriptor
|
|
* @list: used to walk-through all masters exposed by the same controller
|
|
*/
|
|
struct sdw_intel_link_res {
|
|
void __iomem *mmio_base; /* not strictly needed, useful for debug */
|
|
void __iomem *registers;
|
|
void __iomem *shim;
|
|
void __iomem *alh;
|
|
int irq;
|
|
const struct sdw_intel_ops *ops;
|
|
struct device *dev;
|
|
struct mutex *shim_lock; /* protect shared registers */
|
|
u32 *shim_mask;
|
|
u32 clock_stop_quirks;
|
|
u32 link_mask;
|
|
struct sdw_cdns *cdns;
|
|
struct list_head list;
|
|
};
|
|
|
|
struct sdw_intel {
|
|
struct sdw_cdns cdns;
|
|
int instance;
|
|
struct sdw_intel_link_res *link_res;
|
|
bool startup_done;
|
|
#ifdef CONFIG_DEBUG_FS
|
|
struct dentry *debugfs;
|
|
#endif
|
|
};
|
|
|
|
int intel_link_startup(struct auxiliary_device *auxdev);
|
|
int intel_link_process_wakeen_event(struct auxiliary_device *auxdev);
|
|
|
|
struct sdw_intel_link_dev {
|
|
struct auxiliary_device auxdev;
|
|
struct sdw_intel_link_res link_res;
|
|
};
|
|
|
|
#define auxiliary_dev_to_sdw_intel_link_dev(auxiliary_dev) \
|
|
container_of(auxiliary_dev, struct sdw_intel_link_dev, auxdev)
|
|
|
|
#endif /* __SDW_INTEL_LOCAL_H */
|