[PATCH 2/2] pinmux: add a driver for the U300 pinmux

Linus Walleij linus.walleij at linaro.org
Fri Aug 19 08:10:41 EDT 2011


On Thu, Jul 14, 2011 at 5:40 AM, Barry Song <21cnbao at gmail.com> wrote:

>> +static const struct u300_pmx_func u300_pmx_funcs[] = {
>> +       {
>> +               .name = "uart0",
>> +               .pins = uart0_pins,
>> +               .num_pins = ARRAY_SIZE(uart0_pins),
>> +               .mask = uart0_mask,
>
> if we build a register address/bit shift/value table for every pinmux
> selection, sometimes we even need to write multiple registers for only
> one selection, for example:
>
> spi0:
> {
> REG      SHIFT   VALUE
> {REG1,    1,         5},
> {REG2,    3,         2},
> }
>
> we might let the whole enable/disable have common codes in the pinmux
> core but not implemented by every drivers.
> Common Enable:
> for (i = 0; i < MASK_NUM; i++)
> {
>     writel(mask[i].reg, readl(mask[i].reg) | mask[i].val << mask[i].shift);
> }
>
> Common Disable:
> for (i = 0; i < MASK_NUM; i++)
> {
>     writel(mask[i].reg, readl(mask[i].reg) & ~(mask[i].val << mask[i].shift));
> }

OK that problem is not unique to the pinmux subsystem though,
I can think of drivers/gpio/ and drivers/mfd/ etc etc plus platforms
having this need.

> ASoC really define some good macros about register layout for audio
> path, audio volume and son on, so every driver doesn't need to write
> so many details about hardware. they just use those macros to define
> register layout.

Can they be made generic so that *any* subsystem can use them?

> If we have common enable/disable for pinmux, every pinmux driver will
> only need to fill the table. Actually,  engineers just want to check
> the datasheet to figure out the table. And they don't want to repeat
> the enable/disable codes for every possible selection of pinmux.

Not all pinmuxes are the same, and not all are memory-mapped
either. Some are on the other end of an I2C, some (like U300)
need to read and write more than one register to do a specific
pin muxing. In the gpio-nomadik driver there is a special horror
about these registers also, one that cannot be solved easily with
a function like that. So it'd have to be optional.

It's a separate subject I think, no problem to do such things any day
on any subsystem.

Else we'll define and refactor what we need as we go along...

Thanks,
Linus Walleij



More information about the linux-arm-kernel mailing list