xref: /openbmc/linux/sound/soc/intel/skylake/skl-i2s.h (revision 936b9df7)
18e8e69d6SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2bc2bd45bSSriram Periyasamy /*
3bc2bd45bSSriram Periyasamy  *  skl-i2s.h - i2s blob mapping
4bc2bd45bSSriram Periyasamy  *
5bc2bd45bSSriram Periyasamy  *  Copyright (C) 2017 Intel Corp
6bc2bd45bSSriram Periyasamy  *  Author: Subhransu S. Prusty < subhransu.s.prusty@intel.com>
7bc2bd45bSSriram Periyasamy  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8bc2bd45bSSriram Periyasamy  *
9bc2bd45bSSriram Periyasamy  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
10bc2bd45bSSriram Periyasamy  */
11bc2bd45bSSriram Periyasamy 
12bc2bd45bSSriram Periyasamy #ifndef __SOUND_SOC_SKL_I2S_H
13bc2bd45bSSriram Periyasamy #define __SOUND_SOC_SKL_I2S_H
14bc2bd45bSSriram Periyasamy 
15bc2bd45bSSriram Periyasamy #define SKL_I2S_MAX_TIME_SLOTS		8
16bc2bd45bSSriram Periyasamy #define SKL_MCLK_DIV_CLK_SRC_MASK	GENMASK(17, 16)
17bc2bd45bSSriram Periyasamy 
18bc2bd45bSSriram Periyasamy #define SKL_MNDSS_DIV_CLK_SRC_MASK	GENMASK(21, 20)
19bc2bd45bSSriram Periyasamy #define SKL_SHIFT(x)			(ffs(x) - 1)
20bc2bd45bSSriram Periyasamy #define SKL_MCLK_DIV_RATIO_MASK		GENMASK(11, 0)
21bc2bd45bSSriram Periyasamy 
229afbc5ecSSriram Periyasamy #define is_legacy_blob(x) (x.signature != 0xEE)
239afbc5ecSSriram Periyasamy #define ext_to_legacy_blob(i2s_config_blob_ext) \
249afbc5ecSSriram Periyasamy 	((struct skl_i2s_config_blob_legacy *) i2s_config_blob_ext)
259afbc5ecSSriram Periyasamy 
269afbc5ecSSriram Periyasamy #define get_clk_src(mclk, mask) \
279afbc5ecSSriram Periyasamy 		((mclk.mdivctrl & mask) >> SKL_SHIFT(mask))
28bc2bd45bSSriram Periyasamy struct skl_i2s_config {
29bc2bd45bSSriram Periyasamy 	u32 ssc0;
30bc2bd45bSSriram Periyasamy 	u32 ssc1;
31bc2bd45bSSriram Periyasamy 	u32 sscto;
32bc2bd45bSSriram Periyasamy 	u32 sspsp;
33bc2bd45bSSriram Periyasamy 	u32 sstsa;
34bc2bd45bSSriram Periyasamy 	u32 ssrsa;
35bc2bd45bSSriram Periyasamy 	u32 ssc2;
36bc2bd45bSSriram Periyasamy 	u32 sspsp2;
37bc2bd45bSSriram Periyasamy 	u32 ssc3;
38bc2bd45bSSriram Periyasamy 	u32 ssioc;
39bc2bd45bSSriram Periyasamy } __packed;
40bc2bd45bSSriram Periyasamy 
41bc2bd45bSSriram Periyasamy struct skl_i2s_config_mclk {
42bc2bd45bSSriram Periyasamy 	u32 mdivctrl;
43bc2bd45bSSriram Periyasamy 	u32 mdivr;
44bc2bd45bSSriram Periyasamy };
45bc2bd45bSSriram Periyasamy 
469afbc5ecSSriram Periyasamy struct skl_i2s_config_mclk_ext {
479afbc5ecSSriram Periyasamy 	u32 mdivctrl;
489afbc5ecSSriram Periyasamy 	u32 mdivr_count;
49936b9df7SGustavo A. R. Silva 	u32 mdivr[];
509afbc5ecSSriram Periyasamy } __packed;
519afbc5ecSSriram Periyasamy 
529afbc5ecSSriram Periyasamy struct skl_i2s_config_blob_signature {
539afbc5ecSSriram Periyasamy 	u32 minor_ver : 8;
549afbc5ecSSriram Periyasamy 	u32 major_ver : 8;
559afbc5ecSSriram Periyasamy 	u32 resvdz : 8;
569afbc5ecSSriram Periyasamy 	u32 signature : 8;
579afbc5ecSSriram Periyasamy } __packed;
589afbc5ecSSriram Periyasamy 
599afbc5ecSSriram Periyasamy struct skl_i2s_config_blob_header {
609afbc5ecSSriram Periyasamy 	struct skl_i2s_config_blob_signature sig;
619afbc5ecSSriram Periyasamy 	u32 size;
629afbc5ecSSriram Periyasamy };
639afbc5ecSSriram Periyasamy 
64bc2bd45bSSriram Periyasamy /**
65bc2bd45bSSriram Periyasamy  * struct skl_i2s_config_blob_legacy - Structure defines I2S Gateway
66bc2bd45bSSriram Periyasamy  * configuration legacy blob
67bc2bd45bSSriram Periyasamy  *
68bc2bd45bSSriram Periyasamy  * @gtw_attr:		Gateway attribute for the I2S Gateway
69bc2bd45bSSriram Periyasamy  * @tdm_ts_group:	TDM slot mapping against channels in the Gateway.
70bc2bd45bSSriram Periyasamy  * @i2s_cfg:		I2S HW registers
71bc2bd45bSSriram Periyasamy  * @mclk:		MCLK clock source and divider values
72bc2bd45bSSriram Periyasamy  */
73bc2bd45bSSriram Periyasamy struct skl_i2s_config_blob_legacy {
74bc2bd45bSSriram Periyasamy 	u32 gtw_attr;
75bc2bd45bSSriram Periyasamy 	u32 tdm_ts_group[SKL_I2S_MAX_TIME_SLOTS];
76bc2bd45bSSriram Periyasamy 	struct skl_i2s_config i2s_cfg;
77bc2bd45bSSriram Periyasamy 	struct skl_i2s_config_mclk mclk;
78bc2bd45bSSriram Periyasamy };
79bc2bd45bSSriram Periyasamy 
809afbc5ecSSriram Periyasamy struct skl_i2s_config_blob_ext {
819afbc5ecSSriram Periyasamy 	u32 gtw_attr;
829afbc5ecSSriram Periyasamy 	struct skl_i2s_config_blob_header hdr;
839afbc5ecSSriram Periyasamy 	u32 tdm_ts_group[SKL_I2S_MAX_TIME_SLOTS];
849afbc5ecSSriram Periyasamy 	struct skl_i2s_config i2s_cfg;
859afbc5ecSSriram Periyasamy 	struct skl_i2s_config_mclk_ext mclk;
869afbc5ecSSriram Periyasamy } __packed;
87bc2bd45bSSriram Periyasamy #endif /* __SOUND_SOC_SKL_I2S_H */
88