Commit c1f7375a authored by Jelle van der Waa's avatar Jelle van der Waa Committed by Sebastian Reichel
Browse files

power: supply: support charge_types in extensions



Similar to charge_behaviour, charge_types is an enum option where
reading the property shows the supported values, with the active value
surrounded by brackets. To be able to use it with a power_supply
extension a bitmask with the supported charge_Types values has to be
added to power_supply_ext.

Signed-off-by: default avatarJelle van der Waa <jvanderwaa@redhat.com>
Reviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
Link: https://lore.kernel.org/r/20250414131840.382756-2-jvanderwaa@redhat.com


Signed-off-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
parent 11741b8e
Loading
Loading
Loading
Loading
+22 −1
Original line number Diff line number Diff line
@@ -321,6 +321,27 @@ static ssize_t power_supply_show_charge_behaviour(struct device *dev,
						  value->intval, buf);
}

static ssize_t power_supply_show_charge_types(struct device *dev,
					      struct power_supply *psy,
					      enum power_supply_charge_type current_type,
					      char *buf)
{
	struct power_supply_ext_registration *reg;

	scoped_guard(rwsem_read, &psy->extensions_sem) {
		power_supply_for_each_extension(reg, psy) {
			if (power_supply_ext_has_property(reg->ext,
							  POWER_SUPPLY_PROP_CHARGE_TYPES))
				return power_supply_charge_types_show(dev,
						reg->ext->charge_types,
						current_type, buf);
		}
	}

	return power_supply_charge_types_show(dev, psy->desc->charge_types,
						  current_type, buf);
}

static ssize_t power_supply_format_property(struct device *dev,
					    bool uevent,
					    struct device_attribute *attr,
@@ -365,7 +386,7 @@ static ssize_t power_supply_format_property(struct device *dev,
	case POWER_SUPPLY_PROP_CHARGE_TYPES:
		if (uevent) /* no possible values in uevents */
			goto default_format;
		ret = power_supply_charge_types_show(dev, psy->desc->charge_types,
		ret = power_supply_show_charge_types(dev, psy,
						     value.intval, buf);
		break;
	case POWER_SUPPLY_PROP_MODEL_NAME ... POWER_SUPPLY_PROP_SERIAL_NUMBER:
+18 −2
Original line number Diff line number Diff line
@@ -37,6 +37,8 @@ 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 enum power_supply_charge_type battery_charge_types =
	POWER_SUPPLY_CHARGE_TYPE_STANDARD;
static bool battery_extension;

static bool module_initialized;
@@ -87,7 +89,7 @@ static int test_power_get_battery_property(struct power_supply *psy,
		val->intval = battery_status;
		break;
	case POWER_SUPPLY_PROP_CHARGE_TYPE:
		val->intval = POWER_SUPPLY_CHARGE_TYPE_FAST;
		val->intval = battery_charge_types;
		break;
	case POWER_SUPPLY_PROP_HEALTH:
		val->intval = battery_health;
@@ -129,6 +131,9 @@ static int test_power_get_battery_property(struct power_supply *psy,
	case POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR:
		val->intval = battery_charge_behaviour;
		break;
	case POWER_SUPPLY_PROP_CHARGE_TYPES:
		val->intval = battery_charge_types;
		break;
	default:
		pr_info("%s: some properties deliberately report errors.\n",
			__func__);
@@ -140,7 +145,7 @@ static int test_power_get_battery_property(struct power_supply *psy,
static int test_power_battery_property_is_writeable(struct power_supply *psy,
						    enum power_supply_property psp)
{
	return psp == POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR;
	return psp == POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR || psp == POWER_SUPPLY_PROP_CHARGE_TYPES;
}

static int test_power_set_battery_property(struct power_supply *psy,
@@ -156,6 +161,14 @@ static int test_power_set_battery_property(struct power_supply *psy,
		}
		battery_charge_behaviour = val->intval;
		break;
	case POWER_SUPPLY_PROP_CHARGE_TYPES:
		if (val->intval < 0 ||
		    val->intval >= BITS_PER_TYPE(typeof(psy->desc->charge_types)) ||
		    !(BIT(val->intval) & psy->desc->charge_types)) {
			return -EINVAL;
		}
		battery_charge_types = val->intval;
		break;
	default:
		return -EINVAL;
	}
@@ -188,6 +201,7 @@ static enum power_supply_property test_power_battery_props[] = {
	POWER_SUPPLY_PROP_CURRENT_AVG,
	POWER_SUPPLY_PROP_CURRENT_NOW,
	POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR,
	POWER_SUPPLY_PROP_CHARGE_TYPES,
};

static char *test_power_ac_supplied_to[] = {
@@ -215,6 +229,8 @@ static const struct power_supply_desc test_power_desc[] = {
		.charge_behaviours = BIT(POWER_SUPPLY_CHARGE_BEHAVIOUR_AUTO)
				   | BIT(POWER_SUPPLY_CHARGE_BEHAVIOUR_INHIBIT_CHARGE)
				   | BIT(POWER_SUPPLY_CHARGE_BEHAVIOUR_FORCE_DISCHARGE),
		.charge_types = BIT(POWER_SUPPLY_CHARGE_TYPE_STANDARD)
				   | BIT(POWER_SUPPLY_CHARGE_TYPE_LONGLIFE)
	},
	[TEST_USB] = {
		.name = "test_usb",
+1 −0
Original line number Diff line number Diff line
@@ -288,6 +288,7 @@ struct power_supply_desc {
struct power_supply_ext {
	const char *const name;
	u8 charge_behaviours;
	u32 charge_types;
	const enum power_supply_property *properties;
	size_t num_properties;