rendered paste bodystatic void write_setting(struct i2c_client *client, u16 setting,
u32 value)
{
u16 addr = CX25840_REGISTER_ADDRESS(CX25840_SETTING_REGISTER_INDEX(setting));
int s = CX25840_SETTING_START_BIT(setting);
int l = CX25840_SETTING_BIT_LENGTH(setting);
u8 byte, mask, bytein;
DEBUG(1,"WRITE SETTING 0x%03x value 0x%04x length %d start %d",addr,value,l,s);
while (l > 0) {
mask = (0xff >> (8 - (l > 8 ? 8 : l))) << s;
DEBUG(1,"MASK: %02x",mask);
bytein = cx25840_read(client, addr);
byte = bytein & ~mask;
byte |= (mask & (value << s));
if (bytein!=byte) {
cx25840_write(client, addr++, byte);
udelay(100);
if(byte!=cx25840_read(client, addr-1)) {
DEBUG(1," WRITE SETTING - addr 0x%03x value 0x%02x DID NOT STICK!",addr-1,byte)
bytein = cx25840_read(client, addr-1);
DEBUG(1," WRITE SETTING - bytein 0x%02x",bytein);
byte = bytein & ~mask;
DEBUG(1," WRITE SETTING - bytein & ~mask 0x%02x",byte);
byte |= (mask & (value << s));
DEBUG(1," WRITE SETTING - mask & (value <<s)) 0x%02x",byte);
}
}
l -= 8 - s;
value >>= (8 - s);
s = 0;
}
}