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

Commit 2923af02 authored by Lars-Peter Clausen's avatar Lars-Peter Clausen Committed by Mark Brown
Browse files

ASoC: Add ADAU1381/ADAU1781 audio CODEC support



This patch adds support for the Analog Devices ADAU1381 and ADAU1781 audio
CODECs. The device is a low-power, 24-bit stereo audio CODEC with multiple
analog inputs and outputs, two digital microphone inputs and an I2S interface.
The device can be controlled either using I2C or SPI. The main difference
between the two variants is that the ADAU1781 has a freely programmable SigmaDSP
processor, while the ADAU1381 has a fixed function wind noise reduction filter.

Signed-off-by: default avatarLars-Peter Clausen <lars@metafoo.de>
Signed-off-by: default avatarMark Brown <broonie@linaro.org>
parent dab464b6
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -87,4 +87,23 @@ struct adau1761_platform_data {
	enum adau17x1_micbias_voltage micbias_voltage;
};

/**
 * struct adau1781_platform_data - ADAU1781 Codec driver platform data
 * @left_input_differential: If true configure the left input as
 * differential input.
 * @right_input_differential: If true configure the right input as differntial
 *  input.
 * @use_dmic: If true configure the MIC pins as digital microphone pins instead
 *  of analog microphone pins.
 * @micbias_voltage: Microphone voltage bias
 */
struct adau1781_platform_data {
	bool left_input_differential;
	bool right_input_differential;

	bool use_dmic;

	enum adau17x1_micbias_voltage micbias_voltage;
};

#endif
+16 −0
Original line number Diff line number Diff line
@@ -25,6 +25,8 @@ config SND_SOC_ALL_CODECS
	select SND_SOC_ADAU1373 if I2C
	select SND_SOC_ADAU1761_I2C if I2C
	select SND_SOC_ADAU1761_SPI if SPI
	select SND_SOC_ADAU1781_I2C if I2C
	select SND_SOC_ADAU1781_SPI if SPI
	select SND_SOC_ADAV801 if SPI_MASTER
	select SND_SOC_ADAV803 if I2C
	select SND_SOC_ADAU1977_SPI if SPI_MASTER
@@ -238,6 +240,20 @@ config SND_SOC_ADAU1761_SPI
	select SND_SOC_ADAU1761
	select REGMAP_SPI

config SND_SOC_ADAU1781
	select SND_SOC_ADAU17X1
	tristate

config SND_SOC_ADAU1781_I2C
	tristate
	select SND_SOC_ADAU1781
	select REGMAP_I2C

config SND_SOC_ADAU1781_SPI
	tristate
	select SND_SOC_ADAU1781
	select REGMAP_SPI

config SND_SOC_ADAU1977
	tristate

+6 −0
Original line number Diff line number Diff line
@@ -13,6 +13,9 @@ snd-soc-adau17x1-objs := adau17x1.o
snd-soc-adau1761-objs := adau1761.o
snd-soc-adau1761-i2c-objs := adau1761-i2c.o
snd-soc-adau1761-spi-objs := adau1761-spi.o
snd-soc-adau1781-objs := adau1781.o
snd-soc-adau1781-i2c-objs := adau1781-i2c.o
snd-soc-adau1781-spi-objs := adau1781-spi.o
snd-soc-adau1977-objs := adau1977.o
snd-soc-adau1977-spi-objs := adau1977-spi.o
snd-soc-adau1977-i2c-objs := adau1977-i2c.o
@@ -166,6 +169,9 @@ obj-$(CONFIG_SND_SOC_ADAU17X1) += snd-soc-adau17x1.o
obj-$(CONFIG_SND_SOC_ADAU1761)		+= snd-soc-adau1761.o
obj-$(CONFIG_SND_SOC_ADAU1761_I2C)	+= snd-soc-adau1761-i2c.o
obj-$(CONFIG_SND_SOC_ADAU1761_SPI)	+= snd-soc-adau1761-spi.o
obj-$(CONFIG_SND_SOC_ADAU1781)		+= snd-soc-adau1781.o
obj-$(CONFIG_SND_SOC_ADAU1781_I2C)	+= snd-soc-adau1781-i2c.o
obj-$(CONFIG_SND_SOC_ADAU1781_SPI)	+= snd-soc-adau1781-spi.o
obj-$(CONFIG_SND_SOC_ADAU1977)		+= snd-soc-adau1977.o
obj-$(CONFIG_SND_SOC_ADAU1977_SPI)	+= snd-soc-adau1977-spi.o
obj-$(CONFIG_SND_SOC_ADAU1977_I2C)	+= snd-soc-adau1977-i2c.o
+58 −0
Original line number Diff line number Diff line
/*
 * Driver for ADAU1381/ADAU1781 CODEC
 *
 * Copyright 2014 Analog Devices Inc.
 *  Author: Lars-Peter Clausen <lars@metafoo.de>
 *
 * Licensed under the GPL-2.
 */

