1f21c469dSHubert Mazur /*- 24d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 3f21c469dSHubert Mazur * 4f21c469dSHubert Mazur * Copyright (c) 2021 Semihalf. 5f21c469dSHubert Mazur * 6f21c469dSHubert Mazur * Redistribution and use in source and binary forms, with or without 7f21c469dSHubert Mazur * modification, are permitted provided that the following conditions 8f21c469dSHubert Mazur * are met: 9f21c469dSHubert Mazur * 1. Redistributions of source code must retain the above copyright 10f21c469dSHubert Mazur * notice, this list of conditions and the following disclaimer. 11f21c469dSHubert Mazur * 2. Redistributions in binary form must reproduce the above copyright 12f21c469dSHubert Mazur * notice, this list of conditions and the following disclaimer in the 13f21c469dSHubert Mazur * documentation and/or other materials provided with the distribution. 14f21c469dSHubert Mazur * 15f21c469dSHubert Mazur * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16f21c469dSHubert Mazur * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17f21c469dSHubert Mazur * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18f21c469dSHubert Mazur * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19f21c469dSHubert Mazur * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20f21c469dSHubert Mazur * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21f21c469dSHubert Mazur * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22f21c469dSHubert Mazur * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23f21c469dSHubert Mazur * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24f21c469dSHubert Mazur * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25f21c469dSHubert Mazur * SUCH DAMAGE. 26f21c469dSHubert Mazur * 27f21c469dSHubert Mazur */ 28f21c469dSHubert Mazur 29f21c469dSHubert Mazur #ifndef _PERIPH_H_ 30f21c469dSHubert Mazur #define _PERIPH_H_ 31f21c469dSHubert Mazur 32*be82b3a0SEmmanuel Vadot #include <dev/clk/clk.h> 33*be82b3a0SEmmanuel Vadot #include <dev/clk/clk_mux.h> 34*be82b3a0SEmmanuel Vadot #include <dev/clk/clk_div.h> 35*be82b3a0SEmmanuel Vadot #include <dev/clk/clk_gate.h> 36f21c469dSHubert Mazur 37f21c469dSHubert Mazur #define TBG_SEL 0x0 38f21c469dSHubert Mazur #define DIV_SEL0 0x4 39f21c469dSHubert Mazur #define DIV_SEL1 0x8 40f21c469dSHubert Mazur #define DIV_SEL2 0xC 41f21c469dSHubert Mazur #define CLK_SEL 0x10 42f21c469dSHubert Mazur #define CLK_DIS 0x14 43f21c469dSHubert Mazur #define DIV_MASK 0x7 44f21c469dSHubert Mazur 45f21c469dSHubert Mazur #define MUX_POS 1 46f21c469dSHubert Mazur #define DIV1_POS 2 47f21c469dSHubert Mazur #define DIV2_POS 3 48f21c469dSHubert Mazur #define GATE_POS 4 49f21c469dSHubert Mazur #define FIXED1_POS 5 50f21c469dSHubert Mazur #define FIXED2_POS 6 51f21c469dSHubert Mazur #define CLK_MUX_POS 7 52f21c469dSHubert Mazur 53f21c469dSHubert Mazur #define RD4(_clk, offset, val) \ 54f21c469dSHubert Mazur CLKDEV_READ_4(clknode_get_device(_clk), offset, val) 55f21c469dSHubert Mazur 56f21c469dSHubert Mazur #define A37x0_INTERNAL_CLK_ID(_base, _pos) \ 57f21c469dSHubert Mazur ((_base * 10) + (_pos)) 58f21c469dSHubert Mazur 59f21c469dSHubert Mazur #define CLK_FULL_DD(_name, _id, _gate_shift, _tbg_mux_shift, \ 60f21c469dSHubert Mazur _clk_mux_shift, _div1_reg, _div2_reg, _div1_shift, _div2_shift, \ 61f21c469dSHubert Mazur _tbg_mux_name, _div1_name, _div2_name, _clk_mux_name) \ 62f21c469dSHubert Mazur { \ 63f21c469dSHubert Mazur .type = CLK_FULL_DD, \ 64f21c469dSHubert Mazur .common_def.device_name = _name, \ 65f21c469dSHubert Mazur .common_def.device_id = _id, \ 66f21c469dSHubert Mazur .clk_def.full_dd.tbg_mux.clkdef.name = _tbg_mux_name, \ 67f21c469dSHubert Mazur .clk_def.full_dd.tbg_mux.offset = TBG_SEL, \ 68f21c469dSHubert Mazur .clk_def.full_dd.tbg_mux.shift = _tbg_mux_shift, \ 69f21c469dSHubert Mazur .clk_def.full_dd.tbg_mux.width = 0x2, \ 70f21c469dSHubert Mazur .clk_def.full_dd.tbg_mux.mux_flags = 0x0, \ 71f21c469dSHubert Mazur .clk_def.full_dd.div1.clkdef.name = _div1_name, \ 72f21c469dSHubert Mazur .clk_def.full_dd.div1.offset = _div1_reg, \ 73f21c469dSHubert Mazur .clk_def.full_dd.div1.i_shift = _div1_shift, \ 74f21c469dSHubert Mazur .clk_def.full_dd.div1.i_width = 0x3, \ 75f21c469dSHubert Mazur .clk_def.full_dd.div1.f_shift = 0x0, \ 76f21c469dSHubert Mazur .clk_def.full_dd.div1.f_width = 0x0, \ 77f21c469dSHubert Mazur .clk_def.full_dd.div1.div_flags = 0x0, \ 78f21c469dSHubert Mazur .clk_def.full_dd.div1.div_table = NULL, \ 79f21c469dSHubert Mazur .clk_def.full_dd.div2.clkdef.name = _div2_name, \ 80f21c469dSHubert Mazur .clk_def.full_dd.div2.offset = _div2_reg, \ 81f21c469dSHubert Mazur .clk_def.full_dd.div2.i_shift = _div2_shift, \ 82f21c469dSHubert Mazur .clk_def.full_dd.div2.i_width = 0x3, \ 83f21c469dSHubert Mazur .clk_def.full_dd.div2.f_shift = 0x0, \ 84f21c469dSHubert Mazur .clk_def.full_dd.div2.f_width = 0x0, \ 85f21c469dSHubert Mazur .clk_def.full_dd.div2.div_flags = 0x0, \ 86f21c469dSHubert Mazur .clk_def.full_dd.div2.div_table = NULL, \ 87f21c469dSHubert Mazur .clk_def.full_dd.clk_mux.clkdef.name = _clk_mux_name, \ 88f21c469dSHubert Mazur .clk_def.full_dd.clk_mux.offset = CLK_SEL, \ 89f21c469dSHubert Mazur .clk_def.full_dd.clk_mux.shift = _clk_mux_shift, \ 90f21c469dSHubert Mazur .clk_def.full_dd.clk_mux.width = 0x1, \ 91f21c469dSHubert Mazur .clk_def.full_dd.clk_mux.mux_flags = 0x0, \ 92f21c469dSHubert Mazur .clk_def.full_dd.gate.clkdef.name = _name, \ 93f21c469dSHubert Mazur .clk_def.full_dd.gate.offset = CLK_DIS, \ 94f21c469dSHubert Mazur .clk_def.full_dd.gate.shift = _gate_shift, \ 95f21c469dSHubert Mazur .clk_def.full_dd.gate.on_value = 0, \ 96f21c469dSHubert Mazur .clk_def.full_dd.gate.off_value = 1, \ 97f21c469dSHubert Mazur .clk_def.full_dd.gate.mask = 0x1, \ 98f21c469dSHubert Mazur .clk_def.full_dd.gate.gate_flags = 0x0 \ 99f21c469dSHubert Mazur } 100f21c469dSHubert Mazur 101f21c469dSHubert Mazur #define CLK_FULL(_name, _id, _gate_shift, _tbg_mux_shift, \ 102f21c469dSHubert Mazur _clk_mux_shift, _div1_reg, _div1_shift, _div_table, _tbg_mux_name, \ 103f21c469dSHubert Mazur _div1_name, _clk_mux_name) \ 104f21c469dSHubert Mazur { \ 105f21c469dSHubert Mazur .type = CLK_FULL, \ 106f21c469dSHubert Mazur .common_def.device_name = _name, \ 107f21c469dSHubert Mazur .common_def.device_id = _id, \ 108f21c469dSHubert Mazur .clk_def.full_d.tbg_mux.clkdef.name = _tbg_mux_name, \ 109f21c469dSHubert Mazur .clk_def.full_d.tbg_mux.offset = TBG_SEL, \ 110f21c469dSHubert Mazur .clk_def.full_d.tbg_mux.shift = _tbg_mux_shift, \ 111f21c469dSHubert Mazur .clk_def.full_d.tbg_mux.width = 0x2, \ 112f21c469dSHubert Mazur .clk_def.full_d.tbg_mux.mux_flags = 0x0, \ 113f21c469dSHubert Mazur .clk_def.full_d.div.clkdef.name = _div1_name, \ 114f21c469dSHubert Mazur .clk_def.full_d.div.offset = _div1_reg, \ 115f21c469dSHubert Mazur .clk_def.full_d.div.i_shift = _div1_shift, \ 116f21c469dSHubert Mazur .clk_def.full_d.div.i_width = 0x3, \ 117f21c469dSHubert Mazur .clk_def.full_d.div.f_shift = 0x0, \ 118f21c469dSHubert Mazur .clk_def.full_d.div.f_width = 0x0, \ 119f21c469dSHubert Mazur .clk_def.full_d.div.div_flags = 0x0, \ 120f21c469dSHubert Mazur .clk_def.full_d.div.div_table = _div_table, \ 121f21c469dSHubert Mazur .clk_def.full_d.clk_mux.clkdef.name = _clk_mux_name, \ 122f21c469dSHubert Mazur .clk_def.full_d.clk_mux.offset = CLK_SEL, \ 123f21c469dSHubert Mazur .clk_def.full_d.clk_mux.shift = _clk_mux_shift, \ 124f21c469dSHubert Mazur .clk_def.full_d.clk_mux.width = 0x1, \ 125f21c469dSHubert Mazur .clk_def.full_d.clk_mux.mux_flags = 0x0, \ 126f21c469dSHubert Mazur .clk_def.full_d.gate.clkdef.name = _name, \ 127f21c469dSHubert Mazur .clk_def.full_d.gate.offset = CLK_DIS, \ 128f21c469dSHubert Mazur .clk_def.full_d.gate.shift = _gate_shift, \ 129f21c469dSHubert Mazur .clk_def.full_d.gate.on_value = 0, \ 130f21c469dSHubert Mazur .clk_def.full_d.gate.off_value = 1, \ 131f21c469dSHubert Mazur .clk_def.full_d.gate.mask = 0x1, \ 132f21c469dSHubert Mazur .clk_def.full_d.gate.gate_flags = 0x0 \ 133f21c469dSHubert Mazur } 134f21c469dSHubert Mazur 135f21c469dSHubert Mazur #define CLK_CPU(_name, _id, _tbg_mux_shift, _clk_mux_shift, _div1_reg, \ 136f21c469dSHubert Mazur _div1_shift, _div_table, _tbg_mux_name, _div1_name) \ 137f21c469dSHubert Mazur { \ 138f21c469dSHubert Mazur .type = CLK_CPU, \ 139f21c469dSHubert Mazur .common_def.device_name = _name, \ 140f21c469dSHubert Mazur .common_def.device_id = _id, \ 141f21c469dSHubert Mazur .clk_def.cpu.tbg_mux.clkdef.name = _tbg_mux_name, \ 142f21c469dSHubert Mazur .clk_def.cpu.tbg_mux.offset = TBG_SEL, \ 143f21c469dSHubert Mazur .clk_def.cpu.tbg_mux.shift = _tbg_mux_shift, \ 144f21c469dSHubert Mazur .clk_def.cpu.tbg_mux.width = 0x2, \ 145f21c469dSHubert Mazur .clk_def.cpu.tbg_mux.mux_flags = 0x0, \ 146f21c469dSHubert Mazur .clk_def.cpu.div.clkdef.name = _div1_name, \ 147f21c469dSHubert Mazur .clk_def.cpu.div.offset = _div1_reg, \ 148f21c469dSHubert Mazur .clk_def.cpu.div.i_shift = _div1_shift, \ 149f21c469dSHubert Mazur .clk_def.cpu.div.i_width = 0x3, \ 150f21c469dSHubert Mazur .clk_def.cpu.div.f_shift = 0x0, \ 151f21c469dSHubert Mazur .clk_def.cpu.div.f_width = 0x0, \ 152f21c469dSHubert Mazur .clk_def.cpu.div.div_flags = 0x0, \ 153f21c469dSHubert Mazur .clk_def.cpu.div.div_table = _div_table, \ 154f21c469dSHubert Mazur .clk_def.cpu.clk_mux.clkdef.name = _name, \ 155f21c469dSHubert Mazur .clk_def.cpu.clk_mux.offset = CLK_SEL, \ 156f21c469dSHubert Mazur .clk_def.cpu.clk_mux.shift = _clk_mux_shift, \ 157f21c469dSHubert Mazur .clk_def.cpu.clk_mux.width = 0x1, \ 158f21c469dSHubert Mazur .clk_def.cpu.clk_mux.mux_flags = 0x0, \ 159f21c469dSHubert Mazur } 160f21c469dSHubert Mazur 161f21c469dSHubert Mazur #define CLK_GATE(_name, _id, _gate_shift, _pname) \ 162f21c469dSHubert Mazur { \ 163f21c469dSHubert Mazur .type = CLK_GATE, \ 164f21c469dSHubert Mazur .common_def.device_name = _name, \ 165f21c469dSHubert Mazur .common_def.device_id = _id, \ 166f21c469dSHubert Mazur .common_def.pname = _pname, \ 167f21c469dSHubert Mazur .clk_def.gate.gate.clkdef.name = _name, \ 168f21c469dSHubert Mazur .clk_def.gate.gate.clkdef.parent_cnt = 1, \ 169f21c469dSHubert Mazur .clk_def.gate.gate.offset = CLK_DIS, \ 170f21c469dSHubert Mazur .clk_def.gate.gate.shift = _gate_shift, \ 171f21c469dSHubert Mazur .clk_def.gate.gate.on_value = 0, \ 172f21c469dSHubert Mazur .clk_def.gate.gate.off_value = 1, \ 173f21c469dSHubert Mazur .clk_def.gate.gate.mask = 0x1, \ 174f21c469dSHubert Mazur .clk_def.gate.gate.gate_flags = 0x0 \ 175f21c469dSHubert Mazur } 176f21c469dSHubert Mazur 177f21c469dSHubert Mazur #define CLK_MDD(_name, _id, _tbg_mux_shift, _clk_mux_shift, _div1_reg, \ 178f21c469dSHubert Mazur _div2_reg, _div1_shift, _div2_shift, _tbg_mux_name, _div1_name, \ 179f21c469dSHubert Mazur _div2_name) \ 180f21c469dSHubert Mazur { \ 181f21c469dSHubert Mazur .type = CLK_MDD, \ 182f21c469dSHubert Mazur .common_def.device_name = _name, \ 183f21c469dSHubert Mazur .common_def.device_id = _id, \ 184f21c469dSHubert Mazur .clk_def.mdd.tbg_mux.clkdef.name = _tbg_mux_name, \ 185f21c469dSHubert Mazur .clk_def.mdd.tbg_mux.offset = TBG_SEL, \ 186f21c469dSHubert Mazur .clk_def.mdd.tbg_mux.shift = _tbg_mux_shift, \ 187f21c469dSHubert Mazur .clk_def.mdd.tbg_mux.width = 0x2, \ 188f21c469dSHubert Mazur .clk_def.mdd.tbg_mux.mux_flags = 0x0, \ 189f21c469dSHubert Mazur .clk_def.mdd.div1.clkdef.name = _div1_name, \ 190f21c469dSHubert Mazur .clk_def.mdd.div1.offset = _div1_reg, \ 191f21c469dSHubert Mazur .clk_def.mdd.div1.i_shift = _div1_shift, \ 192f21c469dSHubert Mazur .clk_def.mdd.div1.i_width = 0x3, \ 193f21c469dSHubert Mazur .clk_def.mdd.div1.f_shift = 0x0, \ 194f21c469dSHubert Mazur .clk_def.mdd.div1.f_width = 0x0, \ 195f21c469dSHubert Mazur .clk_def.mdd.div1.div_flags = 0x0, \ 196f21c469dSHubert Mazur .clk_def.mdd.div1.div_table = NULL, \ 197f21c469dSHubert Mazur .clk_def.mdd.div2.clkdef.name = _div2_name, \ 198f21c469dSHubert Mazur .clk_def.mdd.div2.offset = _div2_reg, \ 199f21c469dSHubert Mazur .clk_def.mdd.div2.i_shift = _div2_shift, \ 200f21c469dSHubert Mazur .clk_def.mdd.div2.i_width = 0x3, \ 201f21c469dSHubert Mazur .clk_def.mdd.div2.f_shift = 0x0, \ 202f21c469dSHubert Mazur .clk_def.mdd.div2.f_width = 0x0, \ 203f21c469dSHubert Mazur .clk_def.mdd.div2.div_flags = 0x0, \ 204f21c469dSHubert Mazur .clk_def.mdd.div2.div_table = NULL, \ 205f21c469dSHubert Mazur .clk_def.mdd.clk_mux.clkdef.name = _name, \ 206f21c469dSHubert Mazur .clk_def.mdd.clk_mux.offset = CLK_SEL, \ 207f21c469dSHubert Mazur .clk_def.mdd.clk_mux.shift = _clk_mux_shift, \ 208f21c469dSHubert Mazur .clk_def.mdd.clk_mux.width = 0x1, \ 209f21c469dSHubert Mazur .clk_def.mdd.clk_mux.mux_flags = 0x0 \ 210f21c469dSHubert Mazur } 211f21c469dSHubert Mazur 212f21c469dSHubert Mazur #define CLK_MUX_GATE(_name, _id, _gate_shift, _mux_shift, _pname, \ 213f21c469dSHubert Mazur _mux_name, _fixed_name) \ 214f21c469dSHubert Mazur { \ 215f21c469dSHubert Mazur .type = CLK_MUX_GATE, \ 216f21c469dSHubert Mazur .common_def.device_name = _name, \ 217f21c469dSHubert Mazur .common_def.device_id = _id, \ 218f21c469dSHubert Mazur .common_def.pname = _pname, \ 219f21c469dSHubert Mazur .clk_def.mux_gate.mux.clkdef.name = _mux_name, \ 220f21c469dSHubert Mazur .clk_def.mux_gate.mux.offset = TBG_SEL, \ 221f21c469dSHubert Mazur .clk_def.mux_gate.mux.shift = _mux_shift, \ 222f21c469dSHubert Mazur .clk_def.mux_gate.mux.width = 0x1, \ 223f21c469dSHubert Mazur .clk_def.mux_gate.mux.mux_flags = 0x0, \ 224f21c469dSHubert Mazur .clk_def.mux_gate.gate.clkdef.name = _name, \ 225f21c469dSHubert Mazur .clk_def.mux_gate.gate.offset = CLK_DIS, \ 226f21c469dSHubert Mazur .clk_def.mux_gate.gate.shift = _gate_shift, \ 227f21c469dSHubert Mazur .clk_def.mux_gate.gate.on_value = 0, \ 228f21c469dSHubert Mazur .clk_def.mux_gate.gate.off_value = 1, \ 229f21c469dSHubert Mazur .clk_def.mux_gate.gate.mask = 0x1, \ 230f21c469dSHubert Mazur .clk_def.mux_gate.gate.gate_flags = 0x0, \ 231f21c469dSHubert Mazur .clk_def.mux_gate.fixed.clkdef.name = _fixed_name \ 232f21c469dSHubert Mazur } 233f21c469dSHubert Mazur 234f21c469dSHubert Mazur #define CLK_MUX_GATE_FIXED(_name, _id, _gate_shift, _mux_shift, \ 235f21c469dSHubert Mazur _mux_name, _gate_name, _fixed1_name) \ 236f21c469dSHubert Mazur { \ 237f21c469dSHubert Mazur .type = CLK_MUX_GATE_FIXED, \ 238f21c469dSHubert Mazur .common_def.device_name = _name, \ 239f21c469dSHubert Mazur .common_def.device_id = _id, \ 240f21c469dSHubert Mazur .clk_def.mux_gate_fixed.mux.clkdef.name = _mux_name, \ 241f21c469dSHubert Mazur .clk_def.mux_gate_fixed.mux.offset = TBG_SEL, \ 242f21c469dSHubert Mazur .clk_def.mux_gate_fixed.mux.shift = _mux_shift, \ 243f21c469dSHubert Mazur .clk_def.mux_gate_fixed.mux.width = 0x1, \ 244f21c469dSHubert Mazur .clk_def.mux_gate_fixed.mux.mux_flags = 0x0, \ 245f21c469dSHubert Mazur .clk_def.mux_gate_fixed.gate.clkdef.name = _gate_name, \ 246f21c469dSHubert Mazur .clk_def.mux_gate_fixed.gate.offset = CLK_DIS, \ 247f21c469dSHubert Mazur .clk_def.mux_gate_fixed.gate.shift = _gate_shift, \ 248f21c469dSHubert Mazur .clk_def.mux_gate_fixed.gate.on_value = 0, \ 249f21c469dSHubert Mazur .clk_def.mux_gate_fixed.gate.off_value = 1, \ 250f21c469dSHubert Mazur .clk_def.mux_gate_fixed.gate.mask = 0x1, \ 251f21c469dSHubert Mazur .clk_def.mux_gate_fixed.gate.gate_flags = 0x0, \ 252f21c469dSHubert Mazur .clk_def.mux_gate_fixed.fixed1.clkdef.name = _fixed1_name, \ 253f21c469dSHubert Mazur .clk_def.mux_gate_fixed.fixed2.clkdef.name = _name \ 254f21c469dSHubert Mazur } 255f21c469dSHubert Mazur 256f21c469dSHubert Mazur #define CLK_FIXED(_name, _id, _gate_shift, _mux_shift, _mux_name, \ 257f21c469dSHubert Mazur _fixed_name) \ 258f21c469dSHubert Mazur { \ 259f21c469dSHubert Mazur .type = CLK_FIXED, \ 260f21c469dSHubert Mazur .common_def.device_name = _name, \ 261f21c469dSHubert Mazur .common_def.device_id = _id, \ 262f21c469dSHubert Mazur .clk_def.fixed.mux.clkdef.name = _mux_name, \ 263f21c469dSHubert Mazur .clk_def.fixed.mux.offset = TBG_SEL, \ 264f21c469dSHubert Mazur .clk_def.fixed.mux.shift = _mux_shift, \ 265f21c469dSHubert Mazur .clk_def.fixed.mux.width = 0x1, \ 266f21c469dSHubert Mazur .clk_def.fixed.mux.mux_flags = 0x0, \ 267f21c469dSHubert Mazur .clk_def.fixed.gate.clkdef.name = _name, \ 268f21c469dSHubert Mazur .clk_def.fixed.gate.offset = CLK_DIS, \ 269f21c469dSHubert Mazur .clk_def.fixed.gate.shift = _gate_shift, \ 270f21c469dSHubert Mazur .clk_def.fixed.gate.on_value = 0, \ 271f21c469dSHubert Mazur .clk_def.fixed.gate.off_value = 1, \ 272f21c469dSHubert Mazur .clk_def.fixed.gate.mask = 0x1, \ 273f21c469dSHubert Mazur .clk_def.fixed.gate.gate_flags = 0x0, \ 274f21c469dSHubert Mazur .clk_def.fixed.fixed.clkdef.name = _fixed_name \ 275f21c469dSHubert Mazur } 276f21c469dSHubert Mazur 277f21c469dSHubert Mazur struct a37x0_periph_clk_softc { 278f21c469dSHubert Mazur device_t dev; 279f21c469dSHubert Mazur struct resource *res; 280f21c469dSHubert Mazur struct clkdom *clkdom; 281f21c469dSHubert Mazur struct mtx mtx; 282f21c469dSHubert Mazur struct a37x0_periph_clknode_def *devices; 283f21c469dSHubert Mazur int device_count; 284f21c469dSHubert Mazur }; 285f21c469dSHubert Mazur 286f21c469dSHubert Mazur struct a37x0_periph_clk_dd_def { 287f21c469dSHubert Mazur struct clk_mux_def tbg_mux; 288f21c469dSHubert Mazur struct clk_div_def div1; 289f21c469dSHubert Mazur struct clk_div_def div2; 290f21c469dSHubert Mazur struct clk_mux_def clk_mux; 291f21c469dSHubert Mazur struct clk_gate_def gate; 292f21c469dSHubert Mazur }; 293f21c469dSHubert Mazur 294f21c469dSHubert Mazur struct a37x0_periph_clk_cpu_def { 295f21c469dSHubert Mazur struct clk_mux_def tbg_mux; 296f21c469dSHubert Mazur struct clk_div_def div; 297f21c469dSHubert Mazur struct clk_mux_def clk_mux; 298f21c469dSHubert Mazur }; 299f21c469dSHubert Mazur 300f21c469dSHubert Mazur struct a37x0_periph_clk_d_def { 301f21c469dSHubert Mazur struct clk_mux_def tbg_mux; 302f21c469dSHubert Mazur struct clk_div_def div; 303f21c469dSHubert Mazur struct clk_mux_def clk_mux; 304f21c469dSHubert Mazur struct clk_gate_def gate; 305f21c469dSHubert Mazur }; 306f21c469dSHubert Mazur 307f21c469dSHubert Mazur struct a37x0_periph_clk_fixed_def { 308f21c469dSHubert Mazur struct clk_mux_def mux; 309f21c469dSHubert Mazur struct clk_fixed_def fixed; 310f21c469dSHubert Mazur struct clk_gate_def gate; 311f21c469dSHubert Mazur }; 312f21c469dSHubert Mazur 313f21c469dSHubert Mazur struct a37x0_periph_clk_gate_def { 314f21c469dSHubert Mazur struct clk_gate_def gate; 315f21c469dSHubert Mazur }; 316f21c469dSHubert Mazur 317f21c469dSHubert Mazur struct a37x0_periph_clk_mux_dd_def { 318f21c469dSHubert Mazur struct clk_mux_def tbg_mux; 319f21c469dSHubert Mazur struct clk_div_def div1; 320f21c469dSHubert Mazur struct clk_div_def div2; 321f21c469dSHubert Mazur struct clk_mux_def clk_mux; 322f21c469dSHubert Mazur }; 323f21c469dSHubert Mazur 324f21c469dSHubert Mazur struct a37x0_periph_clk_mux_div_def { 325f21c469dSHubert Mazur struct clk_mux_def mux; 326f21c469dSHubert Mazur struct clk_div_def div; 327f21c469dSHubert Mazur }; 328f21c469dSHubert Mazur 329f21c469dSHubert Mazur struct a37x0_periph_clk_mux_gate_def { 330f21c469dSHubert Mazur struct clk_mux_def mux; 331f21c469dSHubert Mazur struct clk_fixed_def fixed; 332f21c469dSHubert Mazur struct clk_gate_def gate; 333f21c469dSHubert Mazur }; 334f21c469dSHubert Mazur 335f21c469dSHubert Mazur struct a37x0_periph_clk_mux_gate_fixed_def { 336f21c469dSHubert Mazur struct clk_fixed_def fixed1; 337f21c469dSHubert Mazur struct clk_mux_def mux; 338f21c469dSHubert Mazur struct clk_gate_def gate; 339f21c469dSHubert Mazur struct clk_fixed_def fixed2; 340f21c469dSHubert Mazur }; 341f21c469dSHubert Mazur 342f21c469dSHubert Mazur enum a37x0_periph_clk_type { 343f21c469dSHubert Mazur /* Double divider clock */ 344f21c469dSHubert Mazur CLK_FULL_DD, 345f21c469dSHubert Mazur /* Single divider clock */ 346f21c469dSHubert Mazur CLK_FULL, 347f21c469dSHubert Mazur /* Gate clock */ 348f21c469dSHubert Mazur CLK_GATE, 349f21c469dSHubert Mazur /* Mux, gate clock */ 350f21c469dSHubert Mazur CLK_MUX_GATE, 351f21c469dSHubert Mazur /* CPU clock */ 352f21c469dSHubert Mazur CLK_CPU, 353f21c469dSHubert Mazur /* Clock with fixed frequency divider */ 354f21c469dSHubert Mazur CLK_FIXED, 355f21c469dSHubert Mazur /* Clock with double divider, without gate */ 356f21c469dSHubert Mazur CLK_MDD, 357f21c469dSHubert Mazur /* Clock with two fixed frequency dividers */ 358f21c469dSHubert Mazur CLK_MUX_GATE_FIXED 359f21c469dSHubert Mazur }; 360f21c469dSHubert Mazur 361f21c469dSHubert Mazur struct a37x0_periph_common_defs { 362f21c469dSHubert Mazur char *device_name; 363f21c469dSHubert Mazur int device_id; 364f21c469dSHubert Mazur int tbg_cnt; 365f21c469dSHubert Mazur const char *pname; 366f21c469dSHubert Mazur const char **tbgs; 367f21c469dSHubert Mazur const char *xtal; 368f21c469dSHubert Mazur }; 369f21c469dSHubert Mazur 370f21c469dSHubert Mazur union a37x0_periph_clocks_defs { 371f21c469dSHubert Mazur struct a37x0_periph_clk_dd_def full_dd; 372f21c469dSHubert Mazur struct a37x0_periph_clk_d_def full_d; 373f21c469dSHubert Mazur struct a37x0_periph_clk_gate_def gate; 374f21c469dSHubert Mazur struct a37x0_periph_clk_mux_gate_def mux_gate; 375f21c469dSHubert Mazur struct a37x0_periph_clk_cpu_def cpu; 376f21c469dSHubert Mazur struct a37x0_periph_clk_fixed_def fixed; 377f21c469dSHubert Mazur struct a37x0_periph_clk_mux_dd_def mdd; 378f21c469dSHubert Mazur struct a37x0_periph_clk_mux_gate_fixed_def mux_gate_fixed; 379f21c469dSHubert Mazur }; 380f21c469dSHubert Mazur 381f21c469dSHubert Mazur struct a37x0_periph_clknode_def { 382f21c469dSHubert Mazur enum a37x0_periph_clk_type type; 383f21c469dSHubert Mazur struct a37x0_periph_common_defs common_def; 384f21c469dSHubert Mazur union a37x0_periph_clocks_defs clk_def; 385f21c469dSHubert Mazur }; 386f21c469dSHubert Mazur 387f21c469dSHubert Mazur int a37x0_periph_create_mux(struct clkdom *, 388f21c469dSHubert Mazur struct clk_mux_def *, int); 389f21c469dSHubert Mazur int a37x0_periph_create_div(struct clkdom *, 390f21c469dSHubert Mazur struct clk_div_def *, int); 391f21c469dSHubert Mazur int a37x0_periph_create_gate(struct clkdom *, 392f21c469dSHubert Mazur struct clk_gate_def *, int); 393f21c469dSHubert Mazur void a37x0_periph_set_props(struct clknode_init_def *, const char **, 394f21c469dSHubert Mazur unsigned int); 395f21c469dSHubert Mazur int a37x0_periph_d_register_full_clk_dd(struct clkdom *, 396f21c469dSHubert Mazur struct a37x0_periph_clknode_def *); 397f21c469dSHubert Mazur int a37x0_periph_d_register_full_clk(struct clkdom *, 398f21c469dSHubert Mazur struct a37x0_periph_clknode_def *); 399f21c469dSHubert Mazur int a37x0_periph_d_register_periph_cpu(struct clkdom *, 400f21c469dSHubert Mazur struct a37x0_periph_clknode_def *); 401f21c469dSHubert Mazur int a37x0_periph_fixed_register_fixed(struct clkdom*, 402f21c469dSHubert Mazur struct a37x0_periph_clknode_def *); 403f21c469dSHubert Mazur int a37x0_periph_gate_register_gate(struct clkdom *, 404f21c469dSHubert Mazur struct a37x0_periph_clknode_def *); 405f21c469dSHubert Mazur int a37x0_periph_d_register_mdd(struct clkdom *, 406f21c469dSHubert Mazur struct a37x0_periph_clknode_def *); 407f21c469dSHubert Mazur int a37x0_periph_d_register_mux_div_clk(struct clkdom *, 408f21c469dSHubert Mazur struct a37x0_periph_clknode_def *); 409f21c469dSHubert Mazur int a37x0_periph_register_mux_gate(struct clkdom *, 410f21c469dSHubert Mazur struct a37x0_periph_clknode_def *); 411f21c469dSHubert Mazur int a37x0_periph_register_mux_gate_fixed(struct clkdom *, 412f21c469dSHubert Mazur struct a37x0_periph_clknode_def *); 413f21c469dSHubert Mazur 414f21c469dSHubert Mazur int a37x0_periph_clk_read_4(device_t, bus_addr_t, uint32_t *); 415f21c469dSHubert Mazur void a37x0_periph_clk_device_unlock(device_t); 416f21c469dSHubert Mazur void a37x0_periph_clk_device_lock(device_t); 417f21c469dSHubert Mazur int a37x0_periph_clk_attach(device_t); 418f21c469dSHubert Mazur int a37x0_periph_clk_detach(device_t); 419f21c469dSHubert Mazur 420f21c469dSHubert Mazur #endif 421