From patchwork Sat Dec 15 14:32:10 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Yan X-Patchwork-Id: 10732417 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E3F2617E6 for ; Sun, 16 Dec 2018 09:42:53 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D1A6D29D66 for ; Sun, 16 Dec 2018 09:42:53 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C610029D76; Sun, 16 Dec 2018 09:42:53 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=2.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 11B1929D66 for ; Sun, 16 Dec 2018 09:42:52 +0000 (UTC) Received: from alsa0.perex.cz (localhost [127.0.0.1]) by alsa0.perex.cz (Postfix) with ESMTP id 132C1267AA7; Sun, 16 Dec 2018 10:24:46 +0100 (CET) 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 0AAFF267AA7; Sat, 15 Dec 2018 15:32:26 +0100 (CET) Received: from mail-pg1-f195.google.com (mail-pg1-f195.google.com [209.85.215.195]) by alsa0.perex.cz (Postfix) with ESMTP id 549F02678D2; Sat, 15 Dec 2018 15:32:21 +0100 (CET) Received: by mail-pg1-f195.google.com with SMTP id j10so2825242pga.1; Sat, 15 Dec 2018 06:32:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:from:to:cc:subject:date:mime-version :content-transfer-encoding; bh=19+4b1+gN+uHdtPbcDy7Z8W7nLIB/f2mDUS2iwLzNhg=; b=I3aiJw/aMKDm5Q4/rwMzNFmh+8iQT7Brlxwb2zYZtuaQVPnkEDa6BVWgXI2q+//vWP wsjE12JYgglKwf1kWdE36N8FEQhyMby/4h3QhWgjivQld8ErpUQ6qDKKHpLWdwYY5FVN 9SRjyEFrW795fwSrV7ytd4FSGOUVZnnnoQmTPcJ0RXCPsYTEOVzinpS2V15IQefnSA7d /bkxNF9/cLfMw0H8hJWyaN20kbArv/Ln5Dt7B7nlPdDQTyctGCSfhZbfOK45ujXN+dsU 3bgKMr3M0h6k++88mS70Gr/3JvTWMpe+VOY23eL77W4sGUKYCR/k5MSfwsIsG/KfzvM2 dGMQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:from:to:cc:subject:date:mime-version :content-transfer-encoding; bh=19+4b1+gN+uHdtPbcDy7Z8W7nLIB/f2mDUS2iwLzNhg=; b=bickaJ42eo4uon3CQBSyER2/Jdw3Wu+D3pSq1S+WYq7YgDLqs8QO+96z2BOMdPbyqc A87LrvL5M5wUdi7ux1Ki5WnBRC+r4Rtb23h7K9LB7TzaoJSC118u/pmM+FpkZtEGQ6lT vCp0oaXSEop3vLLnFhJCheYO+9HvtIBlGrQAZaTLKj9EUzx1SFReTDQzDNy7EOuMBNx7 MUkZtIsBkR1il4JWXZ5WCTitvInzfmiAEdQwDL1nErzR3d7Bj94IwgS8b18vsoA0nujp ITiL6f/rj8vDQP8BVemTQ5HTo6EZLLLZsnbF1cQiwdM+LulLppYwbASCaCg3Dt7M/zfr fhYw== X-Gm-Message-State: AA+aEWaKzwcV2eqEmom6AB56VETO1luNheCAGjDkCvHeHYsx4G5c810A dLG/uL+PGPz0J/KrNYEkrOvG4CwNFw4= X-Google-Smtp-Source: AFSGD/XopIVCqlherv/MITt7UvGRJn/+jdgUA+hF8NzN3Kl8eb8hCPJQu2/Q6xBppUQ90yTYctlq9g== X-Received: by 2002:a63:6506:: with SMTP id z6mr6201345pgb.334.1544884339933; Sat, 15 Dec 2018 06:32:19 -0800 (PST) Received: from localhost.localdomain (123202047155.ctinets.com. [123.202.47.155]) by smtp.gmail.com with ESMTPSA id i73sm12151994pfi.66.2018.12.15.06.32.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 15 Dec 2018 06:32:19 -0800 (PST) Message-ID: <5c151073.1c69fb81.8fd52.ea81@mx.google.com> X-Google-Original-Message-ID: <20181215143210.8926-1-me> From: tom.ty89@gmail.com X-Google-Original-From: me To: patch@alsa-project.org Date: Sat, 15 Dec 2018 22:32:10 +0800 X-Mailer: git-send-email 2.20.0 MIME-Version: 1.0 X-Mailman-Approved-At: Sun, 16 Dec 2018 10:24:38 +0100 Cc: alsa-devel@alsa-project.org, Tom Yan Subject: [alsa-devel] [PATCH 1/1] ALSA: virtuoso: add de-emphasis control 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP From: Tom Yan Add control for the de-emphasis filter in the PCM179x DACs Signed-off-by: Tom Yan diff --git a/sound/pci/oxygen/xonar_pcm179x.c b/sound/pci/oxygen/xonar_pcm179x.c index 24109d37ca09..0014c55ecc3d 100644 --- a/sound/pci/oxygen/xonar_pcm179x.c +++ b/sound/pci/oxygen/xonar_pcm179x.c @@ -331,7 +331,7 @@ static void pcm1796_init(struct oxygen *chip) struct xonar_pcm179x *data = chip->model_data; data->pcm1796_regs[0][18 - PCM1796_REG_BASE] = - PCM1796_DMF_DISABLED | PCM1796_FMT_24_I2S | PCM1796_ATLD; + PCM1796_FMT_24_I2S | PCM1796_ATLD; if (!data->broken_i2c) data->pcm1796_regs[0][18 - PCM1796_REG_BASE] |= PCM1796_MUTE; data->pcm1796_regs[0][19 - PCM1796_REG_BASE] = @@ -621,6 +621,33 @@ static void update_pcm1796_oversampling(struct oxygen *chip) pcm1796_write_cached(chip, i, 20, reg); } +static void update_pcm1796_deemph(struct oxygen *chip) +{ + struct xonar_pcm179x *data = chip->model_data; + unsigned int i; + u8 reg; + + reg = data->pcm1796_regs[0][18 - PCM1796_REG_BASE] & ~PCM1796_DMF_MASK; + switch (data->current_rate) { + case 32000: + case 64000: + reg |= PCM1796_DMF_32; + break; + case 44100: + case 88200: + case 176400: + reg |= PCM1796_DMF_441; + break; + case 48000: + case 96000: + case 192000: + reg |= PCM1796_DMF_48; + break; + } + for (i = 0; i < data->dacs; ++i) + pcm1796_write_cached(chip, i, 18, reg); +} + static void set_pcm1796_params(struct oxygen *chip, struct snd_pcm_hw_params *params) { @@ -629,6 +656,7 @@ static void set_pcm1796_params(struct oxygen *chip, msleep(1); data->current_rate = params_rate(params); update_pcm1796_oversampling(chip); + update_pcm1796_deemph(chip); } static void update_pcm1796_volume(struct oxygen *chip) @@ -653,9 +681,11 @@ static void update_pcm1796_mute(struct oxygen *chip) unsigned int i; u8 value; - value = PCM1796_DMF_DISABLED | PCM1796_FMT_24_I2S | PCM1796_ATLD; + value = data->pcm1796_regs[0][18 - PCM1796_REG_BASE]; if (chip->dac_mute) value |= PCM1796_MUTE; + else + value &= ~PCM1796_MUTE; for (i = 0; i < data->dacs; ++i) pcm1796_write_cached(chip, i, 18, value); } @@ -777,6 +807,50 @@ static const struct snd_kcontrol_new rolloff_control = { .put = rolloff_put, }; +static int deemph_get(struct snd_kcontrol *ctl, + struct snd_ctl_elem_value *value) +{ + struct oxygen *chip = ctl->private_data; + struct xonar_pcm179x *data = chip->model_data; + + value->value.integer.value[0] = + (data->pcm1796_regs[0][18 - PCM1796_REG_BASE] & + PCM1796_DME) != PCM1796_DMF_DISABLED; + return 0; +} + +static int deemph_put(struct snd_kcontrol *ctl, + struct snd_ctl_elem_value *value) +{ + struct oxygen *chip = ctl->private_data; + struct xonar_pcm179x *data = chip->model_data; + unsigned int i; + int changed; + u8 reg; + + mutex_lock(&chip->mutex); + reg = data->pcm1796_regs[0][18 - PCM1796_REG_BASE]; + if (!value->value.integer.value[0]) + reg &= ~PCM1796_DME; + else + reg |= PCM1796_DME; + changed = reg != data->pcm1796_regs[0][18 - PCM1796_REG_BASE]; + if (changed) { + for (i = 0; i < data->dacs; ++i) + pcm1796_write(chip, i, 18, reg); + } + mutex_unlock(&chip->mutex); + return changed; +} + +static const struct snd_kcontrol_new deemph_control = { + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, + .name = "De-emphasis Switch", + .info = snd_ctl_boolean_mono_info, + .get = deemph_get, + .put = deemph_put, +}; + static const struct snd_kcontrol_new hdav_hdmi_control = { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = "HDMI Playback Switch", @@ -1011,6 +1085,10 @@ static int add_pcm1796_controls(struct oxygen *chip) snd_ctl_new1(&rolloff_control, chip)); if (err < 0) return err; + err = snd_ctl_add(chip->card, + snd_ctl_new1(&deemph_control, chip)); + if (err < 0) + return err; } return 0; }