1392f1045SVinod Koul /* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */
2392f1045SVinod Koul /* Copyright(c) 2015-17 Intel Corporation. */
371bb8a1bSVinod Koul 
471bb8a1bSVinod Koul #ifndef __SDW_INTEL_H
571bb8a1bSVinod Koul #define __SDW_INTEL_H
671bb8a1bSVinod Koul 
76cd1d670SBard Liao #include <linux/irqreturn.h>
86cd1d670SBard Liao 
971bb8a1bSVinod Koul /**
104b206d34SRander Wang  * struct sdw_intel_stream_params_data: configuration passed during
114b206d34SRander Wang  * the @params_stream callback, e.g. for interaction with DSP
124b206d34SRander Wang  * firmware.
134b206d34SRander Wang  */
144b206d34SRander Wang struct sdw_intel_stream_params_data {
154b206d34SRander Wang 	struct snd_pcm_substream *substream;
164b206d34SRander Wang 	struct snd_soc_dai *dai;
174b206d34SRander Wang 	struct snd_pcm_hw_params *hw_params;
184b206d34SRander Wang 	int link_id;
194b206d34SRander Wang 	int alh_stream_id;
204b206d34SRander Wang };
214b206d34SRander Wang 
224b206d34SRander Wang /**
234b206d34SRander Wang  * struct sdw_intel_stream_free_data: configuration passed during
244b206d34SRander Wang  * the @free_stream callback, e.g. for interaction with DSP
254b206d34SRander Wang  * firmware.
264b206d34SRander Wang  */
274b206d34SRander Wang struct sdw_intel_stream_free_data {
284b206d34SRander Wang 	struct snd_pcm_substream *substream;
294b206d34SRander Wang 	struct snd_soc_dai *dai;
304b206d34SRander Wang 	int link_id;
314b206d34SRander Wang };
324b206d34SRander Wang 
334b206d34SRander Wang /**
34c46302ecSVinod Koul  * struct sdw_intel_ops: Intel audio driver callback ops
35c46302ecSVinod Koul  *
36c46302ecSVinod Koul  */
37c46302ecSVinod Koul struct sdw_intel_ops {
384b206d34SRander Wang 	int (*params_stream)(struct device *dev,
394b206d34SRander Wang 			     struct sdw_intel_stream_params_data *params_data);
404b206d34SRander Wang 	int (*free_stream)(struct device *dev,
414b206d34SRander Wang 			   struct sdw_intel_stream_free_data *free_data);
42c46302ecSVinod Koul };
43c46302ecSVinod Koul 
44c46302ecSVinod Koul /**
45f98f690fSPierre-Louis Bossart  * struct sdw_intel_acpi_info - Soundwire Intel information found in ACPI tables
46f98f690fSPierre-Louis Bossart  * @handle: ACPI controller handle
47f98f690fSPierre-Louis Bossart  * @count: link count found with "sdw-master-count" property
48f98f690fSPierre-Louis Bossart  * @link_mask: bit-wise mask listing links enabled by BIOS menu
49f98f690fSPierre-Louis Bossart  *
50f98f690fSPierre-Louis Bossart  * this structure could be expanded to e.g. provide all the _ADR
51f98f690fSPierre-Louis Bossart  * information in case the link_mask is not sufficient to identify
52f98f690fSPierre-Louis Bossart  * platform capabilities.
53f98f690fSPierre-Louis Bossart  */
54f98f690fSPierre-Louis Bossart struct sdw_intel_acpi_info {
55f98f690fSPierre-Louis Bossart 	acpi_handle handle;
56f98f690fSPierre-Louis Bossart 	int count;
57f98f690fSPierre-Louis Bossart 	u32 link_mask;
58f98f690fSPierre-Louis Bossart };
59f98f690fSPierre-Louis Bossart 
60f98f690fSPierre-Louis Bossart struct sdw_intel_link_res;
61f98f690fSPierre-Louis Bossart 
62f98f690fSPierre-Louis Bossart /**
63f98f690fSPierre-Louis Bossart  * struct sdw_intel_ctx - context allocated by the controller
64f98f690fSPierre-Louis Bossart  * driver probe
65f98f690fSPierre-Louis Bossart  * @count: link count
66f98f690fSPierre-Louis Bossart  * @mmio_base: mmio base of SoundWire registers, only used to check
67f98f690fSPierre-Louis Bossart  * hardware capabilities after all power dependencies are settled.
68f98f690fSPierre-Louis Bossart  * @link_mask: bit-wise mask listing SoundWire links reported by the
69f98f690fSPierre-Louis Bossart  * Controller
70f98f690fSPierre-Louis Bossart  * @handle: ACPI parent handle
71f98f690fSPierre-Louis Bossart  * @links: information for each link (controller-specific and kept
72f98f690fSPierre-Louis Bossart  * opaque here)
73eae0b60dSBard Liao  * @link_list: list to handle interrupts across all links
74f98f690fSPierre-Louis Bossart  */
75f98f690fSPierre-Louis Bossart struct sdw_intel_ctx {
76f98f690fSPierre-Louis Bossart 	int count;
77f98f690fSPierre-Louis Bossart 	void __iomem *mmio_base;
78f98f690fSPierre-Louis Bossart 	u32 link_mask;
79f98f690fSPierre-Louis Bossart 	acpi_handle handle;
80f98f690fSPierre-Louis Bossart 	struct sdw_intel_link_res *links;
81eae0b60dSBard Liao 	struct list_head link_list;
82f98f690fSPierre-Louis Bossart };
83f98f690fSPierre-Louis Bossart 
84f98f690fSPierre-Louis Bossart /**
85f98f690fSPierre-Louis Bossart  * struct sdw_intel_res - Soundwire Intel global resource structure,
86f98f690fSPierre-Louis Bossart  * typically populated by the DSP driver
87f98f690fSPierre-Louis Bossart  *
88f98f690fSPierre-Louis Bossart  * @count: link count
8971bb8a1bSVinod Koul  * @mmio_base: mmio base of SoundWire registers
9071bb8a1bSVinod Koul  * @irq: interrupt number
9171bb8a1bSVinod Koul  * @handle: ACPI parent handle
9271bb8a1bSVinod Koul  * @parent: parent device
93c46302ecSVinod Koul  * @ops: callback ops
94f98f690fSPierre-Louis Bossart  * @dev: device implementing hwparams and free callbacks
95f98f690fSPierre-Louis Bossart  * @link_mask: bit-wise mask listing links selected by the DSP driver
96f98f690fSPierre-Louis Bossart  * This mask may be a subset of the one reported by the controller since
97f98f690fSPierre-Louis Bossart  * machine-specific quirks are handled in the DSP driver.
9871bb8a1bSVinod Koul  */
9971bb8a1bSVinod Koul struct sdw_intel_res {
100f98f690fSPierre-Louis Bossart 	int count;
10171bb8a1bSVinod Koul 	void __iomem *mmio_base;
10271bb8a1bSVinod Koul 	int irq;
10371bb8a1bSVinod Koul 	acpi_handle handle;
10471bb8a1bSVinod Koul 	struct device *parent;
105c46302ecSVinod Koul 	const struct sdw_intel_ops *ops;
106f98f690fSPierre-Louis Bossart 	struct device *dev;
107f98f690fSPierre-Louis Bossart 	u32 link_mask;
10871bb8a1bSVinod Koul };
10971bb8a1bSVinod Koul 
110f98f690fSPierre-Louis Bossart /*
111f98f690fSPierre-Louis Bossart  * On Intel platforms, the SoundWire IP has dependencies on power
112f98f690fSPierre-Louis Bossart  * rails shared with the DSP, and the initialization steps are split
113f98f690fSPierre-Louis Bossart  * in three. First an ACPI scan to check what the firmware describes
114f98f690fSPierre-Louis Bossart  * in DSDT tables, then an allocation step (with no hardware
115f98f690fSPierre-Louis Bossart  * configuration but with all the relevant devices created) and last
116f98f690fSPierre-Louis Bossart  * the actual hardware configuration. The final stage is a global
117f98f690fSPierre-Louis Bossart  * interrupt enable which is controlled by the DSP driver. Splitting
118f98f690fSPierre-Louis Bossart  * these phases helps simplify the boot flow and make early decisions
119f98f690fSPierre-Louis Bossart  * on e.g. which machine driver to select (I2S mode, HDaudio or
120f98f690fSPierre-Louis Bossart  * SoundWire).
121f98f690fSPierre-Louis Bossart  */
122f98f690fSPierre-Louis Bossart int sdw_intel_acpi_scan(acpi_handle *parent_handle,
123f98f690fSPierre-Louis Bossart 			struct sdw_intel_acpi_info *info);
124f98f690fSPierre-Louis Bossart 
125f98f690fSPierre-Louis Bossart struct sdw_intel_ctx *
126f98f690fSPierre-Louis Bossart sdw_intel_probe(struct sdw_intel_res *res);
127f98f690fSPierre-Louis Bossart 
128f98f690fSPierre-Louis Bossart int sdw_intel_startup(struct sdw_intel_ctx *ctx);
129f98f690fSPierre-Louis Bossart 
130f98f690fSPierre-Louis Bossart void sdw_intel_exit(struct sdw_intel_ctx *ctx);
131f98f690fSPierre-Louis Bossart 
132f98f690fSPierre-Louis Bossart void sdw_intel_enable_irq(void __iomem *mmio_base, bool enable);
133d62a7d41SVinod Koul 
1346cd1d670SBard Liao irqreturn_t sdw_intel_thread(int irq, void *dev_id);
1356cd1d670SBard Liao 
13671bb8a1bSVinod Koul #endif
137