Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp4164899pxv; Mon, 26 Jul 2021 23:48:45 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyFiNU+jBd2ZoogAeD2g7QmKZY3fKpUQg1NotRvsBUCMQbeR1rx6/QLjmu1+oMdByUsCNb9 X-Received: by 2002:a05:6638:192:: with SMTP id a18mr20030583jaq.47.1627368525536; Mon, 26 Jul 2021 23:48:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627368525; cv=none; d=google.com; s=arc-20160816; b=R0+6YdOhN2FYcgfltqbMGYc3GJeOjMO8Nlr3pOf/SQVrima3c1ozH93GLZdlwcGLRP udMITDvWiPa0cSSVUo1XbIitHQX0mpiXY6bGI0X+Cg3WqaqoeKTLUcDCDYm0mdPJDU5q qkszKdsIomJ7nSTxjNBOhICLEh06QiYmYiTderPLcb0QpwVw60l291Ie6GWVNgdvPiH4 PSWRF6Q4od35k24tb2/DZJ/cNPM9DEFVuIpNKUM8pFfuNegzvimc4OzpmfZQyjgaPxbK etGBFmgQHffmfBUan2SxZjqkeXIA8Xzm1+UB4f2dhN/fELhGQ4R63vkOW/LoyUN2TNaZ +ueQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:user-agent:references:in-reply-to :subject:cc:to:from:message-id:date:dkim-signature:dkim-signature; bh=XzoDRt4O83/EYGv/WuJBa4qe/fT4Mky56nzFc8R987g=; b=bD4VeHNFA8hQY1/tK1A/FOPUY/4Vhyjqj2ZQB+tvsQ+KJbAQH5MmI+H/RqxjytVfrR TmQzXaLYgYodM/QxnSaORW1/kXCrv0zcPBY97aSCEnc6CvxcZRtsH7AlhR2AfC1ciPpY rROScyORXd+LuGpxEVWPbNBWQ6Q80sf8aX4Isb07IcjBYCt87NkysJ3+SYcg5A1sbSZT OzM+z+2btMCM8uXSsEg4EZkUqhkTv/BUI52Jt8M3EtFsdFzyBKPAHbWqokTCIrlupXwx FTeXGs+kf/EueudJm2r4FVCry6cl5W5JAI5JNenGru/AEF6FVSnV5usSs2PtWJrg5cPb M4CA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@suse.de header.s=susede2_rsa header.b=AHLjbmRm; dkim=neutral (no key) header.i=@suse.de; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id 13si2455810ilt.16.2021.07.26.23.48.34; Mon, 26 Jul 2021 23:48:45 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@suse.de header.s=susede2_rsa header.b=AHLjbmRm; dkim=neutral (no key) header.i=@suse.de; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235616AbhG0Grt (ORCPT + 99 others); Tue, 27 Jul 2021 02:47:49 -0400 Received: from smtp-out1.suse.de ([195.135.220.28]:59790 "EHLO smtp-out1.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235296AbhG0Grs (ORCPT ); Tue, 27 Jul 2021 02:47:48 -0400 Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 9C02B22106; Tue, 27 Jul 2021 06:47:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1627368467; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=XzoDRt4O83/EYGv/WuJBa4qe/fT4Mky56nzFc8R987g=; b=AHLjbmRmhNM23ZCoVwvRpM1sayHPmNAUCkKHJ6g7uGSjhLoRHU+yTeyvAA3ey8jJb2RU0w LKR2d9LwX0lEtPFSeRygTdFq1k25AvU2DALdUzNXrB5y/BHCxjrYW/udE2qDYZAEWXDOsb uJ7E5kxr9ceJ6U0SikW2Y5ZNTq43UHk= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1627368467; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=XzoDRt4O83/EYGv/WuJBa4qe/fT4Mky56nzFc8R987g=; b=MNDVyg7vE9NryVFzzkZ4xPw/loLXSJWasBTVGYSz9An/FzkM29OW+PhcnqNEHohGTHWxBB ri9YLxNGMOA0CHCg== Received: from alsa1.suse.de (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 881D2A3B87; Tue, 27 Jul 2021 06:47:47 +0000 (UTC) Date: Tue, 27 Jul 2021 08:47:47 +0200 Message-ID: From: Takashi Iwai To: Vitaly Rodionov Cc: Jaroslav Kysela , Takashi Iwai , , , , Lucas Tanure Subject: Re: [PATCH 13/27] ALSA: hda/cs8409: Dont disable I2C clock between consecutive accesses In-Reply-To: <20210726174640.6390-14-vitalyr@opensource.cirrus.com> References: <20210726174640.6390-1-vitalyr@opensource.cirrus.com> <20210726174640.6390-14-vitalyr@opensource.cirrus.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/25.3 (x86_64-suse-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: text/plain; charset=US-ASCII Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, 26 Jul 2021 19:46:26 +0200, Vitaly Rodionov wrote: > > From: Lucas Tanure > > Only disable I2C clock 25 ms after not being used This is error-prone and might be racy, I'm afraid. e.g. the offloaded work isn't canceled when unbinding the driver, so it'll lead to a use-after-free. And the work doesn't take a mutex so it may conflict with re-enabling side. Above all, there is no description "why" this has to be done so. Is it about the performance, or any other reason? thanks, Takashi > > Signed-off-by: Lucas Tanure > Signed-off-by: Vitaly Rodionov > --- > sound/pci/hda/patch_cs8409.c | 42 +++++++++++++++++++++++------------- > sound/pci/hda/patch_cs8409.h | 4 ++++ > 2 files changed, 31 insertions(+), 15 deletions(-) > > diff --git a/sound/pci/hda/patch_cs8409.c b/sound/pci/hda/patch_cs8409.c > index 08205c19698c..335bcdc69106 100644 > --- a/sound/pci/hda/patch_cs8409.c > +++ b/sound/pci/hda/patch_cs8409.c > @@ -53,6 +53,7 @@ static struct cs8409_spec *cs8409_alloc_spec(struct hda_codec *codec) > if (!spec) > return NULL; > codec->spec = spec; > + spec->codec = codec; > codec->power_save_node = 1; > snd_hda_gen_spec_init(&spec->gen); > > @@ -72,21 +73,34 @@ static inline void cs8409_vendor_coef_set(struct hda_codec *codec, unsigned int > snd_hda_codec_write(codec, CS8409_PIN_VENDOR_WIDGET, 0, AC_VERB_SET_PROC_COEF, coef); > } > > -/** > +/* > + * cs8409_disable_i2c_clock - Worker that disable the I2C Clock after 25ms without use > + */ > +static void cs8409_disable_i2c_clock(struct work_struct *work) > +{ > + struct cs8409_spec *spec = container_of(work, struct cs8409_spec, i2c_clk_work.work); > + > + cs8409_vendor_coef_set(spec->codec, 0x0, > + cs8409_vendor_coef_get(spec->codec, 0x0) & 0xfffffff7); > + spec->i2c_clck_enabled = 0; > +} > + > +/* > * cs8409_enable_i2c_clock - Enable I2C clocks > * @codec: the codec instance > - * @enable: Enable or disable I2C clocks > - * > * Enable or Disable I2C clocks. > */ > -static void cs8409_enable_i2c_clock(struct hda_codec *codec, unsigned int enable) > +static void cs8409_enable_i2c_clock(struct hda_codec *codec) > { > - unsigned int retval; > - unsigned int newval; > + struct cs8409_spec *spec = codec->spec; > + > + cancel_delayed_work_sync(&spec->i2c_clk_work); > > - retval = cs8409_vendor_coef_get(codec, 0x0); > - newval = (enable) ? (retval | 0x8) : (retval & 0xfffffff7); > - cs8409_vendor_coef_set(codec, 0x0, newval); > + if (!spec->i2c_clck_enabled) { > + cs8409_vendor_coef_set(codec, 0x0, cs8409_vendor_coef_get(codec, 0x0) | 0x8); > + spec->i2c_clck_enabled = 1; > + } > + queue_delayed_work(system_power_efficient_wq, &spec->i2c_clk_work, msecs_to_jiffies(25)); > } > > /** > @@ -134,7 +148,7 @@ static int cs8409_i2c_read(struct hda_codec *codec, unsigned int i2c_address, un > if (spec->cs42l42_suspended) > return -EPERM; > > - cs8409_enable_i2c_clock(codec, 1); > + cs8409_enable_i2c_clock(codec); > cs8409_vendor_coef_set(codec, CS8409_I2C_ADDR, i2c_address); > > if (paged) { > @@ -157,8 +171,6 @@ static int cs8409_i2c_read(struct hda_codec *codec, unsigned int i2c_address, un > /* Register in bits 15-8 and the data in 7-0 */ > read_data = cs8409_vendor_coef_get(codec, CS8409_I2C_QREAD); > > - cs8409_enable_i2c_clock(codec, 0); > - > return read_data & 0x0ff; > } > > @@ -182,7 +194,7 @@ static int cs8409_i2c_write(struct hda_codec *codec, unsigned int i2c_address, u > if (spec->cs42l42_suspended) > return -EPERM; > > - cs8409_enable_i2c_clock(codec, 1); > + cs8409_enable_i2c_clock(codec); > cs8409_vendor_coef_set(codec, CS8409_I2C_ADDR, i2c_address); > > if (paged) { > @@ -203,8 +215,6 @@ static int cs8409_i2c_write(struct hda_codec *codec, unsigned int i2c_address, u > return -EIO; > } > > - cs8409_enable_i2c_clock(codec, 0); > - > return 0; > } > > @@ -705,6 +715,8 @@ void cs8409_cs42l42_fixups(struct hda_codec *codec, const struct hda_fixup *fix, > spec->cs42l42_mic_jack_in = 0; > spec->cs42l42_suspended = 1; > > + INIT_DELAYED_WORK(&spec->i2c_clk_work, cs8409_disable_i2c_clock); > + > /* Basic initial sequence for specific hw configuration */ > snd_hda_sequence_write(codec, cs8409_cs42l42_init_verbs); > > diff --git a/sound/pci/hda/patch_cs8409.h b/sound/pci/hda/patch_cs8409.h > index bf0e8a4cc4cc..542582c213d2 100644 > --- a/sound/pci/hda/patch_cs8409.h > +++ b/sound/pci/hda/patch_cs8409.h > @@ -11,6 +11,7 @@ > > #include > #include > +#include > #include > #include "hda_local.h" > #include "hda_auto_parser.h" > @@ -267,6 +268,7 @@ struct cs8409_cir_param { > > struct cs8409_spec { > struct hda_gen_spec gen; > + struct hda_codec *codec; > > unsigned int gpio_mask; > unsigned int gpio_dir; > @@ -278,6 +280,8 @@ struct cs8409_spec { > s8 vol[CS42L42_VOLUMES]; > > struct mutex cs8409_i2c_mux; > + unsigned int i2c_clck_enabled; > + struct delayed_work i2c_clk_work; > > /* verb exec op override */ > int (*exec_verb)(struct hdac_device *dev, unsigned int cmd, unsigned int flags, > -- > 2.25.1 >