[alsa-devel] [PATCH v2 0/5] Minor fixes and DT support
This set of patches fixes some minor typos and adds DT support for the adau17x1 codec drivers. I've only been able to test the 1761 part on real hardware since I don't have any adau1781 hardware at the moment.
Currently, quite a lot of options are provided through the platform_data struct, so it made sense parsing the DT and create a platform_data struct from these parameters not to break anything.
Changes since v1: - Added vendor prefix "adi," to DT properties - DT parsing moved to main probe function
Andreas Irestål (5): ASoC: adau17x1: Fix incorrect BCLK ratio definitions ASoC: adau17x1: Correct typos in file headers ASoC: adau17x1: Add adau17x1 bindings document ASoC: adau17x1: Add basic DT support for adau17x1 ASoC: adau17x1: Support platform data via DT
.../devicetree/bindings/sound/adi,adau17x1.txt | 55 +++++++++ include/dt-bindings/sound/adau17x1.h | 14 +++ include/linux/platform_data/adau17x1.h | 2 +- sound/soc/codecs/adau1761-i2c.c | 14 ++- sound/soc/codecs/adau1761-spi.c | 14 ++- sound/soc/codecs/adau1761.c | 129 ++++++++++++++++++++- sound/soc/codecs/adau1781-i2c.c | 10 ++ sound/soc/codecs/adau1781-spi.c | 10 ++ sound/soc/codecs/adau1781.c | 50 +++++++- sound/soc/codecs/adau17x1.h | 6 +- 10 files changed, 296 insertions(+), 8 deletions(-) create mode 100644 Documentation/devicetree/bindings/sound/adi,adau17x1.txt create mode 100644 include/dt-bindings/sound/adau17x1.h
Signed-off-by: Andreas Irestål andire@axis.com --- sound/soc/codecs/adau17x1.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/sound/soc/codecs/adau17x1.h b/sound/soc/codecs/adau17x1.h index e13583e..5ae87a0 100644 --- a/sound/soc/codecs/adau17x1.h +++ b/sound/soc/codecs/adau17x1.h @@ -103,9 +103,9 @@ bool adau17x1_has_dsp(struct adau *adau); #define ADAU17X1_CLOCK_CONTROL_CORECLK_SRC_PLL BIT(3) #define ADAU17X1_CLOCK_CONTROL_SYSCLK_EN BIT(0)
-#define ADAU17X1_SERIAL_PORT1_BCLK32 (0x0 << 5) -#define ADAU17X1_SERIAL_PORT1_BCLK48 (0x1 << 5) -#define ADAU17X1_SERIAL_PORT1_BCLK64 (0x2 << 5) +#define ADAU17X1_SERIAL_PORT1_BCLK64 (0x0 << 5) +#define ADAU17X1_SERIAL_PORT1_BCLK32 (0x1 << 5) +#define ADAU17X1_SERIAL_PORT1_BCLK48 (0x2 << 5) #define ADAU17X1_SERIAL_PORT1_BCLK128 (0x3 << 5) #define ADAU17X1_SERIAL_PORT1_BCLK256 (0x4 << 5) #define ADAU17X1_SERIAL_PORT1_BCLK_MASK (0x7 << 5)
Signed-off-by: Andreas Irestål andire@axis.com --- include/linux/platform_data/adau17x1.h | 2 +- sound/soc/codecs/adau1761-i2c.c | 2 +- sound/soc/codecs/adau1761-spi.c | 2 +- sound/soc/codecs/adau1761.c | 2 +- sound/soc/codecs/adau1781.c | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/include/linux/platform_data/adau17x1.h b/include/linux/platform_data/adau17x1.h index a81766c..9db1b90 100644 --- a/include/linux/platform_data/adau17x1.h +++ b/include/linux/platform_data/adau17x1.h @@ -1,5 +1,5 @@ /* - * Driver for ADAU1761/ADAU1461/ADAU1761/ADAU1961/ADAU1781/ADAU1781 codecs + * Driver for ADAU1361/ADAU1461/ADAU1761/ADAU1961/ADAU1381/ADAU1781 codecs * * Copyright 2011-2014 Analog Devices Inc. * Author: Lars-Peter Clausen lars@metafoo.de diff --git a/sound/soc/codecs/adau1761-i2c.c b/sound/soc/codecs/adau1761-i2c.c index 348ccb1..a1b1267 100644 --- a/sound/soc/codecs/adau1761-i2c.c +++ b/sound/soc/codecs/adau1761-i2c.c @@ -1,5 +1,5 @@ /* - * Driver for ADAU1761/ADAU1461/ADAU1761/ADAU1961 codec + * Driver for ADAU1361/ADAU1461/ADAU1761/ADAU1961 codec * * Copyright 2014 Analog Devices Inc. * Author: Lars-Peter Clausen lars@metafoo.de diff --git a/sound/soc/codecs/adau1761-spi.c b/sound/soc/codecs/adau1761-spi.c index 8bc1fbd..1883349 100644 --- a/sound/soc/codecs/adau1761-spi.c +++ b/sound/soc/codecs/adau1761-spi.c @@ -1,5 +1,5 @@ /* - * Driver for ADAU1761/ADAU1461/ADAU1761/ADAU1961 codec + * Driver for ADAU1361/ADAU1461/ADAU1761/ADAU1961 codec * * Copyright 2014 Analog Devices Inc. * Author: Lars-Peter Clausen lars@metafoo.de diff --git a/sound/soc/codecs/adau1761.c b/sound/soc/codecs/adau1761.c index 2f12477..16fed36 100644 --- a/sound/soc/codecs/adau1761.c +++ b/sound/soc/codecs/adau1761.c @@ -1,5 +1,5 @@ /* - * Driver for ADAU1761/ADAU1461/ADAU1761/ADAU1961 codec + * Driver for ADAU1361/ADAU1461/ADAU1761/ADAU1961 codec * * Copyright 2011-2013 Analog Devices Inc. * Author: Lars-Peter Clausen lars@metafoo.de diff --git a/sound/soc/codecs/adau1781.c b/sound/soc/codecs/adau1781.c index fde9068..bc1bb56 100644 --- a/sound/soc/codecs/adau1781.c +++ b/sound/soc/codecs/adau1781.c @@ -1,5 +1,5 @@ /* - * Driver for ADAU1781/ADAU1781 codec + * Driver for ADAU1381/ADAU1781 codec * * Copyright 2011-2013 Analog Devices Inc. * Author: Lars-Peter Clausen lars@metafoo.de
Signed-off-by: Andreas Irestål andire@axis.com --- .../devicetree/bindings/sound/adi,adau17x1.txt | 24 ++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 Documentation/devicetree/bindings/sound/adi,adau17x1.txt
diff --git a/Documentation/devicetree/bindings/sound/adi,adau17x1.txt b/Documentation/devicetree/bindings/sound/adi,adau17x1.txt new file mode 100644 index 0000000..8dbce0e --- /dev/null +++ b/Documentation/devicetree/bindings/sound/adi,adau17x1.txt @@ -0,0 +1,24 @@ +Analog Devices ADAU1361/ADAU1461/ADAU1761/ADAU1961/ADAU1381/ADAU1781 + +Required properties: + + - compatible: Should contain one of the following: + "adi,adau1361" + "adi,adau1461" + "adi,adau1761" + "adi,adau1961" + "adi,adau1381" + "adi,adau1781" + + - reg: The i2c address. Value depends on the state of ADDR0 + and ADDR1, as wired in hardware. + +Examples: +#include <dt-bindings/sound/adau17x1.h> + + i2c_bus { + adau1361@38 { + compatible = "adi,adau1761"; + reg = <0x38>; + }; + };
On Tue, Feb 16, 2016 at 01:56:43PM +0100, Andreas Irestål wrote:
Signed-off-by: Andreas Irestål andire@axis.com
.../devicetree/bindings/sound/adi,adau17x1.txt | 24 ++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 Documentation/devicetree/bindings/sound/adi,adau17x1.txt
diff --git a/Documentation/devicetree/bindings/sound/adi,adau17x1.txt b/Documentation/devicetree/bindings/sound/adi,adau17x1.txt new file mode 100644 index 0000000..8dbce0e --- /dev/null +++ b/Documentation/devicetree/bindings/sound/adi,adau17x1.txt @@ -0,0 +1,24 @@ +Analog Devices ADAU1361/ADAU1461/ADAU1761/ADAU1961/ADAU1381/ADAU1781
+Required properties:
- compatible: Should contain one of the following:
"adi,adau1361"
"adi,adau1461"
"adi,adau1761"
"adi,adau1961"
"adi,adau1381"
"adi,adau1781"
- reg: The i2c address. Value depends on the state of ADDR0
and ADDR1, as wired in hardware.
+Examples: +#include <dt-bindings/sound/adau17x1.h>
- i2c_bus {
adau1361@38 {
codec@38
Otherwise:
Acked-by: Rob Herring robh@kernel.org
compatible = "adi,adau1761";
reg = <0x38>;
};
- };
-- 2.1.4
-- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
The patch
ASoC: adau17x1: Add adau17x1 bindings document
has been applied to the asoc tree at
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
All being well this means that it will be integrated into the linux-next tree (usually sometime in the next 24 hours) and sent to Linus during the next merge window (or sooner if it is a bug fix), however if problems are discovered then the patch may be dropped or reverted.
You may get further e-mails resulting from automated or manual testing and review of the tree, please engage with people reporting problems and send followup patches addressing any issues that are reported if needed.
If any updates are required or you are submitting further changes they should be sent as incremental updates against current git, existing patches will not be replaced.
Please add any relevant lists and maintainers to the CCs when replying to this mail.
Thanks, Mark
From ef329457237d885baf3408a56db9a02df97cde87 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andreas=20Irest=C3=A5l?= andreas.irestal@axis.com Date: Tue, 16 Feb 2016 13:56:43 +0100 Subject: [PATCH] ASoC: adau17x1: Add adau17x1 bindings document MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit
Signed-off-by: Andreas Irestål andire@axis.com Signed-off-by: Mark Brown broonie@kernel.org --- .../devicetree/bindings/sound/adi,adau17x1.txt | 24 ++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 Documentation/devicetree/bindings/sound/adi,adau17x1.txt
diff --git a/Documentation/devicetree/bindings/sound/adi,adau17x1.txt b/Documentation/devicetree/bindings/sound/adi,adau17x1.txt new file mode 100644 index 000000000000..8dbce0e18dda --- /dev/null +++ b/Documentation/devicetree/bindings/sound/adi,adau17x1.txt @@ -0,0 +1,24 @@ +Analog Devices ADAU1361/ADAU1461/ADAU1761/ADAU1961/ADAU1381/ADAU1781 + +Required properties: + + - compatible: Should contain one of the following: + "adi,adau1361" + "adi,adau1461" + "adi,adau1761" + "adi,adau1961" + "adi,adau1381" + "adi,adau1781" + + - reg: The i2c address. Value depends on the state of ADDR0 + and ADDR1, as wired in hardware. + +Examples: +#include <dt-bindings/sound/adau17x1.h> + + i2c_bus { + adau1361@38 { + compatible = "adi,adau1761"; + reg = <0x38>; + }; + };
Signed-off-by: Andreas Irestål andire@axis.com --- sound/soc/codecs/adau1761-i2c.c | 12 ++++++++++++ sound/soc/codecs/adau1761-spi.c | 12 ++++++++++++ sound/soc/codecs/adau1781-i2c.c | 10 ++++++++++ sound/soc/codecs/adau1781-spi.c | 10 ++++++++++ 4 files changed, 44 insertions(+)
diff --git a/sound/soc/codecs/adau1761-i2c.c b/sound/soc/codecs/adau1761-i2c.c index a1b1267..8de010f 100644 --- a/sound/soc/codecs/adau1761-i2c.c +++ b/sound/soc/codecs/adau1761-i2c.c @@ -44,9 +44,21 @@ static const struct i2c_device_id adau1761_i2c_ids[] = { }; MODULE_DEVICE_TABLE(i2c, adau1761_i2c_ids);
+#if defined(CONFIG_OF) +static const struct of_device_id adau1761_i2c_dt_ids[] = { + { .compatible = "adi,adau1361", }, + { .compatible = "adi,adau1461", }, + { .compatible = "adi,adau1761", }, + { .compatible = "adi,adau1961", }, + { }, +}; +MODULE_DEVICE_TABLE(of, adau1761_i2c_dt_ids); +#endif + static struct i2c_driver adau1761_i2c_driver = { .driver = { .name = "adau1761", + .of_match_table = of_match_ptr(adau1761_i2c_dt_ids), }, .probe = adau1761_i2c_probe, .remove = adau1761_i2c_remove, diff --git a/sound/soc/codecs/adau1761-spi.c b/sound/soc/codecs/adau1761-spi.c index 1883349..d917124 100644 --- a/sound/soc/codecs/adau1761-spi.c +++ b/sound/soc/codecs/adau1761-spi.c @@ -61,9 +61,21 @@ static const struct spi_device_id adau1761_spi_id[] = { }; MODULE_DEVICE_TABLE(spi, adau1761_spi_id);
+#if defined(CONFIG_OF) +static const struct of_device_id adau1761_spi_dt_ids[] = { + { .compatible = "adi,adau1361", }, + { .compatible = "adi,adau1461", }, + { .compatible = "adi,adau1761", }, + { .compatible = "adi,adau1961", }, + { }, +}; +MODULE_DEVICE_TABLE(of, adau1761_spi_dt_ids); +#endif + static struct spi_driver adau1761_spi_driver = { .driver = { .name = "adau1761", + .of_match_table = of_match_ptr(adau1761_spi_dt_ids), }, .probe = adau1761_spi_probe, .remove = adau1761_spi_remove, diff --git a/sound/soc/codecs/adau1781-i2c.c b/sound/soc/codecs/adau1781-i2c.c index 0e32bba..06cbca8 100644 --- a/sound/soc/codecs/adau1781-i2c.c +++ b/sound/soc/codecs/adau1781-i2c.c @@ -42,9 +42,19 @@ static const struct i2c_device_id adau1781_i2c_ids[] = { }; MODULE_DEVICE_TABLE(i2c, adau1781_i2c_ids);
+#if defined(CONFIG_OF) +static const struct of_device_id adau1781_i2c_dt_ids[] = { + { .compatible = "adi,adau1381", }, + { .compatible = "adi,adau1781", }, + { }, +}; +MODULE_DEVICE_TABLE(of, adau1781_i2c_dt_ids); +#endif + static struct i2c_driver adau1781_i2c_driver = { .driver = { .name = "adau1781", + .of_match_table = of_match_ptr(adau1781_i2c_dt_ids), }, .probe = adau1781_i2c_probe, .remove = adau1781_i2c_remove, diff --git a/sound/soc/codecs/adau1781-spi.c b/sound/soc/codecs/adau1781-spi.c index 33a73ff..3d965a0 100644 --- a/sound/soc/codecs/adau1781-spi.c +++ b/sound/soc/codecs/adau1781-spi.c @@ -59,9 +59,19 @@ static const struct spi_device_id adau1781_spi_id[] = { }; MODULE_DEVICE_TABLE(spi, adau1781_spi_id);
+#if defined(CONFIG_OF) +static const struct of_device_id adau1781_spi_dt_ids[] = { + { .compatible = "adi,adau1381", }, + { .compatible = "adi,adau1781", }, + { }, +}; +MODULE_DEVICE_TABLE(of, adau1781_spi_dt_ids); +#endif + static struct spi_driver adau1781_spi_driver = { .driver = { .name = "adau1781", + .of_match_table = of_match_ptr(adau1781_spi_dt_ids), }, .probe = adau1781_spi_probe, .remove = adau1781_spi_remove,
The patch
ASoC: adau17x1: Add basic DT support for adau17x1
has been applied to the asoc tree at
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
All being well this means that it will be integrated into the linux-next tree (usually sometime in the next 24 hours) and sent to Linus during the next merge window (or sooner if it is a bug fix), however if problems are discovered then the patch may be dropped or reverted.
You may get further e-mails resulting from automated or manual testing and review of the tree, please engage with people reporting problems and send followup patches addressing any issues that are reported if needed.
If any updates are required or you are submitting further changes they should be sent as incremental updates against current git, existing patches will not be replaced.
Please add any relevant lists and maintainers to the CCs when replying to this mail.
Thanks, Mark
From aaf0f3aeeb6f9e5e874fccc8a0e56b00fea537c3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andreas=20Irest=C3=A5l?= andreas.irestal@axis.com Date: Tue, 16 Feb 2016 13:56:44 +0100 Subject: [PATCH] ASoC: adau17x1: Add basic DT support for adau17x1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit
Signed-off-by: Andreas Irestål andire@axis.com Signed-off-by: Mark Brown broonie@kernel.org --- sound/soc/codecs/adau1761-i2c.c | 12 ++++++++++++ sound/soc/codecs/adau1761-spi.c | 12 ++++++++++++ sound/soc/codecs/adau1781-i2c.c | 10 ++++++++++ sound/soc/codecs/adau1781-spi.c | 10 ++++++++++ 4 files changed, 44 insertions(+)
diff --git a/sound/soc/codecs/adau1761-i2c.c b/sound/soc/codecs/adau1761-i2c.c index a1b12671c307..8de010f758cd 100644 --- a/sound/soc/codecs/adau1761-i2c.c +++ b/sound/soc/codecs/adau1761-i2c.c @@ -44,9 +44,21 @@ static const struct i2c_device_id adau1761_i2c_ids[] = { }; MODULE_DEVICE_TABLE(i2c, adau1761_i2c_ids);
+#if defined(CONFIG_OF) +static const struct of_device_id adau1761_i2c_dt_ids[] = { + { .compatible = "adi,adau1361", }, + { .compatible = "adi,adau1461", }, + { .compatible = "adi,adau1761", }, + { .compatible = "adi,adau1961", }, + { }, +}; +MODULE_DEVICE_TABLE(of, adau1761_i2c_dt_ids); +#endif + static struct i2c_driver adau1761_i2c_driver = { .driver = { .name = "adau1761", + .of_match_table = of_match_ptr(adau1761_i2c_dt_ids), }, .probe = adau1761_i2c_probe, .remove = adau1761_i2c_remove, diff --git a/sound/soc/codecs/adau1761-spi.c b/sound/soc/codecs/adau1761-spi.c index 188334928c23..d9171245bd9f 100644 --- a/sound/soc/codecs/adau1761-spi.c +++ b/sound/soc/codecs/adau1761-spi.c @@ -61,9 +61,21 @@ static const struct spi_device_id adau1761_spi_id[] = { }; MODULE_DEVICE_TABLE(spi, adau1761_spi_id);
+#if defined(CONFIG_OF) +static const struct of_device_id adau1761_spi_dt_ids[] = { + { .compatible = "adi,adau1361", }, + { .compatible = "adi,adau1461", }, + { .compatible = "adi,adau1761", }, + { .compatible = "adi,adau1961", }, + { }, +}; +MODULE_DEVICE_TABLE(of, adau1761_spi_dt_ids); +#endif + static struct spi_driver adau1761_spi_driver = { .driver = { .name = "adau1761", + .of_match_table = of_match_ptr(adau1761_spi_dt_ids), }, .probe = adau1761_spi_probe, .remove = adau1761_spi_remove, diff --git a/sound/soc/codecs/adau1781-i2c.c b/sound/soc/codecs/adau1781-i2c.c index 0e32bba92339..06cbca84cf02 100644 --- a/sound/soc/codecs/adau1781-i2c.c +++ b/sound/soc/codecs/adau1781-i2c.c @@ -42,9 +42,19 @@ static const struct i2c_device_id adau1781_i2c_ids[] = { }; MODULE_DEVICE_TABLE(i2c, adau1781_i2c_ids);
+#if defined(CONFIG_OF) +static const struct of_device_id adau1781_i2c_dt_ids[] = { + { .compatible = "adi,adau1381", }, + { .compatible = "adi,adau1781", }, + { }, +}; +MODULE_DEVICE_TABLE(of, adau1781_i2c_dt_ids); +#endif + static struct i2c_driver adau1781_i2c_driver = { .driver = { .name = "adau1781", + .of_match_table = of_match_ptr(adau1781_i2c_dt_ids), }, .probe = adau1781_i2c_probe, .remove = adau1781_i2c_remove, diff --git a/sound/soc/codecs/adau1781-spi.c b/sound/soc/codecs/adau1781-spi.c index 33a73ff78de4..3d965a01b99c 100644 --- a/sound/soc/codecs/adau1781-spi.c +++ b/sound/soc/codecs/adau1781-spi.c @@ -59,9 +59,19 @@ static const struct spi_device_id adau1781_spi_id[] = { }; MODULE_DEVICE_TABLE(spi, adau1781_spi_id);
+#if defined(CONFIG_OF) +static const struct of_device_id adau1781_spi_dt_ids[] = { + { .compatible = "adi,adau1381", }, + { .compatible = "adi,adau1781", }, + { }, +}; +MODULE_DEVICE_TABLE(of, adau1781_spi_dt_ids); +#endif + static struct spi_driver adau1781_spi_driver = { .driver = { .name = "adau1781", + .of_match_table = of_match_ptr(adau1781_spi_dt_ids), }, .probe = adau1781_spi_probe, .remove = adau1781_spi_remove,
Currently, it is only possible to configure HW-specific options to the adau17x1 codecs by providing a platform data struct. With this patch, it is possible to provide the same data via DT instead.
Signed-off-by: Andreas Irestål andire@axis.com --- .../devicetree/bindings/sound/adi,adau17x1.txt | 31 +++++ include/dt-bindings/sound/adau17x1.h | 14 +++ sound/soc/codecs/adau1761.c | 127 +++++++++++++++++++++ sound/soc/codecs/adau1781.c | 48 ++++++++ 4 files changed, 220 insertions(+) create mode 100644 include/dt-bindings/sound/adau17x1.h
diff --git a/Documentation/devicetree/bindings/sound/adi,adau17x1.txt b/Documentation/devicetree/bindings/sound/adi,adau17x1.txt index 8dbce0e..6050602 100644 --- a/Documentation/devicetree/bindings/sound/adi,adau17x1.txt +++ b/Documentation/devicetree/bindings/sound/adi,adau17x1.txt @@ -13,6 +13,32 @@ Required properties: - reg: The i2c address. Value depends on the state of ADDR0 and ADDR1, as wired in hardware.
+Optional properties: + + - adi,input-differential bool to set if the input is differential + - adi,digital-microphone bool to set if there is a digital microphone + connected to digmic/jackdet pin. + - adi,micbias-vg Microphone bias voltage + MICBIAS_0_90_AVDD - 0.9 * AVDD + MICBIAS_0_65_AVDD - 0.65 * AVDD + +Optional properties (ADAU1361/ADAU1461/ADAU1761/ADAU1961 only) + + - adi,jack-detection If present, configures codec to use the digmic/jackdet + pin for jack detection. must provide one of + JACKDETECT_ACTIVE_LO or JACKDETECT_ACTIVE_HI followed + by debounce time in ms, which must be 5, 10, 20, or 40. + + - adi,lineout-mode Set output mode of the lineout pins. + - adi,headphone-mode Set output mode of the headphone pins. + +The output mode must be one of: + OUTPUT_MODE_HEADPHONE - Headphone output + OUTPUT_MODE_HEADPHONE_CAPLESS - Capless headphone output + OUTPUT_MODE_LINE - Line output + + + Examples: #include <dt-bindings/sound/adau17x1.h>
@@ -20,5 +46,10 @@ Examples: adau1361@38 { compatible = "adi,adau1761"; reg = <0x38>; + input-differential; + jack-detection = <JACKDETECT_ACTIVE_LO 40>; + lineout-mode = <OUTPUT_MODE_LINE>; + headphone-mode = <OUTPUT_MODE_HEADPHONE>; + micbias-vg = <MICBIAS_0_90_AVDD>; }; }; diff --git a/include/dt-bindings/sound/adau17x1.h b/include/dt-bindings/sound/adau17x1.h new file mode 100644 index 0000000..3152019 --- /dev/null +++ b/include/dt-bindings/sound/adau17x1.h @@ -0,0 +1,14 @@ +#ifndef __DT_ADAU17X1_H +#define __DT_ADAU17X1_H + +#define MICBIAS_0_90_AVDD 0 +#define MICBIAS_0_65_AVDD 1 + +#define OUTPUT_MODE_HEADPHONE 0 +#define OUTPUT_MODE_HEADPHONE_CAPLESS 1 +#define OUTPUT_MODE_LINE 2 + +#define JACKDETECT_ACTIVE_HI 0 +#define JACKDETECT_ACTIVE_LO 1 + +#endif diff --git a/sound/soc/codecs/adau1761.c b/sound/soc/codecs/adau1761.c index 16fed36..caba102 100644 --- a/sound/soc/codecs/adau1761.c +++ b/sound/soc/codecs/adau1761.c @@ -18,6 +18,7 @@ #include <sound/soc.h> #include <sound/tlv.h> #include <linux/platform_data/adau17x1.h> +#include <dt-bindings/sound/adau17x1.h>
#include "adau17x1.h" #include "adau1761.h" @@ -709,6 +710,122 @@ static int adau1761_codec_probe(struct snd_soc_codec *codec) return 0; }
+#ifdef CONFIG_OF +static inline void adau1761_parse_of_outmode(struct device *dev, + uint32_t of_val, + enum adau1761_output_mode *mode) +{ + switch (of_val) { + case OUTPUT_MODE_HEADPHONE: + *mode = ADAU1761_OUTPUT_MODE_HEADPHONE; + break; + case OUTPUT_MODE_HEADPHONE_CAPLESS: + *mode = ADAU1761_OUTPUT_MODE_HEADPHONE_CAPLESS; + break; + case OUTPUT_MODE_LINE: + *mode = ADAU1761_OUTPUT_MODE_LINE; + break; + default: + dev_warn(dev, "Invalid output mode %d\n", of_val); + *mode = ADAU1761_OUTPUT_MODE_LINE; + break; + } +} + +static void adau1761_pdata_from_of(struct device *dev, + struct adau1761_platform_data *pdata) +{ + struct device_node *np = dev->of_node; + uint32_t val; + uint32_t debounce_pars[2]; + + pdata->input_differential = + of_property_read_bool(np, "adi,input-differential"); + + if (of_get_property(np, "adi,jack-detection", NULL)) { + pdata->digmic_jackdetect_pin_mode = + ADAU1761_DIGMIC_JACKDET_PIN_MODE_JACKDETECT; + if (!of_property_read_u32_array(np, "adi,jack-detection", + debounce_pars, 2)) { + pdata->jackdetect_active_low = + debounce_pars[0] == JACKDETECT_ACTIVE_LO; + switch (debounce_pars[1]) { + case 5: + pdata->jackdetect_debounce_time = + ADAU1761_JACKDETECT_DEBOUNCE_5MS; + break; + case 10: + pdata->jackdetect_debounce_time = + ADAU1761_JACKDETECT_DEBOUNCE_10MS; + break; + case 20: + pdata->jackdetect_debounce_time = + ADAU1761_JACKDETECT_DEBOUNCE_20MS; + break; + case 40: + pdata->jackdetect_debounce_time = + ADAU1761_JACKDETECT_DEBOUNCE_40MS; + break; + default: + dev_warn(dev, "Invalid debounce_time %d\n", + debounce_pars[1]); + pdata->jackdetect_debounce_time = + ADAU1761_JACKDETECT_DEBOUNCE_40MS; + break; + } + } else if (!of_property_read_u32_array(np, "adi,jack-detection", + debounce_pars, 1)) { + dev_warn(dev, "Debounce time not provided\n"); + pdata->jackdetect_active_low = + debounce_pars[0] == JACKDETECT_ACTIVE_LO; + } else { + dev_warn(dev, "No jack detection settings found\n"); + pdata->jackdetect_active_low = 0; + pdata->jackdetect_debounce_time = + ADAU1761_JACKDETECT_DEBOUNCE_40MS; + } + } else if (of_property_read_bool(np, "adi,digital-microphone")) { + pdata->digmic_jackdetect_pin_mode = + ADAU1761_DIGMIC_JACKDET_PIN_MODE_DIGMIC; + } else { + pdata->digmic_jackdetect_pin_mode = + ADAU1761_DIGMIC_JACKDET_PIN_MODE_NONE; + } + + if (!of_property_read_u32(np, "adi,headphone-mode", &val)) + adau1761_parse_of_outmode(dev, val, &pdata->headphone_mode); + else + pdata->headphone_mode = ADAU1761_OUTPUT_MODE_LINE; + + if (!of_property_read_u32(np, "adi,lineout-mode", &val)) + adau1761_parse_of_outmode(dev, val, &pdata->lineout_mode); + else + pdata->lineout_mode = ADAU1761_OUTPUT_MODE_LINE; + + if (!of_property_read_u32(np, "adi,micbias-vg", &val)) { + switch (val) { + case MICBIAS_0_65_AVDD: + pdata->micbias_voltage = ADAU17X1_MICBIAS_0_65_AVDD; + break; + case MICBIAS_0_90_AVDD: + pdata->micbias_voltage = ADAU17X1_MICBIAS_0_90_AVDD; + break; + default: + dev_warn(dev, "Invalid micbias voltage setting\n"); + pdata->micbias_voltage = ADAU17X1_MICBIAS_0_90_AVDD; + break; + } + } else { + pdata->micbias_voltage = ADAU17X1_MICBIAS_0_90_AVDD; + } +} +#else +static void adau1761_pdata_from_of(struct device *dev, + struct adau1761_platform_data *pdata) +{ +} +#endif + static const struct snd_soc_codec_driver adau1761_codec_driver = { .probe = adau1761_codec_probe, .resume = adau17x1_resume, @@ -768,6 +885,8 @@ int adau1761_probe(struct device *dev, struct regmap *regmap, enum adau17x1_type type, void (*switch_mode)(struct device *dev)) { struct snd_soc_dai_driver *dai_drv; + struct adau1761_platform_data *of_pdata; + struct device_node *np = dev->of_node; const char *firmware_name; int ret;
@@ -779,6 +898,14 @@ int adau1761_probe(struct device *dev, struct regmap *regmap, firmware_name = ADAU1761_FIRMWARE; }
+ if (!dev->platform_data && np) { + of_pdata = devm_kzalloc(dev, sizeof(*of_pdata), GFP_KERNEL); + if (!of_pdata) + return -ENOMEM; + adau1761_pdata_from_of(dev, of_pdata); + dev->platform_data = of_pdata; + } + ret = adau17x1_probe(dev, regmap, type, switch_mode, firmware_name); if (ret) return ret; diff --git a/sound/soc/codecs/adau1781.c b/sound/soc/codecs/adau1781.c index bc1bb56..401220e 100644 --- a/sound/soc/codecs/adau1781.c +++ b/sound/soc/codecs/adau1781.c @@ -18,6 +18,7 @@ #include <sound/soc.h> #include <sound/tlv.h> #include <linux/platform_data/adau17x1.h> +#include <dt-bindings/sound/adau17x1.h>
#include "adau17x1.h" #include "adau1781.h" @@ -426,6 +427,43 @@ static int adau1781_codec_probe(struct snd_soc_codec *codec) return 0; }
+#ifdef CONFIG_OF +static void adau1781_pdata_from_of(struct device *dev, + struct adau1781_platform_data *pdata) +{ + struct device_node *np = dev->of_node; + uint32_t val; + + val = of_property_read_bool(np, "adi,input-differential"); + pdata->left_input_differential = val; + pdata->right_input_differential = val; + + of_property_read_bool(np, "adi,digital-microphone"); + + if (!of_property_read_u32(np, "adi,micbias-vg", &val)) { + switch (val) { + case MICBIAS_0_65_AVDD: + pdata->micbias_voltage = ADAU17X1_MICBIAS_0_65_AVDD; + break; + case MICBIAS_0_90_AVDD: + pdata->micbias_voltage = ADAU17X1_MICBIAS_0_90_AVDD; + break; + default: + dev_warn(dev, "Invalid micbias voltage setting\n"); + pdata->micbias_voltage = ADAU17X1_MICBIAS_0_90_AVDD; + break; + } + } else { + pdata->micbias_voltage = ADAU17X1_MICBIAS_0_90_AVDD; + } +} +#else +static void adau1781_pdata_from_of(struct device *dev, + struct adau1781_platform_data *pdata) +{ +} +#endif + static const struct snd_soc_codec_driver adau1781_codec_driver = { .probe = adau1781_codec_probe, .resume = adau17x1_resume, @@ -479,6 +517,8 @@ int adau1781_probe(struct device *dev, struct regmap *regmap, enum adau17x1_type type, void (*switch_mode)(struct device *dev)) { const char *firmware_name; + struct adau1781_platform_data *of_pdata; + struct device_node *np = dev->of_node; int ret;
switch (type) { @@ -492,6 +532,14 @@ int adau1781_probe(struct device *dev, struct regmap *regmap, return -EINVAL; }
+ if (!dev->platform_data && np) { + of_pdata = devm_kzalloc(dev, sizeof(*of_pdata), GFP_KERNEL); + if (!of_pdata) + return -ENOMEM; + adau1781_pdata_from_of(dev, of_pdata); + dev->platform_data = of_pdata; + } + ret = adau17x1_probe(dev, regmap, type, switch_mode, firmware_name); if (ret) return ret;
On Tuesday 16 February 2016 13:56:45 Andreas Irestål wrote:
Currently, it is only possible to configure HW-specific options to the adau17x1 codecs by providing a platform data struct. With this patch, it is possible to provide the same data via DT instead.
Signed-off-by: Andreas Irestål andire@axis.com
.../devicetree/bindings/sound/adi,adau17x1.txt | 31 +++++ include/dt-bindings/sound/adau17x1.h | 14 +++ sound/soc/codecs/adau1761.c | 127 +++++++++++++++++++++ sound/soc/codecs/adau1781.c | 48 ++++++++ 4 files changed, 220 insertions(+) create mode 100644 include/dt-bindings/sound/adau17x1.h
It would be nicer to avoid the need for the extra header file, those tend to cause more problems than they solve.
diff --git a/Documentation/devicetree/bindings/sound/adi,adau17x1.txt b/Documentation/devicetree/bindings/sound/adi,adau17x1.txt index 8dbce0e..6050602 100644 --- a/Documentation/devicetree/bindings/sound/adi,adau17x1.txt +++ b/Documentation/devicetree/bindings/sound/adi,adau17x1.txt @@ -13,6 +13,32 @@ Required properties:
- reg: The i2c address. Value depends on the state of ADDR0 and ADDR1, as wired in hardware.
+Optional properties:
- adi,input-differential bool to set if the input is differential
- adi,digital-microphone bool to set if there is a digital microphone
connected to digmic/jackdet pin.
- adi,micbias-vg Microphone bias voltage
- MICBIAS_0_90_AVDD - 0.9 * AVDD
- MICBIAS_0_65_AVDD - 0.65 * AVDD
This could be an integer property, or possibly two (mutually exclusive) boolean properties.
+Optional properties (ADAU1361/ADAU1461/ADAU1761/ADAU1961 only)
- adi,jack-detection If present, configures codec to use the digmic/jackdet
pin for jack detection. must provide one of
JACKDETECT_ACTIVE_LO or JACKDETECT_ACTIVE_HI followed
by debounce time in ms, which must be 5, 10, 20, or 40.
I would use one integer property for debounce and one bool property for polarity.
+The output mode must be one of:
- OUTPUT_MODE_HEADPHONE - Headphone output
- OUTPUT_MODE_HEADPHONE_CAPLESS - Capless headphone output
- OUTPUT_MODE_LINE - Line output
And something along the same lines here. Or just document the three modes as numbers in the binding file.
+#ifdef CONFIG_OF +static void adau1781_pdata_from_of(struct device *dev,
struct adau1781_platform_data *pdata)
You can remove the #ifdef here...
- if (!dev->platform_data && np) {
if you change this to
if (IS_ENABLED(CONFIG_OF) && np) {
of_pdata = devm_kzalloc(dev, sizeof(*of_pdata), GFP_KERNEL);
if (!of_pdata)
return -ENOMEM;
adau1781_pdata_from_of(dev, of_pdata);
dev->platform_data = of_pdata;
and here I'd try to avoid the dynamic allocation and just add the fields to the driver private structure. You can copy the information from the platform data in the 'else' path.
Arnd
On Tue, Feb 16, 2016 at 02:42:02PM +0100, Arnd Bergmann wrote:
On Tuesday 16 February 2016 13:56:45 Andreas Irestål wrote:
Currently, it is only possible to configure HW-specific options to the adau17x1 codecs by providing a platform data struct. With this patch, it is possible to provide the same data via DT instead.
Signed-off-by: Andreas Irestål andire@axis.com
.../devicetree/bindings/sound/adi,adau17x1.txt | 31 +++++ include/dt-bindings/sound/adau17x1.h | 14 +++ sound/soc/codecs/adau1761.c | 127 +++++++++++++++++++++ sound/soc/codecs/adau1781.c | 48 ++++++++ 4 files changed, 220 insertions(+) create mode 100644 include/dt-bindings/sound/adau17x1.h
of_pdata = devm_kzalloc(dev, sizeof(*of_pdata), GFP_KERNEL);
if (!of_pdata)
return -ENOMEM;
adau1781_pdata_from_of(dev, of_pdata);
dev->platform_data = of_pdata;
and here I'd try to avoid the dynamic allocation and just add the fields to the driver private structure. You can copy the information from the platform data in the 'else' path.
Since the driver private structure is shared between two different codecs, the platform_data struct can be of 2 different types, but I guess it should be OK to have two fields or a union in the private struct.
I was thinking about this too but chose the approach above since providing platform_data is optional. However, I could add some default values and submit again.
Thanks a lot for the feedback. /Andreas
Arnd
On Tue, Feb 16, 2016 at 01:56:45PM +0100, Andreas Irestål wrote:
Currently, it is only possible to configure HW-specific options to the adau17x1 codecs by providing a platform data struct. With this patch, it is possible to provide the same data via DT instead.
The subject is a red flag. Platform data and DT properties are not necessarily equivalent.
This should be part of the previous patch.
Signed-off-by: Andreas Irestål andire@axis.com
.../devicetree/bindings/sound/adi,adau17x1.txt | 31 +++++ include/dt-bindings/sound/adau17x1.h | 14 +++ sound/soc/codecs/adau1761.c | 127 +++++++++++++++++++++ sound/soc/codecs/adau1781.c | 48 ++++++++ 4 files changed, 220 insertions(+) create mode 100644 include/dt-bindings/sound/adau17x1.h
diff --git a/Documentation/devicetree/bindings/sound/adi,adau17x1.txt b/Documentation/devicetree/bindings/sound/adi,adau17x1.txt index 8dbce0e..6050602 100644 --- a/Documentation/devicetree/bindings/sound/adi,adau17x1.txt +++ b/Documentation/devicetree/bindings/sound/adi,adau17x1.txt @@ -13,6 +13,32 @@ Required properties:
- reg: The i2c address. Value depends on the state of ADDR0 and ADDR1, as wired in hardware.
+Optional properties:
- adi,input-differential bool to set if the input is differential
- adi,digital-microphone bool to set if there is a digital microphone
connected to digmic/jackdet pin.
- adi,micbias-vg Microphone bias voltage
In what units? Add units suffix. Also, this seems like something that should be common.
- MICBIAS_0_90_AVDD - 0.9 * AVDD
- MICBIAS_0_65_AVDD - 0.65 * AVDD
What does this mean?
+Optional properties (ADAU1361/ADAU1461/ADAU1761/ADAU1961 only)
- adi,jack-detection If present, configures codec to use the digmic/jackdet
pin for jack detection. must provide one of
JACKDETECT_ACTIVE_LO or JACKDETECT_ACTIVE_HI followed
by debounce time in ms, which must be 5, 10, 20, or 40.
Seems like this could be common. No existing examples to copy?
- adi,lineout-mode Set output mode of the lineout pins.
- adi,headphone-mode Set output mode of the headphone pins.
+The output mode must be one of:
- OUTPUT_MODE_HEADPHONE - Headphone output
- OUTPUT_MODE_HEADPHONE_CAPLESS - Capless headphone output
- OUTPUT_MODE_LINE - Line output
On Thu, Feb 18, 2016 at 08:37:35AM -0600, Rob Herring wrote:
On Tue, Feb 16, 2016 at 01:56:45PM +0100, Andreas Irestål wrote:
- MICBIAS_0_90_AVDD - 0.9 * AVDD
- MICBIAS_0_65_AVDD - 0.65 * AVDD
What does this mean?
It's specifying the microphone bias as a function of the AVDD supply voltage. This should be obvious to anyone with any knowledge of the domain, it's a fairly common way of configuring such things.
+Optional properties (ADAU1361/ADAU1461/ADAU1761/ADAU1961 only)
- adi,jack-detection If present, configures codec to use the digmic/jackdet
pin for jack detection. must provide one of
JACKDETECT_ACTIVE_LO or JACKDETECT_ACTIVE_HI followed
by debounce time in ms, which must be 5, 10, 20, or 40.
Seems like this could be common. No existing examples to copy?
If it's just a GPIO with a fancy name and some offloading (sounds like it) there's an existing binding for the GPIO.
participants (4)
-
Andreas Irestål
-
Arnd Bergmann
-
Mark Brown
-
Rob Herring