Received: by 10.192.165.148 with SMTP id m20csp3775617imm; Mon, 7 May 2018 19:35:06 -0700 (PDT) X-Google-Smtp-Source: AB8JxZofK/FWpX9TnEOJcZOxXVlwkDUIxi/ObUggn5PmO39NLU5ekLmn9EFinhiW/RfsdzTkzmzP X-Received: by 2002:a17:902:b216:: with SMTP id t22-v6mr17381178plr.105.1525746906741; Mon, 07 May 2018 19:35:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525746906; cv=none; d=google.com; s=arc-20160816; b=iXKGMEvewv8aFT9A5efjZX29xivzPbTDUy7B2Z8Uwo562bdpWZB+JXpx2NpC0JT5Nx STC/wTrxzq5cVkO/xt3s5Vexmu1cFWjCm7UAb0YiOAHxKNx4Eog0JW7/fhaMsMn/OlUX FTorWj8bFZzkguNP2fuNtysP2tQEPhMKlEG4B7KExq0lQpDZ1pgXKRb5Y5ydsRmulEUe 3eEfWXGDOZzeMh5XxBfVJZEXEizPJAbDpjhpJCBiChN8E8V06yE/gRsoJNm/+KF70McH Lb/Wv+kmfZj1gdhFDuRFwus3gY60v11eDJEhvV1KQOdgOuopTVmi+URwnxzDGdod64rI dLgQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:to:references:in-reply-to:message-id:date :subject:cc:from:dkim-signature:arc-authentication-results; bh=wktoaVW3M97S2UFmocbw1UefadbGqTycJM5C8xIUnBw=; b=roAvrA6wn1I4+j469ttADBkesjk7dtc75kbiGyGzkph6biW8rWWjZ8F8LmTRy8MKCi p2CP6qY1YwF93c4Zd/1N4YLM2goaN81E/7SSBiRDaova0Z7JsukqZy4otpVqFETID4uO IcQJnRALm+RugFEBWXFLLmy6yK55lZCdF5O+5rXkd5ki7bAqc9CcZvL3RjuKoU9I6f1r ms4kBD8NvDLx5sLmx3tTMOj3ZIEJCFPFNZBVlyv48bw60j1BZqU19tolTc7x2btgOQh3 kQBZMcSnky9nQYUrUvHRjJSZHno+6eyuI3+zlgU8EPaLrbqAxqlKhgO63eLuvQSZE21v rZ3w== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=VcGx7K0x; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t144-v6si18787611pgb.94.2018.05.07.19.34.52; Mon, 07 May 2018 19:35:06 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=VcGx7K0x; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754103AbeEHCeD (ORCPT + 99 others); Mon, 7 May 2018 22:34:03 -0400 Received: from mail-it0-f65.google.com ([209.85.214.65]:53515 "EHLO mail-it0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753510AbeEHCcU (ORCPT ); Mon, 7 May 2018 22:32:20 -0400 Received: by mail-it0-f65.google.com with SMTP id n64-v6so8757822itb.3 for ; Mon, 07 May 2018 19:32:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=wktoaVW3M97S2UFmocbw1UefadbGqTycJM5C8xIUnBw=; b=VcGx7K0x22gnoewq+yodPUh7e+O8VRUnWNfbt5M409/GcRJzcdoz2+AWHGH1Bamn8c o4X3Tg5GvqV9nbcGEaT1oQKco+16gWiJY2pzYFlUKiUMHOKjsW7wR9zQgbYNi2mANm9m oxKS8A8SjR+EzfFRb56TjnjGFAS+VeR+tudSxzXHshVyOsB/CrQvqHvEgvrMGo2DTNYP heLd8n313EfWSAv6Cs5ILhvAYMIV+ZkRlpo76aEfywfEYONYEqW4t5s+UZryAfqKUV9s rHnf243QrK5bvV4Va5s2D9fy+sP+9gixgJKsQ2NhQ9bM0pAjyFYK/IyuCZQNxbQw/P6j v0hQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=wktoaVW3M97S2UFmocbw1UefadbGqTycJM5C8xIUnBw=; b=qvqQUgi0PdgWT9opwOBh7oAgsBtOwSlRlmTmFzoQLK5w6r1der3REcYLGF3NQbMLlO TIJ1He+qV5SKty/tPcRIBeYE5A30HAXFxzsoJ3YbNaws/C2uIBbep7AhOl2uHDrmxvge pR47v6mhHHVau5+Fu5R8tmAib1PnDEc0Ox6h0fi64dhdg8fCqlB7u5m9bW+3lKMr1qK0 HQzXzgCC2KFxWyuLd0otddFZrPatDEvieel5H/ZnaT1uAQGcB3FnK+jzGHcYbukxvnYA 9VmMIxEI5b9X2bICSWkQpzE/fysFBDq5gK4dQpxfCNe/OOOauYgm2rJqKQNMZIPaT+kW gz5w== X-Gm-Message-State: ALQs6tA771b2tJqzG32R31e2eiFalf24/hPjbYxlq9w5JJ1IRmrU1NB7 OktJVbVBe1sT7ttGD6mPLfA= X-Received: by 2002:a24:641:: with SMTP id 62-v6mr3939748itv.89.1525746739873; Mon, 07 May 2018 19:32:19 -0700 (PDT) Received: from localhost.localdomain ([2605:a000:1316:4462:d951:8657:56b7:4002]) by smtp.googlemail.com with ESMTPSA id l22-v6sm4947954ita.8.2018.05.07.19.32.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 07 May 2018 19:32:19 -0700 (PDT) From: Connor McAdams Cc: o-takashi@sakamocchi.jp, Connor McAdams , Jaroslav Kysela , Takashi Iwai , =?UTF-8?q?J=C3=A9r=C3=A9my=20Lefaure?= , alsa-devel@alsa-project.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 08/13] ALSA: hda/ca0132: Add dsp setup + gpio functions for r3di Date: Mon, 7 May 2018 22:31:16 -0400 Message-Id: <1525746683-18535-9-git-send-email-conmanx360@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1525746683-18535-1-git-send-email-conmanx360@gmail.com> References: <1525746683-18535-1-git-send-email-conmanx360@gmail.com> To: unlisted-recipients:; (no To-header on input) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Adds dsp setup functions for Recon3Di as well as the GPIO functions specific to it. Signed-off-by: Connor McAdams --- sound/pci/hda/patch_ca0132.c | 149 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 148 insertions(+), 1 deletion(-) diff --git a/sound/pci/hda/patch_ca0132.c b/sound/pci/hda/patch_ca0132.c index 37609bd..7a9d505 100644 --- a/sound/pci/hda/patch_ca0132.c +++ b/sound/pci/hda/patch_ca0132.c @@ -2904,6 +2904,76 @@ static void ca0132_gpio_setup(struct hda_codec *codec) } /* + * GPIO control functions for the Recon3D integrated. + */ + +enum r3di_gpio_bit { + /* Bit 1 - Switch between front/rear mic. 0 = rear, 1 = front */ + R3DI_MIC_SELECT_BIT = 1, + /* Bit 2 - Switch between headphone/line out. 0 = Headphone, 1 = Line */ + R3DI_OUT_SELECT_BIT = 2, + /* + * I dunno what this actually does, but it stays on until the dsp + * is downloaded. + */ + R3DI_GPIO_DSP_DOWNLOADING = 3, + /* + * Same as above, no clue what it does, but it comes on after the dsp + * is downloaded. + */ + R3DI_GPIO_DSP_DOWNLOADED = 4 +}; + +enum r3di_mic_select { + /* Set GPIO bit 1 to 0 for rear mic */ + R3DI_REAR_MIC = 0, + /* Set GPIO bit 1 to 1 for front microphone*/ + R3DI_FRONT_MIC = 1 +}; + +enum r3di_out_select { + /* Set GPIO bit 2 to 0 for headphone */ + R3DI_HEADPHONE_OUT = 0, + /* Set GPIO bit 2 to 1 for speaker */ + R3DI_LINE_OUT = 1 +}; +enum r3di_dsp_status { + /* Set GPIO bit 3 to 1 until DSP is downloaded */ + R3DI_DSP_DOWNLOADING = 0, + /* Set GPIO bit 4 to 1 once DSP is downloaded */ + R3DI_DSP_DOWNLOADED = 1 +}; + +static void r3di_gpio_dsp_status_set(struct hda_codec *codec, + enum r3di_dsp_status dsp_status) +{ + unsigned int cur_gpio; + + /* Get the current GPIO Data setup */ + cur_gpio = snd_hda_codec_read(codec, 0x01, 0, AC_VERB_GET_GPIO_DATA, 0); + + switch (dsp_status) { + case R3DI_DSP_DOWNLOADING: + cur_gpio |= (1 << R3DI_GPIO_DSP_DOWNLOADING); + snd_hda_codec_write(codec, codec->core.afg, 0, + AC_VERB_SET_GPIO_DATA, cur_gpio); + break; + case R3DI_DSP_DOWNLOADED: + /* Set DOWNLOADING bit to 0. */ + cur_gpio &= ~(1 << R3DI_GPIO_DSP_DOWNLOADING); + + snd_hda_codec_write(codec, codec->core.afg, 0, + AC_VERB_SET_GPIO_DATA, cur_gpio); + + cur_gpio |= (1 << R3DI_GPIO_DSP_DOWNLOADED); + break; + } + + snd_hda_codec_write(codec, codec->core.afg, 0, + AC_VERB_SET_GPIO_DATA, cur_gpio); +} + +/* * PCM callbacks */ static int ca0132_playback_pcm_prepare(struct hda_pcm_stream *hinfo, @@ -4539,6 +4609,30 @@ static void ca0132_refresh_widget_caps(struct hda_codec *codec) } /* + * Recon3Di r3di_setup_defaults sub functions. + */ + +static void r3di_dsp_initial_mic_setup(struct hda_codec *codec) +{ + unsigned int tmp; + + /* Mic 1 Setup */ + chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000); + chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000); + /* This ConnPointID is unique to Recon3Di. Haven't seen it elsewhere */ + chipio_set_conn_rate(codec, 0x0F, SR_96_000); + tmp = FLOAT_ONE; + dspio_set_uint_param(codec, 0x80, 0x00, tmp); + + /* Mic 2 Setup, even though it isn't connected on SBZ */ + chipio_set_conn_rate(codec, MEM_CONNID_MICIN2, SR_96_000); + chipio_set_conn_rate(codec, MEM_CONNID_MICOUT2, SR_96_000); + chipio_set_conn_rate(codec, 0x0F, SR_96_000); + tmp = FLOAT_ZERO; + dspio_set_uint_param(codec, 0x80, 0x01, tmp); +} + +/* * Initialize Sound Blaster Z analog microphones. */ static void sbz_init_analog_mics(struct hda_codec *codec) @@ -4700,6 +4794,50 @@ static void ca0132_setup_defaults(struct hda_codec *codec) } /* + * Setup default parameters for Recon3Di DSP. + */ + +static void r3di_setup_defaults(struct hda_codec *codec) +{ + struct ca0132_spec *spec = codec->spec; + unsigned int tmp; + int num_fx; + int idx, i; + + if (spec->dsp_state != DSP_DOWNLOADED) + return; + + + r3di_dsp_initial_mic_setup(codec); + + /*remove DSP headroom*/ + tmp = FLOAT_ZERO; + dspio_set_uint_param(codec, 0x96, 0x3C, tmp); + + /* set WUH source */ + tmp = FLOAT_TWO; + dspio_set_uint_param(codec, 0x31, 0x00, tmp); + chipio_set_conn_rate(codec, MEM_CONNID_WUH, SR_48_000); + + /* Set speaker source? */ + dspio_set_uint_param(codec, 0x32, 0x00, tmp); + + r3di_gpio_dsp_status_set(codec, R3DI_DSP_DOWNLOADED); + + /* Setup effect defaults */ + num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT + 1; + for (idx = 0; idx < num_fx; idx++) { + for (i = 0; i <= ca0132_effects[idx].params; i++) { + dspio_set_uint_param(codec, + ca0132_effects[idx].mid, + ca0132_effects[idx].reqs[i], + ca0132_effects[idx].def_vals[i]); + } + } + +} + +/* * Setup default parameters for the Sound Blaster Z DSP. A lot more going on * than the Chromebook setup. */ @@ -5397,6 +5535,7 @@ static void ca0132_alt_init(struct hda_codec *codec) codec_dbg(codec, "R3DI alt_init"); ca0132_gpio_init(codec); ca0132_gpio_setup(codec); + r3di_gpio_dsp_status_set(codec, R3DI_DSP_DOWNLOADING); r3di_pre_dsp_setup(codec); snd_hda_sequence_write(codec, spec->chip_init_verbs); snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0, 0x6FF, 0xC4); @@ -5445,21 +5584,29 @@ static int ca0132_init(struct hda_codec *codec) ca0132_init_unsol(codec); ca0132_init_params(codec); ca0132_init_flags(codec); + snd_hda_sequence_write(codec, spec->base_init_verbs); if (spec->quirk != QUIRK_NONE) ca0132_alt_init(codec); ca0132_download_dsp(codec); + ca0132_refresh_widget_caps(codec); if (spec->quirk == QUIRK_SBZ) writew(0x0107, spec->mem_base + 0x320); - if (spec->quirk != QUIRK_SBZ) { + switch (spec->quirk) { + case QUIRK_R3DI: + r3di_setup_defaults(codec); + break; + case QUIRK_NONE: + case QUIRK_ALIENWARE: ca0132_setup_defaults(codec); ca0132_init_analog_mic2(codec); ca0132_init_dmic(codec); + break; } for (i = 0; i < spec->num_outputs; i++) -- 2.7.4