Lines Matching +full:mclk +full:- +full:fs

1 // SPDX-License-Identifier: GPL-2.0-only
3 * skl-nhlt.c - Intel SKL Platform NHLT parsing
12 #include <sound/intel-nhlt.h>
14 #include "skl-i2s.h"
22 struct nhlt_fmt_cfg *fmt_config = fmt->fmt_config; in skl_get_specific_cfg()
25 dev_dbg(dev, "Format count =%d\n", fmt->fmt_count); in skl_get_specific_cfg()
27 for (i = 0; i < fmt->fmt_count; i++) { in skl_get_specific_cfg()
28 wfmt = &fmt_config->fmt_ext.fmt; in skl_get_specific_cfg()
29 dev_dbg(dev, "ch=%d fmt=%d s_rate=%d\n", wfmt->channels, in skl_get_specific_cfg()
30 wfmt->bits_per_sample, wfmt->samples_per_sec); in skl_get_specific_cfg()
31 if (wfmt->channels == no_ch && wfmt->bits_per_sample == bps) { in skl_get_specific_cfg()
36 sp_config = &fmt_config->config; in skl_get_specific_cfg()
40 if (wfmt->samples_per_sec == rate) in skl_get_specific_cfg()
44 fmt_config = (struct nhlt_fmt_cfg *)(fmt_config->config.caps + in skl_get_specific_cfg()
45 fmt_config->config.size); in skl_get_specific_cfg()
64 epnt->virtual_bus_id, epnt->linktype, in skl_check_ep_match()
65 epnt->direction, epnt->device_type); in skl_check_ep_match()
67 if ((epnt->virtual_bus_id == instance_id) && in skl_check_ep_match()
68 (epnt->linktype == link_type) && in skl_check_ep_match()
69 (epnt->direction == dirn)) { in skl_check_ep_match()
71 if (epnt->linktype == NHLT_LINK_DMIC) in skl_check_ep_match()
74 if (epnt->device_type == dev_type) in skl_check_ep_match()
89 struct device *dev = bus->dev; in skl_get_ep_blob()
91 struct nhlt_acpi_table *nhlt = skl->nhlt; in skl_get_ep_blob()
97 epnt = (struct nhlt_endpoint *)nhlt->desc; in skl_get_ep_blob()
99 dev_dbg(dev, "endpoint count =%d\n", nhlt->endpoint_count); in skl_get_ep_blob()
101 for (j = 0; j < nhlt->endpoint_count; j++) { in skl_get_ep_blob()
104 fmt = (struct nhlt_fmt *)(epnt->config.caps + in skl_get_ep_blob()
105 epnt->config.size); in skl_get_ep_blob()
112 epnt = (struct nhlt_endpoint *)((u8 *)epnt + epnt->length); in skl_get_ep_blob()
135 struct nhlt_acpi_table *nhlt = (struct nhlt_acpi_table *)skl->nhlt; in skl_nhlt_update_topology_bin()
137 struct device *dev = bus->dev; in skl_nhlt_update_topology_bin()
140 nhlt->header.oem_id, nhlt->header.oem_table_id, in skl_nhlt_update_topology_bin()
141 nhlt->header.oem_revision); in skl_nhlt_update_topology_bin()
143 snprintf(skl->tplg_name, sizeof(skl->tplg_name), "%x-%.6s-%.8s-%d%s", in skl_nhlt_update_topology_bin()
144 skl->pci_id, nhlt->header.oem_id, nhlt->header.oem_table_id, in skl_nhlt_update_topology_bin()
145 nhlt->header.oem_revision, "-tplg.bin"); in skl_nhlt_update_topology_bin()
147 skl_nhlt_trim_space(skl->tplg_name); in skl_nhlt_update_topology_bin()
158 struct nhlt_acpi_table *nhlt = (struct nhlt_acpi_table *)skl->nhlt; in skl_nhlt_platform_id_show()
161 sprintf(platform_id, "%x-%.6s-%.8s-%d", skl->pci_id, in skl_nhlt_platform_id_show()
162 nhlt->header.oem_id, nhlt->header.oem_table_id, in skl_nhlt_platform_id_show()
163 nhlt->header.oem_revision); in skl_nhlt_platform_id_show()
173 struct device *dev = &skl->pci->dev; in skl_nhlt_create_sysfs()
175 if (sysfs_create_file(&dev->kobj, &dev_attr_platform_id.attr)) in skl_nhlt_create_sysfs()
183 struct device *dev = &skl->pci->dev; in skl_nhlt_remove_sysfs()
185 if (skl->nhlt) in skl_nhlt_remove_sysfs()
186 sysfs_remove_file(&dev->kobj, &dev_attr_platform_id.attr); in skl_nhlt_remove_sysfs()
208 u32 fs; in skl_get_ssp_clks() local
213 if (fmt->fmt_count == 0) in skl_get_ssp_clks()
216 fmt_cfg = (struct nhlt_fmt_cfg *)fmt->fmt_config; in skl_get_ssp_clks()
217 for (i = 0; i < fmt->fmt_count; i++) { in skl_get_ssp_clks()
221 wav_fmt = &saved_fmt_cfg->fmt_ext; in skl_get_ssp_clks()
223 channels = wav_fmt->fmt.channels; in skl_get_ssp_clks()
224 bps = wav_fmt->fmt.bits_per_sample; in skl_get_ssp_clks()
225 fs = wav_fmt->fmt.samples_per_sec; in skl_get_ssp_clks()
234 * So for the given fs and bps, choose blob which has in skl_get_ssp_clks()
238 for (j = i; j < fmt->fmt_count; j++) { in skl_get_ssp_clks()
241 wav_fmt = &tmp_fmt_cfg->fmt_ext; in skl_get_ssp_clks()
242 if ((fs == wav_fmt->fmt.samples_per_sec) && in skl_get_ssp_clks()
243 (bps == wav_fmt->fmt.bits_per_sample)) { in skl_get_ssp_clks()
245 wav_fmt->fmt.channels); in skl_get_ssp_clks()
249 tmp_fmt_cfg = (struct nhlt_fmt_cfg *)(tmp_fmt_cfg->config.caps + in skl_get_ssp_clks()
250 tmp_fmt_cfg->config.size); in skl_get_ssp_clks()
253 rate = channels * bps * fs; in skl_get_ssp_clks()
268 first_fmt_cfg = (struct nhlt_fmt_cfg *)fmt->fmt_config; in skl_get_ssp_clks()
270 first_fmt_cfg->config.caps; in skl_get_ssp_clks()
272 /* MCLK Divider Source Select */ in skl_get_ssp_clks()
273 if (is_legacy_blob(i2s_config_ext->hdr.sig)) { in skl_get_ssp_clks()
275 clk_src = get_clk_src(i2s_config->mclk, in skl_get_ssp_clks()
278 clk_src = get_clk_src(i2s_config_ext->mclk, in skl_get_ssp_clks()
285 fmt_cfg = (struct nhlt_fmt_cfg *)(fmt_cfg->config.caps + in skl_get_ssp_clks()
286 fmt_cfg->config.size); in skl_get_ssp_clks()
298 sclk[id].parent_name = parent->name; in skl_get_ssp_clks()
299 sclkfs[id].parent_name = parent->name; in skl_get_ssp_clks()
306 static void skl_get_mclk(struct skl_dev *skl, struct skl_ssp_clk *mclk, in skl_get_mclk() argument
316 fmt_cfg = (struct nhlt_fmt_cfg *)fmt->fmt_config; in skl_get_mclk()
317 i2s_config_ext = (struct skl_i2s_config_blob_ext *)fmt_cfg->config.caps; in skl_get_mclk()
319 /* MCLK Divider Source Select and divider */ in skl_get_mclk()
320 if (is_legacy_blob(i2s_config_ext->hdr.sig)) { in skl_get_mclk()
322 clk_src = get_clk_src(i2s_config->mclk, in skl_get_mclk()
324 clkdiv = i2s_config->mclk.mdivr & in skl_get_mclk()
327 clk_src = get_clk_src(i2s_config_ext->mclk, in skl_get_mclk()
329 clkdiv = i2s_config_ext->mclk.mdivr[0] & in skl_get_mclk()
340 /* Calculate MCLK rate from source using div value */ in skl_get_mclk()
345 mclk[id].rate_cfg[0].rate = parent->rate/div_ratio; in skl_get_mclk()
346 mclk[id].rate_cfg[0].config = fmt_cfg; in skl_get_mclk()
347 mclk[id].parent_name = parent->name; in skl_get_mclk()
352 struct nhlt_acpi_table *nhlt = (struct nhlt_acpi_table *)skl->nhlt; in skl_get_clks()
358 epnt = (struct nhlt_endpoint *)nhlt->desc; in skl_get_clks()
359 for (i = 0; i < nhlt->endpoint_count; i++) { in skl_get_clks()
360 if (epnt->linktype == NHLT_LINK_SSP) { in skl_get_clks()
361 id = epnt->virtual_bus_id; in skl_get_clks()
363 fmt = (struct nhlt_fmt *)(epnt->config.caps in skl_get_clks()
364 + epnt->config.size); in skl_get_clks()
369 epnt = (struct nhlt_endpoint *)((u8 *)epnt + epnt->length); in skl_get_clks()