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) 247c09b858SMaxime Ripard #define CCU_FEATURE_ALL_PREDIV BIT(4) 253de64bf1SChen-Yu Tsai #define CCU_FEATURE_LOCK_REG BIT(5) 26f6f64ed8SChen-Yu Tsai #define CCU_FEATURE_MMC_TIMING_SWITCH BIT(6) 2705d2eaacSChen-Yu Tsai #define CCU_FEATURE_SIGMA_DELTA_MOD BIT(7) 28f6f64ed8SChen-Yu Tsai 29f6f64ed8SChen-Yu Tsai /* MMC timing mode switch bit */ 30f6f64ed8SChen-Yu Tsai #define CCU_MMC_NEW_TIMING_MODE BIT(30) 311d80c142SMaxime Ripard 321d80c142SMaxime Ripard struct device_node; 331d80c142SMaxime Ripard 341d80c142SMaxime Ripard #define CLK_HW_INIT(_name, _parent, _ops, _flags) \ 351d80c142SMaxime Ripard &(struct clk_init_data) { \ 361d80c142SMaxime Ripard .flags = _flags, \ 371d80c142SMaxime Ripard .name = _name, \ 381d80c142SMaxime Ripard .parent_names = (const char *[]) { _parent }, \ 391d80c142SMaxime Ripard .num_parents = 1, \ 401d80c142SMaxime Ripard .ops = _ops, \ 411d80c142SMaxime Ripard } 421d80c142SMaxime Ripard 431d80c142SMaxime Ripard #define CLK_HW_INIT_PARENTS(_name, _parents, _ops, _flags) \ 441d80c142SMaxime Ripard &(struct clk_init_data) { \ 451d80c142SMaxime Ripard .flags = _flags, \ 461d80c142SMaxime Ripard .name = _name, \ 471d80c142SMaxime Ripard .parent_names = _parents, \ 481d80c142SMaxime Ripard .num_parents = ARRAY_SIZE(_parents), \ 491d80c142SMaxime Ripard .ops = _ops, \ 501d80c142SMaxime Ripard } 511d80c142SMaxime Ripard 521d80c142SMaxime Ripard #define CLK_FIXED_FACTOR(_struct, _name, _parent, \ 531d80c142SMaxime Ripard _div, _mult, _flags) \ 541d80c142SMaxime Ripard struct clk_fixed_factor _struct = { \ 551d80c142SMaxime Ripard .div = _div, \ 561d80c142SMaxime Ripard .mult = _mult, \ 571d80c142SMaxime Ripard .hw.init = CLK_HW_INIT(_name, \ 581d80c142SMaxime Ripard _parent, \ 591d80c142SMaxime Ripard &clk_fixed_factor_ops, \ 601d80c142SMaxime Ripard _flags), \ 611d80c142SMaxime Ripard } 621d80c142SMaxime Ripard 631d80c142SMaxime Ripard struct ccu_common { 641d80c142SMaxime Ripard void __iomem *base; 651d80c142SMaxime Ripard u16 reg; 663de64bf1SChen-Yu Tsai u16 lock_reg; 677c09b858SMaxime Ripard u32 prediv; 681d80c142SMaxime Ripard 691d80c142SMaxime Ripard unsigned long features; 701d80c142SMaxime Ripard spinlock_t *lock; 711d80c142SMaxime Ripard struct clk_hw hw; 721d80c142SMaxime Ripard }; 731d80c142SMaxime Ripard 741d80c142SMaxime Ripard static inline struct ccu_common *hw_to_ccu_common(struct clk_hw *hw) 751d80c142SMaxime Ripard { 761d80c142SMaxime Ripard return container_of(hw, struct ccu_common, hw); 771d80c142SMaxime Ripard } 781d80c142SMaxime Ripard 791d80c142SMaxime Ripard struct sunxi_ccu_desc { 801d80c142SMaxime Ripard struct ccu_common **ccu_clks; 811d80c142SMaxime Ripard unsigned long num_ccu_clks; 821d80c142SMaxime Ripard 831d80c142SMaxime Ripard struct clk_hw_onecell_data *hw_clks; 841d80c142SMaxime Ripard 851d80c142SMaxime Ripard struct ccu_reset_map *resets; 861d80c142SMaxime Ripard unsigned long num_resets; 871d80c142SMaxime Ripard }; 881d80c142SMaxime Ripard 891d80c142SMaxime Ripard void ccu_helper_wait_for_lock(struct ccu_common *common, u32 lock); 901d80c142SMaxime Ripard 9102ae2bc6SChen-Yu Tsai struct ccu_pll_nb { 9202ae2bc6SChen-Yu Tsai struct notifier_block clk_nb; 9302ae2bc6SChen-Yu Tsai struct ccu_common *common; 9402ae2bc6SChen-Yu Tsai 9502ae2bc6SChen-Yu Tsai u32 enable; 9602ae2bc6SChen-Yu Tsai u32 lock; 9702ae2bc6SChen-Yu Tsai }; 9802ae2bc6SChen-Yu Tsai 9902ae2bc6SChen-Yu Tsai #define to_ccu_pll_nb(_nb) container_of(_nb, struct ccu_pll_nb, clk_nb) 10002ae2bc6SChen-Yu Tsai 10102ae2bc6SChen-Yu Tsai int ccu_pll_notifier_register(struct ccu_pll_nb *pll_nb); 10202ae2bc6SChen-Yu Tsai 1031d80c142SMaxime Ripard int sunxi_ccu_probe(struct device_node *node, void __iomem *reg, 1041d80c142SMaxime Ripard const struct sunxi_ccu_desc *desc); 1051d80c142SMaxime Ripard 1061d80c142SMaxime Ripard #endif /* _COMMON_H_ */ 107