This patch-set provides the MOP500 Audio driver with a few small
fix-ups along with Device Tree enablement for MOP500 Core and the
MSPs. You'll notice that we've left the PCM out for the time being
and continue to register that using platform code. This is because
we're still in the middle of discussions pertaining to how this
pseudo-device should be handled. We also pass pinctrl responsibility
to the MSP driver instead of setting it up in platform code, which
is an unnecessary over-head.
Documentation/devicetree/bindings/mfd/ab8500.txt | 15 ++
.../devicetree/bindings/sound/ux500-mop500.txt | 39 +++
.../devicetree/bindings/sound/ux500-msp.txt | 43 ++++
arch/arm/boot/dts/dbx5x0.dtsi | 39 +++
arch/arm/boot/dts/snowball.dts | 16 ++
arch/arm/mach-ux500/Makefile | 2 +-
arch/arm/mach-ux500/board-mop500-audio.c | 199 +++++++++++++++
arch/arm/mach-ux500/board-mop500-msp.c | 267 --------------------
arch/arm/mach-ux500/board-mop500-msp.h | 14 -
arch/arm/mach-ux500/board-mop500.c | 22 +-
arch/arm/mach-ux500/board-mop500.h | 8 +
arch/arm/mach-ux500/include/mach/msp.h | 2 -
include/linux/mfd/abx500/ab8500-codec.h | 6 +-
sound/soc/codecs/ab8500-codec.c | 81 ++++++
sound/soc/ux500/mop500.c | 47 +++-
sound/soc/ux500/ux500_msp_dai.c | 6 +
sound/soc/ux500/ux500_msp_i2s.c | 89 +++++--
sound/soc/ux500/ux500_msp_i2s.h | 8 +-
18 files changed, 584 insertions(+), 319 deletions(-)
Ensure correct probing and pass though important configuration
options to the AB8500 CODEC driver when DT is enabled
Signed-off-by: Lee Jones <[email protected]>
---
arch/arm/boot/dts/dbx5x0.dtsi | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/arch/arm/boot/dts/dbx5x0.dtsi b/arch/arm/boot/dts/dbx5x0.dtsi
index 3180a9c..7f8c9db 100644
--- a/arch/arm/boot/dts/dbx5x0.dtsi
+++ b/arch/arm/boot/dts/dbx5x0.dtsi
@@ -389,6 +389,12 @@
compatible = "stericsson,ab8500-debug";
};
+ codec: ab8500-codec {
+ compatible = "stericsson,ab8500-codec";
+
+ stericsson,earpeice-cmv = <950>; /* Units in mV. */
+ };
+
ab8500-regulators {
compatible = "stericsson,ab8500-regulator";
--
1.7.9.5
The 'msp' board file does more than just register MSP devices. It
also registers some other components necessary to get audio working
on ux500 based platforms; such as the PCM and Machine Drivers. For
that reason we're changing the filename to be more encompassing -
'audio'.
Acked-by: Linus Walleij <[email protected]>
Signed-off-by: Lee Jones <[email protected]>
---
arch/arm/mach-ux500/Makefile | 2 +-
arch/arm/mach-ux500/board-mop500-audio.c | 199 ++++++++++++++++++++++++++++++
arch/arm/mach-ux500/board-mop500-msp.c | 199 ------------------------------
arch/arm/mach-ux500/board-mop500.c | 12 +-
arch/arm/mach-ux500/board-mop500.h | 4 +-
5 files changed, 208 insertions(+), 208 deletions(-)
create mode 100644 arch/arm/mach-ux500/board-mop500-audio.c
delete mode 100644 arch/arm/mach-ux500/board-mop500-msp.c
diff --git a/arch/arm/mach-ux500/Makefile b/arch/arm/mach-ux500/Makefile
index 026086f..1dc2cfa 100644
--- a/arch/arm/mach-ux500/Makefile
+++ b/arch/arm/mach-ux500/Makefile
@@ -12,6 +12,6 @@ obj-$(CONFIG_MACH_MOP500) += board-mop500.o board-mop500-sdi.o \
board-mop500-uib.o board-mop500-stuib.o \
board-mop500-u8500uib.o \
board-mop500-pins.o \
- board-mop500-msp.o
+ board-mop500-audio.o
obj-$(CONFIG_SMP) += platsmp.o headsmp.o
obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o
diff --git a/arch/arm/mach-ux500/board-mop500-audio.c b/arch/arm/mach-ux500/board-mop500-audio.c
new file mode 100644
index 0000000..18f6c5a
--- /dev/null
+++ b/arch/arm/mach-ux500/board-mop500-audio.c
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) ST-Ericsson SA 2010
+ *
+ * License terms: GNU General Public License (GPL), version 2
+ */
+
+#include <linux/platform_device.h>
+#include <linux/init.h>
+#include <linux/gpio.h>
+#include <linux/pinctrl/consumer.h>
+
+#include <plat/gpio-nomadik.h>
+#include <plat/pincfg.h>
+#include <plat/ste_dma40.h>
+
+#include <mach/devices.h>
+#include <mach/hardware.h>
+#include <mach/irqs.h>
+#include <mach/msp.h>
+
+#include "ste-dma40-db8500.h"
+#include "board-mop500.h"
+#include "devices-db8500.h"
+#include "pins-db8500.h"
+
+static struct stedma40_chan_cfg msp0_dma_rx = {
+ .high_priority = true,
+ .dir = STEDMA40_PERIPH_TO_MEM,
+
+ .src_dev_type = DB8500_DMA_DEV31_MSP0_RX_SLIM0_CH0_RX,
+ .dst_dev_type = STEDMA40_DEV_DST_MEMORY,
+
+ .src_info.psize = STEDMA40_PSIZE_LOG_4,
+ .dst_info.psize = STEDMA40_PSIZE_LOG_4,
+
+ /* data_width is set during configuration */
+};
+
+static struct stedma40_chan_cfg msp0_dma_tx = {
+ .high_priority = true,
+ .dir = STEDMA40_MEM_TO_PERIPH,
+
+ .src_dev_type = STEDMA40_DEV_DST_MEMORY,
+ .dst_dev_type = DB8500_DMA_DEV31_MSP0_TX_SLIM0_CH0_TX,
+
+ .src_info.psize = STEDMA40_PSIZE_LOG_4,
+ .dst_info.psize = STEDMA40_PSIZE_LOG_4,
+
+ /* data_width is set during configuration */
+};
+
+struct msp_i2s_platform_data msp0_platform_data = {
+ .id = MSP_I2S_0,
+ .msp_i2s_dma_rx = &msp0_dma_rx,
+ .msp_i2s_dma_tx = &msp0_dma_tx,
+};
+
+static struct stedma40_chan_cfg msp1_dma_rx = {
+ .high_priority = true,
+ .dir = STEDMA40_PERIPH_TO_MEM,
+
+ .src_dev_type = DB8500_DMA_DEV30_MSP3_RX,
+ .dst_dev_type = STEDMA40_DEV_DST_MEMORY,
+
+ .src_info.psize = STEDMA40_PSIZE_LOG_4,
+ .dst_info.psize = STEDMA40_PSIZE_LOG_4,
+
+ /* data_width is set during configuration */
+};
+
+static struct stedma40_chan_cfg msp1_dma_tx = {
+ .high_priority = true,
+ .dir = STEDMA40_MEM_TO_PERIPH,
+
+ .src_dev_type = STEDMA40_DEV_DST_MEMORY,
+ .dst_dev_type = DB8500_DMA_DEV30_MSP1_TX,
+
+ .src_info.psize = STEDMA40_PSIZE_LOG_4,
+ .dst_info.psize = STEDMA40_PSIZE_LOG_4,
+
+ /* data_width is set during configuration */
+};
+
+struct msp_i2s_platform_data msp1_platform_data = {
+ .id = MSP_I2S_1,
+ .msp_i2s_dma_rx = NULL,
+ .msp_i2s_dma_tx = &msp1_dma_tx,
+};
+
+static struct stedma40_chan_cfg msp2_dma_rx = {
+ .high_priority = true,
+ .dir = STEDMA40_PERIPH_TO_MEM,
+
+ .src_dev_type = DB8500_DMA_DEV14_MSP2_RX,
+ .dst_dev_type = STEDMA40_DEV_DST_MEMORY,
+
+ /* MSP2 DMA doesn't work with PSIZE == 4 on DB8500v2 */
+ .src_info.psize = STEDMA40_PSIZE_LOG_1,
+ .dst_info.psize = STEDMA40_PSIZE_LOG_1,
+
+ /* data_width is set during configuration */
+};
+
+static struct stedma40_chan_cfg msp2_dma_tx = {
+ .high_priority = true,
+ .dir = STEDMA40_MEM_TO_PERIPH,
+
+ .src_dev_type = STEDMA40_DEV_DST_MEMORY,
+ .dst_dev_type = DB8500_DMA_DEV14_MSP2_TX,
+
+ .src_info.psize = STEDMA40_PSIZE_LOG_4,
+ .dst_info.psize = STEDMA40_PSIZE_LOG_4,
+
+ .use_fixed_channel = true,
+ .phy_channel = 1,
+
+ /* data_width is set during configuration */
+};
+
+static struct platform_device *db8500_add_msp_i2s(struct device *parent,
+ int id,
+ resource_size_t base, int irq,
+ struct msp_i2s_platform_data *pdata)
+{
+ struct platform_device *pdev;
+ struct resource res[] = {
+ DEFINE_RES_MEM(base, SZ_4K),
+ DEFINE_RES_IRQ(irq),
+ };
+
+ pr_info("Register platform-device 'ux500-msp-i2s', id %d, irq %d\n",
+ id, irq);
+ pdev = platform_device_register_resndata(parent, "ux500-msp-i2s", id,
+ res, ARRAY_SIZE(res),
+ pdata, sizeof(*pdata));
+ if (!pdev) {
+ pr_err("Failed to register platform-device 'ux500-msp-i2s.%d'!\n",
+ id);
+ return NULL;
+ }
+
+ return pdev;
+}
+
+/* Platform device for ASoC MOP500 machine */
+static struct platform_device snd_soc_mop500 = {
+ .name = "snd-soc-mop500",
+ .id = 0,
+ .dev = {
+ .platform_data = NULL,
+ },
+};
+
+/* Platform device for Ux500-PCM */
+static struct platform_device ux500_pcm = {
+ .name = "ux500-pcm",
+ .id = 0,
+ .dev = {
+ .platform_data = NULL,
+ },
+};
+
+struct msp_i2s_platform_data msp2_platform_data = {
+ .id = MSP_I2S_2,
+ .msp_i2s_dma_rx = &msp2_dma_rx,
+ .msp_i2s_dma_tx = &msp2_dma_tx,
+};
+
+struct msp_i2s_platform_data msp3_platform_data = {
+ .id = MSP_I2S_3,
+ .msp_i2s_dma_rx = &msp1_dma_rx,
+ .msp_i2s_dma_tx = NULL,
+};
+
+void mop500_audio_init(struct device *parent)
+{
+ pr_info("%s: Register platform-device 'snd-soc-mop500'.\n", __func__);
+ platform_device_register(&snd_soc_mop500);
+
+ pr_info("Initialize MSP I2S-devices.\n");
+ db8500_add_msp_i2s(parent, 0, U8500_MSP0_BASE, IRQ_DB8500_MSP0,
+ &msp0_platform_data);
+ db8500_add_msp_i2s(parent, 1, U8500_MSP1_BASE, IRQ_DB8500_MSP1,
+ &msp1_platform_data);
+ db8500_add_msp_i2s(parent, 2, U8500_MSP2_BASE, IRQ_DB8500_MSP2,
+ &msp2_platform_data);
+ db8500_add_msp_i2s(parent, 3, U8500_MSP3_BASE, IRQ_DB8500_MSP1,
+ &msp3_platform_data);
+
+ pr_info("%s: Register platform-device 'ux500-pcm'\n", __func__);
+ platform_device_register(&ux500_pcm);
+}
+
+/* Due for removal once the MSP driver has been fully DT:ed. */
+void mop500_of_audio_init(struct device *parent)
+{
+ pr_info("%s: Register platform-device 'ux500-pcm'\n", __func__);
+ platform_device_register(&ux500_pcm);
+}
diff --git a/arch/arm/mach-ux500/board-mop500-msp.c b/arch/arm/mach-ux500/board-mop500-msp.c
deleted file mode 100644
index 2af017f..0000000
--- a/arch/arm/mach-ux500/board-mop500-msp.c
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright (C) ST-Ericsson SA 2010
- *
- * License terms: GNU General Public License (GPL), version 2
- */
-
-#include <linux/platform_device.h>
-#include <linux/init.h>
-#include <linux/gpio.h>
-#include <linux/pinctrl/consumer.h>
-
-#include <plat/gpio-nomadik.h>
-#include <plat/pincfg.h>
-#include <plat/ste_dma40.h>
-
-#include <mach/devices.h>
-#include <mach/hardware.h>
-#include <mach/irqs.h>
-#include <mach/msp.h>
-
-#include "ste-dma40-db8500.h"
-#include "board-mop500.h"
-#include "devices-db8500.h"
-#include "pins-db8500.h"
-
-static struct stedma40_chan_cfg msp0_dma_rx = {
- .high_priority = true,
- .dir = STEDMA40_PERIPH_TO_MEM,
-
- .src_dev_type = DB8500_DMA_DEV31_MSP0_RX_SLIM0_CH0_RX,
- .dst_dev_type = STEDMA40_DEV_DST_MEMORY,
-
- .src_info.psize = STEDMA40_PSIZE_LOG_4,
- .dst_info.psize = STEDMA40_PSIZE_LOG_4,
-
- /* data_width is set during configuration */
-};
-
-static struct stedma40_chan_cfg msp0_dma_tx = {
- .high_priority = true,
- .dir = STEDMA40_MEM_TO_PERIPH,
-
- .src_dev_type = STEDMA40_DEV_DST_MEMORY,
- .dst_dev_type = DB8500_DMA_DEV31_MSP0_TX_SLIM0_CH0_TX,
-
- .src_info.psize = STEDMA40_PSIZE_LOG_4,
- .dst_info.psize = STEDMA40_PSIZE_LOG_4,
-
- /* data_width is set during configuration */
-};
-
-struct msp_i2s_platform_data msp0_platform_data = {
- .id = MSP_I2S_0,
- .msp_i2s_dma_rx = &msp0_dma_rx,
- .msp_i2s_dma_tx = &msp0_dma_tx,
-};
-
-static struct stedma40_chan_cfg msp1_dma_rx = {
- .high_priority = true,
- .dir = STEDMA40_PERIPH_TO_MEM,
-
- .src_dev_type = DB8500_DMA_DEV30_MSP3_RX,
- .dst_dev_type = STEDMA40_DEV_DST_MEMORY,
-
- .src_info.psize = STEDMA40_PSIZE_LOG_4,
- .dst_info.psize = STEDMA40_PSIZE_LOG_4,
-
- /* data_width is set during configuration */
-};
-
-static struct stedma40_chan_cfg msp1_dma_tx = {
- .high_priority = true,
- .dir = STEDMA40_MEM_TO_PERIPH,
-
- .src_dev_type = STEDMA40_DEV_DST_MEMORY,
- .dst_dev_type = DB8500_DMA_DEV30_MSP1_TX,
-
- .src_info.psize = STEDMA40_PSIZE_LOG_4,
- .dst_info.psize = STEDMA40_PSIZE_LOG_4,
-
- /* data_width is set during configuration */
-};
-
-struct msp_i2s_platform_data msp1_platform_data = {
- .id = MSP_I2S_1,
- .msp_i2s_dma_rx = NULL,
- .msp_i2s_dma_tx = &msp1_dma_tx,
-};
-
-static struct stedma40_chan_cfg msp2_dma_rx = {
- .high_priority = true,
- .dir = STEDMA40_PERIPH_TO_MEM,
-
- .src_dev_type = DB8500_DMA_DEV14_MSP2_RX,
- .dst_dev_type = STEDMA40_DEV_DST_MEMORY,
-
- /* MSP2 DMA doesn't work with PSIZE == 4 on DB8500v2 */
- .src_info.psize = STEDMA40_PSIZE_LOG_1,
- .dst_info.psize = STEDMA40_PSIZE_LOG_1,
-
- /* data_width is set during configuration */
-};
-
-static struct stedma40_chan_cfg msp2_dma_tx = {
- .high_priority = true,
- .dir = STEDMA40_MEM_TO_PERIPH,
-
- .src_dev_type = STEDMA40_DEV_DST_MEMORY,
- .dst_dev_type = DB8500_DMA_DEV14_MSP2_TX,
-
- .src_info.psize = STEDMA40_PSIZE_LOG_4,
- .dst_info.psize = STEDMA40_PSIZE_LOG_4,
-
- .use_fixed_channel = true,
- .phy_channel = 1,
-
- /* data_width is set during configuration */
-};
-
-static struct platform_device *db8500_add_msp_i2s(struct device *parent,
- int id,
- resource_size_t base, int irq,
- struct msp_i2s_platform_data *pdata)
-{
- struct platform_device *pdev;
- struct resource res[] = {
- DEFINE_RES_MEM(base, SZ_4K),
- DEFINE_RES_IRQ(irq),
- };
-
- pr_info("Register platform-device 'ux500-msp-i2s', id %d, irq %d\n",
- id, irq);
- pdev = platform_device_register_resndata(parent, "ux500-msp-i2s", id,
- res, ARRAY_SIZE(res),
- pdata, sizeof(*pdata));
- if (!pdev) {
- pr_err("Failed to register platform-device 'ux500-msp-i2s.%d'!\n",
- id);
- return NULL;
- }
-
- return pdev;
-}
-
-/* Platform device for ASoC MOP500 machine */
-static struct platform_device snd_soc_mop500 = {
- .name = "snd-soc-mop500",
- .id = 0,
- .dev = {
- .platform_data = NULL,
- },
-};
-
-/* Platform device for Ux500-PCM */
-static struct platform_device ux500_pcm = {
- .name = "ux500-pcm",
- .id = 0,
- .dev = {
- .platform_data = NULL,
- },
-};
-
-struct msp_i2s_platform_data msp2_platform_data = {
- .id = MSP_I2S_2,
- .msp_i2s_dma_rx = &msp2_dma_rx,
- .msp_i2s_dma_tx = &msp2_dma_tx,
-};
-
-struct msp_i2s_platform_data msp3_platform_data = {
- .id = MSP_I2S_3,
- .msp_i2s_dma_rx = &msp1_dma_rx,
- .msp_i2s_dma_tx = NULL,
-};
-
-/* Due for removal once the MSP driver has been fully DT:ed. */
-void mop500_of_msp_init(struct device *parent)
-{
- pr_info("%s: Register platform-device 'ux500-pcm'\n", __func__);
- platform_device_register(&ux500_pcm);
-}
-
-void mop500_msp_init(struct device *parent)
-{
- pr_info("%s: Register platform-device 'snd-soc-mop500'.\n", __func__);
- platform_device_register(&snd_soc_mop500);
-
- pr_info("Initialize MSP I2S-devices.\n");
- db8500_add_msp_i2s(parent, 0, U8500_MSP0_BASE, IRQ_DB8500_MSP0,
- &msp0_platform_data);
- db8500_add_msp_i2s(parent, 1, U8500_MSP1_BASE, IRQ_DB8500_MSP1,
- &msp1_platform_data);
- db8500_add_msp_i2s(parent, 2, U8500_MSP2_BASE, IRQ_DB8500_MSP2,
- &msp2_platform_data);
- db8500_add_msp_i2s(parent, 3, U8500_MSP3_BASE, IRQ_DB8500_MSP1,
- &msp3_platform_data);
-
- pr_info("%s: Register platform-device 'ux500-pcm'\n", __func__);
- platform_device_register(&ux500_pcm);
-}
diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c
index 0c141d5..7152635 100644
--- a/arch/arm/mach-ux500/board-mop500.c
+++ b/arch/arm/mach-ux500/board-mop500.c
@@ -607,7 +607,7 @@ static void __init mop500_init_machine(void)
mop500_i2c_init(parent);
mop500_sdi_init(parent);
mop500_spi_init(parent);
- mop500_msp_init(parent);
+ mop500_audio_init(parent);
mop500_uart_init(parent);
u8500_cryp1_hash1_init(parent);
@@ -641,7 +641,7 @@ static void __init snowball_init_machine(void)
mop500_i2c_init(parent);
snowball_sdi_init(parent);
mop500_spi_init(parent);
- mop500_msp_init(parent);
+ mop500_audio_init(parent);
mop500_uart_init(parent);
/* This board has full regulator constraints */
@@ -673,7 +673,7 @@ static void __init hrefv60_init_machine(void)
mop500_i2c_init(parent);
hrefv60_sdi_init(parent);
mop500_spi_init(parent);
- mop500_msp_init(parent);
+ mop500_audio_init(parent);
mop500_uart_init(parent);
i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
@@ -807,7 +807,7 @@ static void __init u8500_init_machine(void)
ARRAY_SIZE(mop500_platform_devs));
mop500_sdi_init(parent);
- mop500_msp_init(parent);
+ mop500_audio_init(parent);
i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
i2c_register_board_info(2, mop500_i2c2_devices,
@@ -816,7 +816,7 @@ static void __init u8500_init_machine(void)
mop500_uib_init();
} else if (of_machine_is_compatible("calaosystems,snowball-a9500")) {
- mop500_of_msp_init(parent);
+ mop500_of_audio_init(parent);
} else if (of_machine_is_compatible("st-ericsson,hrefv60+")) {
/*
* The HREFv60 board removed a GPIO expander and routed
@@ -828,7 +828,7 @@ static void __init u8500_init_machine(void)
ARRAY_SIZE(mop500_platform_devs));
hrefv60_sdi_init(parent);
- mop500_msp_init(parent);
+ mop500_audio_init(parent);
i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
i2c0_devs -= NUM_PRE_V60_I2C0_DEVICES;
diff --git a/arch/arm/mach-ux500/board-mop500.h b/arch/arm/mach-ux500/board-mop500.h
index 3fbf48f..9e9dd5a 100644
--- a/arch/arm/mach-ux500/board-mop500.h
+++ b/arch/arm/mach-ux500/board-mop500.h
@@ -97,9 +97,9 @@ void __init mop500_stuib_init(void);
void __init mop500_pinmaps_init(void);
void __init snowball_pinmaps_init(void);
void __init hrefv60_pinmaps_init(void);
-void mop500_msp_init(struct device *parent);
+void mop500_audio_init(struct device *parent);
/* Due for removal once the MSP driver has been fully DT:ed. */
-void mop500_of_msp_init(struct device *parent);
+void mop500_of_audio_init(struct device *parent);
int __init mop500_uib_init(void);
void mop500_uib_i2c_add(int busnum, struct i2c_board_info *info,
--
1.7.9.5
Here we document the AB8500 Audio CODEC in the existing MFD AB8500 document.
CC: [email protected]
Acked-by: Linus Walleij <[email protected]>
Signed-off-by: Lee Jones <[email protected]>
---
Documentation/devicetree/bindings/mfd/ab8500.txt | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/Documentation/devicetree/bindings/mfd/ab8500.txt b/Documentation/devicetree/bindings/mfd/ab8500.txt
index 69e757a..ce83c8d 100644
--- a/Documentation/devicetree/bindings/mfd/ab8500.txt
+++ b/Documentation/devicetree/bindings/mfd/ab8500.txt
@@ -23,6 +23,7 @@ Device IRQ Names Supply Names Description
ab8500-bm : : : Battery Manager
ab8500-btemp : : : Battery Temperature
ab8500-charger : : : Battery Charger
+ab8500-codec : : : Audio Codec
ab8500-fg : : : Fuel Gauge
ab8500-gpadc : HW_CONV_END : vddadc : Analogue to Digital Converter
SW_CONV_END : :
@@ -52,6 +53,14 @@ Optional child device properties:
supplied in the interrupts property
- <supply_name>-supply : contains a phandle to the regulator supply node in Device Tree
+Non-standard child device properties:
+ - Audio CODEC:
+ - stericsson,amic[1|2]-type-single-ended : Single-ended Analoge Mic (default: differential)
+ - stericsson,amic1a-bias-vamic2 : Analoge Mic wishes to use a non-standard Vamic
+ - stericsson,amic1b-bias-vamic2 : Analoge Mic wishes to use a non-standard Vamic
+ - stericsson,amic2-bias-vamic1 : Analoge Mic wishes to use a non-standard Vamic
+ - stericsson,earpeice-cmv : Earpeice voltage (only: 950 | 1100 | 1270 | 1580)
+
ab8500@5 {
compatible = "stericsson,ab8500";
reg = <5>; /* mailbox 5 is i2c */
@@ -110,6 +119,12 @@ ab8500@5 {
compatible = "stericsson,ab8500-pwm";
};
+ codec: ab8500-codec {
+ compatible = "stericsson,ab8500-codec";
+
+ stericsson,earpeice-cmv = <950>; /* Units in mV. */
+ };
+
ab8500-regulators {
compatible = "stericsson,ab8500-regulator";
--
1.7.9.5
This is where we link together all of the SoC sound components for
a given platform. This all encompassing sound node is only found
in the very lowest hierarchical DTS file, since the component mix may
well change from board variant to board variant.
Acked-by: Linus Walleij <[email protected]>
Signed-off-by: Lee Jones <[email protected]>
---
arch/arm/boot/dts/snowball.dts | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/arch/arm/boot/dts/snowball.dts b/arch/arm/boot/dts/snowball.dts
index fce4a00..2969997 100644
--- a/arch/arm/boot/dts/snowball.dts
+++ b/arch/arm/boot/dts/snowball.dts
@@ -83,6 +83,14 @@
};
soc-u9500 {
+
+ sound {
+ compatible = "stericsson,snd-soc-mop500";
+
+ stericsson,cpu-dai = <&msp1 &msp3>;
+ stericsson,audio-codec = <&codec>;
+ };
+
msp1: msp@80124000 {
status = "okay";
};
--
1.7.9.5
This patch inserts all known MSP devices into the DBx5x0 Device Tree
disabled and enables the two important ones for the Snowball low-cost
development board.
Acked-by: Linus Walleij <[email protected]>
Signed-off-by: Lee Jones <[email protected]>
---
arch/arm/boot/dts/dbx5x0.dtsi | 33 +++++++++++++++++++++++++++++++++
arch/arm/boot/dts/snowball.dts | 8 ++++++++
2 files changed, 41 insertions(+)
diff --git a/arch/arm/boot/dts/dbx5x0.dtsi b/arch/arm/boot/dts/dbx5x0.dtsi
index 7f8c9db..b297957 100644
--- a/arch/arm/boot/dts/dbx5x0.dtsi
+++ b/arch/arm/boot/dts/dbx5x0.dtsi
@@ -586,6 +586,39 @@
status = "disabled";
};
+ msp0: msp@80123000 {
+ compatible = "stericsson,ux500-msp-i2s";
+ reg = <0x80123000 0x1000>;
+ interrupts = <0 31 0x4>;
+ v-ape-supply = <&db8500_vape_reg>;
+ status = "disabled";
+ };
+
+ msp1: msp@80124000 {
+ compatible = "stericsson,ux500-msp-i2s";
+ reg = <0x80124000 0x1000>;
+ interrupts = <0 62 0x4>;
+ v-ape-supply = <&db8500_vape_reg>;
+ status = "disabled";
+ };
+
+ // HDMI sound
+ msp2: msp@80117000 {
+ compatible = "stericsson,ux500-msp-i2s";
+ reg = <0x80117000 0x1000>;
+ interrupts = <0 98 0x4>;
+ v-ape-supply = <&db8500_vape_reg>;
+ status = "disabled";
+ };
+
+ msp3: msp@80125000 {
+ compatible = "stericsson,ux500-msp-i2s";
+ reg = <0x80125000 0x1000>;
+ interrupts = <0 62 0x4>;
+ v-ape-supply = <&db8500_vape_reg>;
+ status = "disabled";
+ };
+
external-bus@50000000 {
compatible = "simple-bus";
reg = <0x50000000 0x4000000>;
diff --git a/arch/arm/boot/dts/snowball.dts b/arch/arm/boot/dts/snowball.dts
index df6fc57..fce4a00 100644
--- a/arch/arm/boot/dts/snowball.dts
+++ b/arch/arm/boot/dts/snowball.dts
@@ -83,6 +83,14 @@
};
soc-u9500 {
+ msp1: msp@80124000 {
+ status = "okay";
+ };
+
+ msp3: msp@80125000 {
+ status = "okay";
+ };
+
external-bus@50000000 {
status = "okay";
--
1.7.9.5
Includes removal of duplicate debug print affirming entry into
the probe function, an unnecessary line break of a coding line
<80 chars and a white space change (unintentional tab).
Signed-off-by: Lee Jones <[email protected]>
---
sound/soc/ux500/mop500.c | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/sound/soc/ux500/mop500.c b/sound/soc/ux500/mop500.c
index 6840df7..356611d 100644
--- a/sound/soc/ux500/mop500.c
+++ b/sound/soc/ux500/mop500.c
@@ -88,8 +88,6 @@ static int __devinit mop500_probe(struct platform_device *pdev)
struct device_node *np = pdev->dev.of_node;
int ret;
- pr_debug("%s: Enter.\n", __func__);
-
dev_dbg(&pdev->dev, "%s: Enter.\n", __func__);
mop500_card.dev = &pdev->dev;
@@ -117,8 +115,7 @@ static int __devinit mop500_probe(struct platform_device *pdev)
ret = snd_soc_register_card(&mop500_card);
if (ret)
dev_err(&pdev->dev,
- "Error: snd_soc_register_card failed (%d)!\n",
- ret);
+ "Error: snd_soc_register_card failed (%d)!\n", ret);
return ret;
}
@@ -131,7 +128,7 @@ static int __devexit mop500_remove(struct platform_device *pdev)
snd_soc_unregister_card(mop500_card);
mop500_ab8500_remove(mop500_card);
-
+
return 0;
}
--
1.7.9.5
This patch removes platform device registration of all 4 MSP
devices. It also takes care of all redundant infrastructure now
that each of the ux500 audio components have been Device Tree
enabled.
Acked-by: Linus Walleij <[email protected]>
Signed-off-by: Lee Jones <[email protected]>
---
arch/arm/mach-ux500/board-mop500-msp.c | 10 ----------
1 file changed, 10 deletions(-)
diff --git a/arch/arm/mach-ux500/board-mop500-msp.c b/arch/arm/mach-ux500/board-mop500-msp.c
index 41e4df2..2af017f 100644
--- a/arch/arm/mach-ux500/board-mop500-msp.c
+++ b/arch/arm/mach-ux500/board-mop500-msp.c
@@ -175,16 +175,6 @@ struct msp_i2s_platform_data msp3_platform_data = {
/* Due for removal once the MSP driver has been fully DT:ed. */
void mop500_of_msp_init(struct device *parent)
{
- pr_info("Initialize MSP I2S-devices.\n");
- db8500_add_msp_i2s(parent, 0, U8500_MSP0_BASE, IRQ_DB8500_MSP0,
- &msp0_platform_data);
- db8500_add_msp_i2s(parent, 1, U8500_MSP1_BASE, IRQ_DB8500_MSP1,
- &msp1_platform_data);
- db8500_add_msp_i2s(parent, 2, U8500_MSP2_BASE, IRQ_DB8500_MSP2,
- &msp2_platform_data);
- db8500_add_msp_i2s(parent, 3, U8500_MSP3_BASE, IRQ_DB8500_MSP1,
- &msp3_platform_data);
-
pr_info("%s: Register platform-device 'ux500-pcm'\n", __func__);
platform_device_register(&ux500_pcm);
}
--
1.7.9.5
Register both parts of the MSP driver from Device Tree so that they
are probed when Device Tree is enabled. Also, as there is platform
data involved, we ensure that there is allocated memory to place the
configuration into and that the correct information is extracted from
the DT binary.
CC: [email protected]
Acked-by: Linus Walleij <[email protected]>
Signed-off-by: Lee Jones <[email protected]>
---
sound/soc/ux500/ux500_msp_dai.c | 6 ++++++
sound/soc/ux500/ux500_msp_i2s.c | 22 +++++++++++++++++++---
2 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/sound/soc/ux500/ux500_msp_dai.c b/sound/soc/ux500/ux500_msp_dai.c
index 772cb19..0f7dd49 100644
--- a/sound/soc/ux500/ux500_msp_dai.c
+++ b/sound/soc/ux500/ux500_msp_dai.c
@@ -833,10 +833,16 @@ static int __devexit ux500_msp_drv_remove(struct platform_device *pdev)
return 0;
}
+static const struct of_device_id ux500_msp_i2c_match[] = {
+ { .compatible = "stericsson,ux500-msp-i2s", },
+ {},
+};
+
static struct platform_driver msp_i2s_driver = {
.driver = {
.name = "ux500-msp-i2s",
.owner = THIS_MODULE,
+ .of_match_table = ux500_msp_i2c_match,
},
.probe = ux500_msp_drv_probe,
.remove = ux500_msp_drv_remove,
diff --git a/sound/soc/ux500/ux500_msp_i2s.c b/sound/soc/ux500/ux500_msp_i2s.c
index 08813c5..cb7bdae 100644
--- a/sound/soc/ux500/ux500_msp_i2s.c
+++ b/sound/soc/ux500/ux500_msp_i2s.c
@@ -18,6 +18,7 @@
#include <linux/pinctrl/consumer.h>
#include <linux/delay.h>
#include <linux/slab.h>
+#include <linux/of.h>
#include <mach/hardware.h>
#include <mach/msp.h>
@@ -684,16 +685,31 @@ int ux500_msp_i2s_init_msp(struct platform_device *pdev,
int ret = 0;
struct resource *res = NULL;
struct i2s_controller *i2s_cont;
+ struct device_node *np = pdev->dev.of_node;
struct ux500_msp *msp;
- dev_dbg(&pdev->dev, "%s: Enter (name: %s, id: %d).\n", __func__,
- pdev->name, platform_data->id);
-
*msp_p = devm_kzalloc(&pdev->dev, sizeof(struct ux500_msp), GFP_KERNEL);
msp = *msp_p;
if (!msp)
return -ENOMEM;
+ if (np) {
+ if (!platform_data) {
+ platform_data = devm_kzalloc(&pdev->dev,
+ sizeof(struct msp_i2s_platform_data), GFP_KERNEL);
+ if (!platform_data)
+ ret = -ENOMEM;
+ }
+ } else
+ if (!platform_data)
+ ret = -EINVAL;
+
+ if (ret)
+ goto err_res;
+
+ dev_dbg(&pdev->dev, "%s: Enter (name: %s, id: %d).\n", __func__,
+ pdev->name, platform_data->id);
+
msp->id = platform_data->id;
msp->dev = &pdev->dev;
msp->dma_cfg_rx = platform_data->msp_i2s_dma_rx;
--
1.7.9.5
In this patch we prevent MOP500 driver registration from platform
code and rely solely on Device Tree to do the probing for us.
Acked-by: Linus Walleij <[email protected]>
Signed-off-by: Lee Jones <[email protected]>
---
arch/arm/mach-ux500/board-mop500-msp.c | 3 ---
1 file changed, 3 deletions(-)
diff --git a/arch/arm/mach-ux500/board-mop500-msp.c b/arch/arm/mach-ux500/board-mop500-msp.c
index ec802d0..41e4df2 100644
--- a/arch/arm/mach-ux500/board-mop500-msp.c
+++ b/arch/arm/mach-ux500/board-mop500-msp.c
@@ -175,9 +175,6 @@ struct msp_i2s_platform_data msp3_platform_data = {
/* Due for removal once the MSP driver has been fully DT:ed. */
void mop500_of_msp_init(struct device *parent)
{
- pr_info("%s: Register platform-device 'snd-soc-u8500'.\n", __func__);
- platform_device_register(&snd_soc_mop500);
-
pr_info("Initialize MSP I2S-devices.\n");
db8500_add_msp_i2s(parent, 0, U8500_MSP0_BASE, IRQ_DB8500_MSP0,
&msp0_platform_data);
--
1.7.9.5
It isn't currently possible to pass all platform specific configuration
though Device Tree. Thinks like device names used in the clock
infrastructure, call-backs and DMA information have to be passed in via
AUXDATA structures and the MSP is no exception. Here we're passing DMA
settings.
Acked-by: Linus Walleij <[email protected]>
Signed-off-by: Lee Jones <[email protected]>
---
arch/arm/mach-ux500/board-mop500-msp.c | 8 ++++----
arch/arm/mach-ux500/board-mop500.c | 9 +++++++++
arch/arm/mach-ux500/board-mop500.h | 5 +++++
3 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/arch/arm/mach-ux500/board-mop500-msp.c b/arch/arm/mach-ux500/board-mop500-msp.c
index 24a3604..ec802d0 100644
--- a/arch/arm/mach-ux500/board-mop500-msp.c
+++ b/arch/arm/mach-ux500/board-mop500-msp.c
@@ -49,7 +49,7 @@ static struct stedma40_chan_cfg msp0_dma_tx = {
/* data_width is set during configuration */
};
-static struct msp_i2s_platform_data msp0_platform_data = {
+struct msp_i2s_platform_data msp0_platform_data = {
.id = MSP_I2S_0,
.msp_i2s_dma_rx = &msp0_dma_rx,
.msp_i2s_dma_tx = &msp0_dma_tx,
@@ -81,7 +81,7 @@ static struct stedma40_chan_cfg msp1_dma_tx = {
/* data_width is set during configuration */
};
-static struct msp_i2s_platform_data msp1_platform_data = {
+struct msp_i2s_platform_data msp1_platform_data = {
.id = MSP_I2S_1,
.msp_i2s_dma_rx = NULL,
.msp_i2s_dma_tx = &msp1_dma_tx,
@@ -160,13 +160,13 @@ static struct platform_device ux500_pcm = {
},
};
-static struct msp_i2s_platform_data msp2_platform_data = {
+struct msp_i2s_platform_data msp2_platform_data = {
.id = MSP_I2S_2,
.msp_i2s_dma_rx = &msp2_dma_rx,
.msp_i2s_dma_tx = &msp2_dma_tx,
};
-static struct msp_i2s_platform_data msp3_platform_data = {
+struct msp_i2s_platform_data msp3_platform_data = {
.id = MSP_I2S_3,
.msp_i2s_dma_rx = &msp1_dma_rx,
.msp_i2s_dma_tx = NULL,
diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c
index 8f419b1..0c141d5 100644
--- a/arch/arm/mach-ux500/board-mop500.c
+++ b/arch/arm/mach-ux500/board-mop500.c
@@ -758,6 +758,15 @@ struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = {
OF_DEV_AUXDATA("st,nomadik-i2c", 0x8012a000, "nmk-i2c.4", NULL),
/* Requires device name bindings. */
OF_DEV_AUXDATA("stericsson,nmk_pinctrl", 0, "pinctrl-db8500", NULL),
+ /* Requires clock name and DMA bindings. */
+ OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80123000,
+ "ux500-msp-i2s.0", &msp0_platform_data),
+ OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80124000,
+ "ux500-msp-i2s.1", &msp1_platform_data),
+ OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80117000,
+ "ux500-msp-i2s.2", &msp2_platform_data),
+ OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80125000,
+ "ux500-msp-i2s.3", &msp3_platform_data),
{},
};
diff --git a/arch/arm/mach-ux500/board-mop500.h b/arch/arm/mach-ux500/board-mop500.h
index 1d7316b..3fbf48f 100644
--- a/arch/arm/mach-ux500/board-mop500.h
+++ b/arch/arm/mach-ux500/board-mop500.h
@@ -9,6 +9,7 @@
/* For NOMADIK_NR_GPIO */
#include <mach/irqs.h>
+#include <mach/msp.h>
#include <linux/amba/mmci.h>
/* Snowball specific GPIO assignments, this board has no GPIO expander */
@@ -81,6 +82,10 @@ struct device;
struct i2c_board_info;
extern struct mmci_platform_data mop500_sdi0_data;
extern struct mmci_platform_data mop500_sdi4_data;
+extern struct msp_i2s_platform_data msp0_platform_data;
+extern struct msp_i2s_platform_data msp1_platform_data;
+extern struct msp_i2s_platform_data msp2_platform_data;
+extern struct msp_i2s_platform_data msp3_platform_data;
extern struct arm_pmu_platdata db8500_pmu_platdata;
extern void mop500_sdi_init(struct device *parent);
--
1.7.9.5
We've done this before and it worked well last time. Here we're
duplicating a complex registration function to ease the process
of enabling it for Device Tree. As there are quite a few steps
taken during the registration process, it makes sense to break
them up into more manageable chunks. This patch will aid us.
Acked-by: Linus Walleij <[email protected]>
Signed-off-by: Lee Jones <[email protected]>
---
arch/arm/mach-ux500/board-mop500-msp.c | 20 ++++++++++++++++++++
arch/arm/mach-ux500/board-mop500.c | 2 +-
2 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/arch/arm/mach-ux500/board-mop500-msp.c b/arch/arm/mach-ux500/board-mop500-msp.c
index 1a67577..24a3604 100644
--- a/arch/arm/mach-ux500/board-mop500-msp.c
+++ b/arch/arm/mach-ux500/board-mop500-msp.c
@@ -172,6 +172,26 @@ static struct msp_i2s_platform_data msp3_platform_data = {
.msp_i2s_dma_tx = NULL,
};
+/* Due for removal once the MSP driver has been fully DT:ed. */
+void mop500_of_msp_init(struct device *parent)
+{
+ pr_info("%s: Register platform-device 'snd-soc-u8500'.\n", __func__);
+ platform_device_register(&snd_soc_mop500);
+
+ pr_info("Initialize MSP I2S-devices.\n");
+ db8500_add_msp_i2s(parent, 0, U8500_MSP0_BASE, IRQ_DB8500_MSP0,
+ &msp0_platform_data);
+ db8500_add_msp_i2s(parent, 1, U8500_MSP1_BASE, IRQ_DB8500_MSP1,
+ &msp1_platform_data);
+ db8500_add_msp_i2s(parent, 2, U8500_MSP2_BASE, IRQ_DB8500_MSP2,
+ &msp2_platform_data);
+ db8500_add_msp_i2s(parent, 3, U8500_MSP3_BASE, IRQ_DB8500_MSP1,
+ &msp3_platform_data);
+
+ pr_info("%s: Register platform-device 'ux500-pcm'\n", __func__);
+ platform_device_register(&ux500_pcm);
+}
+
void mop500_msp_init(struct device *parent)
{
pr_info("%s: Register platform-device 'snd-soc-mop500'.\n", __func__);
diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c
index 11dd962..8f419b1 100644
--- a/arch/arm/mach-ux500/board-mop500.c
+++ b/arch/arm/mach-ux500/board-mop500.c
@@ -807,7 +807,7 @@ static void __init u8500_init_machine(void)
mop500_uib_init();
} else if (of_machine_is_compatible("calaosystems,snowball-a9500")) {
- mop500_msp_init(parent);
+ mop500_of_msp_init(parent);
} else if (of_machine_is_compatible("st-ericsson,hrefv60+")) {
/*
* The HREFv60 board removed a GPIO expander and routed
--
1.7.9.5
We continue to allow the AB8500 CODEC to be registered via the AB8500
Multi Functional Device API, only this time we extract its configuration
from the Device Tree binary.
CC: [email protected]
Acked-by: Ola Lilja <[email protected]>
Acked-by: Linus Walleij <[email protected]>
Signed-off-by: Lee Jones <[email protected]>
---
include/linux/mfd/abx500/ab8500-codec.h | 6 ++-
sound/soc/codecs/ab8500-codec.c | 81 +++++++++++++++++++++++++++++++
2 files changed, 85 insertions(+), 2 deletions(-)
diff --git a/include/linux/mfd/abx500/ab8500-codec.h b/include/linux/mfd/abx500/ab8500-codec.h
index dc65292..d707941 100644
--- a/include/linux/mfd/abx500/ab8500-codec.h
+++ b/include/linux/mfd/abx500/ab8500-codec.h
@@ -23,7 +23,8 @@ enum amic_type {
/* Mic-biases */
enum amic_micbias {
AMIC_MICBIAS_VAMIC1,
- AMIC_MICBIAS_VAMIC2
+ AMIC_MICBIAS_VAMIC2,
+ AMIC_MICBIAS_UNKNOWN
};
/* Bias-voltage */
@@ -31,7 +32,8 @@ enum ear_cm_voltage {
EAR_CMV_0_95V,
EAR_CMV_1_10V,
EAR_CMV_1_27V,
- EAR_CMV_1_58V
+ EAR_CMV_1_58V,
+ EAR_CMV_UNKNOWN
};
/* Analog microphone settings */
diff --git a/sound/soc/codecs/ab8500-codec.c b/sound/soc/codecs/ab8500-codec.c
index 23b4018..99dffcf 100644
--- a/sound/soc/codecs/ab8500-codec.c
+++ b/sound/soc/codecs/ab8500-codec.c
@@ -34,6 +34,7 @@
#include <linux/mfd/abx500/ab8500-sysctrl.h>
#include <linux/mfd/abx500/ab8500-codec.h>
#include <linux/regulator/consumer.h>
+#include <linux/of.h>
#include <sound/core.h>
#include <sound/pcm.h>
@@ -2394,9 +2395,65 @@ struct snd_soc_dai_driver ab8500_codec_dai[] = {
}
};
+static void ab8500_codec_of_probe(struct device *dev, struct device_node *np,
+ struct ab8500_codec_platform_data *codec)
+{
+ u32 value;
+
+ if (of_get_property(np, "stericsson,amic1-type-single-ended", NULL))
+ codec->amics.mic1_type = AMIC_TYPE_SINGLE_ENDED;
+ else
+ codec->amics.mic1_type = AMIC_TYPE_DIFFERENTIAL;
+
+ if (of_get_property(np, "stericsson,amic2-type-single-ended", NULL))
+ codec->amics.mic2_type = AMIC_TYPE_SINGLE_ENDED;
+ else
+ codec->amics.mic2_type = AMIC_TYPE_DIFFERENTIAL;
+
+ /* Has a non-standard Vamic been requested? */
+ if (of_get_property(np, "stericsson,amic1a-bias-vamic2", NULL))
+ codec->amics.mic1a_micbias = AMIC_MICBIAS_VAMIC2;
+ else
+ codec->amics.mic1a_micbias = AMIC_MICBIAS_VAMIC1;
+
+ if (of_get_property(np, "stericsson,amic1b-bias-vamic2", NULL))
+ codec->amics.mic1b_micbias = AMIC_MICBIAS_VAMIC2;
+ else
+ codec->amics.mic1b_micbias = AMIC_MICBIAS_VAMIC1;
+
+ if (of_get_property(np, "stericsson,amic2-bias-vamic1", NULL))
+ codec->amics.mic2_micbias = AMIC_MICBIAS_VAMIC1;
+ else
+ codec->amics.mic2_micbias = AMIC_MICBIAS_VAMIC2;
+
+ if (!of_property_read_u32(np, "stericsson,earpeice-cmv", &value)) {
+ switch (value) {
+ case 950 :
+ codec->ear_cmv = EAR_CMV_0_95V;
+ break;
+ case 1100 :
+ codec->ear_cmv = EAR_CMV_1_10V;
+ break;
+ case 1270 :
+ codec->ear_cmv = EAR_CMV_1_27V;
+ break;
+ case 1580 :
+ codec->ear_cmv = EAR_CMV_1_58V;
+ break;
+ default :
+ codec->ear_cmv = EAR_CMV_UNKNOWN;
+ dev_err(dev, "Unsuitable earpiece voltage found in DT\n");
+ }
+ } else {
+ dev_warn(dev, "No earpiece voltage found in DT - using default\n");
+ codec->ear_cmv = EAR_CMV_0_95V;
+ }
+}
+
static int ab8500_codec_probe(struct snd_soc_codec *codec)
{
struct device *dev = codec->dev;
+ struct device_node *np = dev->of_node;
struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(dev);
struct ab8500_platform_data *pdata;
struct filter_control *fc;
@@ -2407,6 +2464,30 @@ static int ab8500_codec_probe(struct snd_soc_codec *codec)
/* Setup AB8500 according to board-settings */
pdata = (struct ab8500_platform_data *)dev_get_platdata(dev->parent);
+ if (np) {
+ if (!pdata)
+ pdata = devm_kzalloc(dev,
+ sizeof(struct ab8500_platform_data),
+ GFP_KERNEL);
+
+ if (pdata && !pdata->codec)
+ pdata->codec
+ = devm_kzalloc(dev,
+ sizeof(struct ab8500_codec_platform_data),
+ GFP_KERNEL);
+
+ if (!(pdata && pdata->codec))
+ return -ENOMEM;
+
+ ab8500_codec_of_probe(dev, np, pdata->codec);
+
+ } else {
+ if (!(pdata && pdata->codec)) {
+ dev_err(dev, "No codec platform data or DT found\n");
+ return -EINVAL;
+ }
+ }
+
/* Inform SoC Core that we have our own I/O arrangements. */
codec->control_data = (void *)true;
--
1.7.9.5
Here we add the required documentation for the new Device Tree
bindings pertaining to the MOP500 Audio Machine driver.
CC: [email protected]
Signed-off-by: Lee Jones <[email protected]>
---
.../devicetree/bindings/sound/ux500-mop500.txt | 39 ++++++++++++++++++++
1 file changed, 39 insertions(+)
create mode 100644 Documentation/devicetree/bindings/sound/ux500-mop500.txt
diff --git a/Documentation/devicetree/bindings/sound/ux500-mop500.txt b/Documentation/devicetree/bindings/sound/ux500-mop500.txt
new file mode 100644
index 0000000..48e071c
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/ux500-mop500.txt
@@ -0,0 +1,39 @@
+* MOP500 Audio Machine Driver
+
+This node is responsible for linking together all ux500 Audio Driver components.
+
+Required properties:
+ - compatible : "stericsson,snd-soc-mop500"
+
+Non-standard properties:
+ - stericsson,cpu-dai : Phandle to the CPU-side DAI
+ - stericsson,audio-codec : Phandle to the Audio CODEC
+ - stericsson,card-name : Over-ride default card name
+
+Example:
+
+ sound {
+ compatible = "stericsson,snd-soc-mop500";
+
+ stericsson,cpu-dai = <&msp1 &msp3>;
+ stericsson,audio-codec = <&codec>;
+ };
+
+ msp1: msp@80124000 {
+ compatible = "stericsson,ux500-msp-i2s";
+ reg = <0x80124000 0x1000>;
+ interrupts = <0 62 0x4>;
+ v-ape-supply = <&db8500_vape_reg>;
+ };
+
+ msp3: msp@80125000 {
+ compatible = "stericsson,ux500-msp-i2s";
+ reg = <0x80125000 0x1000>;
+ interrupts = <0 62 0x4>;
+ v-ape-supply = <&db8500_vape_reg>;
+ };
+
+ codec: ab8500-codec {
+ compatible = "stericsson,ab8500-codec";
+ stericsson,earpeice-cmv = <950>; /* Units in mV. */
+ };
--
1.7.9.5
Here we add the required documentation for the new Device Tree
bindings pertaining to the MSP CPU-side DAI Driver.
CC: [email protected]
Signed-off-by: Lee Jones <[email protected]>
---
.../devicetree/bindings/sound/ux500-msp.txt | 43 ++++++++++++++++++++
1 file changed, 43 insertions(+)
create mode 100644 Documentation/devicetree/bindings/sound/ux500-msp.txt
diff --git a/Documentation/devicetree/bindings/sound/ux500-msp.txt b/Documentation/devicetree/bindings/sound/ux500-msp.txt
new file mode 100644
index 0000000..99acd9c
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/ux500-msp.txt
@@ -0,0 +1,43 @@
+* ux500 MSP (CPU-side Digital Audio Interface)
+
+Required properties:
+ - compatible :"stericsson,ux500-msp-i2s"
+ - reg : Physical base address and length of the device's registers.
+
+Optional properties:
+ - interrupts : The interrupt output from the device.
+ - interrupt-parent : The parent interrupt controller.
+ - <name>-supply : Phandle to the regulator <name> supply
+
+Example:
+
+ sound {
+ compatible = "stericsson,snd-soc-mop500";
+
+ stericsson,platform-pcm-dma = <&pcm>;
+ stericsson,cpu-dai = <&msp1 &msp3>;
+ stericsson,audio-codec = <&codec>;
+ };
+
+ pcm: ux500-pcm {
+ compatible = "stericsson,ux500-pcm";
+ };
+
+ msp1: msp@80124000 {
+ compatible = "stericsson,ux500-msp-i2s";
+ reg = <0x80124000 0x1000>;
+ interrupts = <0 62 0x4>;
+ v-ape-supply = <&db8500_vape_reg>;
+ };
+
+ msp3: msp@80125000 {
+ compatible = "stericsson,ux500-msp-i2s";
+ reg = <0x80125000 0x1000>;
+ interrupts = <0 62 0x4>;
+ v-ape-supply = <&db8500_vape_reg>;
+ };
+
+ codec: ab8500-codec {
+ compatible = "stericsson,ab8500-codec";
+ stericsson,earpeice-cmv = <950>; /* Units in mV. */
+ };
--
1.7.9.5
This patch contains a couple of general MSP clean-ups pertaining to
layout changes and changing functions to be void instead of int instead
of regardlessly returning '0'.
Acked-by: Linus Walleij <[email protected]>
Signed-off-by: Lee Jones <[email protected]>
---
arch/arm/mach-ux500/board-mop500-msp.c | 24 +++++++++++-------------
arch/arm/mach-ux500/board-mop500-msp.h | 14 --------------
arch/arm/mach-ux500/board-mop500.c | 1 -
arch/arm/mach-ux500/board-mop500.h | 3 +++
4 files changed, 14 insertions(+), 28 deletions(-)
delete mode 100644 arch/arm/mach-ux500/board-mop500-msp.h
diff --git a/arch/arm/mach-ux500/board-mop500-msp.c b/arch/arm/mach-ux500/board-mop500-msp.c
index fc78d5d..1a67577 100644
--- a/arch/arm/mach-ux500/board-mop500-msp.c
+++ b/arch/arm/mach-ux500/board-mop500-msp.c
@@ -144,20 +144,20 @@ static struct platform_device *db8500_add_msp_i2s(struct device *parent,
/* Platform device for ASoC MOP500 machine */
static struct platform_device snd_soc_mop500 = {
- .name = "snd-soc-mop500",
- .id = 0,
- .dev = {
- .platform_data = NULL,
- },
+ .name = "snd-soc-mop500",
+ .id = 0,
+ .dev = {
+ .platform_data = NULL,
+ },
};
/* Platform device for Ux500-PCM */
static struct platform_device ux500_pcm = {
- .name = "ux500-pcm",
- .id = 0,
- .dev = {
- .platform_data = NULL,
- },
+ .name = "ux500-pcm",
+ .id = 0,
+ .dev = {
+ .platform_data = NULL,
+ },
};
static struct msp_i2s_platform_data msp2_platform_data = {
@@ -172,7 +172,7 @@ static struct msp_i2s_platform_data msp3_platform_data = {
.msp_i2s_dma_tx = NULL,
};
-int mop500_msp_init(struct device *parent)
+void mop500_msp_init(struct device *parent)
{
pr_info("%s: Register platform-device 'snd-soc-mop500'.\n", __func__);
platform_device_register(&snd_soc_mop500);
@@ -189,6 +189,4 @@ int mop500_msp_init(struct device *parent)
pr_info("%s: Register platform-device 'ux500-pcm'\n", __func__);
platform_device_register(&ux500_pcm);
-
- return 0;
}
diff --git a/arch/arm/mach-ux500/board-mop500-msp.h b/arch/arm/mach-ux500/board-mop500-msp.h
deleted file mode 100644
index 6fcfb5e..0000000
--- a/arch/arm/mach-ux500/board-mop500-msp.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * Copyright (C) ST-Ericsson SA 2012
- *
- * Author: Ola Lilja <[email protected]>,
- * for ST-Ericsson.
- *
- * License terms:
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as published
- * by the Free Software Foundation.
- */
-
-void mop500_msp_init(struct device *parent);
diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c
index 5d9600b..11dd962 100644
--- a/arch/arm/mach-ux500/board-mop500.c
+++ b/arch/arm/mach-ux500/board-mop500.c
@@ -54,7 +54,6 @@
#include "devices-db8500.h"
#include "board-mop500.h"
#include "board-mop500-regulators.h"
-#include "board-mop500-msp.h"
static struct gpio_led snowball_led_array[] = {
{
diff --git a/arch/arm/mach-ux500/board-mop500.h b/arch/arm/mach-ux500/board-mop500.h
index d04a8e6..1d7316b 100644
--- a/arch/arm/mach-ux500/board-mop500.h
+++ b/arch/arm/mach-ux500/board-mop500.h
@@ -92,6 +92,9 @@ void __init mop500_stuib_init(void);
void __init mop500_pinmaps_init(void);
void __init snowball_pinmaps_init(void);
void __init hrefv60_pinmaps_init(void);
+void mop500_msp_init(struct device *parent);
+/* Due for removal once the MSP driver has been fully DT:ed. */
+void mop500_of_msp_init(struct device *parent);
int __init mop500_uib_init(void);
void mop500_uib_i2c_add(int busnum, struct i2c_board_info *info,
--
1.7.9.5
In the initial submission of the MSP driver msp1 and msp3's associated
pinctrl mechanism was passed back to platform code using a plat_init()
call-back routine, but it has no place in platform code. The MSP driver
should set this up for the appropriate ports. Instead we use a use_pinctrl
identifier which is passed from platform_data/Device Tree which indicates
which ports should use pinctrl.
CC: [email protected]
Signed-off-by: Lee Jones <[email protected]>
---
arch/arm/mach-ux500/board-mop500-msp.c | 75 +-------------------------------
arch/arm/mach-ux500/include/mach/msp.h | 2 -
sound/soc/ux500/ux500_msp_i2s.c | 67 +++++++++++++++++++++-------
sound/soc/ux500/ux500_msp_i2s.h | 8 +++-
4 files changed, 58 insertions(+), 94 deletions(-)
diff --git a/arch/arm/mach-ux500/board-mop500-msp.c b/arch/arm/mach-ux500/board-mop500-msp.c
index df15646..fc78d5d 100644
--- a/arch/arm/mach-ux500/board-mop500-msp.c
+++ b/arch/arm/mach-ux500/board-mop500-msp.c
@@ -23,53 +23,6 @@
#include "devices-db8500.h"
#include "pins-db8500.h"
-/* MSP1/3 Tx/Rx usage protection */
-static DEFINE_SPINLOCK(msp_rxtx_lock);
-
-/* Reference Count */
-static int msp_rxtx_ref;
-
-/* Pin modes */
-struct pinctrl *msp1_p;
-struct pinctrl_state *msp1_def;
-struct pinctrl_state *msp1_sleep;
-
-int msp13_i2s_init(void)
-{
- int retval = 0;
- unsigned long flags;
-
- spin_lock_irqsave(&msp_rxtx_lock, flags);
- if (msp_rxtx_ref == 0 && !(IS_ERR(msp1_p) || IS_ERR(msp1_def))) {
- retval = pinctrl_select_state(msp1_p, msp1_def);
- if (retval)
- pr_err("could not set MSP1 defstate\n");
- }
- if (!retval)
- msp_rxtx_ref++;
- spin_unlock_irqrestore(&msp_rxtx_lock, flags);
-
- return retval;
-}
-
-int msp13_i2s_exit(void)
-{
- int retval = 0;
- unsigned long flags;
-
- spin_lock_irqsave(&msp_rxtx_lock, flags);
- WARN_ON(!msp_rxtx_ref);
- msp_rxtx_ref--;
- if (msp_rxtx_ref == 0 && !(IS_ERR(msp1_p) || IS_ERR(msp1_sleep))) {
- retval = pinctrl_select_state(msp1_p, msp1_sleep);
- if (retval)
- pr_err("could not set MSP1 sleepstate\n");
- }
- spin_unlock_irqrestore(&msp_rxtx_lock, flags);
-
- return retval;
-}
-
static struct stedma40_chan_cfg msp0_dma_rx = {
.high_priority = true,
.dir = STEDMA40_PERIPH_TO_MEM,
@@ -132,8 +85,6 @@ static struct msp_i2s_platform_data msp1_platform_data = {
.id = MSP_I2S_1,
.msp_i2s_dma_rx = NULL,
.msp_i2s_dma_tx = &msp1_dma_tx,
- .msp_i2s_init = msp13_i2s_init,
- .msp_i2s_exit = msp13_i2s_exit,
};
static struct stedma40_chan_cfg msp2_dma_rx = {
@@ -219,47 +170,23 @@ static struct msp_i2s_platform_data msp3_platform_data = {
.id = MSP_I2S_3,
.msp_i2s_dma_rx = &msp1_dma_rx,
.msp_i2s_dma_tx = NULL,
- .msp_i2s_init = msp13_i2s_init,
- .msp_i2s_exit = msp13_i2s_exit,
};
int mop500_msp_init(struct device *parent)
{
- struct platform_device *msp1;
-
pr_info("%s: Register platform-device 'snd-soc-mop500'.\n", __func__);
platform_device_register(&snd_soc_mop500);
pr_info("Initialize MSP I2S-devices.\n");
db8500_add_msp_i2s(parent, 0, U8500_MSP0_BASE, IRQ_DB8500_MSP0,
&msp0_platform_data);
- msp1 = db8500_add_msp_i2s(parent, 1, U8500_MSP1_BASE, IRQ_DB8500_MSP1,
+ db8500_add_msp_i2s(parent, 1, U8500_MSP1_BASE, IRQ_DB8500_MSP1,
&msp1_platform_data);
db8500_add_msp_i2s(parent, 2, U8500_MSP2_BASE, IRQ_DB8500_MSP2,
&msp2_platform_data);
db8500_add_msp_i2s(parent, 3, U8500_MSP3_BASE, IRQ_DB8500_MSP1,
&msp3_platform_data);
- /* Get the pinctrl handle for MSP1 */
- if (msp1) {
- msp1_p = pinctrl_get(&msp1->dev);
- if (IS_ERR(msp1_p))
- dev_err(&msp1->dev, "could not get MSP1 pinctrl\n");
- else {
- msp1_def = pinctrl_lookup_state(msp1_p,
- PINCTRL_STATE_DEFAULT);
- if (IS_ERR(msp1_def)) {
- dev_err(&msp1->dev,
- "could not get MSP1 defstate\n");
- }
- msp1_sleep = pinctrl_lookup_state(msp1_p,
- PINCTRL_STATE_SLEEP);
- if (IS_ERR(msp1_sleep))
- dev_err(&msp1->dev,
- "could not get MSP1 idlestate\n");
- }
- }
-
pr_info("%s: Register platform-device 'ux500-pcm'\n", __func__);
platform_device_register(&ux500_pcm);
diff --git a/arch/arm/mach-ux500/include/mach/msp.h b/arch/arm/mach-ux500/include/mach/msp.h
index 798be19..3cc7142 100644
--- a/arch/arm/mach-ux500/include/mach/msp.h
+++ b/arch/arm/mach-ux500/include/mach/msp.h
@@ -22,8 +22,6 @@ struct msp_i2s_platform_data {
enum msp_i2s_id id;
struct stedma40_chan_cfg *msp_i2s_dma_rx;
struct stedma40_chan_cfg *msp_i2s_dma_tx;
- int (*msp_i2s_init) (void);
- int (*msp_i2s_exit) (void);
};
#endif
diff --git a/sound/soc/ux500/ux500_msp_i2s.c b/sound/soc/ux500/ux500_msp_i2s.c
index 36be11e..08813c5 100644
--- a/sound/soc/ux500/ux500_msp_i2s.c
+++ b/sound/soc/ux500/ux500_msp_i2s.c
@@ -15,6 +15,7 @@
#include <linux/module.h>
#include <linux/platform_device.h>
+#include <linux/pinctrl/consumer.h>
#include <linux/delay.h>
#include <linux/slab.h>
@@ -25,6 +26,9 @@
#include "ux500_msp_i2s.h"
+/* MSP1/3 Tx/Rx usage protection */
+static DEFINE_SPINLOCK(msp_rxtx_lock);
+
/* Protocol desciptors */
static const struct msp_protdesc prot_descs[] = {
{ /* I2S */
@@ -352,17 +356,23 @@ static int configure_multichannel(struct ux500_msp *msp,
static int enable_msp(struct ux500_msp *msp, struct ux500_msp_config *config)
{
- int status = 0;
+ int status = 0, retval = 0;
u32 reg_val_DMACR, reg_val_GCR;
+ unsigned long flags;
/* Check msp state whether in RUN or CONFIGURED Mode */
- if ((msp->msp_state == MSP_STATE_IDLE) && (msp->plat_init)) {
- status = msp->plat_init();
- if (status) {
- dev_err(msp->dev, "%s: ERROR: Failed to init MSP (%d)!\n",
- __func__, status);
- return status;
+ if (msp->msp_state == MSP_STATE_IDLE) {
+ spin_lock_irqsave(&msp_rxtx_lock, flags);
+ if (msp->pinctrl_rxtx_ref == 0 &&
+ !(IS_ERR(msp->pinctrl_p) || IS_ERR(msp->pinctrl_def))) {
+ retval = pinctrl_select_state(msp->pinctrl_p,
+ msp->pinctrl_def);
+ if (retval)
+ pr_err("could not set MSP defstate\n");
}
+ if (!retval)
+ msp->pinctrl_rxtx_ref++;
+ spin_unlock_irqrestore(&msp_rxtx_lock, flags);
}
/* Configure msp with protocol dependent settings */
@@ -620,7 +630,8 @@ int ux500_msp_i2s_trigger(struct ux500_msp *msp, int cmd, int direction)
int ux500_msp_i2s_close(struct ux500_msp *msp, unsigned int dir)
{
- int status = 0;
+ int status = 0, retval = 0;
+ unsigned long flags;
dev_dbg(msp->dev, "%s: Enter (dir = 0x%01x).\n", __func__, dir);
@@ -631,12 +642,19 @@ int ux500_msp_i2s_close(struct ux500_msp *msp, unsigned int dir)
writel((readl(msp->registers + MSP_GCR) &
(~(FRAME_GEN_ENABLE | SRG_ENABLE))),
msp->registers + MSP_GCR);
- if (msp->plat_exit)
- status = msp->plat_exit();
- if (status)
- dev_warn(msp->dev,
- "%s: WARN: ux500_msp_i2s_exit failed (%d)!\n",
- __func__, status);
+
+ spin_lock_irqsave(&msp_rxtx_lock, flags);
+ WARN_ON(!msp->pinctrl_rxtx_ref);
+ msp->pinctrl_rxtx_ref--;
+ if (msp->pinctrl_rxtx_ref == 0 &&
+ !(IS_ERR(msp->pinctrl_p) || IS_ERR(msp->pinctrl_sleep))) {
+ retval = pinctrl_select_state(msp->pinctrl_p,
+ msp->pinctrl_sleep);
+ if (retval)
+ pr_err("could not set MSP sleepstate\n");
+ }
+ spin_unlock_irqrestore(&msp_rxtx_lock, flags);
+
writel(0, msp->registers + MSP_GCR);
writel(0, msp->registers + MSP_TCF);
writel(0, msp->registers + MSP_RCF);
@@ -678,8 +696,6 @@ int ux500_msp_i2s_init_msp(struct platform_device *pdev,
msp->id = platform_data->id;
msp->dev = &pdev->dev;
- msp->plat_init = platform_data->msp_i2s_init;
- msp->plat_exit = platform_data->msp_i2s_exit;
msp->dma_cfg_rx = platform_data->msp_i2s_dma_rx;
msp->dma_cfg_tx = platform_data->msp_i2s_dma_tx;
@@ -717,6 +733,25 @@ int ux500_msp_i2s_init_msp(struct platform_device *pdev,
dev_dbg(&pdev->dev, "I2S device-name: '%s'\n", i2s_cont->name);
msp->i2s_cont = i2s_cont;
+ msp->pinctrl_p = pinctrl_get(msp->dev);
+ if (IS_ERR(msp->pinctrl_p))
+ dev_err(&pdev->dev, "could not get MSP pinctrl\n");
+ else {
+ msp->pinctrl_def = pinctrl_lookup_state(msp->pinctrl_p,
+ PINCTRL_STATE_DEFAULT);
+ if (IS_ERR(msp->pinctrl_def)) {
+ dev_err(&pdev->dev,
+ "could not get MSP defstate (%li)\n",
+ PTR_ERR(msp->pinctrl_def));
+ }
+ msp->pinctrl_sleep = pinctrl_lookup_state(msp->pinctrl_p,
+ PINCTRL_STATE_SLEEP);
+ if (IS_ERR(msp->pinctrl_sleep))
+ dev_err(&pdev->dev,
+ "could not get MSP idlestate (%li)\n",
+ PTR_ERR(msp->pinctrl_def));
+ }
+
return 0;
err_i2s_cont:
diff --git a/sound/soc/ux500/ux500_msp_i2s.h b/sound/soc/ux500/ux500_msp_i2s.h
index 2d9136d..1311c0d 100644
--- a/sound/soc/ux500/ux500_msp_i2s.h
+++ b/sound/soc/ux500/ux500_msp_i2s.h
@@ -524,14 +524,18 @@ struct ux500_msp {
struct dma_chan *rx_pipeid;
enum msp_state msp_state;
int (*transfer) (struct ux500_msp *msp, struct i2s_message *message);
- int (*plat_init) (void);
- int (*plat_exit) (void);
struct timer_list notify_timer;
int def_elem_len;
unsigned int dir_busy;
int loopback_enable;
u32 backup_regs[MAX_MSP_BACKUP_REGS];
unsigned int f_bitclk;
+ /* Pin modes */
+ struct pinctrl *pinctrl_p;
+ struct pinctrl_state *pinctrl_def;
+ struct pinctrl_state *pinctrl_sleep;
+ /* Reference Count */
+ int pinctrl_rxtx_ref;
};
struct ux500_msp_dma_params {
--
1.7.9.5
Here we ensure that the MOP500 audio driver will be probed during a
Device Tree boot. We also parse the sound node to link together the
codec, dma and the CPU-side Digital Audio Interface.
CC: [email protected]
Acked-by: Linus Walleij <[email protected]>
Signed-off-by: Lee Jones <[email protected]>
---
sound/soc/ux500/mop500.c | 40 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 40 insertions(+)
diff --git a/sound/soc/ux500/mop500.c b/sound/soc/ux500/mop500.c
index 31c4d26..6840df7 100644
--- a/sound/soc/ux500/mop500.c
+++ b/sound/soc/ux500/mop500.c
@@ -16,6 +16,7 @@
#include <linux/module.h>
#include <linux/io.h>
#include <linux/spi/spi.h>
+#include <linux/of.h>
#include <sound/soc.h>
#include <sound/initval.h>
@@ -56,8 +57,35 @@ static struct snd_soc_card mop500_card = {
.num_links = ARRAY_SIZE(mop500_dai_links),
};
+static int __devinit mop500_of_probe(struct platform_device *pdev,
+ struct device_node *np)
+{
+ struct device_node *codec_np, *msp_np[2];
+ int i;
+
+ msp_np[0] = of_parse_phandle(np, "stericsson,cpu-dai", 0);
+ msp_np[1] = of_parse_phandle(np, "stericsson,cpu-dai", 1);
+ codec_np = of_parse_phandle(np, "stericsson,audio-codec", 0);
+
+ if (!(msp_np[0] && msp_np[1] && codec_np)) {
+ dev_err(&pdev->dev, "Phandle missing or invalid\n");
+ return -EINVAL;
+ }
+
+ for (i = 0; i < 2; i++) {
+ mop500_dai_links[i].cpu_of_node = msp_np[i];
+ mop500_dai_links[i].cpu_dai_name = NULL;
+ mop500_dai_links[i].codec_of_node = codec_np;
+ mop500_dai_links[i].codec_name = NULL;
+ }
+
+ snd_soc_of_parse_card_name(&mop500_card, "stericsson,card-name");
+
+ return 0;
+}
static int __devinit mop500_probe(struct platform_device *pdev)
{
+ struct device_node *np = pdev->dev.of_node;
int ret;
pr_debug("%s: Enter.\n", __func__);
@@ -66,6 +94,12 @@ static int __devinit mop500_probe(struct platform_device *pdev)
mop500_card.dev = &pdev->dev;
+ if (np) {
+ ret = mop500_of_probe(pdev, np);
+ if (ret)
+ return ret;
+ }
+
dev_dbg(&pdev->dev, "%s: Card %s: Set platform drvdata.\n",
__func__, mop500_card.name);
platform_set_drvdata(pdev, &mop500_card);
@@ -101,10 +135,16 @@ static int __devexit mop500_remove(struct platform_device *pdev)
return 0;
}
+static const struct of_device_id snd_soc_mop500_match[] = {
+ { .compatible = "stericsson,snd-soc-mop500", },
+ {},
+};
+
static struct platform_driver snd_soc_mop500_driver = {
.driver = {
.owner = THIS_MODULE,
.name = "snd-soc-mop500",
+ .of_match_table = snd_soc_mop500_match,
},
.probe = mop500_probe,
.remove = __devexit_p(mop500_remove),
--
1.7.9.5
On Fri, Aug 24, 2012 at 19:31:50, Lee Jones wrote:
> The 'msp' board file does more than just register MSP devices. It
> also registers some other components necessary to get audio working
> on ux500 based platforms; such as the PCM and Machine Drivers. For
> that reason we're changing the filename to be more encompassing -
> 'audio'.
>
> Acked-by: Linus Walleij <[email protected]>
> Signed-off-by: Lee Jones <[email protected]>
> ---
> arch/arm/mach-ux500/Makefile | 2 +-
> arch/arm/mach-ux500/board-mop500-audio.c | 199 ++++++++++++++++++++++++++++++
> arch/arm/mach-ux500/board-mop500-msp.c | 199 ------------------------------
Please use _M option when generating patches (git-format-patch -M ...).
This will reduce the final patch size
> arch/arm/mach-ux500/board-mop500.c | 12 +-
> arch/arm/mach-ux500/board-mop500.h | 4 +-
> 5 files changed, 208 insertions(+), 208 deletions(-)
> create mode 100644 arch/arm/mach-ux500/board-mop500-audio.c
> delete mode 100644 arch/arm/mach-ux500/board-mop500-msp.c
>
> diff --git a/arch/arm/mach-ux500/Makefile b/arch/arm/mach-ux500/Makefile
> index 026086f..1dc2cfa 100644
> --- a/arch/arm/mach-ux500/Makefile
> +++ b/arch/arm/mach-ux500/Makefile
> @@ -12,6 +12,6 @@ obj-$(CONFIG_MACH_MOP500) += board-mop500.o board-mop500-sdi.o \
> board-mop500-uib.o board-mop500-stuib.o \
> board-mop500-u8500uib.o \
> board-mop500-pins.o \
> - board-mop500-msp.o
> + board-mop500-audio.o
> obj-$(CONFIG_SMP) += platsmp.o headsmp.o
> obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o
> diff --git a/arch/arm/mach-ux500/board-mop500-audio.c b/arch/arm/mach-ux500/board-mop500-audio.c
> new file mode 100644
> index 0000000..18f6c5a
> --- /dev/null
> +++ b/arch/arm/mach-ux500/board-mop500-audio.c
> @@ -0,0 +1,199 @@
> +/*
> + * Copyright (C) ST-Ericsson SA 2010
> + *
> + * License terms: GNU General Public License (GPL), version 2
> + */
> +
> +#include <linux/platform_device.h>
> +#include <linux/init.h>
> +#include <linux/gpio.h>
> +#include <linux/pinctrl/consumer.h>
> +
> +#include <plat/gpio-nomadik.h>
> +#include <plat/pincfg.h>
> +#include <plat/ste_dma40.h>
> +
> +#include <mach/devices.h>
> +#include <mach/hardware.h>
> +#include <mach/irqs.h>
> +#include <mach/msp.h>
> +
> +#include "ste-dma40-db8500.h"
> +#include "board-mop500.h"
> +#include "devices-db8500.h"
> +#include "pins-db8500.h"
> +
> +static struct stedma40_chan_cfg msp0_dma_rx = {
> + .high_priority = true,
> + .dir = STEDMA40_PERIPH_TO_MEM,
> +
> + .src_dev_type = DB8500_DMA_DEV31_MSP0_RX_SLIM0_CH0_RX,
> + .dst_dev_type = STEDMA40_DEV_DST_MEMORY,
> +
> + .src_info.psize = STEDMA40_PSIZE_LOG_4,
> + .dst_info.psize = STEDMA40_PSIZE_LOG_4,
> +
> + /* data_width is set during configuration */
> +};
> +
> +static struct stedma40_chan_cfg msp0_dma_tx = {
> + .high_priority = true,
> + .dir = STEDMA40_MEM_TO_PERIPH,
> +
> + .src_dev_type = STEDMA40_DEV_DST_MEMORY,
> + .dst_dev_type = DB8500_DMA_DEV31_MSP0_TX_SLIM0_CH0_TX,
> +
> + .src_info.psize = STEDMA40_PSIZE_LOG_4,
> + .dst_info.psize = STEDMA40_PSIZE_LOG_4,
> +
> + /* data_width is set during configuration */
> +};
> +
> +struct msp_i2s_platform_data msp0_platform_data = {
> + .id = MSP_I2S_0,
> + .msp_i2s_dma_rx = &msp0_dma_rx,
> + .msp_i2s_dma_tx = &msp0_dma_tx,
> +};
> +
> +static struct stedma40_chan_cfg msp1_dma_rx = {
> + .high_priority = true,
> + .dir = STEDMA40_PERIPH_TO_MEM,
> +
> + .src_dev_type = DB8500_DMA_DEV30_MSP3_RX,
> + .dst_dev_type = STEDMA40_DEV_DST_MEMORY,
> +
> + .src_info.psize = STEDMA40_PSIZE_LOG_4,
> + .dst_info.psize = STEDMA40_PSIZE_LOG_4,
> +
> + /* data_width is set during configuration */
> +};
> +
> +static struct stedma40_chan_cfg msp1_dma_tx = {
> + .high_priority = true,
> + .dir = STEDMA40_MEM_TO_PERIPH,
> +
> + .src_dev_type = STEDMA40_DEV_DST_MEMORY,
> + .dst_dev_type = DB8500_DMA_DEV30_MSP1_TX,
> +
> + .src_info.psize = STEDMA40_PSIZE_LOG_4,
> + .dst_info.psize = STEDMA40_PSIZE_LOG_4,
> +
> + /* data_width is set during configuration */
> +};
> +
> +struct msp_i2s_platform_data msp1_platform_data = {
> + .id = MSP_I2S_1,
> + .msp_i2s_dma_rx = NULL,
> + .msp_i2s_dma_tx = &msp1_dma_tx,
> +};
> +
> +static struct stedma40_chan_cfg msp2_dma_rx = {
> + .high_priority = true,
> + .dir = STEDMA40_PERIPH_TO_MEM,
> +
> + .src_dev_type = DB8500_DMA_DEV14_MSP2_RX,
> + .dst_dev_type = STEDMA40_DEV_DST_MEMORY,
> +
> + /* MSP2 DMA doesn't work with PSIZE == 4 on DB8500v2 */
> + .src_info.psize = STEDMA40_PSIZE_LOG_1,
> + .dst_info.psize = STEDMA40_PSIZE_LOG_1,
> +
> + /* data_width is set during configuration */
> +};
> +
> +static struct stedma40_chan_cfg msp2_dma_tx = {
> + .high_priority = true,
> + .dir = STEDMA40_MEM_TO_PERIPH,
> +
> + .src_dev_type = STEDMA40_DEV_DST_MEMORY,
> + .dst_dev_type = DB8500_DMA_DEV14_MSP2_TX,
> +
> + .src_info.psize = STEDMA40_PSIZE_LOG_4,
> + .dst_info.psize = STEDMA40_PSIZE_LOG_4,
> +
> + .use_fixed_channel = true,
> + .phy_channel = 1,
> +
> + /* data_width is set during configuration */
> +};
> +
> +static struct platform_device *db8500_add_msp_i2s(struct device *parent,
> + int id,
> + resource_size_t base, int irq,
> + struct msp_i2s_platform_data *pdata)
> +{
> + struct platform_device *pdev;
> + struct resource res[] = {
> + DEFINE_RES_MEM(base, SZ_4K),
> + DEFINE_RES_IRQ(irq),
> + };
> +
> + pr_info("Register platform-device 'ux500-msp-i2s', id %d, irq %d\n",
> + id, irq);
> + pdev = platform_device_register_resndata(parent, "ux500-msp-i2s", id,
> + res, ARRAY_SIZE(res),
> + pdata, sizeof(*pdata));
> + if (!pdev) {
> + pr_err("Failed to register platform-device 'ux500-msp-i2s.%d'!\n",
> + id);
> + return NULL;
> + }
> +
> + return pdev;
> +}
> +
> +/* Platform device for ASoC MOP500 machine */
> +static struct platform_device snd_soc_mop500 = {
> + .name = "snd-soc-mop500",
> + .id = 0,
> + .dev = {
> + .platform_data = NULL,
> + },
> +};
> +
> +/* Platform device for Ux500-PCM */
> +static struct platform_device ux500_pcm = {
> + .name = "ux500-pcm",
> + .id = 0,
> + .dev = {
> + .platform_data = NULL,
> + },
> +};
> +
> +struct msp_i2s_platform_data msp2_platform_data = {
> + .id = MSP_I2S_2,
> + .msp_i2s_dma_rx = &msp2_dma_rx,
> + .msp_i2s_dma_tx = &msp2_dma_tx,
> +};
> +
> +struct msp_i2s_platform_data msp3_platform_data = {
> + .id = MSP_I2S_3,
> + .msp_i2s_dma_rx = &msp1_dma_rx,
> + .msp_i2s_dma_tx = NULL,
> +};
> +
> +void mop500_audio_init(struct device *parent)
> +{
> + pr_info("%s: Register platform-device 'snd-soc-mop500'.\n", __func__);
> + platform_device_register(&snd_soc_mop500);
> +
> + pr_info("Initialize MSP I2S-devices.\n");
> + db8500_add_msp_i2s(parent, 0, U8500_MSP0_BASE, IRQ_DB8500_MSP0,
> + &msp0_platform_data);
> + db8500_add_msp_i2s(parent, 1, U8500_MSP1_BASE, IRQ_DB8500_MSP1,
> + &msp1_platform_data);
> + db8500_add_msp_i2s(parent, 2, U8500_MSP2_BASE, IRQ_DB8500_MSP2,
> + &msp2_platform_data);
> + db8500_add_msp_i2s(parent, 3, U8500_MSP3_BASE, IRQ_DB8500_MSP1,
> + &msp3_platform_data);
> +
> + pr_info("%s: Register platform-device 'ux500-pcm'\n", __func__);
> + platform_device_register(&ux500_pcm);
> +}
> +
> +/* Due for removal once the MSP driver has been fully DT:ed. */
> +void mop500_of_audio_init(struct device *parent)
> +{
> + pr_info("%s: Register platform-device 'ux500-pcm'\n", __func__);
> + platform_device_register(&ux500_pcm);
> +}
> diff --git a/arch/arm/mach-ux500/board-mop500-msp.c b/arch/arm/mach-ux500/board-mop500-msp.c
> deleted file mode 100644
> index 2af017f..0000000
> --- a/arch/arm/mach-ux500/board-mop500-msp.c
> +++ /dev/null
> @@ -1,199 +0,0 @@
> -/*
> - * Copyright (C) ST-Ericsson SA 2010
> - *
> - * License terms: GNU General Public License (GPL), version 2
> - */
> -
> -#include <linux/platform_device.h>
> -#include <linux/init.h>
> -#include <linux/gpio.h>
> -#include <linux/pinctrl/consumer.h>
> -
> -#include <plat/gpio-nomadik.h>
> -#include <plat/pincfg.h>
> -#include <plat/ste_dma40.h>
> -
> -#include <mach/devices.h>
> -#include <mach/hardware.h>
> -#include <mach/irqs.h>
> -#include <mach/msp.h>
> -
> -#include "ste-dma40-db8500.h"
> -#include "board-mop500.h"
> -#include "devices-db8500.h"
> -#include "pins-db8500.h"
> -
> -static struct stedma40_chan_cfg msp0_dma_rx = {
> - .high_priority = true,
> - .dir = STEDMA40_PERIPH_TO_MEM,
> -
> - .src_dev_type = DB8500_DMA_DEV31_MSP0_RX_SLIM0_CH0_RX,
> - .dst_dev_type = STEDMA40_DEV_DST_MEMORY,
> -
> - .src_info.psize = STEDMA40_PSIZE_LOG_4,
> - .dst_info.psize = STEDMA40_PSIZE_LOG_4,
> -
> - /* data_width is set during configuration */
> -};
> -
> -static struct stedma40_chan_cfg msp0_dma_tx = {
> - .high_priority = true,
> - .dir = STEDMA40_MEM_TO_PERIPH,
> -
> - .src_dev_type = STEDMA40_DEV_DST_MEMORY,
> - .dst_dev_type = DB8500_DMA_DEV31_MSP0_TX_SLIM0_CH0_TX,
> -
> - .src_info.psize = STEDMA40_PSIZE_LOG_4,
> - .dst_info.psize = STEDMA40_PSIZE_LOG_4,
> -
> - /* data_width is set during configuration */
> -};
> -
> -struct msp_i2s_platform_data msp0_platform_data = {
> - .id = MSP_I2S_0,
> - .msp_i2s_dma_rx = &msp0_dma_rx,
> - .msp_i2s_dma_tx = &msp0_dma_tx,
> -};
> -
> -static struct stedma40_chan_cfg msp1_dma_rx = {
> - .high_priority = true,
> - .dir = STEDMA40_PERIPH_TO_MEM,
> -
> - .src_dev_type = DB8500_DMA_DEV30_MSP3_RX,
> - .dst_dev_type = STEDMA40_DEV_DST_MEMORY,
> -
> - .src_info.psize = STEDMA40_PSIZE_LOG_4,
> - .dst_info.psize = STEDMA40_PSIZE_LOG_4,
> -
> - /* data_width is set during configuration */
> -};
> -
> -static struct stedma40_chan_cfg msp1_dma_tx = {
> - .high_priority = true,
> - .dir = STEDMA40_MEM_TO_PERIPH,
> -
> - .src_dev_type = STEDMA40_DEV_DST_MEMORY,
> - .dst_dev_type = DB8500_DMA_DEV30_MSP1_TX,
> -
> - .src_info.psize = STEDMA40_PSIZE_LOG_4,
> - .dst_info.psize = STEDMA40_PSIZE_LOG_4,
> -
> - /* data_width is set during configuration */
> -};
> -
> -struct msp_i2s_platform_data msp1_platform_data = {
> - .id = MSP_I2S_1,
> - .msp_i2s_dma_rx = NULL,
> - .msp_i2s_dma_tx = &msp1_dma_tx,
> -};
> -
> -static struct stedma40_chan_cfg msp2_dma_rx = {
> - .high_priority = true,
> - .dir = STEDMA40_PERIPH_TO_MEM,
> -
> - .src_dev_type = DB8500_DMA_DEV14_MSP2_RX,
> - .dst_dev_type = STEDMA40_DEV_DST_MEMORY,
> -
> - /* MSP2 DMA doesn't work with PSIZE == 4 on DB8500v2 */
> - .src_info.psize = STEDMA40_PSIZE_LOG_1,
> - .dst_info.psize = STEDMA40_PSIZE_LOG_1,
> -
> - /* data_width is set during configuration */
> -};
> -
> -static struct stedma40_chan_cfg msp2_dma_tx = {
> - .high_priority = true,
> - .dir = STEDMA40_MEM_TO_PERIPH,
> -
> - .src_dev_type = STEDMA40_DEV_DST_MEMORY,
> - .dst_dev_type = DB8500_DMA_DEV14_MSP2_TX,
> -
> - .src_info.psize = STEDMA40_PSIZE_LOG_4,
> - .dst_info.psize = STEDMA40_PSIZE_LOG_4,
> -
> - .use_fixed_channel = true,
> - .phy_channel = 1,
> -
> - /* data_width is set during configuration */
> -};
> -
> -static struct platform_device *db8500_add_msp_i2s(struct device *parent,
> - int id,
> - resource_size_t base, int irq,
> - struct msp_i2s_platform_data *pdata)
> -{
> - struct platform_device *pdev;
> - struct resource res[] = {
> - DEFINE_RES_MEM(base, SZ_4K),
> - DEFINE_RES_IRQ(irq),
> - };
> -
> - pr_info("Register platform-device 'ux500-msp-i2s', id %d, irq %d\n",
> - id, irq);
> - pdev = platform_device_register_resndata(parent, "ux500-msp-i2s", id,
> - res, ARRAY_SIZE(res),
> - pdata, sizeof(*pdata));
> - if (!pdev) {
> - pr_err("Failed to register platform-device 'ux500-msp-i2s.%d'!\n",
> - id);
> - return NULL;
> - }
> -
> - return pdev;
> -}
> -
> -/* Platform device for ASoC MOP500 machine */
> -static struct platform_device snd_soc_mop500 = {
> - .name = "snd-soc-mop500",
> - .id = 0,
> - .dev = {
> - .platform_data = NULL,
> - },
> -};
> -
> -/* Platform device for Ux500-PCM */
> -static struct platform_device ux500_pcm = {
> - .name = "ux500-pcm",
> - .id = 0,
> - .dev = {
> - .platform_data = NULL,
> - },
> -};
> -
> -struct msp_i2s_platform_data msp2_platform_data = {
> - .id = MSP_I2S_2,
> - .msp_i2s_dma_rx = &msp2_dma_rx,
> - .msp_i2s_dma_tx = &msp2_dma_tx,
> -};
> -
> -struct msp_i2s_platform_data msp3_platform_data = {
> - .id = MSP_I2S_3,
> - .msp_i2s_dma_rx = &msp1_dma_rx,
> - .msp_i2s_dma_tx = NULL,
> -};
> -
> -/* Due for removal once the MSP driver has been fully DT:ed. */
> -void mop500_of_msp_init(struct device *parent)
> -{
> - pr_info("%s: Register platform-device 'ux500-pcm'\n", __func__);
> - platform_device_register(&ux500_pcm);
> -}
> -
> -void mop500_msp_init(struct device *parent)
> -{
> - pr_info("%s: Register platform-device 'snd-soc-mop500'.\n", __func__);
> - platform_device_register(&snd_soc_mop500);
> -
> - pr_info("Initialize MSP I2S-devices.\n");
> - db8500_add_msp_i2s(parent, 0, U8500_MSP0_BASE, IRQ_DB8500_MSP0,
> - &msp0_platform_data);
> - db8500_add_msp_i2s(parent, 1, U8500_MSP1_BASE, IRQ_DB8500_MSP1,
> - &msp1_platform_data);
> - db8500_add_msp_i2s(parent, 2, U8500_MSP2_BASE, IRQ_DB8500_MSP2,
> - &msp2_platform_data);
> - db8500_add_msp_i2s(parent, 3, U8500_MSP3_BASE, IRQ_DB8500_MSP1,
> - &msp3_platform_data);
> -
> - pr_info("%s: Register platform-device 'ux500-pcm'\n", __func__);
> - platform_device_register(&ux500_pcm);
> -}
> diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c
> index 0c141d5..7152635 100644
> --- a/arch/arm/mach-ux500/board-mop500.c
> +++ b/arch/arm/mach-ux500/board-mop500.c
> @@ -607,7 +607,7 @@ static void __init mop500_init_machine(void)
> mop500_i2c_init(parent);
> mop500_sdi_init(parent);
> mop500_spi_init(parent);
> - mop500_msp_init(parent);
> + mop500_audio_init(parent);
> mop500_uart_init(parent);
>
> u8500_cryp1_hash1_init(parent);
> @@ -641,7 +641,7 @@ static void __init snowball_init_machine(void)
> mop500_i2c_init(parent);
> snowball_sdi_init(parent);
> mop500_spi_init(parent);
> - mop500_msp_init(parent);
> + mop500_audio_init(parent);
> mop500_uart_init(parent);
>
> /* This board has full regulator constraints */
> @@ -673,7 +673,7 @@ static void __init hrefv60_init_machine(void)
> mop500_i2c_init(parent);
> hrefv60_sdi_init(parent);
> mop500_spi_init(parent);
> - mop500_msp_init(parent);
> + mop500_audio_init(parent);
> mop500_uart_init(parent);
>
> i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
> @@ -807,7 +807,7 @@ static void __init u8500_init_machine(void)
> ARRAY_SIZE(mop500_platform_devs));
>
> mop500_sdi_init(parent);
> - mop500_msp_init(parent);
> + mop500_audio_init(parent);
> i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
> i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
> i2c_register_board_info(2, mop500_i2c2_devices,
> @@ -816,7 +816,7 @@ static void __init u8500_init_machine(void)
> mop500_uib_init();
>
> } else if (of_machine_is_compatible("calaosystems,snowball-a9500")) {
> - mop500_of_msp_init(parent);
> + mop500_of_audio_init(parent);
> } else if (of_machine_is_compatible("st-ericsson,hrefv60+")) {
> /*
> * The HREFv60 board removed a GPIO expander and routed
> @@ -828,7 +828,7 @@ static void __init u8500_init_machine(void)
> ARRAY_SIZE(mop500_platform_devs));
>
> hrefv60_sdi_init(parent);
> - mop500_msp_init(parent);
> + mop500_audio_init(parent);
>
> i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
> i2c0_devs -= NUM_PRE_V60_I2C0_DEVICES;
> diff --git a/arch/arm/mach-ux500/board-mop500.h b/arch/arm/mach-ux500/board-mop500.h
> index 3fbf48f..9e9dd5a 100644
> --- a/arch/arm/mach-ux500/board-mop500.h
> +++ b/arch/arm/mach-ux500/board-mop500.h
> @@ -97,9 +97,9 @@ void __init mop500_stuib_init(void);
> void __init mop500_pinmaps_init(void);
> void __init snowball_pinmaps_init(void);
> void __init hrefv60_pinmaps_init(void);
> -void mop500_msp_init(struct device *parent);
> +void mop500_audio_init(struct device *parent);
> /* Due for removal once the MSP driver has been fully DT:ed. */
> -void mop500_of_msp_init(struct device *parent);
> +void mop500_of_audio_init(struct device *parent);
>
> int __init mop500_uib_init(void);
> void mop500_uib_i2c_add(int busnum, struct i2c_board_info *info,
> --
> 1.7.9.5
>
> _______________________________________________
> Alsa-devel mailing list
> [email protected]
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
>
Regards,
Gururaja
> > arch/arm/mach-ux500/Makefile | 2 +-
> > arch/arm/mach-ux500/board-mop500-audio.c | 199 ++++++++++++++++++++++++++++++
> > arch/arm/mach-ux500/board-mop500-msp.c | 199 ------------------------------
>
> Please use _M option when generating patches (git-format-patch -M ...).
> This will reduce the final patch size
Ah, I see. That's what Linus was going on about!
I can do that.
--
Lee Jones
Linaro ST-Ericsson Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
Like this?
From: Lee Jones <[email protected]>
Date: Fri, 24 Aug 2012 13:16:06 +0100
Subject: [PATCH 1/1] ARM: ux500: Rename MSP board file to something more meaningful
The 'msp' board file does more than just register MSP devices. It
also registers some other components necessary to get audio working
on ux500 based platforms; such as the PCM and Machine Drivers. For
that reason we're changing the filename to be more encompassing -
'audio'.
Acked-by: Linus Walleij <[email protected]>
Signed-off-by: Lee Jones <[email protected]>
---
arch/arm/mach-ux500/Makefile | 2 +-
.../{board-mop500-msp.c => board-mop500-audio.c} | 16 ++++++++--------
arch/arm/mach-ux500/board-mop500.c | 12 ++++++------
arch/arm/mach-ux500/board-mop500.h | 4 ++--
4 files changed, 17 insertions(+), 17 deletions(-)
rename arch/arm/mach-ux500/{board-mop500-msp.c => board-mop500-audio.c} (98%)
diff --git a/arch/arm/mach-ux500/Makefile b/arch/arm/mach-ux500/Makefile
index 026086f..1dc2cfa 100644
--- a/arch/arm/mach-ux500/Makefile
+++ b/arch/arm/mach-ux500/Makefile
@@ -12,6 +12,6 @@ obj-$(CONFIG_MACH_MOP500) += board-mop500.o board-mop500-sdi.o \
board-mop500-uib.o board-mop500-stuib.o \
board-mop500-u8500uib.o \
board-mop500-pins.o \
- board-mop500-msp.o
+ board-mop500-audio.o
obj-$(CONFIG_SMP) += platsmp.o headsmp.o
obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o
diff --git a/arch/arm/mach-ux500/board-mop500-msp.c b/arch/arm/mach-ux500/board-mop500-audio.c
similarity index 98%
rename from arch/arm/mach-ux500/board-mop500-msp.c
rename to arch/arm/mach-ux500/board-mop500-audio.c
index 2af017f..18f6c5a 100644
--- a/arch/arm/mach-ux500/board-mop500-msp.c
+++ b/arch/arm/mach-ux500/board-mop500-audio.c
@@ -172,14 +172,7 @@ struct msp_i2s_platform_data msp3_platform_data = {
.msp_i2s_dma_tx = NULL,
};
-/* Due for removal once the MSP driver has been fully DT:ed. */
-void mop500_of_msp_init(struct device *parent)
-{
- pr_info("%s: Register platform-device 'ux500-pcm'\n", __func__);
- platform_device_register(&ux500_pcm);
-}
-
-void mop500_msp_init(struct device *parent)
+void mop500_audio_init(struct device *parent)
{
pr_info("%s: Register platform-device 'snd-soc-mop500'.\n", __func__);
platform_device_register(&snd_soc_mop500);
@@ -197,3 +190,10 @@ void mop500_msp_init(struct device *parent)
pr_info("%s: Register platform-device 'ux500-pcm'\n", __func__);
platform_device_register(&ux500_pcm);
}
+
+/* Due for removal once the MSP driver has been fully DT:ed. */
+void mop500_of_audio_init(struct device *parent)
+{
+ pr_info("%s: Register platform-device 'ux500-pcm'\n", __func__);
+ platform_device_register(&ux500_pcm);
+}
diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c
index 0c141d5..7152635 100644
--- a/arch/arm/mach-ux500/board-mop500.c
+++ b/arch/arm/mach-ux500/board-mop500.c
@@ -607,7 +607,7 @@ static void __init mop500_init_machine(void)
mop500_i2c_init(parent);
mop500_sdi_init(parent);
mop500_spi_init(parent);
- mop500_msp_init(parent);
+ mop500_audio_init(parent);
mop500_uart_init(parent);
u8500_cryp1_hash1_init(parent);
@@ -641,7 +641,7 @@ static void __init snowball_init_machine(void)
mop500_i2c_init(parent);
snowball_sdi_init(parent);
mop500_spi_init(parent);
- mop500_msp_init(parent);
+ mop500_audio_init(parent);
mop500_uart_init(parent);
/* This board has full regulator constraints */
@@ -673,7 +673,7 @@ static void __init hrefv60_init_machine(void)
mop500_i2c_init(parent);
hrefv60_sdi_init(parent);
mop500_spi_init(parent);
- mop500_msp_init(parent);
+ mop500_audio_init(parent);
mop500_uart_init(parent);
i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
@@ -807,7 +807,7 @@ static void __init u8500_init_machine(void)
ARRAY_SIZE(mop500_platform_devs));
mop500_sdi_init(parent);
- mop500_msp_init(parent);
+ mop500_audio_init(parent);
i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
i2c_register_board_info(2, mop500_i2c2_devices,
@@ -816,7 +816,7 @@ static void __init u8500_init_machine(void)
mop500_uib_init();
} else if (of_machine_is_compatible("calaosystems,snowball-a9500")) {
- mop500_of_msp_init(parent);
+ mop500_of_audio_init(parent);
} else if (of_machine_is_compatible("st-ericsson,hrefv60+")) {
/*
* The HREFv60 board removed a GPIO expander and routed
@@ -828,7 +828,7 @@ static void __init u8500_init_machine(void)
ARRAY_SIZE(mop500_platform_devs));
hrefv60_sdi_init(parent);
- mop500_msp_init(parent);
+ mop500_audio_init(parent);
i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
i2c0_devs -= NUM_PRE_V60_I2C0_DEVICES;
diff --git a/arch/arm/mach-ux500/board-mop500.h b/arch/arm/mach-ux500/board-mop500.h
index 3fbf48f..9e9dd5a 100644
--- a/arch/arm/mach-ux500/board-mop500.h
+++ b/arch/arm/mach-ux500/board-mop500.h
@@ -97,9 +97,9 @@ void __init mop500_stuib_init(void);
void __init mop500_pinmaps_init(void);
void __init snowball_pinmaps_init(void);
void __init hrefv60_pinmaps_init(void);
-void mop500_msp_init(struct device *parent);
+void mop500_audio_init(struct device *parent);
/* Due for removal once the MSP driver has been fully DT:ed. */
-void mop500_of_msp_init(struct device *parent);
+void mop500_of_audio_init(struct device *parent);
int __init mop500_uib_init(void);
void mop500_uib_i2c_add(int busnum, struct i2c_board_info *info,
--
1.7.9.5
On Fri, Aug 24, 2012 at 20:44:47, Lee Jones wrote:
> Like this?
Exactly. Thanks
>
> From: Lee Jones <[email protected]>
> Date: Fri, 24 Aug 2012 13:16:06 +0100
> Subject: [PATCH 1/1] ARM: ux500: Rename MSP board file to something more meaningful
>
> The 'msp' board file does more than just register MSP devices. It
> also registers some other components necessary to get audio working
> on ux500 based platforms; such as the PCM and Machine Drivers. For
> that reason we're changing the filename to be more encompassing -
> 'audio'.
>
> Acked-by: Linus Walleij <[email protected]>
> Signed-off-by: Lee Jones <[email protected]>
> ---
> arch/arm/mach-ux500/Makefile | 2 +-
> .../{board-mop500-msp.c => board-mop500-audio.c} | 16 ++++++++--------
> arch/arm/mach-ux500/board-mop500.c | 12 ++++++------
> arch/arm/mach-ux500/board-mop500.h | 4 ++--
> 4 files changed, 17 insertions(+), 17 deletions(-)
> rename arch/arm/mach-ux500/{board-mop500-msp.c => board-mop500-audio.c} (98%)
>
> diff --git a/arch/arm/mach-ux500/Makefile b/arch/arm/mach-ux500/Makefile
> index 026086f..1dc2cfa 100644
> --- a/arch/arm/mach-ux500/Makefile
> +++ b/arch/arm/mach-ux500/Makefile
> @@ -12,6 +12,6 @@ obj-$(CONFIG_MACH_MOP500) += board-mop500.o board-mop500-sdi.o \
> board-mop500-uib.o board-mop500-stuib.o \
> board-mop500-u8500uib.o \
> board-mop500-pins.o \
> - board-mop500-msp.o
> + board-mop500-audio.o
> obj-$(CONFIG_SMP) += platsmp.o headsmp.o
> obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o
> diff --git a/arch/arm/mach-ux500/board-mop500-msp.c b/arch/arm/mach-ux500/board-mop500-audio.c
> similarity index 98%
> rename from arch/arm/mach-ux500/board-mop500-msp.c
> rename to arch/arm/mach-ux500/board-mop500-audio.c
> index 2af017f..18f6c5a 100644
> --- a/arch/arm/mach-ux500/board-mop500-msp.c
> +++ b/arch/arm/mach-ux500/board-mop500-audio.c
> @@ -172,14 +172,7 @@ struct msp_i2s_platform_data msp3_platform_data = {
> .msp_i2s_dma_tx = NULL,
> };
>
> -/* Due for removal once the MSP driver has been fully DT:ed. */
> -void mop500_of_msp_init(struct device *parent)
> -{
> - pr_info("%s: Register platform-device 'ux500-pcm'\n", __func__);
> - platform_device_register(&ux500_pcm);
> -}
> -
> -void mop500_msp_init(struct device *parent)
> +void mop500_audio_init(struct device *parent)
> {
> pr_info("%s: Register platform-device 'snd-soc-mop500'.\n", __func__);
> platform_device_register(&snd_soc_mop500);
> @@ -197,3 +190,10 @@ void mop500_msp_init(struct device *parent)
> pr_info("%s: Register platform-device 'ux500-pcm'\n", __func__);
> platform_device_register(&ux500_pcm);
> }
> +
> +/* Due for removal once the MSP driver has been fully DT:ed. */
> +void mop500_of_audio_init(struct device *parent)
> +{
> + pr_info("%s: Register platform-device 'ux500-pcm'\n", __func__);
> + platform_device_register(&ux500_pcm);
> +}
> diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c
> index 0c141d5..7152635 100644
> --- a/arch/arm/mach-ux500/board-mop500.c
> +++ b/arch/arm/mach-ux500/board-mop500.c
> @@ -607,7 +607,7 @@ static void __init mop500_init_machine(void)
> mop500_i2c_init(parent);
> mop500_sdi_init(parent);
> mop500_spi_init(parent);
> - mop500_msp_init(parent);
> + mop500_audio_init(parent);
> mop500_uart_init(parent);
>
> u8500_cryp1_hash1_init(parent);
> @@ -641,7 +641,7 @@ static void __init snowball_init_machine(void)
> mop500_i2c_init(parent);
> snowball_sdi_init(parent);
> mop500_spi_init(parent);
> - mop500_msp_init(parent);
> + mop500_audio_init(parent);
> mop500_uart_init(parent);
>
> /* This board has full regulator constraints */
> @@ -673,7 +673,7 @@ static void __init hrefv60_init_machine(void)
> mop500_i2c_init(parent);
> hrefv60_sdi_init(parent);
> mop500_spi_init(parent);
> - mop500_msp_init(parent);
> + mop500_audio_init(parent);
> mop500_uart_init(parent);
>
> i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
> @@ -807,7 +807,7 @@ static void __init u8500_init_machine(void)
> ARRAY_SIZE(mop500_platform_devs));
>
> mop500_sdi_init(parent);
> - mop500_msp_init(parent);
> + mop500_audio_init(parent);
> i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
> i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
> i2c_register_board_info(2, mop500_i2c2_devices,
> @@ -816,7 +816,7 @@ static void __init u8500_init_machine(void)
> mop500_uib_init();
>
> } else if (of_machine_is_compatible("calaosystems,snowball-a9500")) {
> - mop500_of_msp_init(parent);
> + mop500_of_audio_init(parent);
> } else if (of_machine_is_compatible("st-ericsson,hrefv60+")) {
> /*
> * The HREFv60 board removed a GPIO expander and routed
> @@ -828,7 +828,7 @@ static void __init u8500_init_machine(void)
> ARRAY_SIZE(mop500_platform_devs));
>
> hrefv60_sdi_init(parent);
> - mop500_msp_init(parent);
> + mop500_audio_init(parent);
>
> i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
> i2c0_devs -= NUM_PRE_V60_I2C0_DEVICES;
> diff --git a/arch/arm/mach-ux500/board-mop500.h b/arch/arm/mach-ux500/board-mop500.h
> index 3fbf48f..9e9dd5a 100644
> --- a/arch/arm/mach-ux500/board-mop500.h
> +++ b/arch/arm/mach-ux500/board-mop500.h
> @@ -97,9 +97,9 @@ void __init mop500_stuib_init(void);
> void __init mop500_pinmaps_init(void);
> void __init snowball_pinmaps_init(void);
> void __init hrefv60_pinmaps_init(void);
> -void mop500_msp_init(struct device *parent);
> +void mop500_audio_init(struct device *parent);
> /* Due for removal once the MSP driver has been fully DT:ed. */
> -void mop500_of_msp_init(struct device *parent);
> +void mop500_of_audio_init(struct device *parent);
>
> int __init mop500_uib_init(void);
> void mop500_uib_i2c_add(int busnum, struct i2c_board_info *info,
> --
> 1.7.9.5
>
Regards,
Gururaja
On Fri, Aug 24, 2012 at 7:01 AM, Lee Jones <[email protected]> wrote:
> In the initial submission of the MSP driver msp1 and msp3's associated
> pinctrl mechanism was passed back to platform code using a plat_init()
> call-back routine, but it has no place in platform code. The MSP driver
> should set this up for the appropriate ports. Instead we use a use_pinctrl
> identifier which is passed from platform_data/Device Tree which indicates
> which ports should use pinctrl.
>
> CC: [email protected]
> Signed-off-by: Lee Jones <[email protected]>
Looks good to me, so Acked-by: Linus Walleij <[email protected]>
for the ux500 mach part.
However I'd request Ola/Roger to ACK it too on the ALSA side.
Yours,
Linus Walleij
On Fri, Aug 24, 2012 at 7:01 AM, Lee Jones <[email protected]> wrote:
> Ensure correct probing and pass though important configuration
> options to the AB8500 CODEC driver when DT is enabled
>
> Signed-off-by: Lee Jones <[email protected]>
Acked-by: Linus Walleij <[email protected]>
Yours,
Linus Walleij