1*b3a33077SSimon Horman /* 2*b3a33077SSimon Horman * Renesas Clock Pulse Generator / Module Standby and Software Reset 3*b3a33077SSimon Horman * 4*b3a33077SSimon Horman * Copyright (C) 2015 Glider bvba 5*b3a33077SSimon Horman * 6*b3a33077SSimon Horman * This program is free software; you can redistribute it and/or modify 7*b3a33077SSimon Horman * it under the terms of the GNU General Public License as published by 8*b3a33077SSimon Horman * the Free Software Foundation; version 2 of the License. 9*b3a33077SSimon Horman */ 10*b3a33077SSimon Horman 11*b3a33077SSimon Horman #ifndef __CLK_RENESAS_CPG_MSSR_H__ 12*b3a33077SSimon Horman #define __CLK_RENESAS_CPG_MSSR_H__ 13*b3a33077SSimon Horman 14*b3a33077SSimon Horman /* 15*b3a33077SSimon Horman * Definitions of CPG Core Clocks 16*b3a33077SSimon Horman * 17*b3a33077SSimon Horman * These include: 18*b3a33077SSimon Horman * - Clock outputs exported to DT 19*b3a33077SSimon Horman * - External input clocks 20*b3a33077SSimon Horman * - Internal CPG clocks 21*b3a33077SSimon Horman */ 22*b3a33077SSimon Horman 23*b3a33077SSimon Horman struct cpg_core_clk { 24*b3a33077SSimon Horman /* Common */ 25*b3a33077SSimon Horman const char *name; 26*b3a33077SSimon Horman unsigned int id; 27*b3a33077SSimon Horman unsigned int type; 28*b3a33077SSimon Horman /* Depending on type */ 29*b3a33077SSimon Horman unsigned int parent; /* Core Clocks only */ 30*b3a33077SSimon Horman unsigned int div; 31*b3a33077SSimon Horman unsigned int mult; 32*b3a33077SSimon Horman unsigned int offset; 33*b3a33077SSimon Horman }; 34*b3a33077SSimon Horman 35*b3a33077SSimon Horman enum clk_types { 36*b3a33077SSimon Horman /* Generic */ 37*b3a33077SSimon Horman CLK_TYPE_IN, /* External Clock Input */ 38*b3a33077SSimon Horman CLK_TYPE_FF, /* Fixed Factor Clock */ 39*b3a33077SSimon Horman CLK_TYPE_DIV6P1, /* DIV6 Clock with 1 parent clock */ 40*b3a33077SSimon Horman 41*b3a33077SSimon Horman /* Custom definitions start here */ 42*b3a33077SSimon Horman CLK_TYPE_CUSTOM, 43*b3a33077SSimon Horman }; 44*b3a33077SSimon Horman 45*b3a33077SSimon Horman #define DEF_TYPE(_name, _id, _type...) \ 46*b3a33077SSimon Horman { .name = _name, .id = _id, .type = _type } 47*b3a33077SSimon Horman #define DEF_BASE(_name, _id, _type, _parent...) \ 48*b3a33077SSimon Horman DEF_TYPE(_name, _id, _type, .parent = _parent) 49*b3a33077SSimon Horman 50*b3a33077SSimon Horman #define DEF_INPUT(_name, _id) \ 51*b3a33077SSimon Horman DEF_TYPE(_name, _id, CLK_TYPE_IN) 52*b3a33077SSimon Horman #define DEF_FIXED(_name, _id, _parent, _div, _mult) \ 53*b3a33077SSimon Horman DEF_BASE(_name, _id, CLK_TYPE_FF, _parent, .div = _div, .mult = _mult) 54*b3a33077SSimon Horman #define DEF_DIV6P1(_name, _id, _parent, _offset) \ 55*b3a33077SSimon Horman DEF_BASE(_name, _id, CLK_TYPE_DIV6P1, _parent, .offset = _offset) 56*b3a33077SSimon Horman #define DEF_SD(_name, _id, _parent, _offset) \ 57*b3a33077SSimon Horman DEF_BASE(_name, _id, CLK_TYPE_GEN3_SD, _parent, .offset = _offset) 58*b3a33077SSimon Horman 59*b3a33077SSimon Horman 60*b3a33077SSimon Horman /* 61*b3a33077SSimon Horman * Definitions of Module Clocks 62*b3a33077SSimon Horman */ 63*b3a33077SSimon Horman 64*b3a33077SSimon Horman struct mssr_mod_clk { 65*b3a33077SSimon Horman const char *name; 66*b3a33077SSimon Horman unsigned int id; 67*b3a33077SSimon Horman unsigned int parent; /* Add MOD_CLK_BASE for Module Clocks */ 68*b3a33077SSimon Horman }; 69*b3a33077SSimon Horman 70*b3a33077SSimon Horman /* Convert from sparse base-100 to packed index space */ 71*b3a33077SSimon Horman #define MOD_CLK_PACK(x) ((x) - ((x) / 100) * (100 - 32)) 72*b3a33077SSimon Horman 73*b3a33077SSimon Horman #define MOD_CLK_ID(x) (MOD_CLK_BASE + MOD_CLK_PACK(x)) 74*b3a33077SSimon Horman 75*b3a33077SSimon Horman #define DEF_MOD(_name, _mod, _parent...) \ 76*b3a33077SSimon Horman { .name = _name, .id = MOD_CLK_ID(_mod), .parent = _parent } 77*b3a33077SSimon Horman 78*b3a33077SSimon Horman 79*b3a33077SSimon Horman struct device_node; 80*b3a33077SSimon Horman 81*b3a33077SSimon Horman /** 82*b3a33077SSimon Horman * SoC-specific CPG/MSSR Description 83*b3a33077SSimon Horman * 84*b3a33077SSimon Horman * @core_clks: Array of Core Clock definitions 85*b3a33077SSimon Horman * @num_core_clks: Number of entries in core_clks[] 86*b3a33077SSimon Horman * @last_dt_core_clk: ID of the last Core Clock exported to DT 87*b3a33077SSimon Horman * @num_total_core_clks: Total number of Core Clocks (exported + internal) 88*b3a33077SSimon Horman * 89*b3a33077SSimon Horman * @mod_clks: Array of Module Clock definitions 90*b3a33077SSimon Horman * @num_mod_clks: Number of entries in mod_clks[] 91*b3a33077SSimon Horman * @num_hw_mod_clks: Number of Module Clocks supported by the hardware 92*b3a33077SSimon Horman * 93*b3a33077SSimon Horman * @crit_mod_clks: Array with Module Clock IDs of critical clocks that 94*b3a33077SSimon Horman * should not be disabled without a knowledgeable driver 95*b3a33077SSimon Horman * @num_crit_mod_clks: Number of entries in crit_mod_clks[] 96*b3a33077SSimon Horman * 97*b3a33077SSimon Horman * @core_pm_clks: Array with IDs of Core Clocks that are suitable for Power 98*b3a33077SSimon Horman * Management, in addition to Module Clocks 99*b3a33077SSimon Horman * @num_core_pm_clks: Number of entries in core_pm_clks[] 100*b3a33077SSimon Horman * 101*b3a33077SSimon Horman * @init: Optional callback to perform SoC-specific initialization 102*b3a33077SSimon Horman * @cpg_clk_register: Optional callback to handle special Core Clock types 103*b3a33077SSimon Horman */ 104*b3a33077SSimon Horman 105*b3a33077SSimon Horman struct cpg_mssr_info { 106*b3a33077SSimon Horman /* Core Clocks */ 107*b3a33077SSimon Horman const struct cpg_core_clk *core_clks; 108*b3a33077SSimon Horman unsigned int num_core_clks; 109*b3a33077SSimon Horman unsigned int last_dt_core_clk; 110*b3a33077SSimon Horman unsigned int num_total_core_clks; 111*b3a33077SSimon Horman 112*b3a33077SSimon Horman /* Module Clocks */ 113*b3a33077SSimon Horman const struct mssr_mod_clk *mod_clks; 114*b3a33077SSimon Horman unsigned int num_mod_clks; 115*b3a33077SSimon Horman unsigned int num_hw_mod_clks; 116*b3a33077SSimon Horman 117*b3a33077SSimon Horman /* Critical Module Clocks that should not be disabled */ 118*b3a33077SSimon Horman const unsigned int *crit_mod_clks; 119*b3a33077SSimon Horman unsigned int num_crit_mod_clks; 120*b3a33077SSimon Horman 121*b3a33077SSimon Horman /* Core Clocks suitable for PM, in addition to the Module Clocks */ 122*b3a33077SSimon Horman const unsigned int *core_pm_clks; 123*b3a33077SSimon Horman unsigned int num_core_pm_clks; 124*b3a33077SSimon Horman 125*b3a33077SSimon Horman /* Callbacks */ 126*b3a33077SSimon Horman int (*init)(struct device *dev); 127*b3a33077SSimon Horman struct clk *(*cpg_clk_register)(struct device *dev, 128*b3a33077SSimon Horman const struct cpg_core_clk *core, 129*b3a33077SSimon Horman const struct cpg_mssr_info *info, 130*b3a33077SSimon Horman struct clk **clks, void __iomem *base); 131*b3a33077SSimon Horman }; 132*b3a33077SSimon Horman 133*b3a33077SSimon Horman extern const struct cpg_mssr_info r8a7795_cpg_mssr_info; 134*b3a33077SSimon Horman #endif 135