linux-pm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/4] power: supply: core: random cleanups and optimizations
@ 2024-10-05 10:06 Thomas Weißschuh
  2024-10-05 10:06 ` [PATCH 1/4] power: supply: core: use device mutex wrappers Thomas Weißschuh
                   ` (4 more replies)
  0 siblings, 5 replies; 8+ messages in thread
From: Thomas Weißschuh @ 2024-10-05 10:06 UTC (permalink / raw)
  To: Sebastian Reichel; +Cc: linux-pm, linux-kernel, Thomas Weißschuh

Some independent cleanups and optimizations.

Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
---
Thomas Weißschuh (4):
      power: supply: core: use device mutex wrappers
      power: supply: core: unexport power_supply_property_is_writeable()
      power: supply: core: mark attribute arrays as ro_after_init
      power: supply: hwmon: move interface to private header

 drivers/power/supply/power_supply.h       | 22 +++++++++++++++++++++-
 drivers/power/supply/power_supply_core.c  |  5 ++---
 drivers/power/supply/power_supply_hwmon.c |  3 +++
 drivers/power/supply/power_supply_sysfs.c | 12 ++++++------
 include/linux/power_supply.h              | 15 ---------------
 5 files changed, 32 insertions(+), 25 deletions(-)
---
base-commit: 27cc6fdf720183dce1dbd293483ec5a9cb6b595e
change-id: 20240922-power-supply-cleanups-7cebf4691754

Best regards,
-- 
Thomas Weißschuh <linux@weissschuh.net>


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 1/4] power: supply: core: use device mutex wrappers
  2024-10-05 10:06 [PATCH 0/4] power: supply: core: random cleanups and optimizations Thomas Weißschuh
@ 2024-10-05 10:06 ` Thomas Weißschuh
  2024-10-05 10:06 ` [PATCH 2/4] power: supply: core: unexport power_supply_property_is_writeable() Thomas Weißschuh
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 8+ messages in thread
From: Thomas Weißschuh @ 2024-10-05 10:06 UTC (permalink / raw)
  To: Sebastian Reichel; +Cc: linux-pm, linux-kernel, Thomas Weißschuh

The mutex is an implementation detail of struct device.
Use the dedicated wrappers to access the field.

Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
---
 drivers/power/supply/power_supply_core.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/supply/power_supply_core.c
