162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  skl.h - HD Audio skylake definitions.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *  Copyright (C) 2015 Intel Corp
662306a36Sopenharmony_ci *  Author: Jeeja KP <jeeja.kp@intel.com>
762306a36Sopenharmony_ci *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#ifndef __SOUND_SOC_SKL_H
1362306a36Sopenharmony_ci#define __SOUND_SOC_SKL_H
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include <sound/hda_register.h>
1662306a36Sopenharmony_ci#include <sound/hdaudio_ext.h>
1762306a36Sopenharmony_ci#include <sound/hda_codec.h>
1862306a36Sopenharmony_ci#include <sound/soc.h>
1962306a36Sopenharmony_ci#include "skl-ssp-clk.h"
2062306a36Sopenharmony_ci#include "skl-sst-ipc.h"
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#define SKL_SUSPEND_DELAY 2000
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#define SKL_MAX_ASTATE_CFG		3
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci#define AZX_PCIREG_PGCTL		0x44
2762306a36Sopenharmony_ci#define AZX_PGCTL_LSRMD_MASK		(1 << 4)
2862306a36Sopenharmony_ci#define AZX_PGCTL_ADSPPGD		BIT(2)
2962306a36Sopenharmony_ci#define AZX_PCIREG_CGCTL		0x48
3062306a36Sopenharmony_ci#define AZX_CGCTL_MISCBDCGE_MASK	(1 << 6)
3162306a36Sopenharmony_ci#define AZX_CGCTL_ADSPDCGE		BIT(1)
3262306a36Sopenharmony_ci/* D0I3C Register fields */
3362306a36Sopenharmony_ci#define AZX_REG_VS_D0I3C_CIP      0x1 /* Command in progress */
3462306a36Sopenharmony_ci#define AZX_REG_VS_D0I3C_I3       0x4 /* D0i3 enable */
3562306a36Sopenharmony_ci#define SKL_MAX_DMACTRL_CFG	18
3662306a36Sopenharmony_ci#define DMA_CLK_CONTROLS	1
3762306a36Sopenharmony_ci#define DMA_TRANSMITION_START	2
3862306a36Sopenharmony_ci#define DMA_TRANSMITION_STOP	3
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci#define AZX_VS_EM2_DUM			BIT(23)
4162306a36Sopenharmony_ci#define AZX_REG_VS_EM2_L1SEN		BIT(13)
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_cistruct skl_debug;
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cistruct skl_astate_param {
4662306a36Sopenharmony_ci	u32 kcps;
4762306a36Sopenharmony_ci	u32 clk_src;
4862306a36Sopenharmony_ci};
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_cistruct skl_astate_config {
5162306a36Sopenharmony_ci	u32 count;
5262306a36Sopenharmony_ci	struct skl_astate_param astate_table[];
5362306a36Sopenharmony_ci};
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cistruct skl_fw_config {
5662306a36Sopenharmony_ci	struct skl_astate_config *astate_cfg;
5762306a36Sopenharmony_ci};
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_cistruct skl_dev {
6062306a36Sopenharmony_ci	struct hda_bus hbus;
6162306a36Sopenharmony_ci	struct pci_dev *pci;
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci	unsigned int init_done:1; /* delayed init status */
6462306a36Sopenharmony_ci	struct platform_device *dmic_dev;
6562306a36Sopenharmony_ci	struct platform_device *i2s_dev;
6662306a36Sopenharmony_ci	struct platform_device *clk_dev;
6762306a36Sopenharmony_ci	struct snd_soc_component *component;
6862306a36Sopenharmony_ci	struct snd_soc_dai_driver *dais;
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci	struct nhlt_acpi_table *nhlt; /* nhlt ptr */
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci	struct list_head ppl_list;
7362306a36Sopenharmony_ci	struct list_head bind_list;
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci	const char *fw_name;
7662306a36Sopenharmony_ci	char tplg_name[64];
7762306a36Sopenharmony_ci	unsigned short pci_id;
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci	int supend_active;
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci	struct work_struct probe_work;
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci	struct skl_debug *debugfs;
8462306a36Sopenharmony_ci	u8 nr_modules;
8562306a36Sopenharmony_ci	struct skl_module **modules;
8662306a36Sopenharmony_ci	bool use_tplg_pcm;
8762306a36Sopenharmony_ci	struct skl_fw_config cfg;
8862306a36Sopenharmony_ci	struct snd_soc_acpi_mach *mach;
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci	struct device *dev;
9162306a36Sopenharmony_ci	struct sst_dsp *dsp;
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci	/* boot */
9462306a36Sopenharmony_ci	wait_queue_head_t boot_wait;
9562306a36Sopenharmony_ci	bool boot_complete;
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci	/* module load */
9862306a36Sopenharmony_ci	wait_queue_head_t mod_load_wait;
9962306a36Sopenharmony_ci	bool mod_load_complete;
10062306a36Sopenharmony_ci	bool mod_load_status;
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci	/* IPC messaging */
10362306a36Sopenharmony_ci	struct sst_generic_ipc ipc;
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci	/* callback for miscbdge */
10662306a36Sopenharmony_ci	void (*enable_miscbdcge)(struct device *dev, bool enable);
10762306a36Sopenharmony_ci	/* Is CGCTL.MISCBDCGE disabled */
10862306a36Sopenharmony_ci	bool miscbdcg_disabled;
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci	/* Populate module information */
11162306a36Sopenharmony_ci	struct list_head uuid_list;
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci	/* Is firmware loaded */
11462306a36Sopenharmony_ci	bool fw_loaded;
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci	/* first boot ? */
11762306a36Sopenharmony_ci	bool is_first_boot;
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci	/* multi-core */
12062306a36Sopenharmony_ci	struct skl_dsp_cores cores;
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci	/* library info */
12362306a36Sopenharmony_ci	struct skl_lib_info  lib_info[SKL_MAX_LIB];
12462306a36Sopenharmony_ci	int lib_count;
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci	/* Callback to update D0i3C register */
12762306a36Sopenharmony_ci	void (*update_d0i3c)(struct device *dev, bool enable);
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci	struct skl_d0i3_data d0i3;
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci	const struct skl_dsp_ops *dsp_ops;
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci	/* Callback to update dynamic clock and power gating registers */
13462306a36Sopenharmony_ci	void (*clock_power_gating)(struct device *dev, bool enable);
13562306a36Sopenharmony_ci};
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci#define skl_to_bus(s)  (&(s)->hbus.core)
13862306a36Sopenharmony_ci#define bus_to_skl(bus) container_of(bus, struct skl_dev, hbus.core)
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci#define skl_to_hbus(s) (&(s)->hbus)
14162306a36Sopenharmony_ci#define hbus_to_skl(hbus) container_of((hbus), struct skl_dev, (hbus))
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci/* to pass dai dma data */
14462306a36Sopenharmony_cistruct skl_dma_params {
14562306a36Sopenharmony_ci	u32 format;
14662306a36Sopenharmony_ci	u8 stream_tag;
14762306a36Sopenharmony_ci};
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_cistruct skl_machine_pdata {
15062306a36Sopenharmony_ci	bool use_tplg_pcm; /* use dais and dai links from topology */
15162306a36Sopenharmony_ci};
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_cistruct skl_dsp_ops {
15462306a36Sopenharmony_ci	int id;
15562306a36Sopenharmony_ci	unsigned int num_cores;
15662306a36Sopenharmony_ci	struct skl_dsp_loader_ops (*loader_ops)(void);
15762306a36Sopenharmony_ci	int (*init)(struct device *dev, void __iomem *mmio_base,
15862306a36Sopenharmony_ci			int irq, const char *fw_name,
15962306a36Sopenharmony_ci			struct skl_dsp_loader_ops loader_ops,
16062306a36Sopenharmony_ci			struct skl_dev **skl_sst);
16162306a36Sopenharmony_ci	int (*init_fw)(struct device *dev, struct skl_dev *skl);
16262306a36Sopenharmony_ci	void (*cleanup)(struct device *dev, struct skl_dev *skl);
16362306a36Sopenharmony_ci};
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ciint skl_platform_unregister(struct device *dev);
16662306a36Sopenharmony_ciint skl_platform_register(struct device *dev);
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ciint skl_nhlt_update_topology_bin(struct skl_dev *skl);
16962306a36Sopenharmony_ciint skl_init_dsp(struct skl_dev *skl);
17062306a36Sopenharmony_ciint skl_free_dsp(struct skl_dev *skl);
17162306a36Sopenharmony_ciint skl_suspend_late_dsp(struct skl_dev *skl);
17262306a36Sopenharmony_ciint skl_suspend_dsp(struct skl_dev *skl);
17362306a36Sopenharmony_ciint skl_resume_dsp(struct skl_dev *skl);
17462306a36Sopenharmony_civoid skl_cleanup_resources(struct skl_dev *skl);
17562306a36Sopenharmony_ciconst struct skl_dsp_ops *skl_get_dsp_ops(int pci_id);
17662306a36Sopenharmony_civoid skl_update_d0i3c(struct device *dev, bool enable);
17762306a36Sopenharmony_ciint skl_nhlt_create_sysfs(struct skl_dev *skl);
17862306a36Sopenharmony_civoid skl_nhlt_remove_sysfs(struct skl_dev *skl);
17962306a36Sopenharmony_civoid skl_get_clks(struct skl_dev *skl, struct skl_ssp_clk *ssp_clks);
18062306a36Sopenharmony_cistruct skl_clk_parent_src *skl_get_parent_clk(u8 clk_id);
18162306a36Sopenharmony_ciint skl_dsp_set_dma_control(struct skl_dev *skl, u32 *caps,
18262306a36Sopenharmony_ci				u32 caps_size, u32 node_id);
18362306a36Sopenharmony_ci
18462306a36Sopenharmony_cistruct skl_module_cfg;
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ci#ifdef CONFIG_DEBUG_FS
18762306a36Sopenharmony_cistruct skl_debug *skl_debugfs_init(struct skl_dev *skl);
18862306a36Sopenharmony_civoid skl_debugfs_exit(struct skl_dev *skl);
18962306a36Sopenharmony_civoid skl_debug_init_module(struct skl_debug *d,
19062306a36Sopenharmony_ci			struct snd_soc_dapm_widget *w,
19162306a36Sopenharmony_ci			struct skl_module_cfg *mconfig);
19262306a36Sopenharmony_ci#else
19362306a36Sopenharmony_cistatic inline struct skl_debug *skl_debugfs_init(struct skl_dev *skl)
19462306a36Sopenharmony_ci{
19562306a36Sopenharmony_ci	return NULL;
19662306a36Sopenharmony_ci}
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_cistatic inline void skl_debugfs_exit(struct skl_dev *skl)
19962306a36Sopenharmony_ci{}
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_cistatic inline void skl_debug_init_module(struct skl_debug *d,
20262306a36Sopenharmony_ci					 struct snd_soc_dapm_widget *w,
20362306a36Sopenharmony_ci					 struct skl_module_cfg *mconfig)
20462306a36Sopenharmony_ci{}
20562306a36Sopenharmony_ci#endif
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_ci#endif /* __SOUND_SOC_SKL_H */
208