]> www.infradead.org Git - users/willy/xarray.git/commitdiff
power: supply: test-power: implement a power supply extension
authorThomas Weißschuh <linux@weissschuh.net>
Wed, 11 Dec 2024 19:57:56 +0000 (20:57 +0100)
committerSebastian Reichel <sebastian.reichel@collabora.com>
Sat, 14 Dec 2024 03:22:05 +0000 (04:22 +0100)
Allow easy testing of the new power supply extension functionality.

Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
Link: https://lore.kernel.org/r/20241211-power-supply-extensions-v6-2-9d9dc3f3d387@weissschuh.net
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
drivers/power/supply/test_power.c

index 442ceb7795e1d84e34da2801d228d53fb67e08d9..66f9ef52e0f3e6e6e6bebcfd438c2acd421284ec 100644 (file)
@@ -37,6 +37,7 @@ static int battery_charge_counter     = -1000;
 static int battery_current             = -1600;
 static enum power_supply_charge_behaviour battery_charge_behaviour =
        POWER_SUPPLY_CHARGE_BEHAVIOUR_AUTO;
+static bool battery_extension;
 
 static bool module_initialized;
 
@@ -238,6 +239,85 @@ static const struct power_supply_config test_power_configs[] = {
        },
 };
 
+static int test_power_battery_extmanufacture_year = 1234;
+static int test_power_battery_exttemp_max = 1000;
+static const enum power_supply_property test_power_battery_extprops[] = {
+       POWER_SUPPLY_PROP_MANUFACTURE_YEAR,
+       POWER_SUPPLY_PROP_TEMP_MAX,
+};
+
+static int test_power_battery_extget_property(struct power_supply *psy,
+                                             const struct power_supply_ext *ext,
+                                             void *ext_data,
+                                             enum power_supply_property psp,
+                                             union power_supply_propval *val)
+{
+       switch (psp) {
+       case POWER_SUPPLY_PROP_MANUFACTURE_YEAR:
+               val->intval = test_power_battery_extmanufacture_year;
+               break;
+       case POWER_SUPPLY_PROP_TEMP_MAX:
+               val->intval = test_power_battery_exttemp_max;
+               break;
+       default:
+               return -EINVAL;
+       }
+       return 0;
+}
+
+static int test_power_battery_extset_property(struct power_supply *psy,
+                                             const struct power_supply_ext *ext,
+                                             void *ext_data,
+                                             enum power_supply_property psp,
+                                             const union power_supply_propval *val)
+{
+       switch (psp) {
+       case POWER_SUPPLY_PROP_MANUFACTURE_YEAR:
+               test_power_battery_extmanufacture_year = val->intval;
+               break;
+       case POWER_SUPPLY_PROP_TEMP_MAX:
+               test_power_battery_exttemp_max = val->intval;
+               break;
+       default:
+               return -EINVAL;
+       }
+       return 0;
+}
+
+static int test_power_battery_extproperty_is_writeable(struct power_supply *psy,
+                                                      const struct power_supply_ext *ext,
+                                                      void *ext_data,
+                                                      enum power_supply_property psp)
+{
+       return true;
+}
+
+static const struct power_supply_ext test_power_battery_ext = {
+       .properties             = test_power_battery_extprops,
+       .num_properties         = ARRAY_SIZE(test_power_battery_extprops),
+       .get_property           = test_power_battery_extget_property,
+       .set_property           = test_power_battery_extset_property,
+       .property_is_writeable  = test_power_battery_extproperty_is_writeable,
+};
+
+static void test_power_configure_battery_extension(bool enable)
+{
+       struct power_supply *psy;
+
+       psy = test_power_supplies[TEST_BATTERY];
+
+       if (enable) {
+               if (power_supply_register_extension(psy, &test_power_battery_ext, NULL)) {
+                       pr_err("registering battery extension failed\n");
+                       return;
+               }
+       } else {
+               power_supply_unregister_extension(psy, &test_power_battery_ext);
+       }
+
+       battery_extension = enable;
+}
+
 static int __init test_power_init(void)
 {
        int i;
@@ -258,6 +338,8 @@ static int __init test_power_init(void)
                }
        }
 
+       test_power_configure_battery_extension(true);
+
        module_initialized = true;
        return 0;
 failed:
@@ -524,6 +606,26 @@ static int param_set_battery_current(const char *key,
 
 #define param_get_battery_current param_get_int
 
+static int param_set_battery_extension(const char *key,
+                                      const struct kernel_param *kp)
+{
+       bool prev_battery_extension;
+       int ret;
+
+       prev_battery_extension = battery_extension;
+
+       ret = param_set_bool(key, kp);
+       if (ret)
+               return ret;
+
+       if (prev_battery_extension != battery_extension)
+               test_power_configure_battery_extension(battery_extension);
+
+       return 0;
+}
+
+#define param_get_battery_extension param_get_bool
+
 static const struct kernel_param_ops param_ops_ac_online = {
        .set = param_set_ac_online,
        .get = param_get_ac_online,
@@ -574,6 +676,11 @@ static const struct kernel_param_ops param_ops_battery_current = {
        .get = param_get_battery_current,
 };
 
+static const struct kernel_param_ops param_ops_battery_extension = {
+       .set = param_set_battery_extension,
+       .get = param_get_battery_extension,
+};
+
 #define param_check_ac_online(name, p) __param_check(name, p, void);
 #define param_check_usb_online(name, p) __param_check(name, p, void);
 #define param_check_battery_status(name, p) __param_check(name, p, void);
@@ -584,6 +691,7 @@ static const struct kernel_param_ops param_ops_battery_current = {
 #define param_check_battery_voltage(name, p) __param_check(name, p, void);
 #define param_check_battery_charge_counter(name, p) __param_check(name, p, void);
 #define param_check_battery_current(name, p) __param_check(name, p, void);
+#define param_check_battery_extension(name, p) __param_check(name, p, void);
 
 
 module_param(ac_online, ac_online, 0644);
@@ -621,6 +729,9 @@ MODULE_PARM_DESC(battery_charge_counter,
 module_param(battery_current, battery_current, 0644);
 MODULE_PARM_DESC(battery_current, "battery current (milliampere)");
 
+module_param(battery_extension, battery_extension, 0644);
+MODULE_PARM_DESC(battery_extension, "battery extension");
+
 MODULE_DESCRIPTION("Power supply driver for testing");
 MODULE_AUTHOR("Anton Vorontsov <cbouatmailru@gmail.com>");
 MODULE_LICENSE("GPL");