#include <linux/i2c.h>
#include <linux/mod_devicetable.h>
#include <linux/module.h>
#include <linux/regmap.h>
#include <sound/soc.h>

#include "adau1781.h"

static int adau1781_i2c_probe(struct i2c_client *client,
	const struct i2c_device_id *id)
{
	struct regmap_config config;

	config = adau1781_regmap_config;
	config.val_bits = 8;
	config.reg_bits = 16;

	return adau1781_probe(&client->dev,
		devm_regmap_init_i2c(client, &config),
		id->driver_data, NULL);
}

static int adau1781_i2c_remove(struct i2c_client *client)
{
	snd_soc_unregister_codec(&client->dev);
	return 0;
}

static const struct i2c_device_id adau1781_i2c_ids[] = {
	{ "adau1381", ADAU1381 },
	{ "adau1781", ADAU1781 },
	{ }
};
MODULE_DEVICE_TABLE(i2c, adau1781_i2c_ids);

static struct i2c_driver adau1781_i2c_driver = {
	.driver = {
		.name = "adau1781",
		.owner = THIS_MODULE,
	},
	.probe = adau1781_i2c_probe,
	.remove = adau1781_i2c_remove,
	.id_table = adau1781_i2c_ids,
};
module_i2c_driver(adau1781_i2c_driver);

MODULE_DESCRIPTION("ASoC ADAU1381/ADAU1781 CODEC I2C driver");
MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
MODULE_LICENSE("GPL");
+75 −0
Original line number Diff line number Diff line
/*
 * Driver for ADAU1381/ADAU1781 CODEC
 *
 * Copyright 2014 Analog Devices Inc.
 *  Author: Lars-Peter Clausen <lars@metafoo.de>
 *
 * Licensed under the GPL-2.
 */

#include <linux/mod_devicetable.h>
#include <linux/module.h>
#include <linux/regmap.h>
#include <linux/spi/spi.h>
#include <sound/soc.h>

#include "adau1781.h"

static void adau1781_spi_switch_mode(struct device *dev)
{
	struct spi_device *spi = to_spi_device(dev);

	/*
	 * To get the device into SPI mode CLATCH has to be pulled low three
	 * times.  Do this by issuing three dummy reads.
	 */
	spi_w8r8(spi, 0x00);
	spi_w8r8(spi, 0x00);
	spi_w8r8(spi, 0x00);
}

static int adau1781_spi_probe(struct spi_device *spi)
{
	const struct spi_device_id *id = spi_get_device_id(spi);
	struct regmap_config config;

	if (!id)
		return -EINVAL;

	config = adau1781_regmap_config;
	config.val_bits = 8;
	config.reg_bits = 24;
	config.read_flag_mask = 0x1;

	return adau1781_probe(&spi->dev,
		devm_regmap_init_spi(spi, &config),
		id->driver_data, adau1781_spi_switch_mode);
}

static int adau1781_spi_remove(struct spi_device *spi)
{
	snd_soc_unregister_codec(&spi->dev);
	return 0;
}

static const struct spi_device_id adau1781_spi_id[] = {
	{ "adau1381", ADAU1381 },
	{ "adau1781", ADAU1781 },
	{ }
};
MODULE_DEVICE_TABLE(spi, adau1781_spi_id);

static struct spi_driver adau1781_spi_driver = {
	.driver = {
		.name = "adau1781",
		.owner = THIS_MODULE,
	},
	.probe = adau1781_spi_probe,
	.remove = adau1781_spi_remove,
	.id_table = adau1781_spi_id,
};
module_spi_driver(adau1781_spi_driver);

MODULE_DESCRIPTION("ASoC ADAU1381/ADAU1781 CODEC SPI driver");
MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
MODULE_LICENSE("GPL");
Loading