/* * Write to the uda134x registers * */ static int uda134x_write(struct snd_soc_codec *codec, unsigned int reg, unsigned int value) { int ret; u8 addr; u8 data = value; struct uda134x_platform_data *pd = codec->control_data; pr_debug("%s reg: %02X, value:%02X\n", __func__, reg, value); if (reg >= UDA134X_REGS_NUM) { printk(KERN_ERR "%s unknown register: reg: %u", __func__, reg); return -EINVAL; } uda134x_write_reg_cache(codec, reg, value); switch (reg) { case UDA134X_STATUS0: case UDA134X_STATUS1: addr = UDA134X_STATUS_ADDR; break; case UDA134X_DATA000: case UDA134X_DATA001: case UDA134X_DATA010: case UDA134X_DATA011: addr = UDA134X_DATA0_ADDR; break; case UDA134X_DATA1: addr = UDA134X_DATA1_ADDR; break; default: /* It's an extended address register */ addr = (reg | UDA134X_EXTADDR_PREFIX); ret = l3_write(&pd->l3, UDA134X_DATA0_ADDR, &addr, 1); if (ret != 1) return -EIO; addr = UDA134X_DATA0_ADDR; data = (value | UDA134X_EXTDATA_PREFIX); break; } ret = l3_write(&pd->l3, addr, &data, 1); if (ret != 1) return -EIO; return 0; }
/* * Write to the uda134x registers * */ static int uda134x_regmap_write(void *context, unsigned int reg, unsigned int value) { struct uda134x_platform_data *pd = context; int ret; u8 addr; u8 data = value; switch (reg) { case UDA134X_STATUS0: case UDA134X_STATUS1: addr = UDA134X_STATUS_ADDR; data |= (reg - UDA134X_STATUS0) << 7; break; case UDA134X_DATA000: case UDA134X_DATA001: case UDA134X_DATA010: case UDA134X_DATA011: addr = UDA134X_DATA0_ADDR; data |= (reg - UDA134X_DATA000) << 6; break; case UDA134X_DATA1: addr = UDA134X_DATA1_ADDR; break; default: /* It's an extended address register */ addr = (reg | UDA134X_EXTADDR_PREFIX); ret = l3_write(&pd->l3, UDA134X_DATA0_ADDR, &addr, 1); if (ret != 1) return -EIO; addr = UDA134X_DATA0_ADDR; data = (value | UDA134X_EXTDATA_PREFIX); break; } ret = l3_write(&pd->l3, addr, &data, 1); if (ret != 1) return -EIO; return 0; }