static int snd_cs8427_send_corudata(struct snd_i2c_device *device, int udata, unsigned char *ndata, int count) { struct cs8427 *chip = device->private_data; char *hw_data = udata ? chip->playback.hw_udata : chip->playback.hw_status; char data[32]; int err, idx; if (!memcmp(hw_data, ndata, count)) return 0; if ((err = snd_cs8427_select_corudata(device, udata)) < 0) return err; memcpy(hw_data, ndata, count); if (udata) { memset(data, 0, sizeof(data)); if (memcmp(hw_data, data, count) == 0) { chip->regmap[CS8427_REG_UDATABUF] &= ~CS8427_UBMMASK; chip->regmap[CS8427_REG_UDATABUF] |= CS8427_UBMZEROS | CS8427_EFTUI; err = snd_cs8427_reg_write(device, CS8427_REG_UDATABUF, chip->regmap[CS8427_REG_UDATABUF]); return err < 0 ? err : 0; } } data[0] = CS8427_REG_AUTOINC | CS8427_REG_CORU_DATABUF; for (idx = 0; idx < count; idx++) data[idx + 1] = bitrev8(ndata[idx]); if (snd_i2c_sendbytes(device, data, count + 1) != count + 1) return -EIO; return 1; }
static int snd_cs8427_send_corudata(struct cs8427 *obj, int udata, unsigned char *ndata, int count) { struct cs8427 *chip = obj; char *hw_data = udata ? chip->playback.hw_udata : chip->playback.hw_status; char data[32]; int err, idx; unsigned char addr = 0; int ret = 0; if (!memcmp(hw_data, ndata, count)) return 0; err = snd_cs8427_select_corudata(chip, udata); if (err < 0) return err; memcpy(hw_data, ndata, count); if (udata) { memset(data, 0, sizeof(data)); if (count > sizeof(data)) { count = sizeof(data); } if (memcmp(hw_data, data, count) == 0) { chip->regmap[CS8427_REG_UDATABUF] &= ~CS8427_UBMMASK; chip->regmap[CS8427_REG_UDATABUF] |= CS8427_UBMZEROS | CS8427_EFTUI; err = cs8427_i2c_write(chip, CS8427_REG_UDATABUF, 1, &chip->regmap[CS8427_REG_UDATABUF]); return err < 0 ? err : 0; } } idx = 0; memcpy(data, ndata, CHANNEL_STATUS_SIZE); addr = 0x20; ret = cs8427_i2c_sendbytes(chip, &addr, data, count); if (ret != count) return -EIO; return 1; }