On 7/22/08, Mark Brown broonie@opensource.wolfsonmicro.com wrote:
On Mon, Jul 21, 2008 at 07:25:21PM -0400, Jon Smirl wrote:
/* codec IO */ -#define snd_soc_read(codec, reg) codec->read(codec, reg) -#define snd_soc_write(codec, reg, value) codec->write(codec, reg, value) +#define snd_soc_read(codec, reg, value, size) codec->read(codec, reg, value, size) +#define snd_soc_write(codec, reg, value, size) codec->write(codec, reg, value, size)
I appreciate that this is just a work in progress but I did want to flag up the effect that this will have on drivers for CODECs with normally sized registers. Given that this is a fairly unusual case it doesn't seem sensible to cause drivers to have difficulties writing the equivalent of:
snd_soc_write(codec, REG_CONTROL, MAKE_IT_WORK);
if we don't have to.
There's two cases where we have a problem currently: one is with registers up to 32 bits which I think everyone agrees should Just Work and the other is much bigger registers like these 32 byte registers your CODEC has which are a bit more tricky :/ .
My new plan is to make it work on 32bit registers like it does currently, instead of 16b. I only need to use bitfield masks in the first 32bits.
Then to access the wide registers I would encode it into the register names. So if the big mixer register is at 0x40 and it is 32 bytes wide the defines would look like this.
#define MIXER_CHANNEL_0 0x0040 #define MIXER_CHANNEL_1 0x0140 #define MIXER_CHANNEL_2 0x0240 #define MIXER_CHANNEL_3 0x0340 ... #define MIXER_CHANNEL_7 0x0740
In my register access routine I know 0x0340 is not a legal register which implies that you want the fourth 32bit word from the 256bit register. The upper layers won't be the wiser.
To update a 64 bit value there are two sequential 32 bit fields. Mute the sound before updating them in pieces.
#define LOUNDNESS_LOWER 0x0090 #define LOUNDNESS_UPPER 0x0190
I can get away with updating thing in pieces since I have a 400Kb i2c channel.
This scheme works for the loop displaying all registers since printing them is implement in my driver. My code knows the length of the registers and can print the entire register.
I still need to unpack the standard control defines into a structure to get more width since the basic unit of operation is now 32 bits.
What I'm missing is a fast way to bulk load a bunch of registers. If you change equalization settings from jazz to classical I need to update 50 registers in bulk.
Once I can build again I'll do a new round, I'm still dealing with merge conflicts. My MMC driver is a total mess.