162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  skl-ssp-clk.h - Skylake ssp clock information and ipc structure
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *  Copyright (C) 2017 Intel Corp
662306a36Sopenharmony_ci *  Author: Jaikrishna Nemallapudi <jaikrishnax.nemallapudi@intel.com>
762306a36Sopenharmony_ci *  Author: Subhransu S. Prusty <subhransu.s.prusty@intel.com>
862306a36Sopenharmony_ci *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
962306a36Sopenharmony_ci *
1062306a36Sopenharmony_ci * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1162306a36Sopenharmony_ci */
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#ifndef SOUND_SOC_SKL_SSP_CLK_H
1462306a36Sopenharmony_ci#define SOUND_SOC_SKL_SSP_CLK_H
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#define SKL_MAX_SSP		6
1762306a36Sopenharmony_ci/* xtal/cardinal/pll, parent of ssp clocks and mclk */
1862306a36Sopenharmony_ci#define SKL_MAX_CLK_SRC		3
1962306a36Sopenharmony_ci#define SKL_MAX_SSP_CLK_TYPES	3 /* mclk, sclk, sclkfs */
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci#define SKL_MAX_CLK_CNT		(SKL_MAX_SSP * SKL_MAX_SSP_CLK_TYPES)
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci/* Max number of configurations supported for each clock */
2462306a36Sopenharmony_ci#define SKL_MAX_CLK_RATES	10
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci#define SKL_SCLK_OFS		SKL_MAX_SSP
2762306a36Sopenharmony_ci#define SKL_SCLKFS_OFS		(SKL_SCLK_OFS + SKL_MAX_SSP)
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cienum skl_clk_type {
3062306a36Sopenharmony_ci	SKL_MCLK,
3162306a36Sopenharmony_ci	SKL_SCLK,
3262306a36Sopenharmony_ci	SKL_SCLK_FS,
3362306a36Sopenharmony_ci};
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_cienum skl_clk_src_type {
3662306a36Sopenharmony_ci	SKL_XTAL,
3762306a36Sopenharmony_ci	SKL_CARDINAL,
3862306a36Sopenharmony_ci	SKL_PLL,
3962306a36Sopenharmony_ci};
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_cistruct skl_clk_parent_src {
4262306a36Sopenharmony_ci	u8 clk_id;
4362306a36Sopenharmony_ci	const char *name;
4462306a36Sopenharmony_ci	unsigned long rate;
4562306a36Sopenharmony_ci	const char *parent_name;
4662306a36Sopenharmony_ci};
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_cistruct skl_tlv_hdr {
4962306a36Sopenharmony_ci	u32 type;
5062306a36Sopenharmony_ci	u32 size;
5162306a36Sopenharmony_ci};
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cistruct skl_dmactrl_mclk_cfg {
5462306a36Sopenharmony_ci	struct skl_tlv_hdr hdr;
5562306a36Sopenharmony_ci	/* DMA Clk TLV params */
5662306a36Sopenharmony_ci	u32 clk_warm_up:16;
5762306a36Sopenharmony_ci	u32 mclk:1;
5862306a36Sopenharmony_ci	u32 warm_up_over:1;
5962306a36Sopenharmony_ci	u32 rsvd0:14;
6062306a36Sopenharmony_ci	u32 clk_stop_delay:16;
6162306a36Sopenharmony_ci	u32 keep_running:1;
6262306a36Sopenharmony_ci	u32 clk_stop_over:1;
6362306a36Sopenharmony_ci	u32 rsvd1:14;
6462306a36Sopenharmony_ci};
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_cistruct skl_dmactrl_sclkfs_cfg {
6762306a36Sopenharmony_ci	struct skl_tlv_hdr hdr;
6862306a36Sopenharmony_ci	/* DMA SClk&FS  TLV params */
6962306a36Sopenharmony_ci	u32 sampling_frequency;
7062306a36Sopenharmony_ci	u32 bit_depth;
7162306a36Sopenharmony_ci	u32 channel_map;
7262306a36Sopenharmony_ci	u32 channel_config;
7362306a36Sopenharmony_ci	u32 interleaving_style;
7462306a36Sopenharmony_ci	u32 number_of_channels : 8;
7562306a36Sopenharmony_ci	u32 valid_bit_depth : 8;
7662306a36Sopenharmony_ci	u32 sample_type : 8;
7762306a36Sopenharmony_ci	u32 reserved : 8;
7862306a36Sopenharmony_ci};
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ciunion skl_clk_ctrl_ipc {
8162306a36Sopenharmony_ci	struct skl_dmactrl_mclk_cfg mclk;
8262306a36Sopenharmony_ci	struct skl_dmactrl_sclkfs_cfg sclk_fs;
8362306a36Sopenharmony_ci};
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_cistruct skl_clk_rate_cfg_table {
8662306a36Sopenharmony_ci	unsigned long rate;
8762306a36Sopenharmony_ci	union skl_clk_ctrl_ipc dma_ctl_ipc;
8862306a36Sopenharmony_ci	void *config;
8962306a36Sopenharmony_ci};
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci/*
9262306a36Sopenharmony_ci * rate for mclk will be in rates[0]. For sclk and sclkfs, rates[] store
9362306a36Sopenharmony_ci * all possible clocks ssp can generate for that platform.
9462306a36Sopenharmony_ci */
9562306a36Sopenharmony_cistruct skl_ssp_clk {
9662306a36Sopenharmony_ci	const char *name;
9762306a36Sopenharmony_ci	const char *parent_name;
9862306a36Sopenharmony_ci	struct skl_clk_rate_cfg_table rate_cfg[SKL_MAX_CLK_RATES];
9962306a36Sopenharmony_ci};
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_cistruct skl_clk_pdata {
10262306a36Sopenharmony_ci	struct skl_clk_parent_src *parent_clks;
10362306a36Sopenharmony_ci	int num_clks;
10462306a36Sopenharmony_ci	struct skl_ssp_clk *ssp_clks;
10562306a36Sopenharmony_ci	void *pvt_data;
10662306a36Sopenharmony_ci};
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci#endif /* SOUND_SOC_SKL_SSP_CLK_H */
109