static int aic32x4_write(struct snd_soc_codec *codec, unsigned int reg, unsigned int val) { struct aic32x4_priv *aic32x4 = snd_soc_codec_get_drvdata(codec); unsigned int page = reg / 128; unsigned int fixed_reg = reg % 128; u8 data[2]; int ret; /* A write to AIC32X4_PSEL is really a non-explicit page change */ if (reg == AIC32X4_PSEL) return aic32x4_change_page(codec, val); if (aic32x4->page_no != page) { ret = aic32x4_change_page(codec, page); if (ret != 0) return ret; } data[0] = fixed_reg & 0xff; data[1] = val & 0xff; if (codec->hw_write(codec->control_data, data, 2) == 2) return 0; else return -EIO; }
static unsigned int aic32x4_read(struct snd_soc_codec *codec, unsigned int reg) { struct aic32x4_priv *aic32x4 = snd_soc_codec_get_drvdata(codec); unsigned int page = reg / 128; unsigned int fixed_reg = reg % 128; int ret; u8 buffer; if (aic32x4->page_no != page) { ret = aic32x4_change_page(codec, page); if (ret != 0) return ret; } if (aic32x4->control_type == SND_SOC_SPI) { buffer = (fixed_reg<<1) | 0x01; ret = spi_write_then_read(codec->control_data, &buffer, 1, &buffer, 1); if (ret) { dev_err(codec->dev, "AIC32x4 reg read error\n"); return -EIO; } return (unsigned int)buffer; } else return i2c_smbus_read_byte_data(codec->control_data, fixed_reg & 0xff); }
static unsigned int aic32x4_read(struct snd_soc_codec *codec, unsigned int reg) { struct aic32x4_priv *aic32x4 = snd_soc_codec_get_drvdata(codec); unsigned int page = reg / 128; unsigned int fixed_reg = reg % 128; int ret; if (aic32x4->page_no != page) { ret = aic32x4_change_page(codec, page); if (ret != 0) return ret; } return i2c_smbus_read_byte_data(codec->control_data, fixed_reg & 0xff); }