index 49534458a9f7d3f6d7c01bd91fa1bb6ed23bc7ad..c4608c60f7de2618941aae6e345a413ee249c0ae 100644
--- a/drivers/power/supply/power_supply_core.c
+++ b/drivers/power/supply/power_supply_core.c
@@ -152,7 +152,7 @@ static void power_supply_deferred_register_work(struct work_struct *work)
 						deferred_register_work.work);
 
 	if (psy->dev.parent) {
-		while (!mutex_trylock(&psy->dev.parent->mutex)) {
+		while (!device_trylock(psy->dev.parent)) {
 			if (psy->removing)
 				return;
 			msleep(10);
@@ -162,7 +162,7 @@ static void power_supply_deferred_register_work(struct work_struct *work)
 	power_supply_changed(psy);
 
 	if (psy->dev.parent)
-		mutex_unlock(&psy->dev.parent->mutex);
+		device_unlock(psy->dev.parent);
 }
 
 #ifdef CONFIG_OF

-- 
2.46.2


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 2/4] power: supply: core: unexport power_supply_property_is_writeable()
  2024-10-05 10:06 [PATCH 0/4] power: supply: core: random cleanups and optimizations Thomas Weißschuh
  2024-10-05 10:06 ` [PATCH 1/4] power: supply: core: use device mutex wrappers Thomas Weißschuh
@ 2024-10-05 10:06 ` Thomas Weißschuh
  2024-10-05 10:06 ` [PATCH 3/4] power: supply: core: mark attribute arrays as ro_after_init Thomas Weißschuh
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 8+ messages in thread
From: Thomas Weißschuh @ 2024-10-05 10:06 UTC (permalink / raw)
  To: Sebastian Reichel; +Cc: linux-pm, linux-kernel, Thomas Weißschuh

Since commit ("power: supply: Drop use_cnt check from power_supply_property_is_writeable()"),
this function does not check use_cnt anymore, making it unsuitable for
general usage. As it is only used by the psy core anyways, remove it
from the public header and unexport it to avoid misusage.

Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
---
 drivers/power/supply/power_supply.h       | 3 +++
 drivers/power/supply/power_supply_core.c  | 1 -
 drivers/power/supply/power_supply_hwmon.c | 1 +
 include/linux/power_supply.h              | 2 --
 4 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/power/supply/power_supply.h b/drivers/power/supply/power_supply.h
index 3cbafc58bdad0b9766441fa22981e5cf15870c80..1bc57615ba68fb33e5b77f720e454dbba6daa291 100644
--- a/drivers/power/supply/power_supply.h
+++ b/drivers/power/supply/power_supply.h
@@ -13,6 +13,9 @@ struct device;
 struct device_type;
 struct power_supply;
 
+extern int power_supply_property_is_writeable(struct power_supply *psy,
+					      enum power_supply_property psp);
+
 #ifdef CONFIG_SYSFS
 
 extern void power_supply_init_attrs(void);
diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/supply/power_supply_core.c
index c4608c60f7de2618941aae6e345a413ee249c0ae..3fea6c973d751ba97ab5e132895eaf39c3a79266 100644
--- a/drivers/power/supply/power_supply_core.c
+++ b/drivers/power/supply/power_supply_core.c
@@ -1233,7 +1233,6 @@ int power_supply_property_is_writeable(struct power_supply *psy,
 {
 	return psy->desc->property_is_writeable && psy->desc->property_is_writeable(psy, psp);
 }
-EXPORT_SYMBOL_GPL(power_supply_property_is_writeable);
 
 void power_supply_external_power_changed(struct power_supply *psy)
 {
diff --git a/drivers/power/supply/power_supply_hwmon.c b/drivers/power/supply/power_supply_hwmon.c
index 6fbbfb1c685e6c7fde41ea2fa88a557ed6dda2a1..01be04903d7d2465ae2acb9eeb0b55a87868bb87 100644
--- a/drivers/power/supply/power_supply_hwmon.c
+++ b/drivers/power/supply/power_supply_hwmon.c
@@ -7,6 +7,7 @@
 #include <linux/hwmon.h>
 #include <linux/power_supply.h>
 #include <linux/slab.h>
+#include "power_supply.h"
 
 struct power_supply_hwmon {
 	struct power_supply *psy;
diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h
index 910d407ebe6323aaf4b31f0081f2cdd4be43a9fa..ea0ba149f296644bd18717d91f338172602eb6d6 100644
--- a/include/linux/power_supply.h
+++ b/include/linux/power_supply.h
@@ -863,8 +863,6 @@ static inline int power_supply_set_property(struct power_supply *psy,
 			    const union power_supply_propval *val)
 { return 0; }
 #endif
-extern int power_supply_property_is_writeable(struct power_supply *psy,
-					enum power_supply_property psp);
 extern void power_supply_external_power_changed(struct power_supply *psy);
 
 extern struct power_supply *__must_check

-- 
2.46.2


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 3/4] power: supply: core: mark attribute arrays as ro_after_init
  2024-10-05 10:06 [PATCH 0/4] power: supply: core: random cleanups and optimizations Thomas Weißschuh
  2024-10-05 10:06 ` [PATCH 1/4] power: supply: core: use device mutex wrappers Thomas Weißschuh
  2024-10-05 10:06 ` [PATCH 2/4] power: supply: core: unexport power_supply_property_is_writeable() Thomas Weißschuh
@ 2024-10-05 10:06 ` Thomas Weißschuh
  2024-10-05 10:06 ` [PATCH 4/4] power: supply: hwmon: move interface to private header Thomas Weißschuh
  2024-10-16 21:41 ` (subset) [PATCH 0/4] power: supply: core: random cleanups and optimizations Sebastian Reichel
  4 siblings, 0 replies; 8+ messages in thread
From: Thomas Weißschuh @ 2024-10-05 10:06 UTC (permalink / raw)
  To: Sebastian Reichel; +Cc: linux-pm, linux-kernel, Thomas Weißschuh

The attribute arrays are only modified during the __init phase.
To protect them against intentional or accidental modification,
mark them as __ro_after_init.

To make sure no modifications are introduced, also mark the return
values of the accessors as const.

Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
---
 drivers/power/supply/power_supply.h       |  2 +-
 drivers/power/supply/power_supply_sysfs.c | 12 ++++++------
 2 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/drivers/power/supply/power_supply.h b/drivers/power/supply/power_supply.h
index 1bc57615ba68fb33e5b77f720e454dbba6daa291..4c558fb3db7211a610134960292790ea3584b363 100644
--- a/drivers/power/supply/power_supply.h
+++ b/drivers/power/supply/power_supply.h
@@ -18,7 +18,7 @@ extern int power_supply_property_is_writeable(struct power_supply *psy,
 
 #ifdef CONFIG_SYSFS
 
-extern void power_supply_init_attrs(void);
+extern void __init power_supply_init_attrs(void);
 extern int power_supply_uevent(const struct device *dev, struct kobj_uevent_env *env);
 extern const struct attribute_group *power_supply_attr_groups[];
 
diff --git a/drivers/power/supply/power_supply_sysfs.c b/drivers/power/supply/power_supply_sysfs.c
index 16b3c5880cd8ce14cd7c697b11fcf5449b65c2d6..571de43fcca9827cf0fe3023e453defbf1eaec7d 100644
--- a/drivers/power/supply/power_supply_sysfs.c
+++ b/drivers/power/supply/power_supply_sysfs.c
@@ -142,7 +142,7 @@ static const char * const POWER_SUPPLY_CHARGE_BEHAVIOUR_TEXT[] = {
 	[POWER_SUPPLY_CHARGE_BEHAVIOUR_FORCE_DISCHARGE]	= "force-discharge",
 };
 
-static struct power_supply_attr power_supply_attrs[] = {
+static struct power_supply_attr power_supply_attrs[] __ro_after_init = {
 	/* Properties of type `int' */
 	POWER_SUPPLY_ENUM_ATTR(STATUS),
 	POWER_SUPPLY_ENUM_ATTR(CHARGE_TYPE),
@@ -225,9 +225,9 @@ static struct power_supply_attr power_supply_attrs[] = {
 #define POWER_SUPPLY_ATTR_CNT ARRAY_SIZE(power_supply_attrs)
 
 static struct attribute *
-__power_supply_attrs[POWER_SUPPLY_ATTR_CNT + 1];
+__power_supply_attrs[POWER_SUPPLY_ATTR_CNT + 1] __ro_after_init;
 
-static struct power_supply_attr *to_ps_attr(struct device_attribute *attr)
+static const struct power_supply_attr *to_ps_attr(struct device_attribute *attr)
 {
 	return container_of(attr, struct power_supply_attr, dev_attr);
 }
@@ -273,7 +273,7 @@ static ssize_t power_supply_show_property(struct device *dev,
 					  char *buf) {
 	ssize_t ret;
 	struct power_supply *psy = dev_get_drvdata(dev);
-	struct power_supply_attr *ps_attr = to_ps_attr(attr);
+	const struct power_supply_attr *ps_attr = to_ps_attr(attr);
 	enum power_supply_property psp = dev_attr_psp(attr);
 	union power_supply_propval value;
 
@@ -326,7 +326,7 @@ static ssize_t power_supply_store_property(struct device *dev,
 					   const char *buf, size_t count) {
 	ssize_t ret;
 	struct power_supply *psy = dev_get_drvdata(dev);
-	struct power_supply_attr *ps_attr = to_ps_attr(attr);
+	const struct power_supply_attr *ps_attr = to_ps_attr(attr);
 	enum power_supply_property psp = dev_attr_psp(attr);
 	union power_supply_propval value;
 
@@ -401,7 +401,7 @@ const struct attribute_group *power_supply_attr_groups[] = {
 	NULL
 };
 
-void power_supply_init_attrs(void)
+void __init power_supply_init_attrs(void)
 {
 	int i;
 

-- 
2.46.2


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 4/4] power: supply: hwmon: move interface to private header
  2024-10-05 10:06 [PATCH 0/4] power: supply: core: random cleanups and optimizations Thomas Weißschuh
                   ` (2 preceding siblings ...)
  2024-10-05 10:06 ` [PATCH 3/4] power: supply: core: mark attribute arrays as ro_after_init Thomas Weißschuh
@ 2024-10-05 10:06 ` Thomas Weißschuh
  2024-10-05 23:39   ` kernel test robot
  2024-10-07 13:19   ` kernel test robot
  2024-10-16 21:41 ` (subset) [PATCH 0/4] power: supply: core: random cleanups and optimizations Sebastian Reichel
  4 siblings, 2 replies; 8+ messages in thread
From: Thomas Weißschuh @ 2024-10-05 10:06 UTC (permalink / raw)
  To: Sebastian Reichel; +Cc: linux-pm, linux-kernel, Thomas Weißschuh

The interface of power_supply_hwmon.c is only meant to be used by the
psy core. Remove it from the public header file and use the private one
instead.

Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
---
 drivers/power/supply/power_supply.h       | 17 +++++++++++++++++
 drivers/power/supply/power_supply_hwmon.c |  2 ++
 include/linux/power_supply.h              | 13 -------------
 3 files changed, 19 insertions(+), 13 deletions(-)

diff --git a/drivers/power/supply/power_supply.h b/drivers/power/supply/power_supply.h
index 4c558fb3db7211a610134960292790ea3584b363..7434a6f2477504ee6c0a3c7420e1444387b41180 100644
--- a/drivers/power/supply/power_supply.h
+++ b/drivers/power/supply/power_supply.h
@@ -44,3 +44,20 @@ static inline int power_supply_create_triggers(struct power_supply *psy)
 static inline void power_supply_remove_triggers(struct power_supply *psy) {}
 
 #endif /* CONFIG_LEDS_TRIGGERS */
+
+#ifdef CONFIG_POWER_SUPPLY_HWMON
+
+int power_supply_add_hwmon_sysfs(struct power_supply *psy);
+void power_supply_remove_hwmon_sysfs(struct power_supply *psy);
+
+#else
+
+static inline int power_supply_add_hwmon_sysfs(struct power_supply *psy)
+{
+	return 0;
+}
+
+static inline
+void power_supply_remove_hwmon_sysfs(struct power_supply *psy) {}
+
+#endif /* CONFIG_POWER_SUPPLY_HWMON */
diff --git a/drivers/power/supply/power_supply_hwmon.c b/drivers/power/supply/power_supply_hwmon.c
index 01be04903d7d2465ae2acb9eeb0b55a87868bb87..9b30175ba9aefb0ebc0fbe73fdd158fcefc3bdda 100644
--- a/drivers/power/supply/power_supply_hwmon.c
+++ b/drivers/power/supply/power_supply_hwmon.c
@@ -9,6 +9,8 @@
 #include <linux/slab.h>
 #include "power_supply.h"
 
+#include "power_supply.h"
+
 struct power_supply_hwmon {
 	struct power_supply *psy;
 	unsigned long *props;
diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h
index ea0ba149f296644bd18717d91f338172602eb6d6..58264343fb8a1590d02ec18a2d7fe9d874e3bc31 100644
--- a/include/linux/power_supply.h
+++ b/include/linux/power_supply.h
@@ -943,19 +943,6 @@ static inline bool power_supply_is_watt_property(enum power_supply_property psp)
 	return false;
 }
 
-#ifdef CONFIG_POWER_SUPPLY_HWMON
-int power_supply_add_hwmon_sysfs(struct power_supply *psy);
-void power_supply_remove_hwmon_sysfs(struct power_supply *psy);
-#else
-static inline int power_supply_add_hwmon_sysfs(struct power_supply *psy)
-{
-	return 0;
-}
-
-static inline
-void power_supply_remove_hwmon_sysfs(struct power_supply *psy) {}
-#endif
-
 #ifdef CONFIG_SYSFS
 ssize_t power_supply_charge_behaviour_show(struct device *dev,
 					   unsigned int available_behaviours,

-- 
2.46.2


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH 4/4] power: supply: hwmon: move interface to private header
  2024-10-05 10:06 ` [PATCH 4/4] power: supply: hwmon: move interface to private header Thomas Weißschuh
@ 2024-10-05 23:39   ` kernel test robot
  2024-10-07 13:19   ` kernel test robot
  1 sibling, 0 replies; 8+ messages in thread
From: kernel test robot @ 2024-10-05 23:39 UTC (permalink / raw)
  To: Thomas Weißschuh, Sebastian Reichel
  Cc: oe-kbuild-all, linux-pm, linux-kernel, Thomas Weißschuh

Hi Thomas,

kernel test robot noticed the following build warnings:

[auto build test WARNING on 27cc6fdf720183dce1dbd293483ec5a9cb6b595e]

url:    https://github.com/intel-lab-lkp/linux/commits/Thomas-Wei-schuh/power-supply-core-use-device-mutex-wrappers/20241005-181114
base:   27cc6fdf720183dce1dbd293483ec5a9cb6b595e
patch link:    https://lore.kernel.org/r/20241005-power-supply-cleanups-v1-4-45303b2d0a4d%40weissschuh.net
patch subject: [PATCH 4/4] power: supply: hwmon: move interface to private header
compiler: clang version 18.1.8 (https://github.com/llvm/llvm-project 3b5b5c1ec4a3095ab096dd780e84d7ab81f3d7ff)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202410060751.fvcDrsTY-lkp@intel.com/

includecheck warnings: (new ones prefixed by >>)
>> drivers/power/supply/power_supply_hwmon.c: power_supply.h is included more than once.

vim +3 drivers/power/supply/power_supply_hwmon.c

   > 3	 *  power_supply_hwmon.c - power supply hwmon support.
     4	 */
     5	
     6	#include <linux/err.h>
     7	#include <linux/hwmon.h>
   > 8	#include <linux/power_supply.h>
     9	#include <linux/slab.h>
  > 10	#include "power_supply.h"
    11	
  > 12	#include "power_supply.h"
    13	
  > 14	struct power_supply_hwmon {
    15		struct power_supply *psy;
    16		unsigned long *props;
    17	};
    18	
    19	static const char *const ps_temp_label[] = {
    20		"temp",
    21		"ambient temp",
    22	};
    23	
  > 24	static int power_supply_hwmon_in_to_property(u32 attr)
    25	{
    26		switch (attr) {
    27		case hwmon_in_average:
    28			return POWER_SUPPLY_PROP_VOLTAGE_AVG;
    29		case hwmon_in_min:
    30			return POWER_SUPPLY_PROP_VOLTAGE_MIN;
    31		case hwmon_in_max:
    32			return POWER_SUPPLY_PROP_VOLTAGE_MAX;
    33		case hwmon_in_input:
    34			return POWER_SUPPLY_PROP_VOLTAGE_NOW;
    35		default:
    36			return -EINVAL;
    37		}
    38	}
    39	
  > 40	static int power_supply_hwmon_curr_to_property(u32 attr)
    41	{
    42		switch (attr) {
    43		case hwmon_curr_average:
    44			return POWER_SUPPLY_PROP_CURRENT_AVG;
    45		case hwmon_curr_max:
    46			return POWER_SUPPLY_PROP_CURRENT_MAX;
    47		case hwmon_curr_input:
    48			return POWER_SUPPLY_PROP_CURRENT_NOW;
    49		default:
    50			return -EINVAL;
    51		}
    52	}
    53	
  > 54	static int power_supply_hwmon_power_to_property(u32 attr)
    55	{
    56		switch (attr) {
    57		case hwmon_power_input:
    58			return POWER_SUPPLY_PROP_POWER_NOW;
    59		case hwmon_power_average:
    60			return POWER_SUPPLY_PROP_POWER_AVG;
    61		default:
    62			return -EINVAL;
    63		}
    64	}
    65	
  > 66	static int power_supply_hwmon_temp_to_property(u32 attr, int channel)
    67	{
    68		if (channel) {
    69			switch (attr) {
    70			case hwmon_temp_input:
    71				return POWER_SUPPLY_PROP_TEMP_AMBIENT;
    72			case hwmon_temp_min_alarm:
    73				return POWER_SUPPLY_PROP_TEMP_AMBIENT_ALERT_MIN;
    74			case hwmon_temp_max_alarm:
    75				return POWER_SUPPLY_PROP_TEMP_AMBIENT_ALERT_MAX;
    76			default:
    77				break;
    78			}
    79		} else {
    80			switch (attr) {
    81			case hwmon_temp_input:
    82				return POWER_SUPPLY_PROP_TEMP;
    83			case hwmon_temp_max:
    84				return POWER_SUPPLY_PROP_TEMP_MAX;
    85			case hwmon_temp_min:
    86				return POWER_SUPPLY_PROP_TEMP_MIN;
    87			case hwmon_temp_min_alarm:
    88				return POWER_SUPPLY_PROP_TEMP_ALERT_MIN;
    89			case hwmon_temp_max_alarm:
    90				return POWER_SUPPLY_PROP_TEMP_ALERT_MAX;
    91			default:
    92				break;
    93			}
    94		}
    95	
    96		return -EINVAL;
    97	}
    98	
    99	static int
 > 100	power_supply_hwmon_to_property(enum hwmon_sensor_types type,
   101				       u32 attr, int channel)
   102	{
   103		switch (type) {
   104		case hwmon_in:
 > 105			return power_supply_hwmon_in_to_property(attr);
   106		case hwmon_curr:
 > 107			return power_supply_hwmon_curr_to_property(attr);
   108		case hwmon_power:
 > 109			return power_supply_hwmon_power_to_property(attr);
   110		case hwmon_temp:
 > 111			return power_supply_hwmon_temp_to_property(attr, channel);
   112		default:
   113			return -EINVAL;
   114		}
   115	}
   116	
 > 117	static bool power_supply_hwmon_is_a_label(enum hwmon_sensor_types type,
   118						   u32 attr)
   119	{
   120		return type == hwmon_temp && attr == hwmon_temp_label;
   121	}
   122	
   123	struct hwmon_type_attr_list {
   124		const u32 *attrs;
   125		size_t n_attrs;
   126	};
   127	
   128	static const u32 ps_temp_attrs[] = {
   129		hwmon_temp_input,
   130		hwmon_temp_min, hwmon_temp_max,
   131		hwmon_temp_min_alarm, hwmon_temp_max_alarm,
   132	};
   133	
   134	static const struct hwmon_type_attr_list ps_type_attrs[hwmon_max] = {
   135		[hwmon_temp] = { ps_temp_attrs, ARRAY_SIZE(ps_temp_attrs) },
   136	};
   137	
 > 138	static bool power_supply_hwmon_has_input(
 > 139		const struct power_supply_hwmon *psyhw,
   140		enum hwmon_sensor_types type, int channel)
   141	{
   142		const struct hwmon_type_attr_list *attr_list = &ps_type_attrs[type];
   143		size_t i;
   144	
   145		for (i = 0; i < attr_list->n_attrs; ++i) {
 > 146			int prop = power_supply_hwmon_to_property(type,
   147				attr_list->attrs[i], channel);
   148	
   149			if (prop >= 0 && test_bit(prop, psyhw->props))
   150				return true;
   151		}
   152	
   153		return false;
   154	}
   155	
 > 156	static bool power_supply_hwmon_is_writable(enum hwmon_sensor_types type,
   157						   u32 attr)
   158	{
   159		switch (type) {
   160		case hwmon_in:
   161			return attr == hwmon_in_min ||
   162			       attr == hwmon_in_max;
   163		case hwmon_curr:
   164			return attr == hwmon_curr_max;
   165		case hwmon_temp:
   166			return attr == hwmon_temp_max ||
   167			       attr == hwmon_temp_min ||
   168			       attr == hwmon_temp_min_alarm ||
   169			       attr == hwmon_temp_max_alarm;
   170		default:
   171			return false;
   172		}
   173	}
   174	
 > 175	static umode_t power_supply_hwmon_is_visible(const void *data,
   176						     enum hwmon_sensor_types type,
   177						     u32 attr, int channel)
   178	{
 > 179		const struct power_supply_hwmon *psyhw = data;
   180		int prop;
   181	
 > 182		if (power_supply_hwmon_is_a_label(type, attr)) {
 > 183			if (power_supply_hwmon_has_input(psyhw, type, channel))
   184				return 0444;
   185			else
   186				return 0;
   187		}
   188	
 > 189		prop = power_supply_hwmon_to_property(type, attr, channel);
   190		if (prop < 0 || !test_bit(prop, psyhw->props))
   191			return 0;
   192	
   193		if (power_supply_property_is_writeable(psyhw->psy, prop) > 0 &&
 > 194		    power_supply_hwmon_is_writable(type, attr))
   195			return 0644;
   196	
   197		return 0444;
   198	}
   199	
 > 200	static int power_supply_hwmon_read_string(struct device *dev,
   201						  enum hwmon_sensor_types type,
   202						  u32 attr, int channel,
   203						  const char **str)
   204	{
   205		switch (type) {
   206		case hwmon_temp:
   207			*str = ps_temp_label[channel];
   208			break;
   209		default:
   210			/* unreachable, but see:
   211			 * gcc bug #51513 [1] and clang bug #978 [2]
   212			 *
   213			 * [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51513
   214			 * [2] https://github.com/ClangBuiltLinux/linux/issues/978
   215			 */
   216			break;
   217		}
   218	
   219		return 0;
   220	}
   221	
   222	static int
 > 223	power_supply_hwmon_read(struct device *dev, enum hwmon_sensor_types type,
   224				u32 attr, int channel, long *val)
   225	{
 > 226		struct power_supply_hwmon *psyhw = dev_get_drvdata(dev);
   227		struct power_supply *psy = psyhw->psy;
   228		union power_supply_propval pspval;
   229		int ret, prop;
   230	
 > 231		prop = power_supply_hwmon_to_property(type, attr, channel);
   232		if (prop < 0)
   233			return prop;
   234	
   235		ret  = power_supply_get_property(psy, prop, &pspval);
   236		if (ret)
   237			return ret;
   238	
   239		switch (type) {
   240		/*
   241		 * Both voltage and current is reported in units of
   242		 * microvolts/microamps, so we need to adjust it to
   243		 * milliamps(volts)
   244		 */
   245		case hwmon_curr:
   246		case hwmon_in:
   247			pspval.intval = DIV_ROUND_CLOSEST(pspval.intval, 1000);
   248			break;
   249		case hwmon_power:
   250			/*
   251			 * Power properties are already in microwatts.
   252			 */
   253			break;
   254		/*
   255		 * Temp needs to be converted from 1/10 C to milli-C
   256		 */
   257		case hwmon_temp:
   258			if (check_mul_overflow(pspval.intval, 100,
   259					       &pspval.intval))
   260				return -EOVERFLOW;
   261			break;
   262		default:
   263			return -EINVAL;
   264		}
   265	
   266		*val = pspval.intval;
   267	
   268		return 0;
   269	}
   270	
   271	static int
 > 272	power_supply_hwmon_write(struct device *dev, enum hwmon_sensor_types type,
   273				 u32 attr, int channel, long val)
   274	{
 > 275		struct power_supply_hwmon *psyhw = dev_get_drvdata(dev);
   276		struct power_supply *psy = psyhw->psy;
   277		union power_supply_propval pspval;
   278		int prop;
   279	
 > 280		prop = power_supply_hwmon_to_property(type, attr, channel);
   281		if (prop < 0)
   282			return prop;
   283	
   284		pspval.intval = val;
   285	
   286		switch (type) {
   287		/*
   288		 * Both voltage and current is reported in units of
   289		 * microvolts/microamps, so we need to adjust it to
   290		 * milliamps(volts)
   291		 */
   292		case hwmon_curr:
   293		case hwmon_in:
   294			if (check_mul_overflow(pspval.intval, 1000,
   295					       &pspval.intval))
   296				return -EOVERFLOW;
   297			break;
   298		/*
   299		 * Temp needs to be converted from 1/10 C to milli-C
   300		 */
   301		case hwmon_temp:
   302			pspval.intval = DIV_ROUND_CLOSEST(pspval.intval, 100);
   303			break;
   304		default:
   305			return -EINVAL;
   306		}
   307	
   308		return power_supply_set_property(psy, prop, &pspval);
   309	}
   310	
 > 311	static const struct hwmon_ops power_supply_hwmon_ops = {
 > 312		.is_visible	= power_supply_hwmon_is_visible,
 > 313		.read		= power_supply_hwmon_read,
 > 314		.write		= power_supply_hwmon_write,
 > 315		.read_string	= power_supply_hwmon_read_string,
   316	};
   317	
 > 318	static const struct hwmon_channel_info * const power_supply_hwmon_info[] = {
   319		HWMON_CHANNEL_INFO(temp,
   320				   HWMON_T_LABEL     |
   321				   HWMON_T_INPUT     |
   322				   HWMON_T_MAX       |
   323				   HWMON_T_MIN       |
   324				   HWMON_T_MIN_ALARM |
   325				   HWMON_T_MAX_ALARM,
   326	
   327				   HWMON_T_LABEL     |
   328				   HWMON_T_INPUT     |
   329				   HWMON_T_MIN_ALARM |
   330				   HWMON_T_MAX_ALARM),
   331	
   332		HWMON_CHANNEL_INFO(curr,
   333				   HWMON_C_AVERAGE |
   334				   HWMON_C_MAX     |
   335				   HWMON_C_INPUT),
   336	
   337		HWMON_CHANNEL_INFO(power,
   338				   HWMON_P_INPUT |
   339				   HWMON_P_AVERAGE),
   340	
   341		HWMON_CHANNEL_INFO(in,
   342				   HWMON_I_AVERAGE |
   343				   HWMON_I_MIN     |
   344				   HWMON_I_MAX     |
   345				   HWMON_I_INPUT),
   346		NULL
   347	};
   348	
 > 349	static const struct hwmon_chip_info power_supply_hwmon_chip_info = {
 > 350		.ops = &power_supply_hwmon_ops,
 > 351		.info = power_supply_hwmon_info,
   352	};
   353	
   354	int power_supply_add_hwmon_sysfs(struct power_supply *psy)
   355	{
   356		const struct power_supply_desc *desc = psy->desc;
 > 357		struct power_supply_hwmon *psyhw;
   358		struct device *dev = &psy->dev;
   359		struct device *hwmon;
   360		int ret, i;
   361		const char *name;
   362	
   363		if (!devres_open_group(dev, power_supply_add_hwmon_sysfs,
   364				       GFP_KERNEL))
   365			return -ENOMEM;
   366	
   367		psyhw = devm_kzalloc(dev, sizeof(*psyhw), GFP_KERNEL);
   368		if (!psyhw) {
   369			ret = -ENOMEM;
   370			goto error;
   371		}
   372	
   373		psyhw->psy = psy;
   374		psyhw->props = devm_bitmap_zalloc(dev,
   375						  POWER_SUPPLY_PROP_TIME_TO_FULL_AVG + 1,
   376						  GFP_KERNEL);
   377		if (!psyhw->props) {
   378			ret = -ENOMEM;
   379			goto error;
   380		}
   381	
   382		for (i = 0; i < desc->num_properties; i++) {
   383			const enum power_supply_property prop = desc->properties[i];
   384	
   385			switch (prop) {
   386			case POWER_SUPPLY_PROP_CURRENT_AVG:
   387			case POWER_SUPPLY_PROP_CURRENT_MAX:
   388			case POWER_SUPPLY_PROP_CURRENT_NOW:
   389			case POWER_SUPPLY_PROP_POWER_AVG:
   390			case POWER_SUPPLY_PROP_POWER_NOW:
   391			case POWER_SUPPLY_PROP_TEMP:
   392			case POWER_SUPPLY_PROP_TEMP_MAX:
   393			case POWER_SUPPLY_PROP_TEMP_MIN:
   394			case POWER_SUPPLY_PROP_TEMP_ALERT_MIN:
   395			case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
   396			case POWER_SUPPLY_PROP_TEMP_AMBIENT:
   397			case POWER_SUPPLY_PROP_TEMP_AMBIENT_ALERT_MIN:
   398			case POWER_SUPPLY_PROP_TEMP_AMBIENT_ALERT_MAX:
   399			case POWER_SUPPLY_PROP_VOLTAGE_AVG:
   400			case POWER_SUPPLY_PROP_VOLTAGE_MIN:
   401			case POWER_SUPPLY_PROP_VOLTAGE_MAX:
   402			case POWER_SUPPLY_PROP_VOLTAGE_NOW:
   403				set_bit(prop, psyhw->props);
   404				break;
   405			default:
   406				break;
   407			}
   408		}
   409	
   410		name = psy->desc->name;
   411		if (strchr(name, '-')) {
   412			char *new_name;
   413	
   414			new_name = devm_kstrdup(dev, name, GFP_KERNEL);
   415			if (!new_name) {
   416				ret = -ENOMEM;
   417				goto error;
   418			}
   419			strreplace(new_name, '-', '_');
   420			name = new_name;
   421		}
   422		hwmon = devm_hwmon_device_register_with_info(dev, name,
   423							psyhw,
 > 424							&power_supply_hwmon_chip_info,
   425							NULL);
   426		ret = PTR_ERR_OR_ZERO(hwmon);
   427		if (ret)
   428			goto error;
   429	
   430		devres_close_group(dev, power_supply_add_hwmon_sysfs);
   431		return 0;
   432	error:
   433		devres_release_group(dev, NULL);
   434		return ret;
   435	}
   436	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 4/4] power: supply: hwmon: move interface to private header
  2024-10-05 10:06 ` [PATCH 4/4] power: supply: hwmon: move interface to private header Thomas Weißschuh
  2024-10-05 23:39   ` kernel test robot
@ 2024-10-07 13:19   ` kernel test robot
  1 sibling, 0 replies; 8+ messages in thread
From: kernel test robot @ 2024-10-07 13:19 UTC (permalink / raw)
  To: Thomas Weißschuh, Sebastian Reichel
  Cc: llvm, oe-kbuild-all, linux-pm, linux-kernel,
	Thomas Weißschuh

Hi Thomas,

kernel test robot noticed the following build errors:

[auto build test ERROR on 27cc6fdf720183dce1dbd293483ec5a9cb6b595e]

url:    https://github.com/intel-lab-lkp/linux/commits/Thomas-Wei-schuh/power-supply-core-use-device-mutex-wrappers/20241005-181114
base:   27cc6fdf720183dce1dbd293483ec5a9cb6b595e
patch link:    https://lore.kernel.org/r/20241005-power-supply-cleanups-v1-4-45303b2d0a4d%40weissschuh.net
patch subject: [PATCH 4/4] power: supply: hwmon: move interface to private header
config: x86_64-randconfig-003-20241007 (https://download.01.org/0day-ci/archive/20241007/202410072120.3jlD28CJ-lkp@intel.com/config)
compiler: clang version 18.1.8 (https://github.com/llvm/llvm-project 3b5b5c1ec4a3095ab096dd780e84d7ab81f3d7ff)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241007/202410072120.3jlD28CJ-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202410072120.3jlD28CJ-lkp@intel.com/

All errors (new ones prefixed by >>):

   In file included from drivers/power/supply/power_supply_hwmon.c:12:
>> drivers/power/supply/power_supply.h:41:20: error: redefinition of 'power_supply_update_leds'
      41 | static inline void power_supply_update_leds(struct power_supply *psy) {}
         |                    ^
   drivers/power/supply/power_supply.h:41:20: note: previous definition is here
      41 | static inline void power_supply_update_leds(struct power_supply *psy) {}
         |                    ^
   In file included from drivers/power/supply/power_supply_hwmon.c:12:
>> drivers/power/supply/power_supply.h:42:19: error: redefinition of 'power_supply_create_triggers'
      42 | static inline int power_supply_create_triggers(struct power_supply *psy)
         |                   ^
   drivers/power/supply/power_supply.h:42:19: note: previous definition is here
      42 | static inline int power_supply_create_triggers(struct power_supply *psy)
         |                   ^
   In file included from drivers/power/supply/power_supply_hwmon.c:12:
>> drivers/power/supply/power_supply.h:44:20: error: redefinition of 'power_supply_remove_triggers'
      44 | static inline void power_supply_remove_triggers(struct power_supply *psy) {}
         |                    ^
   drivers/power/supply/power_supply.h:44:20: note: previous definition is here
      44 | static inline void power_supply_remove_triggers(struct power_supply *psy) {}
         |                    ^
   3 errors generated.


vim +/power_supply_update_leds +41 drivers/power/supply/power_supply.h

4a11b59d828366 drivers/power/power_supply.h Anton Vorontsov 2007-05-04  40  
4a11b59d828366 drivers/power/power_supply.h Anton Vorontsov 2007-05-04 @41  static inline void power_supply_update_leds(struct power_supply *psy) {}
4a11b59d828366 drivers/power/power_supply.h Anton Vorontsov 2007-05-04 @42  static inline int power_supply_create_triggers(struct power_supply *psy)
4a11b59d828366 drivers/power/power_supply.h Anton Vorontsov 2007-05-04  43  { return 0; }
4a11b59d828366 drivers/power/power_supply.h Anton Vorontsov 2007-05-04 @44  static inline void power_supply_remove_triggers(struct power_supply *psy) {}
4a11b59d828366 drivers/power/power_supply.h Anton Vorontsov 2007-05-04  45  

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: (subset) [PATCH 0/4] power: supply: core: random cleanups and optimizations
  2024-10-05 10:06 [PATCH 0/4] power: supply: core: random cleanups and optimizations Thomas Weißschuh
                   ` (3 preceding siblings ...)
  2024-10-05 10:06 ` [PATCH 4/4] power: supply: hwmon: move interface to private header Thomas Weißschuh
@ 2024-10-16 21:41 ` Sebastian Reichel
  4 siblings, 0 replies; 8+ messages in thread
From: Sebastian Reichel @ 2024-10-16 21:41 UTC (permalink / raw)
  To: Sebastian Reichel, Thomas Weißschuh; +Cc: linux-pm, linux-kernel


On Sat, 05 Oct 2024 12:06:14 +0200, Thomas Weißschuh wrote:
> Some independent cleanups and optimizations.
> 
> 

Applied, thanks!

[1/4] power: supply: core: use device mutex wrappers
      commit: bd3ee57b9d4c58edbf6f7bba071f6e508c7ff1c6
[2/4] power: supply: core: unexport power_supply_property_is_writeable()
      commit: cf70da29c4993bf23df68b67a82dfa3da8234e75
[3/4] power: supply: core: mark attribute arrays as ro_after_init
      commit: 3120b5f218ca8e2b375d496e2ff3f4f861fbc013

Best regards,
-- 
Sebastian Reichel <sebastian.reichel@collabora.com>


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2024-10-16 21:41 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-10-05 10:06 [PATCH 0/4] power: supply: core: random cleanups and optimizations Thomas Weißschuh
2024-10-05 10:06 ` [PATCH 1/4] power: supply: core: use device mutex wrappers Thomas Weißschuh
2024-10-05 10:06 ` [PATCH 2/4] power: supply: core: unexport power_supply_property_is_writeable() Thomas Weißschuh
2024-10-05 10:06 ` [PATCH 3/4] power: supply: core: mark attribute arrays as ro_after_init Thomas Weißschuh
2024-10-05 10:06 ` [PATCH 4/4] power: supply: hwmon: move interface to private header Thomas Weißschuh
2024-10-05 23:39   ` kernel test robot
2024-10-07 13:19   ` kernel test robot
2024-10-16 21:41 ` (subset) [PATCH 0/4] power: supply: core: random cleanups and optimizations Sebastian Reichel

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).