From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752116AbcF1IMv (ORCPT ); Tue, 28 Jun 2016 04:12:51 -0400 Received: from mail-db3on0115.outbound.protection.outlook.com ([157.55.234.115]:23151 "EHLO emea01-db3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750704AbcF1IMr (ORCPT ); Tue, 28 Jun 2016 04:12:47 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=peda@axentia.se; Subject: Re: [PATCH v4 3/4] ASoC: dapm: support mixer controls with mute at non-zero value To: References: <1463260181-21344-1-git-send-email-peda@axentia.se> <1463260181-21344-4-git-send-email-peda@axentia.se> CC: Pawel Moll , Kumar Gala , Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai , Misbah Ullah Khan , From: Peter Rosin Organization: Axentia Technologies AB Message-ID: <7780cb9b-9d46-7cbb-501e-10a154ccc527@axentia.se> Date: Tue, 28 Jun 2016 10:12:37 +0200 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.1.1 MIME-Version: 1.0 In-Reply-To: <1463260181-21344-4-git-send-email-peda@axentia.se> Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit X-Originating-IP: [217.210.101.82] X-ClientProxiedBy: HE1PR10CA0038.EURPRD10.PROD.OUTLOOK.COM (10.167.243.176) To DB5PR02MB1304.eurprd02.prod.outlook.com (10.164.177.150) X-MS-Office365-Filtering-Correlation-Id: 020919b4-f022-44cd-8237-08d39f2bfb24 X-Microsoft-Exchange-Diagnostics: 1;DB5PR02MB1304;2:KY9QtQvuGuoNQn7KfL/vQefLJq0hBnn2LD07vfH6gdgaIJcQ0GtRK0M6dJmB53L29IJl7yajsmPLFi8GzcZeGcaCG1+4D3/yuHaepoRt2prH6R85qdI6WAW6JIazw1i+tfexc2cIfG7nbgnrFzqnVYnKD8DBOHEu+TJOvRBXmEhpVWVhHtAUq+i4IBH7gYUB;3:kPke1mpPVZvHW02KHMM4P6J2b6SHroBXsuTa0fw9G8Zo5jmh5MQqgSMNC7GV96VStFV9mpph3qUaOAbG7rKKlNcPpWWQ7tTusBNHWP370Qhy4cbx2N9QDu9GLF481Ei9;25:9p6AB8hmVkJkEryXRpj6ayAnlqHV0YVwXzVSkhfWSXq4D8Ei63dFy+pPjFA65DbyuqZqlgAWo9JVviNm4AE9TDZunWCwClD3fqsjosistMx8UE7/bkdtLHeFKbcnK4LEFsd3bymEEB5GtbIZCFSVtsN5ODiQoAApNPQF/YsoqNsqIOS6wcNW3LVLXF4B2c/eIGJfjC9NdG0lFIfgtInZQ1TR9jwoTvHwHQfS/p1PaY2hoyz9McfnVVFZSRJhn39aD/2aemf8aRvDEnmGcG+lpxB8oM6lyN+nvN2hiZw2zltOlmpdzdYJmzyRZ4PpZwIEb77T+UYpc70Iew9ZHK7bfF3qZfFXzA/vJktREk2pm6VynuHjjUOoQ56InW5dMBaUlnukpXceGgmkJM6rMBb49jjkMdCmghl+W8D+4g/ZS7Q=;31:kHJJyEnAsI2uFa56zEsE5TAP3AyFFfl2IPwRaoBn5sXZplMXbpv/F5E9Bjl69Si4Qrq1IHRe7MNKi706N5TgO2Bf2CW1At+uhJiexzzdqJdVNq91eNlHH/hXxmeGX2it/nryzhBy6jK8qfR3UhGYufWVAcy2pc2ulODoQfML3Ha7Xh5bmIICjM/Dz9y527pCt6HHuyKu48WIDIghnNAdyA== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:DB5PR02MB1304; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(21532816269658); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040130)(601004)(2401047)(5005006)(8121501046)(10201501046)(3002001)(6041072)(6043046);SRVR:DB5PR02MB1304;BCL:0;PCL:0;RULEID:;SRVR:DB5PR02MB1304; X-Microsoft-Exchange-Diagnostics: 1;DB5PR02MB1304;4:ciltjlFefWLgaGTKbcsbvZ/+XntgXEu/+mUCWIfBTaspKWQTbfb0INz3aKbtLcw4UmRHDw4wDS07NwHNHL1pGoIqizdUsyz2R4JMz27wjkPIwVzc6OCNHLB+FIlOtvnsu5AmboWDuLV4tlDJeBWPKnSDNPFjAiNtj3OWt+a2jXNuPPSRh1oMtux1nfYXMqCy4+FTTLyoC8mvwqlBlDSJvsK+1a9GTkbsD40hSpoNkKrlm6huXqyUAC9xU87OWkBv5P613bx48n0N2j05FII8dwJEdVC5x3ivLVCdKXk6O/c7QL853ZivybqfdOGVrR9FB7RbKBs/3UrHRSU155ow9vxO0WmJxlxxr72LLGfEg+QZ2uhjDPubjsgDmOdYW+Zyr/U7DrFYcraQ/reTlE0LBo52aVBLrmnciD9qS4SJzSiMrpwt6FcOEzBKb1GM3RmHM6EoJHaC2wiPXZP/iibUHQ42BW++y7eAeYokIDLBUys= X-Forefront-PRVS: 0987ACA2E2 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(6049001)(7916002)(199003)(24454002)(377424004)(189002)(42186005)(68736007)(50466002)(101416001)(110136002)(189998001)(33646002)(586003)(74482002)(4326007)(31686004)(2906002)(36756003)(92566002)(64126003)(23746002)(6116002)(3846002)(305945005)(86362001)(230700001)(54356999)(2950100001)(7736002)(7846002)(76176999)(47776003)(66066001)(65956001)(65806001)(19580395003)(19580405001)(50986999)(97736004)(77096005)(105586002)(4001350100001)(81156014)(81166006)(31696002)(8676002)(83506001)(117156001)(106356001)(2351001)(65826006)(42262002)(309714004);DIR:OUT;SFP:1102;SCL:1;SRVR:DB5PR02MB1304;H:[192.168.0.125];FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?Windows-1252?Q?1;DB5PR02MB1304;23:g2FKR7rIBqM0+yO9uJkLafD/Hmlfd5s9zYvsq?= =?Windows-1252?Q?Mt64VQBZ8YAnxoqvvk6Qfc6C8lzV7McQ4c1ZIXNkXUtdFeJ6Tl1ufMSb?= =?Windows-1252?Q?x9HoMgJAvOBDdaKChQvJCmUtN50rTUYxlYcKmtkCI7hdffFJXSaz0mta?= =?Windows-1252?Q?SqTxjb2zYU+gwKsXB9HPJ/P2m9CtczCA+xwQqWNXSCRK7KwUSnpH8Fry?= =?Windows-1252?Q?nWKmy8OM4LBc9Uaa8SKIfWuhO3diT4DNLbrj7oZqhsP0mOQS/TzbCxgG?= =?Windows-1252?Q?mRntm5lOK3tTiaGdZnHvln/5sFNWm3brKlgK6R5jkLJICe8LLu8KQBPx?= =?Windows-1252?Q?7/VcFfE7mg7BcBUbQGYzKCW4pz+qNuJnZVkUpBJUCkz32ErbGV7/0Ju0?= =?Windows-1252?Q?UkkErkSvKVUdaiujHozC0tX6Q4NAg6f+EsCmw3qeqhgT+Yy9l/RJya0C?= =?Windows-1252?Q?vwguVkoh/yWoH8Xl0PvmHa+mFWJ+8UvhDjJDH5JmBYoqOiJHlmZFNk3y?= =?Windows-1252?Q?Rb4RjofgzmCWFPOXIwHCn0OnS4hs1EROJo2GT67H2p5dsOHO0W7d2tj3?= =?Windows-1252?Q?w22Q+Nvyfn5WCFmHwep8OFOXCcPuVM58/CCkGD2BK0WQ5rK+DQQEJfUe?= =?Windows-1252?Q?GifXxAojqum+2xRx2dU3qF9KovnVNptpXJkW6EUdQ1Dc2TGqF5pdjDN4?= =?Windows-1252?Q?1/aNaykk/wG1wpGiMXbrL/g4rgML6vk1iOXCFkX/CZUZEAVOWZf94Unt?= =?Windows-1252?Q?kx5dqfk8MWsYBHGmX9mqPT27szawkn9XzP4NGo9vM7auJ36O79yjdpca?= =?Windows-1252?Q?P/kosJbXJm/1Uawf99dFRGXzfan43hH8Tu8Ca6A0erTPcFRgfm0VFNwD?= =?Windows-1252?Q?o5pOYM0cGmZSAKmd/DMA7S0grWJs5oNFxxMnKmoVWryt796gCvWNFDz2?= =?Windows-1252?Q?zcJ8/UikWntDHt9gCcuGpRe/+DzaUD3eDO/8XYo4+TYWAv36wfhqYinG?= =?Windows-1252?Q?s89HBuX5cMcScPLODwJl1bBfV5ppxqozf99R2EMYewYKl6Oz+wmTtBoY?= =?Windows-1252?Q?VWlz/lXX0xjY4HJNu2CUY5tmOsX6bcqT6Mo9F/sbpPwH0WxQhfzorhpU?= =?Windows-1252?Q?5qdemknxlCSmdAPiicFPzETWcoGQ/BqduQNvEwLTXeVBNwkjM+JzA7oF?= =?Windows-1252?Q?Vwd24BSeGnIBm7uNXYRbSMsEnfu3E8sqfrYndH2JTBauD2hrAdLlE9Rj?= =?Windows-1252?Q?4x8sKKBGONPhNca3avVyZHrUULkVLeobCpQVgHzpjB34S5383s+Kaqh2?= =?Windows-1252?Q?ke9xrelp+0NFh9Nk2msaaLA/lPxShuQv84IvgQ76EdaExHcYq9INuEt9?= =?Windows-1252?Q?CUdjjaP7qDgl1mTTL8HSFgqQJiTF6JAKlEKZKWMw8HO/bPWegQsCLku8?= =?Windows-1252?Q?b5NaBtyaqrq4Ta7CwhtIcS6EJsZRuZpUfTlj5C0Xcm5pGnC7QtK5X1jX?= =?Windows-1252?Q?DWoWXs=3D?= X-Microsoft-Exchange-Diagnostics: 1;DB5PR02MB1304;6:ZQsShMETVttmlV2zauvW8mMAOwllleBB4Cmp3h2o5C9L81S7uxPK3Eiy6+GutSsyDLvh7IuksETRawuaee4zUHsFxbh/wRpPbW6UrEgsDtcuUb+UKbxCg32Pw0Ett57fog7nXIVGjR4pvg75HuUwtHba2v6QPSRw5iuQnHeY2MvdFvrkADImHrzaMQ0fxbPYHEDL0L5fyiXZ4IIzKqswRt0Wyv4zVdqYDqNgBNbDOYrRXrfzRTg4Z9QRiUiMxME3TH/sCzPkIywInUyKu2EglVjUmwo+DWQDZqqR820cFdFt9enckCM5QYy9mxhBFi3N;5:mbkvcjwey0UPBzmOrA1AEDMSTbMc728aowLhdNSErlGMl6Kz2mDYD8My5h+XW8A7WSGgeBQ+bUwa31aup4zOkEopSKlDcibx5l8ii3ORAkhEMx4l9/FdlAmSym9bBiOEyrmep0Z3JMj0DfXGvggrvQ==;24:5rbAmnRyhuC7ddXVikdy+YkLMMOa3znMQSL6mt7XaLbnYLgRrN6xGnPZX5lineN7Vxkpj3oaQ9mOSs6ITW/jhds5PKWg2fEPcyVoKJ39iVI=;7:Ga2WVd01HOvbczFV/p3ayrPZvxUXvGVxfHWcEUaUyuoT30q3lFtnP/MJFTGtcxPn8s+4QaAXr8FDlYslxObEsts9wHprwN6TedwAIZOB2TjIi8VmhUJGfZOcTVfN9RS5ppJk2w2chex/uof1L0o7lZr8CGEitwMmT0FNYicy8eoVa69O4c40KJQoKxaZ2klwFJDSHDoo/GjUVR5W0hJUrW7fbODm2VGSkIspU36nszSOMOzIWCDW8hp2hYjWy/Ne SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: axentia.se X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Jun 2016 08:12:42.3305 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB5PR02MB1304 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi! Sorry to send a ping like this, with the patch still in patchwork and all. But it's been a month since 1/4 and 2/4 were committed and I expected at least some comment on the approach for patches 3 and 4... Cheers, Peter On 2016-05-14 23:09, Peter Rosin wrote: > The max9860 codec has a mixer control field that has its mute/disable at > the wrong end of the scale. I.e. you turn the volume up and up, and then > as the final step the volume is off. This does not sit well with DAPM, > which assumes the mute/off is at the minimum value. > > Add support for such backwards controls with code that searches TLV ranges > for the mute value and use that as trigger for DAPM off. > > Signed-off-by: Peter Rosin > --- > sound/soc/soc-dapm.c | 38 +++++++++++++++++++++++++++++++++++--- > 1 file changed, 35 insertions(+), 3 deletions(-) > > diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c > index c4464858bf01..8a1131781339 100644 > --- a/sound/soc/soc-dapm.c > +++ b/sound/soc/soc-dapm.c > @@ -42,6 +42,7 @@ > #include > #include > #include > +#include > > #include > > @@ -722,16 +723,46 @@ static int dapm_connect_mux(struct snd_soc_dapm_context *dapm, > return -ENODEV; > } > > +static int dapm_find_tlv_mute(const unsigned int *tlv) > +{ > + int cnt; > + const unsigned int *range; > + > + if (!tlv || tlv[0] != SNDRV_CTL_TLVT_DB_RANGE) > + return 0; > + > + cnt = tlv[1] / sizeof(unsigned int); > + > + /* > + * Each group of six values should be > + * { start end type len min step/mute } > + */ > + for (range = &tlv[2]; cnt >= 6; cnt -= 6, range += 6) { > + if (range[2] != SNDRV_CTL_TLVT_DB_SCALE) > + return 0; /* wrong type, terminate */ > + if (range[3] != 2 * sizeof(unsigned int)) > + return 0; /* wrong len, terminate */ > + if (!(range[5] & TLV_DB_SCALE_MUTE)) > + continue; /* no mute in this range */ > + return range[0]; /* start of this range is the mute value */ > + } > + > + return 0; > +} > + > /* set up initial codec paths */ > static void dapm_set_mixer_path_status(struct snd_soc_dapm_path *p, int i) > { > + const struct snd_kcontrol_new *kcontrol_new > + = &p->sink->kcontrol_news[i]; > struct soc_mixer_control *mc = (struct soc_mixer_control *) > - p->sink->kcontrol_news[i].private_value; > + kcontrol_new->private_value; > unsigned int reg = mc->reg; > unsigned int shift = mc->shift; > unsigned int max = mc->max; > unsigned int mask = (1 << fls(max)) - 1; > unsigned int invert = mc->invert; > + int mute_value = dapm_find_tlv_mute(kcontrol_new->tlv.p); > unsigned int val; > > if (reg != SND_SOC_NOPM) { > @@ -739,7 +770,7 @@ static void dapm_set_mixer_path_status(struct snd_soc_dapm_path *p, int i) > val = (val >> shift) & mask; > if (invert) > val = max - val; > - p->connect = !!val; > + p->connect = val != mute_value; > } else { > p->connect = 0; > } > @@ -3045,6 +3076,7 @@ int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol, > int max = mc->max; > unsigned int mask = (1 << fls(max)) - 1; > unsigned int invert = mc->invert; > + int mute_value = dapm_find_tlv_mute(kcontrol->tlv.p); > unsigned int val; > int connect, change, reg_change = 0; > struct snd_soc_dapm_update update; > @@ -3056,7 +3088,7 @@ int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol, > kcontrol->id.name); > > val = (ucontrol->value.integer.value[0] & mask); > - connect = !!val; > + connect = val != mute_value; > > if (invert) > val = max - val; >