From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-yx1-f51.google.com (mail-yx1-f51.google.com [74.125.224.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B1FF31F3BA4 for ; Sat, 16 May 2026 03:16:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.224.51 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778901414; cv=none; b=L9+LOOz47zVL1AvIl74+v0ztKywGwLjzMca0DrpCjf99IrTIdTRCy8MbTLSazWFqwyWvs0LbNq+INJzlQkoEAgoumVYcvbn3SYkxLuHhLtmfZpJ0vM8hxaPG9/uvcV8JgsJCgnFCWL9mbxsDAhSoZyb7AgjAQCMiYgy1w/uGSuM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778901414; c=relaxed/simple; bh=Lc729Y0xn224/idzeEfk3/KfNdWuCMbif9brSHxshEk=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=a/V0FrZ9Dla2fRbIOCMto3EaPsSILae/OR82Qrrj+iX56y+wv77v62bBmiY29UrfDJ7Oza5meKqaBqQutDSMg2wCLdDJYLKp0ItcTOGfbfb+88iuw/XxueWBcvNI+YsPN1YBcOU+MiGY+EJRFXY9KMm75MKXdd2TSm5OJiABb2g= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=KZPWVOP4; arc=none smtp.client-ip=74.125.224.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="KZPWVOP4" Received: by mail-yx1-f51.google.com with SMTP id 956f58d0204a3-65c3ea2ebf7so1076242d50.0 for ; Fri, 15 May 2026 20:16:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778901412; x=1779506212; darn=vger.kernel.org; h=content-transfer-encoding:in-reply-to:content-language:from :references:cc:to:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=zrJh0LBRhfhE6RUeOB54ZELwAnToFXLSRbXNOLZrn9E=; b=KZPWVOP4VSDw2nm1+DG8M6aUrS4q9b4Hg737MZ1uIBHdL3Rr1dowrV+cC0nYrvU8bG /5m6mrOn9xXbTz1d8aqxbcklSWHJElOdITaXDTMz5xkSeLknsa8OcCgvxtJVmDpUDqCB TaJkIbIxFo3XAx+3VarU18L18adpQ0Y1s2ULVpk3vEMqeMLeb1WN/PIRvgQXoDqwAFtV BufsYcmX0WoluqaiI5Scj8dK0dC9yH/7xJWB5lNmqI2+0sKYLrKtv/UFRkRR05OK3uVV llIhbgbgth3EV+EUcP/EUVdczR+xO/fpbf2+gNpPrKznNAqgoMWUFY1X5WjpvwUFxbNC NpRA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778901412; x=1779506212; h=content-transfer-encoding:in-reply-to:content-language:from :references:cc:to:subject:user-agent:mime-version:date:message-id :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=zrJh0LBRhfhE6RUeOB54ZELwAnToFXLSRbXNOLZrn9E=; b=DDD6MppVI8LBV8nND1GM5iCf2wprUXRkhHIYNsOdcCIyAnSp8oagu1Fw9V7eR8r5BK UZW4um/e8CdujH9NJrt+qK4jhMYebA2qwRO+Tiujlv7zZBP9kUB85CTOhUv3X7X2mVPX wNUqOZwcOCxYHqqLe3y5ZxIG3qIzNx6FFphUgt3UIbb04mbU2m5TT31pnnck+gvqua2X 6RD3kqXmmyCkEsaCf5ZiI3k0AzbsjUbUVwZ2NOJZ69U4z42ftoA6hKyW7KKJ6ulBQ1Xs mc8sA2qs4P+N88wNvg532CglR3Y7Cr7K980hf/K/AkOTQIjeDj/xJQK9+QnHTAXT9OMX OZHA== X-Forwarded-Encrypted: i=1; AFNElJ8tVGjUOUMOAqsvLpFxNrtjwYA9xThSTGUAAAkvxKEKQAKYKC+A2LEvSY753XWFVz5dKTjuqMI151ucrE0=@vger.kernel.org X-Gm-Message-State: AOJu0YwxPxIzsGbwLbZ9K+hVsrehst+q5IFx70ovqN4Ck3FeEV9YHAjC pwH/2tRT0yusel6mSQC/rmS41yJZN3YeuAL3QLqtN5bJu+yXdz2qZATaE78x2fJju655Uqv3UbA Zb/N0l9m1R5U= X-Gm-Gg: Acq92OEAft9oZPt+0glT5697fcbgmRuR6NJhdDEypAjwAHv2gF8C1Ac5JwsMhZNrjHG euwEW1QihVxHhGEZUM1g2AtFxeoZmfvhBpqX45b2BflrSNPhUyd4FdCzm1nCY5vrK0Y2FdWMaKT tXqRWAo+EAcjP7gE16fPMLFLe52fyxTG9oqx/6a+6wdl+CNbLbfj4pvHwT7hdDzoMnQHouBfAsS 28MCq/e2hQzIkbOtcMjmuBzE5owjXb0tFjH9DwdnsFLrz8QR7Z88u2pUsZSD/RpRmN1R1f9IX/6 bspKlfj/yxbelvNWCHXxARigThurNA1OmLGOgiQRDCjtAqvD2fLMbwghKcTTWuVpgGZYS4IBCPq A9HeVSIm6yuNEpDPbrRqPt6mskvDJjTAUF3/JJZGE0rqX16+3UmIBc6gbWDtwZhuZGvJBVHmd4E rqppn759oHMQuIeQSoHpszY5Vo65T2MNpFuUAr68fjv9WsKF6fOGox5rKnthlv2Fs1tPUOyI2/b PN1hewjzzyHsdAECcol X-Received: by 2002:a05:690e:4419:b0:65d:7e64:7edf with SMTP id 956f58d0204a3-65e228a63f1mr5041425d50.60.1778901411196; Fri, 15 May 2026 20:16:51 -0700 (PDT) Received: from ?IPV6:2600:1700:4570:89a0:9ee1:b971:dc61:3e74? ([2600:1700:4570:89a0:9ee1:b971:dc61:3e74]) by smtp.gmail.com with ESMTPSA id 956f58d0204a3-65e0db0aa51sm3395322d50.12.2026.05.15.20.16.49 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 15 May 2026 20:16:50 -0700 (PDT) Message-ID: <21100c24-1499-48c9-b8cc-0e82cf931c59@google.com> Date: Fri, 15 May 2026 20:16:48 -0700 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH 1/3] power: Add power_supply_get_battery_all() to fetch battery psy handles To: Hans de Goede , Sebastian Reichel , Badhri Jagan Sridharan , Heikki Krogerus , Greg Kroah-Hartman , Krzysztof Kozlowski , Marek Szyprowski , Sebastian Krzyszkowiak , Purism Kernel Team Cc: linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, =?UTF-8?Q?Andr=C3=A9_Draszik?= , Tudor Ambarus , Peter Griffin , RD Babiera , Kyle Tso References: <20260515-batt-status-v1-0-fed6b7d8cea7@google.com> <20260515-batt-status-v1-1-fed6b7d8cea7@google.com> From: Amit Sunil Dhamne Content-Language: en-US In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Hi Hans, On 5/15/26 12:15 AM, Hans de Goede wrote: > Hi, > > On 15-May-26 07:48, Amit Sunil Dhamne via B4 Relay wrote: >> From: Amit Sunil Dhamne >> >> Add power_supply_get_battery_all() to allow drivers to obtain a list of >> registered battery type power supply references in the system. >> >> Signed-off-by: Amit Sunil Dhamne >> --- >> drivers/power/supply/power_supply_core.c | 122 +++++++++++++++++++++++++++++++ >> include/linux/power_supply.h | 9 +++ >> 2 files changed, 131 insertions(+) >> >> diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/supply/power_supply_core.c >> index a446d3d086fc..697645426fb1 100644 >> --- a/drivers/power/supply/power_supply_core.c >> +++ b/drivers/power/supply/power_supply_core.c >> @@ -482,6 +482,128 @@ struct power_supply *power_supply_get_by_name(const char *name) >> } >> EXPORT_SYMBOL_GPL(power_supply_get_by_name); >> >> +static int __power_supply_get_num_battery(struct power_supply *epsy, void *data) >> +{ >> + int *count = data; >> + >> + if (epsy->desc->type == POWER_SUPPLY_TYPE_BATTERY) >> + (*count)++; >> + >> + return 0; >> +} >> + >> +static int power_supply_get_num_battery(struct device *dev) >> +{ >> + int ret, count = 0; >> + >> + ret = power_supply_for_each_psy(&count, __power_supply_get_num_battery); >> + >> + dev_dbg(dev, "%s: count: %d ret %d\n", __func__, count, ret); >> + >> + if (ret) >> + return ret; >> + >> + return count; >> +} >> + >> +struct psy_get_supplies_data { >> + int cnt; >> + int size; >> + struct power_supply **psys; >> +}; >> + >> +static int __power_supply_populate_battery_array(struct power_supply *epsy, >> + void *_data) >> +{ >> + struct psy_get_supplies_data *data = _data; >> + >> + if (epsy->desc->type == POWER_SUPPLY_TYPE_BATTERY) { >> + if (data->size <= data->cnt) >> + return -EOVERFLOW; >> + >> + get_device(&epsy->dev); >> + data->psys[data->cnt] = epsy; >> + atomic_inc(&epsy->use_cnt); >> + data->cnt++; >> + } >> + >> + return 0; >> +} >> + >> +static int power_supply_populate_battery_array(struct device *dev, int size, >> + struct power_supply **batteries) >> +{ >> + int ret, i; >> + >> + struct psy_get_supplies_data data = { >> + .cnt = 0, >> + .size = size, >> + .psys = batteries, >> + }; >> + >> + ret = power_supply_for_each_psy(&data, __power_supply_populate_battery_array); >> + >> + dev_dbg(dev, "%s Found %d batteries with array size %d ret %d\n", >> + __func__, data.cnt, data.size, ret); >> + >> + if (ret < 0) { >> + for (i = 0; i < data.cnt; i++) >> + power_supply_put(batteries[i]); >> + return ret; >> + } >> + >> + return data.cnt; >> +} >> + >> +/** >> + * power_supply_get_battery_all() - Searches for all battery type power supplies >> + * and returns their references. >> + * @dev: Pointer to device requesting the power supply refs. >> + * @psys: Pointer to an array of power supply refs that will be filled by this >> + * function. >> + * >> + * This function helps drivers get handles to all battery type power supplies. >> + * If acquiring a ref to a power supply results in error, then the search for >> + * battery type power supplies will abort and the acquired power supplies will >> + * be "put". >> + * >> + * Return: Indicates the number of battery type power supplies returned on >> + * success or the negative error code on failure. >> + * >> + * It's the responsibility of the caller to invoke power_supply_put() on the >> + * individual psy refs and free the array returned by this function using kfree(). > Not a full review, just a quick remark: It seems to me that there should > be some helper function e.g. : > > void power_supply_put_array(struct power_supply **psys, int count); > > Which can be called with the returned array + count to do this for the caller, > rather then expecting all callers to open code this. I see. I will add this as a new helper in the next revision. Thanks, Amit > > Regards, > > Hans > > >> + */ >> +int __must_check power_supply_get_battery_all(struct device *dev, >> + struct power_supply ***psys) >> +{ >> + int ret; >> + >> + if (!psys) >> + return -EINVAL; >> + >> + ret = power_supply_get_num_battery(dev); >> + if (ret < 0) >> + return ret; >> + >> + if (!ret) { >> + *psys = NULL; >> + return 0; >> + } >> + >> + *psys = kzalloc_objs(**psys, ret); >> + if (!*psys) >> + return -ENOMEM; >> + >> + ret = power_supply_populate_battery_array(dev, ret, *psys); >> + if (ret <= 0) { >> + kfree(*psys); >> + *psys = NULL; >> + } >> + >> + return ret; >> +} >> +EXPORT_SYMBOL_GPL(power_supply_get_battery_all); >> + >> /** >> * power_supply_put() - Drop reference obtained with power_supply_get_by_name >> * @psy: Reference to put >> diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h >> index 7a5e4c3242a0..2467530a5740 100644 >> --- a/include/linux/power_supply.h >> +++ b/include/linux/power_supply.h >> @@ -806,11 +806,20 @@ extern int power_supply_reg_notifier(struct notifier_block *nb); >> extern void power_supply_unreg_notifier(struct notifier_block *nb); >> #if IS_ENABLED(CONFIG_POWER_SUPPLY) >> extern struct power_supply *power_supply_get_by_name(const char *name); >> +extern int __must_check power_supply_get_battery_all(struct device *dev, >> + struct power_supply ***psys); >> extern void power_supply_put(struct power_supply *psy); >> #else >> static inline void power_supply_put(struct power_supply *psy) {} >> static inline struct power_supply *power_supply_get_by_name(const char *name) >> { return NULL; } >> +static inline int __must_check power_supply_get_battery_all(struct device *dev, >> + struct power_supply ***psys) >> +{ >> + if (psys) >> + *psys = NULL; >> + return 0; >> +} >> #endif >> extern struct power_supply *power_supply_get_by_reference(struct fwnode_handle *fwnode, >> const char *property); >>