Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp821580pxb; Thu, 21 Jan 2021 23:15:35 -0800 (PST) X-Google-Smtp-Source: ABdhPJxUOAmKbWlM6TyaDpJ25d5PZS1PyrOpervZKURMA+RqsEq4WTQOWVKFf/tOdhm5ibZOFg2B X-Received: by 2002:a17:906:26d7:: with SMTP id u23mr2051881ejc.210.1611299735138; Thu, 21 Jan 2021 23:15:35 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1611299735; cv=none; d=google.com; s=arc-20160816; b=0X6k1gIUproL0f5sF9su+trLJw1DDOYciNUKRwiou+pFniE3ImvhEiOBHOpPy0yP/Q QL9vuHqSmoTOn5Lf+boY+F25nIHQmBODR/yzq22j/KBKcnpqRe/g+TISLULRMaDLzFSJ qzWu6a3ctDbz7Auah3Cr3e6qKfNxz7oOeZwsfHtLDtdB8w+iorKKFrGGbmfaOcEmP35N Sn4KqNcXM2GmdDwQmZKr1vjFDj2y5nITCVLDi8mywBeu3RfCTqg5Be6W92gjOE6iYPMf NruVdqPSLoTwk54Jpb65i8oqXpAUNPF8riArjw6AMMyS7eNiF3//MeUYsR+VvvsAfKR+ 10Pw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from:ironport-sdr:ironport-sdr; bh=Z2GLOELz8ayKdA3WTJsy/lRLu7gaRyzvils/i4ypL2Y=; b=xl2BhMOVCVP1Z1J2CSRmSmBikQGtiqv/j1rqgnuNeH37ybw2pE+7Twt0ewV0XCKmM5 Ypd6BtkXOJYHFX9eLSov3EZLAkBGSBbZtCI0WqYbaYEfUXovR72KprRfqMJDIn8HdbSj flzUTgmC1vGA8ii1F/NvuTgkdv7Rdi9rNCjf/kbdw9YSxW7/4CJe6t8XAFKhEKhE/Ywq mCFhIWcP3p8w8xTku03jIzSH5TBPNEc2HSqsigMGpeLUDMHv1d4ceLnGVko0DT8ZbX9R riMmiUvqvTW4aM/hXT7SwUG/9CObSyN66Qx1cstu/HXINwNJVdRWF19rLbWJxuCJ2ElU a95w== ARC-Authentication-Results: i=1; mx.google.com; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id a89si3345246ede.326.2021.01.21.23.15.11; Thu, 21 Jan 2021 23:15:35 -0800 (PST) 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; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726988AbhAVHMG (ORCPT + 99 others); Fri, 22 Jan 2021 02:12:06 -0500 Received: from mga05.intel.com ([192.55.52.43]:54253 "EHLO mga05.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726301AbhAVHL4 (ORCPT ); Fri, 22 Jan 2021 02:11:56 -0500 IronPort-SDR: wmelHFZBaGd2PDSZfTKhJCB64N7U2bIVR1L8hIkXMnDvLqz9GzPOfbpjVklIwNCNKBZUk2ZPJp rs34W5rtvm0g== X-IronPort-AV: E=McAfee;i="6000,8403,9871"; a="264222034" X-IronPort-AV: E=Sophos;i="5.79,366,1602572400"; d="scan'208";a="264222034" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Jan 2021 23:07:01 -0800 IronPort-SDR: gVId4Dm6yjVptWTSN4ZBxZE2u2jLuFalRA5AEOHGwnkkVOMNVvHE+L2383+RuDkmJrKhWq2tMh CRxt6CH2bRaQ== X-IronPort-AV: E=Sophos;i="5.79,366,1602572400"; d="scan'208";a="427863882" Received: from bard-ubuntu.sh.intel.com ([10.239.13.33]) by orsmga001-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Jan 2021 23:06:58 -0800 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, tiwai@suse.de, broonie@kernel.org, gregkh@linuxfoundation.org, jank@cadence.com, srinivas.kandagatla@linaro.org, rander.wang@linux.intel.com, ranjani.sridharan@linux.intel.com, hui.wang@canonical.com, pierre-louis.bossart@linux.intel.com, sanyog.r.kale@intel.com, bard.liao@intel.com Subject: [RESEND PATCH v2 8/9] soundwire: bus: fix confusion on device used by pm_runtime Date: Fri, 22 Jan 2021 15:06:33 +0800 Message-Id: <20210122070634.12825-9-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210122070634.12825-1-yung-chuan.liao@linux.intel.com> References: <20210122070634.12825-1-yung-chuan.liao@linux.intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Pierre-Louis Bossart Intel stress-tests routinely report IO timeouts and invalid power management transitions. Upon further analysis, we seem to be using the wrong devices in pm_runtime calls. Before reading and writing registers, we first need to make sure the Slave is fully resumed. The existing code attempts to do such that, however because of a confusion dating from 2017 and copy/paste, we end-up resuming the parent only instead of resuming the codec device. This can lead to accesses to the Slave registers while the bus is still being configured and the Slave not enumerated, and as a result IO errors occur. This is a classic problem, similar confusions happened for HDaudio between bus and codec device, leading to power management issues. Fix by using the relevant device for all uses of pm_runtime functions. Fixes: 60ee9be255712 ('soundwire: bus: add PM/no-PM versions of read/write functions') Fixes: aa79293517b39 ('soundwire: bus: fix io error when processing alert event') Fixes: 9d715fa005ebc ('soundwire: Add IO transfer') Reported-by: Bard Liao Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/bus.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/drivers/soundwire/bus.c b/drivers/soundwire/bus.c index 4eaeeb4090f0..7c4717dd9a34 100644 --- a/drivers/soundwire/bus.c +++ b/drivers/soundwire/bus.c @@ -513,16 +513,16 @@ int sdw_nread(struct sdw_slave *slave, u32 addr, size_t count, u8 *val) { int ret; - ret = pm_runtime_get_sync(slave->bus->dev); + ret = pm_runtime_get_sync(&slave->dev); if (ret < 0 && ret != -EACCES) { - pm_runtime_put_noidle(slave->bus->dev); + pm_runtime_put_noidle(&slave->dev); return ret; } ret = sdw_nread_no_pm(slave, addr, count, val); - pm_runtime_mark_last_busy(slave->bus->dev); - pm_runtime_put(slave->bus->dev); + pm_runtime_mark_last_busy(&slave->dev); + pm_runtime_put(&slave->dev); return ret; } @@ -539,16 +539,16 @@ int sdw_nwrite(struct sdw_slave *slave, u32 addr, size_t count, u8 *val) { int ret; - ret = pm_runtime_get_sync(slave->bus->dev); + ret = pm_runtime_get_sync(&slave->dev); if (ret < 0 && ret != -EACCES) { - pm_runtime_put_noidle(slave->bus->dev); + pm_runtime_put_noidle(&slave->dev); return ret; } ret = sdw_nwrite_no_pm(slave, addr, count, val); - pm_runtime_mark_last_busy(slave->bus->dev); - pm_runtime_put(slave->bus->dev); + pm_runtime_mark_last_busy(&slave->dev); + pm_runtime_put(&slave->dev); return ret; } @@ -1453,7 +1453,7 @@ static int sdw_handle_slave_alerts(struct sdw_slave *slave) ret = pm_runtime_get_sync(&slave->dev); if (ret < 0 && ret != -EACCES) { dev_err(&slave->dev, "Failed to resume device: %d\n", ret); - pm_runtime_put_noidle(slave->bus->dev); + pm_runtime_put_noidle(&slave->dev); return ret; } -- 2.17.1