Re: [PATCH 1/3] gpio: regmap: Support registers with more than one bit per GPIO

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Am 2022-07-03 13:10, schrieb Aidan MacDonald:
Some devices use a multi-bit register field to change the GPIO
input/output direction. Add the ->reg_field_xlate() callback to
support such devices in gpio-regmap.

->reg_field_xlate() builds on ->reg_mask_xlate() by allowing the
driver to return a mask and values to describe a register field.
gpio-regmap will use the mask to isolate the field and compare or
update it using the values to implement GPIO level and direction
get and set ops.

Thanks for working on this. Here are my thoughts on how to improve
it:
 - I'm wary on the value translation of the set and get, you
   don't need that at the moment, correct? I'd concentrate on
   the direction for now.
 - I'd add a xlate_direction(), see below for an example
 - because we can then handle the value too, we don't need the
   invert handling in the {set,get}_direction. drop it there
   and handle it in a simple_xlat. In gpio_regmap,
   store "reg_dir_base" and "invert_direction", derived from
   config->reg_dir_in_base and config->reg_dir_out_base.

static int gpio_regmap_simple_xlat_direction(struct gpio_regmap *gpio
                                             unsigend int base,
                                             unsigned int offset,
                                             unsigned int *dir_out,
                                             unsigned int *dir_in)
{
    unsigned int line = offset % gpio->ngpio_per_reg;
    unsigned int mask = BIT(line);

    if (!gpio->invert_direction) {
        *dir_out = mask;
        *dir_in = 0;
    } else {
        *dir_out = 0;
        *dir_in = mask;
    }

    return 0;
}

And in the {set,get}_direction() you can then check both
values and convert it from or to GPIO_LINE_DIRECTION_{OUT,IN}.

Thoughts?

-michael



[Index of Archives]     [Linux SPI]     [Linux Kernel]     [Linux ARM (vger)]     [Linux ARM MSM]     [Linux Omap]     [Linux Arm]     [Linux Tegra]     [Fedora ARM]     [Linux for Samsung SOC]     [eCos]     [Linux Fastboot]     [Gcc Help]     [Git]     [DCCP]     [IETF Announce]     [Security]     [Linux MIPS]     [Yosemite Campsites]

  Powered by Linux