* [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).