11d80c142SMaxime Ripard /* 21d80c142SMaxime Ripard * Copyright (c) 2016 Maxime Ripard. All rights reserved. 31d80c142SMaxime Ripard * 41d80c142SMaxime Ripard * This software is licensed under the terms of the GNU General Public 51d80c142SMaxime Ripard * License version 2, as published by the Free Software Foundation, and 61d80c142SMaxime Ripard * may be copied, distributed, and modified under those terms. 71d80c142SMaxime Ripard * 81d80c142SMaxime Ripard * This program is distributed in the hope that it will be useful, 91d80c142SMaxime Ripard * but WITHOUT ANY WARRANTY; without even the implied warranty of 101d80c142SMaxime Ripard * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 111d80c142SMaxime Ripard * GNU General Public License for more details. 121d80c142SMaxime Ripard */ 131d80c142SMaxime Ripard 141d80c142SMaxime Ripard #ifndef _COMMON_H_ 151d80c142SMaxime Ripard #define _COMMON_H_ 161d80c142SMaxime Ripard 171d80c142SMaxime Ripard #include <linux/compiler.h> 181d80c142SMaxime Ripard #include <linux/clk-provider.h> 191d80c142SMaxime Ripard 201d80c142SMaxime Ripard #define CCU_FEATURE_FRACTIONAL BIT(0) 211d80c142SMaxime Ripard #define CCU_FEATURE_VARIABLE_PREDIV BIT(1) 221d80c142SMaxime Ripard #define CCU_FEATURE_FIXED_PREDIV BIT(2) 231d80c142SMaxime Ripard #define CCU_FEATURE_FIXED_POSTDIV BIT(3) 241d80c142SMaxime Ripard 251d80c142SMaxime Ripard struct device_node; 261d80c142SMaxime Ripard 271d80c142SMaxime Ripard #define CLK_HW_INIT(_name, _parent, _ops, _flags) \ 281d80c142SMaxime Ripard &(struct clk_init_data) { \ 291d80c142SMaxime Ripard .flags = _flags, \ 301d80c142SMaxime Ripard .name = _name, \ 311d80c142SMaxime Ripard .parent_names = (const char *[]) { _parent }, \ 321d80c142SMaxime Ripard .num_parents = 1, \ 331d80c142SMaxime Ripard .ops = _ops, \ 341d80c142SMaxime Ripard } 351d80c142SMaxime Ripard 361d80c142SMaxime Ripard #define CLK_HW_INIT_PARENTS(_name, _parents, _ops, _flags) \ 371d80c142SMaxime Ripard &(struct clk_init_data) { \ 381d80c142SMaxime Ripard .flags = _flags, \ 391d80c142SMaxime Ripard .name = _name, \ 401d80c142SMaxime Ripard .parent_names = _parents, \ 411d80c142SMaxime Ripard .num_parents = ARRAY_SIZE(_parents), \ 421d80c142SMaxime Ripard .ops = _ops, \ 431d80c142SMaxime Ripard } 441d80c142SMaxime Ripard 451d80c142SMaxime Ripard #define CLK_FIXED_FACTOR(_struct, _name, _parent, \ 461d80c142SMaxime Ripard _div, _mult, _flags) \ 471d80c142SMaxime Ripard struct clk_fixed_factor _struct = { \ 481d80c142SMaxime Ripard .div = _div, \ 491d80c142SMaxime Ripard .mult = _mult, \ 501d80c142SMaxime Ripard .hw.init = CLK_HW_INIT(_name, \ 511d80c142SMaxime Ripard _parent, \ 521d80c142SMaxime Ripard &clk_fixed_factor_ops, \ 531d80c142SMaxime Ripard _flags), \ 541d80c142SMaxime Ripard } 551d80c142SMaxime Ripard 561d80c142SMaxime Ripard struct ccu_common { 571d80c142SMaxime Ripard void __iomem *base; 581d80c142SMaxime Ripard u16 reg; 591d80c142SMaxime Ripard 601d80c142SMaxime Ripard unsigned long features; 611d80c142SMaxime Ripard spinlock_t *lock; 621d80c142SMaxime Ripard struct clk_hw hw; 631d80c142SMaxime Ripard }; 641d80c142SMaxime Ripard 651d80c142SMaxime Ripard static inline struct ccu_common *hw_to_ccu_common(struct clk_hw *hw) 661d80c142SMaxime Ripard { 671d80c142SMaxime Ripard return container_of(hw, struct ccu_common, hw); 681d80c142SMaxime Ripard } 691d80c142SMaxime Ripard 701d80c142SMaxime Ripard struct sunxi_ccu_desc { 711d80c142SMaxime Ripard struct ccu_common **ccu_clks; 721d80c142SMaxime Ripard unsigned long num_ccu_clks; 731d80c142SMaxime Ripard 741d80c142SMaxime Ripard struct clk_hw_onecell_data *hw_clks; 751d80c142SMaxime Ripard 761d80c142SMaxime Ripard struct ccu_reset_map *resets; 771d80c142SMaxime Ripard unsigned long num_resets; 781d80c142SMaxime Ripard }; 791d80c142SMaxime Ripard 801d80c142SMaxime Ripard void ccu_helper_wait_for_lock(struct ccu_common *common, u32 lock); 811d80c142SMaxime Ripard 821d80c142SMaxime Ripard int sunxi_ccu_probe(struct device_node *node, void __iomem *reg, 831d80c142SMaxime Ripard const struct sunxi_ccu_desc *desc); 841d80c142SMaxime Ripard 851d80c142SMaxime Ripard #endif /* _COMMON_H_ */ 86