On Thu, 2025-09-25 at 00:58 +0000, Coco Li wrote:
> From: Felix Wu <[email protected]>
> 
> Added 32 bits property for ASPEED GPIO. Previously it can only be access in 
> bitwise manner.
> 
> This change gives ASPEED similar behavior as Nuvoton.

I don't think this has adequately addressed my request on the prior
series:

https://lore.kernel.org/all/e244fdb5d2d889674a583df8f8b9bc4bf8d476f4.ca...@codeconstruct.com.au/

Can you please improve the commit message?

I don't have any particular concern with the implementation, other than
understanding whether it's something that's reasonable to add to begin
with. The "sets" and their indexes are somewhat an implementation
detail. Exposing them might preclude a different implementation design,
though I'm also not sure why we'd change at this point.

Andrew

> 
> Signed-off-by: Felix Wu <[email protected]>
> ---
>  hw/gpio/aspeed_gpio.c | 57 +++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 57 insertions(+)
> 
> diff --git a/hw/gpio/aspeed_gpio.c b/hw/gpio/aspeed_gpio.c
> index 609a556908..2d78bf9515 100644
> --- a/hw/gpio/aspeed_gpio.c
> +++ b/hw/gpio/aspeed_gpio.c
> @@ -1308,6 +1308,57 @@ static void aspeed_gpio_2700_write(void *opaque, 
> hwaddr offset,
>  }
>  
>  /* Setup functions */
> +static void aspeed_gpio_set_set(Object *obj, Visitor *v,
> +                                        const char *name, void *opaque,
> +                                        Error **errp)
> +{
> +    uint32_t set_val = 0;
> +    AspeedGPIOState *s = ASPEED_GPIO(obj);
> +    AspeedGPIOClass *agc = ASPEED_GPIO_GET_CLASS(s);
> +    int set_idx = 0;
> +
> +    if (!visit_type_uint32(v, name, &set_val, errp)) {
> +        return;
> +    }
> +
> +    if (sscanf(name, "gpio-set[%d]", &set_idx) != 1) {
> +        error_setg(errp, "%s: error reading %s", __func__, name);
> +        return;
> +    }
> +
> +    if (set_idx >= agc->nr_gpio_sets || set_idx < 0) {
> +        error_setg(errp, "%s: invalid set_idx %s", __func__, name);
> +        return;
> +    }
> +
> +    aspeed_gpio_update(s, &s->sets[set_idx], set_val,
> +                       ~s->sets[set_idx].direction);
> +}
> +
> +static void aspeed_gpio_get_set(Object *obj, Visitor *v,
> +                                        const char *name, void *opaque,
> +                                        Error **errp)
> +{
> +    uint32_t set_val = 0;
> +    AspeedGPIOState *s = ASPEED_GPIO(obj);
> +    AspeedGPIOClass *agc = ASPEED_GPIO_GET_CLASS(s);
> +    int set_idx = 0;
> +
> +    if (sscanf(name, "gpio-set[%d]", &set_idx) != 1) {
> +        error_setg(errp, "%s: error reading %s", __func__, name);
> +        return;
> +    }
> +
> +    if (set_idx >= agc->nr_gpio_sets || set_idx < 0) {
> +        error_setg(errp, "%s: invalid set_idx %s", __func__, name);
> +        return;
> +    }
> +
> +    set_val = s->sets[set_idx].data_value;
> +    visit_type_uint32(v, name, &set_val, errp);
> +}
> +
> +/****************** Setup functions ******************/
>  static const GPIOSetProperties ast2400_set_props[ASPEED_GPIO_MAX_NR_SETS] = {
>      [0] = {0xffffffff,  0xffffffff,  {"A", "B", "C", "D"} },
>      [1] = {0xffffffff,  0xffffffff,  {"E", "F", "G", "H"} },
> @@ -1435,6 +1486,12 @@ static void aspeed_gpio_init(Object *obj)
>              g_free(name);
>          }
>      }
> +
> +    for (int i = 0; i < agc->nr_gpio_sets; i++) {
> +        char *name = g_strdup_printf("gpio-set[%d]", i);
> +        object_property_add(obj, name, "uint32", aspeed_gpio_get_set,
> +        aspeed_gpio_set_set, NULL, NULL);
> +    }
>  }
>  
>  static const VMStateDescription vmstate_gpio_regs = {

Reply via email to