162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2014 Google, Inc. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef __PISTACHIO_CLK_H 762306a36Sopenharmony_ci#define __PISTACHIO_CLK_H 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/clk-provider.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_cistruct pistachio_gate { 1262306a36Sopenharmony_ci unsigned int id; 1362306a36Sopenharmony_ci unsigned long reg; 1462306a36Sopenharmony_ci unsigned int shift; 1562306a36Sopenharmony_ci const char *name; 1662306a36Sopenharmony_ci const char *parent; 1762306a36Sopenharmony_ci}; 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#define GATE(_id, _name, _pname, _reg, _shift) \ 2062306a36Sopenharmony_ci { \ 2162306a36Sopenharmony_ci .id = _id, \ 2262306a36Sopenharmony_ci .reg = _reg, \ 2362306a36Sopenharmony_ci .shift = _shift, \ 2462306a36Sopenharmony_ci .name = _name, \ 2562306a36Sopenharmony_ci .parent = _pname, \ 2662306a36Sopenharmony_ci } 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_cistruct pistachio_mux { 2962306a36Sopenharmony_ci unsigned int id; 3062306a36Sopenharmony_ci unsigned long reg; 3162306a36Sopenharmony_ci unsigned int shift; 3262306a36Sopenharmony_ci unsigned int num_parents; 3362306a36Sopenharmony_ci const char *name; 3462306a36Sopenharmony_ci const char *const *parents; 3562306a36Sopenharmony_ci}; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci#define PNAME(x) static const char *const x[] __initconst 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci#define MUX(_id, _name, _pnames, _reg, _shift) \ 4062306a36Sopenharmony_ci { \ 4162306a36Sopenharmony_ci .id = _id, \ 4262306a36Sopenharmony_ci .reg = _reg, \ 4362306a36Sopenharmony_ci .shift = _shift, \ 4462306a36Sopenharmony_ci .name = _name, \ 4562306a36Sopenharmony_ci .parents = _pnames, \ 4662306a36Sopenharmony_ci .num_parents = ARRAY_SIZE(_pnames) \ 4762306a36Sopenharmony_ci } 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_cistruct pistachio_div { 5162306a36Sopenharmony_ci unsigned int id; 5262306a36Sopenharmony_ci unsigned long reg; 5362306a36Sopenharmony_ci unsigned int width; 5462306a36Sopenharmony_ci unsigned int div_flags; 5562306a36Sopenharmony_ci const char *name; 5662306a36Sopenharmony_ci const char *parent; 5762306a36Sopenharmony_ci}; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci#define DIV(_id, _name, _pname, _reg, _width) \ 6062306a36Sopenharmony_ci { \ 6162306a36Sopenharmony_ci .id = _id, \ 6262306a36Sopenharmony_ci .reg = _reg, \ 6362306a36Sopenharmony_ci .width = _width, \ 6462306a36Sopenharmony_ci .div_flags = 0, \ 6562306a36Sopenharmony_ci .name = _name, \ 6662306a36Sopenharmony_ci .parent = _pname, \ 6762306a36Sopenharmony_ci } 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci#define DIV_F(_id, _name, _pname, _reg, _width, _div_flags) \ 7062306a36Sopenharmony_ci { \ 7162306a36Sopenharmony_ci .id = _id, \ 7262306a36Sopenharmony_ci .reg = _reg, \ 7362306a36Sopenharmony_ci .width = _width, \ 7462306a36Sopenharmony_ci .div_flags = _div_flags, \ 7562306a36Sopenharmony_ci .name = _name, \ 7662306a36Sopenharmony_ci .parent = _pname, \ 7762306a36Sopenharmony_ci } 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_cistruct pistachio_fixed_factor { 8062306a36Sopenharmony_ci unsigned int id; 8162306a36Sopenharmony_ci unsigned int div; 8262306a36Sopenharmony_ci const char *name; 8362306a36Sopenharmony_ci const char *parent; 8462306a36Sopenharmony_ci}; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci#define FIXED_FACTOR(_id, _name, _pname, _div) \ 8762306a36Sopenharmony_ci { \ 8862306a36Sopenharmony_ci .id = _id, \ 8962306a36Sopenharmony_ci .div = _div, \ 9062306a36Sopenharmony_ci .name = _name, \ 9162306a36Sopenharmony_ci .parent = _pname, \ 9262306a36Sopenharmony_ci } 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_cistruct pistachio_pll_rate_table { 9562306a36Sopenharmony_ci unsigned long long fref; 9662306a36Sopenharmony_ci unsigned long long fout; 9762306a36Sopenharmony_ci unsigned long long refdiv; 9862306a36Sopenharmony_ci unsigned long long fbdiv; 9962306a36Sopenharmony_ci unsigned long long postdiv1; 10062306a36Sopenharmony_ci unsigned long long postdiv2; 10162306a36Sopenharmony_ci unsigned long long frac; 10262306a36Sopenharmony_ci}; 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_cienum pistachio_pll_type { 10562306a36Sopenharmony_ci PLL_GF40LP_LAINT, 10662306a36Sopenharmony_ci PLL_GF40LP_FRAC, 10762306a36Sopenharmony_ci}; 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_cistruct pistachio_pll { 11062306a36Sopenharmony_ci unsigned int id; 11162306a36Sopenharmony_ci unsigned long reg_base; 11262306a36Sopenharmony_ci enum pistachio_pll_type type; 11362306a36Sopenharmony_ci struct pistachio_pll_rate_table *rates; 11462306a36Sopenharmony_ci unsigned int nr_rates; 11562306a36Sopenharmony_ci const char *name; 11662306a36Sopenharmony_ci const char *parent; 11762306a36Sopenharmony_ci}; 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci#define PLL(_id, _name, _pname, _type, _reg, _rates) \ 12062306a36Sopenharmony_ci { \ 12162306a36Sopenharmony_ci .id = _id, \ 12262306a36Sopenharmony_ci .reg_base = _reg, \ 12362306a36Sopenharmony_ci .type = _type, \ 12462306a36Sopenharmony_ci .rates = _rates, \ 12562306a36Sopenharmony_ci .nr_rates = ARRAY_SIZE(_rates), \ 12662306a36Sopenharmony_ci .name = _name, \ 12762306a36Sopenharmony_ci .parent = _pname, \ 12862306a36Sopenharmony_ci } 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci#define PLL_FIXED(_id, _name, _pname, _type, _reg) \ 13162306a36Sopenharmony_ci { \ 13262306a36Sopenharmony_ci .id = _id, \ 13362306a36Sopenharmony_ci .reg_base = _reg, \ 13462306a36Sopenharmony_ci .type = _type, \ 13562306a36Sopenharmony_ci .rates = NULL, \ 13662306a36Sopenharmony_ci .nr_rates = 0, \ 13762306a36Sopenharmony_ci .name = _name, \ 13862306a36Sopenharmony_ci .parent = _pname, \ 13962306a36Sopenharmony_ci } 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_cistruct pistachio_clk_provider { 14262306a36Sopenharmony_ci struct device_node *node; 14362306a36Sopenharmony_ci void __iomem *base; 14462306a36Sopenharmony_ci struct clk_onecell_data clk_data; 14562306a36Sopenharmony_ci}; 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ciextern struct pistachio_clk_provider * 14862306a36Sopenharmony_cipistachio_clk_alloc_provider(struct device_node *node, unsigned int num_clks); 14962306a36Sopenharmony_ciextern void pistachio_clk_register_provider(struct pistachio_clk_provider *p); 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ciextern void pistachio_clk_register_gate(struct pistachio_clk_provider *p, 15262306a36Sopenharmony_ci struct pistachio_gate *gate, 15362306a36Sopenharmony_ci unsigned int num); 15462306a36Sopenharmony_ciextern void pistachio_clk_register_mux(struct pistachio_clk_provider *p, 15562306a36Sopenharmony_ci struct pistachio_mux *mux, 15662306a36Sopenharmony_ci unsigned int num); 15762306a36Sopenharmony_ciextern void pistachio_clk_register_div(struct pistachio_clk_provider *p, 15862306a36Sopenharmony_ci struct pistachio_div *div, 15962306a36Sopenharmony_ci unsigned int num); 16062306a36Sopenharmony_ciextern void 16162306a36Sopenharmony_cipistachio_clk_register_fixed_factor(struct pistachio_clk_provider *p, 16262306a36Sopenharmony_ci struct pistachio_fixed_factor *ff, 16362306a36Sopenharmony_ci unsigned int num); 16462306a36Sopenharmony_ciextern void pistachio_clk_register_pll(struct pistachio_clk_provider *p, 16562306a36Sopenharmony_ci struct pistachio_pll *pll, 16662306a36Sopenharmony_ci unsigned int num); 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ciextern void pistachio_clk_force_enable(struct pistachio_clk_provider *p, 16962306a36Sopenharmony_ci unsigned int *clk_ids, unsigned int num); 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci#endif 172