[alsa-devel] RFC: reworking ASOC for large registers
Jon Smirl
jonsmirl at gmail.com
Mon Jul 21 14:51:23 CEST 2008
On 7/21/08, Mark Brown <broonie at opensource.wolfsonmicro.com> wrote:
> On Sun, Jul 20, 2008 at 09:47:04PM -0400, Jon Smirl wrote:
>
> > How about making them work on an array of bytes?
> > unsigned int read(struct snd_soc_codec *codec, unsigned int reg, u8 *value);
> > int write(struct snd_soc_codec *codec, unsigned int reg, u8* value);
>
>
> This looks like a reasonable way of handling large registers. We'd need
> to have a look at the effect on driver code - the main concern would be
> the effect on drivers for chips with more normally sized registers.
> Currently they can just call their register access functions with
> immediate values and it'd be a usability problem if they lost that
> ability.
I just noticed, the hw read/write routines are already an array of bytes.
typedef int (*hw_write_t)(void *,const char* ,int);
typedef int (*hw_read_t)(void *,char* ,int);
>
> I think it's most likely that the best way forward would be to have both
> interfaces in parallel and let drivers use either (or a mix) rather than
> having the only interface be the large register one.
>
>
> > If read is sucessful, it returns the number of bytes read. Reading a
> > non-existent register returns -ENODEV, or you can get other errors
> > like -EIO when the IO fails.
>
>
> You also need to pass in the size of the buffer being supplied by the
> caller.
>
>
> > Instead of u8 I've been using a union in my internal code. We can come
> > up with better names for the members.
>
> > typedef struct {
> > union {
> > u16 s16;
> > u8 byte[32];
>
>
> There's a scalability issue here...
>
>
> > After the low level is changed, the ASOC core needs to be updated to
> > allow 16 bit shifts and masks up to 64 bits.
>
>
> We should be able support 15 bit masks with a small rearrangement of the
> existing stuff.
>
--
Jon Smirl
jonsmirl at gmail.com
More information about the Alsa-devel
mailing list