Message ID | 20241203131813.58454-8-yung-chuan.liao@linux.intel.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | soundwire: add multi-lane support | expand |
On 3/12/24 13:18, Bard Liao wrote: > We need to program bus clock scale to adjust the bus clock if current > bus clock doesn't fit the bandwidth. > > Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com> > Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> > --- > drivers/soundwire/bus.c | 10 ++++++++++ > drivers/soundwire/stream.c | 32 ++++++++++++++++++++++++++++++++ > include/linux/soundwire/sdw.h | 1 + > 3 files changed, 43 insertions(+) > Does this still have the bug I reported here that breaks on systems that have peripherals listed in ACPI that don't really exist? https://github.com/thesofproject/linux/issues/5257
> -----Original Message----- > From: Richard Fitzgerald <rf@opensource.cirrus.com> > Sent: Tuesday, December 3, 2024 9:52 PM > To: Bard Liao <yung-chuan.liao@linux.intel.com>; linux- > sound@vger.kernel.org; vkoul@kernel.org > Cc: vinod.koul@linaro.org; linux-kernel@vger.kernel.org; pierre- > louis.bossart@linux.dev; Liao, Bard <bard.liao@intel.com> > Subject: Re: [PATCH v2 07/14] Soundwire: stream: program BUSCLOCK_SCALE > > On 3/12/24 13:18, Bard Liao wrote: > > We need to program bus clock scale to adjust the bus clock if current > > bus clock doesn't fit the bandwidth. > > > > Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com> > > Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> > > --- > > drivers/soundwire/bus.c | 10 ++++++++++ > > drivers/soundwire/stream.c | 32 > ++++++++++++++++++++++++++++++++ > > include/linux/soundwire/sdw.h | 1 + > > 3 files changed, 43 insertions(+) > > > > Does this still have the bug I reported here that breaks on systems > that have peripherals listed in ACPI that don't really exist? > > https://github.com/thesofproject/linux/issues/5257 Thanks for reporting the issue. I will look into it.
diff --git a/drivers/soundwire/bus.c b/drivers/soundwire/bus.c index 215630d602ad..9b295fc9acd5 100644 --- a/drivers/soundwire/bus.c +++ b/drivers/soundwire/bus.c @@ -813,6 +813,16 @@ void sdw_extract_slave_id(struct sdw_bus *bus, } EXPORT_SYMBOL(sdw_extract_slave_id); +bool is_clock_scaling_supported_by_slave(struct sdw_slave *slave) +{ + /* + * Dynamic scaling is a defined by SDCA. However, some devices expose the class ID but + * can't support dynamic scaling. We might need a quirk to handle such devices. + */ + return slave->id.class_id; +} +EXPORT_SYMBOL(is_clock_scaling_supported_by_slave); + static int sdw_program_device_num(struct sdw_bus *bus, bool *programmed) { u8 buf[SDW_NUM_DEV_ID_REGISTERS] = {0}; diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c index 795017c8081a..a4a668135d16 100644 --- a/drivers/soundwire/stream.c +++ b/drivers/soundwire/stream.c @@ -629,8 +629,40 @@ static int sdw_notify_config(struct sdw_master_runtime *m_rt) static int sdw_program_params(struct sdw_bus *bus, bool prepare) { struct sdw_master_runtime *m_rt; + struct sdw_slave *slave; int ret = 0; + u32 addr1; + /* Check if all Peripherals comply with SDCA */ + list_for_each_entry(slave, &bus->slaves, node) { + if (!is_clock_scaling_supported_by_slave(slave)) { + dev_dbg(&slave->dev, "The Peripheral doesn't comply with SDCA\n"); + goto manager_runtime; + } + } + + if (bus->params.next_bank) + addr1 = SDW_SCP_BUSCLOCK_SCALE_B1; + else + addr1 = SDW_SCP_BUSCLOCK_SCALE_B0; + + /* Program SDW_SCP_BUSCLOCK_SCALE if all Peripherals comply with SDCA */ + list_for_each_entry(slave, &bus->slaves, node) { + int scale_index; + u8 base; + + scale_index = sdw_slave_get_scale_index(slave, &base); + if (scale_index < 0) + return scale_index; + + ret = sdw_write_no_pm(slave, addr1, scale_index); + if (ret < 0) { + dev_err(&slave->dev, "SDW_SCP_BUSCLOCK_SCALE register write failed\n"); + return ret; + } + } + +manager_runtime: list_for_each_entry(m_rt, &bus->m_rt_list, bus_node) { /* diff --git a/include/linux/soundwire/sdw.h b/include/linux/soundwire/sdw.h index 05a85e2bd96d..fc0a203c3ae0 100644 --- a/include/linux/soundwire/sdw.h +++ b/include/linux/soundwire/sdw.h @@ -1041,6 +1041,7 @@ int sdw_bus_exit_clk_stop(struct sdw_bus *bus); int sdw_compare_devid(struct sdw_slave *slave, struct sdw_slave_id id); void sdw_extract_slave_id(struct sdw_bus *bus, u64 addr, struct sdw_slave_id *id); +bool is_clock_scaling_supported_by_slave(struct sdw_slave *slave); #if IS_ENABLED(CONFIG_SOUNDWIRE)