Re: [PATCH v2 10/16] gpio: add a reusable generic gpio_chip using regmap

From: Michael Walle
Date: Tue Apr 14 2020 - 15:58:06 EST


Hi Mark, Hi Bartosz, Hi Linus,

Am 2020-04-14 20:41, schrieb Michael Walle:
Am 2020-04-14 19:00, schrieb Bartosz Golaszewski:
wt., 14 kwi 2020 o 12:07 Michael Walle <michael@xxxxxxxx> napisaÅ(a):
>>
>> So the best from a user perspective I've could come up with was:
>>
>> ->base_reg = GPIO_REGMAP_ADDR(addr);
>>
>> I'm open for suggestions.
>>
>
> Maybe setting the pointer to ERR_PTR(-ENOENT) which will result in
> IS_ERR() returning true?

Unfortunatly, its not a pointer, but only a regular unsigned int (ie
the type the regmap API has for its "reg" property). It could be a
pointer of course but then the user would have to allocate additional
memory.

-michael


Eek, of course it's not a pointer. If possible I'd like to avoid this
GPIO_REGMAP_ADDR() macro, so how about having some separate field for
invalid offsets making every offset 'valid' by default?

IMHO this has the same problems as mentioned in the response to Mark's
idea. Normally, the user sets only some addresses, thus he has to mark
all other as invalid. And if you add another address, you have to touch
all the drivers to mark it as invalid.

We could add some force bits like the "use_ack" flag in the bgpio driver,
where you can force the use of the value 0. But I'd really like to find
a better way..

So what about the following:

#define GPIO_REGMAP_ADDR_ZERO (unsigned int)(-1)

So this way the user might assign the base addresses the normal way
except when he wants to use zero, in that case he has to use

->base_adr = GPIO_REGMAP_ADDR_ZERO;

gpio-regmap.c could use then:

if (base_addr)
something_useful(gpio_regmap_addr(base_addr));

unsigned int gpio_regmap_addr(unsigned int addr)
{
return (addr == GPIO_REGMAP_ADDR_ZERO) ? 0 : addr;
}

-michael