From patchwork Tue Apr 16 10:29:03 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jon Hunter X-Patchwork-Id: 1086195 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=nvidia.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=nvidia.com header.i=@nvidia.com header.b="sRoFFZRb"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 44k1nq5jb5z9s3q for ; Tue, 16 Apr 2019 20:29:35 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728508AbfDPK3f (ORCPT ); Tue, 16 Apr 2019 06:29:35 -0400 Received: from hqemgate16.nvidia.com ([216.228.121.65]:5903 "EHLO hqemgate16.nvidia.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727783AbfDPK3f (ORCPT ); Tue, 16 Apr 2019 06:29:35 -0400 Received: from hqpgpgate101.nvidia.com (Not Verified[216.228.121.13]) by hqemgate16.nvidia.com (using TLS: TLSv1.2, DES-CBC3-SHA) id ; Tue, 16 Apr 2019 03:29:30 -0700 Received: from hqmail.nvidia.com ([172.20.161.6]) by hqpgpgate101.nvidia.com (PGP Universal service); Tue, 16 Apr 2019 03:29:33 -0700 X-PGP-Universal: processed; by hqpgpgate101.nvidia.com on Tue, 16 Apr 2019 03:29:33 -0700 Received: from HQMAIL102.nvidia.com (172.18.146.10) by HQMAIL108.nvidia.com (172.18.146.13) with Microsoft SMTP Server (TLS) id 15.0.1473.3; Tue, 16 Apr 2019 10:29:33 +0000 Received: from HQMAIL105.nvidia.com (172.20.187.12) by HQMAIL102.nvidia.com (172.18.146.10) with Microsoft SMTP Server (TLS) id 15.0.1473.3; Tue, 16 Apr 2019 10:29:32 +0000 Received: from hqnvemgw02.nvidia.com (172.16.227.111) by HQMAIL105.nvidia.com (172.20.187.12) with Microsoft SMTP Server (TLS) id 15.0.1473.3 via Frontend Transport; Tue, 16 Apr 2019 10:29:32 +0000 Received: from moonraker.nvidia.com (Not Verified[10.21.132.148]) by hqnvemgw02.nvidia.com with Trustwave SEG (v7, 5, 8, 10121) id ; Tue, 16 Apr 2019 03:29:32 -0700 From: Jon Hunter To: Thierry Reding CC: Sandipan Patra , , "Jon Hunter" Subject: [PATCH 2/3] soc/tegra: pmc: Remove reset sysfs entries on error Date: Tue, 16 Apr 2019 11:29:03 +0100 Message-ID: <1555410544-14889-2-git-send-email-jonathanh@nvidia.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1555410544-14889-1-git-send-email-jonathanh@nvidia.com> References: <1555410544-14889-1-git-send-email-jonathanh@nvidia.com> X-NVConfidentiality: public MIME-Version: 1.0 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nvidia.com; s=n1; t=1555410570; bh=QA4ZKBTSM+vt/i1e/S+M7YcKxGMWBKOKRUxyZfOm/BM=; h=X-PGP-Universal:From:To:CC:Subject:Date:Message-ID:X-Mailer: In-Reply-To:References:X-NVConfidentiality:MIME-Version: Content-Type; b=sRoFFZRb6mLtvpqUJQCgvaYABcvKOYJzJTSRdbvfeUSiY518Ws/wBC4xWrJWy8u4n tmEksla7WavyQBELenp99AbrtdWpjC2vU8kCn8dSJhQhKKPqwZ8N1D4YPykinoF75s U+tPuCPrhWcSNpn2suUF4Ct8SWBU0PEtQDSzvQbFoIXShvvUvFO7RsLnCw+qVwIvwL hsSvM7b6Z88a75Qv64HVD6oJFGwZQ5NQsGU7Ec+jL2xy/eLrM2bE40tXAd2LwEn9JA 5gVlvd0PBA1tcFxzUtMqTLfObHdBv4ia1C3UzXffjLzcOEWY2S2p0N34Om6ButbLrc bAFHz9nE4yJyw== Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org Commit 5f84bb1a4099 ("soc/tegra: pmc: Add sysfs entries for reset info") added sysfs entries for Tegra reset source and level. However, these sysfs are not removed on error and so if the registering of PMC device is probe deferred, then the next time we attempt to probe the PMC device warnings such as the following will be displayed on boot ... sysfs: cannot create duplicate filename '/devices/platform/7000e400.pmc/reset_reason' Fix this by ... 1. Splitting the function tegra_pmc_reset_sysfs_init() into two separate functions for initialising the reset reason sysfs entry and the reset level sysfs entry. Given that not all devices support both this simplifies the cleanup in the error path. 2. If either of the sysfs entries fail to be created, then instead of just printing a warning message, print an error message and return the error to prevent the probe from succeeding and cleanup as necessary. Previously the intention was to avoid the failure of creating the sysfs entries to causing the PMC probe to fail, this should never happen and so it is better to just return the error. Fixes: 5f84bb1a4099 ("soc/tegra: pmc: Add sysfs entries for reset info") Signed-off-by: Jon Hunter --- drivers/soc/tegra/pmc.c | 68 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 50 insertions(+), 18 deletions(-) diff --git a/drivers/soc/tegra/pmc.c b/drivers/soc/tegra/pmc.c index 61c61994f17d..8d769e3ba668 100644 --- a/drivers/soc/tegra/pmc.c +++ b/drivers/soc/tegra/pmc.c @@ -1771,26 +1771,48 @@ static ssize_t reset_level_show(struct device *dev, static DEVICE_ATTR_RO(reset_level); -static void tegra_pmc_reset_sysfs_init(struct tegra_pmc *pmc) +static int tegra_pmc_reset_reason_init(struct tegra_pmc *pmc) { struct device *dev = pmc->dev; - int err = 0; + int err; - if (pmc->soc->reset_sources) { - err = device_create_file(dev, &dev_attr_reset_reason); - if (err < 0) - dev_warn(dev, - "failed to create attr \"reset_reason\": %d\n", - err); - } + if (!pmc->soc->reset_sources) + return 0; - if (pmc->soc->reset_levels) { - err = device_create_file(dev, &dev_attr_reset_level); - if (err < 0) - dev_warn(dev, - "failed to create attr \"reset_level\": %d\n", - err); - } + err = device_create_file(dev, &dev_attr_reset_reason); + if (err < 0) + dev_err(dev, "failed to create attr \"reset_reason\": %d\n", + err); + + return err; +} + +static void tegra_pmc_reset_reason_remove(struct tegra_pmc *pmc) +{ + if (pmc->soc->reset_sources) + device_remove_file(pmc->dev, &dev_attr_reset_reason); +} + +static int tegra_pmc_reset_level_init(struct tegra_pmc *pmc) +{ + struct device *dev = pmc->dev; + int err; + + if (!pmc->soc->reset_levels) + return 0; + + err = device_create_file(dev, &dev_attr_reset_level); + if (err < 0) + dev_err(dev, "failed to create attr \"reset_level\": %d\n", + err); + + return err; +} + +static void tegra_pmc_reset_level_remove(struct tegra_pmc *pmc) +{ + if (pmc->soc->reset_levels) + device_remove_file(pmc->dev, &dev_attr_reset_level); } static int tegra_pmc_irq_translate(struct irq_domain *domain, @@ -2031,12 +2053,18 @@ static int tegra_pmc_probe(struct platform_device *pdev) tegra_pmc_init_tsense_reset(pmc); - tegra_pmc_reset_sysfs_init(pmc); + err = tegra_pmc_reset_reason_init(pmc); + if (err < 0) + return err; + + err = tegra_pmc_reset_level_init(pmc); + if (err < 0) + goto cleanup_reset_reason; if (IS_ENABLED(CONFIG_DEBUG_FS)) { err = tegra_powergate_debugfs_init(); if (err < 0) - return err; + goto cleanup_reset_level; } err = register_restart_handler(&tegra_pmc_restart_handler); @@ -2067,6 +2095,10 @@ static int tegra_pmc_probe(struct platform_device *pdev) unregister_restart_handler(&tegra_pmc_restart_handler); cleanup_debugfs: debugfs_remove(pmc->debugfs); +cleanup_reset_level: + tegra_pmc_reset_level_remove(pmc); +cleanup_reset_reason: + tegra_pmc_reset_reason_remove(pmc); return err; }