diff options
| -rw-r--r-- | sound/soc/samsung/i2s.c | 25 |
1 files changed, 11 insertions, 14 deletions
diff --git a/sound/soc/samsung/i2s.c b/sound/soc/samsung/i2s.c index a854ffca2416..f75c19e5b5c3 100644 --- a/sound/soc/samsung/i2s.c +++ b/sound/soc/samsung/i2s.c | |||
| @@ -969,7 +969,6 @@ static int samsung_i2s_dai_probe(struct snd_soc_dai *dai) | |||
| 969 | { | 969 | { |
| 970 | struct i2s_dai *i2s = to_info(dai); | 970 | struct i2s_dai *i2s = to_info(dai); |
| 971 | struct i2s_dai *other = i2s->pri_dai ? : i2s->sec_dai; | 971 | struct i2s_dai *other = i2s->pri_dai ? : i2s->sec_dai; |
| 972 | int ret; | ||
| 973 | 972 | ||
| 974 | if (is_secondary(i2s)) { /* If this is probe on the secondary DAI */ | 973 | if (is_secondary(i2s)) { /* If this is probe on the secondary DAI */ |
| 975 | samsung_asoc_init_dma_data(dai, &other->sec_dai->dma_playback, | 974 | samsung_asoc_init_dma_data(dai, &other->sec_dai->dma_playback, |
| @@ -977,12 +976,6 @@ static int samsung_i2s_dai_probe(struct snd_soc_dai *dai) | |||
| 977 | goto probe_exit; | 976 | goto probe_exit; |
| 978 | } | 977 | } |
| 979 | 978 | ||
| 980 | ret = clk_prepare_enable(i2s->clk); | ||
| 981 | if (ret != 0) { | ||
| 982 | dev_err(&i2s->pdev->dev, "failed to enable clock: %d\n", ret); | ||
| 983 | return ret; | ||
| 984 | } | ||
| 985 | |||
| 986 | samsung_asoc_init_dma_data(dai, &i2s->dma_playback, &i2s->dma_capture); | 979 | samsung_asoc_init_dma_data(dai, &i2s->dma_playback, &i2s->dma_capture); |
| 987 | 980 | ||
| 988 | if (i2s->quirks & QUIRK_NEED_RSTCLR) | 981 | if (i2s->quirks & QUIRK_NEED_RSTCLR) |
| @@ -1014,18 +1007,12 @@ probe_exit: | |||
| 1014 | static int samsung_i2s_dai_remove(struct snd_soc_dai *dai) | 1007 | static int samsung_i2s_dai_remove(struct snd_soc_dai *dai) |
| 1015 | { | 1008 | { |
| 1016 | struct i2s_dai *i2s = snd_soc_dai_get_drvdata(dai); | 1009 | struct i2s_dai *i2s = snd_soc_dai_get_drvdata(dai); |
| 1017 | struct i2s_dai *other = i2s->pri_dai ? : i2s->sec_dai; | ||
| 1018 | |||
| 1019 | if (!other || !other->clk) { | ||
| 1020 | 1010 | ||
| 1011 | if (!is_secondary(i2s)) { | ||
| 1021 | if (i2s->quirks & QUIRK_NEED_RSTCLR) | 1012 | if (i2s->quirks & QUIRK_NEED_RSTCLR) |
| 1022 | writel(0, i2s->addr + I2SCON); | 1013 | writel(0, i2s->addr + I2SCON); |
| 1023 | |||
| 1024 | clk_disable_unprepare(i2s->clk); | ||
| 1025 | } | 1014 | } |
| 1026 | 1015 | ||
| 1027 | i2s->clk = NULL; | ||
| 1028 | |||
| 1029 | return 0; | 1016 | return 0; |
| 1030 | } | 1017 | } |
| 1031 | 1018 | ||
| @@ -1139,6 +1126,7 @@ static int samsung_i2s_probe(struct platform_device *pdev) | |||
| 1139 | u32 regs_base, quirks = 0, idma_addr = 0; | 1126 | u32 regs_base, quirks = 0, idma_addr = 0; |
| 1140 | struct device_node *np = pdev->dev.of_node; | 1127 | struct device_node *np = pdev->dev.of_node; |
| 1141 | const struct samsung_i2s_dai_data *i2s_dai_data; | 1128 | const struct samsung_i2s_dai_data *i2s_dai_data; |
| 1129 | int ret; | ||
| 1142 | 1130 | ||
| 1143 | /* Call during Seconday interface registration */ | 1131 | /* Call during Seconday interface registration */ |
| 1144 | i2s_dai_data = samsung_i2s_get_driver_data(pdev); | 1132 | i2s_dai_data = samsung_i2s_get_driver_data(pdev); |
| @@ -1216,6 +1204,12 @@ static int samsung_i2s_probe(struct platform_device *pdev) | |||
| 1216 | dev_err(&pdev->dev, "Failed to get iis clock\n"); | 1204 | dev_err(&pdev->dev, "Failed to get iis clock\n"); |
| 1217 | return PTR_ERR(pri_dai->clk); | 1205 | return PTR_ERR(pri_dai->clk); |
| 1218 | } | 1206 | } |
| 1207 | |||
| 1208 | ret = clk_prepare_enable(pri_dai->clk); | ||
| 1209 | if (ret != 0) { | ||
| 1210 | dev_err(&pdev->dev, "failed to enable clock: %d\n", ret); | ||
| 1211 | return ret; | ||
| 1212 | } | ||
| 1219 | pri_dai->dma_playback.dma_addr = regs_base + I2STXD; | 1213 | pri_dai->dma_playback.dma_addr = regs_base + I2STXD; |
| 1220 | pri_dai->dma_capture.dma_addr = regs_base + I2SRXD; | 1214 | pri_dai->dma_capture.dma_addr = regs_base + I2SRXD; |
| 1221 | pri_dai->dma_playback.ch_name = "tx"; | 1215 | pri_dai->dma_playback.ch_name = "tx"; |
| @@ -1286,6 +1280,9 @@ static int samsung_i2s_remove(struct platform_device *pdev) | |||
| 1286 | pm_runtime_disable(&pdev->dev); | 1280 | pm_runtime_disable(&pdev->dev); |
| 1287 | } | 1281 | } |
| 1288 | 1282 | ||
| 1283 | if (!is_secondary(i2s)) | ||
| 1284 | clk_disable_unprepare(i2s->clk); | ||
| 1285 | |||
| 1289 | i2s->pri_dai = NULL; | 1286 | i2s->pri_dai = NULL; |
| 1290 | i2s->sec_dai = NULL; | 1287 | i2s->sec_dai = NULL; |
| 1291 | 1288 | ||
