Skip to content

Commit 054f183

Browse files
committed
ASoC: spacemit: add K3 SoC support
Troy Mitchell <troy.mitchell@linux.spacemit.com> says: This series adds K3 SoC support for the SpacemiT I2S controller driver. Patch 1 adds the dt-bindings for the spacemit,k3-i2s compatible. The K3 SoC uses the same I2S IP as K1 but requires additional clocks (sysclk_div, c_sysclk, c_bclk) that are shared across multiple I2S controllers. Patch 2 adds driver support for K3 SoC with additional clocks. Link: https://patch.msgid.link/20260522-k3-i2s-v3-0-08e3eb811d93@linux.spacemit.com
2 parents 36cf165 + 1c6ca2c commit 054f183

2 files changed

Lines changed: 64 additions & 3 deletions

File tree

Documentation/devicetree/bindings/sound/spacemit,k1-i2s.yaml

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
$id: http://devicetree.org/schemas/sound/spacemit,k1-i2s.yaml#
55
$schema: http://devicetree.org/meta-schemas/core.yaml#
66

7-
title: K1 I2S controller
7+
title: SpacemiT K1/K3 I2S controller
88

99
description:
1010
The I2S bus (Inter-IC sound bus) is a serial link for digital
@@ -15,27 +15,54 @@ maintainers:
1515

1616
allOf:
1717
- $ref: dai-common.yaml#
18+
- if:
19+
properties:
20+
compatible:
21+
contains:
22+
const: spacemit,k3-i2s
23+
then:
24+
properties:
25+
clocks:
26+
minItems: 7
27+
clock-names:
28+
minItems: 7
29+
else:
30+
properties:
31+
clocks:
32+
maxItems: 4
33+
clock-names:
34+
maxItems: 4
1835

1936
properties:
2037
compatible:
21-
const: spacemit,k1-i2s
38+
enum:
39+
- spacemit,k1-i2s
40+
- spacemit,k3-i2s
2241

2342
reg:
2443
maxItems: 1
2544

2645
clocks:
46+
minItems: 4
2747
items:
2848
- description: clock for I2S sysclk
2949
- description: clock for I2S bclk
3050
- description: clock for I2S bus
3151
- description: clock for I2S controller
52+
- description: clock for I2S sysclk divider
53+
- description: clock for I2S common sysclk
54+
- description: clock for I2S common bclk
3255

3356
clock-names:
57+
minItems: 4
3458
items:
3559
- const: sysclk
3660
- const: bclk
3761
- const: bus
3862
- const: func
63+
- const: sysclk_div
64+
- const: c_sysclk
65+
- const: c_bclk
3966

4067
dmas:
4168
minItems: 1

sound/soc/spacemit/k1_i2s.c

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ struct spacemit_i2s_dev {
5353
struct clk *sysclk;
5454
struct clk *bclk;
5555
struct clk *sspa_clk;
56+
struct clk *sysclk_div;
57+
struct clk *c_sysclk;
58+
struct clk *c_bclk;
5659

5760
struct snd_dmaengine_dai_dma_data capture_dma_data;
5861
struct snd_dmaengine_dai_dma_data playback_dma_data;
@@ -206,6 +209,14 @@ static int spacemit_i2s_hw_params(struct snd_pcm_substream *substream,
206209
params_rate(params) *
207210
data_bits;
208211

212+
ret = clk_set_rate(i2s->c_sysclk, bclk_rate * 2);
213+
if (ret)
214+
return ret;
215+
216+
ret = clk_set_rate(i2s->c_bclk, bclk_rate);
217+
if (ret)
218+
return ret;
219+
209220
ret = clk_set_rate(i2s->bclk, bclk_rate);
210221
if (ret)
211222
return ret;
@@ -217,10 +228,17 @@ static int spacemit_i2s_set_sysclk(struct snd_soc_dai *cpu_dai, int clk_id,
217228
unsigned int freq, int dir)
218229
{
219230
struct spacemit_i2s_dev *i2s = dev_get_drvdata(cpu_dai->dev);
231+
int ret;
220232

221233
if (freq == 0)
222234
return 0;
223235

236+
if (i2s->sysclk_div) {
237+
ret = clk_set_rate(i2s->sysclk_div, freq);
238+
if (ret)
239+
return ret;
240+
}
241+
224242
return clk_set_rate(i2s->sysclk, freq);
225243
}
226244

@@ -436,6 +454,21 @@ static int spacemit_i2s_probe(struct platform_device *pdev)
436454
return dev_err_probe(i2s->dev, PTR_ERR(i2s->sspa_clk),
437455
"failed to enable sspa clock\n");
438456

457+
i2s->sysclk_div = devm_clk_get_optional_enabled(i2s->dev, "sysclk_div");
458+
if (IS_ERR(i2s->sysclk_div))
459+
return dev_err_probe(i2s->dev, PTR_ERR(i2s->sysclk_div),
460+
"failed to enable sysclk_div clock\n");
461+
462+
i2s->c_sysclk = devm_clk_get_optional_enabled(i2s->dev, "c_sysclk");
463+
if (IS_ERR(i2s->c_sysclk))
464+
return dev_err_probe(i2s->dev, PTR_ERR(i2s->c_sysclk),
465+
"failed to enable c_sysclk clock\n");
466+
467+
i2s->c_bclk = devm_clk_get_optional_enabled(i2s->dev, "c_bclk");
468+
if (IS_ERR(i2s->c_bclk))
469+
return dev_err_probe(i2s->dev, PTR_ERR(i2s->c_bclk),
470+
"failed to enable c_bclk clock\n");
471+
439472
i2s->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
440473
if (IS_ERR(i2s->base))
441474
return dev_err_probe(i2s->dev, PTR_ERR(i2s->base), "failed to map registers\n");
@@ -462,6 +495,7 @@ static int spacemit_i2s_probe(struct platform_device *pdev)
462495

463496
static const struct of_device_id spacemit_i2s_of_match[] = {
464497
{ .compatible = "spacemit,k1-i2s", },
498+
{ .compatible = "spacemit,k3-i2s", },
465499
{ /* sentinel */ }
466500
};
467501
MODULE_DEVICE_TABLE(of, spacemit_i2s_of_match);
@@ -476,4 +510,4 @@ static struct platform_driver spacemit_i2s_driver = {
476510
module_platform_driver(spacemit_i2s_driver);
477511

478512
MODULE_LICENSE("GPL");
479-
MODULE_DESCRIPTION("I2S bus driver for SpacemiT K1 SoC");
513+
MODULE_DESCRIPTION("I2S bus driver for SpacemiT K1/K3 SoC");

0 commit comments

Comments
 (0)