summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShengjiu Wang <b02247@freescale.com>2013-11-21 16:10:55 +0800
committerShengjiu Wang <b02247@freescale.com>2013-11-21 17:34:58 +0800
commit88b654102c34db84df51496bc8721aa8d68c686d (patch)
treeab3c92f4b6fb1f4986447d8f942bb30a2c01a183
parentcc6a006ae2a66950ed9b74d69129fa69c58a95ce (diff)
ENGR00264453 asoc: when codec probe failed, alsa return RETRY error.
If there is no codec device, the machine driver will not register the card. then alsa will not return RETRY error. update the error handling for machine driver. Add for cs42888 and si476x. update dts file for sound-fm. Signed-off-by: Shengjiu Wang <b02247@freescale.com>
-rw-r--r--arch/arm/boot/dts/imx6qdl-sabreauto.dtsi1
-rw-r--r--sound/soc/fsl/imx-cs42888.c2
-rw-r--r--sound/soc/fsl/imx-si476x.c19
3 files changed, 21 insertions, 1 deletions
diff --git a/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi b/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi
index e011ba7db962..b6a791f7b2e9 100644
--- a/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi
+++ b/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi
@@ -210,6 +210,7 @@
model = "imx-radio-si4763";
ssi-controller = <&ssi2>;
+ fm-controller = <&si4763>;
mux-int-port = <2>;
mux-ext-port = <5>;
};
diff --git a/sound/soc/fsl/imx-cs42888.c b/sound/soc/fsl/imx-cs42888.c
index efecc6641c6d..5116d781fdad 100644
--- a/sound/soc/fsl/imx-cs42888.c
+++ b/sound/soc/fsl/imx-cs42888.c
@@ -281,7 +281,7 @@ static int imx_cs42888_probe(struct platform_device *pdev)
goto fail;
}
codec_dev = of_find_i2c_device_by_node(codec_np);
- if (!codec_dev) {
+ if (!codec_dev || !codec_dev->driver) {
dev_err(&pdev->dev, "failed to find codec platform device\n");
ret = -EINVAL;
goto fail;
diff --git a/sound/soc/fsl/imx-si476x.c b/sound/soc/fsl/imx-si476x.c
index 621fd1823a55..938528ccdd46 100644
--- a/sound/soc/fsl/imx-si476x.c
+++ b/sound/soc/fsl/imx-si476x.c
@@ -13,6 +13,7 @@
#include <linux/module.h>
#include <linux/of_platform.h>
+#include <linux/of_i2c.h>
#include <sound/soc.h>
#include "imx-audmux.h"
@@ -95,6 +96,8 @@ static int imx_si476x_probe(struct platform_device *pdev)
struct snd_soc_card *card = &snd_soc_card_imx_3stack;
struct device_node *ssi_np, *np = pdev->dev.of_node;
struct platform_device *ssi_pdev;
+ struct i2c_client *fm_dev;
+ struct device_node *fm_np;
int int_port, ext_port, ret;
ret = of_property_read_u32(np, "mux-int-port", &int_port);
@@ -124,6 +127,20 @@ static int imx_si476x_probe(struct platform_device *pdev)
goto end;
}
+ fm_np = of_parse_phandle(pdev->dev.of_node, "fm-controller", 0);
+ if (!fm_np) {
+ dev_err(&pdev->dev, "phandle missing or invalid\n");
+ ret = -EINVAL;
+ goto end;
+ }
+
+ fm_dev = of_find_i2c_device_by_node(fm_np);
+ if (!fm_dev || !fm_dev->driver) {
+ dev_err(&pdev->dev, "failed to find FM platform device\n");
+ ret = -EINVAL;
+ goto end;
+ }
+
card->dev = &pdev->dev;
card->dai_link->cpu_dai_name = dev_name(&ssi_pdev->dev);
card->dai_link->platform_of_node = ssi_np;
@@ -137,6 +154,8 @@ static int imx_si476x_probe(struct platform_device *pdev)
end:
if (ssi_np)
of_node_put(ssi_np);
+ if (fm_np)
+ of_node_put(fm_np);
return ret;
}