RE: [alsa-devel] [PATCH] ASoC: Add support for multi register mux

From: Songhee Baek
Date: Thu Mar 27 2014 - 14:24:35 EST


> -----Original Message-----
> From: Lars-Peter Clausen [mailto:lars@xxxxxxxxxx]
> Sent: Thursday, March 27, 2014 2:20 AM
> To: Songhee Baek
> Cc: Arun Shamanna Lakshmi; lgirdwood@xxxxxxxxx; broonie@xxxxxxxxxx;
> swarren@xxxxxxxxxxxxx; alsa-devel@xxxxxxxxxxxxxxxx; tiwai@xxxxxxx;
> linux-kernel@xxxxxxxxxxxxxxx
> Subject: Re: [alsa-devel] [PATCH] ASoC: Add support for multi register mux
>
> On 03/26/2014 11:41 PM, Songhee Baek wrote:
> >> -----Original Message-----
> >> From: Lars-Peter Clausen [mailto:lars@xxxxxxxxxx]
> >> Sent: Wednesday, March 26, 2014 12:39 PM
> >> To: Arun Shamanna Lakshmi
> >> Cc: lgirdwood@xxxxxxxxx; broonie@xxxxxxxxxx;
> swarren@xxxxxxxxxxxxx;
> >> Songhee Baek; alsa-devel@xxxxxxxxxxxxxxxx; tiwai@xxxxxxx; linux-
> >> kernel@xxxxxxxxxxxxxxx
> >> Subject: Re: [alsa-devel] [PATCH] ASoC: Add support for multi
> >> register mux
> >>
> >> On 03/26/2014 01:02 AM, Arun Shamanna Lakshmi wrote:
> >>> If the mux uses 1 bit position per input, and requires to set one
> >>> single bit at a time, then an N bit register can support up to N
> >>> inputs. In more recent Tegra chips, we have at least greater than
> >>> 64 inputs which requires at least 2 .reg fields in struct soc_enum.
> >>>
> >>> Signed-off-by: Arun Shamanna Lakshmi <aruns@xxxxxxxxxx>
> >>> Signed-off-by: Songhee Baek <sbaek@xxxxxxxxxx>
> >>
> >> The way you describe this it seems to me that a value array for this
> >> kind of mux would look like.
> >>
> >> 0x00000000, 0x00000000, 0x00000001
> >> 0x00000000, 0x00000000, 0x00000002
> >> 0x00000000, 0x00000000, 0x00000003
> >> 0x00000000, 0x00000000, 0x00000004
> >> 0x00000000, 0x00000000, 0x00000008
> >> ...
> >>
> >> That seems to be extremely tedious. If the MUX uses a one hot
> >> encoding how about storing the index of the bit in the values array
> >> and use (1 << value) when writing the value to the register?
> >
> > If we store the index of the bit, the value will be duplicated for each
> registers inputs since register has 0 to 31bits to shift, then we need to
> decode the index to interpret value for which registers to set. If we need to
> interpret the decoded value of index, it is better to have custom put/get
> function in our driver, isn't it?
> >
>
> I'm not sure I understand. If you use (val / 32) to pick the register and (val %
> 32) to pick the bit in the register this should work just fine. Maybe I'm missing
> something. Do you have a real world code example of of the this type of
> enum is used?
>

I can use val/32 and val%32 for this multi register mux.

> >>> - int reg;
> >>> + int reg[SOC_ENUM_MAX_REGS];
> >>> unsigned char shift_l;
> >>> unsigned char shift_r;
> >>> unsigned int items;
> >>> - unsigned int mask;
> >>> + unsigned int mask[SOC_ENUM_MAX_REGS];
> >>
> >> If you make mask and reg pointers instead of arrays this should be
> >> much more flexible and not be limited to 3 registers.
> >>
> >
> > To use pointers instead of arrays, it will be flexible but I need to update
> SOC_ENUM SINGLE/DOUBLE macros.
> > It will changes a lot in current soc-core.c and soc-dapm.c.
>
> In the existing macros you can do something like this:
> ...
> .reg = &(unsigned int){(xreg)},
> ...
>

Ok, I will update SINGLE/DOUBLE macro with this way.

> >
> >>> const char * const *texts;
> >>> const unsigned int *values;
> >>> + unsigned int num_regs;
> >>> };
> >>>
> >

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/