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

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
...@@ -124,6 +124,7 @@ MODULE_DEVICE_TABLE(pci, xonar_ids); ...@@ -124,6 +124,7 @@ MODULE_DEVICE_TABLE(pci, xonar_ids);
#define GPIO_DX_FRONT_PANEL 0x0002 #define GPIO_DX_FRONT_PANEL 0x0002
#define GPIO_DX_INPUT_ROUTE 0x0100 #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_CS4398 0x9e /* 10011, AD1=1, AD0=1, /W=0 */
#define I2C_DEVICE_CS4362A 0x30 /* 001100, AD0=0, /W=0 */ #define I2C_DEVICE_CS4362A 0x30 /* 001100, AD0=0, /W=0 */
...@@ -142,8 +143,8 @@ struct xonar_data { ...@@ -142,8 +143,8 @@ struct xonar_data {
static void xonar_gpio_changed(struct oxygen *chip); 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) u8 reg, u8 value)
{ {
/* maps ALSA channel pair number to SPI output */ /* maps ALSA channel pair number to SPI output */
static const u8 codec_map[4] = { static const u8 codec_map[4] = {
...@@ -157,6 +158,22 @@ static void pcm1796_write(struct oxygen *chip, unsigned int codec, ...@@ -157,6 +158,22 @@ static void pcm1796_write(struct oxygen *chip, unsigned int codec,
(reg << 8) | value); (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) static void cs4398_write(struct oxygen *chip, u8 reg, u8 value)
{ {
oxygen_write_i2c(chip, I2C_DEVICE_CS4398, reg, value); oxygen_write_i2c(chip, I2C_DEVICE_CS4398, reg, value);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment