forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-01-31 f70575805708cabdedea7498aaa3f710fde4d920
kernel/sound/soc/rockchip/rockchip_spdif.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /* sound/soc/rockchip/rk_spdif.c
23 *
34 * ALSA SoC Audio Layer - Rockchip I2S Controller driver
....@@ -6,10 +7,6 @@
67 * Author: Jianqun <jay.xu@rock-chips.com>
78 * Copyright (c) 2015 Collabora Ltd.
89 * Author: Sjoerd Simons <sjoerd.simons@collabora.co.uk>
9
- *
10
- * This program is free software; you can redistribute it and/or modify
11
- * it under the terms of the GNU General Public License version 2 as
12
- * published by the Free Software Foundation.
1310 */
1411
1512 #include <linux/module.h>
....@@ -63,7 +60,7 @@
6360 struct regmap *regmap;
6461 };
6562
66
-static const struct of_device_id rk_spdif_match[] = {
63
+static const struct of_device_id rk_spdif_match[] __maybe_unused = {
6764 { .compatible = "rockchip,rk3066-spdif",
6865 .data = (void *)RK_SPDIF_RK3066 },
6966 { .compatible = "rockchip,rk3188-spdif",
....@@ -81,6 +78,8 @@
8178 { .compatible = "rockchip,rk3399-spdif",
8279 .data = (void *)RK_SPDIF_RK3366 },
8380 { .compatible = "rockchip,rk3568-spdif",
81
+ .data = (void *)RK_SPDIF_RK3366 },
82
+ { .compatible = "rockchip,rk3588-spdif",
8483 .data = (void *)RK_SPDIF_RK3366 },
8584 {},
8685 };
....@@ -110,6 +109,7 @@
110109
111110 ret = clk_prepare_enable(spdif->hclk);
112111 if (ret) {
112
+ clk_disable_unprepare(spdif->mclk);
113113 dev_err(spdif->dev, "hclk clock enable failed %d\n", ret);
114114 return ret;
115115 }
....@@ -132,8 +132,8 @@
132132 {
133133 struct rk_spdif_dev *spdif = snd_soc_dai_get_drvdata(dai);
134134 unsigned int val = SPDIF_CFGR_HALFWORD_ENABLE;
135
- int srate, mclk;
136
- int ret, i;
135
+ unsigned int mclk_rate = clk_get_rate(spdif->mclk);
136
+ int bmc, div, ret, i;
137137 u8 cs[CS_BYTE];
138138 u16 *fc = (u16 *)cs;
139139
....@@ -147,8 +147,10 @@
147147 regmap_update_bits(spdif->regmap, SPDIF_CFGR, SPDIF_CFGR_CSE_MASK,
148148 SPDIF_CFGR_CSE_EN);
149149
150
- srate = params_rate(params);
151
- mclk = srate * 128;
150
+ /* bmc = 128fs */
151
+ bmc = 128 * params_rate(params);
152
+ div = DIV_ROUND_CLOSEST(mclk_rate, bmc);
153
+ val |= SPDIF_CFGR_CLK_DIV(div);
152154
153155 switch (params_format(params)) {
154156 case SNDRV_PCM_FORMAT_S16_LE:
....@@ -169,16 +171,9 @@
169171 return -EINVAL;
170172 }
171173
172
- /* Set clock and calculate divider */
173
- ret = clk_set_rate(spdif->mclk, mclk);
174
- if (ret != 0) {
175
- dev_err(spdif->dev, "Failed to set module clock rate: %d\n",
176
- ret);
177
- return ret;
178
- }
179
-
180174 regmap_update_bits(spdif->regmap, SPDIF_CFGR, SPDIF_CFGR_CLR_MASK,
181175 SPDIF_CFGR_CLR_EN);
176
+
182177 udelay(1);
183178 ret = regmap_update_bits(spdif->regmap, SPDIF_CFGR,
184179 SPDIF_CFGR_CLK_DIV_MASK |
....@@ -243,7 +238,24 @@
243238 return 0;
244239 }
245240
241
+static int rk_spdif_set_sysclk(struct snd_soc_dai *dai,
242
+ int clk_id, unsigned int freq, int dir)
243
+{
244
+ struct rk_spdif_dev *spdif = snd_soc_dai_get_drvdata(dai);
245
+ int ret = 0;
246
+
247
+ if (!freq)
248
+ return 0;
249
+
250
+ ret = clk_set_rate(spdif->mclk, freq);
251
+ if (ret)
252
+ dev_err(spdif->dev, "Failed to set mclk: %d\n", ret);
253
+
254
+ return ret;
255
+}
256
+
246257 static const struct snd_soc_dai_ops rk_spdif_dai_ops = {
258
+ .set_sysclk = rk_spdif_set_sysclk,
247259 .hw_params = rk_spdif_hw_params,
248260 .trigger = rk_spdif_trigger,
249261 };
....@@ -363,8 +375,7 @@
363375 if (IS_ERR(spdif->mclk))
364376 return PTR_ERR(spdif->mclk);
365377
366
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
367
- regs = devm_ioremap_resource(&pdev->dev, res);
378
+ regs = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
368379 if (IS_ERR(regs))
369380 return PTR_ERR(regs);
370381