audio: TM2 audio basic function bringup [1/1]

PD#SWPL-6721

Problem:
TM2 bringup

Solution:
audio basic function bringup

Verify:
Verified on T962e2_ab311

Change-Id: Ic48ded3964ea87e40c4d683d71a50bbdc1975f91
Signed-off-by: Zhe Wang <Zhe.Wang@amlogic.com>

Conflicts:
	arch/arm64/boot/dts/amlogic/tm2_t962x3_ab301.dts
This commit is contained in:
Zhe Wang
2019-04-05 14:42:48 +08:00
committed by Luke Go
parent bf6c152e02
commit 30a5909fa7
14 changed files with 577 additions and 2091 deletions

View File

@@ -14430,7 +14430,6 @@ F: include/linux/amlogic/meson_cooldev.h
AMLOGIC G12A Audio DRIVER
M: Xing Wang <xing.wang@amlogic.com>
F: sound/soc/amlogic/auge/*
F: sound/soc/codec/amlogic/*
AMLOGIC G12A BL_EXTERN LP8556 DRIVER
M: Weiming Liu <weiming.liu@amlogic.com>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,97 @@
/*
* include/dt-bindings/clock/amlogic,tm2-audio-clk.h
*
* Copyright (C) 2018 Amlogic, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
*/
#ifndef __TM2_AUDIO_CLK_H__
#define __TM2_AUDIO_CLK_H__
/*
* CLKID audio index values
*/
#define CLKID_AUDIO_GATE_DDR_ARB 0
#define CLKID_AUDIO_GATE_PDM 1
#define CLKID_AUDIO_GATE_TDMINA 2
#define CLKID_AUDIO_GATE_TDMINB 3
#define CLKID_AUDIO_GATE_TDMINC 4
#define CLKID_AUDIO_GATE_TDMINLB 5
#define CLKID_AUDIO_GATE_TDMOUTA 6
#define CLKID_AUDIO_GATE_TDMOUTB 7
#define CLKID_AUDIO_GATE_TDMOUTC 8
#define CLKID_AUDIO_GATE_FRDDRA 9
#define CLKID_AUDIO_GATE_FRDDRB 10
#define CLKID_AUDIO_GATE_FRDDRC 11
#define CLKID_AUDIO_GATE_TODDRA 12
#define CLKID_AUDIO_GATE_TODDRB 13
#define CLKID_AUDIO_GATE_TODDRC 14
#define CLKID_AUDIO_GATE_LOOPBACKA 15
#define CLKID_AUDIO_GATE_SPDIFIN 16
#define CLKID_AUDIO_GATE_SPDIFOUT_A 17
#define CLKID_AUDIO_GATE_RESAMPLEA 18
#define CLKID_AUDIO_GATE_RESERVED0 19
#define CLKID_AUDIO_GATE_RESERVED1 20
#define CLKID_AUDIO_GATE_SPDIFOUT_B 21
#define CLKID_AUDIO_GATE_EQDRC 22
#define CLKID_AUDIO_GATE_RESERVED2 23
#define CLKID_AUDIO_GATE_RESERVED3 24
#define CLKID_AUDIO_GATE_RESERVED4 25
#define CLKID_AUDIO_GATE_RESAMPLEB 26
#define CLKID_AUDIO_GATE_TOVAD 27
#define CLKID_AUDIO_GATE_AUDIOLOCKER 28
#define CLKID_AUDIO_GATE_SPDIFIN_LB 29
#define CLKID_AUDIO_GATE_FRATV 30
#define CLKID_AUDIO_GATE_FRHDMIRX 31
/* Gate En1 */
#define CLKID_AUDIO_GATE_FRDDRD 32
#define CLKID_AUDIO_GATE_TODDRD 33
#define CLKID_AUDIO_GATE_LOOPBACKB 34
#define CLKID_AUDIO_GATE_FRDDRE 35
#define CLKID_AUDIO_GATE_TODDRE 36
#define CLKID_AUDIO_GATE_EARCTX 37
#define CLKID_AUDIO_GATE_EARCRX 38
#define CLKID_AUDIO_GATE_RESAMPLEB_OLD 39
#define CLKID_AUDIO_GATE_LOCKER 40
#define CLKID_AUDIO_GATE_MAX 41
#define MCLK_BASE CLKID_AUDIO_GATE_MAX
#define CLKID_AUDIO_MCLK_A (MCLK_BASE + 0)
#define CLKID_AUDIO_MCLK_B (MCLK_BASE + 1)
#define CLKID_AUDIO_MCLK_C (MCLK_BASE + 2)
#define CLKID_AUDIO_MCLK_D (MCLK_BASE + 3)
#define CLKID_AUDIO_MCLK_E (MCLK_BASE + 4)
#define CLKID_AUDIO_MCLK_F (MCLK_BASE + 5)
#define CLKID_AUDIO_SPDIFIN (MCLK_BASE + 6)
#define CLKID_AUDIO_SPDIFOUT_A (MCLK_BASE + 7)
#define CLKID_AUDIO_RESAMPLE_A (MCLK_BASE + 8)
#define CLKID_AUDIO_LOCKER_OUT (MCLK_BASE + 9)
#define CLKID_AUDIO_LOCKER_IN (MCLK_BASE + 10)
#define CLKID_AUDIO_PDMIN0 (MCLK_BASE + 11)
#define CLKID_AUDIO_PDMIN1 (MCLK_BASE + 12)
#define CLKID_AUDIO_SPDIFOUT_B (MCLK_BASE + 13)
#define CLKID_AUDIO_RESAMPLE_B (MCLK_BASE + 14)
#define CLKID_AUDIO_SPDIFIN_LB (MCLK_BASE + 15)
#define CLKID_AUDIO_EQDRC (MCLK_BASE + 16)
#define CLKID_AUDIO_VAD (MCLK_BASE + 17)
#define CLKID_EARCTX_CMDC (MCLK_BASE + 18)
#define CLKID_EARCTX_DMAC (MCLK_BASE + 19)
#define CLKID_EARCRX_CMDC (MCLK_BASE + 20)
#define CLKID_EARCRX_DMAC (MCLK_BASE + 21)
#define NUM_AUDIO_CLKS (MCLK_BASE + 22)
#endif /* __TM2_AUDIO_CLK_H__ */

