forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-11 1f93a7dfd1f8d5ff7a5c53246c7534fe2332d6f4
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 };
....@@ -132,8 +131,8 @@
132131 {
133132 struct rk_spdif_dev *spdif = snd_soc_dai_get_drvdata(dai);
134133 unsigned int val = SPDIF_CFGR_HALFWORD_ENABLE;
135
- int srate, mclk;
136
- int ret, i;
134
+ unsigned int mclk_rate = clk_get_rate(spdif->mclk);
135
+ int bmc, div, ret, i;
137136 u8 cs[CS_BYTE];
138137 u16 *fc = (u16 *)cs;
139138
....@@ -147,8 +146,10 @@
147146 regmap_update_bits(spdif->regmap, SPDIF_CFGR, SPDIF_CFGR_CSE_MASK,
148147 SPDIF_CFGR_CSE_EN);
149148
150
- srate = params_rate(params);
151
- mclk = srate * 128;
149
+ /* bmc = 128fs */
150
+ bmc = 128 * params_rate(params);
151
+ div = DIV_ROUND_CLOSEST(mclk_rate, bmc);
152
+ val |= SPDIF_CFGR_CLK_DIV(div);
152153
153154 switch (params_format(params)) {
154155 case SNDRV_PCM_FORMAT_S16_LE:
....@@ -169,16 +170,9 @@
169170 return -EINVAL;
170171 }
171172
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
-
180173 regmap_update_bits(spdif->regmap, SPDIF_CFGR, SPDIF_CFGR_CLR_MASK,
181174 SPDIF_CFGR_CLR_EN);
175
+
182176 udelay(1);
183177 ret = regmap_update_bits(spdif->regmap, SPDIF_CFGR,
184178 SPDIF_CFGR_CLK_DIV_MASK |
....@@ -243,7 +237,24 @@
243237 return 0;
244238 }
245239
240
+static int rk_spdif_set_sysclk(struct snd_soc_dai *dai,
241
+ int clk_id, unsigned int freq, int dir)
242
+{
243
+ struct rk_spdif_dev *spdif = snd_soc_dai_get_drvdata(dai);
244
+ int ret = 0;
245
+
246
+ if (!freq)
247
+ return 0;
248
+
249
+ ret = clk_set_rate(spdif->mclk, freq);
250
+ if (ret)
251
+ dev_err(spdif->dev, "Failed to set mclk: %d\n", ret);
252
+
253
+ return ret;
254
+}
255
+
246256 static const struct snd_soc_dai_ops rk_spdif_dai_ops = {
257
+ .set_sysclk = rk_spdif_set_sysclk,
247258 .hw_params = rk_spdif_hw_params,
248259 .trigger = rk_spdif_trigger,
249260 };
....@@ -363,8 +374,7 @@
363374 if (IS_ERR(spdif->mclk))
364375 return PTR_ERR(spdif->mclk);
365376
366
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
367
- regs = devm_ioremap_resource(&pdev->dev, res);
377
+ regs = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
368378 if (IS_ERR(regs))
369379 return PTR_ERR(regs);
370380