static 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 <>= (8 - s); s = 0; } }