View File

@@ -5,6 +5,7 @@ obj-$(CONFIG_AMLOGIC_SND_SOC_AUGE) += audio_controller.o \
g12a,clocks.o \
tl1,clocks.o \
sm1,clocks.o \
tm2,clocks.o \
card.o \
card_utils.o \
tdm.o \

View File

@@ -40,6 +40,10 @@ static const struct of_device_id audio_clocks_of_match[] = {
.compatible = "amlogic, sm1-audio-clocks",
.data = &sm1_audio_clks_init,
},
{
.compatible = "amlogic, tm2-audio-clocks",
.data = &tm2_audio_clks_init,
},
{},
};
MODULE_DEVICE_TABLE(of, audio_clocks_of_match);

View File

@@ -94,6 +94,7 @@ extern struct audio_clk_init axg_audio_clks_init;
extern struct audio_clk_init g12a_audio_clks_init;
extern struct audio_clk_init tl1_audio_clks_init;
extern struct audio_clk_init sm1_audio_clks_init;
extern struct audio_clk_init tm2_audio_clks_init;
struct clk_chipinfo {
/* force clock source as oscin(24M) */

View File

@@ -104,6 +104,7 @@ static int register_audio_controller(struct platform_device *pdev,
/* gate on all clks on bringup stage, need gate separately */
aml_audiobus_write(actrl, EE_AUDIO_CLK_GATE_EN0, 0xffffffff);
aml_audiobus_write(actrl, EE_AUDIO_CLK_GATE_EN1, 0xffffffff);
return 0;
}

View File

@@ -877,6 +877,10 @@ static const struct of_device_id auge_of_match[] = {
.compatible = "amlogic, tl1-sound-card",
.data = &tl1_chipset_info,
},
{
.compatible = "amlogic, tm2-sound-card",
.data = &tl1_chipset_info,
},
{},
};
MODULE_DEVICE_TABLE(of, auge_of_match);
@@ -919,9 +923,8 @@ static int aml_card_probe(struct platform_device *pdev)
ret = aml_card_parse_of(np, priv);
if (ret < 0) {
if (ret != -EPROBE_DEFER)
dev_err(dev, "%s, parse error %d\n",
__func__, ret);
dev_err(dev, "%s, parse error %d\n",
__func__, ret);
goto err;
}

View File

@@ -406,7 +406,7 @@ void aml_toddr_set_fifos(struct toddr *to, unsigned int thresh)
if (to->chipinfo && to->chipinfo->ugt) {
reg = calc_toddr_address(EE_AUDIO_TODDR_A_CTRL0, reg_base);
aml_audiobus_update_bits(actrl, reg, 0x0 << 0, 0x1 << 0);
aml_audiobus_update_bits(actrl, reg, 0x1, 0x1);
}
}
@@ -1317,8 +1317,8 @@ void aml_frddr_set_fifos(struct frddr *fr,
(depth - 1)<<24 | (thresh - 1)<<16 | 2<<8);
if (fr->chipinfo && fr->chipinfo->ugt) {
reg = calc_toddr_address(EE_AUDIO_FRDDR_A_CTRL0, reg_base);
aml_audiobus_update_bits(actrl, reg, 0x0 << 0, 0x1 << 0);
reg = calc_frddr_address(EE_AUDIO_FRDDR_A_CTRL0, reg_base);
aml_audiobus_update_bits(actrl, reg, 0x1, 0x1);
}
}

