162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2014 Marvell Technology Group Ltd. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Alexandre Belloni <alexandre.belloni@free-electrons.com> 662306a36Sopenharmony_ci * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci#ifndef __BERLIN2_DIV_H 962306a36Sopenharmony_ci#define __BERLIN2_DIV_H 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_cistruct clk_hw; 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#define BERLIN2_DIV_HAS_GATE BIT(0) 1462306a36Sopenharmony_ci#define BERLIN2_DIV_HAS_MUX BIT(1) 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#define BERLIN2_PLL_SELECT(_off, _sh) \ 1762306a36Sopenharmony_ci .pll_select_offs = _off, \ 1862306a36Sopenharmony_ci .pll_select_shift = _sh 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#define BERLIN2_PLL_SWITCH(_off, _sh) \ 2162306a36Sopenharmony_ci .pll_switch_offs = _off, \ 2262306a36Sopenharmony_ci .pll_switch_shift = _sh 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#define BERLIN2_DIV_SELECT(_off, _sh) \ 2562306a36Sopenharmony_ci .div_select_offs = _off, \ 2662306a36Sopenharmony_ci .div_select_shift = _sh 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#define BERLIN2_DIV_SWITCH(_off, _sh) \ 2962306a36Sopenharmony_ci .div_switch_offs = _off, \ 3062306a36Sopenharmony_ci .div_switch_shift = _sh 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci#define BERLIN2_DIV_D3SWITCH(_off, _sh) \ 3362306a36Sopenharmony_ci .div3_switch_offs = _off, \ 3462306a36Sopenharmony_ci .div3_switch_shift = _sh 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci#define BERLIN2_DIV_GATE(_off, _sh) \ 3762306a36Sopenharmony_ci .gate_offs = _off, \ 3862306a36Sopenharmony_ci .gate_shift = _sh 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci#define BERLIN2_SINGLE_DIV(_off) \ 4162306a36Sopenharmony_ci BERLIN2_DIV_GATE(_off, 0), \ 4262306a36Sopenharmony_ci BERLIN2_PLL_SELECT(_off, 1), \ 4362306a36Sopenharmony_ci BERLIN2_PLL_SWITCH(_off, 4), \ 4462306a36Sopenharmony_ci BERLIN2_DIV_SWITCH(_off, 5), \ 4562306a36Sopenharmony_ci BERLIN2_DIV_D3SWITCH(_off, 6), \ 4662306a36Sopenharmony_ci BERLIN2_DIV_SELECT(_off, 7) 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_cistruct berlin2_div_map { 4962306a36Sopenharmony_ci u16 pll_select_offs; 5062306a36Sopenharmony_ci u16 pll_switch_offs; 5162306a36Sopenharmony_ci u16 div_select_offs; 5262306a36Sopenharmony_ci u16 div_switch_offs; 5362306a36Sopenharmony_ci u16 div3_switch_offs; 5462306a36Sopenharmony_ci u16 gate_offs; 5562306a36Sopenharmony_ci u8 pll_select_shift; 5662306a36Sopenharmony_ci u8 pll_switch_shift; 5762306a36Sopenharmony_ci u8 div_select_shift; 5862306a36Sopenharmony_ci u8 div_switch_shift; 5962306a36Sopenharmony_ci u8 div3_switch_shift; 6062306a36Sopenharmony_ci u8 gate_shift; 6162306a36Sopenharmony_ci}; 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_cistruct berlin2_div_data { 6462306a36Sopenharmony_ci const char *name; 6562306a36Sopenharmony_ci const u8 *parent_ids; 6662306a36Sopenharmony_ci int num_parents; 6762306a36Sopenharmony_ci unsigned long flags; 6862306a36Sopenharmony_ci struct berlin2_div_map map; 6962306a36Sopenharmony_ci u8 div_flags; 7062306a36Sopenharmony_ci}; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_cistruct clk_hw * 7362306a36Sopenharmony_ciberlin2_div_register(const struct berlin2_div_map *map, 7462306a36Sopenharmony_ci void __iomem *base, const char *name, u8 div_flags, 7562306a36Sopenharmony_ci const char **parent_names, int num_parents, 7662306a36Sopenharmony_ci unsigned long flags, spinlock_t *lock); 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci#endif /* __BERLIN2_DIV_H */ 79