1 /* 2 * Copyright (c) 2014 Marvell Technology Group Ltd. 3 * 4 * Alexandre Belloni <alexandre.belloni@free-electrons.com> 5 * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> 6 * 7 * This program is free software; you can redistribute it and/or modify it 8 * under the terms and conditions of the GNU General Public License, 9 * version 2, as published by the Free Software Foundation. 10 * 11 * This program is distributed in the hope it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 14 * more details. 15 * 16 * You should have received a copy of the GNU General Public License along with 17 * this program. If not, see <http://www.gnu.org/licenses/>. 18 */ 19 #ifndef __BERLIN2_DIV_H 20 #define __BERLIN2_DIV_H 21 22 struct clk_hw; 23 24 #define BERLIN2_DIV_HAS_GATE BIT(0) 25 #define BERLIN2_DIV_HAS_MUX BIT(1) 26 27 #define BERLIN2_PLL_SELECT(_off, _sh) \ 28 .pll_select_offs = _off, \ 29 .pll_select_shift = _sh 30 31 #define BERLIN2_PLL_SWITCH(_off, _sh) \ 32 .pll_switch_offs = _off, \ 33 .pll_switch_shift = _sh 34 35 #define BERLIN2_DIV_SELECT(_off, _sh) \ 36 .div_select_offs = _off, \ 37 .div_select_shift = _sh 38 39 #define BERLIN2_DIV_SWITCH(_off, _sh) \ 40 .div_switch_offs = _off, \ 41 .div_switch_shift = _sh 42 43 #define BERLIN2_DIV_D3SWITCH(_off, _sh) \ 44 .div3_switch_offs = _off, \ 45 .div3_switch_shift = _sh 46 47 #define BERLIN2_DIV_GATE(_off, _sh) \ 48 .gate_offs = _off, \ 49 .gate_shift = _sh 50 51 #define BERLIN2_SINGLE_DIV(_off) \ 52 BERLIN2_DIV_GATE(_off, 0), \ 53 BERLIN2_PLL_SELECT(_off, 1), \ 54 BERLIN2_PLL_SWITCH(_off, 4), \ 55 BERLIN2_DIV_SWITCH(_off, 5), \ 56 BERLIN2_DIV_D3SWITCH(_off, 6), \ 57 BERLIN2_DIV_SELECT(_off, 7) 58 59 struct berlin2_div_map { 60 u16 pll_select_offs; 61 u16 pll_switch_offs; 62 u16 div_select_offs; 63 u16 div_switch_offs; 64 u16 div3_switch_offs; 65 u16 gate_offs; 66 u8 pll_select_shift; 67 u8 pll_switch_shift; 68 u8 div_select_shift; 69 u8 div_switch_shift; 70 u8 div3_switch_shift; 71 u8 gate_shift; 72 }; 73 74 struct berlin2_div_data { 75 const char *name; 76 const u8 *parent_ids; 77 int num_parents; 78 unsigned long flags; 79 struct berlin2_div_map map; 80 u8 div_flags; 81 }; 82 83 struct clk_hw * 84 berlin2_div_register(const struct berlin2_div_map *map, 85 void __iomem *base, const char *name, u8 div_flags, 86 const char **parent_names, int num_parents, 87 unsigned long flags, spinlock_t *lock); 88 89 #endif /* __BERLIN2_DIV_H */ 90