1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (c) 2014 Marvell Technology Group Ltd. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Alexandre Belloni <alexandre.belloni@free-electrons.com> 6*4882a593Smuzhiyun * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun #ifndef __BERLIN2_DIV_H 9*4882a593Smuzhiyun #define __BERLIN2_DIV_H 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun struct clk_hw; 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #define BERLIN2_DIV_HAS_GATE BIT(0) 14*4882a593Smuzhiyun #define BERLIN2_DIV_HAS_MUX BIT(1) 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #define BERLIN2_PLL_SELECT(_off, _sh) \ 17*4882a593Smuzhiyun .pll_select_offs = _off, \ 18*4882a593Smuzhiyun .pll_select_shift = _sh 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #define BERLIN2_PLL_SWITCH(_off, _sh) \ 21*4882a593Smuzhiyun .pll_switch_offs = _off, \ 22*4882a593Smuzhiyun .pll_switch_shift = _sh 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #define BERLIN2_DIV_SELECT(_off, _sh) \ 25*4882a593Smuzhiyun .div_select_offs = _off, \ 26*4882a593Smuzhiyun .div_select_shift = _sh 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #define BERLIN2_DIV_SWITCH(_off, _sh) \ 29*4882a593Smuzhiyun .div_switch_offs = _off, \ 30*4882a593Smuzhiyun .div_switch_shift = _sh 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun #define BERLIN2_DIV_D3SWITCH(_off, _sh) \ 33*4882a593Smuzhiyun .div3_switch_offs = _off, \ 34*4882a593Smuzhiyun .div3_switch_shift = _sh 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun #define BERLIN2_DIV_GATE(_off, _sh) \ 37*4882a593Smuzhiyun .gate_offs = _off, \ 38*4882a593Smuzhiyun .gate_shift = _sh 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun #define BERLIN2_SINGLE_DIV(_off) \ 41*4882a593Smuzhiyun BERLIN2_DIV_GATE(_off, 0), \ 42*4882a593Smuzhiyun BERLIN2_PLL_SELECT(_off, 1), \ 43*4882a593Smuzhiyun BERLIN2_PLL_SWITCH(_off, 4), \ 44*4882a593Smuzhiyun BERLIN2_DIV_SWITCH(_off, 5), \ 45*4882a593Smuzhiyun BERLIN2_DIV_D3SWITCH(_off, 6), \ 46*4882a593Smuzhiyun BERLIN2_DIV_SELECT(_off, 7) 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun struct berlin2_div_map { 49*4882a593Smuzhiyun u16 pll_select_offs; 50*4882a593Smuzhiyun u16 pll_switch_offs; 51*4882a593Smuzhiyun u16 div_select_offs; 52*4882a593Smuzhiyun u16 div_switch_offs; 53*4882a593Smuzhiyun u16 div3_switch_offs; 54*4882a593Smuzhiyun u16 gate_offs; 55*4882a593Smuzhiyun u8 pll_select_shift; 56*4882a593Smuzhiyun u8 pll_switch_shift; 57*4882a593Smuzhiyun u8 div_select_shift; 58*4882a593Smuzhiyun u8 div_switch_shift; 59*4882a593Smuzhiyun u8 div3_switch_shift; 60*4882a593Smuzhiyun u8 gate_shift; 61*4882a593Smuzhiyun }; 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun struct berlin2_div_data { 64*4882a593Smuzhiyun const char *name; 65*4882a593Smuzhiyun const u8 *parent_ids; 66*4882a593Smuzhiyun int num_parents; 67*4882a593Smuzhiyun unsigned long flags; 68*4882a593Smuzhiyun struct berlin2_div_map map; 69*4882a593Smuzhiyun u8 div_flags; 70*4882a593Smuzhiyun }; 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun struct clk_hw * 73*4882a593Smuzhiyun berlin2_div_register(const struct berlin2_div_map *map, 74*4882a593Smuzhiyun void __iomem *base, const char *name, u8 div_flags, 75*4882a593Smuzhiyun const char **parent_names, int num_parents, 76*4882a593Smuzhiyun unsigned long flags, spinlock_t *lock); 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun #endif /* __BERLIN2_DIV_H */ 79