blob: 66fad9f130f472e1146a412b782517c9861f3134 [file] [log] [blame]
/**
* system/src/peripheral/rct_audio.c
*
* History:
* 2005/07/25 - [Charles Chiou] created file
* 2008/02/19 - [Allen Wang] changed to use capabilities and chip ID
*
* Copyright (C) 2004-2008, Ambarella, Inc.
*
* All rights reserved. No Part of this file may be reproduced, stored
* in a retrieval system, or transmitted, in any form, or by any means,
* electronic, mechanical, photocopying, recording, or otherwise,
* without the prior consent of Ambarella, Inc.
*/
#if (RCT_AUDIO_PLL_USE_HAL_API == 1)
u32 get_audio_freq_hz(void)
{
return (u32) amb_get_audio_clock_frequency(HAL_BASE_VP);
}
#else
extern void rct_alan_zhu_magic_loop(int clk_chk);
extern u32 get_spclk_freq_hz(void);
static const u8 audiopll_ref_table[3][2] = {
{0x00, 0x00}, {0x01, 0x00}, {0x01, 0x01}
};
static u32 aud_sysclk = 12288000;
static void rct_set_audio_freq_hz(u32 aud_clk)
{
aud_sysclk = aud_clk;
}
u32 get_audio_freq_hz(void)
{
return aud_sysclk;
}
#endif
void rct_set_pll_frac_mode(void)
{
#if (RCT_AUDIO_PLL_CONF_MODE == 2)
/* set audio PLL ctrl3 register */
writel(PLL_AUDIO_CTRL3_REG, 0x00069300); //need set this register to enable fractional mode by a5/a2s/a2m pm
#endif
}
void rct_set_aud_ctrl2_reg(void)
{
#if (RCT_AUDIO_PLL_CONF_MODE == 2)
/* set audio PLL ctrl2 register */
writel(PLL_AUDIO_CTRL2_REG, 0x3f770000); //set as program manual comment
#endif
}
static const u32 mclk_table[MAX_MCLK_IDX_NUM] = {
18432000,
16934400,
12288000,
11289600,
9216000,
8467200,
8192000,
6144000,
5644800,
4608000,
4233600,
4096000,
3072000,
2822400,
2048000
};
#if (RCT_AUDIO_PLL_USE_HAL_API == 1)
void rct_set_audio_pll_hal(u8 op_mode, amb_clock_frequency_t set_freq)
{
int chk_count = 0;
amb_hal_success_t success;
amb_clock_source_t clk_src_sel;
switch (op_mode) {
#if (CHIP_REV == A5S)
case AUC_CLK_ONCHIP_PLL_SP_CLK:
clk_src_sel = AMB_PLL_REFERENCE_CLOCK_SOURCE_SP_CLK;
break;
#endif
case AUC_CLK_ONCHIP_PLL_CLK_SI:
clk_src_sel = AMB_PLL_REFERENCE_CLOCK_SOURCE_CLK_SI;
break;
case AUC_CLK_ONCHIP_PLL_LVDS_IDSP_SCLK:
clk_src_sel = AMB_PLL_REFERENCE_CLOCK_SOURCE_LVDS_IDSP_SCLK;
break;
case AUC_CLK_EXTERNAL:
clk_src_sel = AMB_EXTERNAL_CLOCK_SOURCE;
break;
default:
case AUC_CLK_ONCHIP_PLL_27MHZ:
clk_src_sel = AMB_PLL_REFERENCE_CLOCK_SOURCE_CLK_REF;
break;
}
if (clk_src_sel == AMB_PLL_REFERENCE_CLOCK_SOURCE_CLK_SI ||
clk_src_sel == AMB_PLL_REFERENCE_CLOCK_SOURCE_LVDS_IDSP_SCLK) {
success = amb_set_audio_clock_source(HAL_BASE_VP, clk_src_sel, set_freq);
} else {
success = amb_set_audio_clock_source(HAL_BASE_VP, clk_src_sel, 0);
}
if (success == AMB_HAL_SUCCESS) {
if(clk_src_sel != AMB_EXTERNAL_CLOCK_SOURCE) {
success = amb_set_audio_clock_frequency(HAL_BASE_VP, set_freq);
while (success == AMB_HAL_RETRY) {
// do something else or sleep
dly_tsk(1);
chk_count ++;
success = amb_set_audio_clock_frequency(HAL_BASE_VP, set_freq);
if (chk_count == 100) {
printk("a previous audio pll frequency change request is still outstanding");
break;
}
};
if (success == AMB_HAL_FAIL)
printk("new audio pll frequency requested is not supported");
}
} else {
printk("new audio pll reference clock source is not supported");
}
}
void rct_set_audio_pll_fs(u8 op_mode, u8 mclk_idx)
{
amb_clock_frequency_t set_freq;
set_freq = (amb_clock_frequency_t) mclk_table[mclk_idx];
rct_set_audio_pll_hal(op_mode, set_freq);
}
#elif (RCT_AUDIO_PLL_CONF_MODE == 2)
static const u32 audiopll_config_table[AUC_PLL_CLKRATE_NUM][MAX_MCLK_IDX_NUM][4] =
{
{ // SP_CLK PLL REFERENCE = 13.5MHz, VCO = 800MHz~850MHz
{0x0001000b, 0x00010001, 0x098ead66, 0x1d031108}, //18.432MHz
{0x00010010, 0x00010001, 0x1ad9ff8c, 0x1d021108}, //16.9344MHz
{0x00010016, 0x00010001, 0x098ead66, 0x1d021108}, //12.288MHz
{0x00010012, 0x00010001, 0x1b089a03, 0x1d031108}, //11.2896MHz
{0x00010016, 0x00010001, 0x098ead66, 0x1d031108}, //9.2160MHz
{0x00010018, 0x00010001, 0x1b089a03, 0x1d031108}, //8.4672MHz
{0x00010019, 0x00010001, 0x573ac902, 0x1d031108}, //8.192MHz
{0x00010021, 0x00010001, 0x098ead66, 0x1d031108}, //6.1440MHz
{0x00010024, 0x00010001, 0x1b089a03, 0x1d031108}, //5.6448MHz
{0x0001002c, 0x00010001, 0x098ead66, 0x1d031108}, //4.608MHz
{0x00010030, 0x00010001, 0x1b089a03, 0x1d031108}, //4.2336MHz
{0x00010028, 0x00010001, 0x573ac902, 0x1d041108}, //4.096MHz
{0x00010026, 0x00010001, 0x43cfc21b, 0x1d061108}, //3.0720MHz
{0x0001002b, 0x00010001, 0x76eba813, 0x1e061108}, //2.8224MHz
{0x0001002c, 0x00010001, 0x098ead66, 0x1d081108} //2.048MHz
},
{ // SP_CLK PLL REFERENCE = 24MHz, VCO = 800~850MHz
{0x0001000b, 0x00010001, 0xe560418a, 0x10031108}, //18.432MHz
{0x00010010, 0x00010001, 0xef1a9fbf, 0x10021108}, //16.9344MHz
{0x00010016, 0x00010001, 0xe560418a, 0x10021108}, //12.288MHz
{0x00010012, 0x00010001, 0xef34d6a2, 0x10031108}, //11.2896MHz
{0x00010016, 0x00010001, 0xe560418a, 0x10031108}, //9.2160MHz
{0x00010018, 0x00010001, 0xef34d6a2, 0x10031108}, //8.4672MHz
{0x00010021, 0x00010001, 0xe560418a, 0x10021108}, //8.192MHz
{0x00010021, 0x00010001, 0xe560418a, 0x10031108}, //6.1440MHz
{0x00010024, 0x00010001, 0xef34d6a2, 0x10031108}, //5.6448MHz
{0x0001002c, 0x00010001, 0xe560418a, 0x10031108}, //4.608MHz
{0x00010030, 0x00010001, 0xef34d6a2, 0x10031108}, //4.2336MHz
{0x00010021, 0x00010001, 0xe560418a, 0x10051108}, //4.096MHz
{0x0001002c, 0x00010001, 0xe560418a, 0x10051108}, //3.0720MHz
{0x00010029, 0x00010001, 0xe0275255, 0x10061108}, //2.8224MHz
{0x0001002c, 0x00010001, 0xe560418a, 0x10081108} //2.048MHz
},
{ // SP_CLK PLL REFERENCE = 27MHz, VCO = 800MHz~850MHz
{0x0001000f, 0x00010001, 0x5c28f5c3, 0x0e021108}, //18.432MHz
{0x00010010, 0x00010001, 0x0d6cffc6, 0x0e021108}, //16.9344MHz
{0x00010011, 0x00010001, 0x7949801e, 0x0e031108}, //12.288MHz
{0x00010012, 0x00010001, 0x0d844d02, 0x0e031108}, //11.2896MHz
{0x00010016, 0x00010001, 0x04c756b3, 0x0e031108}, //9.2160MHz
{0x00010018, 0x00010001, 0x0d844d02, 0x0e031108}, //8.4672MHz
{0x00010019, 0x00010001, 0x2b9d6481, 0x0e031108}, //8.192MHz
{0x00010021, 0x00010001, 0x04c756b3, 0x0e031108}, //6.1440MHz
{0x00010024, 0x00010001, 0x0d844d02, 0x0e031108}, //5.6448MHz
{0x00010024, 0x00010001, 0x5c28f5c3, 0x0e041108}, //4.608MHz
{0x00010027, 0x00010001, 0x49ba5e36, 0x0e041108}, //4.2336MHz
{0x00010028, 0x00010001, 0x2b9d6481, 0x0e041108}, //4.096MHz
{0x00010026, 0x00010001, 0x21e7e10e, 0x0e061108}, //3.0720MHz
{0x00010029, 0x00010001, 0x0022f3da, 0x0e061108}, //2.8224MHz
{0x0001002c, 0x00010001, 0x04c756b3, 0x0e081108} //2.048MHz
},
{ // SP_CLK PLL REFERENCE = 27*1.001MHz, VCO = 800MHz~850MHz
{0x0001000f, 0x00010001, 0x5c28f5c3, 0x0e021108}, //18.432MHz
{0x00010010, 0x00010001, 0x0d6cffc6, 0x0e021108}, //16.9344MHz
{0x00010011, 0x00010001, 0x75546c8d, 0x0e031108}, //12.288MHz
{0x00010012, 0x00010001, 0x09aac939, 0x0e031108}, //11.2896MHz
{0x00010016, 0x00010001, 0x04c756b3, 0x0e031108}, //9.2160MHz
{0x00010018, 0x00010001, 0x0d844d02, 0x0e031108}, //8.4672MHz
{0x00010019, 0x00010001, 0x27bc2e30, 0x0e031108}, //8.192MHz
{0x00010021, 0x00010001, 0x00f00f01, 0x0e031108}, //6.1440MHz
{0x00010024, 0x00010001, 0x09aac939, 0x0e031108}, //5.6448MHz
{0x00010024, 0x00010001, 0x5c28f5c3, 0x0e041108}, //4.608MHz
{0x00010027, 0x00010001, 0x49ba5e36, 0x0e041108}, //4.2336MHz
{0x00010028, 0x00010001, 0x27bc2e30, 0x0e041108}, //4.096MHz
{0x00010026, 0x00010001, 0x1e092664, 0x0e061108}, //3.0720MHz
{0x0001002a, 0x00010001, 0x59de5815, 0x0e061108}, //2.8224MHz
{0x0001002c, 0x00010001, 0x00f00f01, 0x0e081108} //2.048MHz
},
{ // SP_CLK PLL REFERENCE = 48MHz, VCO = 800MHz~850MHz
{0x0001000b, 0x00010001, 0x72b020c5, 0x07031108}, //18.432MHz
{0x00010010, 0x00010001, 0x778d4fe0, 0x07021108}, //16.9344MHz
{0x00010016, 0x00010001, 0x72b020c5, 0x07021108}, //12.288MHz
{0x00010012, 0x00010001, 0x779a6b51, 0x07031108}, //11.2896MHz
{0x00010016, 0x00010001, 0x72b020c5, 0x07031108}, //9.2160MHz
{0x00010018, 0x00010001, 0x779a6b51, 0x07031108}, //8.4672MHz
{0x00010021, 0x00010001, 0x72b020c5, 0x07021108}, //8.192MHz
{0x00010021, 0x00010001, 0x72b020c5, 0x07031108}, //6.1440MHz
{0x00010024, 0x00010001, 0x779a6b51, 0x07031108}, //5.6448MHz
{0x0001002c, 0x00010001, 0x72b020c5, 0x07031108}, //4.608MHz
{0x00010030, 0x00010001, 0x779a6b51, 0x07031108}, //4.2336MHz
{0x00010021, 0x00010001, 0x72b020c5, 0x07051108}, //4.096MHz
{0x0001002c, 0x00010001, 0x72b020c5, 0x07051108}, //3.0720MHz
{0x00010029, 0x00010001, 0x7013a92b, 0x07061108}, //2.8224MHz
{0x0001002c, 0x00010001, 0x72b020c5, 0x07081108} //2.048MHz
},
{ // SP_CLK PLL REFERENCE = 74.25/1.001MHz, VCO = 800MHz~850MHz
{0x0001000b, 0x00010001, 0x777fdb2b, 0x04031108}, //18.432MHz
{0x00010010, 0x00010001, 0x7aa5a0e8, 0x04021108}, //16.9344MHz
{0x00010016, 0x00010001, 0x777fdb2b, 0x04021108}, //12.288MHz
{0x00010012, 0x00010001, 0x7aae1c40, 0x04031108}, //11.2896MHz
{0x00010016, 0x00010001, 0x777fdb2b, 0x04031108}, //9.2160MHz
{0x00010018, 0x00010001, 0x7aae1c40, 0x04031108}, //8.4672MHz
{0x00010021, 0x00010001, 0x777fdb2b, 0x04021108}, //8.192MHz
{0x00010021, 0x00010001, 0x777fdb2b, 0x04031108}, //6.1440MHz
{0x00010024, 0x00010001, 0x7aae1c40, 0x04031108}, //5.6448MHz
{0x0001002c, 0x00010001, 0x777fdb2b, 0x04031108}, //4.608MHz
{0x00010030, 0x00010001, 0x7aae1c40, 0x04031108}, //4.2336MHz
{0x00010021, 0x00010001, 0x777fdb2b, 0x04051108}, //4.096MHz
{0x0001002c, 0x00010001, 0x777fdb2b, 0x04051108}, //3.0720MHz
{0x00010029, 0x00010001, 0x75cf4899, 0x04061108}, //2.8224MHz
{0x0001002c, 0x00010001, 0x777fdb2b, 0x04081108} //2.048MHz
},
{ // SP_CLK PLL REFERENCE = 74.25MHz, VCO = 800MHz~850MHz
{0x0001000b, 0x00010001, 0x7619f0fc, 0x04031108}, //18.432MHz
{0x00010010, 0x00010001, 0x793ee8a5, 0x04021108}, //16.9344MHz
{0x00010016, 0x00010001, 0x7619f0fc, 0x04021108}, //12.288MHz
{0x00010012, 0x00010001, 0x794761d2, 0x04031108}, //11.2896MHz
{0x00010016, 0x00010001, 0x7619f0fc, 0x04031108}, //9.2160MHz
{0x00010018, 0x00010001, 0x794761d2, 0x04031108}, //8.4672MHz
{0x00010021, 0x00010001, 0x7619f0fc, 0x04021108}, //8.192MHz
{0x00010021, 0x00010001, 0x7619f0fc, 0x04031108}, //6.1440MHz
{0x00010024, 0x00010001, 0x794761d2, 0x04031108}, //5.6448MHz
{0x0001002c, 0x00010001, 0x7619f0fc, 0x04031108}, //4.608MHz
{0x00010030, 0x00010001, 0x794761d2, 0x04031108}, //4.2336MHz
{0x00010021, 0x00010001, 0x7619f0fc, 0x04051108}, //4.096MHz
{0x0001002c, 0x00010001, 0x7619f0fc, 0x04051108}, //3.0720MHz
{0x00010029, 0x00010001, 0x7469cd0a, 0x04061108}, //2.8224MHz
{0x0001002c, 0x00010001, 0x7619f0fc, 0x04081108} //2.048MHz
},
{ // SP_CLK PLL REFERENCE = 96MHz/1.001, VCO = 800MHz~850MHz
{0x0001000b, 0x00010001, 0x3a6ce347, 0x03031108}, //18.432MHz
{0x00010010, 0x00010001, 0x3cdc1a36, 0x03021108}, //16.9344MHz
{0x00010016, 0x00010001, 0x3a6ce347, 0x03021108}, //12.288MHz
{0x00010012, 0x00010001, 0x3ce2a99c, 0x03031108}, //11.2896MHz
{0x00010016, 0x00010001, 0x3a6ce347, 0x03031108}, //9.2160MHz
{0x00010018, 0x00010001, 0x3ce2a99c, 0x03031108}, //8.4672MHz
{0x00010021, 0x00010001, 0x3a6ce347, 0x03021108}, //8.192MHz
{0x00010021, 0x00010001, 0x3a6ce347, 0x03031108}, //6.1440MHz
{0x00010024, 0x00010001, 0x3ce2a99c, 0x03031108}, //5.6448MHz
{0x0001002c, 0x00010001, 0x3a6ce347, 0x03031108}, //4.608MHz
{0x00010030, 0x00010001, 0x3ce2a99c, 0x03031108}, //4.2336MHz
{0x00010021, 0x00010001, 0x3a6ce347, 0x03051108}, //4.096MHz
{0x0001002c, 0x00010001, 0x3a6ce347, 0x03051108}, //3.0720MHz
{0x00010029, 0x00010001, 0x391e51e9, 0x03061108}, //2.8224MHz
{0x0001002c, 0x00010001, 0x3a6ce347, 0x03081108} //2.048MHz
},
{ // SP_CLK PLL REFERENCE = 96MHz, VCO = 800MHz~850MHz
{0x0001000b, 0x00010001, 0x39581063, 0x03031108}, //18.432MHz
{0x00010010, 0x00010001, 0x3bc6a7f0, 0x03021108}, //16.9344MHz
{0x00010016, 0x00010001, 0x39581063, 0x03021108}, //12.288MHz
{0x00010012, 0x00010001, 0x3bcd35a9, 0x03031108}, //11.2896MHz
{0x00010016, 0x00010001, 0x39581063, 0x03031108}, //9.2160MHz
{0x00010018, 0x00010001, 0x3bcd35a9, 0x03031108}, //8.4672MHz
{0x00010021, 0x00010001, 0x39581063, 0x03021108}, //8.192MHz
{0x00010021, 0x00010001, 0x39581063, 0x03031108}, //6.1440MHz
{0x00010024, 0x00010001, 0x3bcd35a9, 0x03031108}, //5.6448MHz
{0x0001002c, 0x00010001, 0x39581063, 0x03031108}, //4.608MHz
{0x00010030, 0x00010001, 0x3bcd35a9, 0x03031108}, //4.2336MHz
{0x00010021, 0x00010001, 0x39581063, 0x03051108}, //4.096MHz
{0x0001002c, 0x00010001, 0x39581063, 0x03051108}, //3.0720MHz
{0x00010029, 0x00010001, 0x3809d496, 0x03061108}, //2.8224MHz
{0x0001002c, 0x00010001, 0x39581063, 0x03081108} //2.048MHz
},
{ // SP_CLK PLL REFERENCE = 99MHz/1.001, VCO = 800MHz~850MHz
{0x0001000b, 0x00010001, 0x199fe425, 0x03031108}, //18.432MHz
{0x00010010, 0x00010001, 0x1bfc3872, 0x03021108}, //16.9344MHz
{0x00010016, 0x00010001, 0x199fe425, 0x03021108}, //12.288MHz
{0x00010012, 0x00010001, 0x1c0294f5, 0x03031108}, //11.2896MHz
{0x00010016, 0x00010001, 0x199fe425, 0x03031108}, //9.2160MHz
{0x00010018, 0x00010001, 0x1c0294f5, 0x03031108}, //8.4672MHz
{0x00010021, 0x00010001, 0x199fe425, 0x03021108}, //8.192MHz
{0x00010021, 0x00010001, 0x199fe425, 0x03031108}, //6.1440MHz
{0x00010024, 0x00010001, 0x1c0294f5, 0x03031108}, //5.6448MHz
{0x0001002c, 0x00010001, 0x199fe425, 0x03031108}, //4.608MHz
{0x00010030, 0x00010001, 0x1c0294f5, 0x03031108}, //4.2336MHz
{0x00010021, 0x00010001, 0x199fe425, 0x03051108}, //4.096MHz
{0x0001002c, 0x00010001, 0x199fe425, 0x03051108}, //3.0720MHz
{0x00010029, 0x00010001, 0x185b7637, 0x03061108}, //2.8224MHz
{0x0001002c, 0x00010001, 0x199fe425, 0x03081108} //2.048MHz
},
{ // SP_CLK PLL REFERENCE = 99MHz, VCO = 800MHz~850MHz
{0x0001000b, 0x00010001, 0x189374bd, 0x03031108}, //18.432MHz
{0x00010010, 0x00010001, 0x1aef2e7c, 0x03021108}, //16.9344MHz
{0x00010016, 0x00010001, 0x189374bd, 0x03021108}, //12.288MHz
{0x00010012, 0x00010001, 0x1af5895e, 0x03031108}, //11.2896MHz
{0x00010016, 0x00010001, 0x189374bd, 0x03031108}, //9.2160MHz
{0x00010018, 0x00010001, 0x1af5895e, 0x03031108}, //8.4672MHz
{0x00010021, 0x00010001, 0x189374bd, 0x03021108}, //8.192MHz
{0x00010021, 0x00010001, 0x189374bd, 0x03031108}, //6.1440MHz
{0x00010024, 0x00010001, 0x1af5895e, 0x03031108}, //5.6448MHz
{0x0001002c, 0x00010001, 0x189374bd, 0x03031108}, //4.608MHz
{0x00010030, 0x00010001, 0x1af5895e, 0x03031108}, //4.2336MHz
{0x00010021, 0x00010001, 0x189374bd, 0x03051108}, //4.096MHz
{0x0001002c, 0x00010001, 0x189374bd, 0x03051108}, //3.0720MHz
{0x00010029, 0x00010001, 0x174f59c7, 0x03061108}, //2.8224MHz
{0x0001002c, 0x00010001, 0x189374bd, 0x03081108} //2.048MHz
},
{ // SP_CLK PLL REFERENCE = 148.5/1.001MHz, VCO = 800~850 MHz
{0x0001000b, 0x00010001, 0xbbbfed96, 0x02031108}, //18.432MHz
{0x00010010, 0x00010001, 0xbd52d074, 0x02021108}, //16.9344MHz
{0x00010021, 0x00010001, 0xbbbfed96, 0x02021108}, //12.288MHz
{0x00010018, 0x00010001, 0xbd570e20, 0x02021108}, //11.2896MHz
{0x00010016, 0x00010001, 0xbbbfed96, 0x02031108}, //9.2160MHz
{0x00010018, 0x00010001, 0xbd570e20, 0x02031108}, //8.4672MHz
{0x00010021, 0x00010001, 0xbbbfed96, 0x02021108}, //8.192MHz
{0x00010021, 0x00010001, 0xbbbfed96, 0x02031108}, //6.1440MHz
{0x00010024, 0x00010001, 0xbd570e20, 0x02031108}, //5.6448MHz
{0x0001002c, 0x00010001, 0xbbbfed96, 0x02031108}, //4.608MHz
{0x00010030, 0x00010001, 0xbd570e20, 0x02031108}, //4.2336MHz
{0x00010021, 0x00010001, 0xbbbfed96, 0x02051108}, //4.096MHz
{0x0001002c, 0x00010001, 0xbbbfed96, 0x02051108}, //3.0720MHz
{0x00010029, 0x00010001, 0xbae7a44d, 0x02061108}, //2.8224MHz
{0x0001002c, 0x00010001, 0xbbbfed96, 0x02081108} //2.048MHz
},
{ // SP_CLK PLL REFERENCE = 148.5MHz, VCO = 800~850 MHz
{0x0001000b, 0x00010001, 0xbb0cf87e, 0x02031108}, //18.432MHz
{0x00010010, 0x00010001, 0xbc9f7453, 0x02021108}, //16.9344MHz
{0x00010021, 0x00010001, 0xbb0cf87e, 0x02021108}, //12.288MHz
{0x00010018, 0x00010001, 0xbca3b0e9, 0x02021108}, //11.2896MHz
{0x00010016, 0x00010001, 0xbb0cf87e, 0x02031108}, //9.2160MHz
{0x00010018, 0x00010001, 0xbca3b0e9, 0x02031108}, //8.4672MHz
{0x00010021, 0x00010001, 0xbb0cf87e, 0x02021108}, //8.192MHz
{0x00010021, 0x00010001, 0xbb0cf87e, 0x02031108}, //6.1440MHz
{0x00010024, 0x00010001, 0xbca3b0e9, 0x02031108}, //5.6448MHz
{0x0001002c, 0x00010001, 0xbb0cf87e, 0x02031108}, //4.608MHz
{0x00010030, 0x00010001, 0xbca3b0e9, 0x02031108}, //4.2336MHz
{0x00010021, 0x00010001, 0xbb0cf87e, 0x02051108}, //4.096MHz
{0x0001002c, 0x00010001, 0xbb0cf87e, 0x02051108}, //3.0720MHz
{0x00010029, 0x00010001, 0xba34e685, 0x02061108}, //2.8224MHz
{0x0001002c, 0x00010001, 0xbb0cf87e, 0x02081108} //2.048MHz
},
{ // SP_CLK PLL REFERENCE = 90.69/1.001MHz, VCO = 800~850MHz
{0x0001000b, 0x00010001, 0x79cd736b, 0x03031108}, //18.432MHz
{0x00010010, 0x00010001, 0x7c6127c4, 0x03021108}, //16.9344MHz
{0x00010016, 0x00010001, 0x79cd736b, 0x03021108}, //12.288MHz
{0x00010012, 0x00010001, 0x7c68197f, 0x03031108}, //11.2896MHz
{0x00010016, 0x00010001, 0x79cd736b, 0x03031108}, //9.2160MHz
{0x00010018, 0x00010001, 0x7c68197f, 0x03031108}, //8.4672MHz
{0x00010021, 0x00010001, 0x79cd736b, 0x03021108}, //8.192MHz
{0x00010021, 0x00010001, 0x79cd736b, 0x03031108}, //6.1440MHz
{0x00010024, 0x00010001, 0x7c68197f, 0x03031108}, //5.6448MHz
{0x0001002c, 0x00010001, 0x79cd736b, 0x03031108}, //4.608MHz
{0x00010030, 0x00010001, 0x7c68197f, 0x03031108}, //4.2336MHz
{0x00010021, 0x00010001, 0x79cd736b, 0x03051108}, //4.096MHz
{0x0001002c, 0x00010001, 0x79cd736b, 0x03051108}, //3.0720MHz
{0x00010029, 0x00010001, 0x786b4b30, 0x03061108}, //2.8224MHz
{0x0001002c, 0x00010001, 0x79cd736b, 0x03081108} //2.048MHz
},
{ // SP_CLK PLL REFERENCE = 90.69MHz, VCO = 800~850MHz
{0x0001000b, 0x00010001, 0x78a86b73, 0x03031108}, //18.432MHz
{0x00010010, 0x00010001, 0x7b3b7716, 0x03021108}, //16.9344MHz
{0x00010016, 0x00010001, 0x78a86b73, 0x03021108}, //12.288MHz
{0x00010012, 0x00010001, 0x7b42670a, 0x03031108}, //11.2896MHz
{0x00010016, 0x00010001, 0x78a86b73, 0x03031108}, //9.2160MHz
{0x00010018, 0x00010001, 0x7b42670a, 0x03031108}, //8.4672MHz
{0x00010021, 0x00010001, 0x78a86b73, 0x03021108}, //8.192MHz
{0x00010021, 0x00010001, 0x78a86b73, 0x03031108}, //6.1440MHz
{0x00010024, 0x00010001, 0x7b42670a, 0x03031108}, //5.6448MHz
{0x0001002c, 0x00010001, 0x78a86b73, 0x03031108}, //4.608MHz
{0x00010030, 0x00010001, 0x7b42670a, 0x03031108}, //4.2336MHz
{0x00010021, 0x00010001, 0x78a86b73, 0x03051108}, //4.096MHz
{0x0001002c, 0x00010001, 0x78a86b73, 0x03051108}, //3.0720MHz
{0x00010029, 0x00010001, 0x77469dcb, 0x03061108}, //2.8224MHz
{0x0001002c, 0x00010001, 0x78a86b73, 0x03081108} //2.048MHz
},
{ // SP_CLK PLL REFERENCE = 65/1.001MHz, VCO = 800~850MHz
{0x0001000b, 0x00010001, 0x3ea8b3be, 0x05031108}, //18.432MHz
{0x00010010, 0x00010001, 0x42412464, 0x05021108}, //16.9344MHz
{0x00010016, 0x00010001, 0x3ea8b3be, 0x05021108}, //12.288MHz
{0x00010018, 0x00010001, 0x424ad4bc, 0x05021108}, //11.2896MHz
{0x00010016, 0x00010001, 0x3ea8b3be, 0x05031108}, //9.2160MHz
{0x00010018, 0x00010001, 0x424ad4bc, 0x05031108}, //8.4672MHz
{0x00010021, 0x00010001, 0x3ea8b3be, 0x05021108}, //8.192MHz
{0x00010021, 0x00010001, 0x3ea8b3be, 0x05031108}, //6.1440MHz
{0x00010024, 0x00010001, 0x424ad4bc, 0x05031108}, //5.6448MHz
{0x0001002c, 0x00010001, 0x3ea8b3be, 0x05031108}, //4.608MHz
{0x00010030, 0x00010001, 0x424ad4bc, 0x05031108}, //4.2336MHz
{0x00010021, 0x00010001, 0x3ea8b3be, 0x05051108}, //4.096MHz
{0x0001002c, 0x00010001, 0x3ea8b3be, 0x05051108}, //3.0720MHz
{0x00010029, 0x00010001, 0x3cba9237, 0x05061108}, //2.8224MHz
{0x0001002c, 0x00010001, 0x3ea8b3be, 0x05081108} //2.048MHz
}
};
static u32 get_audio_pll_fs_index(u32 pll_fs)
{
switch (pll_fs) {
case AUC_PLL_CLKRATE_1350: return 0;
case AUC_PLL_CLKRATE_2400: return 1;
case AUC_PLL_CLKRATE_2700: return 2;
case AUC_PLL_CLKRATE_2700_M1: return 3;
case AUC_PLL_CLKRATE_4800: return 4;
case AUC_PLL_CLKRATE_7425_D1: return 5;
case AUC_PLL_CLKRATE_7425: return 6;
case AUC_PLL_CLKRATE_9600_D1: return 7;
case AUC_PLL_CLKRATE_9600: return 8;
case AUC_PLL_CLKRATE_9900_D1: return 9;
case AUC_PLL_CLKRATE_9900: return 10;
case AUC_PLL_CLKRATE_1485_D1: return 11;
case AUC_PLL_CLKRATE_1485: return 12;
case AUC_PLL_CLKRATE_9069_D1: return 13;
case AUC_PLL_CLKRATE_9069: return 14;
case AUC_PLL_CLKRATE_6500_D1: return 15;
}
printk("Unsupport Audio PLL Source CLK Rate");
// K_ASSERT(((0x1)==(0x0)));
return 0;
}
void rct_set_audio_pll_reset(void)
{
//int i;
u32 ctrl_reg_val;
ctrl_reg_val = readl(PLL_AUDIO_CTRL_REG);
writel(PLL_AUDIO_CTRL_REG, ctrl_reg_val|(0x1<<4));
//for(i=0;i<100000;i++);
dly_tsk(1);
writel(PLL_AUDIO_CTRL_REG, ctrl_reg_val&0xffffffef);
}
static u32 last_ref_clk = REF_CLK_FREQ;
void rct_set_audio_pll_fs_basic(u32 clk_ref,u8 mclk_idx)
{
//int i;
u32 ctrl;
//1.set the audio control register, disable enable bit
ctrl = readl(PLL_AUDIO_CTRL_REG);
ctrl &= ~0x01;
writel(PLL_AUDIO_CTRL_REG, ctrl);
writel(PLL_AUDIO_CTRL_REG, audiopll_config_table[clk_ref][mclk_idx][3]);
//2.reset audio pll
rct_set_audio_pll_reset();
//3.set the fractional part
writel(PLL_AUDIO_FRAC_REG, audiopll_config_table[clk_ref][mclk_idx][2]);
//4.set audio post scaler before pre scaler
writel(SCALER_AUDIO_REG, (audiopll_config_table[clk_ref][mclk_idx][0]+1));
dly_tsk(1);
writel(SCALER_AUDIO_REG, audiopll_config_table[clk_ref][mclk_idx][0]);
//for(i=0;i<10000;i++);//dly around 0.1ms
dly_tsk(1);
//5.set audio pre scaler after post scaler
writel(SCALER_AUDIO_PRE_REG, (audiopll_config_table[clk_ref][mclk_idx][1]+1));
dly_tsk(1);
writel(SCALER_AUDIO_PRE_REG, audiopll_config_table[clk_ref][mclk_idx][1]);
//6.enable audio PLL
writel(PLL_AUDIO_CTRL_REG, (audiopll_config_table[clk_ref][mclk_idx][3]+1));
dly_tsk(1);
}
void rct_set_audio_pll_fs(u8 op_mode, u8 mclk_idx)
{
int i;
u32 clk_ref = 0;
u32 cur_ref_clk;
u8 switch_flag = 0;
u32 aud_lock;
u32 aud_lock_cnt = 0;
u32 ctrl;
// RCT set audio PLL ref, CLK source, and MCLK
if(op_mode < AUC_CLK_EXTERNAL) {
if (op_mode == AUC_CLK_ONCHIP_PLL_27MHZ) {
cur_ref_clk = REF_CLK_FREQ;
switch_flag = (last_ref_clk > cur_ref_clk)?0:1;
clk_ref = get_audio_pll_fs_index(REF_CLK_FREQ);
last_ref_clk = REF_CLK_FREQ;
} else {
cur_ref_clk = get_spclk_freq_hz();
switch_flag = (last_ref_clk > cur_ref_clk)?0:1;
clk_ref = get_audio_pll_fs_index(cur_ref_clk);
last_ref_clk = cur_ref_clk;
}
if (!switch_flag) {
writeb(USE_CLK_SI_4_AU_REG, audiopll_ref_table[op_mode][1]);
writeb(CLK_REF_AU_EXTERNAL_REG, audiopll_ref_table[op_mode][0]);
writeb(USE_EXTERNAL_CLK_AU_REG, 0x0);
}
//1.set the audio control register, disable enable bit
ctrl = readl(PLL_AUDIO_CTRL_REG);
ctrl &= ~0x01;
writel(PLL_AUDIO_CTRL_REG, ctrl);
writel(PLL_AUDIO_CTRL_REG, audiopll_config_table[clk_ref][mclk_idx][3]);
//2.reset audio pll
rct_set_audio_pll_reset();
//3.set the fractional part
writel(PLL_AUDIO_FRAC_REG, audiopll_config_table[clk_ref][mclk_idx][2]);
//4.set audio post scaler before pre scaler
writel(SCALER_AUDIO_REG, (audiopll_config_table[clk_ref][mclk_idx][0]+1));
dly_tsk(1);
writel(SCALER_AUDIO_REG, audiopll_config_table[clk_ref][mclk_idx][0]);
//for(i=0;i<10000;i++);//dly around 0.1ms
dly_tsk(1);
//5.set audio pre scaler after post scaler
writel(SCALER_AUDIO_PRE_REG, (audiopll_config_table[clk_ref][mclk_idx][1]+1));
dly_tsk(1);
writel(SCALER_AUDIO_PRE_REG, audiopll_config_table[clk_ref][mclk_idx][1]);
//6.enable audio PLL
writel(PLL_AUDIO_CTRL_REG, (audiopll_config_table[clk_ref][mclk_idx][3]+1));
dly_tsk(1);
if (switch_flag) {
writeb(USE_CLK_SI_4_AU_REG, audiopll_ref_table[op_mode][1]);
writeb(CLK_REF_AU_EXTERNAL_REG, audiopll_ref_table[op_mode][0]);
writeb(USE_EXTERNAL_CLK_AU_REG, 0x0);
}
for (i = 0; i < 2000; i++) {
aud_lock = readl(PLL_LOCK_REG);
aud_lock >>= 7;
aud_lock &= 0x00000001;
if(aud_lock == 0)
rct_set_audio_pll_fs_basic(clk_ref,mclk_idx);
else
break;
aud_lock_cnt ++;
}
//printk("reprogram audio pll lock %d times",aud_lock_cnt);
if(i == 2000 && aud_lock == 0){
printk("audio pll lock fail!!!!!!!!!!!");
}
} else { //External Audio Clock Source
writeb(USE_EXTERNAL_CLK_AU_REG, 0x1);
}
rct_set_audio_freq_hz(mclk_table[mclk_idx]);
}
#elif (RCT_AUDIO_PLL_CONF_MODE == 1)
static const u32 audiopll_config_table[AUC_PLL_CLKRATE_NUM][MAX_MCLK_IDX_NUM][4] =
{
// SP_CLK PLL REFERENCE = 13.5MHz
{
//VCO = 688.1280, 632.2176M, REFCLK_AU = 13.5MHz
{0x0000000A, 0x00000001, 0x1B01B102, 0x00004E82},//18.432MHz
{0x0000000A, 0x00000001, 0x1901B102, 0x00001687},//16.9344MHz
{0x0000000E, 0x00000001, 0x3201F102, 0x0000F8F2},//12.288MHz
{0x0000000E, 0x00000001, 0x2E01F102, 0x0000D4B8},//11.2896MHz
{0x00000014, 0x00000001, 0x1B01B102, 0x00004E82},//9.2160MHz
{0x00000014, 0x00000001, 0x1901B102, 0x00001687},//8.4672MHz
{0x00000015, 0x00000001, 0x3201F102, 0x0000F8F2},//8.192MHz
{0x0000001C, 0x00000001, 0x3201F102, 0x0000F8F2},//6.1440MHz
{0x0000001C, 0x00000001, 0x2E01F102, 0x0000D4B8},//5.6448MHz
{0x00000028, 0x00000001, 0x1B01B102, 0x00004E82},//4.608MHz
{0x00000028, 0x00000001, 0x1901B102, 0x00001687},//4.2336MHz
{0x0000002A, 0x00000001, 0x3201F102, 0x0000F8F2},//4.096MHz
{0x00000038, 0x00000001, 0x3201F102, 0x0000F8F2},//3.0720MHz
{0x00000038, 0x00000001, 0x2E01F102, 0x0000D4B8},//2.8224MHz
{0x00000054, 0x00000001, 0x3201F102, 0x0000F8F2} //2.048MHz
},
// SP_CLK PLL REFERENCE = 24MHz
{
//VCO = 688.1280, 632.2176M, REFCLK_AU = 24MHz
{0x0000000A, 0x00000001, 0x1E01F102, 0x0000B852},//18.432MHz
{0x0000000A, 0x00000001, 0x1C01F102, 0x00003958},//16.9344MHz
{0x0000000E, 0x00000001, 0x1C01F102, 0x0000AC08},//12.288MHz
{0x0000000E, 0x00000001, 0x1A01F102, 0x000057A8},//11.2896MHz
{0x00000014, 0x00000001, 0x1E01F102, 0x0000B852},//9.2160MHz
{0x00000014, 0x00000001, 0x1C01F102, 0x00003958},//8.4672MHz
{0x00000015, 0x00000001, 0x1C01F102, 0x0000AC08},//8.192MHz
{0x0000001C, 0x00000001, 0x1C01F102, 0x0000AC08},//6.1440MHz
{0x0000001C, 0x00000001, 0x1A01F102, 0x000057A8},//5.6448MHz
{0x00000028, 0x00000001, 0x1E01F102, 0x0000B852},//4.608MHz
{0x00000028, 0x00000001, 0x1C01F102, 0x00003958},//4.2336MHz
{0x0000002A, 0x00000001, 0x1C01F102, 0x0000AC08},//4.096MHz
{0x00000038, 0x00000001, 0x1C01F102, 0x0000AC08},//3.0720MHz
{0x00000038, 0x00000001, 0x1A01F102, 0x000057A8},//2.8224MHz
{0x00000054, 0x00000001, 0x1C01F102, 0x0000AC08} //2.048MHz
},
// SP_CLK PLL REFERENCE = 27MHz
{
//VCO = 688.1280, 632.2176M, REFCLK_AU = 27M
{0x0000000A, 0x00000001, 0x1B01F102, 0x00004E82},//18.432MHz
{0x0000000A, 0x00000001, 0x1901F102, 0x00001687},//16.9344MHz
{0x0000000E, 0x00000001, 0x1901F102, 0x00007C79},//12.288MHz
{0x0000000E, 0x00000001, 0x1701F102, 0x00006A5C},//11.2896MHz
{0x00000014, 0x00000001, 0x1B01F102, 0x00004E82},//9.2160MHz
{0x00000014, 0x00000001, 0x1901F102, 0x00001687},//8.4672MHz
{0x00000015, 0x00000001, 0x1901F102, 0x00007C79},//8.192MHz
{0x0000001C, 0x00000001, 0x1901F102, 0x00007C79},//6.1440MHz
{0x0000001C, 0x00000001, 0x1701F102, 0x00006A5C},//5.6448MHz
{0x00000028, 0x00000001, 0x1B01F102, 0x00004E82},//4.608MHz
{0x00000028, 0x00000001, 0x1901F102, 0x00001687},//4.2336MHz
{0x0000002A, 0x00000001, 0x1901F102, 0x00007C79},//4.096MHz
{0x00000038, 0x00000001, 0x1901F102, 0x00007C79},//3.0720MHz
{0x00000038, 0x00000001, 0x1701F102, 0x00006A5C},//2.8224MHz
{0x00000054, 0x00000001, 0x1901F102, 0x00007C79} //2.048MHz
},
// SP_CLK PLL REFERENCE = 27*1.001MHz
{
//VCO = 688.1280, 632.2176M, REFCLK_AU = 27*1.001MHz
{0x0000000A, 0x00000001, 0x1B01F102, 0x00004786},//18.432MHz
{0x0000000A, 0x00000001, 0x1901F102, 0x0000101D},//16.9344MHz
{0x0000000E, 0x00000001, 0x1901F102, 0x000075F4},//12.288MHz
{0x0000000E, 0x00000001, 0x1701F102, 0x0000645F},//11.2896MHz
{0x00000014, 0x00000001, 0x1B01F102, 0x00004786},//9.2160MHz
{0x00000014, 0x00000001, 0x1901F102, 0x0000101D},//8.4672MHz
{0x00000015, 0x00000001, 0x1901F102, 0x000075F4},//8.192MHz
{0x0000001C, 0x00000001, 0x1901F102, 0x000075F4},//6.1440MHz
{0x0000001C, 0x00000001, 0x1701F102, 0x0000645F},//5.6448MHz
{0x00000028, 0x00000001, 0x1B01F102, 0x00004786},//4.608MHz
{0x00000028, 0x00000001, 0x1901F102, 0x0000101D},//4.2336MHz
{0x0000002A, 0x00000001, 0x1901F102, 0x000075F4},//4.096MHz
{0x00000038, 0x00000001, 0x1901F102, 0x000075F4},//3.0720MHz
{0x00000038, 0x00000001, 0x1701F102, 0x0000645F},//2.8224MHz
{0x00000054, 0x00000001, 0x1901F102, 0x000075F4}//2.048MHz
},
// SP_CLK PLL REFERENCE = 48MHz
{
//VCO = 688.1280, 632.2176M, REFCLK_AU = 48M
{0x0000000A, 0x00000001, 0x0701B102, 0x0000AE14},//18.432MHz
{0x0000000A, 0x00000001, 0x0701B102, 0x00000E56},//16.9344MHz
{0x0000000E, 0x00000001, 0x0701B102, 0x00002B02},//12.288MHz
{0x0000000E, 0x00000001, 0x0601B102, 0x000095EA},//11.2896MHz
{0x00000014, 0x00000001, 0x0701B102, 0x0000AE14},//9.2160MHz
{0x00000014, 0x00000001, 0x0701B102, 0x00000E56},//8.4672MHz
{0x00000015, 0x00000001, 0x0701B102, 0x00002B02},//8.192MHz
{0x0000001C, 0x00000001, 0x0701B102, 0x00002B02},//6.1440MHz
{0x0000001C, 0x00000001, 0x0601B102, 0x000095EA},//5.6448MHz
{0x00000028, 0x00000001, 0x0701B102, 0x0000AE14},//4.608MHz
{0x00000028, 0x00000001, 0x0701B102, 0x00000E56},//4.2336MHz
{0x0000002A, 0x00000001, 0x0701B102, 0x00002B02},//4.096MHz
{0x00000038, 0x00000001, 0x0701B102, 0x00002B02},//3.0720MHz
{0x00000038, 0x00000001, 0x0601B102, 0x000095EA},//2.8224MHz
{0x00000054, 0x00000001, 0x0701B102, 0x00002B02}//2.048MHz
},
// SP_CLK PLL REFERENCE = 74.25/1.001MHz
{
//VCO = 688.1280, 632.2176M, REFCLK_AU = 74.25/1.001/2MHz
{0x0000000A, 0x00000002, 0x1301F102, 0x0000E117},//18.432MHz
{0x0000000A, 0x00000002, 0x1201F102, 0x0000439A},//16.9344MHz
{0x0000000E, 0x00000002, 0x1201F102, 0x00008DD1},//12.288MHz,
{0x0000000E, 0x00000002, 0x1101F102, 0x00000BE5},//11.2896MHz,
{0x00000014, 0x00000002, 0x1301F102, 0x0000E117},//9.2160MHz
{0x00000014, 0x00000002, 0x1201F102, 0x0000439A},//8.4672MHz
{0x00000015, 0x00000002, 0x1201F102, 0x00008DD1},//8.192MHz,
{0x0000001C, 0x00000002, 0x1201F102, 0x00008DD1},//6.1440MHz,
{0x0000001C, 0x00000002, 0x1101F102, 0x00000BE5},//5.6448MHz,
{0x00000028, 0x00000002, 0x1301F102, 0x0000E117},//4.608MHz
{0x00000028, 0x00000002, 0x1201F102, 0x0000439A},//4.2336MHz
{0x0000002A, 0x00000002, 0x1201F102, 0x00008DD1},//4.096MHz,
{0x00000038, 0x00000002, 0x1201F102, 0x00008DD1},//3.0720MHz,
{0x00000038, 0x00000002, 0x1101F102, 0x00000BE5},//2.8224MHz,
{0x00000054, 0x00000002, 0x1201F102, 0x00008DD1}//2.048MHz
},
// SP_CLK PLL REFERENCE = 74.25MHz
{
//VCO = 688.1280, 632.2176M, REFCLK_AU = 74.25/2MHz
{0x0000000A, 0x00000002, 0x1301F102, 0x0000DC01},//18.432MHz
{0x0000000A, 0x00000002, 0x1201F102, 0x00003EEE},//16.9344MHz
{0x0000000E, 0x00000002, 0x1201F102, 0x00008912},//12.288MHz,
{0x0000000E, 0x00000002, 0x1101F102, 0x00000789},//11.2896MHz,
{0x00000014, 0x00000002, 0x1301F102, 0x0000DC01},//9.2160MHz
{0x00000014, 0x00000002, 0x1201F102, 0x00003EEE},//8.4672MHz
{0x00000015, 0x00000002, 0x1201F102, 0x00008912},//8.192MHz,
{0x0000001C, 0x00000002, 0x1201F102, 0x00008912},//6.1440MHz,
{0x0000001C, 0x00000002, 0x1101F102, 0x00000789},//5.6448MHz,
{0x00000028, 0x00000002, 0x1301F102, 0x0000DC01},//4.608MHz
{0x00000028, 0x00000002, 0x1201F102, 0x00003EEE},//4.2336MHz
{0x0000002A, 0x00000002, 0x1201F102, 0x00008912},//4.096MHz,
{0x00000038, 0x00000002, 0x1201F102, 0x00008912},//3.0720MHz,
{0x00000038, 0x00000002, 0x1101F102, 0x00000789},//2.8224MHz,
{0x00000054, 0x00000002, 0x1201F102, 0x00008912}//2.048MHz
},
// SP_CLK PLL REFERENCE = 96MHz/1.001 = 95904096
{
//VCO = 688.1280, 632.2176M, REFCLK_AU = 96MHz/1.001/2
{0x0000000A, 0x00000002, 0x0701B102, 0x0000B00C},//18.432MHz
{0x0000000A, 0x00000002, 0x0701B102, 0x00001024},//16.9344MHz
{0x0000000E, 0x00000002, 0x0701B102, 0x00002CD8},//12.288MHz,
{0x0000000E, 0x00000002, 0x0601B102, 0x00009799},//11.2896MHz,
{0x00000014, 0x00000002, 0x0701B102, 0x0000B00C},//9.2160MHz
{0x00000014, 0x00000002, 0x0701B102, 0x00001024},//8.4672MHz
{0x00000015, 0x00000002, 0x0701B102, 0x00002CD8},//8.192MHz,
{0x0000001C, 0x00000002, 0x0701B102, 0x00002CD8},//6.1440MHz,
{0x0000001C, 0x00000002, 0x0601B102, 0x00009799},//5.6448MHz,
{0x00000028, 0x00000002, 0x0701B102, 0x0000B00C},//4.608MHz
{0x00000028, 0x00000002, 0x0701B102, 0x00001024},//4.2336MHz
{0x0000002A, 0x00000002, 0x0701B102, 0x00002CD8},//4.096MHz,
{0x00000038, 0x00000002, 0x0701B102, 0x00002CD8},//3.0720MHz,
{0x00000038, 0x00000002, 0x0601B102, 0x00009799},//2.8224MHz,
{0x00000054, 0x00000002, 0x0701B102, 0x00002CD8}//2.048MHz
},
// SP_CLK PLL REFERENCE = 96MHz
{
//VCO = 688.1280, 632.2176M, REFCLK_AU = 96MHz/2
{0x0000000A, 0x00000002, 0x0701B102, 0x0000AE14},//18.432MHz
{0x0000000A, 0x00000002, 0x0701B102, 0x00000E56},//16.9344MHz
{0x0000000E, 0x00000002, 0x0701B102, 0x00002B02},//12.288MHz,
{0x0000000E, 0x00000002, 0x0601B102, 0x000095EA},//11.2896MHz,
{0x00000014, 0x00000002, 0x0701B102, 0x0000AE14},//9.2160MHz
{0x00000014, 0x00000002, 0x0701B102, 0x00000E56},//8.4672MHz
{0x00000015, 0x00000002, 0x0701B102, 0x00002B02},//8.192MHz,
{0x0000001C, 0x00000002, 0x0701B102, 0x00002B02},//6.1440MHz,
{0x0000001C, 0x00000002, 0x0601B102, 0x000095EA},//5.6448MHz,
{0x00000028, 0x00000002, 0x0701B102, 0x0000AE14},//4.608MHz
{0x00000028, 0x00000002, 0x0701B102, 0x00000E56},//4.2336MHz
{0x0000002A, 0x00000002, 0x0701B102, 0x00002B02},//4.096MHz,
{0x00000038, 0x00000002, 0x0701B102, 0x00002B02},//3.0720MHz,
{0x00000038, 0x00000002, 0x0601B102, 0x000095EA},//2.8224MHz,
{0x00000054, 0x00000002, 0x0701B102, 0x00002B02}//2.048MHz
},
// SP_CLK PLL REFERENCE = 99MHz/1.001
{
//VCO = 688.1280, 632.2176M, REFCLK_AU = 99MHz/1.001
{0x0000000A, 0x00000003, 0x1601F102, 0x00005D3A},//18.432MHz
{0x0000000A, 0x00000003, 0x1401F102, 0x00008C0D},//16.9344MHz
{0x0000000E, 0x00000003, 0x1401F102, 0x0000DF8B},//12.288MHz,
{0x0000000E, 0x00000003, 0x1301F102, 0x00002D61},//11.2896MHz
{0x00000014, 0x00000003, 0x1601F102, 0x00005D3A},//9.2160MHz
{0x00000014, 0x00000003, 0x1401F102, 0x00008C0D},//8.4672MHz
{0x00000015, 0x00000003, 0x1401F102, 0x0000DF8B},//8.192MHz,
{0x0000001C, 0x00000003, 0x1401F102, 0x0000DF8B},//6.1440MHz,
{0x0000001C, 0x00000003, 0x1301F102, 0x00002D61},//5.6448MHz,
{0x00000028, 0x00000003, 0x1601F102, 0x00005D3A},//4.608MHz
{0x00000028, 0x00000003, 0x1401F102, 0x00008C0D},//4.2336MHz
{0x0000002A, 0x00000003, 0x1401F102, 0x0000DF8B},//4.096MHz,
{0x00000038, 0x00000003, 0x1401F102, 0x0000DF8B},//3.0720MHz,
{0x00000038, 0x00000003, 0x1301F102, 0x00002D61},//2.8224MHz,
{0x00000054, 0x00000003, 0x1401F102, 0x0000DF8B}//2.048MHz
},
// SP_CLK PLL REFERENCE = 99MHz
{
//VCO = 688.1280, 632.2176M, REFCLK_AU = 99MHz
{0x0000000A, 0x00000003, 0x1601F102, 0x00005781},//18.432MHz
{0x0000000A, 0x00000003, 0x1401F102, 0x000086CC},//16.9344MHz
{0x0000000E, 0x00000003, 0x1401F102, 0x0000DA35},//12.288MHz,
{0x0000000E, 0x00000003, 0x1301F102, 0x0000287A},//11.2896MHz
{0x00000014, 0x00000003, 0x1601F102, 0x00005781},//9.2160MHz
{0x00000014, 0x00000003, 0x1401F102, 0x000086CC},//8.4672MHz
{0x00000015, 0x00000003, 0x1401F102, 0x0000DA35},//8.192MHz,
{0x0000001C, 0x00000003, 0x1401F102, 0x0000DA35},//6.1440MHz,
{0x0000001C, 0x00000003, 0x1301F102, 0x0000287A},//5.6448MHz,
{0x00000028, 0x00000003, 0x1601F102, 0x00005781},//4.608MHz
{0x00000028, 0x00000003, 0x1401F102, 0x000086CC},//4.2336MHz
{0x0000002A, 0x00000003, 0x1401F102, 0x0000DA35},//4.096MHz,
{0x00000038, 0x00000003, 0x1401F102, 0x0000DA35},//3.0720MHz,
{0x00000038, 0x00000003, 0x1301F102, 0x0000287A},//2.8224MHz,
{0x00000054, 0x00000003, 0x1401F102, 0x0000DA35}//2.048MHz
},
// SP_CLK PLL REFERENCE = 148.5/1.001MHz
{
//VCO = 688.1280, 632.2176M, REFCLK_AU = 148.5MHz
{0x0000000A, 0x00000002, 0x0901F102, 0x0000F08B},//18.432MHz
{0x0000000A, 0x00000002, 0x0901F102, 0x000021CD},//16.9344MHz
{0x0000000E, 0x00000002, 0x0901F102, 0x000046E8},//12.288MHz
{0x0000000E, 0x00000002, 0x0801F102, 0x000085F2},//11.2896MHz
{0x00000014, 0x00000002, 0x0901F102, 0x0000F08B},//9.2160MHz
{0x00000014, 0x00000002, 0x0901F102, 0x000021CD},//8.4672MHz
{0x00000015, 0x00000002, 0x0901F102, 0x000046E8},//8.192MHz
{0x0000001C, 0x00000002, 0x0901F102, 0x000046E8},//6.1440MHz
{0x0000001C, 0x00000002, 0x0801F102, 0x000085F2},//5.6448MHz
{0x00000028, 0x00000002, 0x0901F102, 0x0000F08B},//4.608MHz
{0x00000028, 0x00000002, 0x0901F102, 0x000021CD},//4.2336MHz
{0x0000002A, 0x00000002, 0x0901F102, 0x000046E8},//4.096MHz
{0x00000038, 0x00000002, 0x0901F102, 0x000046E8},//3.0720MHz
{0x00000038, 0x00000002, 0x0801F102, 0x000085F2},//2.8224MHz
{0x00000054, 0x00000002, 0x0901F102, 0x000046E8} //2.048MHz
},
// SP_CLK PLL REFERENCE = 148.5MHz
{
//VCO = 688.1280, 632.2176M, REFCLK_AU = 148.5MHz
{0x0000000A, 0x00000002, 0x0901F102, 0x0000EE01},//18.432MHz
{0x0000000A, 0x00000002, 0x0901F102, 0x00001F77},//16.9344MHz
{0x0000000E, 0x00000002, 0x0901F102, 0x00004489},//12.288MHz
{0x0000000E, 0x00000002, 0x0801F102, 0x000083C4},//11.2896MHz
{0x00000014, 0x00000002, 0x0901F102, 0x0000EE01},//9.2160MHz
{0x00000014, 0x00000002, 0x0901F102, 0x00001F77},//8.4672MHz
{0x00000015, 0x00000002, 0x0901F102, 0x00004489},//8.192MHz
{0x0000001C, 0x00000002, 0x0901F102, 0x00004489},//6.1440MHz
{0x0000001C, 0x00000002, 0x0801F102, 0x000083C4},//5.6448MHz
{0x00000028, 0x00000002, 0x0901F102, 0x0000EE01},//4.608MHz
{0x00000028, 0x00000002, 0x0901F102, 0x00001F77},//4.2336MHz
{0x0000002A, 0x00000002, 0x0901F102, 0x00004489},//4.096MHz
{0x00000038, 0x00000002, 0x0901F102, 0x00004489},//3.0720MHz
{0x00000038, 0x00000002, 0x0801F102, 0x000083C4},//2.8224MHz
{0x00000054, 0x00000002, 0x0901F102, 0x00004489} //2.048MHz
},
/* For alta5262: not verified yet */
// SP_CLK PLL REFERENCE = 90.69/1.001MHz
{
//VCO = 688.1280, 632.2176M, REFCLK_AU = 90.69/1.001MHz
{0x0000000A, 0x00000002, 0x1001F102, 0x000046E8},//18.432MHz
{0x0000000A, 0x00000002, 0x0E01F102, 0x0000F406},//16.9344MHz
{0x0000000E, 0x00000002, 0x0F01F102, 0x000030C9},//12.288MHz
{0x0000000E, 0x00000002, 0x0D01F102, 0x0000F4D2},//11.2896MHz
{0x00000014, 0x00000002, 0x1001F102, 0x000046E8},//9.2160MHz
{0x00000014, 0x00000002, 0x0E01F102, 0x0000F406},//8.4672MHz
{0x00000015, 0x00000002, 0x0F01F102, 0x000030C9},//8.192MHz
{0x0000001C, 0x00000002, 0x0F01F102, 0x000030C9},//6.1440MHz
{0x0000001C, 0x00000002, 0x0D01F102, 0x0000F4D2},//5.6448MHz
{0x00000028, 0x00000002, 0x1001F102, 0x000046E8},//4.608MHz
{0x00000028, 0x00000002, 0x0E01F102, 0x0000F406},//4.2336MHz
{0x0000002A, 0x00000002, 0x0F01F102, 0x000030C9},//4.096MHz
{0x00000038, 0x00000002, 0x0F01F102, 0x000030C9},//3.0720MHz
{0x00000038, 0x00000002, 0x0D01F102, 0x0000F4D2},//2.8224MHz
{0x00000054, 0x00000002, 0x0F01F102, 0x000030C9} //2.048MHz
},
// SP_CLK PLL REFERENCE = 90.69MHz
{
//VCO = 688.1280, 632.2176M, REFCLK_AU = 90.69MHz
{0x0000000A, 0x00000002, 0x1001F102, 0x00004264},//18.432MHz
{0x0000000A, 0x00000002, 0x0E01F102, 0x0000F033},//16.9344MHz
{0x0000000E, 0x00000002, 0x0F01F102, 0x00002CE6},//12.288MHz
{0x0000000E, 0x00000002, 0x0D01F102, 0x0000F140},//11.2896MHz
{0x00000014, 0x00000002, 0x1001F102, 0x00004264},//9.2160MHz
{0x00000014, 0x00000002, 0x0E01F102, 0x0000F033},//8.4672MHz
{0x00000015, 0x00000002, 0x0F01F102, 0x00002CE6},//8.192MHz
{0x0000001C, 0x00000002, 0x0F01F102, 0x00002CE6},//6.1440MHz
{0x0000001C, 0x00000002, 0x0D01F102, 0x0000F140},//5.6448MHz
{0x00000028, 0x00000002, 0x1001F102, 0x00004264},//4.608MHz
{0x00000028, 0x00000002, 0x0E01F102, 0x0000F033},//4.2336MHz
{0x0000002A, 0x00000002, 0x0F01F102, 0x00002CE6},//4.096MHz
{0x00000038, 0x00000002, 0x0F01F102, 0x00002CE6},//3.0720MHz
{0x00000038, 0x00000002, 0x0D01F102, 0x0000F140},//2.8224MHz
{0x00000054, 0x00000002, 0x0F01F102, 0x00002CE6} //2.048MHz
},
// SP_CLK PLL REFERENCE = 65/1.001MHz
{
//VCO = 774.144~632.2176M, REFCLK_AU = 65/1.001MHz
{0x0000000A, 0x00000001, 0x0B01F102, 0x00005AA7},//18.432MHz
{0x0000000A, 0x00000001, 0x0A01F102, 0x00006E7D},//16.9344MHz
{0x0000000E, 0x00000001, 0x0A01F102, 0x000098E0},//12.288MHz
{0x0000000E, 0x00000001, 0x0901F102, 0x0000BC74},//11.2896MHz
{0x00000014, 0x00000001, 0x0B01F102, 0x00005AA7},//9.2160MHz
{0x00000014, 0x00000001, 0x0A01F102, 0x00006E7D},//8.4672MHz
{0x00000015, 0x00000001, 0x0A01F102, 0x000098E0},//8.192MHz
{0x0000001C, 0x00000001, 0x0A01F102, 0x000098E0},//6.1440MHz
{0x0000001C, 0x00000001, 0x0901F102, 0x0000BC74},//5.6448MHz
{0x0000002A, 0x00000001, 0x0B01F102, 0x0000EBFC},//4.608MHz
{0x0000002A, 0x00000001, 0x0A01F102, 0x0000F403},//4.2336MHz
{0x0000002A, 0x00000001, 0x0A01F102, 0x000098E0},//4.096MHz
{0x00000038, 0x00000001, 0x0A01F102, 0x000098E0},//3.0720MHz
{0x00000038, 0x00000001, 0x0901F102, 0x0000BC74},//2.8224MHz
{0x00000054, 0x00000001, 0x0A01F102, 0x000098E0} //2.048MHz
}
};
static u32 get_audio_pll_fs_index(u32 pll_fs)
{
switch (pll_fs) {
case AUC_PLL_CLKRATE_1350: return 0;
case AUC_PLL_CLKRATE_2400: return 1;
case AUC_PLL_CLKRATE_2700: return 2;
case AUC_PLL_CLKRATE_2700_M1: return 3;
case AUC_PLL_CLKRATE_4800: return 4;
case AUC_PLL_CLKRATE_7425_D1: return 5;
case AUC_PLL_CLKRATE_7425: return 6;
case AUC_PLL_CLKRATE_9600_D1: return 7;
case AUC_PLL_CLKRATE_9600: return 8;
case AUC_PLL_CLKRATE_9900_D1: return 9;
case AUC_PLL_CLKRATE_9900: return 10;
case AUC_PLL_CLKRATE_1485_D1: return 11;
case AUC_PLL_CLKRATE_1485: return 12;
case AUC_PLL_CLKRATE_9069_D1: return 13;
case AUC_PLL_CLKRATE_9069: return 14;
case AUC_PLL_CLKRATE_6500_D1: return 15;
}
printk("Unsupport Audio PLL Source CLK Rate");
// K_ASSERT(((0x1)==(0x0)));
return 0;
}
void rct_set_audio_pll_reset(void)
{
u32 ctrl_reg_val;
ctrl_reg_val = readl(PLL_AUDIO_CTRL_REG);
writel(PLL_AUDIO_CTRL_REG, ctrl_reg_val|(0x1<<4));
rct_alan_zhu_magic_loop(PLL_LOCK_AUDIO);
writel(PLL_AUDIO_CTRL_REG, ctrl_reg_val&0xffffffef);
rct_alan_zhu_magic_loop(PLL_LOCK_AUDIO);
}
void rct_set_audio_pll_fs(u8 op_mode, u8 mclk_idx)
{
u32 clk_ref;
// RCT set audio PLL ref, CLK source, and MCLK
if(op_mode < AUC_CLK_EXTERNAL) {
writeb(USE_CLK_SI_4_AU_REG, audiopll_ref_table[op_mode][1]);
writeb(CLK_REF_AU_EXTERNAL_REG, audiopll_ref_table[op_mode][0]);
writeb(USE_EXTERNAL_CLK_AU_REG, 0x0);
if (op_mode == AUC_CLK_ONCHIP_PLL_27MHZ) {
clk_ref = get_audio_pll_fs_index(REF_CLK_FREQ);
} else {
clk_ref = get_audio_pll_fs_index(get_spclk_freq_hz());
}
writel(SCALER_AUDIO_PRE_REG, audiopll_config_table[clk_ref][mclk_idx][1]);
writel(PLL_AUDIO_CTRL_REG, audiopll_config_table[clk_ref][mclk_idx][2]);
writel(PLL_AUDIO_FRAC_REG, audiopll_config_table[clk_ref][mclk_idx][3]);
writel(SCALER_AUDIO_REG, audiopll_config_table[clk_ref][mclk_idx][0]);
} else { //External Audio Clock Source
writeb(USE_EXTERNAL_CLK_AU_REG, 0x1);
}
rct_set_audio_freq_hz(mclk_table[mclk_idx]);
rct_alan_zhu_magic_loop(PLL_LOCK_AUDIO);
}
#elif (RCT_AUDIO_PLL_CONF_MODE == 0)
static u16 audiopll_config_table[7][3] =
{
{0x003a, 0x438, 0x24}, {0x4038, 0x43a, 0x24}, {0x403a, 0x438, 0x24},
{0x4138, 0x43a, 0x24}, {0x4338, 0x43a, 0x24}, {0x30, 0xe6a, 0x14},
//audiopll_config_table[6][] is only for IS2 Test =>27MHz Out
{0x003a, 0x438, 0x08}
};
void rct_set_audio_pll_fs(u8 op_mode)
{
writel(PLL_AU1_REG,
audiopll_config_table[op_mode][0]);
writel(PLL_AU2_REG,
audiopll_config_table[op_mode][1]);
writel(CG_AU_REG,
audiopll_config_table[op_mode][2]);
#if (RCT_SUPPORT_CG_SETTING_CHANGED == 1)
loc_cpu();
writel(CG_SETTING_CHANGED_REG, 0x00000000);
writel(CG_SETTING_CHANGED_REG, 0x00001808);
writel(CG_SETTING_CHANGED_REG, 0x00000000);
unl_cpu();
#endif
}
#endif
static struct srcu_notifier_head audio_notifier_list;
static struct notifier_block audio_notify;
static struct ambarella_i2s_interface audio_i2s_intf;
struct ambarella_i2s_interface get_audio_i2s_interface(void)
{
return audio_i2s_intf;
}
EXPORT_SYMBOL(get_audio_i2s_interface);
static int audio_notify_transition(struct notifier_block *nb,
unsigned long val, void *data)
{
switch(val) {
case AUDIO_NOTIFY_INIT:
audio_i2s_intf.state = AUDIO_NOTIFY_INIT;
memcpy(&audio_i2s_intf, data, sizeof(struct ambarella_i2s_interface));
break;
case AUDIO_NOTIFY_SETHWPARAMS:
audio_i2s_intf.state = AUDIO_NOTIFY_SETHWPARAMS;
memcpy(&audio_i2s_intf, data, sizeof(struct ambarella_i2s_interface));
break;
case AUDIO_NOTIFY_REMOVE:
memset(&audio_i2s_intf, 0, sizeof(struct ambarella_i2s_interface));
audio_i2s_intf.state = AUDIO_NOTIFY_REMOVE;
break;
default:
audio_i2s_intf.state = AUDIO_NOTIFY_UNKNOWN;
break;
}
return 0;
}
void ambarella_audio_notify_transition (
struct ambarella_i2s_interface *data, unsigned int type)
{
srcu_notifier_call_chain(&audio_notifier_list, type, data);
}
int ambarella_audio_register_notifier(struct notifier_block *nb)
{
return srcu_notifier_chain_register( &audio_notifier_list, nb);
}
int ambarella_audio_unregister_notifier(struct notifier_block *nb)
{
return srcu_notifier_chain_unregister(&audio_notifier_list, nb);
}
int __init ambarella_init_audio(void)
{
int retval = 0;
srcu_init_notifier_head(&audio_notifier_list);
memset(&audio_i2s_intf, 0, sizeof(struct ambarella_i2s_interface));
audio_i2s_intf.state = AUDIO_NOTIFY_UNKNOWN;
audio_notify.notifier_call = audio_notify_transition;
retval = ambarella_audio_register_notifier(&audio_notify);
return retval;
}