From patchwork Wed Apr 2 14:17:05 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Charles Keepax X-Patchwork-Id: 3929061 Return-Path: X-Original-To: patchwork-alsa-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 317659F334 for ; Wed, 2 Apr 2014 14:26:19 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 58C8F201F5 for ; Wed, 2 Apr 2014 14:26:18 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.kernel.org (Postfix) with ESMTP id 215DC201D5 for ; Wed, 2 Apr 2014 14:26:17 +0000 (UTC) Received: by alsa0.perex.cz (Postfix, from userid 1000) id C67302654DF; Wed, 2 Apr 2014 16:26:15 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,NO_DNS_FOR_FROM, UNPARSEABLE_RELAY autolearn=no version=3.3.1 Received: from alsa0.perex.cz (localhost [IPv6:::1]) by alsa0.perex.cz (Postfix) with ESMTP id DF8BD2654BA; Wed, 2 Apr 2014 16:26:03 +0200 (CEST) X-Original-To: alsa-devel@alsa-project.org Delivered-To: alsa-devel@alsa-project.org Received: by alsa0.perex.cz (Postfix, from userid 1000) id 4E96E2654CD; Wed, 2 Apr 2014 16:26:02 +0200 (CEST) Received: from opensource.wolfsonmicro.com (opensource.wolfsonmicro.com [80.75.67.52]) by alsa0.perex.cz (Postfix) with ESMTP id 461F22654BA for ; Wed, 2 Apr 2014 16:25:54 +0200 (CEST) Received: from localhost.localdomain (unknown [87.246.78.26]) by opensource.wolfsonmicro.com (Postfix) with ESMTPSA id 68512750065; Wed, 2 Apr 2014 15:25:53 +0100 (BST) From: Charles Keepax To: broonie@kernel.org Date: Wed, 2 Apr 2014 15:17:05 +0100 Message-Id: <1396448225-19936-1-git-send-email-ckeepax@opensource.wolfsonmicro.com> X-Mailer: git-send-email 1.7.2.5 Cc: alsa-devel@alsa-project.org, patches@opensource.wolfsonmicro.com, lgirdwood@gmail.com Subject: [alsa-devel] [PATCH] ASoC: core: Only kmemdup binary control buffer if masking X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP When writing a binary control we may apply a mask to the first register, as this requires modifying the data the buffer is duplicated, currently this is done for all binary control writes. As most binary controls don't use the mask facility and thus can freely use the original buffer, avoid the kmemdup for these cases. Signed-off-by: Charles Keepax --- sound/soc/soc-core.c | 86 ++++++++++++++++++++++++------------------------- 1 files changed, 42 insertions(+), 44 deletions(-) diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index caebd63..275bd71 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -3229,67 +3229,65 @@ int snd_soc_bytes_put(struct snd_kcontrol *kcontrol, len = params->num_regs * codec->val_bytes; - data = kmemdup(ucontrol->value.bytes.data, len, GFP_KERNEL | GFP_DMA); - if (!data) - return -ENOMEM; + if (!params->mask) + return regmap_raw_write(codec->control_data, params->base, + ucontrol->value.bytes.data, len); /* * If we've got a mask then we need to preserve the register * bits. We shouldn't modify the incoming data so take a * copy. */ - if (params->mask) { - ret = regmap_read(codec->control_data, params->base, &val); - if (ret != 0) - goto out; + data = kmemdup(ucontrol->value.bytes.data, len, + GFP_KERNEL | GFP_DMA); + if (!data) + return -ENOMEM; - val &= params->mask; + ret = regmap_read(codec->control_data, params->base, &val); + if (ret != 0) + goto out; - switch (codec->val_bytes) { - case 1: - ((u8 *)data)[0] &= ~params->mask; - ((u8 *)data)[0] |= val; - break; - case 2: - mask = ~params->mask; - ret = regmap_parse_val(codec->control_data, - &mask, &mask); - if (ret != 0) - goto out; + val &= params->mask; - ((u16 *)data)[0] &= mask; + switch (codec->val_bytes) { + case 1: + ((u8 *)data)[0] &= ~params->mask; + ((u8 *)data)[0] |= val; + break; + case 2: + mask = ~params->mask; + ret = regmap_parse_val(codec->control_data, &mask, &mask); + if (ret != 0) + goto out; - ret = regmap_parse_val(codec->control_data, - &val, &val); - if (ret != 0) - goto out; + ((u16 *)data)[0] &= mask; - ((u16 *)data)[0] |= val; - break; - case 4: - mask = ~params->mask; - ret = regmap_parse_val(codec->control_data, - &mask, &mask); - if (ret != 0) - goto out; + ret = regmap_parse_val(codec->control_data, &val, &val); + if (ret != 0) + goto out; - ((u32 *)data)[0] &= mask; + ((u16 *)data)[0] |= val; + break; + case 4: + mask = ~params->mask; + ret = regmap_parse_val(codec->control_data, &mask, &mask); + if (ret != 0) + goto out; - ret = regmap_parse_val(codec->control_data, - &val, &val); - if (ret != 0) - goto out; + ((u32 *)data)[0] &= mask; - ((u32 *)data)[0] |= val; - break; - default: - ret = -EINVAL; + ret = regmap_parse_val(codec->control_data, &val, &val); + if (ret != 0) goto out; - } + + ((u32 *)data)[0] |= val; + break; + default: + ret = -EINVAL; + goto out; } - ret = regmap_raw_write(codec->control_data, params->base, - data, len); + ret = regmap_raw_write(codec->control_data, params->base, data, len); out: kfree(data);