From patchwork Wed Jul 8 11:00:11 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Krzysztof Kozlowski X-Patchwork-Id: 6744781 Return-Path: X-Original-To: patchwork-linux-pm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 6913AC05AC for ; Wed, 8 Jul 2015 11:01:51 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 75B03206A4 for ; Wed, 8 Jul 2015 11:01:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 7DF65206C5 for ; Wed, 8 Jul 2015 11:01:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932857AbbGHLBk (ORCPT ); Wed, 8 Jul 2015 07:01:40 -0400 Received: from mail-pd0-f182.google.com ([209.85.192.182]:34580 "EHLO mail-pd0-f182.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932826AbbGHLBg (ORCPT ); Wed, 8 Jul 2015 07:01:36 -0400 Received: by pdbep18 with SMTP id ep18so143934110pdb.1; Wed, 08 Jul 2015 04:01:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=PY0pfQgrm85rU7vfhNLgiWS+eThuKbSWfW4fVwqAYKU=; b=TYpVR3CisC2RZA/dEoudTz0Tu1MwuLiKr+nP4UjNzGNyNUDGgYDpjW1jueUM2C1eJY lQLK1801H585Vs7y6gHqiYwBP2pYKYOsDjlIije5kn3IhPRlpmRI+IDLjmN5jVSO5EUr P1v/H/hVYPiCx7kWGpneCW6R5cRAcF2dGDuVwklJvmHAb8UZevhm6OVXaNGZfAN7vcZ3 j9pdQPZyShbmg04EhMh+XgPCpQWiVB1njY3yer/oPnib1BFuyd0sa5OmztELDm+4AHeA zd2AIMpHKULNqjVLj49a86CVlkzgotONUKbMqKWjdwm1X85B3pCZvJ2oD5CrbYg9g5IS QLaQ== X-Received: by 10.70.89.199 with SMTP id bq7mr19058109pdb.168.1436353295834; Wed, 08 Jul 2015 04:01:35 -0700 (PDT) Received: from localhost.localdomain ([125.130.175.98]) by smtp.gmail.com with ESMTPSA id cq5sm2140928pad.11.2015.07.08.04.01.31 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 08 Jul 2015 04:01:34 -0700 (PDT) From: Krzysztof Kozlowski To: David Woodhouse , Liam Girdwood , Mark Brown , linux-kernel@vger.kernel.org, linux-input@vger.kernel.org, linux-pm@vger.kernel.org Cc: Chanwoo Choi , MyungJoo Ham , Dmitry Torokhov , Samuel Ortiz , Lee Jones , Sebastian Reichel , Dmitry Eremin-Solenikov , Krzysztof Kozlowski Subject: [PATCH v3 3/9] regulator: max77693: Support different register configurations Date: Wed, 8 Jul 2015 20:00:11 +0900 Message-Id: <1436353217-1141-4-git-send-email-k.kozlowski.k@gmail.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1436353217-1141-1-git-send-email-k.kozlowski.k@gmail.com> References: <1436353217-1141-1-git-send-email-k.kozlowski.k@gmail.com> Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org X-Spam-Status: No, score=-7.5 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Add support for different configurations of charger's registers so the same driver could be used on other devices (e.g. MAX77843). Signed-off-by: Krzysztof Kozlowski Acked-by: Mark Brown --- drivers/regulator/max77693.c | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/drivers/regulator/max77693.c b/drivers/regulator/max77693.c index 38722c8311a5..236851ab575a 100644 --- a/drivers/regulator/max77693.c +++ b/drivers/regulator/max77693.c @@ -33,7 +33,13 @@ #include #include -#define CHGIN_ILIM_STEP_20mA 20000 +/* Charger regulator differences between MAX77693 and MAX77843 */ +struct chg_reg_data { + unsigned int linear_reg; + unsigned int linear_mask; + unsigned int uA_step; + unsigned int min_sel; +}; /* * CHARGER regulator - Min : 20mA, Max : 2580mA, step : 20mA @@ -42,25 +48,26 @@ */ static int max77693_chg_get_current_limit(struct regulator_dev *rdev) { + const struct chg_reg_data *reg_data = rdev_get_drvdata(rdev); unsigned int chg_min_uA = rdev->constraints->min_uA; unsigned int chg_max_uA = rdev->constraints->max_uA; unsigned int reg, sel; unsigned int val; int ret; - ret = regmap_read(rdev->regmap, MAX77693_CHG_REG_CHG_CNFG_09, ®); + ret = regmap_read(rdev->regmap, reg_data->linear_reg, ®); if (ret < 0) return ret; - sel = reg & CHG_CNFG_09_CHGIN_ILIM_MASK; + sel = reg & reg_data->linear_mask; /* the first four codes for charger current are all 60mA */ - if (sel <= 3) + if (sel <= reg_data->min_sel) sel = 0; else - sel -= 3; + sel -= reg_data->min_sel; - val = chg_min_uA + CHGIN_ILIM_STEP_20mA * sel; + val = chg_min_uA + reg_data->uA_step * sel; if (val > chg_max_uA) return -EINVAL; @@ -70,20 +77,20 @@ static int max77693_chg_get_current_limit(struct regulator_dev *rdev) static int max77693_chg_set_current_limit(struct regulator_dev *rdev, int min_uA, int max_uA) { + const struct chg_reg_data *reg_data = rdev_get_drvdata(rdev); unsigned int chg_min_uA = rdev->constraints->min_uA; int sel = 0; - while (chg_min_uA + CHGIN_ILIM_STEP_20mA * sel < min_uA) + while (chg_min_uA + reg_data->uA_step * sel < min_uA) sel++; - if (chg_min_uA + CHGIN_ILIM_STEP_20mA * sel > max_uA) + if (chg_min_uA + reg_data->uA_step * sel > max_uA) return -EINVAL; /* the first four codes for charger current are all 60mA */ - sel += 3; + sel += reg_data->min_sel; - return regmap_write(rdev->regmap, - MAX77693_CHG_REG_CHG_CNFG_09, sel); + return regmap_write(rdev->regmap, reg_data->linear_reg, sel); } /* end of CHARGER regulator ops */ @@ -145,6 +152,13 @@ static const struct regulator_desc regulators[] = { }, }; +static const struct chg_reg_data max77693_chg_reg_data = { + .linear_reg = MAX77693_CHG_REG_CHG_CNFG_09, + .linear_mask = CHG_CNFG_09_CHGIN_ILIM_MASK, + .uA_step = 20000, + .min_sel = 3, +}; + static int max77693_pmic_probe(struct platform_device *pdev) { struct max77693_dev *iodev = dev_get_drvdata(pdev->dev.parent); @@ -153,6 +167,7 @@ static int max77693_pmic_probe(struct platform_device *pdev) config.dev = iodev->dev; config.regmap = iodev->regmap; + config.driver_data = (void *)&max77693_chg_reg_data; for (i = 0; i < ARRAY_SIZE(regulators); i++) { struct regulator_dev *rdev; @@ -170,7 +185,7 @@ static int max77693_pmic_probe(struct platform_device *pdev) } static const struct platform_device_id max77693_pmic_id[] = { - {"max77693-pmic", 0}, + { "max77693-pmic", TYPE_MAX77693 }, {}, };