In kernel `soc-dai.h`, DAI clock gating is defined as following:
~~~~
\#define SND_SOC_DAIFMT_CONT (1 << 4) /* continuous clock */
\#define SND_SOC_DAIFMT_GATED (0 << 4) /* clock is gated */
~~~~
Therefore, the corresponding field of struct snd_soc_tplg_hw_config should
be inverted compared to the current logic:
clock_count = 1 => SND_SOC_DAIFMT_CONT
clock_count = 0 => SND_SOC_DAIFMT_GATED
Signed-off-by: Kirill Marinushkin <[email protected]>
Cc: Jaroslav Kysela <[email protected]>
Cc: Takashi Iwai <[email protected]>
Cc: [email protected]
Cc: [email protected]
---
include/uapi/sound/asoc.h | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/include/uapi/sound/asoc.h b/include/uapi/sound/asoc.h
index 69c37ecbff7e..10188850dede 100644
--- a/include/uapi/sound/asoc.h
+++ b/include/uapi/sound/asoc.h
@@ -312,7 +312,9 @@ struct snd_soc_tplg_hw_config {
__le32 size; /* in bytes of this structure */
__le32 id; /* unique ID - - used to match */
__le32 fmt; /* SND_SOC_DAI_FORMAT_ format value */
- __u8 clock_gated; /* 1 if clock can be gated to save power */
+ __u8 clock_cont; /* 1 if clock is continuous, and can not be
+ * gated to save power
+ */
__u8 invert_bclk; /* 1 for inverted BCLK, 0 for normal */
__u8 invert_fsync; /* 1 for inverted frame clock, 0 for normal */
__u8 bclk_master; /* 1 for master of BCLK, 0 for slave */
--
2.13.6
Clock gating parameter is a part of `dai_fmt`. It is supported by
`alsa-lib` when creating a topology binary file, but ignored by kernel
when loading this topology file.
After applying this commit, the clock gating parameter is not ignored any
more. The old behaviour is not broken, as by default the parameter value
is 0.
For example, the following config, based on
alsa-lib/src/conf/topology/broadwell/broadwell.conf, is now supported:
~~~~
SectionHWConfig."CodecHWConfig" {
id "1"
format "I2S" # physical audio format.
bclk "master" # Platform is master of bit clock
fsync "master" # platform is master of fsync
pm_cont_clock "true" # clock is continuous, and can not be gated
}
SectionLink."Codec" {
# used for binding to the physical link
id "0"
hw_configs [
"CodecHWConfig"
]
default_hw_conf_id "1"
}
~~~~
Signed-off-by: Kirill Marinushkin <[email protected]>
Cc: Liam Girdwood <[email protected]>
Cc: Mark Brown <[email protected]>
Cc: Jaroslav Kysela <[email protected]>
Cc: Takashi Iwai <[email protected]>
Cc: [email protected]
Cc: [email protected]
---
sound/soc/soc-topology.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
index 01a50413c66f..21bd4f96348d 100644
--- a/sound/soc/soc-topology.c
+++ b/sound/soc/soc-topology.c
@@ -1981,6 +1981,12 @@ static void set_link_hw_format(struct snd_soc_dai_link *link,
link->dai_fmt = hw_config->fmt & SND_SOC_DAIFMT_FORMAT_MASK;
+ /* clock gating */
+ if (hw_config->clock_cont)
+ link->dai_fmt |= SND_SOC_DAIFMT_CONT;
+ else
+ link->dai_fmt |= SND_SOC_DAIFMT_GATED;
+
/* clock signal polarity */
invert_bclk = hw_config->invert_bclk;
invert_fsync = hw_config->invert_fsync;
--
2.13.6
Hi,
On Feb 19 2018 15:05, Kirill Marinushkin wrote:
> In kernel `soc-dai.h`, DAI clock gating is defined as following:
>
> ~~~~
> \#define SND_SOC_DAIFMT_CONT (1 << 4) /* continuous clock */
> \#define SND_SOC_DAIFMT_GATED (0 << 4) /* clock is gated */
> ~~~~
>
> Therefore, the corresponding field of struct snd_soc_tplg_hw_config should
> be inverted compared to the current logic:
>
> clock_count = 1 => SND_SOC_DAIFMT_CONT
> clock_count = 0 => SND_SOC_DAIFMT_GATED
>
> Signed-off-by: Kirill Marinushkin <[email protected]>
> Cc: Jaroslav Kysela <[email protected]>
> Cc: Takashi Iwai <[email protected]>
> Cc: [email protected]
> Cc: [email protected]
> ---
> include/uapi/sound/asoc.h | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/include/uapi/sound/asoc.h b/include/uapi/sound/asoc.h
> index 69c37ecbff7e..10188850dede 100644
> --- a/include/uapi/sound/asoc.h
> +++ b/include/uapi/sound/asoc.h
> @@ -312,7 +312,9 @@ struct snd_soc_tplg_hw_config {
> __le32 size; /* in bytes of this structure */
> __le32 id; /* unique ID - - used to match */
> __le32 fmt; /* SND_SOC_DAI_FORMAT_ format value */
> - __u8 clock_gated; /* 1 if clock can be gated to save power */
> + __u8 clock_cont; /* 1 if clock is continuous, and can not be
> + * gated to save power
> + */
> __u8 invert_bclk; /* 1 for inverted BCLK, 0 for normal */
> __u8 invert_fsync; /* 1 for inverted frame clock, 0 for normal */
> __u8 bclk_master; /* 1 for master of BCLK, 0 for slave */
This structure was added at a commit 676c6b5208f7 ('ASoC: topology: ABI
- Update physical DAI link configuration for version 5') in a
development period for v4.10.
This file is a part of UAPI, thus this structure has already been
exposed to application developers. Any change can break userspace
applications in a point of backward compatibility for this subsystem.
It's better for you to investigate another solution for your two
patches[1][2].
[1] [alsa-devel] [PATCH 1/2] ASoC: topology: Rename clock_gated to
clock_cont in snd_soc_tplg_hw_config
http://mailman.alsa-project.org/pipermail/alsa-devel/2018-February/132258.html
[2] [alsa-devel] [PATCH 2/2] ASoC: topology: Add missing clock gating
parameter when parsing hw_configs
http://mailman.alsa-project.org/pipermail/alsa-devel/2018-February/132259.html
Regards
Takashi Sakamoto
On 02/19/18 07:47, Takashi Sakamoto wrote:
> Hi,
>
> On Feb 19 2018 15:05, Kirill Marinushkin wrote:
>> In kernel `soc-dai.h`, DAI clock gating is defined as following:
>>
>> ~~~~
>> \#define SND_SOC_DAIFMT_CONT (1 << 4) /* continuous clock */
>> \#define SND_SOC_DAIFMT_GATED (0 << 4) /* clock is gated */
>> ~~~~
>>
>> Therefore, the corresponding field of struct snd_soc_tplg_hw_config should
>> be inverted compared to the current logic:
>>
>> clock_count = 1 => SND_SOC_DAIFMT_CONT
>> clock_count = 0 => SND_SOC_DAIFMT_GATED
>>
>> Signed-off-by: Kirill Marinushkin <[email protected]>
>> Cc: Jaroslav Kysela <[email protected]>
>> Cc: Takashi Iwai <[email protected]>
>> Cc: [email protected]
>> Cc: [email protected]
>> ---
>> include/uapi/sound/asoc.h | 4 +++-
>> 1 file changed, 3 insertions(+), 1 deletion(-)
>>
>> diff --git a/include/uapi/sound/asoc.h b/include/uapi/sound/asoc.h
>> index 69c37ecbff7e..10188850dede 100644
>> --- a/include/uapi/sound/asoc.h
>> +++ b/include/uapi/sound/asoc.h
>> @@ -312,7 +312,9 @@ struct snd_soc_tplg_hw_config {
>> __le32 size; /* in bytes of this structure */
>> __le32 id; /* unique ID - - used to match */
>> __le32 fmt; /* SND_SOC_DAI_FORMAT_ format value */
>> - __u8 clock_gated; /* 1 if clock can be gated to save power */
>> + __u8 clock_cont; /* 1 if clock is continuous, and can not be
>> + * gated to save power
>> + */
>> __u8 invert_bclk; /* 1 for inverted BCLK, 0 for normal */
>> __u8 invert_fsync; /* 1 for inverted frame clock, 0 for normal */
>> __u8 bclk_master; /* 1 for master of BCLK, 0 for slave */
>
> This structure was added at a commit 676c6b5208f7 ('ASoC: topology: ABI - Update physical DAI link configuration for version 5') in a development period for v4.10.
>
> This file is a part of UAPI, thus this structure has already been exposed to application developers. Any change can break userspace applications in a point of backward compatibility for this subsystem.
>
> It's better for you to investigate another solution for your two patches[1][2].
>
>
> [1] [alsa-devel] [PATCH 1/2] ASoC: topology: Rename clock_gated to clock_cont in snd_soc_tplg_hw_config
> http://mailman.alsa-project.org/pipermail/alsa-devel/2018-February/132258.html
> [2] [alsa-devel] [PATCH 2/2] ASoC: topology: Add missing clock gating parameter when parsing hw_configs
> http://mailman.alsa-project.org/pipermail/alsa-devel/2018-February/132259.html
>
>
> Regards
>
> Takashi Sakamoto
Hello Takashi Sakamoto,
I will propose a backwards-compatible solution as a PATCH v2.
Best Regards,
Kirill
In kernel `soc-dai.h`, DAI clock gating is defined as following:
~~~~
\#define SND_SOC_DAIFMT_CONT (1 << 4) /* continuous clock */
\#define SND_SOC_DAIFMT_GATED (0 << 4) /* clock is gated */
~~~~
The corresponding field of struct snd_soc_tplg_hw_config cannot be used as
bool values due to the inverted logic. Therefore this commit adds the
defines for this field.
snd_soc_tplg_hw_config.clock_gated = 0 => no effect
snd_soc_tplg_hw_config.clock_gated = 1 => SND_SOC_DAIFMT_GATED
snd_soc_tplg_hw_config.clock_gated = 2 => SND_SOC_DAIFMT_CONT
Signed-off-by: Kirill Marinushkin <[email protected]>
Cc: Takashi Sakamoto <[email protected]>
Cc: Jaroslav Kysela <[email protected]>
Cc: Takashi Iwai <[email protected]>
Cc: [email protected]
Cc: [email protected]
---
include/uapi/sound/asoc.h | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/include/uapi/sound/asoc.h b/include/uapi/sound/asoc.h
index 69c37ecbff7e..86d0599a6f13 100644
--- a/include/uapi/sound/asoc.h
+++ b/include/uapi/sound/asoc.h
@@ -139,6 +139,11 @@
#define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_CHANNELS (1 << 1)
#define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_SAMPLEBITS (1 << 2)
+/* DAI clock gating */
+#define SND_SOC_TPLG_DAI_CLK_GATE_UNDEFINED 0
+#define SND_SOC_TPLG_DAI_CLK_GATE_GATED 1
+#define SND_SOC_TPLG_DAI_CLK_GATE_CONT 2
+
/* DAI physical PCM data formats.
* Add new formats to the end of the list.
*/
@@ -312,7 +317,7 @@ struct snd_soc_tplg_hw_config {
__le32 size; /* in bytes of this structure */
__le32 id; /* unique ID - - used to match */
__le32 fmt; /* SND_SOC_DAI_FORMAT_ format value */
- __u8 clock_gated; /* 1 if clock can be gated to save power */
+ __u8 clock_gated; /* SND_SOC_TPLG_DAI_CLK_GATE_ value */
__u8 invert_bclk; /* 1 for inverted BCLK, 0 for normal */
__u8 invert_fsync; /* 1 for inverted frame clock, 0 for normal */
__u8 bclk_master; /* 1 for master of BCLK, 0 for slave */
--
2.13.6
Clock gating parameter is a part of `dai_fmt`. It is supported by
`alsa-lib` when creating a topology binary file, but ignored by kernel
when loading this topology file.
After applying this commit, the clock gating parameter is not ignored any
more. The old behaviour is not broken, as by default the parameter value
is 0.
For example, the following config, based on
alsa-lib/src/conf/topology/broadwell/broadwell.conf, is now supported:
~~~~
SectionHWConfig."CodecHWConfig" {
id "1"
format "I2S" # physical audio format.
bclk "master" # Platform is master of bit clock
fsync "master" # platform is master of fsync
pm_gate_clocks "true" # clock can be gated
}
SectionLink."Codec" {
# used for binding to the physical link
id "0"
hw_configs [
"CodecHWConfig"
]
default_hw_conf_id "1"
}
~~~~
Signed-off-by: Kirill Marinushkin <[email protected]>
Cc: Takashi Sakamoto <[email protected]>
Cc: Liam Girdwood <[email protected]>
Cc: Mark Brown <[email protected]>
Cc: Jaroslav Kysela <[email protected]>
Cc: Takashi Iwai <[email protected]>
Cc: [email protected]
Cc: [email protected]
---
sound/soc/soc-topology.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
index 01a50413c66f..bac70676a6b4 100644
--- a/sound/soc/soc-topology.c
+++ b/sound/soc/soc-topology.c
@@ -1981,6 +1981,13 @@ static void set_link_hw_format(struct snd_soc_dai_link *link,
link->dai_fmt = hw_config->fmt & SND_SOC_DAIFMT_FORMAT_MASK;
+ /* clock gating */
+ if (hw_config->clock_gated == SND_SOC_TPLG_DAI_CLK_GATE_GATED)
+ link->dai_fmt |= SND_SOC_DAIFMT_GATED;
+ else if (hw_config->clock_gated ==
+ SND_SOC_TPLG_DAI_CLK_GATE_CONT)
+ link->dai_fmt |= SND_SOC_DAIFMT_CONT;
+
/* clock signal polarity */
invert_bclk = hw_config->invert_bclk;
invert_fsync = hw_config->invert_fsync;
--
2.13.6
The patch
ASoC: topology: Add missing clock gating parameter when parsing hw_configs
has been applied to the asoc tree at
https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.
You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.
If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.
Please add any relevant lists and maintainers to the CCs when replying
to this mail.
Thanks,
Mark
From bdb86c40e8c5d2abe2ec7be964d621c1b7c27081 Mon Sep 17 00:00:00 2001
From: Kirill Marinushkin <[email protected]>
Date: Mon, 19 Feb 2018 21:36:35 +0100
Subject: [PATCH] ASoC: topology: Add missing clock gating parameter when
parsing hw_configs
Clock gating parameter is a part of `dai_fmt`. It is supported by
`alsa-lib` when creating a topology binary file, but ignored by kernel
when loading this topology file.
After applying this commit, the clock gating parameter is not ignored any
more. The old behaviour is not broken, as by default the parameter value
is 0.
For example, the following config, based on
alsa-lib/src/conf/topology/broadwell/broadwell.conf, is now supported:
~~~~
SectionHWConfig."CodecHWConfig" {
id "1"
format "I2S" # physical audio format.
bclk "master" # Platform is master of bit clock
fsync "master" # platform is master of fsync
pm_gate_clocks "true" # clock can be gated
}
SectionLink."Codec" {
# used for binding to the physical link
id "0"
hw_configs [
"CodecHWConfig"
]
default_hw_conf_id "1"
}
~~~~
Signed-off-by: Kirill Marinushkin <[email protected]>
Cc: Takashi Sakamoto <[email protected]>
Cc: Liam Girdwood <[email protected]>
Cc: Mark Brown <[email protected]>
Cc: Jaroslav Kysela <[email protected]>
Cc: Takashi Iwai <[email protected]>
Cc: [email protected]
Cc: [email protected]
Signed-off-by: Mark Brown <[email protected]>
---
sound/soc/soc-topology.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
index 01a50413c66f..bac70676a6b4 100644
--- a/sound/soc/soc-topology.c
+++ b/sound/soc/soc-topology.c
@@ -1981,6 +1981,13 @@ static void set_link_hw_format(struct snd_soc_dai_link *link,
link->dai_fmt = hw_config->fmt & SND_SOC_DAIFMT_FORMAT_MASK;
+ /* clock gating */
+ if (hw_config->clock_gated == SND_SOC_TPLG_DAI_CLK_GATE_GATED)
+ link->dai_fmt |= SND_SOC_DAIFMT_GATED;
+ else if (hw_config->clock_gated ==
+ SND_SOC_TPLG_DAI_CLK_GATE_CONT)
+ link->dai_fmt |= SND_SOC_DAIFMT_CONT;
+
/* clock signal polarity */
invert_bclk = hw_config->invert_bclk;
invert_fsync = hw_config->invert_fsync;
--
2.16.1
On Tue, Feb 20, 2018 at 12:09:18PM +0000, Mark Brown wrote:
> The patch
>
> ASoC: topology: Add missing clock gating parameter when parsing hw_configs
>
> has been applied to the asoc tree at
>
> https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
This broke the build so I dropped it.
On 02/20/18 14:45, Mark Brown wrote:
> On Tue, Feb 20, 2018 at 12:09:18PM +0000, Mark Brown wrote:
>> The patch
>>
>> ASoC: topology: Add missing clock gating parameter when parsing hw_configs
>>
>> has been applied to the asoc tree at
>>
>> https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
> This broke the build so I dropped it.
This patch is part 2 of 2. I failed to send both of them as a single patch series.
I will resend them properly in a new thread.
Best Regards,
Kirill
On 02/19/18 21:36, Kirill Marinushkin wrote:
> In kernel `soc-dai.h`, DAI clock gating is defined as following:
>
> ~~~~
> \#define SND_SOC_DAIFMT_CONT (1 << 4) /* continuous clock */
> \#define SND_SOC_DAIFMT_GATED (0 << 4) /* clock is gated */
> ~~~~
>
> The corresponding field of struct snd_soc_tplg_hw_config cannot be used as
> bool values due to the inverted logic. Therefore this commit adds the
> defines for this field.
>
> snd_soc_tplg_hw_config.clock_gated = 0 => no effect
> snd_soc_tplg_hw_config.clock_gated = 1 => SND_SOC_DAIFMT_GATED
> snd_soc_tplg_hw_config.clock_gated = 2 => SND_SOC_DAIFMT_CONT
>
> Signed-off-by: Kirill Marinushkin <[email protected]>
> Cc: Takashi Sakamoto <[email protected]>
> Cc: Jaroslav Kysela <[email protected]>
> Cc: Takashi Iwai <[email protected]>
> Cc: [email protected]
> Cc: [email protected]
> ---
> include/uapi/sound/asoc.h | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/include/uapi/sound/asoc.h b/include/uapi/sound/asoc.h
> index 69c37ecbff7e..86d0599a6f13 100644
> --- a/include/uapi/sound/asoc.h
> +++ b/include/uapi/sound/asoc.h
> @@ -139,6 +139,11 @@
> #define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_CHANNELS (1 << 1)
> #define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_SAMPLEBITS (1 << 2)
>
> +/* DAI clock gating */
> +#define SND_SOC_TPLG_DAI_CLK_GATE_UNDEFINED 0
> +#define SND_SOC_TPLG_DAI_CLK_GATE_GATED 1
> +#define SND_SOC_TPLG_DAI_CLK_GATE_CONT 2
> +
> /* DAI physical PCM data formats.
> * Add new formats to the end of the list.
> */
> @@ -312,7 +317,7 @@ struct snd_soc_tplg_hw_config {
> __le32 size; /* in bytes of this structure */
> __le32 id; /* unique ID - - used to match */
> __le32 fmt; /* SND_SOC_DAI_FORMAT_ format value */
> - __u8 clock_gated; /* 1 if clock can be gated to save power */
> + __u8 clock_gated; /* SND_SOC_TPLG_DAI_CLK_GATE_ value */
> __u8 invert_bclk; /* 1 for inverted BCLK, 0 for normal */
> __u8 invert_fsync; /* 1 for inverted frame clock, 0 for normal */
> __u8 bclk_master; /* 1 for master of BCLK, 0 for slave */
This patch is part 1 of 2. I failed to send both of them as a single patch series.
I will resend them properly in a new thread.
Best Regards,
Kirill
On 02/19/18 07:05, Kirill Marinushkin wrote:
> Clock gating parameter is a part of `dai_fmt`. It is supported by
> `alsa-lib` when creating a topology binary file, but ignored by kernel
> when loading this topology file.
>
> After applying this commit, the clock gating parameter is not ignored any
> more. The old behaviour is not broken, as by default the parameter value
> is 0.
>
> For example, the following config, based on
> alsa-lib/src/conf/topology/broadwell/broadwell.conf, is now supported:
>
> ~~~~
> SectionHWConfig."CodecHWConfig" {
> id "1"
> format "I2S" # physical audio format.
> bclk "master" # Platform is master of bit clock
> fsync "master" # platform is master of fsync
> pm_cont_clock "true" # clock is continuous, and can not be gated
> }
>
> SectionLink."Codec" {
>
> # used for binding to the physical link
> id "0"
>
> hw_configs [
> "CodecHWConfig"
> ]
>
> default_hw_conf_id "1"
> }
> ~~~~
>
> Signed-off-by: Kirill Marinushkin <[email protected]>
> Cc: Liam Girdwood <[email protected]>
> Cc: Mark Brown <[email protected]>
> Cc: Jaroslav Kysela <[email protected]>
> Cc: Takashi Iwai <[email protected]>
> Cc: [email protected]
> Cc: [email protected]
> ---
> sound/soc/soc-topology.c | 6 ++++++
> 1 file changed, 6 insertions(+)
>
> diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
> index 01a50413c66f..21bd4f96348d 100644
> --- a/sound/soc/soc-topology.c
> +++ b/sound/soc/soc-topology.c
> @@ -1981,6 +1981,12 @@ static void set_link_hw_format(struct snd_soc_dai_link *link,
>
> link->dai_fmt = hw_config->fmt & SND_SOC_DAIFMT_FORMAT_MASK;
>
> + /* clock gating */
> + if (hw_config->clock_cont)
> + link->dai_fmt |= SND_SOC_DAIFMT_CONT;
> + else
> + link->dai_fmt |= SND_SOC_DAIFMT_GATED;
> +
> /* clock signal polarity */
> invert_bclk = hw_config->invert_bclk;
> invert_fsync = hw_config->invert_fsync;
This patch is outdated. Patch v2 is sent in a different thread to replace it.
Best Regards,
Kirill