1d8f48fbdSVijendar Mukunda /* SPDX-License-Identifier: GPL-2.0+ */
2d8f48fbdSVijendar Mukunda /*
3d8f48fbdSVijendar Mukunda  * Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.
4d8f48fbdSVijendar Mukunda  */
5d8f48fbdSVijendar Mukunda 
6d8f48fbdSVijendar Mukunda #ifndef __SDW_AMD_H
7d8f48fbdSVijendar Mukunda #define __SDW_AMD_H
8d8f48fbdSVijendar Mukunda 
9d8f48fbdSVijendar Mukunda #include <linux/soundwire/sdw.h>
10d8f48fbdSVijendar Mukunda 
11*81ff58ffSVijendar Mukunda /* AMD pm_runtime quirk definitions */
12*81ff58ffSVijendar Mukunda 
13*81ff58ffSVijendar Mukunda /*
14*81ff58ffSVijendar Mukunda  * Force the clock to stop(ClockStopMode0) when suspend callback
15*81ff58ffSVijendar Mukunda  * is invoked.
16*81ff58ffSVijendar Mukunda  */
17*81ff58ffSVijendar Mukunda #define AMD_SDW_CLK_STOP_MODE		1
18*81ff58ffSVijendar Mukunda 
19*81ff58ffSVijendar Mukunda /*
20*81ff58ffSVijendar Mukunda  * Stop the bus when runtime suspend/system level suspend callback
21*81ff58ffSVijendar Mukunda  * is invoked. If set, a complete bus reset and re-enumeration will
22*81ff58ffSVijendar Mukunda  * be performed when the bus restarts. In-band wake interrupts are
23*81ff58ffSVijendar Mukunda  * not supported in this mode.
24*81ff58ffSVijendar Mukunda  */
25*81ff58ffSVijendar Mukunda #define AMD_SDW_POWER_OFF_MODE		2
26d8f48fbdSVijendar Mukunda #define ACP_SDW0	0
27d8f48fbdSVijendar Mukunda #define ACP_SDW1	1
28d8f48fbdSVijendar Mukunda 
29d8f48fbdSVijendar Mukunda struct acp_sdw_pdata {
30d8f48fbdSVijendar Mukunda 	u16 instance;
31d8f48fbdSVijendar Mukunda 	/* mutex to protect acp common register access */
32d8f48fbdSVijendar Mukunda 	struct mutex *acp_sdw_lock;
33d8f48fbdSVijendar Mukunda };
34d8f48fbdSVijendar Mukunda 
35d8f48fbdSVijendar Mukunda struct sdw_manager_reg_mask {
36d8f48fbdSVijendar Mukunda 	u32 sw_pad_enable_mask;
37d8f48fbdSVijendar Mukunda 	u32 sw_pad_pulldown_mask;
38d8f48fbdSVijendar Mukunda 	u32 acp_sdw_intr_mask;
39d8f48fbdSVijendar Mukunda };
40d8f48fbdSVijendar Mukunda 
41d8f48fbdSVijendar Mukunda /**
422b13596fSVijendar Mukunda  * struct sdw_amd_dai_runtime: AMD sdw dai runtime  data
432b13596fSVijendar Mukunda  *
442b13596fSVijendar Mukunda  * @name: SoundWire stream name
452b13596fSVijendar Mukunda  * @stream: stream runtime
462b13596fSVijendar Mukunda  * @bus: Bus handle
472b13596fSVijendar Mukunda  * @stream_type: Stream type
482b13596fSVijendar Mukunda  */
492b13596fSVijendar Mukunda struct sdw_amd_dai_runtime {
502b13596fSVijendar Mukunda 	char *name;
512b13596fSVijendar Mukunda 	struct sdw_stream_runtime *stream;
522b13596fSVijendar Mukunda 	struct sdw_bus *bus;
532b13596fSVijendar Mukunda 	enum sdw_stream_type stream_type;
542b13596fSVijendar Mukunda };
552b13596fSVijendar Mukunda 
562b13596fSVijendar Mukunda /**
57d8f48fbdSVijendar Mukunda  * struct amd_sdw_manager - amd manager driver context
58d8f48fbdSVijendar Mukunda  * @bus: bus handle
59d8f48fbdSVijendar Mukunda  * @dev: linux device
60d8f48fbdSVijendar Mukunda  * @mmio: SoundWire registers mmio base
61d8f48fbdSVijendar Mukunda  * @acp_mmio: acp registers mmio base
62d8f48fbdSVijendar Mukunda  * @reg_mask: register mask structure per manager instance
6365f93e40SVijendar Mukunda  * @amd_sdw_irq_thread: SoundWire manager irq workqueue
6465f93e40SVijendar Mukunda  * @amd_sdw_work: peripheral status work queue
65d8f48fbdSVijendar Mukunda  * @probe_work: SoundWire manager probe workqueue
66d8f48fbdSVijendar Mukunda  * @acp_sdw_lock: mutex to protect acp share register access
6765f93e40SVijendar Mukunda  * @status: peripheral devices status array
68d8f48fbdSVijendar Mukunda  * @num_din_ports: number of input ports
69d8f48fbdSVijendar Mukunda  * @num_dout_ports: number of output ports
70d8f48fbdSVijendar Mukunda  * @cols_index: Column index in frame shape
71d8f48fbdSVijendar Mukunda  * @rows_index: Rows index in frame shape
72d8f48fbdSVijendar Mukunda  * @instance: SoundWire manager instance
73d8f48fbdSVijendar Mukunda  * @quirks: SoundWire manager quirks
74d8f48fbdSVijendar Mukunda  * @wake_en_mask: wake enable mask per SoundWire manager
75*81ff58ffSVijendar Mukunda  * @clk_stopped: flag set to true when clock is stopped
76d8f48fbdSVijendar Mukunda  * @power_mode_mask: flag interprets amd SoundWire manager power mode
772b13596fSVijendar Mukunda  * @dai_runtime_array: dai runtime array
78d8f48fbdSVijendar Mukunda  */
79d8f48fbdSVijendar Mukunda struct amd_sdw_manager {
80d8f48fbdSVijendar Mukunda 	struct sdw_bus bus;
81d8f48fbdSVijendar Mukunda 	struct device *dev;
82d8f48fbdSVijendar Mukunda 
83d8f48fbdSVijendar Mukunda 	void __iomem *mmio;
84d8f48fbdSVijendar Mukunda 	void __iomem *acp_mmio;
85d8f48fbdSVijendar Mukunda 
86d8f48fbdSVijendar Mukunda 	struct sdw_manager_reg_mask *reg_mask;
8765f93e40SVijendar Mukunda 	struct work_struct amd_sdw_irq_thread;
8865f93e40SVijendar Mukunda 	struct work_struct amd_sdw_work;
89d8f48fbdSVijendar Mukunda 	struct work_struct probe_work;
90d8f48fbdSVijendar Mukunda 	/* mutex to protect acp common register access */
91d8f48fbdSVijendar Mukunda 	struct mutex *acp_sdw_lock;
92d8f48fbdSVijendar Mukunda 
9365f93e40SVijendar Mukunda 	enum sdw_slave_status status[SDW_MAX_DEVICES + 1];
9465f93e40SVijendar Mukunda 
95d8f48fbdSVijendar Mukunda 	int num_din_ports;
96d8f48fbdSVijendar Mukunda 	int num_dout_ports;
97d8f48fbdSVijendar Mukunda 
98d8f48fbdSVijendar Mukunda 	int cols_index;
99d8f48fbdSVijendar Mukunda 	int rows_index;
100d8f48fbdSVijendar Mukunda 
101d8f48fbdSVijendar Mukunda 	u32 instance;
102d8f48fbdSVijendar Mukunda 	u32 quirks;
103d8f48fbdSVijendar Mukunda 	u32 wake_en_mask;
104d8f48fbdSVijendar Mukunda 	u32 power_mode_mask;
105*81ff58ffSVijendar Mukunda 	bool clk_stopped;
1062b13596fSVijendar Mukunda 
1072b13596fSVijendar Mukunda 	struct sdw_amd_dai_runtime **dai_runtime_array;
108d8f48fbdSVijendar Mukunda };
109d8f48fbdSVijendar Mukunda #endif
110