diff options
-rw-r--r-- | sound/soc/fsl/fsl_ssi.c | 41 |
1 files changed, 26 insertions, 15 deletions
diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c index fa650112925a..18eacf5e399d 100644 --- a/sound/soc/fsl/fsl_ssi.c +++ b/sound/soc/fsl/fsl_ssi.c | |||
@@ -660,12 +660,9 @@ static int fsl_ssi_hw_params(struct snd_pcm_substream *substream, | |||
660 | return 0; | 660 | return 0; |
661 | } | 661 | } |
662 | 662 | ||
663 | /** | 663 | static int _fsl_ssi_set_dai_fmt(struct fsl_ssi_private *ssi_private, |
664 | * fsl_ssi_set_dai_fmt - configure Digital Audio Interface Format. | 664 | unsigned int fmt) |
665 | */ | ||
666 | static int fsl_ssi_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) | ||
667 | { | 665 | { |
668 | struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai); | ||
669 | struct ccsr_ssi __iomem *ssi = ssi_private->ssi; | 666 | struct ccsr_ssi __iomem *ssi = ssi_private->ssi; |
670 | u32 strcr = 0, stcr, srcr, scr, mask; | 667 | u32 strcr = 0, stcr, srcr, scr, mask; |
671 | u8 wm; | 668 | u8 wm; |
@@ -804,6 +801,17 @@ static int fsl_ssi_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) | |||
804 | fsl_ssi_setup_ac97(ssi_private); | 801 | fsl_ssi_setup_ac97(ssi_private); |
805 | 802 | ||
806 | return 0; | 803 | return 0; |
804 | |||
805 | } | ||
806 | |||
807 | /** | ||
808 | * fsl_ssi_set_dai_fmt - configure Digital Audio Interface Format. | ||
809 | */ | ||
810 | static int fsl_ssi_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) | ||
811 | { | ||
812 | struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai); | ||
813 | |||
814 | return _fsl_ssi_set_dai_fmt(ssi_private, fmt); | ||
807 | } | 815 | } |
808 | 816 | ||
809 | /** | 817 | /** |
@@ -1135,7 +1143,6 @@ static int fsl_ssi_probe(struct platform_device *pdev) | |||
1135 | const uint32_t *iprop; | 1143 | const uint32_t *iprop; |
1136 | struct resource res; | 1144 | struct resource res; |
1137 | char name[64]; | 1145 | char name[64]; |
1138 | bool ac97 = false; | ||
1139 | 1146 | ||
1140 | /* SSIs that are not connected on the board should have a | 1147 | /* SSIs that are not connected on the board should have a |
1141 | * status = "disabled" | 1148 | * status = "disabled" |
@@ -1148,14 +1155,6 @@ static int fsl_ssi_probe(struct platform_device *pdev) | |||
1148 | if (!of_id || !of_id->data) | 1155 | if (!of_id || !of_id->data) |
1149 | return -EINVAL; | 1156 | return -EINVAL; |
1150 | 1157 | ||
1151 | sprop = of_get_property(np, "fsl,mode", NULL); | ||
1152 | if (!sprop) { | ||
1153 | dev_err(&pdev->dev, "fsl,mode property is necessary\n"); | ||
1154 | return -EINVAL; | ||
1155 | } | ||
1156 | if (!strcmp(sprop, "ac97-slave")) | ||
1157 | ac97 = true; | ||
1158 | |||
1159 | ssi_private = devm_kzalloc(&pdev->dev, sizeof(*ssi_private), | 1158 | ssi_private = devm_kzalloc(&pdev->dev, sizeof(*ssi_private), |
1160 | GFP_KERNEL); | 1159 | GFP_KERNEL); |
1161 | if (!ssi_private) { | 1160 | if (!ssi_private) { |
@@ -1165,10 +1164,19 @@ static int fsl_ssi_probe(struct platform_device *pdev) | |||
1165 | 1164 | ||
1166 | ssi_private->soc = of_id->data; | 1165 | ssi_private->soc = of_id->data; |
1167 | 1166 | ||
1167 | sprop = of_get_property(np, "fsl,mode", NULL); | ||
1168 | if (sprop) { | ||
1169 | if (!strcmp(sprop, "ac97-slave")) | ||
1170 | ssi_private->dai_fmt = SND_SOC_DAIFMT_AC97; | ||
1171 | else if (!strcmp(sprop, "i2s-slave")) | ||
1172 | ssi_private->dai_fmt = SND_SOC_DAIFMT_I2S | | ||
1173 | SND_SOC_DAIFMT_CBM_CFM; | ||
1174 | } | ||
1175 | |||
1168 | ssi_private->use_dma = !of_property_read_bool(np, | 1176 | ssi_private->use_dma = !of_property_read_bool(np, |
1169 | "fsl,fiq-stream-filter"); | 1177 | "fsl,fiq-stream-filter"); |
1170 | 1178 | ||
1171 | if (ac97) { | 1179 | if (fsl_ssi_is_ac97(ssi_private)) { |
1172 | memcpy(&ssi_private->cpu_dai_drv, &fsl_ssi_ac97_dai, | 1180 | memcpy(&ssi_private->cpu_dai_drv, &fsl_ssi_ac97_dai, |
1173 | sizeof(fsl_ssi_ac97_dai)); | 1181 | sizeof(fsl_ssi_ac97_dai)); |
1174 | 1182 | ||
@@ -1279,6 +1287,9 @@ static int fsl_ssi_probe(struct platform_device *pdev) | |||
1279 | } | 1287 | } |
1280 | 1288 | ||
1281 | done: | 1289 | done: |
1290 | if (ssi_private->dai_fmt) | ||
1291 | _fsl_ssi_set_dai_fmt(ssi_private, ssi_private->dai_fmt); | ||
1292 | |||
1282 | return 0; | 1293 | return 0; |
1283 | 1294 | ||
1284 | error_sound_card: | 1295 | error_sound_card: |