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