diff options
| author | Rodrigo Vivi <[email protected]> | 2018-07-23 09:13:12 -0700 | 
|---|---|---|
| committer | Rodrigo Vivi <[email protected]> | 2018-07-23 09:13:12 -0700 | 
| commit | c74a7469f97c0f40b46e82ee979f9fb1bb6e847c (patch) | |
| tree | f2690a1a916b73ef94657fbf0e0141ae57701825 /sound/soc/uniphier/aio-core.c | |
| parent | 6f15a7de86c8cf2dc09fc9e6d07047efa40ef809 (diff) | |
| parent | 500775074f88d9cf5416bed2ca19592812d62c41 (diff) | |
Merge drm/drm-next into drm-intel-next-queued
We need a backmerge to get DP_DPCD_REV_14 before we push other
i915 changes to dinq that could break compilation.
Signed-off-by: Rodrigo Vivi <[email protected]>
Diffstat (limited to 'sound/soc/uniphier/aio-core.c')
| -rw-r--r-- | sound/soc/uniphier/aio-core.c | 71 | 
1 files changed, 58 insertions, 13 deletions
| diff --git a/sound/soc/uniphier/aio-core.c b/sound/soc/uniphier/aio-core.c index 6d50042a4571..638cb3fc5f7b 100644 --- a/sound/soc/uniphier/aio-core.c +++ b/sound/soc/uniphier/aio-core.c @@ -3,19 +3,6 @@  // Socionext UniPhier AIO ALSA common driver.  //  // Copyright (c) 2016-2018 Socionext Inc. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; version 2 -// of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, see <http://www.gnu.org/licenses/>.  #include <linux/bitfield.h>  #include <linux/errno.h> @@ -673,6 +660,64 @@ void aio_port_set_enable(struct uniphier_aio_sub *sub, int enable)  }  /** + * aio_port_get_volume - get volume of AIO port block + * @sub: the AIO substream pointer + * + * Return: current volume, range is 0x0000 - 0xffff + */ +int aio_port_get_volume(struct uniphier_aio_sub *sub) +{ +	struct regmap *r = sub->aio->chip->regmap; +	u32 v; + +	regmap_read(r, OPORTMXTYVOLGAINSTATUS(sub->swm->oport.map, 0), &v); + +	return FIELD_GET(OPORTMXTYVOLGAINSTATUS_CUR_MASK, v); +} + +/** + * aio_port_set_volume - set volume of AIO port block + * @sub: the AIO substream pointer + * @vol: target volume, range is 0x0000 - 0xffff. + * + * Change digital volume and perfome fade-out/fade-in effect for specified + * output slot of port. Gained PCM value can calculate as the following: + *   Gained = Original * vol / 0x4000 + */ +void aio_port_set_volume(struct uniphier_aio_sub *sub, int vol) +{ +	struct regmap *r = sub->aio->chip->regmap; +	int oport_map = sub->swm->oport.map; +	int cur, diff, slope = 0, fs; + +	if (sub->swm->dir == PORT_DIR_INPUT) +		return; + +	cur = aio_port_get_volume(sub); +	diff = abs(vol - cur); +	fs = params_rate(&sub->params); +	if (fs) +		slope = diff / AUD_VOL_FADE_TIME * 1000 / fs; +	slope = max(1, slope); + +	regmap_update_bits(r, OPORTMXTYVOLPARA1(oport_map, 0), +			   OPORTMXTYVOLPARA1_SLOPEU_MASK, slope << 16); +	regmap_update_bits(r, OPORTMXTYVOLPARA2(oport_map, 0), +			   OPORTMXTYVOLPARA2_TARGET_MASK, vol); + +	if (cur < vol) +		regmap_update_bits(r, OPORTMXTYVOLPARA2(oport_map, 0), +				   OPORTMXTYVOLPARA2_FADE_MASK, +				   OPORTMXTYVOLPARA2_FADE_FADEIN); +	else +		regmap_update_bits(r, OPORTMXTYVOLPARA2(oport_map, 0), +				   OPORTMXTYVOLPARA2_FADE_MASK, +				   OPORTMXTYVOLPARA2_FADE_FADEOUT); + +	regmap_write(r, AOUTFADECTR0, BIT(oport_map)); +} + +/**   * aio_if_set_param - set parameters of AIO DMA I/F block   * @sub: the AIO substream pointer   * @pass_through: Zero if sound data is LPCM, otherwise if data is not LPCM. |