mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-11-26 19:44:21 +08:00
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: Andrey Gelman <andreyg@compulab.co.il> Signed-off-by: Anton Vorontsov <anton@enomsg.org>
This commit is contained in:
parent
6f8da5df8c
commit
9239ebcffb
@ -30,6 +30,8 @@ static int battery_technology = POWER_SUPPLY_TECHNOLOGY_LION;
|
|||||||
static int battery_capacity = 50;
|
static int battery_capacity = 50;
|
||||||
static int battery_voltage = 3300;
|
static int battery_voltage = 3300;
|
||||||
|
|
||||||
|
static bool module_initialized;
|
||||||
|
|
||||||
static int test_power_get_ac_property(struct power_supply *psy,
|
static int test_power_get_ac_property(struct power_supply *psy,
|
||||||
enum power_supply_property psp,
|
enum power_supply_property psp,
|
||||||
union power_supply_propval *val)
|
union power_supply_propval *val)
|
||||||
@ -185,6 +187,7 @@ static int __init test_power_init(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
module_initialized = true;
|
||||||
return 0;
|
return 0;
|
||||||
failed:
|
failed:
|
||||||
while (--i >= 0)
|
while (--i >= 0)
|
||||||
@ -209,6 +212,8 @@ static void __exit test_power_exit(void)
|
|||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(test_power_supplies); i++)
|
for (i = 0; i < ARRAY_SIZE(test_power_supplies); i++)
|
||||||
power_supply_unregister(&test_power_supplies[i]);
|
power_supply_unregister(&test_power_supplies[i]);
|
||||||
|
|
||||||
|
module_initialized = false;
|
||||||
}
|
}
|
||||||
module_exit(test_power_exit);
|
module_exit(test_power_exit);
|
||||||
|
|
||||||
@ -221,8 +226,8 @@ struct battery_property_map {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct battery_property_map map_ac_online[] = {
|
static struct battery_property_map map_ac_online[] = {
|
||||||
{ 0, "on" },
|
{ 0, "off" },
|
||||||
{ 1, "off" },
|
{ 1, "on" },
|
||||||
{ -1, NULL },
|
{ -1, NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -295,10 +300,16 @@ static const char *map_get_key(struct battery_property_map *map, int value,
|
|||||||
return def_key;
|
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)
|
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);
|
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;
|
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)
|
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);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -325,7 +336,7 @@ static int param_set_battery_status(const char *key,
|
|||||||
const struct kernel_param *kp)
|
const struct kernel_param *kp)
|
||||||
{
|
{
|
||||||
battery_status = map_get_value(map_status, key, battery_status);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -339,7 +350,7 @@ static int param_set_battery_health(const char *key,
|
|||||||
const struct kernel_param *kp)
|
const struct kernel_param *kp)
|
||||||
{
|
{
|
||||||
battery_health = map_get_value(map_health, key, battery_health);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -353,7 +364,7 @@ static int param_set_battery_present(const char *key,
|
|||||||
const struct kernel_param *kp)
|
const struct kernel_param *kp)
|
||||||
{
|
{
|
||||||
battery_present = map_get_value(map_present, key, battery_present);
|
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;
|
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 = map_get_value(map_technology, key,
|
||||||
battery_technology);
|
battery_technology);
|
||||||
power_supply_changed(&test_power_supplies[1]);
|
signal_power_supply_changed(&test_power_supplies[1]);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -390,7 +401,7 @@ static int param_set_battery_capacity(const char *key,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
battery_capacity = tmp;
|
battery_capacity = tmp;
|
||||||
power_supply_changed(&test_power_supplies[1]);
|
signal_power_supply_changed(&test_power_supplies[1]);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -405,7 +416,7 @@ static int param_set_battery_voltage(const char *key,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
battery_voltage = tmp;
|
battery_voltage = tmp;
|
||||||
power_supply_changed(&test_power_supplies[1]);
|
signal_power_supply_changed(&test_power_supplies[1]);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user