View File

@@ -625,6 +625,9 @@ static const struct of_device_id earc_device_id[] = {
{
.compatible = "amlogic, sm1-snd-earc",
},
{
.compatible = "amlogic, tm2-snd-earc",
},
{},
};
@@ -664,7 +667,7 @@ static int earc_platform_probe(struct platform_device *pdev)
if (IS_ERR(p_earc->clk_rx_gate)) {
dev_err(&pdev->dev,
"Can't get earc gate\n");
return PTR_ERR(p_earc->clk_rx_gate);
/*return PTR_ERR(p_earc->clk_rx_gate);*/
}
/* RX */
p_earc->clk_rx_cmdc = devm_clk_get(&pdev->dev, "rx_cmdc");

View File

@@ -31,6 +31,12 @@ static struct pdm_chipinfo sm1_pdm_chipinfo = {
.train = true,
};
static struct pdm_chipinfo tm2_pdm_chipinfo = {
.mute_fn = true,
.truncate_data = false,
.train = true,
};
static const struct of_device_id aml_pdm_device_id[] = {
{
.compatible = "amlogic, axg-snd-pdm",
@@ -47,6 +53,10 @@ static const struct of_device_id aml_pdm_device_id[] = {
.compatible = "amlogic, sm1-snd-pdm",
.data = &sm1_pdm_chipinfo,
},
{
.compatible = "amlogic, tm2-snd-pdm",
.data = &tm2_pdm_chipinfo,
},
{}
};

View File

@@ -92,6 +92,20 @@ struct spdif_chipinfo sm1_spdif_b_chipinfo = {
.eq_drc_en = true,
};
struct spdif_chipinfo tm2_spdif_a_chipinfo = {
.id = SPDIF_A,
.chnum_en = true,
.hold_start = true,
.eq_drc_en = true,
};
struct spdif_chipinfo tm2_spdif_b_chipinfo = {
.id = SPDIF_B,
.chnum_en = true,
.hold_start = true,
.eq_drc_en = true,
};
static const struct of_device_id aml_spdif_device_id[] = {
{
.compatible = "amlogic, axg-snd-spdif",
@@ -121,6 +135,14 @@ static const struct of_device_id aml_spdif_device_id[] = {
.compatible = "amlogic, sm1-snd-spdif-b",
.data = &sm1_spdif_b_chipinfo,
},
{
.compatible = "amlogic, tm2-snd-spdif-a",
.data = &tm2_spdif_a_chipinfo,
},
{
.compatible = "amlogic, tm2-snd-spdif-b",
.data = &tm2_spdif_b_chipinfo,
},
{},
};
MODULE_DEVICE_TABLE(of, aml_spdif_device_id);

View File

@@ -132,6 +132,30 @@ struct tdm_chipinfo sm1_tdmc_chipinfo = {
.lane_cnt = LANE_MAX1,
};
struct tdm_chipinfo tm2_tdma_chipinfo = {
.id = TDM_A,
.sclk_ws_inv = true,
.oe_fn = true,
.same_src_fn = true,
.lane_cnt = LANE_MAX0,
};
struct tdm_chipinfo tm2_tdmb_chipinfo = {
.id = TDM_B,
.sclk_ws_inv = true,
.oe_fn = true,
.same_src_fn = true,
.lane_cnt = LANE_MAX3,
};
struct tdm_chipinfo tm2_tdmc_chipinfo = {
.id = TDM_C,
.sclk_ws_inv = true,
.oe_fn = true,
.same_src_fn = true,
.lane_cnt = LANE_MAX1,
};
static const struct of_device_id aml_tdm_device_id[] = {
{
.compatible = "amlogic, axg-snd-tdma",
@@ -181,6 +205,18 @@ static const struct of_device_id aml_tdm_device_id[] = {
.compatible = "amlogic, sm1-snd-tdmc",
.data = &sm1_tdmc_chipinfo,
},
{
.compatible = "amlogic, tm2-snd-tdma",
.data = &tm2_tdma_chipinfo,
},
{
.compatible = "amlogic, tm2-snd-tdmb",
.data = &tm2_tdmb_chipinfo,
},
{
.compatible = "amlogic, tm2-snd-tdmc",
.data = &tm2_tdmc_chipinfo,
},
{},
};
MODULE_DEVICE_TABLE(of, aml_tdm_device_id);

View File

@@ -0,0 +1,392 @@
/*
* sound/soc/amlogic/auge/tm2_clocks.c
*
* Copyright (C) 2019 Amlogic, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
*/
#undef pr_fmt
#define pr_fmt(fmt) "tm2_audio_clocks: " fmt
#include <dt-bindings/clock/amlogic,tm2-audio-clk.h>
#include "audio_clks.h"
#include "regs.h"
static spinlock_t aclk_lock;
static const char *const mclk_parent_names[] = {
"mpll0", "mpll1", "mpll2", "mpll3", "hifi_pll",
"fclk_div3", "fclk_div4", "fclk_div5"};
static const char *const audioclk_parent_names[] = {
"mclk_a", "mclk_b", "mclk_c", "mclk_d", "mclk_e",
"mclk_f", "i_slv_sclk_a", "i_slv_sclk_b", "i_slv_sclk_c",
"i_slv_sclk_d", "i_slv_sclk_e", "i_slv_sclk_f", "i_slv_sclk_g",
"i_slv_sclk_h", "i_slv_sclk_i", "i_slv_sclk_j"};
CLOCK_GATE(audio_ddr_arb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 0);
CLOCK_GATE(audio_pdm, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 1);
CLOCK_GATE(audio_tdmina, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 2);
CLOCK_GATE(audio_tdminb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 3);
CLOCK_GATE(audio_tdminc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 4);
CLOCK_GATE(audio_tdminlb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 5);
CLOCK_GATE(audio_tdmouta, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 6);
CLOCK_GATE(audio_tdmoutb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 7);
CLOCK_GATE(audio_tdmoutc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 8);
CLOCK_GATE(audio_frddra, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 9);
CLOCK_GATE(audio_frddrb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 10);
CLOCK_GATE(audio_frddrc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 11);
CLOCK_GATE(audio_toddra, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 12);
CLOCK_GATE(audio_toddrb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 13);
CLOCK_GATE(audio_toddrc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 14);
CLOCK_GATE(audio_loopbacka, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 15);
CLOCK_GATE(audio_spdifin, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 16);
CLOCK_GATE(audio_spdifout, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 17);
CLOCK_GATE(audio_resamplea, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 18);
CLOCK_GATE(audio_reserved0, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 19);
CLOCK_GATE(audio_reserved1, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 20);
CLOCK_GATE(audio_spdifoutb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 21);
CLOCK_GATE(audio_eqdrc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 22);
CLOCK_GATE(audio_reserved2, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 23);
CLOCK_GATE(audio_reserved3, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 24);
CLOCK_GATE(audio_reserved4, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 25);
CLOCK_GATE(audio_resampleb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 26);
CLOCK_GATE(audio_tovad, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 27);
CLOCK_GATE(audio_audiolocker, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 28);
CLOCK_GATE(audio_spdifin_lb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 29);
CLOCK_GATE(audio_fratv, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 30);
CLOCK_GATE(audio_frhdmirx, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 31);
CLOCK_GATE(audio_frddrd, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN1), 0);
CLOCK_GATE(audio_toddrd, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN1), 1);
CLOCK_GATE(audio_loopbackb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN1), 2);
CLOCK_GATE(audio_frddre, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN1), 3);
CLOCK_GATE(audio_toddre, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN1), 4);
CLOCK_GATE(audio_earctx, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN1), 5);
CLOCK_GATE(audio_earcrx, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN1), 6);
CLOCK_GATE(audio_resampleb_old, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN1), 7);
CLOCK_GATE(audio_locker, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN1), 8);
static struct clk_gate *tm2_audio_clk_gates[] = {
&audio_ddr_arb,
&audio_pdm,
&audio_tdmina,
&audio_tdminb,
&audio_tdminc,
&audio_tdminlb,
&audio_tdmouta,
&audio_tdmoutb,
&audio_tdmoutc,
&audio_frddra,
&audio_frddrb,
&audio_frddrc,
&audio_toddra,
&audio_toddrb,
&audio_toddrc,
&audio_loopbacka,
&audio_spdifin,
&audio_spdifout,
&audio_resamplea,
&audio_reserved0,
&audio_reserved1,
&audio_spdifoutb,
&audio_eqdrc,
&audio_reserved2,
&audio_reserved3,
&audio_reserved4,
&audio_resampleb,
&audio_tovad,
&audio_audiolocker,
&audio_spdifin_lb,
&audio_fratv,
&audio_frhdmirx,
&audio_frddrd,
&audio_toddrd,
&audio_loopbackb,
&audio_frddre,
&audio_toddre,
&audio_earctx,
&audio_earcrx,
&audio_resampleb_old,
&audio_locker,
};
/* Array of all clocks provided by this provider */
static struct clk_hw *tm2_audio_clk_hws[] = {
[CLKID_AUDIO_GATE_DDR_ARB] = &audio_ddr_arb.hw,
[CLKID_AUDIO_GATE_PDM] = &audio_pdm.hw,
[CLKID_AUDIO_GATE_TDMINA] = &audio_tdmina.hw,
[CLKID_AUDIO_GATE_TDMINB] = &audio_tdminb.hw,
[CLKID_AUDIO_GATE_TDMINC] = &audio_tdminc.hw,
[CLKID_AUDIO_GATE_TDMINLB] = &audio_tdminlb.hw,
[CLKID_AUDIO_GATE_TDMOUTA] = &audio_tdmouta.hw,
[CLKID_AUDIO_GATE_TDMOUTB] = &audio_tdmoutb.hw,
[CLKID_AUDIO_GATE_TDMOUTC] = &audio_tdmoutc.hw,
[CLKID_AUDIO_GATE_FRDDRA] = &audio_frddra.hw,
[CLKID_AUDIO_GATE_FRDDRB] = &audio_frddrb.hw,
[CLKID_AUDIO_GATE_FRDDRC] = &audio_frddrc.hw,
[CLKID_AUDIO_GATE_TODDRA] = &audio_toddra.hw,
[CLKID_AUDIO_GATE_TODDRB] = &audio_toddrb.hw,
[CLKID_AUDIO_GATE_TODDRC] = &audio_toddrc.hw,
[CLKID_AUDIO_GATE_LOOPBACKA] = &audio_loopbacka.hw,
[CLKID_AUDIO_GATE_SPDIFIN] = &audio_spdifin.hw,
[CLKID_AUDIO_GATE_SPDIFOUT_A] = &audio_spdifout.hw,
[CLKID_AUDIO_GATE_RESAMPLEA] = &audio_resamplea.hw,
[CLKID_AUDIO_GATE_RESERVED0] = &audio_reserved0.hw,
[CLKID_AUDIO_GATE_RESERVED1] = &audio_reserved1.hw,
[CLKID_AUDIO_GATE_SPDIFOUT_B] = &audio_spdifoutb.hw,
[CLKID_AUDIO_GATE_EQDRC] = &audio_eqdrc.hw,
[CLKID_AUDIO_GATE_RESERVED2] = &audio_reserved2.hw,
[CLKID_AUDIO_GATE_RESERVED3] = &audio_reserved3.hw,
[CLKID_AUDIO_GATE_RESERVED4] = &audio_reserved4.hw,
[CLKID_AUDIO_GATE_RESAMPLEB] = &audio_resampleb.hw,
[CLKID_AUDIO_GATE_TOVAD] = &audio_tovad.hw,
[CLKID_AUDIO_GATE_AUDIOLOCKER] = &audio_audiolocker.hw,
[CLKID_AUDIO_GATE_SPDIFIN_LB] = &audio_spdifin_lb.hw,
[CLKID_AUDIO_GATE_FRATV] = &audio_fratv.hw,
[CLKID_AUDIO_GATE_FRHDMIRX] = &audio_frhdmirx.hw,
[CLKID_AUDIO_GATE_FRDDRD] = &audio_frddrd.hw,
[CLKID_AUDIO_GATE_TODDRD] = &audio_toddrd.hw,
[CLKID_AUDIO_GATE_LOOPBACKB] = &audio_loopbackb.hw,
[CLKID_AUDIO_GATE_FRDDRE] = &audio_frddre.hw,
[CLKID_AUDIO_GATE_TODDRE] = &audio_toddre.hw,
[CLKID_AUDIO_GATE_EARCTX] = &audio_earctx.hw,
[CLKID_AUDIO_GATE_EARCRX] = &audio_earcrx.hw,
[CLKID_AUDIO_GATE_RESAMPLEB_OLD] = &audio_resampleb_old.hw,
[CLKID_AUDIO_GATE_LOCKER] = &audio_locker.hw,
};
static int tm2_clk_gates_init(struct clk **clks, void __iomem *iobase)
{
int clkid;
if (ARRAY_SIZE(tm2_audio_clk_gates) != MCLK_BASE) {
pr_err("check clk gates number\n");
return -EINVAL;
}
for (clkid = 0; clkid < MCLK_BASE; clkid++) {
tm2_audio_clk_gates[clkid]->reg = iobase;
clks[clkid] = clk_register(NULL, tm2_audio_clk_hws[clkid]);
WARN_ON(IS_ERR_OR_NULL(clks[clkid]));
}
return 0;
}
/* mclk_a */
CLOCK_COM_MUX(mclk_a, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_A_CTRL(1)), 0x7, 24);
CLOCK_COM_DIV(mclk_a, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_A_CTRL(1)), 0, 16);
CLOCK_COM_GATE(mclk_a, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_A_CTRL(1)), 31);
/* mclk_b */
CLOCK_COM_MUX(mclk_b, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_B_CTRL(1)), 0x7, 24);
CLOCK_COM_DIV(mclk_b, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_B_CTRL(1)), 0, 16);
CLOCK_COM_GATE(mclk_b, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_B_CTRL(1)), 31);
/* mclk_c */
CLOCK_COM_MUX(mclk_c, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_C_CTRL(1)), 0x7, 24);
CLOCK_COM_DIV(mclk_c, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_C_CTRL(1)), 0, 16);
CLOCK_COM_GATE(mclk_c, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_C_CTRL(1)), 31);
/* mclk_d */
CLOCK_COM_MUX(mclk_d, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_D_CTRL(1)), 0x7, 24);
CLOCK_COM_DIV(mclk_d, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_D_CTRL(1)), 0, 16);
CLOCK_COM_GATE(mclk_d, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_D_CTRL(1)), 31);
/* mclk_e */
CLOCK_COM_MUX(mclk_e, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_E_CTRL(1)), 0x7, 24);
CLOCK_COM_DIV(mclk_e, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_E_CTRL(1)), 0, 16);
CLOCK_COM_GATE(mclk_e, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_E_CTRL(1)), 31);
/* mclk_f */
CLOCK_COM_MUX(mclk_f, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_F_CTRL(1)), 0x7, 24);
CLOCK_COM_DIV(mclk_f, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_F_CTRL(1)), 0, 16);
CLOCK_COM_GATE(mclk_f, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_F_CTRL(1)), 31);
/* spdifin */
CLOCK_COM_MUX(spdifin, AUD_ADDR_OFFSET(EE_AUDIO_CLK_SPDIFIN_CTRL), 0x7, 24);
CLOCK_COM_DIV(spdifin, AUD_ADDR_OFFSET(EE_AUDIO_CLK_SPDIFIN_CTRL), 0, 8);
CLOCK_COM_GATE(spdifin, AUD_ADDR_OFFSET(EE_AUDIO_CLK_SPDIFIN_CTRL), 31);
/* spdifout */
CLOCK_COM_MUX(spdifout, AUD_ADDR_OFFSET(EE_AUDIO_CLK_SPDIFOUT_CTRL), 0x7, 24);
CLOCK_COM_DIV(spdifout, AUD_ADDR_OFFSET(EE_AUDIO_CLK_SPDIFOUT_CTRL), 0, 10);
CLOCK_COM_GATE(spdifout, AUD_ADDR_OFFSET(EE_AUDIO_CLK_SPDIFOUT_CTRL), 31);
/* audio resample_a */
CLOCK_COM_MUX(resample_a,
AUD_ADDR_OFFSET(EE_AUDIO_CLK_RESAMPLEA_CTRL), 0xf, 24);
CLOCK_COM_DIV(resample_a, AUD_ADDR_OFFSET(EE_AUDIO_CLK_RESAMPLEA_CTRL), 0, 8);
CLOCK_COM_GATE(resample_a, AUD_ADDR_OFFSET(EE_AUDIO_CLK_RESAMPLEA_CTRL), 31);
/* audio locker_out */
CLOCK_COM_MUX(locker_out, AUD_ADDR_OFFSET(EE_AUDIO_CLK_LOCKER_CTRL), 0xf, 24);
CLOCK_COM_DIV(locker_out, AUD_ADDR_OFFSET(EE_AUDIO_CLK_LOCKER_CTRL), 16, 8);
CLOCK_COM_GATE(locker_out, AUD_ADDR_OFFSET(EE_AUDIO_CLK_LOCKER_CTRL), 31);
/* audio locker_in */
CLOCK_COM_MUX(locker_in, AUD_ADDR_OFFSET(EE_AUDIO_CLK_LOCKER_CTRL), 0xf, 8);
CLOCK_COM_DIV(locker_in, AUD_ADDR_OFFSET(EE_AUDIO_CLK_LOCKER_CTRL), 0, 8);
CLOCK_COM_GATE(locker_in, AUD_ADDR_OFFSET(EE_AUDIO_CLK_LOCKER_CTRL), 15);
/* pdmin0 */
CLOCK_COM_MUX(pdmin0, AUD_ADDR_OFFSET(EE_AUDIO_CLK_PDMIN_CTRL0), 0x7, 24);
CLOCK_COM_DIV(pdmin0, AUD_ADDR_OFFSET(EE_AUDIO_CLK_PDMIN_CTRL0), 0, 16);
CLOCK_COM_GATE(pdmin0, AUD_ADDR_OFFSET(EE_AUDIO_CLK_PDMIN_CTRL0), 31);
/* pdmin1 */
CLOCK_COM_MUX(pdmin1, AUD_ADDR_OFFSET(EE_AUDIO_CLK_PDMIN_CTRL1), 0x7, 24);
CLOCK_COM_DIV(pdmin1, AUD_ADDR_OFFSET(EE_AUDIO_CLK_PDMIN_CTRL1), 0, 16);
CLOCK_COM_GATE(pdmin1, AUD_ADDR_OFFSET(EE_AUDIO_CLK_PDMIN_CTRL1), 31);
/* spdifout b*/
CLOCK_COM_MUX(spdifout_b,
AUD_ADDR_OFFSET(EE_AUDIO_CLK_SPDIFOUT_B_CTRL), 0x7, 24);
CLOCK_COM_DIV(spdifout_b, AUD_ADDR_OFFSET(EE_AUDIO_CLK_SPDIFOUT_B_CTRL), 0, 10);
CLOCK_COM_GATE(spdifout_b, AUD_ADDR_OFFSET(EE_AUDIO_CLK_SPDIFOUT_B_CTRL), 31);
/* audio resample_b */
CLOCK_COM_MUX(resample_b,
AUD_ADDR_OFFSET(EE_AUDIO_CLK_RESAMPLEB_CTRL), 0xf, 24);
CLOCK_COM_DIV(resample_b, AUD_ADDR_OFFSET(EE_AUDIO_CLK_RESAMPLEB_CTRL), 0, 8);
CLOCK_COM_GATE(resample_b, AUD_ADDR_OFFSET(EE_AUDIO_CLK_RESAMPLEB_CTRL), 31);
/* spdifin_lb, div is a fake */
CLOCK_COM_MUX(spdifin_lb,
AUD_ADDR_OFFSET(EE_AUDIO_CLK_SPDIFOUT_B_CTRL), 0x1, 30);
CLOCK_COM_DIV(spdifin_lb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_SPDIFOUT_B_CTRL), 0, 29);
CLOCK_COM_GATE(spdifin_lb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_SPDIFOUT_B_CTRL), 31);
/* audio eqdrc */
CLOCK_COM_MUX(eqdrc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_EQDRC_CTRL0), 0x7, 24);
CLOCK_COM_DIV(eqdrc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_EQDRC_CTRL0), 0, 16);
CLOCK_COM_GATE(eqdrc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_EQDRC_CTRL0), 31);
/* audio vad */
CLOCK_COM_MUX(vad, AUD_ADDR_OFFSET(EE_AUDIO_VAD_CLK_CTRL), 0x7, 24);
CLOCK_COM_DIV(vad, AUD_ADDR_OFFSET(EE_AUDIO_VAD_CLK_CTRL), 0, 16);
CLOCK_COM_GATE(vad, AUD_ADDR_OFFSET(EE_AUDIO_VAD_CLK_CTRL), 31);
/* EARC TX CMDC */
CLOCK_COM_MUX(earctx_cmdc,
AUD_ADDR_OFFSET(EE_AUDIO_EARCTX_CMDC_CLK_CTRL), 0x7, 24);
CLOCK_COM_DIV(earctx_cmdc,
AUD_ADDR_OFFSET(EE_AUDIO_EARCTX_CMDC_CLK_CTRL), 0, 16);
CLOCK_COM_GATE(earctx_cmdc,
AUD_ADDR_OFFSET(EE_AUDIO_EARCTX_CMDC_CLK_CTRL), 31);
/* EARC TX DMAC */
CLOCK_COM_MUX(earctx_dmac,
AUD_ADDR_OFFSET(EE_AUDIO_EARCTX_DMAC_CLK_CTRL), 0x7, 24);
CLOCK_COM_DIV(earctx_dmac,
AUD_ADDR_OFFSET(EE_AUDIO_EARCTX_DMAC_CLK_CTRL), 0, 16);
CLOCK_COM_GATE(earctx_dmac,
AUD_ADDR_OFFSET(EE_AUDIO_EARCTX_DMAC_CLK_CTRL), 31);
/* EARC RX CMDC */
CLOCK_COM_MUX(earcrx_cmdc,
AUD_ADDR_OFFSET(EE_AUDIO_EARCRX_CMDC_CLK_CTRL), 0x7, 24);
CLOCK_COM_DIV(earcrx_cmdc,
AUD_ADDR_OFFSET(EE_AUDIO_EARCRX_CMDC_CLK_CTRL), 0, 16);
CLOCK_COM_GATE(earcrx_cmdc,
AUD_ADDR_OFFSET(EE_AUDIO_EARCRX_CMDC_CLK_CTRL), 31);
/* EARC RX DMAC */
CLOCK_COM_MUX(earcrx_dmac,
AUD_ADDR_OFFSET(EE_AUDIO_EARCRX_DMAC_CLK_CTRL), 0x7, 24);
CLOCK_COM_DIV(earcrx_dmac,
AUD_ADDR_OFFSET(EE_AUDIO_EARCRX_DMAC_CLK_CTRL), 0, 16);
CLOCK_COM_GATE(earcrx_dmac,
AUD_ADDR_OFFSET(EE_AUDIO_EARCRX_DMAC_CLK_CTRL), 31);
static int tm2_clks_init(struct clk **clks, void __iomem *iobase)
{
IOMAP_COM_CLK(mclk_a, iobase);
clks[CLKID_AUDIO_MCLK_A] = REGISTER_CLK_COM(mclk_a);
WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_MCLK_A]));
IOMAP_COM_CLK(mclk_b, iobase);
clks[CLKID_AUDIO_MCLK_B] = REGISTER_CLK_COM(mclk_b);
WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_MCLK_B]));
IOMAP_COM_CLK(mclk_c, iobase);
clks[CLKID_AUDIO_MCLK_C] = REGISTER_CLK_COM(mclk_c);
WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_MCLK_C]));
IOMAP_COM_CLK(mclk_d, iobase);
clks[CLKID_AUDIO_MCLK_D] = REGISTER_CLK_COM(mclk_d);
WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_MCLK_D]));
IOMAP_COM_CLK(mclk_e, iobase);
clks[CLKID_AUDIO_MCLK_E] = REGISTER_CLK_COM(mclk_e);
WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_MCLK_E]));
IOMAP_COM_CLK(mclk_f, iobase);
clks[CLKID_AUDIO_MCLK_F] = REGISTER_CLK_COM(mclk_f);
WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_MCLK_F]));
IOMAP_COM_CLK(spdifin, iobase);
clks[CLKID_AUDIO_SPDIFIN] = REGISTER_CLK_COM(spdifin);
WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_SPDIFIN]));
IOMAP_COM_CLK(spdifout, iobase);
clks[CLKID_AUDIO_SPDIFOUT_A] = REGISTER_CLK_COM(spdifout);
WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_SPDIFOUT_A]));
IOMAP_COM_CLK(resample_a, iobase);
clks[CLKID_AUDIO_RESAMPLE_A] = REGISTER_AUDIOCLK_COM(resample_a);
WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_RESAMPLE_A]));
IOMAP_COM_CLK(locker_out, iobase);
clks[CLKID_AUDIO_LOCKER_OUT] = REGISTER_AUDIOCLK_COM(locker_out);
WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_LOCKER_OUT]));
IOMAP_COM_CLK(locker_in, iobase);
clks[CLKID_AUDIO_LOCKER_IN] = REGISTER_AUDIOCLK_COM(locker_in);
WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_LOCKER_IN]));
IOMAP_COM_CLK(pdmin0, iobase);
clks[CLKID_AUDIO_PDMIN0] = REGISTER_CLK_COM(pdmin0);
WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_PDMIN0]));
IOMAP_COM_CLK(pdmin1, iobase);
clks[CLKID_AUDIO_PDMIN1] = REGISTER_CLK_COM(pdmin1);
WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_PDMIN1]));
IOMAP_COM_CLK(spdifout_b, iobase);
clks[CLKID_AUDIO_SPDIFOUT_B] = REGISTER_CLK_COM(spdifout_b);
WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_SPDIFOUT_B]));
IOMAP_COM_CLK(resample_b, iobase);
clks[CLKID_AUDIO_RESAMPLE_B] = REGISTER_AUDIOCLK_COM(resample_b);
WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_RESAMPLE_B]));
IOMAP_COM_CLK(spdifin_lb, iobase);
clks[CLKID_AUDIO_SPDIFIN_LB] = REGISTER_CLK_COM(spdifin_lb);
WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_SPDIFIN_LB]));
IOMAP_COM_CLK(eqdrc, iobase);
clks[CLKID_AUDIO_EQDRC] = REGISTER_CLK_COM(eqdrc);
WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_EQDRC]));
IOMAP_COM_CLK(vad, iobase);
clks[CLKID_AUDIO_VAD] = REGISTER_CLK_COM(vad);
WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_VAD]));
IOMAP_COM_CLK(earctx_cmdc, iobase);
clks[CLKID_EARCTX_CMDC] = REGISTER_CLK_COM(earctx_cmdc);
WARN_ON(IS_ERR_OR_NULL(clks[CLKID_EARCTX_CMDC]));
IOMAP_COM_CLK(earctx_dmac, iobase);
clks[CLKID_EARCTX_DMAC] = REGISTER_CLK_COM(earctx_dmac);
WARN_ON(IS_ERR_OR_NULL(clks[CLKID_EARCTX_DMAC]));
IOMAP_COM_CLK(earcrx_cmdc, iobase);
clks[CLKID_EARCRX_CMDC] = REGISTER_CLK_COM(earcrx_cmdc);
WARN_ON(IS_ERR_OR_NULL(clks[CLKID_EARCRX_CMDC]));
IOMAP_COM_CLK(earcrx_dmac, iobase);
clks[CLKID_EARCRX_DMAC] = REGISTER_CLK_COM(earcrx_dmac);
WARN_ON(IS_ERR_OR_NULL(clks[CLKID_EARCRX_DMAC]));
return 0;
}
struct audio_clk_init tm2_audio_clks_init = {
.clk_num = NUM_AUDIO_CLKS,
.clk_gates = tm2_clk_gates_init,
.clks = tm2_clks_init,
};