| #include <config.h> |
| #include <common.h> |
| #include <asm/arch/gpio_c2000.h> |
| #include <asm/arch/hardware.h> |
| #include <asm/arch/clkcore_c2000.h> |
| |
| #define TDMNTG_REG_RST (1 << 0) |
| #define FSYNC_FALL_EDGE (1 << 1) |
| #define NTG_DIV_RST_N (1 << 5) |
| #define NTG_EN (1 << 0) |
| |
| #define TDMNTG_ADDR_SPACE_BASEADDR (COMCERTO_APB_CLK_BASE + 0x280) |
| #define TDM_NTG_CLK_CTRL (TDMNTG_ADDR_SPACE_BASEADDR + 0x00) |
| #define TDM_NTG_INCR (TDMNTG_ADDR_SPACE_BASEADDR + 0x04) |
| #define TDM_FSYNC_GEN_CTRL (TDMNTG_ADDR_SPACE_BASEADDR + 0x08) |
| #define TDM_FSYNC_LOW (TDMNTG_ADDR_SPACE_BASEADDR + 0x0C) |
| #define TDM_FSYNC_HIGH (TDMNTG_ADDR_SPACE_BASEADDR + 0x10) |
| |
| #define TDMNTG_DEFAULT_REF_CLK 500000000 |
| |
| /* TDM Divider value to 24 */ |
| #define NTG_TDM_CLK_DIV 24 |
| |
| |
| struct comcerto_tdm_data { |
| u8 fsoutput; /* Generic Pad Control and Version ID Register[2] */ |
| u8 fspolarity; /* 28 FSYNC_FALL(RISE)_EDGE */ |
| u16 fshwidth; /* High_Phase_Width[10:0] */ |
| u16 fslwidth; /* Low_Phase_Width[26:16]] */ |
| u32 clockhz; /* INC_VALUE[29:0] According to the desired TDM clock output frequency, this field should be configured */ |
| u8 clockout; /* IO Control Register[21] hardware or software control selection IO Control Register[20] pads are input (output) */ |
| u8 tdmmux; |
| u32 tdmck; |
| u32 tdmfs; |
| u32 tdmdx; |
| u32 tdmdr; |
| }; |
| |
| //Legerity |
| static struct comcerto_tdm_data comcerto_tdm_pdata = { |
| .fsoutput = 1, /* Generic Pad Control and Version ID Register[2] */ |
| .fspolarity = 0, /* 28 FSYNC_FALL(RISE)_EDGE */ |
| .fshwidth = 1, /* High_Phase_Width[10:0] */ |
| .fslwidth = 0xFF, /* Low_Phase_Width[10:0] */ |
| .clockhz = 2048000, /* INC_VALUE[29:0] According to the desired TDM clock output frequency, this field should be configured */ |
| .clockout = 1, /* 0 -> set bit 21, clear bit 20 in COMCERTO_GPIO_IOCTRL_REG |
| (software control, clock input) |
| 1 -> set bit 21 and 20 in COMCERTO_GPIO_IOCTRL_REG |
| (software control, clock output) |
| 2 -> clear bit 21 in COMCERTO_GPIO_IOCTRL_REG (hardware control) */ |
| /* TDM interface Muxing:0x0 - TDM block, 0x1 - ZDS block, |
| 0x2 - GPIO[63:60] signals and 0x3 - MSIF block is selected */ |
| .tdmmux = 0x1, |
| }; |
| |
| static void fsync_output_set(unsigned int fsoutput) |
| { |
| if (fsoutput) |
| { |
| *(volatile u32*)COMCERTO_GPIO_TDM_MUX = (*(volatile u32*)(COMCERTO_GPIO_TDM_MUX) | (1 << 0)); |
| *(volatile u32*)TDM_FSYNC_GEN_CTRL = (*(volatile u32*)(TDM_FSYNC_GEN_CTRL) | (1 << 0)); |
| } |
| else |
| { |
| *(volatile u32*)COMCERTO_GPIO_TDM_MUX = (*(volatile u32*)(COMCERTO_GPIO_TDM_MUX) & ~(1 << 0)); |
| *(volatile u32*)TDM_FSYNC_GEN_CTRL = (*(volatile u32*)(TDM_FSYNC_GEN_CTRL) & ~(1 << 0)); |
| } |
| } |
| |
| static void fsync_polarity_set(unsigned int fspolarity) |
| { |
| /* 28 FSYNC_FALL(RISE)_EDGE */ |
| if (fspolarity) |
| *(volatile u32*)TDM_FSYNC_GEN_CTRL = (*(volatile u32*)(TDM_FSYNC_GEN_CTRL) | FSYNC_FALL_EDGE); |
| else |
| *(volatile u32*)TDM_FSYNC_GEN_CTRL = (*(volatile u32*)(TDM_FSYNC_GEN_CTRL) & ~FSYNC_FALL_EDGE); |
| } |
| |
| static void fsync_lphase_set(u32 fslwidth) |
| { |
| /* Low_Phase_Width 7ff- maximum */ |
| if (fslwidth > 0x7FF) { |
| printf("%s: Low Phase width value is out of range %#x > 0x7FF", __func__, fslwidth); |
| return; |
| } |
| |
| *(volatile u32*)TDM_FSYNC_LOW = fslwidth; |
| } |
| |
| static void fsync_hphase_set(u32 fshwidth) |
| { |
| /* High_Phase_Width 7ff- maximum */ |
| if (fshwidth > 0x7FF) { |
| printf("%s: High Phase width value is out of range %#x > 0x7FF", __func__, fshwidth); |
| return; |
| } |
| |
| *(volatile u32*)TDM_FSYNC_HIGH = fshwidth; |
| } |
| |
| static void clock_frequency_set(unsigned long clockhz) |
| { |
| /* ntg_incr = 0x192A7371 for 49.152 MHz */ |
| *(volatile u32*)TDM_NTG_INCR = 0x192A7371; |
| } |
| |
| static void clock_output_set(unsigned long clockout) |
| { |
| switch (clockout) { |
| case 0: |
| *(volatile u32*)COMCERTO_GPIO_BOOTSTRAP_OVERRIDE = ((0x2 << 12) | (*(volatile u32*)(COMCERTO_GPIO_BOOTSTRAP_OVERRIDE) & ~(0x3 << 12))); |
| break; |
| case 1: |
| *(volatile u32*)COMCERTO_GPIO_BOOTSTRAP_OVERRIDE = ((0x3 << 12) | (*(volatile u32*)(COMCERTO_GPIO_BOOTSTRAP_OVERRIDE) & ~(0x3 << 12))); |
| break; |
| case 2: |
| *(volatile u32*)COMCERTO_GPIO_BOOTSTRAP_OVERRIDE = ((0x0 << 12) | (*(volatile u32*)(COMCERTO_GPIO_BOOTSTRAP_OVERRIDE) & ~(0x3 << 12))); |
| break; |
| default: |
| printf("%s: Unknown clock output value\n", __func__); |
| } |
| } |
| |
| static void tdm_mux_set(u32 tdmmux) |
| { |
| switch (tdmmux){ |
| case 0: |
| // TDM block selected |
| *(volatile u32*)COMCERTO_GPIO_MISC_PIN_SELECT_REG = ((0x0 << 4) | (*(volatile u32*)(COMCERTO_GPIO_MISC_PIN_SELECT_REG) & ~(0x3 << 4))); |
| break; |
| |
| case 1: |
| // ZDS (Zarlink) block selected |
| *(volatile u32*)COMCERTO_GPIO_MISC_PIN_SELECT_REG = ((0x1 << 4) | (*(volatile u32*)(COMCERTO_GPIO_MISC_PIN_SELECT_REG) & ~(0x3 << 4))); |
| break; |
| |
| case 2: |
| // GPIO[63:60] signals selected |
| *(volatile u32*)COMCERTO_GPIO_MISC_PIN_SELECT_REG = ((0x2 << 4) | (*(volatile u32*)(COMCERTO_GPIO_MISC_PIN_SELECT_REG) & ~(0x3 << 4))); |
| break; |
| |
| case 3: |
| // MSIF (SiLabs) selected |
| *(volatile u32*)COMCERTO_GPIO_MISC_PIN_SELECT_REG = ((0x3 << 4) | (*(volatile u32*)(COMCERTO_GPIO_MISC_PIN_SELECT_REG) & ~(0x3 << 4))); |
| break; |
| |
| default: |
| printf("%s: Unknown TDM MUX value\n", __func__); |
| } |
| } |
| |
| void c2k_zds_init(void) |
| { |
| printf("Initializing ZDS/NTG..\n"); |
| |
| // Take TDM NTG out of reset |
| *(volatile u32*)TDMNTG_RESET = (*(volatile u32*)(TDMNTG_RESET) & ~TDMNTG_REG_RST); |
| |
| //PLL2 |
| *(volatile u32*)TDMNTG_REF_CLK_CNTRL = (*(volatile u32*)(TDMNTG_REF_CLK_CNTRL) | ((1 << 2) | (1 << 0))); |
| |
| // NTG REF CLK is derived from PLL2 |
| *(volatile u32*)TDMNTG_REF_CLK_DIV_CNTRL = 0x3; |
| *(volatile u32*)TDM_NTG_CLK_CTRL = (NTG_DIV_RST_N | NTG_EN); |
| *(volatile u32*)TDM_CLK_CNTRL = 0x80; /* NTG = 24 x TDM */ |
| |
| /* Inital configuration of tdm bus */ |
| fsync_polarity_set(comcerto_tdm_pdata.fspolarity); |
| fsync_lphase_set(comcerto_tdm_pdata.fslwidth); |
| fsync_hphase_set(comcerto_tdm_pdata.fshwidth); |
| clock_frequency_set(comcerto_tdm_pdata.clockhz); |
| clock_output_set(comcerto_tdm_pdata.clockout); |
| fsync_output_set(comcerto_tdm_pdata.fsoutput); |
| tdm_mux_set(comcerto_tdm_pdata.tdmmux); |
| |
| *(volatile u32*)TDM_CLK_CNTRL = 0x18; //remove out of reset |
| |
| #define COMCERTO_GPIO1_OUTPUT_REG ((COMCERTO_APB_GPIO_BASE + 0xd0)) |
| *(volatile u32*)COMCERTO_GPIO1_OUTPUT_REG = (0x1 << 30); |
| |
| } |
| |