Commit 175fcd15 authored by Mark Brown's avatar Mark Brown

ALSA/ASoC/SoundWire: Intel: update maximum number

Merge series from Bard Liao <yung-chuan.liao@linux.intel.com>:

Intel new platforms can have up to 5 SoundWire links.
This series does not apply to SoundWire tree due to recent changes in
machine driver. Can we go via ASoC tree with Vinod's Acked-by tag?
parents 46e21141 1f366283
...@@ -222,6 +222,13 @@ static inline bool sdw_intel_sync_check_cmdsync_unlocked(struct sdw_intel *sdw) ...@@ -222,6 +222,13 @@ static inline bool sdw_intel_sync_check_cmdsync_unlocked(struct sdw_intel *sdw)
return false; return false;
} }
static inline int sdw_intel_get_link_count(struct sdw_intel *sdw)
{
if (SDW_INTEL_CHECK_OPS(sdw, get_link_count))
return SDW_INTEL_OPS(sdw, get_link_count)(sdw);
return 4; /* default on older generations */
}
/* common bus management */ /* common bus management */
int intel_start_bus(struct sdw_intel *sdw); int intel_start_bus(struct sdw_intel *sdw);
int intel_start_bus_after_reset(struct sdw_intel *sdw); int intel_start_bus_after_reset(struct sdw_intel *sdw);
......
...@@ -706,10 +706,30 @@ static void intel_program_sdi(struct sdw_intel *sdw, int dev_num) ...@@ -706,10 +706,30 @@ static void intel_program_sdi(struct sdw_intel *sdw, int dev_num)
__func__, sdw->instance, dev_num); __func__, sdw->instance, dev_num);
} }
static int intel_get_link_count(struct sdw_intel *sdw)
{
int ret;
ret = hdac_bus_eml_get_count(sdw->link_res->hbus, true, AZX_REG_ML_LEPTR_ID_SDW);
if (!ret) {
dev_err(sdw->cdns.dev, "%s: could not retrieve link count\n", __func__);
return -ENODEV;
}
if (ret > SDW_INTEL_MAX_LINKS) {
dev_err(sdw->cdns.dev, "%s: link count %d exceed max %d\n", __func__, ret, SDW_INTEL_MAX_LINKS);
return -EINVAL;
}
return ret;
}
const struct sdw_intel_hw_ops sdw_intel_lnl_hw_ops = { const struct sdw_intel_hw_ops sdw_intel_lnl_hw_ops = {
.debugfs_init = intel_ace2x_debugfs_init, .debugfs_init = intel_ace2x_debugfs_init,
.debugfs_exit = intel_ace2x_debugfs_exit, .debugfs_exit = intel_ace2x_debugfs_exit,
.get_link_count = intel_get_link_count,
.register_dai = intel_register_dai, .register_dai = intel_register_dai,
.check_clock_stop = intel_check_clock_stop, .check_clock_stop = intel_check_clock_stop,
......
...@@ -317,6 +317,20 @@ static int intel_link_probe(struct auxiliary_device *auxdev, ...@@ -317,6 +317,20 @@ static int intel_link_probe(struct auxiliary_device *auxdev,
bus->link_id = auxdev->id; bus->link_id = auxdev->id;
bus->clk_stop_timeout = 1; bus->clk_stop_timeout = 1;
/*
* paranoia check: make sure ACPI-reported number of links is aligned with
* hardware capabilities.
*/
ret = sdw_intel_get_link_count(sdw);
if (ret < 0) {
dev_err(dev, "%s: sdw_intel_get_link_count failed: %d\n", __func__, ret);
return ret;
}
if (ret <= sdw->instance) {
dev_err(dev, "%s: invalid link id %d, link count %d\n", __func__, auxdev->id, ret);
return -EINVAL;
}
sdw_cdns_probe(cdns); sdw_cdns_probe(cdns);
/* Set ops */ /* Set ops */
......
...@@ -388,6 +388,7 @@ struct sdw_intel; ...@@ -388,6 +388,7 @@ struct sdw_intel;
/* struct intel_sdw_hw_ops - SoundWire ops for Intel platforms. /* struct intel_sdw_hw_ops - SoundWire ops for Intel platforms.
* @debugfs_init: initialize all debugfs capabilities * @debugfs_init: initialize all debugfs capabilities
* @debugfs_exit: close and cleanup debugfs capabilities * @debugfs_exit: close and cleanup debugfs capabilities
* @get_link_count: fetch link count from hardware registers
* @register_dai: read all PDI information and register DAIs * @register_dai: read all PDI information and register DAIs
* @check_clock_stop: throw error message if clock is not stopped. * @check_clock_stop: throw error message if clock is not stopped.
* @start_bus: normal start * @start_bus: normal start
...@@ -412,6 +413,8 @@ struct sdw_intel_hw_ops { ...@@ -412,6 +413,8 @@ struct sdw_intel_hw_ops {
void (*debugfs_init)(struct sdw_intel *sdw); void (*debugfs_init)(struct sdw_intel *sdw);
void (*debugfs_exit)(struct sdw_intel *sdw); void (*debugfs_exit)(struct sdw_intel *sdw);
int (*get_link_count)(struct sdw_intel *sdw);
int (*register_dai)(struct sdw_intel *sdw); int (*register_dai)(struct sdw_intel *sdw);
void (*check_clock_stop)(struct sdw_intel *sdw); void (*check_clock_stop)(struct sdw_intel *sdw);
...@@ -447,4 +450,9 @@ extern const struct sdw_intel_hw_ops sdw_intel_lnl_hw_ops; ...@@ -447,4 +450,9 @@ extern const struct sdw_intel_hw_ops sdw_intel_lnl_hw_ops;
#define SDW_INTEL_DEV_NUM_IDA_MIN 6 #define SDW_INTEL_DEV_NUM_IDA_MIN 6
/*
* Max number of links supported in hardware
*/
#define SDW_INTEL_MAX_LINKS 5
#endif #endif
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include <linux/string.h> #include <linux/string.h>
#define SDW_LINK_TYPE 4 /* from Intel ACPI documentation */ #define SDW_LINK_TYPE 4 /* from Intel ACPI documentation */
#define SDW_MAX_LINKS 4
static int ctrl_link_mask; static int ctrl_link_mask;
module_param_named(sdw_link_mask, ctrl_link_mask, int, 0444); module_param_named(sdw_link_mask, ctrl_link_mask, int, 0444);
...@@ -87,9 +86,9 @@ sdw_intel_scan_controller(struct sdw_intel_acpi_info *info) ...@@ -87,9 +86,9 @@ sdw_intel_scan_controller(struct sdw_intel_acpi_info *info)
} }
/* Check count is within bounds */ /* Check count is within bounds */
if (count > SDW_MAX_LINKS) { if (count > SDW_INTEL_MAX_LINKS) {
dev_err(&adev->dev, "Link count %d exceeds max %d\n", dev_err(&adev->dev, "Link count %d exceeds max %d\n",
count, SDW_MAX_LINKS); count, SDW_INTEL_MAX_LINKS);
return -EINVAL; return -EINVAL;
} }
......
...@@ -5,12 +5,14 @@ ...@@ -5,12 +5,14 @@
* sof_sdw - ASOC Machine driver for Intel SoundWire platforms * sof_sdw - ASOC Machine driver for Intel SoundWire platforms
*/ */
#include <linux/acpi.h>
#include <linux/bitmap.h> #include <linux/bitmap.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/dmi.h> #include <linux/dmi.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/soundwire/sdw.h> #include <linux/soundwire/sdw.h>
#include <linux/soundwire/sdw_type.h> #include <linux/soundwire/sdw_type.h>
#include <linux/soundwire/sdw_intel.h>
#include <sound/soc-acpi.h> #include <sound/soc-acpi.h>
#include "sof_sdw_common.h" #include "sof_sdw_common.h"
#include "../../codecs/rt711.h" #include "../../codecs/rt711.h"
...@@ -883,7 +885,7 @@ static int create_sdw_dailinks(struct snd_soc_card *card, ...@@ -883,7 +885,7 @@ static int create_sdw_dailinks(struct snd_soc_card *card,
struct intel_mc_ctx *intel_ctx = (struct intel_mc_ctx *)ctx->private; struct intel_mc_ctx *intel_ctx = (struct intel_mc_ctx *)ctx->private;
int ret, i; int ret, i;
for (i = 0; i < SDW_MAX_LINKS; i++) for (i = 0; i < SDW_INTEL_MAX_LINKS; i++)
intel_ctx->sdw_pin_index[i] = SOC_SDW_INTEL_BIDIR_PDI_BASE; intel_ctx->sdw_pin_index[i] = SOC_SDW_INTEL_BIDIR_PDI_BASE;
/* generate DAI links by each sdw link */ /* generate DAI links by each sdw link */
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
#define SOC_SDW_MAX_CPU_DAIS 16 #define SOC_SDW_MAX_CPU_DAIS 16
#define SOC_SDW_INTEL_BIDIR_PDI_BASE 2 #define SOC_SDW_INTEL_BIDIR_PDI_BASE 2
#define SDW_MAX_LINKS 4
/* 8 combinations with 4 links + unused group 0 */ /* 8 combinations with 4 links + unused group 0 */
#define SDW_MAX_GROUPS 9 #define SDW_MAX_GROUPS 9
...@@ -57,7 +55,7 @@ enum { ...@@ -57,7 +55,7 @@ enum {
struct intel_mc_ctx { struct intel_mc_ctx {
struct sof_hdmi_private hdmi; struct sof_hdmi_private hdmi;
/* To store SDW Pin index for each SoundWire link */ /* To store SDW Pin index for each SoundWire link */
unsigned int sdw_pin_index[SDW_MAX_LINKS]; unsigned int sdw_pin_index[SDW_INTEL_MAX_LINKS];
}; };
extern unsigned long sof_sdw_quirk; extern unsigned long sof_sdw_quirk;
......
...@@ -5,10 +5,12 @@ ...@@ -5,10 +5,12 @@
* sof_sdw_hdmi - Helpers to handle HDMI from generic machine driver * sof_sdw_hdmi - Helpers to handle HDMI from generic machine driver
*/ */
#include <linux/acpi.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/list.h> #include <linux/list.h>
#include <linux/soundwire/sdw_intel.h>
#include <sound/soc.h> #include <sound/soc.h>
#include <sound/soc-acpi.h> #include <sound/soc-acpi.h>
#include <sound/jack.h> #include <sound/jack.h>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment