Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4f50d2fd authored by Clemens Ladisch's avatar Clemens Ladisch
Browse files

ALSA: virtuoso: allow I2C-connected PCM1796



Add support for PCM1796 chips that are connected with an I2C bus instead
of SPI.

Signed-off-by: default avatarClemens Ladisch <clemens@ladisch.de>
parent c2bc4ff5
Loading
Loading
Loading
Loading
+19 −2
Original line number Diff line number Diff line
@@ -124,6 +124,7 @@ MODULE_DEVICE_TABLE(pci, xonar_ids);
#define GPIO_DX_FRONT_PANEL	0x0002
#define GPIO_DX_INPUT_ROUTE	0x0100

#define I2C_DEVICE_PCM1796(i)	(0x98 + ((i) << 1))	/* 10011, ADx=i, /W=0 */
#define I2C_DEVICE_CS4398	0x9e	/* 10011, AD1=1, AD0=1, /W=0 */
#define I2C_DEVICE_CS4362A	0x30	/* 001100, AD0=0, /W=0 */

@@ -142,7 +143,7 @@ struct xonar_data {

static void xonar_gpio_changed(struct oxygen *chip);

static void pcm1796_write(struct oxygen *chip, unsigned int codec,
static inline void pcm1796_write_spi(struct oxygen *chip, unsigned int codec,
				     u8 reg, u8 value)
{
	/* maps ALSA channel pair number to SPI output */
@@ -157,6 +158,22 @@ static void pcm1796_write(struct oxygen *chip, unsigned int codec,
			 (reg << 8) | value);
}

static inline void pcm1796_write_i2c(struct oxygen *chip, unsigned int codec,
				     u8 reg, u8 value)
{
	oxygen_write_i2c(chip, I2C_DEVICE_PCM1796(codec), reg, value);
}

static void pcm1796_write(struct oxygen *chip, unsigned int codec,
			  u8 reg, u8 value)
{
	if ((chip->model.function_flags & OXYGEN_FUNCTION_2WIRE_SPI_MASK) ==
	    OXYGEN_FUNCTION_SPI)
		pcm1796_write_spi(chip, codec, reg, value);
	else
		pcm1796_write_i2c(chip, codec, reg, value);
}

static void cs4398_write(struct oxygen *chip, u8 reg, u8 value)
{
	oxygen_write_i2c(chip, I2C_DEVICE_CS4398, reg, value);