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

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

On Thu, Jul 14, 2011 at 5:40 AM, Barry Song <21cnbao@xxxxxxxxx> 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:
> {
> {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...

Linus Walleij

linux-arm-kernel mailing list

[Linux ARM (vger)]     [Linux ARM MSM]     [Linux Omap]     [Linux Arm]     [Linux Tegra]     [Fedora ARM]     [eCos]     [Linux Fastboot]     [Gcc Help]     [Git]     [DCCP]     [IETF Announce]     [Security]     [PDAs]     [Linux]     [Linux MIPS]     [Yosemite Campsites]     [Photos]

Add to Google Follow linuxarm on Twitter