Skip to content

Commit 09ee49e

Browse files
plbossartvinodkoul
authored andcommitted
soundwire: intel: add support for MeteorLake additional clocks
In the MeteorLake hardware, the SoundWire link clock can be selected from the Xtal, audio cardinal clock (24.576 MHz) or the 96 MHz audio PLL. This patches add the clock selection in a backwards-compatible manner, using the ACPI firmware as the source of information and checking its compatibility with hardware capabilities. Signed-off-by: Pierre-Louis Bossart <[email protected]> Reviewed-by: Rander Wang <[email protected]> Signed-off-by: Bard Liao <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Vinod Koul <[email protected]>
1 parent d0a69cd commit 09ee49e

File tree

2 files changed

+42
-6
lines changed

2 files changed

+42
-6
lines changed

drivers/soundwire/intel.c

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -345,8 +345,10 @@ static int intel_link_power_up(struct sdw_intel *sdw)
345345
u32 spa_mask, cpa_mask;
346346
u32 link_control;
347347
int ret = 0;
348+
u32 clock_source;
348349
u32 syncprd;
349350
u32 sync_reg;
351+
bool lcap_mlcs;
350352

351353
mutex_lock(sdw->link_res->shim_lock);
352354

@@ -358,12 +360,35 @@ static int intel_link_power_up(struct sdw_intel *sdw)
358360
* is only dependent on the oscillator clock provided to
359361
* the IP, so adjust based on _DSD properties reported in DSDT
360362
* tables. The values reported are based on either 24MHz
361-
* (CNL/CML) or 38.4 MHz (ICL/TGL+).
363+
* (CNL/CML) or 38.4 MHz (ICL/TGL+). On MeteorLake additional
364+
* frequencies are available with the MLCS clock source selection.
362365
*/
363-
if (prop->mclk_freq % 6000000)
364-
syncprd = SDW_SHIM_SYNC_SYNCPRD_VAL_38_4;
365-
else
366-
syncprd = SDW_SHIM_SYNC_SYNCPRD_VAL_24;
366+
lcap_mlcs = intel_readl(shim, SDW_SHIM_LCAP) & SDW_SHIM_LCAP_MLCS_MASK;
367+
368+
if (prop->mclk_freq % 6000000) {
369+
if (prop->mclk_freq % 2400000) {
370+
if (lcap_mlcs) {
371+
syncprd = SDW_SHIM_SYNC_SYNCPRD_VAL_24_576;
372+
clock_source = SDW_SHIM_MLCS_CARDINAL_CLK;
373+
} else {
374+
dev_err(sdw->cdns.dev, "%s: invalid clock configuration, mclk %d lcap_mlcs %d\n",
375+
__func__, prop->mclk_freq, lcap_mlcs);
376+
ret = -EINVAL;
377+
goto out;
378+
}
379+
} else {
380+
syncprd = SDW_SHIM_SYNC_SYNCPRD_VAL_38_4;
381+
clock_source = SDW_SHIM_MLCS_XTAL_CLK;
382+
}
383+
} else {
384+
if (lcap_mlcs) {
385+
syncprd = SDW_SHIM_SYNC_SYNCPRD_VAL_96;
386+
clock_source = SDW_SHIM_MLCS_AUDIO_PLL_CLK;
387+
} else {
388+
syncprd = SDW_SHIM_SYNC_SYNCPRD_VAL_24;
389+
clock_source = SDW_SHIM_MLCS_XTAL_CLK;
390+
}
391+
}
367392

368393
if (!*shim_mask) {
369394
dev_dbg(sdw->cdns.dev, "powering up all links\n");
@@ -403,6 +428,13 @@ static int intel_link_power_up(struct sdw_intel *sdw)
403428
"Failed to set SHIM_SYNC: %d\n", ret);
404429
goto out;
405430
}
431+
432+
/* update link clock if needed */
433+
if (lcap_mlcs) {
434+
link_control = intel_readl(shim, SDW_SHIM_LCTL);
435+
u32p_replace_bits(&link_control, clock_source, SDW_SHIM_LCTL_MLCS_MASK);
436+
intel_writel(shim, SDW_SHIM_LCTL, link_control);
437+
}
406438
}
407439

408440
*shim_mask |= BIT(link_id);
@@ -1087,4 +1119,3 @@ const struct sdw_intel_hw_ops sdw_intel_cnl_hw_ops = {
10871119
.sync_check_cmdsync_unlocked = intel_check_cmdsync_unlocked,
10881120
};
10891121
EXPORT_SYMBOL_NS(sdw_intel_cnl_hw_ops, SOUNDWIRE_INTEL);
1090-

include/linux/soundwire/sdw_intel.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
/* LCAP */
2323
#define SDW_SHIM_LCAP 0x0
2424
#define SDW_SHIM_LCAP_LCOUNT_MASK GENMASK(2, 0)
25+
#define SDW_SHIM_LCAP_MLCS_MASK BIT(8)
2526

2627
/* LCTL */
2728
#define SDW_SHIM_LCTL 0x4
@@ -30,6 +31,10 @@
3031
#define SDW_SHIM_LCTL_SPA_MASK GENMASK(3, 0)
3132
#define SDW_SHIM_LCTL_CPA BIT(8)
3233
#define SDW_SHIM_LCTL_CPA_MASK GENMASK(11, 8)
34+
#define SDW_SHIM_LCTL_MLCS_MASK GENMASK(29, 27)
35+
#define SDW_SHIM_MLCS_XTAL_CLK 0x0
36+
#define SDW_SHIM_MLCS_CARDINAL_CLK 0x1
37+
#define SDW_SHIM_MLCS_AUDIO_PLL_CLK 0x2
3338

3439
/* SYNC */
3540
#define SDW_SHIM_SYNC 0xC

0 commit comments

Comments
 (0)