GNU Linux-libre 4.19.286-gnu1
[releases.git] / sound / soc / intel / skylake / skl-ssp-clk.h
1 /*
2  *  skl-ssp-clk.h - Skylake ssp clock information and ipc structure
3  *
4  *  Copyright (C) 2017 Intel Corp
5  *  Author: Jaikrishna Nemallapudi <jaikrishnax.nemallapudi@intel.com>
6  *  Author: Subhransu S. Prusty <subhransu.s.prusty@intel.com>
7  *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8  *
9  *  This program is free software; you can redistribute it and/or modify
10  *  it under the terms of the GNU General Public License as published by
11  *  the Free Software Foundation; version 2 of the License.
12  *
13  *  This program is distributed in the hope that it will be useful, but
14  *  WITHOUT ANY WARRANTY; without even the implied warranty of
15  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  *  General Public License for more details.
17  *
18  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
19  *
20  */
21
22 #ifndef SOUND_SOC_SKL_SSP_CLK_H
23 #define SOUND_SOC_SKL_SSP_CLK_H
24
25 #define SKL_MAX_SSP             6
26 /* xtal/cardinal/pll, parent of ssp clocks and mclk */
27 #define SKL_MAX_CLK_SRC         3
28 #define SKL_MAX_SSP_CLK_TYPES   3 /* mclk, sclk, sclkfs */
29
30 #define SKL_MAX_CLK_CNT         (SKL_MAX_SSP * SKL_MAX_SSP_CLK_TYPES)
31
32 /* Max number of configurations supported for each clock */
33 #define SKL_MAX_CLK_RATES       10
34
35 #define SKL_SCLK_OFS            SKL_MAX_SSP
36 #define SKL_SCLKFS_OFS          (SKL_SCLK_OFS + SKL_MAX_SSP)
37
38 enum skl_clk_type {
39         SKL_MCLK,
40         SKL_SCLK,
41         SKL_SCLK_FS,
42 };
43
44 enum skl_clk_src_type {
45         SKL_XTAL,
46         SKL_CARDINAL,
47         SKL_PLL,
48 };
49
50 struct skl_clk_parent_src {
51         u8 clk_id;
52         const char *name;
53         unsigned long rate;
54         const char *parent_name;
55 };
56
57 struct skl_tlv_hdr {
58         u32 type;
59         u32 size;
60 };
61
62 struct skl_dmactrl_mclk_cfg {
63         struct skl_tlv_hdr hdr;
64         /* DMA Clk TLV params */
65         u32 clk_warm_up:16;
66         u32 mclk:1;
67         u32 warm_up_over:1;
68         u32 rsvd0:14;
69         u32 clk_stop_delay:16;
70         u32 keep_running:1;
71         u32 clk_stop_over:1;
72         u32 rsvd1:14;
73 };
74
75 struct skl_dmactrl_sclkfs_cfg {
76         struct skl_tlv_hdr hdr;
77         /* DMA SClk&FS  TLV params */
78         u32 sampling_frequency;
79         u32 bit_depth;
80         u32 channel_map;
81         u32 channel_config;
82         u32 interleaving_style;
83         u32 number_of_channels : 8;
84         u32 valid_bit_depth : 8;
85         u32 sample_type : 8;
86         u32 reserved : 8;
87 };
88
89 union skl_clk_ctrl_ipc {
90         struct skl_dmactrl_mclk_cfg mclk;
91         struct skl_dmactrl_sclkfs_cfg sclk_fs;
92 };
93
94 struct skl_clk_rate_cfg_table {
95         unsigned long rate;
96         union skl_clk_ctrl_ipc dma_ctl_ipc;
97         void *config;
98 };
99
100 /*
101  * rate for mclk will be in rates[0]. For sclk and sclkfs, rates[] store
102  * all possible clocks ssp can generate for that platform.
103  */
104 struct skl_ssp_clk {
105         const char *name;
106         const char *parent_name;
107         struct skl_clk_rate_cfg_table rate_cfg[SKL_MAX_CLK_RATES];
108 };
109
110 struct skl_clk_pdata {
111         struct skl_clk_parent_src *parent_clks;
112         int num_clks;
113         struct skl_ssp_clk *ssp_clks;
114         void *pvt_data;
115 };
116
117 #endif /* SOUND_SOC_SKL_SSP_CLK_H */