Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9239ebcf authored by Andrey Gelman's avatar Andrey Gelman Committed by Anton Vorontsov
Browse files

test_power: Fix a bug in setting module parameter values



When the kernel loads a module, module params are processed prior to
calling module_init. As a result, setting module param value should not
have side effects, at least as long as the module has not been
initialized.

Signed-off-by: default avatarAndrey Gelman <andreyg@compulab.co.il>
Signed-off-by: default avatarAnton Vorontsov <anton@enomsg.org>
parent 6f8da5df
Loading
Loading
Loading
Loading
+21 −10
Original line number Diff line number Diff line
@@ -30,6 +30,8 @@ static int battery_technology = POWER_SUPPLY_TECHNOLOGY_LION;
static int battery_capacity		= 50;
static int battery_voltage		= 3300;

static bool module_initialized;

static int test_power_get_ac_property(struct power_supply *psy,
				      enum power_supply_property psp,
				      union power_supply_propval *val)
@@ -185,6 +187,7 @@ static int __init test_power_init(void)
		}
	}

	module_initialized = true;
	return 0;
failed:
	while (--i >= 0)
@@ -209,6 +212,8 @@ static void __exit test_power_exit(void)

	for (i = 0; i < ARRAY_SIZE(test_power_supplies); i++)
		power_supply_unregister(&test_power_supplies[i]);

	module_initialized = false;
}
module_exit(test_power_exit);

@@ -221,8 +226,8 @@ struct battery_property_map {
};

static struct battery_property_map map_ac_online[] = {
	{ 0,  "on"  },
	{ 1,  "off" },
	{ 0,  "off"  },
	{ 1,  "on" },
	{ -1, NULL  },
};

@@ -295,10 +300,16 @@ static const char *map_get_key(struct battery_property_map *map, int value,
	return def_key;
}

static inline void signal_power_supply_changed(struct power_supply *psy)
{
	if (module_initialized)
		power_supply_changed(psy);
}

static int param_set_ac_online(const char *key, const struct kernel_param *kp)
{
	ac_online = map_get_value(map_ac_online, key, ac_online);
	power_supply_changed(&test_power_supplies[0]);
	signal_power_supply_changed(&test_power_supplies[0]);
	return 0;
}

@@ -311,7 +322,7 @@ static int param_get_ac_online(char *buffer, const struct kernel_param *kp)
static int param_set_usb_online(const char *key, const struct kernel_param *kp)
{
	usb_online = map_get_value(map_ac_online, key, usb_online);
	power_supply_changed(&test_power_supplies[2]);
	signal_power_supply_changed(&test_power_supplies[2]);
	return 0;
}

@@ -325,7 +336,7 @@ static int param_set_battery_status(const char *key,
					const struct kernel_param *kp)
{
	battery_status = map_get_value(map_status, key, battery_status);
	power_supply_changed(&test_power_supplies[1]);
	signal_power_supply_changed(&test_power_supplies[1]);
	return 0;
}

@@ -339,7 +350,7 @@ static int param_set_battery_health(const char *key,
					const struct kernel_param *kp)
{
	battery_health = map_get_value(map_health, key, battery_health);
	power_supply_changed(&test_power_supplies[1]);
	signal_power_supply_changed(&test_power_supplies[1]);
	return 0;
}

@@ -353,7 +364,7 @@ static int param_set_battery_present(const char *key,
					const struct kernel_param *kp)
{
	battery_present = map_get_value(map_present, key, battery_present);
	power_supply_changed(&test_power_supplies[0]);
	signal_power_supply_changed(&test_power_supplies[0]);
	return 0;
}

@@ -369,7 +380,7 @@ static int param_set_battery_technology(const char *key,
{
	battery_technology = map_get_value(map_technology, key,
						battery_technology);
	power_supply_changed(&test_power_supplies[1]);
	signal_power_supply_changed(&test_power_supplies[1]);
	return 0;
}

@@ -390,7 +401,7 @@ static int param_set_battery_capacity(const char *key,
		return -EINVAL;

	battery_capacity = tmp;
	power_supply_changed(&test_power_supplies[1]);
	signal_power_supply_changed(&test_power_supplies[1]);
	return 0;
}

@@ -405,7 +416,7 @@ static int param_set_battery_voltage(const char *key,
		return -EINVAL;

	battery_voltage = tmp;
	power_supply_changed(&test_power_supplies[1]);
	signal_power_supply_changed(&test_power_supplies[1]);
	return 0;
}