Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751667AbbHTCal (ORCPT ); Wed, 19 Aug 2015 22:30:41 -0400 Received: from mail-bn1bn0101.outbound.protection.outlook.com ([157.56.110.101]:58002 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750764AbbHTCak convert rfc822-to-8bit (ORCPT ); Wed, 19 Aug 2015 22:30:40 -0400 From: Peter Chen To: Mark Brown , Baolin Wang CC: "linux-kernel@vger.kernel.org" , "patches@opensource.wolfsonmicro.com" Subject: RE: [PATCH] power: wm831x_power: Support USB charger current limit management Thread-Topic: [PATCH] power: wm831x_power: Support USB charger current limit management Thread-Index: AQHQ2p4xo6zVhMaw5EKOcbXTPrbsnJ4UKvMg Date: Thu, 20 Aug 2015 02:30:36 +0000 Message-ID: References: <1440002569-31735-1-git-send-email-broonie@kernel.org> In-Reply-To: <1440002569-31735-1-git-send-email-broonie@kernel.org> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=Peter.Chen@freescale.com; x-originating-ip: [192.88.170.35] x-microsoft-exchange-diagnostics: 1;BN3PR0301MB0851;5:cueSlCGU9gB19mOQ4uzO/EAoXMTVsqaapeam2YoeGxQvFkil1Hrxcdi75anqgPB/hcS8f/2uZ0LmoWCmU7m+zVs22jvxXKmqI2CvOxADa942wWJxrPGB+vYXLXCfHxsDUfCHYyjrrXmAIumIeUXnQQ==;24:nVF6HTXtEfriieSiJaaUT4sD4S8wLAZsm9Pkpq45Blf+CnxJ386gZ7x+eKe1OTm8GdhAQ4+jvV2sEPeY85OezfPEcTw9TYzle8TEopj2cdg=;20:dj4UAMqj4IXCGa5y8z1MgPaFv8DQw3m/FTWWfEjCNsUtN/AQMyPuQmSvJOMD/7yNrdNPRRGZQB1uPaPL96fIAQ== x-microsoft-antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BN3PR0301MB0851; x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:; x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(601004)(5005006)(8121501046)(3002001);SRVR:BN3PR0301MB0851;BCL:0;PCL:0;RULEID:;SRVR:BN3PR0301MB0851; x-forefront-prvs: 0674DC6DD3 x-forefront-antispam-report: SFV:NSPM;SFS:(10019020)(6009001)(199003)(189002)(74316001)(101416001)(66066001)(19580405001)(46102003)(99286002)(4001540100001)(5001830100001)(50986999)(54356999)(76176999)(81156007)(5001960100002)(2656002)(5001770100001)(97736004)(10400500002)(189998001)(19580395003)(92566002)(102836002)(2900100001)(122556002)(77156002)(5001860100001)(33656002)(40100003)(87936001)(5002640100001)(76576001)(106116001)(105586002)(2950100001)(62966003)(86362001)(5003600100002)(77096005)(68736005)(64706001)(5007970100001)(106356001);DIR:OUT;SFP:1102;SCL:1;SRVR:BN3PR0301MB0851;H:BN3PR0301MB0849.namprd03.prod.outlook.com;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; spamdiagnosticoutput: 1:23 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 8BIT MIME-Version: 1.0 X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-originalarrivaltime: 20 Aug 2015 02:30:36.0825 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN3PR0301MB0851 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4603 Lines: 161 > Integrate with the newly added USB charger interface to limit the current we > draw from the USB input based on the input device configuration identified by > the USB stack, allowing us to charge more quickly from high current inputs > without drawing more current than specified from others. > > Signed-off-by: Mark Brown > --- > > Fix up the limit detection loop as identified by Peter Chen. > > drivers/power/wm831x_power.c | 69 > ++++++++++++++++++++++++++++++++++++++++ > include/linux/mfd/wm831x/pdata.h | 3 ++ > 2 files changed, 72 insertions(+) > > diff --git a/drivers/power/wm831x_power.c > b/drivers/power/wm831x_power.c index c826c83..9493902 100644 > --- a/drivers/power/wm831x_power.c > +++ b/drivers/power/wm831x_power.c > @@ -13,6 +13,7 @@ > #include > #include > #include > +#include > > #include > #include > @@ -31,6 +32,8 @@ struct wm831x_power { > char usb_name[20]; > char battery_name[20]; > bool have_battery; > + struct usb_charger *usb_charger; > + struct notifier_block usb_notify; > }; > > static int wm831x_power_check_online(struct wm831x *wm831x, int supply, > @@ -125,6 +128,43 @@ static enum power_supply_property > wm831x_usb_props[] = { > POWER_SUPPLY_PROP_VOLTAGE_NOW, > }; > > +/* In miliamps */ > +static unsigned int wm831x_usb_limits[] = { > + 0, > + 2, > + 100, > + 500, > + 900, > + 1500, > + 1800, > + 550, > +}; > + > +static int wm831x_usb_limit_change(struct notifier_block *nb, > + unsigned long limit, void *data) { > + struct wm831x_power *wm831x_power = container_of(nb, > + struct wm831x_power, > + usb_notify); > + int i, best; > + > + /* Find the highest supported limit */ > + best = 0; > + for (i = 0; i < ARRAY_SIZE(wm831x_usb_limits); i++) { > + if (limit >= wm831x_usb_limits[i] && > + wm831x_usb_limits[best] < wm831x_usb_limits[i]) > + best = i; > + } > + > + dev_dbg(wm831x_power->wm831x->dev, > + "Limiting USB current to %dmA", wm831x_usb_limits[best]); > + > + wm831x_set_bits(wm831x_power->wm831x, > WM831X_POWER_STATE, > + WM831X_USB_ILIM_MASK, best); > + > + return 0; > +} > + > > /*********************************************************** > ********** > * Battery properties > > ************************************************************ > *********/ > @@ -607,8 +647,31 @@ static int wm831x_power_probe(struct > platform_device *pdev) > } > } > > + if (wm831x_pdata && wm831x_pdata->usb_gadget) { > + power->usb_charger = > + usb_charger_find_by_name(wm831x_pdata- > >usb_gadget); > + if (IS_ERR(power->usb_charger)) { > + ret = PTR_ERR(power->usb_charger); > + dev_err(&pdev->dev, > + "Failed to find USB gadget: %d\n", ret); > + goto err_bat_irq; > + } > + > + power->usb_notify.notifier_call = wm831x_usb_limit_change; > + > + ret = usb_charger_register_notify(power->usb_charger, > + &power->usb_notify); > + if (ret != 0) { > + dev_err(&pdev->dev, > + "Failed to register notifier: %d\n", ret); > + goto err_usb_charger; > + } > + } > + > return ret; > > +err_usb_charger: > + /* put_device on charger */ > err_bat_irq: > --i; > for (; i >= 0; i--) { > @@ -637,6 +700,12 @@ static int wm831x_power_remove(struct > platform_device *pdev) > struct wm831x *wm831x = wm831x_power->wm831x; > int irq, i; > > + if (wm831x_power->usb_charger) { > + usb_charger_unregister_notify(wm831x_power->usb_charger, > + &wm831x_power->usb_notify); > + /* Free charger */ > + } > + > for (i = 0; i < ARRAY_SIZE(wm831x_bat_irqs); i++) { > irq = wm831x_irq(wm831x, > platform_get_irq_byname(pdev, > diff --git a/include/linux/mfd/wm831x/pdata.h > b/include/linux/mfd/wm831x/pdata.h > index dcc9631..5af8399 100644 > --- a/include/linux/mfd/wm831x/pdata.h > +++ b/include/linux/mfd/wm831x/pdata.h > @@ -126,6 +126,9 @@ struct wm831x_pdata { > /** The driver should initiate a power off sequence during shutdown > */ > bool soft_shutdown; > > + /** dev_name of USB charger gadget to integrate with */ > + const char *usb_gadget; > + > int irq_base; > int gpio_base; > int gpio_defaults[WM831X_GPIO_NUM]; > -- > 2.5.0 Acked-by: Peter Chen Peter -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/