From: Russell King <rmk+kernel@arm.linux.org.uk> To: alsa-devel@alsa-project.org, dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org Cc: Fabio Estevam <fabio.estevam@freescale.com>, David Airlie <airlied@linux.ie>, Takashi Iwai <tiwai@suse.de>, Mark Brown <broonie@kernel.org>, Philipp Zabel <p.zabel@pengutronix.de>, Yakir Yang <ykk@rock-chips.com> Subject: [PATCH 10/13] sound/core: add DRM ELD helper Date: Sat, 09 May 2015 11:26:42 +0100 Message-ID: <E1Yr1xy-0006l8-Ft@rmk-PC.arm.linux.org.uk> (raw) In-Reply-To: <20150509102501.GO2067@n2100.arm.linux.org.uk> Add a helper for the EDID like data structure, which is typically passed from a HDMI adapter to its associated audio driver. This informs the audio driver of the capabilities of the attached HDMI sink. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> --- include/sound/pcm_drm_eld.h | 6 +++ sound/core/Kconfig | 3 ++ sound/core/Makefile | 1 + sound/core/pcm_drm_eld.c | 99 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 109 insertions(+) create mode 100644 include/sound/pcm_drm_eld.h create mode 100644 sound/core/pcm_drm_eld.c diff --git a/include/sound/pcm_drm_eld.h b/include/sound/pcm_drm_eld.h new file mode 100644 index 000000000000..93357b25d2e2 --- /dev/null +++ b/include/sound/pcm_drm_eld.h @@ -0,0 +1,6 @@ +#ifndef __SOUND_PCM_DRM_ELD_H +#define __SOUND_PCM_DRM_ELD_H + +int snd_pcm_hw_constraint_eld(struct snd_pcm_runtime *runtime, void *eld); + +#endif diff --git a/sound/core/Kconfig b/sound/core/Kconfig index 313f22e9d929..b534c8a6046b 100644 --- a/sound/core/Kconfig +++ b/sound/core/Kconfig @@ -6,6 +6,9 @@ config SND_PCM tristate select SND_TIMER +config SND_PCM_ELD + bool + config SND_DMAENGINE_PCM tristate diff --git a/sound/core/Makefile b/sound/core/Makefile index 4daf2f58261c..591b49157b4d 100644 --- a/sound/core/Makefile +++ b/sound/core/Makefile @@ -13,6 +13,7 @@ snd-$(CONFIG_SND_JACK) += jack.o snd-pcm-y := pcm.o pcm_native.o pcm_lib.o pcm_timer.o pcm_misc.o \ pcm_memory.o memalloc.o snd-pcm-$(CONFIG_SND_DMA_SGBUF) += sgbuf.o +snd-pcm-$(CONFIG_SND_PCM_ELD) += pcm_drm_eld.o # for trace-points CFLAGS_pcm_lib.o := -I$(src) diff --git a/sound/core/pcm_drm_eld.c b/sound/core/pcm_drm_eld.c new file mode 100644 index 000000000000..e70379fb63d0 --- /dev/null +++ b/sound/core/pcm_drm_eld.c @@ -0,0 +1,99 @@ +/* + * PCM DRM helpers + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include <linux/export.h> +#include <drm/drm_edid.h> +#include <sound/pcm.h> +#include <sound/pcm_drm_eld.h> + +static const unsigned int eld_rates[] = { + 32000, + 44100, + 48000, + 88200, + 96000, + 176400, + 192000, +}; + +static unsigned int sad_max_channels(const u8 *sad) +{ + return 1 + (sad[0] & 7); +} + +static int eld_limit_rates(struct snd_pcm_hw_params *params, + struct snd_pcm_hw_rule *rule) +{ + struct snd_interval *r = hw_param_interval(params, rule->var); + struct snd_interval *c; + unsigned int rate_mask = 7, i; + const u8 *sad, *eld = rule->private; + + sad = drm_eld_sad(eld); + if (sad) { + c = hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS); + + for (i = drm_eld_sad_count(eld); i > 0; i--, sad += 3) { + unsigned max_channels = sad_max_channels(sad); + + /* + * Exclude SADs which do not include the + * requested number of channels. + */ + if (c->min <= max_channels) + rate_mask |= sad[1]; + } + } + + return snd_interval_list(r, ARRAY_SIZE(eld_rates), eld_rates, + rate_mask); +} + +static int eld_limit_channels(struct snd_pcm_hw_params *params, + struct snd_pcm_hw_rule *rule) +{ + struct snd_interval *c = hw_param_interval(params, rule->var); + struct snd_interval *r; + struct snd_interval t = { .min = 1, .max = 2, .integer = 1, }; + unsigned int i; + const u8 *sad, *eld = rule->private; + + sad = drm_eld_sad(eld); + if (sad) { + unsigned int rate_mask = 0; + + /* Convert the rate interval to a mask */ + r = hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE); + for (i = 0; i < ARRAY_SIZE(eld_rates); i++) + if (r->min <= eld_rates[i] && r->max >= eld_rates[i]) + rate_mask |= BIT(i); + + for (i = drm_eld_sad_count(eld); i > 0; i--, sad += 3) + if (rate_mask & sad[1]) + t.max = max(t.max, sad_max_channels(sad)); + } + + return snd_interval_refine(c, &t); +} + +int snd_pcm_hw_constraint_eld(struct snd_pcm_runtime *runtime, void *eld) +{ + int ret; + + ret = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, + eld_limit_rates, eld, + SNDRV_PCM_HW_PARAM_CHANNELS, -1); + if (ret < 0) + return ret; + + ret = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS, + eld_limit_channels, eld, + SNDRV_PCM_HW_PARAM_RATE, -1); + + return ret; +} +EXPORT_SYMBOL_GPL(snd_pcm_hw_constraint_eld); -- 1.8.3.1
next prev parent reply index Thread overview: 74+ messages / expand[flat|nested] mbox.gz Atom feed top 2015-04-02 9:20 [RFC v2 0/13] dw_hdmi cleanups, audio preparation, helpers and ahb audio support Russell King - ARM Linux 2015-04-02 9:21 ` [PATCH RFC v2 01/13] drm: imx/dw_hdmi: move phy comments Russell King 2015-04-02 9:21 ` [PATCH RFC v2 02/13] drm: bridge/dw_hdmi: clean up phy configuration Russell King 2015-04-02 9:21 ` [PATCH RFC v2 03/13] drm: bridge/dw_hdmi: clean up hdmi_set_clk_regenerator() Russell King 2015-04-02 9:21 ` [PATCH RFC v2 04/13] drm: bridge/dw_hdmi: use drm_hdmi_avi_infoframe_from_display_mode() Russell King 2015-04-02 9:21 ` [PATCH RFC v2 05/13] drm: bridge/dw_hdmi: simplify hdmi_config_AVI() a little Russell King 2015-04-02 9:21 ` [PATCH RFC v2 06/13] drm: bridge/dw_hdmi: remove mhsyncpolarity/mvsyncpolarity/minterlaced Russell King 2015-04-02 9:21 ` [PATCH RFC v2 07/13] drm: bridge/dw_hdmi: introduce interface to setting sample rate Russell King 2015-04-02 9:21 ` [PATCH RFC v2 08/13] drm: bridge/dw_hdmi: introduce interfaces to enable and disable audio Russell King 2015-04-02 9:22 ` [PATCH RFC v2 09/13] drm/edid: add function to help find SADs Russell King 2015-04-02 9:22 ` [PATCH RFC v2 10/13] sound/core: add DRM ELD helper Russell King 2015-04-05 15:57 ` Takashi Iwai 2015-04-05 16:20 ` Russell King - ARM Linux 2015-04-05 16:46 ` Takashi Iwai 2015-04-05 17:26 ` Russell King - ARM Linux 2015-05-06 17:02 ` Anssi Hannula 2015-05-07 10:41 ` Russell King - ARM Linux 2015-05-07 11:11 ` Lars-Peter Clausen 2015-05-08 10:56 ` [alsa-devel] " Jyri Sarha 2015-05-08 11:42 ` Russell King - ARM Linux 2015-05-05 22:35 ` Mark Brown 2015-05-06 8:58 ` Liam Girdwood 2015-05-08 13:16 ` [alsa-devel] " Jyri Sarha 2015-05-08 13:27 ` Russell King - ARM Linux 2015-05-08 13:37 ` Jyri Sarha 2015-04-02 9:22 ` [PATCH RFC v2 11/13] sound/core: add IEC958 channel status helper Russell King 2015-04-02 9:22 ` [PATCH RFC v2 12/13] drm: bridge/dw_hdmi-ahb-audio: add audio driver Russell King 2015-04-02 9:22 ` [PATCH RFC v2 13/13] drm: bridge/dw_hdmi-ahb-audio: parse ELD from HDMI driver Russell King 2015-05-09 10:25 ` [PATCH v3 0/13] dw_hdmi cleanups, audio preparation, helpers and ahb audio support Russell King - ARM Linux 2015-05-09 10:25 ` [PATCH 01/13] drm: imx/dw_hdmi: move phy comments Russell King 2015-05-09 10:26 ` [PATCH 02/13] drm: bridge/dw_hdmi: clean up phy configuration Russell King 2015-05-22 15:19 ` Yakir 2015-05-09 10:26 ` [PATCH 03/13] drm: bridge/dw_hdmi: clean up hdmi_set_clk_regenerator() Russell King 2015-05-22 15:22 ` Yakir 2015-05-09 10:26 ` [PATCH 04/13] drm: bridge/dw_hdmi: use drm_hdmi_avi_infoframe_from_display_mode() Russell King 2015-05-09 10:26 ` [PATCH 05/13] drm: bridge/dw_hdmi: simplify hdmi_config_AVI() a little Russell King 2015-05-09 10:26 ` [PATCH 06/13] drm: bridge/dw_hdmi: remove mhsyncpolarity/mvsyncpolarity/minterlaced Russell King 2015-05-09 10:26 ` [PATCH 07/13] drm: bridge/dw_hdmi: introduce interface to setting sample rate Russell King 2015-05-22 15:26 ` Yakir 2015-05-09 10:26 ` [PATCH 08/13] drm: bridge/dw_hdmi: introduce interfaces to enable and disable audio Russell King 2015-05-22 15:28 ` Yakir 2015-05-09 10:26 ` [PATCH 09/13] drm/edid: add function to help find SADs Russell King 2015-05-09 10:26 ` Russell King [this message] 2015-05-22 12:20 ` [alsa-devel] [PATCH 10/13] sound/core: add DRM ELD helper Mark Brown 2015-05-22 13:15 ` Russell King - ARM Linux 2015-05-22 13:30 ` Takashi Iwai 2015-05-22 13:53 ` Russell King - ARM Linux 2015-05-22 13:54 ` Takashi Iwai 2015-05-22 14:00 ` Russell King - ARM Linux 2015-05-22 14:02 ` Takashi Iwai 2015-05-22 14:05 ` Takashi Iwai 2015-05-22 16:12 ` Russell King - ARM Linux 2015-05-09 10:26 ` [PATCH 11/13] sound/core: add IEC958 channel status helper Russell King 2015-05-22 12:40 ` Mark Brown 2015-05-09 10:26 ` [PATCH 12/13] drm: bridge/dw_hdmi-ahb-audio: add audio driver Russell King 2015-05-09 16:49 ` [alsa-devel] " Anssi Hannula 2015-05-09 16:55 ` Russell King - ARM Linux 2015-05-09 17:07 ` Anssi Hannula 2015-05-09 17:40 ` Russell King - ARM Linux 2015-05-09 17:53 ` Russell King - ARM Linux 2015-05-09 17:55 ` Anssi Hannula 2015-05-09 18:11 ` Russell King - ARM Linux 2015-05-10 18:59 ` Anssi Hannula 2015-05-10 19:33 ` Russell King - ARM Linux 2015-05-10 20:47 ` Anssi Hannula 2015-05-11 15:58 ` Mark Brown 2015-05-09 10:26 ` [PATCH 13/13] drm: bridge/dw_hdmi-ahb-audio: parse ELD from HDMI driver Russell King 2015-05-27 10:43 ` Daniel Vetter 2015-05-27 11:43 ` Mark Brown 2015-05-27 17:31 ` Russell King - ARM Linux 2015-05-27 21:29 ` Daniel Vetter 2015-05-27 21:44 ` Russell King - ARM Linux 2015-05-28 6:43 ` Daniel Vetter 2015-05-28 4:56 ` [alsa-devel] " Takashi Iwai
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=E1Yr1xy-0006l8-Ft@rmk-PC.arm.linux.org.uk \ --to=rmk+kernel@arm.linux.org.uk \ --cc=airlied@linux.ie \ --cc=alsa-devel@alsa-project.org \ --cc=broonie@kernel.org \ --cc=dri-devel@lists.freedesktop.org \ --cc=fabio.estevam@freescale.com \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=p.zabel@pengutronix.de \ --cc=tiwai@suse.de \ --cc=ykk@rock-chips.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
Alsa-Devel Archive on lore.kernel.org Archives are clonable: git clone --mirror https://lore.kernel.org/alsa-devel/0 alsa-devel/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 alsa-devel alsa-devel/ https://lore.kernel.org/alsa-devel \ alsa-devel@alsa-project.org public-inbox-index alsa-devel Example config snippet for mirrors Newsgroup available over NNTP: nntp://nntp.lore.kernel.org/org.alsa-project.alsa-devel AGPL code for this site: git clone https://public-inbox.org/public-inbox.git