All pastes #10154 Raw Edit

Someone

public text v1 · immutable
#10154 ·published 2005-04-23 21:15 UTC
rendered paste body
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 <<s)) 0x%02x",byte);
                        }
                }
                l -= 8 - s;
                value >>= (8 - s);
                s = 0;
        }
}