1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * clk-si5351.h: Silicon Laboratories Si5351A/B/C I2C Clock Generator 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> 6*4882a593Smuzhiyun * Rabeeh Khoury <rabeeh@solid-run.com> 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef _CLK_SI5351_H_ 10*4882a593Smuzhiyun #define _CLK_SI5351_H_ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #define SI5351_BUS_BASE_ADDR 0x60 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #define SI5351_PLL_VCO_MIN 600000000 15*4882a593Smuzhiyun #define SI5351_PLL_VCO_MAX 900000000 16*4882a593Smuzhiyun #define SI5351_MULTISYNTH_MIN_FREQ 1000000 17*4882a593Smuzhiyun #define SI5351_MULTISYNTH_DIVBY4_FREQ 150000000 18*4882a593Smuzhiyun #define SI5351_MULTISYNTH_MAX_FREQ 160000000 19*4882a593Smuzhiyun #define SI5351_MULTISYNTH67_MAX_FREQ SI5351_MULTISYNTH_DIVBY4_FREQ 20*4882a593Smuzhiyun #define SI5351_CLKOUT_MIN_FREQ 8000 21*4882a593Smuzhiyun #define SI5351_CLKOUT_MAX_FREQ SI5351_MULTISYNTH_MAX_FREQ 22*4882a593Smuzhiyun #define SI5351_CLKOUT67_MAX_FREQ SI5351_MULTISYNTH67_MAX_FREQ 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #define SI5351_PLL_A_MIN 15 25*4882a593Smuzhiyun #define SI5351_PLL_A_MAX 90 26*4882a593Smuzhiyun #define SI5351_PLL_B_MAX (SI5351_PLL_C_MAX-1) 27*4882a593Smuzhiyun #define SI5351_PLL_C_MAX 1048575 28*4882a593Smuzhiyun #define SI5351_MULTISYNTH_A_MIN 6 29*4882a593Smuzhiyun #define SI5351_MULTISYNTH_A_MAX 1800 30*4882a593Smuzhiyun #define SI5351_MULTISYNTH67_A_MAX 254 31*4882a593Smuzhiyun #define SI5351_MULTISYNTH_B_MAX (SI5351_MULTISYNTH_C_MAX-1) 32*4882a593Smuzhiyun #define SI5351_MULTISYNTH_C_MAX 1048575 33*4882a593Smuzhiyun #define SI5351_MULTISYNTH_P1_MAX ((1<<18)-1) 34*4882a593Smuzhiyun #define SI5351_MULTISYNTH_P2_MAX ((1<<20)-1) 35*4882a593Smuzhiyun #define SI5351_MULTISYNTH_P3_MAX ((1<<20)-1) 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun #define SI5351_DEVICE_STATUS 0 38*4882a593Smuzhiyun #define SI5351_INTERRUPT_STATUS 1 39*4882a593Smuzhiyun #define SI5351_INTERRUPT_MASK 2 40*4882a593Smuzhiyun #define SI5351_STATUS_SYS_INIT (1<<7) 41*4882a593Smuzhiyun #define SI5351_STATUS_LOL_B (1<<6) 42*4882a593Smuzhiyun #define SI5351_STATUS_LOL_A (1<<5) 43*4882a593Smuzhiyun #define SI5351_STATUS_LOS (1<<4) 44*4882a593Smuzhiyun #define SI5351_OUTPUT_ENABLE_CTRL 3 45*4882a593Smuzhiyun #define SI5351_OEB_PIN_ENABLE_CTRL 9 46*4882a593Smuzhiyun #define SI5351_PLL_INPUT_SOURCE 15 47*4882a593Smuzhiyun #define SI5351_CLKIN_DIV_MASK (3<<6) 48*4882a593Smuzhiyun #define SI5351_CLKIN_DIV_1 (0<<6) 49*4882a593Smuzhiyun #define SI5351_CLKIN_DIV_2 (1<<6) 50*4882a593Smuzhiyun #define SI5351_CLKIN_DIV_4 (2<<6) 51*4882a593Smuzhiyun #define SI5351_CLKIN_DIV_8 (3<<6) 52*4882a593Smuzhiyun #define SI5351_PLLB_SOURCE (1<<3) 53*4882a593Smuzhiyun #define SI5351_PLLA_SOURCE (1<<2) 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun #define SI5351_CLK0_CTRL 16 56*4882a593Smuzhiyun #define SI5351_CLK1_CTRL 17 57*4882a593Smuzhiyun #define SI5351_CLK2_CTRL 18 58*4882a593Smuzhiyun #define SI5351_CLK3_CTRL 19 59*4882a593Smuzhiyun #define SI5351_CLK4_CTRL 20 60*4882a593Smuzhiyun #define SI5351_CLK5_CTRL 21 61*4882a593Smuzhiyun #define SI5351_CLK6_CTRL 22 62*4882a593Smuzhiyun #define SI5351_CLK7_CTRL 23 63*4882a593Smuzhiyun #define SI5351_CLK_POWERDOWN (1<<7) 64*4882a593Smuzhiyun #define SI5351_CLK_INTEGER_MODE (1<<6) 65*4882a593Smuzhiyun #define SI5351_CLK_PLL_SELECT (1<<5) 66*4882a593Smuzhiyun #define SI5351_CLK_INVERT (1<<4) 67*4882a593Smuzhiyun #define SI5351_CLK_INPUT_MASK (3<<2) 68*4882a593Smuzhiyun #define SI5351_CLK_INPUT_XTAL (0<<2) 69*4882a593Smuzhiyun #define SI5351_CLK_INPUT_CLKIN (1<<2) 70*4882a593Smuzhiyun #define SI5351_CLK_INPUT_MULTISYNTH_0_4 (2<<2) 71*4882a593Smuzhiyun #define SI5351_CLK_INPUT_MULTISYNTH_N (3<<2) 72*4882a593Smuzhiyun #define SI5351_CLK_DRIVE_STRENGTH_MASK (3<<0) 73*4882a593Smuzhiyun #define SI5351_CLK_DRIVE_STRENGTH_2MA (0<<0) 74*4882a593Smuzhiyun #define SI5351_CLK_DRIVE_STRENGTH_4MA (1<<0) 75*4882a593Smuzhiyun #define SI5351_CLK_DRIVE_STRENGTH_6MA (2<<0) 76*4882a593Smuzhiyun #define SI5351_CLK_DRIVE_STRENGTH_8MA (3<<0) 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun #define SI5351_CLK3_0_DISABLE_STATE 24 79*4882a593Smuzhiyun #define SI5351_CLK7_4_DISABLE_STATE 25 80*4882a593Smuzhiyun #define SI5351_CLK_DISABLE_STATE_MASK 3 81*4882a593Smuzhiyun #define SI5351_CLK_DISABLE_STATE_LOW 0 82*4882a593Smuzhiyun #define SI5351_CLK_DISABLE_STATE_HIGH 1 83*4882a593Smuzhiyun #define SI5351_CLK_DISABLE_STATE_FLOAT 2 84*4882a593Smuzhiyun #define SI5351_CLK_DISABLE_STATE_NEVER 3 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun #define SI5351_PARAMETERS_LENGTH 8 87*4882a593Smuzhiyun #define SI5351_PLLA_PARAMETERS 26 88*4882a593Smuzhiyun #define SI5351_PLLB_PARAMETERS 34 89*4882a593Smuzhiyun #define SI5351_CLK0_PARAMETERS 42 90*4882a593Smuzhiyun #define SI5351_CLK1_PARAMETERS 50 91*4882a593Smuzhiyun #define SI5351_CLK2_PARAMETERS 58 92*4882a593Smuzhiyun #define SI5351_CLK3_PARAMETERS 66 93*4882a593Smuzhiyun #define SI5351_CLK4_PARAMETERS 74 94*4882a593Smuzhiyun #define SI5351_CLK5_PARAMETERS 82 95*4882a593Smuzhiyun #define SI5351_CLK6_PARAMETERS 90 96*4882a593Smuzhiyun #define SI5351_CLK7_PARAMETERS 91 97*4882a593Smuzhiyun #define SI5351_CLK6_7_OUTPUT_DIVIDER 92 98*4882a593Smuzhiyun #define SI5351_OUTPUT_CLK_DIV_MASK (7 << 4) 99*4882a593Smuzhiyun #define SI5351_OUTPUT_CLK6_DIV_MASK (7 << 0) 100*4882a593Smuzhiyun #define SI5351_OUTPUT_CLK_DIV_SHIFT 4 101*4882a593Smuzhiyun #define SI5351_OUTPUT_CLK_DIV6_SHIFT 0 102*4882a593Smuzhiyun #define SI5351_OUTPUT_CLK_DIV_1 0 103*4882a593Smuzhiyun #define SI5351_OUTPUT_CLK_DIV_2 1 104*4882a593Smuzhiyun #define SI5351_OUTPUT_CLK_DIV_4 2 105*4882a593Smuzhiyun #define SI5351_OUTPUT_CLK_DIV_8 3 106*4882a593Smuzhiyun #define SI5351_OUTPUT_CLK_DIV_16 4 107*4882a593Smuzhiyun #define SI5351_OUTPUT_CLK_DIV_32 5 108*4882a593Smuzhiyun #define SI5351_OUTPUT_CLK_DIV_64 6 109*4882a593Smuzhiyun #define SI5351_OUTPUT_CLK_DIV_128 7 110*4882a593Smuzhiyun #define SI5351_OUTPUT_CLK_DIVBY4 (3<<2) 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun #define SI5351_SSC_PARAM0 149 113*4882a593Smuzhiyun #define SI5351_SSC_PARAM1 150 114*4882a593Smuzhiyun #define SI5351_SSC_PARAM2 151 115*4882a593Smuzhiyun #define SI5351_SSC_PARAM3 152 116*4882a593Smuzhiyun #define SI5351_SSC_PARAM4 153 117*4882a593Smuzhiyun #define SI5351_SSC_PARAM5 154 118*4882a593Smuzhiyun #define SI5351_SSC_PARAM6 155 119*4882a593Smuzhiyun #define SI5351_SSC_PARAM7 156 120*4882a593Smuzhiyun #define SI5351_SSC_PARAM8 157 121*4882a593Smuzhiyun #define SI5351_SSC_PARAM9 158 122*4882a593Smuzhiyun #define SI5351_SSC_PARAM10 159 123*4882a593Smuzhiyun #define SI5351_SSC_PARAM11 160 124*4882a593Smuzhiyun #define SI5351_SSC_PARAM12 161 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun #define SI5351_VXCO_PARAMETERS_LOW 162 127*4882a593Smuzhiyun #define SI5351_VXCO_PARAMETERS_MID 163 128*4882a593Smuzhiyun #define SI5351_VXCO_PARAMETERS_HIGH 164 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun #define SI5351_CLK0_PHASE_OFFSET 165 131*4882a593Smuzhiyun #define SI5351_CLK1_PHASE_OFFSET 166 132*4882a593Smuzhiyun #define SI5351_CLK2_PHASE_OFFSET 167 133*4882a593Smuzhiyun #define SI5351_CLK3_PHASE_OFFSET 168 134*4882a593Smuzhiyun #define SI5351_CLK4_PHASE_OFFSET 169 135*4882a593Smuzhiyun #define SI5351_CLK5_PHASE_OFFSET 170 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun #define SI5351_PLL_RESET 177 138*4882a593Smuzhiyun #define SI5351_PLL_RESET_B (1<<7) 139*4882a593Smuzhiyun #define SI5351_PLL_RESET_A (1<<5) 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun #define SI5351_CRYSTAL_LOAD 183 142*4882a593Smuzhiyun #define SI5351_CRYSTAL_LOAD_MASK (3<<6) 143*4882a593Smuzhiyun #define SI5351_CRYSTAL_LOAD_6PF (1<<6) 144*4882a593Smuzhiyun #define SI5351_CRYSTAL_LOAD_8PF (2<<6) 145*4882a593Smuzhiyun #define SI5351_CRYSTAL_LOAD_10PF (3<<6) 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun #define SI5351_FANOUT_ENABLE 187 148*4882a593Smuzhiyun #define SI5351_CLKIN_ENABLE (1<<7) 149*4882a593Smuzhiyun #define SI5351_XTAL_ENABLE (1<<6) 150*4882a593Smuzhiyun #define SI5351_MULTISYNTH_ENABLE (1<<4) 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun /** 153*4882a593Smuzhiyun * enum si5351_variant - SiLabs Si5351 chip variant 154*4882a593Smuzhiyun * @SI5351_VARIANT_A: Si5351A (8 output clocks, XTAL input) 155*4882a593Smuzhiyun * @SI5351_VARIANT_A3: Si5351A MSOP10 (3 output clocks, XTAL input) 156*4882a593Smuzhiyun * @SI5351_VARIANT_B: Si5351B (8 output clocks, XTAL/VXCO input) 157*4882a593Smuzhiyun * @SI5351_VARIANT_C: Si5351C (8 output clocks, XTAL/CLKIN input) 158*4882a593Smuzhiyun */ 159*4882a593Smuzhiyun enum si5351_variant { 160*4882a593Smuzhiyun SI5351_VARIANT_A = 1, 161*4882a593Smuzhiyun SI5351_VARIANT_A3 = 2, 162*4882a593Smuzhiyun SI5351_VARIANT_B = 3, 163*4882a593Smuzhiyun SI5351_VARIANT_C = 4, 164*4882a593Smuzhiyun }; 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun #endif 167