Hi,

On Fri, Apr 24, 2020 at 11:35:32AM -0600, Mathew King wrote:
> Reduce the number of touch points to add a new enum property to the
> power_supply class by mapping the array of text values to the device
> attribute descriptor. A new enum property can now added by creating an
> array with the text values named POWER_SUPPLY_${PROPNAME}_TEXT and
> adding POWER_SUPPLY_ENUM_ATTR(${PROPNAME}) to the power_supply_attrs
> array.
> 
> Signed-off-by: Mathew King <math...@chromium.org>
> ---

nice cleanup :)

Reviewed-by: Sebastian Reichel <sebastian.reic...@collabora.com>

-- Sebastian

>  drivers/power/supply/power_supply_sysfs.c | 122 +++++++++-------------
>  1 file changed, 49 insertions(+), 73 deletions(-)
> 
> diff --git a/drivers/power/supply/power_supply_sysfs.c 
> b/drivers/power/supply/power_supply_sysfs.c
> index 328107589770..fbb05466b9a5 100644
> --- a/drivers/power/supply/power_supply_sysfs.c
> +++ b/drivers/power/supply/power_supply_sysfs.c
> @@ -26,15 +26,25 @@ struct power_supply_attr {
>       const char *upper_name;
>       const char *lower_name;
>       struct device_attribute dev_attr;
> +     const char * const *text_values;
> +     int text_values_len;
>  };
>  
> -#define POWER_SUPPLY_ATTR(_name)     \
> -[POWER_SUPPLY_PROP_ ## _name] =              \
> -{                                    \
> -     .prop_name = #_name             \
> +#define _POWER_SUPPLY_ATTR(_name, _text, _len)       \
> +[POWER_SUPPLY_PROP_ ## _name] =                      \
> +{                                            \
> +     .prop_name = #_name,                    \
> +     .text_values = _text,                   \
> +     .text_values_len = _len,                \
>  }
>  
> -static const char * const power_supply_type_text[] = {
> +#define POWER_SUPPLY_ATTR(_name) _POWER_SUPPLY_ATTR(_name, NULL, 0)
> +#define _POWER_SUPPLY_ENUM_ATTR(_name, _text)        \
> +     _POWER_SUPPLY_ATTR(_name, _text, ARRAY_SIZE(_text))
> +#define POWER_SUPPLY_ENUM_ATTR(_name)        \
> +     _POWER_SUPPLY_ENUM_ATTR(_name, POWER_SUPPLY_ ## _name ## _TEXT)
> +
> +static const char * const POWER_SUPPLY_TYPE_TEXT[] = {
>       [POWER_SUPPLY_TYPE_UNKNOWN]             = "Unknown",
>       [POWER_SUPPLY_TYPE_BATTERY]             = "Battery",
>       [POWER_SUPPLY_TYPE_UPS]                 = "UPS",
> @@ -62,7 +72,7 @@ static const char * const POWER_SUPPLY_USB_TYPE_TEXT[] = {
>       [POWER_SUPPLY_USB_TYPE_APPLE_BRICK_ID]  = "BrickID",
>  };
>  
> -static const char * const power_supply_status_text[] = {
> +static const char * const POWER_SUPPLY_STATUS_TEXT[] = {
>       [POWER_SUPPLY_STATUS_UNKNOWN]           = "Unknown",
>       [POWER_SUPPLY_STATUS_CHARGING]          = "Charging",
>       [POWER_SUPPLY_STATUS_DISCHARGING]       = "Discharging",
> @@ -70,7 +80,7 @@ static const char * const power_supply_status_text[] = {
>       [POWER_SUPPLY_STATUS_FULL]              = "Full",
>  };
>  
> -static const char * const power_supply_charge_type_text[] = {
> +static const char * const POWER_SUPPLY_CHARGE_TYPE_TEXT[] = {
>       [POWER_SUPPLY_CHARGE_TYPE_UNKNOWN]      = "Unknown",
>       [POWER_SUPPLY_CHARGE_TYPE_NONE]         = "N/A",
>       [POWER_SUPPLY_CHARGE_TYPE_TRICKLE]      = "Trickle",
> @@ -80,7 +90,7 @@ static const char * const power_supply_charge_type_text[] = 
> {
>       [POWER_SUPPLY_CHARGE_TYPE_CUSTOM]       = "Custom",
>  };
>  
> -static const char * const power_supply_health_text[] = {
> +static const char * const POWER_SUPPLY_HEALTH_TEXT[] = {
>       [POWER_SUPPLY_HEALTH_UNKNOWN]               = "Unknown",
>       [POWER_SUPPLY_HEALTH_GOOD]                  = "Good",
>       [POWER_SUPPLY_HEALTH_OVERHEAT]              = "Overheat",
> @@ -93,7 +103,7 @@ static const char * const power_supply_health_text[] = {
>       [POWER_SUPPLY_HEALTH_OVERCURRENT]           = "Over current",
>  };
>  
> -static const char * const power_supply_technology_text[] = {
> +static const char * const POWER_SUPPLY_TECHNOLOGY_TEXT[] = {
>       [POWER_SUPPLY_TECHNOLOGY_UNKNOWN]       = "Unknown",
>       [POWER_SUPPLY_TECHNOLOGY_NiMH]          = "NiMH",
>       [POWER_SUPPLY_TECHNOLOGY_LION]          = "Li-ion",
> @@ -103,7 +113,7 @@ static const char * const power_supply_technology_text[] 
> = {
>       [POWER_SUPPLY_TECHNOLOGY_LiMn]          = "LiMn",
>  };
>  
> -static const char * const power_supply_capacity_level_text[] = {
> +static const char * const POWER_SUPPLY_CAPACITY_LEVEL_TEXT[] = {
>       [POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN]   = "Unknown",
>       [POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL]  = "Critical",
>       [POWER_SUPPLY_CAPACITY_LEVEL_LOW]       = "Low",
> @@ -112,7 +122,7 @@ static const char * const 
> power_supply_capacity_level_text[] = {
>       [POWER_SUPPLY_CAPACITY_LEVEL_FULL]      = "Full",
>  };
>  
> -static const char * const power_supply_scope_text[] = {
> +static const char * const POWER_SUPPLY_SCOPE_TEXT[] = {
>       [POWER_SUPPLY_SCOPE_UNKNOWN]    = "Unknown",
>       [POWER_SUPPLY_SCOPE_SYSTEM]     = "System",
>       [POWER_SUPPLY_SCOPE_DEVICE]     = "Device",
> @@ -120,13 +130,13 @@ static const char * const power_supply_scope_text[] = {
>  
>  static struct power_supply_attr power_supply_attrs[] = {
>       /* Properties of type `int' */
> -     POWER_SUPPLY_ATTR(STATUS),
> -     POWER_SUPPLY_ATTR(CHARGE_TYPE),
> -     POWER_SUPPLY_ATTR(HEALTH),
> +     POWER_SUPPLY_ENUM_ATTR(STATUS),
> +     POWER_SUPPLY_ENUM_ATTR(CHARGE_TYPE),
> +     POWER_SUPPLY_ENUM_ATTR(HEALTH),
>       POWER_SUPPLY_ATTR(PRESENT),
>       POWER_SUPPLY_ATTR(ONLINE),
>       POWER_SUPPLY_ATTR(AUTHENTIC),
> -     POWER_SUPPLY_ATTR(TECHNOLOGY),
> +     POWER_SUPPLY_ENUM_ATTR(TECHNOLOGY),
>       POWER_SUPPLY_ATTR(CYCLE_COUNT),
>       POWER_SUPPLY_ATTR(VOLTAGE_MAX),
>       POWER_SUPPLY_ATTR(VOLTAGE_MIN),
> @@ -169,7 +179,7 @@ static struct power_supply_attr power_supply_attrs[] = {
>       POWER_SUPPLY_ATTR(CAPACITY),
>       POWER_SUPPLY_ATTR(CAPACITY_ALERT_MIN),
>       POWER_SUPPLY_ATTR(CAPACITY_ALERT_MAX),
> -     POWER_SUPPLY_ATTR(CAPACITY_LEVEL),
> +     POWER_SUPPLY_ENUM_ATTR(CAPACITY_LEVEL),
>       POWER_SUPPLY_ATTR(TEMP),
>       POWER_SUPPLY_ATTR(TEMP_MAX),
>       POWER_SUPPLY_ATTR(TEMP_MIN),
> @@ -182,9 +192,9 @@ static struct power_supply_attr power_supply_attrs[] = {
>       POWER_SUPPLY_ATTR(TIME_TO_EMPTY_AVG),
>       POWER_SUPPLY_ATTR(TIME_TO_FULL_NOW),
>       POWER_SUPPLY_ATTR(TIME_TO_FULL_AVG),
> -     POWER_SUPPLY_ATTR(TYPE),
> +     POWER_SUPPLY_ENUM_ATTR(TYPE),
>       POWER_SUPPLY_ATTR(USB_TYPE),
> -     POWER_SUPPLY_ATTR(SCOPE),
> +     POWER_SUPPLY_ENUM_ATTR(SCOPE),
>       POWER_SUPPLY_ATTR(PRECHARGE_CURRENT),
>       POWER_SUPPLY_ATTR(CHARGE_TERM_CURRENT),
>       POWER_SUPPLY_ATTR(CALIBRATE),
> @@ -197,10 +207,14 @@ static struct power_supply_attr power_supply_attrs[] = {
>  static struct attribute *
>  __power_supply_attrs[ARRAY_SIZE(power_supply_attrs) + 1];
>  
> +static struct power_supply_attr *to_ps_attr(struct device_attribute *attr)
> +{
> +     return container_of(attr, struct power_supply_attr, dev_attr);
> +}
> +
>  static enum power_supply_property dev_attr_psp(struct device_attribute *attr)
>  {
> -     return container_of(attr, struct power_supply_attr, dev_attr) -
> -             power_supply_attrs;
> +     return  to_ps_attr(attr) - power_supply_attrs;
>  }
>  
>  static ssize_t power_supply_show_usb_type(struct device *dev,
> @@ -219,11 +233,11 @@ static ssize_t power_supply_show_usb_type(struct device 
> *dev,
>  
>               if (value->intval == usb_type) {
>                       count += sprintf(buf + count, "[%s] ",
> -                                      power_supply_usb_type_text[usb_type]);
> +                                      POWER_SUPPLY_USB_TYPE_TEXT[usb_type]);
>                       match = true;
>               } else {
>                       count += sprintf(buf + count, "%s ",
> -                                      power_supply_usb_type_text[usb_type]);
> +                                      POWER_SUPPLY_USB_TYPE_TEXT[usb_type]);
>               }
>       }
>  
> @@ -243,6 +257,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);
>       enum power_supply_property psp = dev_attr_psp(attr);
>       union power_supply_propval value;
>  
> @@ -263,39 +278,16 @@ static ssize_t power_supply_show_property(struct device 
> *dev,
>               }
>       }
>  
> +     if (ps_attr->text_values_len > 0 &&
> +         value.intval < ps_attr->text_values_len && value.intval >= 0) {
> +             return sprintf(buf, "%s\n", ps_attr->text_values[value.intval]);
> +     }
> +
>       switch (psp) {
> -     case POWER_SUPPLY_PROP_STATUS:
> -             ret = sprintf(buf, "%s\n",
> -                           power_supply_status_text[value.intval]);
> -             break;
> -     case POWER_SUPPLY_PROP_CHARGE_TYPE:
> -             ret = sprintf(buf, "%s\n",
> -                           power_supply_charge_type_text[value.intval]);
> -             break;
> -     case POWER_SUPPLY_PROP_HEALTH:
> -             ret = sprintf(buf, "%s\n",
> -                           power_supply_health_text[value.intval]);
> -             break;
> -     case POWER_SUPPLY_PROP_TECHNOLOGY:
> -             ret = sprintf(buf, "%s\n",
> -                           power_supply_technology_text[value.intval]);
> -             break;
> -     case POWER_SUPPLY_PROP_CAPACITY_LEVEL:
> -             ret = sprintf(buf, "%s\n",
> -                           power_supply_capacity_level_text[value.intval]);
> -             break;
> -     case POWER_SUPPLY_PROP_TYPE:
> -             ret = sprintf(buf, "%s\n",
> -                           power_supply_type_text[value.intval]);
> -             break;
>       case POWER_SUPPLY_PROP_USB_TYPE:
>               ret = power_supply_show_usb_type(dev, psy->desc->usb_types,
> -                                              psy->desc->num_usb_types,
> -                                              &value, buf);
> -             break;
> -     case POWER_SUPPLY_PROP_SCOPE:
> -             ret = sprintf(buf, "%s\n",
> -                           power_supply_scope_text[value.intval]);
> +                                             psy->desc->num_usb_types,
> +                                             &value, buf);
>               break;
>       case POWER_SUPPLY_PROP_MODEL_NAME ... POWER_SUPPLY_PROP_SERIAL_NUMBER:
>               ret = sprintf(buf, "%s\n", value.strval);
> @@ -312,30 +304,14 @@ 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);
>       enum power_supply_property psp = dev_attr_psp(attr);
>       union power_supply_propval value;
>  
> -     switch (psp) {
> -     case POWER_SUPPLY_PROP_STATUS:
> -             ret = sysfs_match_string(power_supply_status_text, buf);
> -             break;
> -     case POWER_SUPPLY_PROP_CHARGE_TYPE:
> -             ret = sysfs_match_string(power_supply_charge_type_text, buf);
> -             break;
> -     case POWER_SUPPLY_PROP_HEALTH:
> -             ret = sysfs_match_string(power_supply_health_text, buf);
> -             break;
> -     case POWER_SUPPLY_PROP_TECHNOLOGY:
> -             ret = sysfs_match_string(power_supply_technology_text, buf);
> -             break;
> -     case POWER_SUPPLY_PROP_CAPACITY_LEVEL:
> -             ret = sysfs_match_string(power_supply_capacity_level_text, buf);
> -             break;
> -     case POWER_SUPPLY_PROP_SCOPE:
> -             ret = sysfs_match_string(power_supply_scope_text, buf);
> -             break;
> -     default:
> -             ret = -EINVAL;
> +     ret = -EINVAL;
> +     if (ps_attr->text_values_len > 0) {
> +             ret = __sysfs_match_string(ps_attr->text_values,
> +                                        ps_attr->text_values_len, buf);
>       }
>  
>       /*
> -- 
> 2.26.2.303.gf8c07b1a785-goog
> 

Attachment: signature.asc
Description: PGP signature

Reply via email to