From: Vinod Koul <vkoul@kernel.org>
To: Bard Liao <yung-chuan.liao@linux.intel.com>
Cc: alsa-devel@alsa-project.org, linux-kernel@vger.kernel.org,
pierre-louis.bossart@linux.intel.com, bard.liao@intel.com
Subject: Re: [PATCH 2/4] soundwire: introduce SDW_DEV_NUM_ALLOC_IDA_WAKE_ONLY
Date: Thu, 8 Jun 2023 12:36:10 +0530 [thread overview]
Message-ID: <ZIF94vZHzeGXfyin@matsya> (raw)
In-Reply-To: <20230531033736.792464-3-yung-chuan.liao@linux.intel.com>
On 31-05-23, 11:37, Bard Liao wrote:
> From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
>
> This patch adds a new Device Number allocation strategy, with the IDA
> used only for devices that are wake-capable.
>
> "regular" devices such as amplifiers will use Device Numbers
> [1..min_ida-1].
>
> "wake-capable" devices such as jack or microphone codecs will use
> Device Numbers [min_ida..11].
>
> This hybrid strategy extends the number of supported devices in a
> system by only constraining the allocation if required, e.g. in the
> case of Intel LunarLake platforms the wake-capable devices are
> required to have a unique address to use the HDaudio SDI and HDAudio
> WAKEEN/WAKESTS registers.
This seems to be a consequence of Intel hardware decisions, so I guess
best suited place for this is Intel controller, do we really want to
have this in core logic?
>
> Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> Reviewed-by: Rander Wang <rander.wang@intel.com>
> Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
> ---
> drivers/soundwire/bus.c | 26 +++++++++++++++++++++-----
> include/linux/soundwire/sdw.h | 4 ++++
> 2 files changed, 25 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/soundwire/bus.c b/drivers/soundwire/bus.c
> index e8c1c55a2a73..6f465cce8369 100644
> --- a/drivers/soundwire/bus.c
> +++ b/drivers/soundwire/bus.c
> @@ -159,7 +159,9 @@ static int sdw_delete_slave(struct device *dev, void *data)
>
> if (slave->dev_num) { /* clear dev_num if assigned */
> clear_bit(slave->dev_num, bus->assigned);
> - if (bus->dev_num_alloc == SDW_DEV_NUM_ALLOC_IDA)
> + if (bus->dev_num_alloc == SDW_DEV_NUM_ALLOC_IDA ||
> + (bus->dev_num_alloc == SDW_DEV_NUM_ALLOC_IDA_WAKE_ONLY &&
> + slave->prop.wake_capable))
> ida_free(&sdw_peripheral_ida, slave->dev_num);
> }
> list_del_init(&slave->node);
> @@ -699,17 +701,31 @@ EXPORT_SYMBOL(sdw_compare_devid);
> /* called with bus_lock held */
> static int sdw_get_device_num(struct sdw_slave *slave)
> {
> + struct sdw_bus *bus = slave->bus;
> int bit;
>
> - if (slave->bus->dev_num_alloc == SDW_DEV_NUM_ALLOC_IDA) {
> + if (bus->dev_num_alloc == SDW_DEV_NUM_ALLOC_IDA ||
> + (bus->dev_num_alloc == SDW_DEV_NUM_ALLOC_IDA_WAKE_ONLY &&
> + slave->prop.wake_capable)) {
> bit = ida_alloc_range(&sdw_peripheral_ida,
> - slave->bus->dev_num_ida_min, SDW_MAX_DEVICES,
> + bus->dev_num_ida_min, SDW_MAX_DEVICES,
> GFP_KERNEL);
> if (bit < 0)
> goto err;
> } else {
> - bit = find_first_zero_bit(slave->bus->assigned, SDW_MAX_DEVICES);
> - if (bit == SDW_MAX_DEVICES) {
> + int max_devices = SDW_MAX_DEVICES;
> +
> + if (bus->dev_num_alloc == SDW_DEV_NUM_ALLOC_IDA_WAKE_ONLY &&
> + !slave->prop.wake_capable) {
> + max_devices = bus->dev_num_ida_min - 1;
> +
> + /* range check */
> + if (max_devices < 1 || max_devices > SDW_MAX_DEVICES)
> + return -EINVAL;
> + }
> +
> + bit = find_first_zero_bit(bus->assigned, max_devices);
> + if (bit == max_devices) {
> bit = -ENODEV;
> goto err;
> }
> diff --git a/include/linux/soundwire/sdw.h b/include/linux/soundwire/sdw.h
> index 4656d6d0f3bb..8a7541ac735e 100644
> --- a/include/linux/soundwire/sdw.h
> +++ b/include/linux/soundwire/sdw.h
> @@ -869,10 +869,14 @@ struct sdw_master_ops {
> * @SDW_DEV_NUM_ALLOC_DEFAULT: unconstrained first-come-first-serve allocation,
> * using range [1, 11]
> * @SDW_DEV_NUM_ALLOC_IDA: IDA-based allocation, using range [ida_min, 11]
> + * @SDW_DEV_NUM_ALLOC_IDA_WAKE_ONLY: Hybrid allocation where wake-capable devices rely on
> + * IDA-based allocation and range [ida_min, 11], while regular devices rely on default
> + * allocation in range [1, ida_min - 1]
> */
> enum sdw_dev_num_alloc {
> SDW_DEV_NUM_ALLOC_DEFAULT = 0,
> SDW_DEV_NUM_ALLOC_IDA,
> + SDW_DEV_NUM_ALLOC_IDA_WAKE_ONLY,
> };
>
> /**
> --
> 2.25.1
--
~Vinod
next prev parent reply other threads:[~2023-06-08 7:07 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-31 3:37 [PATCH 0/4] soundwire: allow for more than 8 devices, keep IDA for wake-capable devices Bard Liao
2023-05-31 3:37 ` [PATCH 1/4] soundwire: add enum to control device number allocation Bard Liao
2023-06-08 7:02 ` Vinod Koul
2023-06-08 13:25 ` Pierre-Louis Bossart
2023-05-31 3:37 ` [PATCH 2/4] soundwire: introduce SDW_DEV_NUM_ALLOC_IDA_WAKE_ONLY Bard Liao
2023-06-08 7:06 ` Vinod Koul [this message]
2023-06-08 15:09 ` Pierre-Louis Bossart
2023-06-21 11:00 ` Vinod Koul
2023-06-21 11:28 ` Pierre-Louis Bossart
2023-05-31 3:37 ` [PATCH 3/4] soundwire: extend parameters of new_peripheral_assigned() callback Bard Liao
2023-06-08 7:07 ` Vinod Koul
2023-06-08 13:24 ` Pierre-Louis Bossart
2023-06-21 10:59 ` Vinod Koul
2023-05-31 3:37 ` [PATCH 4/4] soundwire: intel_auxdevice: use SDW_DEV_NUM_ALLOC_IDA_WAKE_ONLY Bard Liao
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZIF94vZHzeGXfyin@matsya \
--to=vkoul@kernel.org \
--cc=alsa-devel@alsa-project.org \
--cc=bard.liao@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=pierre-louis.bossart@linux.intel.com \
--cc=yung-chuan.liao@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.