From patchwork Thu Mar 26 13:52:40 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 6099201 Return-Path: X-Original-To: patchwork-alsa-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 6B068BF90F for ; Thu, 26 Mar 2015 13:53:01 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 4D1D6203DF for ; Thu, 26 Mar 2015 13:53:00 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.kernel.org (Postfix) with ESMTP id 3215020386 for ; Thu, 26 Mar 2015 13:52:58 +0000 (UTC) Received: by alsa0.perex.cz (Postfix, from userid 1000) id C34C52657C5; Thu, 26 Mar 2015 14:52:56 +0100 (CET) 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, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 Received: from alsa0.perex.cz (localhost [IPv6:::1]) by alsa0.perex.cz (Postfix) with ESMTP id B904426575E; Thu, 26 Mar 2015 14:52:47 +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 CC4D5265764; Thu, 26 Mar 2015 14:52:46 +0100 (CET) Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by alsa0.perex.cz (Postfix) with ESMTP id 5B762265745 for ; Thu, 26 Mar 2015 14:52:40 +0100 (CET) X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 212EFAC82; Thu, 26 Mar 2015 13:52:40 +0000 (UTC) Date: Thu, 26 Mar 2015 14:52:40 +0100 Message-ID: From: Takashi Iwai To: Hui Wang In-Reply-To: References: <1426668658-15911-1-git-send-email-tiwai@suse.de> <550C48EB.1050200@canonical.com> <550D11D3.8000009@canonical.com> <5513FA8B.402@canonical.com> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI/1.14.6 (Maruoka) FLIM/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL/10.8 Emacs/24.4 (x86_64-suse-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Cc: alsa-devel@alsa-project.org, David Henningsson Subject: Re: [alsa-devel] [PATCH 0/4] More aggressive PM for HD-audio 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 At Thu, 26 Mar 2015 14:10:17 +0100, Takashi Iwai wrote: > > At Thu, 26 Mar 2015 20:24:43 +0800, > Hui Wang wrote: > > > > On 03/21/2015 02:38 PM, Hui Wang wrote: > > > On 03/21/2015 12:20 AM, David Henningsson wrote: > > >> > > >> On 2015-03-18 09:50, Takashi Iwai wrote: > > >>> Hi, > > >>> > > >>> here is a patchset for supporting more aggressive PM for HD-audio. > > >>> This allows to change the power state of each widget more dynamically > > >>> with jack and stream states. It's activated only when the codec > > >>> driver (or via sysfs or f/w patch) sets codec->power_mgmt flag. > > >>> > > >>> In theory, this should work for the recent Realtek codecs, but > > >>> currently I have no machine for test. > > >>> > > >>> David, could you or your team check whether this works for ALC282 or > > >>> such? Just add like: > > >>> > > >>> --- a/sound/pci/hda/patch_realtek.c > > >>> +++ b/sound/pci/hda/patch_realtek.c > > >>> @@ -5415,6 +5415,7 @@ static int patch_alc269(struct hda_codec *codec) > > >>> > > >>> spec = codec->spec; > > >>> spec->gen.shared_mic_vref_pin = 0x18; > > >>> + codec->power_mgmt = 1; > > >>> > > >>> snd_hda_pick_fixup(codec, alc269_fixup_models, > > >>> alc269_fixup_tbl, alc269_fixups); > > >>> > > >>> > > >>> The patchset is for for-next branch of sound git tree, but they might > > >>> be applicable to 4.0-rc (or even older), too. The current patches are > > >>> found in topic/hda-power branch. > > >> > > >> So I hoped to be able to look at this today, but it turns out the > > >> machine I was thinking of using for testing has an ALC262 codec, > > >> which hardly counts as "new". > > >> > > >> Hui, is this something you feel like taking on? Otherwise I'll try to > > >> talk to someone in Taipei. > > >> > > > OK? I will look for the machine to do the test next week. > > > > > > Regards, > > > Hui. > > > > > Sorry for late response, today is my first day in the office back from > > vacation, I checked all machines in the Beijing office, none of them has > > the ALC282 codec, I will continue to look for the machine from other office. > > > > And I did the test on the machines with the alc283, alc255, alc292 and > > alc269, the testing result were same, there were no sound output from > > internal speaker or headphone, and the internal mic or external mic > > can't record any sound. The test steps as below: > > > > 1. power_save_node = 0 > > checkout the hda-power branch, build the kernel based on this branch. > > Install the kernel to the above machines and boot into the desktop > > test internal speaker and internal mic, works very well, plug a headset, > > test headphone and external mic, works very well. > > run pm_suspend, wait 5 seconds, wakeup the system, redo the above test, > > everything works very well. > > OK, this is expected. The patch shouldn't touch this case. > > > 2. power_save_node = 1 > > enable the power_save_node as below: > > @@ -5426,6 +5426,8 @@ static int patch_alc269(struct hda_codec *codec) > > > > alc_auto_parse_customize_define(codec); > > > > + codec->power_save_node = 1; > > + > > if (has_cdefine_beep(codec)) > > spec->gen.beep_nid = 0x01; > > rebuild the kernel, install the kernel to the above machines and boot > > into the desktop > > test internal speaker and internal mic, we can play sound to internal > > speaker without any errors, but I can't hear any sound from the speaker; > > I can use the internal mic to record without errors, but recorded file > > did not include any sound pcm (maybe all 0x00 or 0xff) > > I plug a headset into the headset jack, the detection works very well, > > but I can't hear sound from headphone when play a sound, and I can't use > > headset mic to record any sound as well. > > > > > > And I attached 2 alsa-info.txt, one is the power_save_node=0, the other > > is the power_save_node=1 > > Thanks. The alsa-info.sh outputs show no difference but the power > state, so the widget attributes seem kept with the power state change, > as it seems. > > Could you give alsa-info.sh output *during* playing with > power_save_node=1? Also, try to pull topic/hda-regmap branch in addition, and apply the patch below. This implements the partial sync for the widget path. Note that the patch is totally untested. thanks, Takashi diff --git a/include/sound/hda_regmap.h b/include/sound/hda_regmap.h index 76648ccfbbf8..727a5801e298 100644 --- a/include/sound/hda_regmap.h +++ b/include/sound/hda_regmap.h @@ -202,4 +202,16 @@ snd_hdac_regmap_update_amp_stereo(struct hdac_device *codec, hda_nid_t nid, return snd_hdac_regmap_update_raw(codec, cmd, mask, val); } +/** + * snd_hdac_regmap_sync_node - sync the widget node attributes + * @codec: HD-audio codec + * @nid: NID to sync + */ +static inline void +snd_hdac_regmap_sync_node(struct hdac_device *codec, hda_nid_t nid) +{ + regcache_mark_dirty(codec->regmap); + regcache_sync_region(codec->regmap, nid << 20, ((nid + 1) << 20) -1); +} + #endif /* __SOUND_HDA_REGMAP_H */ diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index f7ccef5559de..1f2ca7be1468 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c @@ -842,10 +842,8 @@ static hda_nid_t path_power_update(struct hda_codec *codec, snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_POWER_STATE, state); changed = nid; - /* here we assume that widget attributes (e.g. amp, - * pinctl connection) don't change with local power - * state change. If not, need to sync the cache. - */ + if (state == AC_PWRST_D0) + snd_hdac_regmap_sync_node(&codec->core, nid); } } return changed;