Received: by 2002:ac0:946b:0:0:0:0:0 with SMTP id j40csp2595540imj; Mon, 11 Feb 2019 05:37:41 -0800 (PST) X-Google-Smtp-Source: AHgI3IYbRSTdqhveNiZfN+MA/7tdEPxPHT01Ozbpa7XjdoLoVzH9ErW3/9bisL7pgzJFWOIuda6s X-Received: by 2002:aa7:82d5:: with SMTP id f21mr15930268pfn.50.1549892261604; Mon, 11 Feb 2019 05:37:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1549892261; cv=none; d=google.com; s=arc-20160816; b=tdahuVvUCbDfsJeOf82as3Bu6j0wW2F2BN/3mWd6+NKBsAO+mKwlhfu6XOu5Vq8qCA ygnLWWY07meuh0dXS9t0qT6Z0nmneC+vFNGzg4YM8J0awkh4ascRUoq0qtqx3mYv5m6g k30LbvLF9/aixfQlCKVDnRzWLAQJSDSrWSOIr7H6HEOtjzkm4nDFPsu1IVu0BlpEXmrA uagVyO+kgbaVeyuDApuEPwUMv2VanDWDmEYjd8+Y6ooNZjPD9FqJAGhl7KWegcSjDGqJ PY9NIeM8XoTbGvUS+5IW+5KjbsPx9MInqNbVT3SP7D72HYHy10A0NDJeeAReMdyTAoR5 UOTg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:references:cc:to:from:subject; bh=BX3qPAqwfHX6hVVkuqRaA/CF8U0MrMHwnVjAUwSIpXM=; b=HfAQEswfR4DfectmQRKKnYKI04dawvRmOmn9Ne6whD389UtgB73HFQoZkXLU2tMT1y ETngXW/geoLVGa36Ip/UaI5EYC2mCEwm5vZTakw4Hueerbz50FeeLwrc8l+/CYtcy4AE OBhtPKqcQgOrI4SEHWGE35I6Nz5hctvU9gbPyVdgMhKdYGxJGDtJ+umMmf4Nn9VKz00W U/LxMR17D1CBwauwDA4IHYwW8JJmKOKtwB38IqWfejsGeSp3F/2PkqN6PAbaYBEhp7BL A3ycHaiQUJK2L/15jbNut6YbPfvpbyYYvVBDceOYFbm//sJ+ceGx+BNPoq3C3xcn3uD3 bPrA== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b9si8986715pgt.293.2019.02.11.05.37.23; Mon, 11 Feb 2019 05:37:41 -0800 (PST) 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; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728002AbfBKNfi (ORCPT + 99 others); Mon, 11 Feb 2019 08:35:38 -0500 Received: from smtp3-g21.free.fr ([212.27.42.3]:5982 "EHLO smtp3-g21.free.fr" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727601AbfBKNfg (ORCPT ); Mon, 11 Feb 2019 08:35:36 -0500 Received: from [192.168.108.68] (unknown [213.36.7.13]) (Authenticated sender: marc.w.gonzalez) by smtp3-g21.free.fr (Postfix) with ESMTPSA id 3180613F8AE; Mon, 11 Feb 2019 14:34:43 +0100 (CET) Subject: [PATCH v5 1/2] scsi: ufs: Do not disable vccq in UFSHC driver From: Marc Gonzalez To: SCSI , LKML Cc: Jeffrey Hugo , Bjorn Andersson , Evan Green , Douglas Anderson , Alim Akhtar , Avri Altman , Pedro Sousa , Joao Pinto , Mark Brown , Liam Girdwood , Rob Herring , Bart Van Assche , Stanislav Nijnikov , Alex Lemberg , Ohad Sharabi , Venkat Gopalakrishnan , Subhash Jadavani , Yaniv Gardi , Gilad Broner , Raviv Shvili , Hannes Reinecke , Kyuho Choi , Martin Petersen References: <494cd639-89a7-8868-b63a-ea7cdcba9777@free.fr> Message-ID: Date: Mon, 11 Feb 2019 14:32:15 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.4.0 MIME-Version: 1.0 In-Reply-To: <494cd639-89a7-8868-b63a-ea7cdcba9777@free.fr> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit 60f0187031c0 ("disable vccq if it's not needed by UFS device") introduced a small power optimization as a driver quirk: ignore the vccq load specified in the UFSHC DT node when said host controller is connected to specific Flash chips (Samsung and Hynix currently). Unfortunately, this optimization breaks UFS on systems where vccq powers not only the Flash chip, but the host controller as well, such as APQ8098 MEDIABOX or MTP8998: [ 3.929877] ufshcd-qcom 1da4000.ufshc: ufshcd_query_attr: opcode 0x04 for idn 13 failed, index 0, err = -11 [ 5.433815] ufshcd-qcom 1da4000.ufshc: ufshcd_query_attr: opcode 0x04 for idn 13 failed, index 0, err = -11 [ 6.937771] ufshcd-qcom 1da4000.ufshc: ufshcd_query_attr: opcode 0x04 for idn 13 failed, index 0, err = -11 [ 6.937866] ufshcd-qcom 1da4000.ufshc: ufshcd_query_attr_retry: query attribute, idn 13, failed with error -11 after 3 retires [ 6.946412] ufshcd-qcom 1da4000.ufshc: ufshcd_disable_auto_bkops: failed to enable exception event -11 [ 6.957972] ufshcd-qcom 1da4000.ufshc: dme-peer-get: attr-id 0x1587 failed 3 retries [ 6.967181] ufshcd-qcom 1da4000.ufshc: dme-peer-get: attr-id 0x1586 failed 3 retries [ 6.975025] ufshcd-qcom 1da4000.ufshc: ufshcd_get_max_pwr_mode: invalid max pwm tx gear read = 0 [ 6.982755] ufshcd-qcom 1da4000.ufshc: ufshcd_probe_hba: Failed getting max supported power mode [ 8.505770] ufshcd-qcom 1da4000.ufshc: ufshcd_query_flag: Sending flag query for idn 3 failed, err = -11 [ 10.009807] ufshcd-qcom 1da4000.ufshc: ufshcd_query_flag: Sending flag query for idn 3 failed, err = -11 [ 11.513766] ufshcd-qcom 1da4000.ufshc: ufshcd_query_flag: Sending flag query for idn 3 failed, err = -11 [ 11.513861] ufshcd-qcom 1da4000.ufshc: ufshcd_query_flag_retry: query attribute, opcode 5, idn 3, failed with error -11 after 3 retires [ 13.049807] ufshcd-qcom 1da4000.ufshc: __ufshcd_query_descriptor: opcode 0x01 for idn 8 failed, index 0, err = -11 [ 14.553768] ufshcd-qcom 1da4000.ufshc: __ufshcd_query_descriptor: opcode 0x01 for idn 8 failed, index 0, err = -11 [ 16.057767] ufshcd-qcom 1da4000.ufshc: __ufshcd_query_descriptor: opcode 0x01 for idn 8 failed, index 0, err = -11 [ 16.057872] ufshcd-qcom 1da4000.ufshc: ufshcd_read_desc_param: Failed reading descriptor. desc_id 8, desc_index 0, param_offset 0, ret -11 [ 16.067109] ufshcd-qcom 1da4000.ufshc: ufshcd_init_icc_levels: Failed reading power descriptor.len = 98 ret = -11 [ 37.073787] ufshcd-qcom 1da4000.ufshc: link startup failed 1 In my opinion, the rationale for the original patch is questionable. If neither the UFSHC, nor the Flash chip, require any load from vccq, then that power rail should simply not be specified at all in the DT. Working around that fact in the driver is detrimental, as evidenced by the failure to initialize the host controller on MSM8998. Revert the original patch, and clean up loose ends in the next patch. Relevant patches: 60f0187031c05e04cbadffb62f557d0ff3564490 c58ab7aab71e2c783087115f0ce1623c2fdcf0b2 46c1cf706076500cdcde3445be97233793eec7f1 Signed-off-by: Marc Gonzalez --- drivers/scsi/ufs/ufs.h | 1 - drivers/scsi/ufs/ufshcd.c | 59 +++------------------------------------ 2 files changed, 4 insertions(+), 56 deletions(-) diff --git a/drivers/scsi/ufs/ufs.h b/drivers/scsi/ufs/ufs.h index 6d176815e6ce..21e4ccb5ba6e 100644 --- a/drivers/scsi/ufs/ufs.h +++ b/drivers/scsi/ufs/ufs.h @@ -514,7 +514,6 @@ struct ufs_vreg { struct regulator *reg; const char *name; bool enabled; - bool unused; int min_uV; int max_uV; int min_uA; diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 5ca4581e60d5..a5bfcf04fdba 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -251,7 +251,6 @@ static int ufshcd_probe_hba(struct ufs_hba *hba); static int __ufshcd_setup_clocks(struct ufs_hba *hba, bool on, bool skip_ref_clk); static int ufshcd_setup_clocks(struct ufs_hba *hba, bool on); -static int ufshcd_set_vccq_rail_unused(struct ufs_hba *hba, bool unused); static int ufshcd_uic_hibern8_exit(struct ufs_hba *hba); static int ufshcd_uic_hibern8_enter(struct ufs_hba *hba); static inline void ufshcd_add_delay_before_dme_cmd(struct ufs_hba *hba); @@ -6830,11 +6829,6 @@ static int ufshcd_probe_hba(struct ufs_hba *hba) ufs_fixup_device_setup(hba, &card); ufshcd_tune_unipro_params(hba); - ret = ufshcd_set_vccq_rail_unused(hba, - (hba->dev_quirks & UFS_DEVICE_NO_VCCQ) ? true : false); - if (ret) - goto out; - /* UFS device is also active now */ ufshcd_set_ufs_dev_active(hba); ufshcd_force_reset_auto_bkops(hba); @@ -7018,24 +7012,13 @@ static int ufshcd_config_vreg_load(struct device *dev, struct ufs_vreg *vreg, static inline int ufshcd_config_vreg_lpm(struct ufs_hba *hba, struct ufs_vreg *vreg) { - if (!vreg) - return 0; - else if (vreg->unused) - return 0; - else - return ufshcd_config_vreg_load(hba->dev, vreg, - UFS_VREG_LPM_LOAD_UA); + return ufshcd_config_vreg_load(hba->dev, vreg, UFS_VREG_LPM_LOAD_UA); } static inline int ufshcd_config_vreg_hpm(struct ufs_hba *hba, struct ufs_vreg *vreg) { - if (!vreg) - return 0; - else if (vreg->unused) - return 0; - else - return ufshcd_config_vreg_load(hba->dev, vreg, vreg->max_uA); + return ufshcd_config_vreg_load(hba->dev, vreg, vreg->max_uA); } static int ufshcd_config_vreg(struct device *dev, @@ -7073,9 +7056,7 @@ static int ufshcd_enable_vreg(struct device *dev, struct ufs_vreg *vreg) { int ret = 0; - if (!vreg) - goto out; - else if (vreg->enabled || vreg->unused) + if (!vreg || vreg->enabled) goto out; ret = ufshcd_config_vreg(dev, vreg, true); @@ -7095,9 +7076,7 @@ static int ufshcd_disable_vreg(struct device *dev, struct ufs_vreg *vreg) { int ret = 0; - if (!vreg) - goto out; - else if (!vreg->enabled || vreg->unused) + if (!vreg || !vreg->enabled) goto out; ret = regulator_disable(vreg->reg); @@ -7203,36 +7182,6 @@ static int ufshcd_init_hba_vreg(struct ufs_hba *hba) return 0; } -static int ufshcd_set_vccq_rail_unused(struct ufs_hba *hba, bool unused) -{ - int ret = 0; - struct ufs_vreg_info *info = &hba->vreg_info; - - if (!info) - goto out; - else if (!info->vccq) - goto out; - - if (unused) { - /* shut off the rail here */ - ret = ufshcd_toggle_vreg(hba->dev, info->vccq, false); - /* - * Mark this rail as no longer used, so it doesn't get enabled - * later by mistake - */ - if (!ret) - info->vccq->unused = true; - } else { - /* - * rail should have been already enabled hence just make sure - * that unused flag is cleared. - */ - info->vccq->unused = false; - } -out: - return ret; -} - static int __ufshcd_setup_clocks(struct ufs_hba *hba, bool on, bool skip_ref_clk) { -- 2.17.1