From patchwork Wed Apr 18 15:54:18 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Douglas Anderson X-Patchwork-Id: 10348629 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 59E2860244 for ; Wed, 18 Apr 2018 15:54:34 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4A355286F3 for ; Wed, 18 Apr 2018 15:54:34 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3ED0628724; Wed, 18 Apr 2018 15:54:34 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 86201286F3 for ; Wed, 18 Apr 2018 15:54:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752634AbeDRPyc (ORCPT ); Wed, 18 Apr 2018 11:54:32 -0400 Received: from mail-pg0-f65.google.com ([74.125.83.65]:39760 "EHLO mail-pg0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751232AbeDRPyb (ORCPT ); Wed, 18 Apr 2018 11:54:31 -0400 Received: by mail-pg0-f65.google.com with SMTP id b9so1061771pgf.6 for ; Wed, 18 Apr 2018 08:54:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id; bh=BFzOMY08EoUJk8AHEIOuUWHlalj2aDe2h1lbvy+KT9c=; b=LrD/chrSlWMHnB5qJzqr16W4yurtEFGBs6Ky96oGUKh6z5OTtNwEboJ//9RK5WPCuH F5xMCzn2xMfAlrcbGaGltaz5M05AFv/H7EteOfgZ1MaSspJvXdyWKWX4RVRq+gjmOb5c 1Eo/xQ9Tr9qJnXylYdMnV5ZAqJ9x2w0WLT0fE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=BFzOMY08EoUJk8AHEIOuUWHlalj2aDe2h1lbvy+KT9c=; b=KwNkRNmD2RHUV7cVU/gco2PfUBvzj0i4JrD8ScjD8tjwbzYjtxF8t0W3iodoMXvJi8 EBj74mTEhQrCRig2iXAOmD2A1anT7Qo+rPUnfWp5jRgN11JFH5LUN7sEBgGSuttwB5wW NXtFt0bvPQp8cFXukH3qjd0buRn/hxE5UDh7IUWrbGNwTgxl3u2R523WVrYXQWn3axaP 01vW+wXtcV/+Q9xWM8mzPoZ+fgan+X4Q6g7M12UBCRcp+Kq5TmN0qaX+KZmcrVXmO2NP Y4oAhs4SFbQwIQE++zF+DCHhLqyeLCEj/l8ZnaaWbBFanzW7X8djmyh6e7lK+4vpF5nM s5vQ== X-Gm-Message-State: ALQs6tALhwJiQIqwERWHHXtgUmfSOziIXgjthGy9/qhZ3jMTFa4oK6rk v5fD/WX2BOgjmhXE4pnvZxm1qA== X-Google-Smtp-Source: AIpwx49ClOkrqGpAS/L8IFK7rElvZFjD8eE1cQEgiIbDY9LtxuG7tBS+Rpv7ydqRnIwRzU8CQoWoww== X-Received: by 10.99.4.88 with SMTP id 85mr2199718pge.156.1524066870658; Wed, 18 Apr 2018 08:54:30 -0700 (PDT) Received: from tictac2.mtv.corp.google.com ([2620:0:1000:1511:bde7:107f:fd5:44c8]) by smtp.gmail.com with ESMTPSA id z8sm3577722pgc.90.2018.04.18.08.54.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 18 Apr 2018 08:54:29 -0700 (PDT) From: Douglas Anderson To: broonie@kernel.org Cc: David Collins , Javier Martinez Canillas , evgreen@chromium.org, swboyd@chromium.org, Douglas Anderson , linux-omap@vger.kernel.org, Liam Girdwood , Tony Lindgren , linux-kernel@vger.kernel.org Subject: [PATCH v3] regulator: Don't return or expect -errno from of_map_mode() Date: Wed, 18 Apr 2018 08:54:18 -0700 Message-Id: <20180418155418.111278-1-dianders@chromium.org> X-Mailer: git-send-email 2.17.0.484.g0c8726318c-goog Sender: linux-omap-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-omap@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP In of_get_regulation_constraints() we were taking the result of of_map_mode() (an unsigned int) and assigning it to an int. We were then checking whether this value was -EINVAL. Some implementers of of_map_mode() were returning -EINVAL (even though the return type of their function needed to be unsigned int) because they needed to signal an error back to of_get_regulation_constraints(). In general in the regulator framework the mode is always referred to as an unsigned int. While we could fix this to be a signed int (the highest value we store in there right now is 0x8), it's actually pretty clean to just define the regulator mode 0x0 (the lack of any bits set) as an invalid mode. Let's do that. Fixes: 5e5e3a42c653 ("regulator: of: Add support for parsing initial and suspend modes") Suggested-by: Javier Martinez Canillas Signed-off-by: Douglas Anderson Reviewed-by: Javier Martinez Canillas --- Changes in v3: - Move local variable declaration to top of func - s/to to/to in commit message - Avoid calling of_map_mode() twice in one case (oops) - Updated Suggested-by to Javier's redhat address to match review. Changes in v2: - Use Javier's suggestion of defining 0x0 as invalid drivers/regulator/cpcap-regulator.c | 2 +- drivers/regulator/of_regulator.c | 13 +++++++------ drivers/regulator/twl-regulator.c | 2 +- include/linux/regulator/consumer.h | 1 + 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/drivers/regulator/cpcap-regulator.c b/drivers/regulator/cpcap-regulator.c index f541b80f1b54..bd910fe123d9 100644 --- a/drivers/regulator/cpcap-regulator.c +++ b/drivers/regulator/cpcap-regulator.c @@ -222,7 +222,7 @@ static unsigned int cpcap_map_mode(unsigned int mode) case CPCAP_BIT_AUDIO_LOW_PWR: return REGULATOR_MODE_STANDBY; default: - return -EINVAL; + return REGULATOR_MODE_INVALID; } } diff --git a/drivers/regulator/of_regulator.c b/drivers/regulator/of_regulator.c index f47264fa1940..0d3f73eacb99 100644 --- a/drivers/regulator/of_regulator.c +++ b/drivers/regulator/of_regulator.c @@ -31,6 +31,7 @@ static void of_get_regulation_constraints(struct device_node *np, struct regulation_constraints *constraints = &(*init_data)->constraints; struct regulator_state *suspend_state; struct device_node *suspend_np; + unsigned int mode; int ret, i; u32 pval; @@ -124,11 +125,11 @@ static void of_get_regulation_constraints(struct device_node *np, if (!of_property_read_u32(np, "regulator-initial-mode", &pval)) { if (desc && desc->of_map_mode) { - ret = desc->of_map_mode(pval); - if (ret == -EINVAL) + mode = desc->of_map_mode(pval); + if (mode == REGULATOR_MODE_INVALID) pr_err("%s: invalid mode %u\n", np->name, pval); else - constraints->initial_mode = ret; + constraints->initial_mode = mode; } else { pr_warn("%s: mapping for mode %d not defined\n", np->name, pval); @@ -163,12 +164,12 @@ static void of_get_regulation_constraints(struct device_node *np, if (!of_property_read_u32(suspend_np, "regulator-mode", &pval)) { if (desc && desc->of_map_mode) { - ret = desc->of_map_mode(pval); - if (ret == -EINVAL) + mode = desc->of_map_mode(pval); + if (mode == REGULATOR_MODE_INVALID) pr_err("%s: invalid mode %u\n", np->name, pval); else - suspend_state->mode = ret; + suspend_state->mode = mode; } else { pr_warn("%s: mapping for mode %d not defined\n", np->name, pval); diff --git a/drivers/regulator/twl-regulator.c b/drivers/regulator/twl-regulator.c index a4456db5849d..884c7505ed91 100644 --- a/drivers/regulator/twl-regulator.c +++ b/drivers/regulator/twl-regulator.c @@ -274,7 +274,7 @@ static inline unsigned int twl4030reg_map_mode(unsigned int mode) case RES_STATE_SLEEP: return REGULATOR_MODE_STANDBY; default: - return -EINVAL; + return REGULATOR_MODE_INVALID; } } diff --git a/include/linux/regulator/consumer.h b/include/linux/regulator/consumer.h index df176d7c2b87..25602afd4844 100644 --- a/include/linux/regulator/consumer.h +++ b/include/linux/regulator/consumer.h @@ -80,6 +80,7 @@ struct regmap; * These modes can be OR'ed together to make up a mask of valid register modes. */ +#define REGULATOR_MODE_INVALID 0x0 #define REGULATOR_MODE_FAST 0x1 #define REGULATOR_MODE_NORMAL 0x2 #define REGULATOR_MODE_IDLE 0x4