Received: by 2002:ac0:946b:0:0:0:0:0 with SMTP id j40csp53imj; Wed, 6 Feb 2019 22:46:27 -0800 (PST) X-Google-Smtp-Source: AHgI3Ibm8vTJ6wehiotklUW8BfVJKgIPvq79m/qF4M63Du1MjvJkN631N2/aRGymRQhPqJAmV/Jw X-Received: by 2002:a63:c01:: with SMTP id b1mr13670461pgl.182.1549521986992; Wed, 06 Feb 2019 22:46:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1549521986; cv=none; d=google.com; s=arc-20160816; b=i8RL+43Fq4TVSaDS2F/qECVELDKzJrRC0gcszfM0RYBonwcDZwtcmbx6dAi+BCpsn5 FW7wWJgxiXf7dl/qWtgnVZIngoxHQXV83mQfYTQrqA67wqR7xfn0L9YoXIQrWlGr1P6a AY+7kOguLU2InaAz+HZ4ytMkccHxilBJqB75cBYCNjqpHsnDDlbfNgqAFtyZi9LdvpYH Y9qWvQENfVmWlhDLoIt3seI2eIrckUcLIZWawXcksZMvGSMVuX0i8qj4ae4Ltditbuc2 GgMjTh1bG595SNNnnBZnbYUt81EnjXd24EmVoeWqwtu2GD2PdLpMNcRJRfmVGNCHzIT2 FL5w== 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:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=OmhwffWZBeqrhKrdoXsN7mOcEoi2n9Zne0R2wy/js1I=; b=Ynzs7HkA2jDJYI+gsdTJZy5OMhNigpZMCqcp1y83gftbyNag0S6ic+XdozhZyLZbH9 YhzaUGlnye1JB1zq6hE7zn1GW59+OLWZSV9B/9f+M3igUWOHHIof8MwYaBkfBGZaml8j YCkl684RLsH4BkLezuZW/oxdZ8bhWECDv1f1V6WY+vL108dcssSlxvCb6PPRwmw4ht58 LTT9UQ+tDxvifmI08EyQCEZp2Smhzwv1FAsw1I9Mv725L+AulR9sGrNZzeSUKBUGgMZV bWD94EeWpllJ7V/Z2sOoQfh+6TEI3KKYmpF+Hulm8in//P1iKnYM4pMZpZ7n1tJdQmr5 9JpQ== 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 j5si8449538pfg.254.2019.02.06.22.46.11; Wed, 06 Feb 2019 22:46:26 -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 S1726949AbfBGGpz (ORCPT + 99 others); Thu, 7 Feb 2019 01:45:55 -0500 Received: from mirror2.csie.ntu.edu.tw ([140.112.30.76]:34156 "EHLO wens.csie.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726822AbfBGGpr (ORCPT ); Thu, 7 Feb 2019 01:45:47 -0500 Received: by wens.csie.org (Postfix, from userid 1000) id BEAC25FDBD; Thu, 7 Feb 2019 14:45:39 +0800 (CST) From: Chen-Yu Tsai To: Maxime Ripard , Rob Herring , Mark Rutland , Lee Jones , Sebastian Reichel Cc: Quentin Schulz , devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sunxi@googlegroups.com, Hans de Goede , Chen-Yu Tsai Subject: [RFT PATCH 6/9] power: supply: axp20x_usb_power: add support for AXP813 Date: Thu, 7 Feb 2019 14:45:32 +0800 Message-Id: <20190207064535.9226-7-wens@csie.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190207064535.9226-1-wens@csie.org> References: <20190207064535.9226-1-wens@csie.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Quentin Schulz This adds support for AXP813 PMIC. It is almost the same as AXP22X but has a different current limit. Signed-off-by: Quentin Schulz Signed-off-by: Chen-Yu Tsai --- drivers/power/supply/axp20x_usb_power.c | 66 ++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/drivers/power/supply/axp20x_usb_power.c b/drivers/power/supply/axp20x_usb_power.c index 90d06027bf98..d39c450b14c6 100644 --- a/drivers/power/supply/axp20x_usb_power.c +++ b/drivers/power/supply/axp20x_usb_power.c @@ -42,6 +42,11 @@ #define AXP20X_VBUS_CLIMIT_100mA 2 #define AXP20X_VBUS_CLIMIT_NONE 3 +#define AXP813_VBUS_CLIMIT_900mA 0 +#define AXP813_VBUS_CLIMIT_1500mA 1 +#define AXP813_VBUS_CLIMIT_2000mA 2 +#define AXP813_VBUS_CLIMIT_2500mA 3 + #define AXP20X_ADC_EN1_VBUS_CURR BIT(2) #define AXP20X_ADC_EN1_VBUS_VOLT BIT(3) @@ -131,6 +136,31 @@ static int axp20x_get_current_max(struct axp20x_usb_power *power, int *val) return 0; } +static int axp813_get_current_max(struct axp20x_usb_power *power, int *val) +{ + unsigned int v; + int ret = regmap_read(power->regmap, AXP20X_VBUS_IPSOUT_MGMT, &v); + + if (ret) + return ret; + + switch (v & AXP20X_VBUS_CLIMIT_MASK) { + case AXP813_VBUS_CLIMIT_900mA: + *val = 900000; + break; + case AXP813_VBUS_CLIMIT_1500mA: + *val = 1500000; + break; + case AXP813_VBUS_CLIMIT_2000mA: + *val = 2000000; + break; + case AXP813_VBUS_CLIMIT_2500mA: + *val = 2500000; + break; + } + return 0; +} + static int axp20x_usb_power_get_property(struct power_supply *psy, enum power_supply_property psp, union power_supply_propval *val) { @@ -169,6 +199,8 @@ static int axp20x_usb_power_get_property(struct power_supply *psy, val->intval = ret * 1700; /* 1 step = 1.7 mV */ return 0; case POWER_SUPPLY_PROP_CURRENT_MAX: + if (power->axp20x_id == AXP813_ID) + return axp813_get_current_max(power, &val->intval); return axp20x_get_current_max(power, &val->intval); case POWER_SUPPLY_PROP_CURRENT_NOW: if (IS_ENABLED(CONFIG_AXP20X_ADC)) { @@ -260,6 +292,31 @@ static int axp20x_usb_power_set_voltage_min(struct axp20x_usb_power *power, return -EINVAL; } +static int axp813_usb_power_set_current_max(struct axp20x_usb_power *power, + int intval) +{ + int val; + + switch (intval) { + case 900000: + return regmap_update_bits(power->regmap, + AXP20X_VBUS_IPSOUT_MGMT, + AXP20X_VBUS_CLIMIT_MASK, + AXP813_VBUS_CLIMIT_900mA); + case 1500000: + case 2000000: + case 2500000: + val = (intval - 1000000) / 500000; + return regmap_update_bits(power->regmap, + AXP20X_VBUS_IPSOUT_MGMT, + AXP20X_VBUS_CLIMIT_MASK, val); + default: + return -EINVAL; + } + + return -EINVAL; +} + static int axp20x_usb_power_set_current_max(struct axp20x_usb_power *power, int intval) { @@ -299,6 +356,9 @@ static int axp20x_usb_power_set_property(struct power_supply *psy, return axp20x_usb_power_set_voltage_min(power, val->intval); case POWER_SUPPLY_PROP_CURRENT_MAX: + if (power->axp20x_id == AXP813_ID) + return axp813_usb_power_set_current_max(power, + val->intval); return axp20x_usb_power_set_current_max(power, val->intval); default: @@ -434,7 +494,8 @@ static int axp20x_usb_power_probe(struct platform_device *pdev) usb_power_desc = &axp20x_usb_power_desc; irq_names = axp20x_irq_names; } else if (power->axp20x_id == AXP221_ID || - power->axp20x_id == AXP223_ID) { + power->axp20x_id == AXP223_ID || + power->axp20x_id == AXP813_ID) { usb_power_desc = &axp22x_usb_power_desc; irq_names = axp22x_irq_names; } else { @@ -493,6 +554,9 @@ static const struct of_device_id axp20x_usb_power_match[] = { }, { .compatible = "x-powers,axp223-usb-power-supply", .data = (void *)AXP223_ID, + }, { + .compatible = "x-powers,axp813-usb-power-supply", + .data = (void *)AXP813_ID, }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, axp20x_usb_power_match); -- 2.20.1