Home | History | Annotate | Line # | Download | only in nxp
imx6_ccm.c revision 1.1
      1  1.1  skrll /*	$NetBSD: imx6_ccm.c,v 1.1 2020/12/23 14:42:38 skrll Exp $	*/
      2  1.1  skrll 
      3  1.1  skrll /*
      4  1.1  skrll  * Copyright (c) 2010-2012, 2014  Genetec Corporation.  All rights reserved.
      5  1.1  skrll  * Written by Hashimoto Kenichi for Genetec Corporation.
      6  1.1  skrll  *
      7  1.1  skrll  * Redistribution and use in source and binary forms, with or without
      8  1.1  skrll  * modification, are permitted provided that the following conditions
      9  1.1  skrll  * are met:
     10  1.1  skrll  * 1. Redistributions of source code must retain the above copyright
     11  1.1  skrll  *    notice, this list of conditions and the following disclaimer.
     12  1.1  skrll  * 2. Redistributions in binary form must reproduce the above copyright
     13  1.1  skrll  *    notice, this list of conditions and the following disclaimer in the
     14  1.1  skrll  *    documentation and/or other materials provided with the distribution.
     15  1.1  skrll  *
     16  1.1  skrll  * THIS SOFTWARE IS PROVIDED BY GENETEC CORPORATION ``AS IS'' AND
     17  1.1  skrll  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     18  1.1  skrll  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     19  1.1  skrll  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GENETEC CORPORATION
     20  1.1  skrll  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     21  1.1  skrll  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     22  1.1  skrll  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     23  1.1  skrll  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     24  1.1  skrll  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     25  1.1  skrll  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     26  1.1  skrll  * POSSIBILITY OF SUCH DAMAGE.
     27  1.1  skrll  */
     28  1.1  skrll /*
     29  1.1  skrll  * Clock Controller Module (CCM) for i.MX6
     30  1.1  skrll  */
     31  1.1  skrll 
     32  1.1  skrll #include <sys/cdefs.h>
     33  1.1  skrll __KERNEL_RCSID(0, "$NetBSD: imx6_ccm.c,v 1.1 2020/12/23 14:42:38 skrll Exp $");
     34  1.1  skrll 
     35  1.1  skrll #include "opt_imx.h"
     36  1.1  skrll #include "opt_cputypes.h"
     37  1.1  skrll 
     38  1.1  skrll #include "locators.h"
     39  1.1  skrll 
     40  1.1  skrll #include <sys/types.h>
     41  1.1  skrll #include <sys/time.h>
     42  1.1  skrll #include <sys/bus.h>
     43  1.1  skrll #include <sys/device.h>
     44  1.1  skrll #include <sys/sysctl.h>
     45  1.1  skrll #include <sys/cpufreq.h>
     46  1.1  skrll #include <sys/malloc.h>
     47  1.1  skrll #include <sys/param.h>
     48  1.1  skrll 
     49  1.1  skrll #include <machine/cpu.h>
     50  1.1  skrll 
     51  1.1  skrll #include <arm/nxp/imx6_ccmvar.h>
     52  1.1  skrll #include <arm/nxp/imx6_ccmreg.h>
     53  1.1  skrll 
     54  1.1  skrll #include <dev/clk/clk_backend.h>
     55  1.1  skrll 
     56  1.1  skrll /* Clock Parents Tables */
     57  1.1  skrll static const char *step_p[] = {
     58  1.1  skrll 	"osc",
     59  1.1  skrll 	"pll2_pfd2_396m"
     60  1.1  skrll };
     61  1.1  skrll 
     62  1.1  skrll static const char *pll1_sw_p[] = {
     63  1.1  skrll 	"pll1_sys",
     64  1.1  skrll 	"step"
     65  1.1  skrll };
     66  1.1  skrll 
     67  1.1  skrll static const char *periph_pre_p[] = {
     68  1.1  skrll 	"pll2_bus",
     69  1.1  skrll 	"pll2_pfd2_396m",
     70  1.1  skrll 	"pll2_pfd0_352m",
     71  1.1  skrll 	"pll2_198m"
     72  1.1  skrll };
     73  1.1  skrll 
     74  1.1  skrll static const char *periph_clk2_p[] = {
     75  1.1  skrll 	"pll3_usb_otg",
     76  1.1  skrll 	"osc",
     77  1.1  skrll 	"osc",
     78  1.1  skrll 	"dummy"
     79  1.1  skrll };
     80  1.1  skrll 
     81  1.1  skrll static const char *periph2_clk2_p[] = {
     82  1.1  skrll 	"pll3_usb_otg",
     83  1.1  skrll 	"pll2_bus"
     84  1.1  skrll };
     85  1.1  skrll 
     86  1.1  skrll static const char *axi_p[] = {
     87  1.1  skrll 	"periph",
     88  1.1  skrll 	"pll2_pfd2_396m",
     89  1.1  skrll 	"periph",
     90  1.1  skrll 	"pll3_pfd1_540m"
     91  1.1  skrll };
     92  1.1  skrll 
     93  1.1  skrll static const char *audio_p[] = {
     94  1.1  skrll 	"pll4_audio_div",
     95  1.1  skrll 	"pll3_pfd2_508m",
     96  1.1  skrll 	"pll3_pfd3_454m",
     97  1.1  skrll 	"pll3_usb_otg"
     98  1.1  skrll };
     99  1.1  skrll 
    100  1.1  skrll static const char *gpu2d_core_p[] = {
    101  1.1  skrll 	"axi",
    102  1.1  skrll 	"pll3_usb_otg",
    103  1.1  skrll 	"pll2_pfd0_352m",
    104  1.1  skrll 	"pll2_pfd2_396m"
    105  1.1  skrll };
    106  1.1  skrll 
    107  1.1  skrll static const char *gpu3d_core_p[] = {
    108  1.1  skrll 	"mmdc_ch0_axi",
    109  1.1  skrll 	"pll3_usb_otg",
    110  1.1  skrll 	"pll2_pfd1_594m",
    111  1.1  skrll 	"pll2_pfd2_396m"
    112  1.1  skrll };
    113  1.1  skrll 
    114  1.1  skrll static const char *gpu3d_shader_p[] = {
    115  1.1  skrll 	"mmdc_ch0_axi",
    116  1.1  skrll 	"pll3_usb_otg",
    117  1.1  skrll 	"pll2_pfd1_594m",
    118  1.1  skrll 	"pll3_pfd0_720m"
    119  1.1  skrll };
    120  1.1  skrll 
    121  1.1  skrll static const char *ipu_p[] = {
    122  1.1  skrll 	"mmdc_ch0_axi",
    123  1.1  skrll 	"pll2_pfd2_396m",
    124  1.1  skrll 	"pll3_120m",
    125  1.1  skrll 	"pll3_pfd1_540m"
    126  1.1  skrll };
    127  1.1  skrll 
    128  1.1  skrll static const char *pll_bypass_src_p[] = {
    129  1.1  skrll 	"osc",
    130  1.1  skrll 	"lvds1_in",
    131  1.1  skrll 	"lvds2_in",
    132  1.1  skrll 	"dummy"
    133  1.1  skrll };
    134  1.1  skrll 
    135  1.1  skrll static const char *pll1_bypass_p[] = {
    136  1.1  skrll 	"pll1",
    137  1.1  skrll 	"pll1_bypass_src"
    138  1.1  skrll };
    139  1.1  skrll 
    140  1.1  skrll static const char *pll2_bypass_p[] = {
    141  1.1  skrll 	"pll2",
    142  1.1  skrll 	"pll2_bypass_src"
    143  1.1  skrll };
    144  1.1  skrll 
    145  1.1  skrll static const char *pll3_bypass_p[] = {
    146  1.1  skrll 	"pll3",
    147  1.1  skrll 	"pll3_bypass_src"
    148  1.1  skrll };
    149  1.1  skrll 
    150  1.1  skrll static const char *pll4_bypass_p[] = {
    151  1.1  skrll 	"pll4",
    152  1.1  skrll 	"pll4_bypass_src"
    153  1.1  skrll };
    154  1.1  skrll 
    155  1.1  skrll static const char *pll5_bypass_p[] = {
    156  1.1  skrll 	"pll5",
    157  1.1  skrll 	"pll5_bypass_src"
    158  1.1  skrll };
    159  1.1  skrll 
    160  1.1  skrll static const char *pll6_bypass_p[] = {
    161  1.1  skrll 	"pll6",
    162  1.1  skrll 	"pll6_bypass_src"
    163  1.1  skrll };
    164  1.1  skrll 
    165  1.1  skrll static const char *pll7_bypass_p[] = {
    166  1.1  skrll 	"pll7",
    167  1.1  skrll 	"pll7_bypass_src"
    168  1.1  skrll };
    169  1.1  skrll 
    170  1.1  skrll static const char *ipu_di_pre_p[] = {
    171  1.1  skrll 	"mmdc_ch0_axi",
    172  1.1  skrll 	"pll3_usb_otg",
    173  1.1  skrll 	"pll5_video_div",
    174  1.1  skrll 	"pll2_pfd0_352m",
    175  1.1  skrll 	"pll2_pfd2_396m",
    176  1.1  skrll 	"pll3_pfd1_540m"
    177  1.1  skrll };
    178  1.1  skrll 
    179  1.1  skrll static const char *ipu1_di0_p[] = {
    180  1.1  skrll 	"ipu1_di0_pre",
    181  1.1  skrll 	"dummy",
    182  1.1  skrll 	"dummy",
    183  1.1  skrll 	"ldb_di0",
    184  1.1  skrll 	"ldb_di1"
    185  1.1  skrll };
    186  1.1  skrll 
    187  1.1  skrll static const char *ipu1_di1_p[] = {
    188  1.1  skrll 	"ipu1_di1_pre",
    189  1.1  skrll 	"dummy",
    190  1.1  skrll 	"dummy",
    191  1.1  skrll 	"ldb_di0",
    192  1.1  skrll 	"ldb_di1"
    193  1.1  skrll };
    194  1.1  skrll 
    195  1.1  skrll static const char *ipu2_di0_p[] = {
    196  1.1  skrll 	"ipu2_di0_pre",
    197  1.1  skrll 	"dummy",
    198  1.1  skrll 	"dummy",
    199  1.1  skrll 	"ldb_di0",
    200  1.1  skrll 	"ldb_di1"
    201  1.1  skrll };
    202  1.1  skrll 
    203  1.1  skrll static const char *ipu2_di1_p[] = {
    204  1.1  skrll 	"ipu2_di1_pre",
    205  1.1  skrll 	"dummy",
    206  1.1  skrll 	"dummy",
    207  1.1  skrll 	"ldb_di0",
    208  1.1  skrll 	"ldb_di1"
    209  1.1  skrll };
    210  1.1  skrll 
    211  1.1  skrll static const char *ldb_di_p[] = {
    212  1.1  skrll 	"pll5_video_div",
    213  1.1  skrll 	"pll2_pfd0_352m",
    214  1.1  skrll 	"pll2_pfd2_396m",
    215  1.1  skrll 	"mmdc_ch1_axi",
    216  1.1  skrll 	"pll3_usb_otg"
    217  1.1  skrll };
    218  1.1  skrll 
    219  1.1  skrll static const char *periph_p[] = {
    220  1.1  skrll 	"periph_pre",
    221  1.1  skrll 	"periph_clk2"
    222  1.1  skrll };
    223  1.1  skrll 
    224  1.1  skrll static const char *periph2_p[] = {
    225  1.1  skrll 	"periph2_pre",
    226  1.1  skrll 	"periph2_clk2"
    227  1.1  skrll };
    228  1.1  skrll 
    229  1.1  skrll static const char *vdo_axi_p[] = {
    230  1.1  skrll 	"axi",
    231  1.1  skrll 	"ahb"
    232  1.1  skrll };
    233  1.1  skrll 
    234  1.1  skrll static const char *vpu_axi_p[] = {
    235  1.1  skrll 	"axi",
    236  1.1  skrll 	"pll2_pfd2_396m",
    237  1.1  skrll 	"pll2_pfd0_352m"
    238  1.1  skrll };
    239  1.1  skrll 
    240  1.1  skrll static const char *cko1_p[] = {
    241  1.1  skrll 	"pll3_usb_otg",
    242  1.1  skrll 	"pll2_bus",
    243  1.1  skrll 	"pll1_sys",
    244  1.1  skrll 	"pll5_video_div",
    245  1.1  skrll 	"dummy",
    246  1.1  skrll 	"axi",
    247  1.1  skrll 	"enfc",
    248  1.1  skrll 	"ipu1_di0",
    249  1.1  skrll 	"ipu1_di1",
    250  1.1  skrll 	"ipu2_di0",
    251  1.1  skrll 	"ipu2_di1",
    252  1.1  skrll 	"ahb",
    253  1.1  skrll 	"ipg",
    254  1.1  skrll 	"ipg_per",
    255  1.1  skrll 	"ckil",
    256  1.1  skrll 	"pll4_audio_div"
    257  1.1  skrll };
    258  1.1  skrll 
    259  1.1  skrll static const char *cko2_p[] = {
    260  1.1  skrll 	"mmdc_ch0_axi",
    261  1.1  skrll 	"mmdc_ch1_axi",
    262  1.1  skrll 	"usdhc4",
    263  1.1  skrll 	"usdhc1",
    264  1.1  skrll 	"gpu2d_axi",
    265  1.1  skrll 	"dummy",
    266  1.1  skrll 	"ecspi_root",
    267  1.1  skrll 	"gpu3d_axi",
    268  1.1  skrll 	"usdhc3",
    269  1.1  skrll 	"dummy",
    270  1.1  skrll 	"arm",
    271  1.1  skrll 	"ipu1",
    272  1.1  skrll 	"ipu2",
    273  1.1  skrll 	"vdo_axi",
    274  1.1  skrll 	"osc",
    275  1.1  skrll 	"gpu2d_core",
    276  1.1  skrll 	"gpu3d_core",
    277  1.1  skrll 	"usdhc2",
    278  1.1  skrll 	"ssi1",
    279  1.1  skrll 	"ssi2",
    280  1.1  skrll 	"ssi3",
    281  1.1  skrll 	"gpu3d_shader",
    282  1.1  skrll 	"vpu_axi",
    283  1.1  skrll 	"can_root",
    284  1.1  skrll 	"ldb_di0",
    285  1.1  skrll 	"ldb_di1",
    286  1.1  skrll 	"esai_extal",
    287  1.1  skrll 	"eim_slow",
    288  1.1  skrll 	"uart_serial",
    289  1.1  skrll 	"spdif",
    290  1.1  skrll 	"asrc",
    291  1.1  skrll 	"hsi_tx"
    292  1.1  skrll };
    293  1.1  skrll 
    294  1.1  skrll static const char *cko_p[] = {
    295  1.1  skrll 	"cko1",
    296  1.1  skrll 	"cko2"
    297  1.1  skrll };
    298  1.1  skrll 
    299  1.1  skrll static const char *hsi_tx_p[] = {
    300  1.1  skrll 	"pll3_120m",
    301  1.1  skrll 	"pll2_pfd2_396m"
    302  1.1  skrll };
    303  1.1  skrll 
    304  1.1  skrll static const char *pcie_axi_p[] = {
    305  1.1  skrll 	"axi",
    306  1.1  skrll 	"ahb"
    307  1.1  skrll };
    308  1.1  skrll 
    309  1.1  skrll static const char *ssi_p[] = {
    310  1.1  skrll 	"pll3_pfd2_508m",
    311  1.1  skrll 	"pll3_pfd3_454m",
    312  1.1  skrll 	"pll4_audio_div"
    313  1.1  skrll };
    314  1.1  skrll 
    315  1.1  skrll static const char *usdhc_p[] = {
    316  1.1  skrll 	"pll2_pfd2_396m",
    317  1.1  skrll 	"pll2_pfd0_352m"
    318  1.1  skrll };
    319  1.1  skrll 
    320  1.1  skrll static const char *eim_p[] = {
    321  1.1  skrll 	"pll2_pfd2_396m",
    322  1.1  skrll 	"pll3_usb_otg",
    323  1.1  skrll 	"axi",
    324  1.1  skrll 	"pll2_pfd0_352m"
    325  1.1  skrll };
    326  1.1  skrll 
    327  1.1  skrll static const char *eim_slow_p[] = {
    328  1.1  skrll 	"axi",
    329  1.1  skrll 	"pll3_usb_otg",
    330  1.1  skrll 	"pll2_pfd2_396m",
    331  1.1  skrll 	"pll2_pfd0_352m"
    332  1.1  skrll };
    333  1.1  skrll 
    334  1.1  skrll static const char *enfc_p[] = {
    335  1.1  skrll 	"pll2_pfd0_352m",
    336  1.1  skrll 	"pll2_bus",
    337  1.1  skrll 	"pll3_usb_otg",
    338  1.1  skrll 	"pll2_pfd2_396m"
    339  1.1  skrll };
    340  1.1  skrll 
    341  1.1  skrll static const char *lvds_p[] = {
    342  1.1  skrll 	"dummy",
    343  1.1  skrll 	"dummy",
    344  1.1  skrll 	"dummy",
    345  1.1  skrll 	"dummy",
    346  1.1  skrll 	"dummy",
    347  1.1  skrll 	"dummy",
    348  1.1  skrll 	"pll4_audio",
    349  1.1  skrll 	"pll5_video",
    350  1.1  skrll 	"pll8_mlb",
    351  1.1  skrll 	"enet_ref",
    352  1.1  skrll 	"pcie_ref_125m",
    353  1.1  skrll 	"sata_ref_100m"
    354  1.1  skrll };
    355  1.1  skrll 
    356  1.1  skrll /* DT clock ID to clock name mappings */
    357  1.1  skrll static struct imx_clock_id {
    358  1.1  skrll 	u_int		id;
    359  1.1  skrll 	const char	*name;
    360  1.1  skrll } imx6_clock_ids[] = {
    361  1.1  skrll 	{ IMX6CLK_DUMMY,		"dummy" },
    362  1.1  skrll 	{ IMX6CLK_CKIL,			"ckil" },
    363  1.1  skrll 	{ IMX6CLK_CKIH,			"ckih" },
    364  1.1  skrll 	{ IMX6CLK_OSC,			"osc" },
    365  1.1  skrll 	{ IMX6CLK_PLL2_PFD0_352M,	"pll2_pfd0_352m" },
    366  1.1  skrll 	{ IMX6CLK_PLL2_PFD1_594M,	"pll2_pfd1_594m" },
    367  1.1  skrll 	{ IMX6CLK_PLL2_PFD2_396M,	"pll2_pfd2_396m" },
    368  1.1  skrll 	{ IMX6CLK_PLL3_PFD0_720M,	"pll3_pfd0_720m" },
    369  1.1  skrll 	{ IMX6CLK_PLL3_PFD1_540M,	"pll3_pfd1_540m" },
    370  1.1  skrll 	{ IMX6CLK_PLL3_PFD2_508M,	"pll3_pfd2_508m" },
    371  1.1  skrll 	{ IMX6CLK_PLL3_PFD3_454M,	"pll3_pfd3_454m" },
    372  1.1  skrll 	{ IMX6CLK_PLL2_198M,		"pll2_198m" },
    373  1.1  skrll 	{ IMX6CLK_PLL3_120M,		"pll3_120m" },
    374  1.1  skrll 	{ IMX6CLK_PLL3_80M,		"pll3_80m" },
    375  1.1  skrll 	{ IMX6CLK_PLL3_60M,		"pll3_60m" },
    376  1.1  skrll 	{ IMX6CLK_TWD,			"twd" },
    377  1.1  skrll 	{ IMX6CLK_STEP,			"step" },
    378  1.1  skrll 	{ IMX6CLK_PLL1_SW,		"pll1_sw" },
    379  1.1  skrll 	{ IMX6CLK_PERIPH_PRE,		"periph_pre" },
    380  1.1  skrll 	{ IMX6CLK_PERIPH2_PRE,		"periph2_pre" },
    381  1.1  skrll 	{ IMX6CLK_PERIPH_CLK2_SEL,	"periph_clk2_sel" },
    382  1.1  skrll 	{ IMX6CLK_PERIPH2_CLK2_SEL,	"periph2_clk2_sel" },
    383  1.1  skrll 	{ IMX6CLK_AXI_SEL,		"axi_sel" },
    384  1.1  skrll 	{ IMX6CLK_ESAI_SEL,		"esai_sel" },
    385  1.1  skrll 	{ IMX6CLK_ASRC_SEL,		"asrc_sel" },
    386  1.1  skrll 	{ IMX6CLK_SPDIF_SEL,		"spdif_sel" },
    387  1.1  skrll 	{ IMX6CLK_GPU2D_AXI,		"gpu2d_axi" },
    388  1.1  skrll 	{ IMX6CLK_GPU3D_AXI,		"gpu3d_axi" },
    389  1.1  skrll 	{ IMX6CLK_GPU2D_CORE_SEL,	"gpu2d_core_sel" },
    390  1.1  skrll 	{ IMX6CLK_GPU3D_CORE_SEL,	"gpu3d_core_sel" },
    391  1.1  skrll 	{ IMX6CLK_GPU3D_SHADER_SEL,	"gpu3d_shader_sel" },
    392  1.1  skrll 	{ IMX6CLK_IPU1_SEL,		"ipu1_sel" },
    393  1.1  skrll 	{ IMX6CLK_IPU2_SEL,		"ipu2_sel" },
    394  1.1  skrll 	{ IMX6CLK_LDB_DI0_SEL,		"ldb_di0_sel" },
    395  1.1  skrll 	{ IMX6CLK_LDB_DI1_SEL,		"ldb_di1_sel" },
    396  1.1  skrll 	{ IMX6CLK_IPU1_DI0_PRE_SEL,	"ipu1_di0_pre_sel" },
    397  1.1  skrll 	{ IMX6CLK_IPU1_DI1_PRE_SEL,	"ipu1_di1_pre_sel" },
    398  1.1  skrll 	{ IMX6CLK_IPU2_DI0_PRE_SEL,	"ipu2_di0_pre_sel" },
    399  1.1  skrll 	{ IMX6CLK_IPU2_DI1_PRE_SEL,	"ipu2_di1_pre_sel" },
    400  1.1  skrll 	{ IMX6CLK_IPU1_DI0_SEL,		"ipu1_di0_sel" },
    401  1.1  skrll 	{ IMX6CLK_IPU1_DI1_SEL,		"ipu1_di1_sel" },
    402  1.1  skrll 	{ IMX6CLK_IPU2_DI0_SEL,		"ipu2_di0_sel" },
    403  1.1  skrll 	{ IMX6CLK_IPU2_DI1_SEL,		"ipu2_di1_sel" },
    404  1.1  skrll 	{ IMX6CLK_HSI_TX_SEL,		"hsi_tx_sel" },
    405  1.1  skrll 	{ IMX6CLK_PCIE_AXI_SEL,		"pcie_axi_sel" },
    406  1.1  skrll 	{ IMX6CLK_SSI1_SEL,		"ssi1_sel" },
    407  1.1  skrll 	{ IMX6CLK_SSI2_SEL,		"ssi2_sel" },
    408  1.1  skrll 	{ IMX6CLK_SSI3_SEL,		"ssi3_sel" },
    409  1.1  skrll 	{ IMX6CLK_USDHC1_SEL,		"usdhc1_sel" },
    410  1.1  skrll 	{ IMX6CLK_USDHC2_SEL,		"usdhc2_sel" },
    411  1.1  skrll 	{ IMX6CLK_USDHC3_SEL,		"usdhc3_sel" },
    412  1.1  skrll 	{ IMX6CLK_USDHC4_SEL,		"usdhc4_sel" },
    413  1.1  skrll 	{ IMX6CLK_ENFC_SEL,		"enfc_sel" },
    414  1.1  skrll 	{ IMX6CLK_EIM_SEL,		"eim_sel" },
    415  1.1  skrll 	{ IMX6CLK_EIM_SLOW_SEL,		"eim_slow_sel" },
    416  1.1  skrll 	{ IMX6CLK_VDO_AXI_SEL,		"vdo_axi_sel" },
    417  1.1  skrll 	{ IMX6CLK_VPU_AXI_SEL,		"vpu_axi_sel" },
    418  1.1  skrll 	{ IMX6CLK_CKO1_SEL,		"cko1_sel" },
    419  1.1  skrll 	{ IMX6CLK_PERIPH,		"periph" },
    420  1.1  skrll 	{ IMX6CLK_PERIPH2,		"periph2" },
    421  1.1  skrll 	{ IMX6CLK_PERIPH_CLK2,		"periph_clk2" },
    422  1.1  skrll 	{ IMX6CLK_PERIPH2_CLK2,		"periph2_clk2" },
    423  1.1  skrll 	{ IMX6CLK_IPG,			"ipg" },
    424  1.1  skrll 	{ IMX6CLK_IPG_PER,		"ipg_per" },
    425  1.1  skrll 	{ IMX6CLK_ESAI_PRED,		"esai_pred" },
    426  1.1  skrll 	{ IMX6CLK_ESAI_PODF,		"esai_podf" },
    427  1.1  skrll 	{ IMX6CLK_ASRC_PRED,		"asrc_pred" },
    428  1.1  skrll 	{ IMX6CLK_ASRC_PODF,		"asrc_podf" },
    429  1.1  skrll 	{ IMX6CLK_SPDIF_PRED,		"spdif_pred" },
    430  1.1  skrll 	{ IMX6CLK_SPDIF_PODF,		"spdif_podf" },
    431  1.1  skrll 	{ IMX6CLK_CAN_ROOT,		"can_root" },
    432  1.1  skrll 	{ IMX6CLK_ECSPI_ROOT,		"ecspi_root" },
    433  1.1  skrll 	{ IMX6CLK_GPU2D_CORE_PODF,	"gpu2d_core_podf" },
    434  1.1  skrll 	{ IMX6CLK_GPU3D_CORE_PODF,	"gpu3d_core_podf" },
    435  1.1  skrll 	{ IMX6CLK_GPU3D_SHADER,		"gpu3d_shader" },
    436  1.1  skrll 	{ IMX6CLK_IPU1_PODF,		"ipu1_podf" },
    437  1.1  skrll 	{ IMX6CLK_IPU2_PODF,		"ipu2_podf" },
    438  1.1  skrll 	{ IMX6CLK_LDB_DI0_PODF,		"ldb_di0_podf" },
    439  1.1  skrll 	{ IMX6CLK_LDB_DI1_PODF,		"ldb_di1_podf" },
    440  1.1  skrll 	{ IMX6CLK_IPU1_DI0_PRE,		"ipu1_di0_pre" },
    441  1.1  skrll 	{ IMX6CLK_IPU1_DI1_PRE,		"ipu1_di1_pre" },
    442  1.1  skrll 	{ IMX6CLK_IPU2_DI0_PRE,		"ipu2_di0_pre" },
    443  1.1  skrll 	{ IMX6CLK_IPU2_DI1_PRE,		"ipu2_di1_pre" },
    444  1.1  skrll 	{ IMX6CLK_HSI_TX_PODF,		"hsi_tx_podf" },
    445  1.1  skrll 	{ IMX6CLK_SSI1_PRED,		"ssi1_pred" },
    446  1.1  skrll 	{ IMX6CLK_SSI1_PODF,		"ssi1_podf" },
    447  1.1  skrll 	{ IMX6CLK_SSI2_PRED,		"ssi2_pred" },
    448  1.1  skrll 	{ IMX6CLK_SSI2_PODF,		"ssi2_podf" },
    449  1.1  skrll 	{ IMX6CLK_SSI3_PRED,		"ssi3_pred" },
    450  1.1  skrll 	{ IMX6CLK_SSI3_PODF,		"ssi3_podf" },
    451  1.1  skrll 	{ IMX6CLK_UART_SERIAL_PODF,	"uart_serial_podf" },
    452  1.1  skrll 	{ IMX6CLK_USDHC1_PODF,		"usdhc1_podf" },
    453  1.1  skrll 	{ IMX6CLK_USDHC2_PODF,		"usdhc2_podf" },
    454  1.1  skrll 	{ IMX6CLK_USDHC3_PODF,		"usdhc3_podf" },
    455  1.1  skrll 	{ IMX6CLK_USDHC4_PODF,		"usdhc4_podf" },
    456  1.1  skrll 	{ IMX6CLK_ENFC_PRED,		"enfc_pred" },
    457  1.1  skrll 	{ IMX6CLK_ENFC_PODF,		"enfc_podf" },
    458  1.1  skrll 	{ IMX6CLK_EIM_PODF,		"eim_podf" },
    459  1.1  skrll 	{ IMX6CLK_EIM_SLOW_PODF,	"eim_slow_podf" },
    460  1.1  skrll 	{ IMX6CLK_VPU_AXI_PODF,		"vpu_axi_podf" },
    461  1.1  skrll 	{ IMX6CLK_CKO1_PODF,		"cko1_podf" },
    462  1.1  skrll 	{ IMX6CLK_AXI,			"axi" },
    463  1.1  skrll 	{ IMX6CLK_MMDC_CH0_AXI_PODF,	"mmdc_ch0_axi_podf" },
    464  1.1  skrll 	{ IMX6CLK_MMDC_CH1_AXI_PODF,	"mmdc_ch1_axi_podf" },
    465  1.1  skrll 	{ IMX6CLK_ARM,			"arm" },
    466  1.1  skrll 	{ IMX6CLK_AHB,			"ahb" },
    467  1.1  skrll 	{ IMX6CLK_APBH_DMA,		"apbh_dma" },
    468  1.1  skrll 	{ IMX6CLK_ASRC,			"asrc" },
    469  1.1  skrll 	{ IMX6CLK_CAN1_IPG,		"can1_ipg" },
    470  1.1  skrll 	{ IMX6CLK_CAN1_SERIAL,		"can1_serial" },
    471  1.1  skrll 	{ IMX6CLK_CAN2_IPG,		"can2_ipg" },
    472  1.1  skrll 	{ IMX6CLK_CAN2_SERIAL,		"can2_serial" },
    473  1.1  skrll 	{ IMX6CLK_ECSPI1,		"ecspi1" },
    474  1.1  skrll 	{ IMX6CLK_ECSPI2,		"ecspi2" },
    475  1.1  skrll 	{ IMX6CLK_ECSPI3,		"ecspi3" },
    476  1.1  skrll 	{ IMX6CLK_ECSPI4,		"ecspi4" },
    477  1.1  skrll 	{ IMX6CLK_ECSPI5,		"ecspi5" },
    478  1.1  skrll 	{ IMX6CLK_ENET,			"enet" },
    479  1.1  skrll 	{ IMX6CLK_ESAI_EXTAL,		"esai_extal" },
    480  1.1  skrll 	{ IMX6CLK_GPT_IPG,		"gpt_ipg" },
    481  1.1  skrll 	{ IMX6CLK_GPT_IPG_PER,		"gpt_ipg_per" },
    482  1.1  skrll 	{ IMX6CLK_GPU2D_CORE,		"gpu2d_core" },
    483  1.1  skrll 	{ IMX6CLK_GPU3D_CORE,		"gpu3d_core" },
    484  1.1  skrll 	{ IMX6CLK_HDMI_IAHB,		"hdmi_iahb" },
    485  1.1  skrll 	{ IMX6CLK_HDMI_ISFR,		"hdmi_isfr" },
    486  1.1  skrll 	{ IMX6CLK_I2C1,			"i2c1" },
    487  1.1  skrll 	{ IMX6CLK_I2C2,			"i2c2" },
    488  1.1  skrll 	{ IMX6CLK_I2C3,			"i2c3" },
    489  1.1  skrll 	{ IMX6CLK_IIM,			"iim" },
    490  1.1  skrll 	{ IMX6CLK_ENFC,			"enfc" },
    491  1.1  skrll 	{ IMX6CLK_IPU1,			"ipu1" },
    492  1.1  skrll 	{ IMX6CLK_IPU1_DI0,		"ipu1_di0" },
    493  1.1  skrll 	{ IMX6CLK_IPU1_DI1,		"ipu1_di1" },
    494  1.1  skrll 	{ IMX6CLK_IPU2,			"ipu2" },
    495  1.1  skrll 	{ IMX6CLK_IPU2_DI0,		"ipu2_di0" },
    496  1.1  skrll 	{ IMX6CLK_LDB_DI0,		"ldb_di0" },
    497  1.1  skrll 	{ IMX6CLK_LDB_DI1,		"ldb_di1" },
    498  1.1  skrll 	{ IMX6CLK_IPU2_DI1,		"ipu2_di1" },
    499  1.1  skrll 	{ IMX6CLK_HSI_TX,		"hsi_tx" },
    500  1.1  skrll 	{ IMX6CLK_MLB,			"mlb" },
    501  1.1  skrll 	{ IMX6CLK_MMDC_CH0_AXI,		"mmdc_ch0_axi" },
    502  1.1  skrll 	{ IMX6CLK_MMDC_CH1_AXI,		"mmdc_ch1_axi" },
    503  1.1  skrll 	{ IMX6CLK_OCRAM,		"ocram" },
    504  1.1  skrll 	{ IMX6CLK_OPENVG_AXI,		"openvg_axi" },
    505  1.1  skrll 	{ IMX6CLK_PCIE_AXI,		"pcie_axi" },
    506  1.1  skrll 	{ IMX6CLK_PWM1,			"pwm1" },
    507  1.1  skrll 	{ IMX6CLK_PWM2,			"pwm2" },
    508  1.1  skrll 	{ IMX6CLK_PWM3,			"pwm3" },
    509  1.1  skrll 	{ IMX6CLK_PWM4,			"pwm4" },
    510  1.1  skrll 	{ IMX6CLK_PER1_BCH,		"per1_bch" },
    511  1.1  skrll 	{ IMX6CLK_GPMI_BCH_APB,		"gpmi_bch_apb" },
    512  1.1  skrll 	{ IMX6CLK_GPMI_BCH,		"gpmi_bch" },
    513  1.1  skrll 	{ IMX6CLK_GPMI_IO,		"gpmi_io" },
    514  1.1  skrll 	{ IMX6CLK_GPMI_APB,		"gpmi_apb" },
    515  1.1  skrll 	{ IMX6CLK_SATA,			"sata" },
    516  1.1  skrll 	{ IMX6CLK_SDMA,			"sdma" },
    517  1.1  skrll 	{ IMX6CLK_SPBA,			"spba" },
    518  1.1  skrll 	{ IMX6CLK_SSI1,			"ssi1" },
    519  1.1  skrll 	{ IMX6CLK_SSI2,			"ssi2" },
    520  1.1  skrll 	{ IMX6CLK_SSI3,			"ssi3" },
    521  1.1  skrll 	{ IMX6CLK_UART_IPG,		"uart_ipg" },
    522  1.1  skrll 	{ IMX6CLK_UART_SERIAL,		"uart_serial" },
    523  1.1  skrll 	{ IMX6CLK_USBOH3,		"usboh3" },
    524  1.1  skrll 	{ IMX6CLK_USDHC1,		"usdhc1" },
    525  1.1  skrll 	{ IMX6CLK_USDHC2,		"usdhc2" },
    526  1.1  skrll 	{ IMX6CLK_USDHC3,		"usdhc3" },
    527  1.1  skrll 	{ IMX6CLK_USDHC4,		"usdhc4" },
    528  1.1  skrll 	{ IMX6CLK_VDO_AXI,		"vdo_axi" },
    529  1.1  skrll 	{ IMX6CLK_VPU_AXI,		"vpu_axi" },
    530  1.1  skrll 	{ IMX6CLK_CKO1,			"cko1" },
    531  1.1  skrll 	{ IMX6CLK_PLL1_SYS,		"pll1_sys" },
    532  1.1  skrll 	{ IMX6CLK_PLL2_BUS,		"pll2_bus" },
    533  1.1  skrll 	{ IMX6CLK_PLL3_USB_OTG,		"pll3_usb_otg" },
    534  1.1  skrll 	{ IMX6CLK_PLL4_AUDIO,		"pll4_audio" },
    535  1.1  skrll 	{ IMX6CLK_PLL5_VIDEO,		"pll5_video" },
    536  1.1  skrll 	{ IMX6CLK_PLL8_MLB,		"pll8_mlb" },
    537  1.1  skrll 	{ IMX6CLK_PLL7_USB_HOST,	"pll7_usb_host" },
    538  1.1  skrll 	{ IMX6CLK_PLL6_ENET,		"pll6_enet" },
    539  1.1  skrll 	{ IMX6CLK_SSI1_IPG,		"ssi1_ipg" },
    540  1.1  skrll 	{ IMX6CLK_SSI2_IPG,		"ssi2_ipg" },
    541  1.1  skrll 	{ IMX6CLK_SSI3_IPG,		"ssi3_ipg" },
    542  1.1  skrll 	{ IMX6CLK_ROM,			"rom" },
    543  1.1  skrll 	{ IMX6CLK_USBPHY1,		"usbphy1" },
    544  1.1  skrll 	{ IMX6CLK_USBPHY2,		"usbphy2" },
    545  1.1  skrll 	{ IMX6CLK_LDB_DI0_DIV_3_5,	"ldb_di0_div_3_5" },
    546  1.1  skrll 	{ IMX6CLK_LDB_DI1_DIV_3_5,	"ldb_di1_div_3_5" },
    547  1.1  skrll 	{ IMX6CLK_SATA_REF,		"sata_ref" },
    548  1.1  skrll 	{ IMX6CLK_SATA_REF_100M,	"sata_ref_100m" },
    549  1.1  skrll 	{ IMX6CLK_PCIE_REF,		"pcie_ref" },
    550  1.1  skrll 	{ IMX6CLK_PCIE_REF_125M,	"pcie_ref_125m" },
    551  1.1  skrll 	{ IMX6CLK_ENET_REF,		"enet_ref" },
    552  1.1  skrll 	{ IMX6CLK_USBPHY1_GATE,		"usbphy1_gate" },
    553  1.1  skrll 	{ IMX6CLK_USBPHY2_GATE,		"usbphy2_gate" },
    554  1.1  skrll 	{ IMX6CLK_PLL4_POST_DIV,	"pll4_post_div" },
    555  1.1  skrll 	{ IMX6CLK_PLL5_POST_DIV,	"pll5_post_div" },
    556  1.1  skrll 	{ IMX6CLK_PLL5_VIDEO_DIV,	"pll5_video_div" },
    557  1.1  skrll 	{ IMX6CLK_EIM_SLOW,		"eim_slow" },
    558  1.1  skrll 	{ IMX6CLK_SPDIF,		"spdif" },
    559  1.1  skrll 	{ IMX6CLK_CKO2_SEL,		"cko2_sel" },
    560  1.1  skrll 	{ IMX6CLK_CKO2_PODF,		"cko2_podf" },
    561  1.1  skrll 	{ IMX6CLK_CKO2,			"cko2" },
    562  1.1  skrll 	{ IMX6CLK_CKO,			"cko" },
    563  1.1  skrll 	{ IMX6CLK_VDOA,			"vdoa" },
    564  1.1  skrll 	{ IMX6CLK_PLL4_AUDIO_DIV,	"pll4_audio_div" },
    565  1.1  skrll 	{ IMX6CLK_LVDS1_SEL,		"lvds1_sel" },
    566  1.1  skrll 	{ IMX6CLK_LVDS2_SEL,		"lvds2_sel" },
    567  1.1  skrll 	{ IMX6CLK_LVDS1_GATE,		"lvds1_gate" },
    568  1.1  skrll 	{ IMX6CLK_LVDS2_GATE,		"lvds2_gate" },
    569  1.1  skrll 	{ IMX6CLK_ESAI_IPG,		"esai_ipg" },
    570  1.1  skrll 	{ IMX6CLK_ESAI_MEM,		"esai_mem" },
    571  1.1  skrll 	{ IMX6CLK_ASRC_IPG,		"asrc_ipg" },
    572  1.1  skrll 	{ IMX6CLK_ASRC_MEM,		"asrc_mem" },
    573  1.1  skrll 	{ IMX6CLK_LVDS1_IN,		"lvds1_in" },
    574  1.1  skrll 	{ IMX6CLK_LVDS2_IN,		"lvds2_in" },
    575  1.1  skrll 	{ IMX6CLK_ANACLK1,		"anaclk1" },
    576  1.1  skrll 	{ IMX6CLK_ANACLK2,		"anaclk2" },
    577  1.1  skrll 	{ IMX6CLK_PLL1_BYPASS_SRC,	"pll1_bypass_src" },
    578  1.1  skrll 	{ IMX6CLK_PLL2_BYPASS_SRC,	"pll2_bypass_src" },
    579  1.1  skrll 	{ IMX6CLK_PLL3_BYPASS_SRC,	"pll3_bypass_src" },
    580  1.1  skrll 	{ IMX6CLK_PLL4_BYPASS_SRC,	"pll4_bypass_src" },
    581  1.1  skrll 	{ IMX6CLK_PLL5_BYPASS_SRC,	"pll5_bypass_src" },
    582  1.1  skrll 	{ IMX6CLK_PLL6_BYPASS_SRC,	"pll6_bypass_src" },
    583  1.1  skrll 	{ IMX6CLK_PLL7_BYPASS_SRC,	"pll7_bypass_src" },
    584  1.1  skrll 	{ IMX6CLK_PLL1,			"pll1" },
    585  1.1  skrll 	{ IMX6CLK_PLL2,			"pll2" },
    586  1.1  skrll 	{ IMX6CLK_PLL3,			"pll3" },
    587  1.1  skrll 	{ IMX6CLK_PLL4,			"pll4" },
    588  1.1  skrll 	{ IMX6CLK_PLL5,			"pll5" },
    589  1.1  skrll 	{ IMX6CLK_PLL6,			"pll6" },
    590  1.1  skrll 	{ IMX6CLK_PLL7,			"pll7" },
    591  1.1  skrll 	{ IMX6CLK_PLL1_BYPASS,		"pll1_bypass" },
    592  1.1  skrll 	{ IMX6CLK_PLL2_BYPASS,		"pll2_bypass" },
    593  1.1  skrll 	{ IMX6CLK_PLL3_BYPASS,		"pll3_bypass" },
    594  1.1  skrll 	{ IMX6CLK_PLL4_BYPASS,		"pll4_bypass" },
    595  1.1  skrll 	{ IMX6CLK_PLL5_BYPASS,		"pll5_bypass" },
    596  1.1  skrll 	{ IMX6CLK_PLL6_BYPASS,		"pll6_bypass" },
    597  1.1  skrll 	{ IMX6CLK_PLL7_BYPASS,		"pll7_bypass" },
    598  1.1  skrll 	{ IMX6CLK_GPT_3M,		"gpt_3m" },
    599  1.1  skrll 	{ IMX6CLK_VIDEO_27M,		"video_27m" },
    600  1.1  skrll 	{ IMX6CLK_MIPI_CORE_CFG,	"mipi_core_cfg" },
    601  1.1  skrll 	{ IMX6CLK_MIPI_IPG,		"mipi_ipg" },
    602  1.1  skrll 	{ IMX6CLK_CAAM_MEM,		"caam_mem" },
    603  1.1  skrll 	{ IMX6CLK_CAAM_ACLK,		"caam_aclk" },
    604  1.1  skrll 	{ IMX6CLK_CAAM_IPG,		"caam_ipg" },
    605  1.1  skrll 	{ IMX6CLK_SPDIF_GCLK,		"spdif_gclk" },
    606  1.1  skrll 	{ IMX6CLK_UART_SEL,		"uart_sel" },
    607  1.1  skrll 	{ IMX6CLK_IPG_PER_SEL,		"ipg_per_sel" },
    608  1.1  skrll 	{ IMX6CLK_ECSPI_SEL,		"ecspi_sel" },
    609  1.1  skrll 	{ IMX6CLK_CAN_SEL,		"can_sel" },
    610  1.1  skrll 	{ IMX6CLK_MMDC_CH1_AXI_CG,	"mmdc_ch1_axi_cg" },
    611  1.1  skrll 	{ IMX6CLK_PRE0,			"pre0" },
    612  1.1  skrll 	{ IMX6CLK_PRE1,			"pre1" },
    613  1.1  skrll 	{ IMX6CLK_PRE2,			"pre2" },
    614  1.1  skrll 	{ IMX6CLK_PRE3,			"pre3" },
    615  1.1  skrll 	{ IMX6CLK_PRG0_AXI,		"prg0_axi" },
    616  1.1  skrll 	{ IMX6CLK_PRG1_AXI,		"prg1_axi" },
    617  1.1  skrll 	{ IMX6CLK_PRG0_APB,		"prg0_apb" },
    618  1.1  skrll 	{ IMX6CLK_PRG1_APB,		"prg1_apb" },
    619  1.1  skrll 	{ IMX6CLK_PRE_AXI,		"pre_axi" },
    620  1.1  skrll 	{ IMX6CLK_MLB_SEL,		"mlb_sel" },
    621  1.1  skrll 	{ IMX6CLK_MLB_PODF,		"mlb_podf" },
    622  1.1  skrll 	{ IMX6CLK_END,			"end" },
    623  1.1  skrll };
    624  1.1  skrll 
    625  1.1  skrll /* Clock Divider Tables */
    626  1.1  skrll static const int enet_ref_tbl[] = { 20, 10, 5, 4, 0 };
    627  1.1  skrll static const int post_div_tbl[] = { 4, 2, 1, 0 };
    628  1.1  skrll static const int audiovideo_div_tbl[] = { 1, 2, 1, 4, 0 };
    629  1.1  skrll 
    630  1.1  skrll static struct imx6_clk imx6_clks[] = {
    631  1.1  skrll 	CLK_FIXED("dummy", 0),
    632  1.1  skrll 
    633  1.1  skrll 	CLK_FIXED("ckil", IMX6_CKIL_FREQ),
    634  1.1  skrll 	CLK_FIXED("ckih", IMX6_CKIH_FREQ),
    635  1.1  skrll 	CLK_FIXED("osc", IMX6_OSC_FREQ),
    636  1.1  skrll 	CLK_FIXED("anaclk1", IMX6_ANACLK1_FREQ),
    637  1.1  skrll 	CLK_FIXED("anaclk2", IMX6_ANACLK2_FREQ),
    638  1.1  skrll 
    639  1.1  skrll 	CLK_FIXED_FACTOR("sata_ref", "pll6_enet", 5, 1),
    640  1.1  skrll 	CLK_FIXED_FACTOR("pcie_ref", "pll6_enet", 4, 1),
    641  1.1  skrll 	CLK_FIXED_FACTOR("pll2_198m", "pll2_pfd2_396m", 2, 1),
    642  1.1  skrll 	CLK_FIXED_FACTOR("pll3_120m", "pll3_usb_otg", 4, 1),
    643  1.1  skrll 	CLK_FIXED_FACTOR("pll3_80m", "pll3_usb_otg", 6, 1),
    644  1.1  skrll 	CLK_FIXED_FACTOR("pll3_60m", "pll3_usb_otg", 8, 1),
    645  1.1  skrll 	CLK_FIXED_FACTOR("twd", "arm", 2, 1),
    646  1.1  skrll 	CLK_FIXED_FACTOR("gpt_3m", "osc", 8, 1),
    647  1.1  skrll 	CLK_FIXED_FACTOR("video_27m", "pll3_pfd1_540m", 20, 1),
    648  1.1  skrll 	CLK_FIXED_FACTOR("gpu2d_axi", "mmdc_ch0_axi_podf", 1, 1),
    649  1.1  skrll 	CLK_FIXED_FACTOR("gpu3d_axi", "mmdc_ch0_axi_podf", 1, 1),
    650  1.1  skrll 	CLK_FIXED_FACTOR("ldb_di0_div_3_5", "ldb_di0_sel", 7, 2),
    651  1.1  skrll 	CLK_FIXED_FACTOR("ldb_di1_div_3_5", "ldb_di1_sel", 7, 2),
    652  1.1  skrll 
    653  1.1  skrll 	CLK_PFD("pll2_pfd0_352m", "pll2_bus", PFD_528, 0),
    654  1.1  skrll 	CLK_PFD("pll2_pfd1_594m", "pll2_bus", PFD_528, 1),
    655  1.1  skrll 	CLK_PFD("pll2_pfd2_396m", "pll2_bus", PFD_528, 2),
    656  1.1  skrll 	CLK_PFD("pll3_pfd0_720m", "pll3_usb_otg", PFD_480, 0),
    657  1.1  skrll 	CLK_PFD("pll3_pfd1_540m", "pll3_usb_otg", PFD_480, 1),
    658  1.1  skrll 	CLK_PFD("pll3_pfd2_508m", "pll3_usb_otg", PFD_480, 2),
    659  1.1  skrll 	CLK_PFD("pll3_pfd3_454m", "pll3_usb_otg", PFD_480, 3),
    660  1.1  skrll 
    661  1.1  skrll 	CLK_PLL("pll1", "osc", SYS, PLL_ARM, DIV_SELECT, POWERDOWN, 0),
    662  1.1  skrll 	CLK_PLL("pll2", "osc", GENERIC, PLL_SYS, DIV_SELECT, POWERDOWN, 0),
    663  1.1  skrll 	CLK_PLL("pll3", "osc", USB, PLL_USB1, DIV_SELECT, POWER, 0),
    664  1.1  skrll 	CLK_PLL("pll4", "osc", AUDIO_VIDEO, PLL_AUDIO, DIV_SELECT, POWERDOWN, 0),
    665  1.1  skrll 	CLK_PLL("pll5", "osc", AUDIO_VIDEO, PLL_VIDEO, DIV_SELECT, POWERDOWN, 0),
    666  1.1  skrll 	CLK_PLL("pll6", "osc", ENET, PLL_ENET, DIV_SELECT, POWERDOWN, 500000000),
    667  1.1  skrll 	CLK_PLL("pll7", "osc", USB, PLL_USB2, DIV_SELECT, POWER, 0),
    668  1.1  skrll 
    669  1.1  skrll 	CLK_DIV("periph_clk2", "periph_clk2_sel", CBCDR, PERIPH_CLK2_PODF),
    670  1.1  skrll 	CLK_DIV("periph2_clk2", "periph2_clk2_sel", CBCDR, PERIPH2_CLK2_PODF),
    671  1.1  skrll 	CLK_DIV("ipg", "ahb", CBCDR, IPG_PODF),
    672  1.1  skrll 	CLK_DIV("esai_pred", "esai_sel", CS1CDR, ESAI_CLK_PRED),
    673  1.1  skrll 	CLK_DIV("esai_podf", "esai_pred", CS1CDR, ESAI_CLK_PODF),
    674  1.1  skrll 	CLK_DIV("asrc_pred", "asrc_sel", CDCDR, SPDIF1_CLK_PRED),
    675  1.1  skrll 	CLK_DIV("asrc_podf", "asrc_pred", CDCDR, SPDIF1_CLK_PODF),
    676  1.1  skrll 	CLK_DIV("spdif_pred", "spdif_sel", CDCDR, SPDIF0_CLK_PRED),
    677  1.1  skrll 	CLK_DIV("spdif_podf", "spdif_pred", CDCDR, SPDIF0_CLK_PODF),
    678  1.1  skrll 	CLK_DIV("ecspi_root", "pll3_60m", CSCDR2, ECSPI_CLK_PODF),
    679  1.1  skrll 	CLK_DIV("can_root", "pll3_60m", CSCMR2, CAN_CLK_PODF),
    680  1.1  skrll 	CLK_DIV("uart_serial_podf", "pll3_80m", CSCDR1, UART_CLK_PODF),
    681  1.1  skrll 	CLK_DIV("gpu2d_core_podf", "gpu2d_core_sel", CBCMR, GPU2D_CORE_CLK_PODF),
    682  1.1  skrll 	CLK_DIV("gpu3d_core_podf", "gpu3d_core_sel", CBCMR, GPU3D_CORE_PODF),
    683  1.1  skrll 	CLK_DIV("gpu3d_shader", "gpu3d_shader_sel", CBCMR, GPU3D_SHADER_PODF),
    684  1.1  skrll 	CLK_DIV("ipu1_podf", "ipu1_sel", CSCDR3, IPU1_HSP_PODF),
    685  1.1  skrll 	CLK_DIV("ipu2_podf", "ipu2_sel", CSCDR3, IPU2_HSP_PODF),
    686  1.1  skrll 	CLK_DIV("ldb_di0_podf", "ldb_di0_div_3_5", CSCMR2, LDB_DI0_IPU_DIV),
    687  1.1  skrll 	CLK_DIV("ldb_di1_podf", "ldb_di1_div_3_5", CSCMR2, LDB_DI1_IPU_DIV),
    688  1.1  skrll 	CLK_DIV("ipu1_di0_pre", "ipu1_di0_pre_sel", CHSCCDR, IPU1_DI0_PODF),
    689  1.1  skrll 	CLK_DIV("ipu1_di1_pre", "ipu1_di1_pre_sel", CHSCCDR, IPU1_DI1_PODF),
    690  1.1  skrll 	CLK_DIV("ipu2_di0_pre", "ipu2_di0_pre_sel", CSCDR2, IPU2_DI0_PODF),
    691  1.1  skrll 	CLK_DIV("ipu2_di1_pre", "ipu2_di1_pre_sel", CSCDR2, IPU2_DI1_PODF),
    692  1.1  skrll 	CLK_DIV("hsi_tx_podf", "hsi_tx_sel", CDCDR, HSI_TX_PODF),
    693  1.1  skrll 	CLK_DIV("ssi1_pred", "ssi1_sel", CS1CDR, SSI1_CLK_PRED),
    694  1.1  skrll 	CLK_DIV("ssi1_podf", "ssi1_pred", CS1CDR, SSI1_CLK_PODF),
    695  1.1  skrll 	CLK_DIV("ssi2_pred", "ssi2_sel", CS2CDR, SSI2_CLK_PRED),
    696  1.1  skrll 	CLK_DIV("ssi2_podf", "ssi2_pred", CS2CDR, SSI2_CLK_PODF),
    697  1.1  skrll 	CLK_DIV("ssi3_pred", "ssi3_sel", CS1CDR, SSI3_CLK_PRED),
    698  1.1  skrll 	CLK_DIV("ssi3_podf", "ssi3_pred", CS1CDR, SSI3_CLK_PODF),
    699  1.1  skrll 	CLK_DIV("usdhc1_podf", "usdhc1_sel", CSCDR1, USDHC1_PODF),
    700  1.1  skrll 	CLK_DIV("usdhc2_podf", "usdhc2_sel", CSCDR1, USDHC2_PODF),
    701  1.1  skrll 	CLK_DIV("usdhc3_podf", "usdhc3_sel", CSCDR1, USDHC3_PODF),
    702  1.1  skrll 	CLK_DIV("usdhc4_podf", "usdhc4_sel", CSCDR1, USDHC4_PODF),
    703  1.1  skrll 	CLK_DIV("enfc_pred", "enfc_sel", CS2CDR, ENFC_CLK_PRED),
    704  1.1  skrll 	CLK_DIV("enfc_podf", "enfc_pred", CS2CDR, ENFC_CLK_PODF),
    705  1.1  skrll 	CLK_DIV("vpu_axi_podf", "vpu_axi_sel", CSCDR1, VPU_AXI_PODF),
    706  1.1  skrll 	CLK_DIV("cko1_podf", "cko1_sel", CCOSR, CLKO1_DIV),
    707  1.1  skrll 	CLK_DIV("cko2_podf", "cko2_sel", CCOSR, CLKO2_DIV),
    708  1.1  skrll 	CLK_DIV("ipg_per", "ipg", CSCMR1, PERCLK_PODF),
    709  1.1  skrll 	CLK_DIV("eim_podf", "eim_sel", CSCMR1, ACLK_PODF),
    710  1.1  skrll 	CLK_DIV("eim_slow_podf", "eim_slow_sel", CSCMR1, ACLK_EIM_SLOW_PODF),
    711  1.1  skrll 
    712  1.1  skrll 	CLK_DIV_BUSY("axi", "axi_sel", CBCDR, AXI_PODF, CDHIPR, AXI_PODF_BUSY),
    713  1.1  skrll 	CLK_DIV_BUSY("mmdc_ch0_axi_podf", "periph", CBCDR, MMDC_CH0_AXI_PODF, CDHIPR, MMDC_CH0_PODF_BUSY),
    714  1.1  skrll 	CLK_DIV_BUSY("mmdc_ch1_axi_podf", "periph2", CBCDR, MMDC_CH1_AXI_PODF, CDHIPR, MMDC_CH1_PODF_BUSY),
    715  1.1  skrll 	CLK_DIV_BUSY("arm", "pll1_sw", CACRR, ARM_PODF, CDHIPR, ARM_PODF_BUSY),
    716  1.1  skrll 	CLK_DIV_BUSY("ahb", "periph", CBCDR, AHB_PODF, CDHIPR, AHB_PODF_BUSY),
    717  1.1  skrll 
    718  1.1  skrll 	CLK_DIV_TABLE("pll4_post_div", "pll4_audio", PLL_AUDIO, POST_DIV_SELECT, post_div_tbl),
    719  1.1  skrll 	CLK_DIV_TABLE("pll4_audio_div", "pll4_post_div", MISC2, AUDIO_DIV_LSB, audiovideo_div_tbl),
    720  1.1  skrll 	CLK_DIV_TABLE("pll5_post_div", "pll5_video", PLL_VIDEO, POST_DIV_SELECT, post_div_tbl),
    721  1.1  skrll 	CLK_DIV_TABLE("pll5_video_div", "pll5_post_div", MISC2, VIDEO_DIV, audiovideo_div_tbl),
    722  1.1  skrll 	CLK_DIV_TABLE("enet_ref", "pll6_enet", PLL_ENET, DIV_SELECT, enet_ref_tbl),
    723  1.1  skrll 
    724  1.1  skrll 	CLK_MUX("step", step_p, CCM, CCSR, STEP_SEL),
    725  1.1  skrll 	CLK_MUX("pll1_sw", pll1_sw_p, CCM, CCSR, PLL1_SW_CLK_SEL),
    726  1.1  skrll 	CLK_MUX("periph_pre", periph_pre_p, CCM, CBCMR, PRE_PERIPH_CLK_SEL),
    727  1.1  skrll 	CLK_MUX("periph2_pre", periph_pre_p, CCM, CBCMR, PRE_PERIPH2_CLK_SEL),
    728  1.1  skrll 	CLK_MUX("periph_clk2_sel", periph_clk2_p, CCM,CBCMR, PERIPH_CLK2_SEL),
    729  1.1  skrll 	CLK_MUX("periph2_clk2_sel", periph2_clk2_p, CCM,CBCMR, PERIPH2_CLK2_SEL),
    730  1.1  skrll 	CLK_MUX("axi_sel", axi_p, CCM, CBCDR, AXI_SEL),
    731  1.1  skrll 	CLK_MUX("asrc_sel", audio_p, CCM, CDCDR, SPDIF1_CLK_SEL),
    732  1.1  skrll 	CLK_MUX("spdif_sel", audio_p, CCM, CDCDR, SPDIF0_CLK_SEL),
    733  1.1  skrll 	CLK_MUX("gpu2d_core_sel", gpu2d_core_p, CCM, CBCMR, GPU2D_CLK_SEL),
    734  1.1  skrll 	CLK_MUX("gpu3d_core_sel", gpu3d_core_p, CCM, CBCMR, GPU3D_CORE_CLK_SEL),
    735  1.1  skrll 	CLK_MUX("gpu3d_shader_sel", gpu3d_shader_p, CCM,CBCMR, GPU3D_SHADER_CLK_SEL),
    736  1.1  skrll 	CLK_MUX("esai_sel", audio_p, CCM, CSCMR2, ESAI_CLK_SEL),
    737  1.1  skrll 	CLK_MUX("ipu1_sel", ipu_p, CCM, CSCDR3, IPU1_HSP_CLK_SEL),
    738  1.1  skrll 	CLK_MUX("ipu2_sel", ipu_p, CCM, CSCDR3, IPU2_HSP_CLK_SEL),
    739  1.1  skrll 	CLK_MUX("ipu1_di0_pre_sel", ipu_di_pre_p, CCM, CHSCCDR, IPU1_DI0_PRE_CLK_SEL),
    740  1.1  skrll 	CLK_MUX("ipu1_di1_pre_sel", ipu_di_pre_p, CCM, CHSCCDR, IPU1_DI1_PRE_CLK_SEL),
    741  1.1  skrll 	CLK_MUX("ipu2_di0_pre_sel", ipu_di_pre_p, CCM, CSCDR2, IPU2_DI0_PRE_CLK_SEL),
    742  1.1  skrll 	CLK_MUX("ipu2_di1_pre_sel", ipu_di_pre_p, CCM, CSCDR2, IPU2_DI1_PRE_CLK_SEL),
    743  1.1  skrll 	CLK_MUX("ipu1_di0_sel", ipu1_di0_p, CCM, CHSCCDR, IPU1_DI0_CLK_SEL),
    744  1.1  skrll 	CLK_MUX("ipu1_di1_sel", ipu1_di1_p, CCM, CHSCCDR, IPU1_DI1_CLK_SEL),
    745  1.1  skrll 	CLK_MUX("ipu2_di0_sel", ipu2_di0_p, CCM, CSCDR2, IPU2_DI0_CLK_SEL),
    746  1.1  skrll 	CLK_MUX("ipu2_di1_sel", ipu2_di1_p, CCM, CSCDR2, IPU2_DI1_CLK_SEL),
    747  1.1  skrll 	CLK_MUX("ldb_di0_sel", ldb_di_p, CCM, CS2CDR, LDB_DI0_CLK_SEL),
    748  1.1  skrll 	CLK_MUX("ldb_di1_sel", ldb_di_p, CCM, CS2CDR, LDB_DI1_CLK_SEL),
    749  1.1  skrll 	CLK_MUX("vdo_axi_sel", vdo_axi_p, CCM, CBCMR, VDOAXI_CLK_SEL),
    750  1.1  skrll 	CLK_MUX("vpu_axi_sel", vpu_axi_p, CCM, CBCMR, VPU_AXI_CLK_SEL),
    751  1.1  skrll 	CLK_MUX("cko1_sel", cko1_p, CCM, CCOSR, CLKO1_SEL),
    752  1.1  skrll 	CLK_MUX("cko2_sel", cko2_p, CCM, CCOSR, CLKO2_SEL),
    753  1.1  skrll 	CLK_MUX("cko", cko_p, CCM, CCOSR, CLK_OUT_SEL),
    754  1.1  skrll 	CLK_MUX("hsi_tx_sel", hsi_tx_p, CCM, CDCDR, HSI_TX_CLK_SEL),
    755  1.1  skrll 	CLK_MUX("pcie_axi_sel", pcie_axi_p, CCM, CBCMR, PCIE_AXI_CLK_SEL),
    756  1.1  skrll 	CLK_MUX("ssi1_sel", ssi_p, CCM, CSCMR1, SSI1_CLK_SEL),
    757  1.1  skrll 	CLK_MUX("ssi2_sel", ssi_p, CCM, CSCMR1, SSI2_CLK_SEL),
    758  1.1  skrll 	CLK_MUX("ssi3_sel", ssi_p, CCM, CSCMR1, SSI3_CLK_SEL),
    759  1.1  skrll 	CLK_MUX("usdhc1_sel", usdhc_p, CCM, CSCMR1, USDHC1_CLK_SEL),
    760  1.1  skrll 	CLK_MUX("usdhc2_sel", usdhc_p, CCM, CSCMR1, USDHC2_CLK_SEL),
    761  1.1  skrll 	CLK_MUX("usdhc3_sel", usdhc_p, CCM, CSCMR1, USDHC3_CLK_SEL),
    762  1.1  skrll 	CLK_MUX("usdhc4_sel", usdhc_p, CCM, CSCMR1, USDHC4_CLK_SEL),
    763  1.1  skrll 	CLK_MUX("eim_sel", eim_p, CCM, CSCMR1, ACLK_SEL),
    764  1.1  skrll 	CLK_MUX("eim_slow_sel", eim_slow_p, CCM, CSCMR1, ACLK_EIM_SLOW_SEL),
    765  1.1  skrll 	CLK_MUX("enfc_sel", enfc_p, CCM, CS2CDR, ENFC_CLK_SEL),
    766  1.1  skrll 
    767  1.1  skrll 	CLK_MUX("pll1_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_ARM, BYPASS_CLK_SRC),
    768  1.1  skrll 	CLK_MUX("pll2_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_SYS, BYPASS_CLK_SRC),
    769  1.1  skrll 	CLK_MUX("pll3_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_USB1, BYPASS_CLK_SRC),
    770  1.1  skrll 	CLK_MUX("pll4_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_AUDIO, BYPASS_CLK_SRC),
    771  1.1  skrll 	CLK_MUX("pll5_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_VIDEO, BYPASS_CLK_SRC),
    772  1.1  skrll 	CLK_MUX("pll6_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_ENET, BYPASS_CLK_SRC),
    773  1.1  skrll 	CLK_MUX("pll7_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_USB2, BYPASS_CLK_SRC),
    774  1.1  skrll 	CLK_MUX("pll1_bypass", pll1_bypass_p, CCM_ANALOG, PLL_ARM, BYPASS),
    775  1.1  skrll 	CLK_MUX("pll2_bypass", pll2_bypass_p, CCM_ANALOG, PLL_SYS, BYPASS),
    776  1.1  skrll 	CLK_MUX("pll3_bypass", pll3_bypass_p, CCM_ANALOG, PLL_USB1, BYPASS),
    777  1.1  skrll 	CLK_MUX("pll4_bypass", pll4_bypass_p, CCM_ANALOG, PLL_AUDIO, BYPASS),
    778  1.1  skrll 	CLK_MUX("pll5_bypass", pll5_bypass_p, CCM_ANALOG, PLL_VIDEO, BYPASS),
    779  1.1  skrll 	CLK_MUX("pll6_bypass", pll6_bypass_p, CCM_ANALOG, PLL_ENET, BYPASS),
    780  1.1  skrll 	CLK_MUX("pll7_bypass", pll7_bypass_p, CCM_ANALOG, PLL_USB2, BYPASS),
    781  1.1  skrll 
    782  1.1  skrll 	CLK_MUX("lvds1_sel", lvds_p, CCM_ANALOG, MISC1, LVDS_CLK1_SRC),
    783  1.1  skrll 	CLK_MUX("lvds2_sel", lvds_p, CCM_ANALOG, MISC1, LVDS_CLK2_SRC),
    784  1.1  skrll 
    785  1.1  skrll 	CLK_MUX_BUSY("periph", periph_p, CBCDR, PERIPH_CLK_SEL, CDHIPR, PERIPH_CLK_SEL_BUSY),
    786  1.1  skrll 	CLK_MUX_BUSY("periph2", periph2_p, CBCDR, PERIPH2_CLK_SEL, CDHIPR, PERIPH2_CLK_SEL_BUSY),
    787  1.1  skrll 
    788  1.1  skrll 	CLK_GATE("apbh_dma", "usdhc3", CCM, CCGR0, APBHDMA_HCLK_ENABLE),
    789  1.1  skrll 	CLK_GATE("asrc", "asrc_podf", CCM, CCGR0, ASRC_CLK_ENABLE),
    790  1.1  skrll 	CLK_GATE("asrc_ipg", "ahb", CCM, CCGR0, ASRC_CLK_ENABLE),
    791  1.1  skrll 	CLK_GATE("asrc_mem", "ahb", CCM, CCGR0, ASRC_CLK_ENABLE),
    792  1.1  skrll 	CLK_GATE("caam_mem", "ahb", CCM, CCGR0, CAAM_SECURE_MEM_CLK_ENABLE),
    793  1.1  skrll 	CLK_GATE("caam_aclk", "ahb", CCM, CCGR0, CAAM_WRAPPER_ACLK_ENABLE),
    794  1.1  skrll 	CLK_GATE("caam_ipg", "ipg", CCM, CCGR0, CAAM_WRAPPER_IPG_ENABLE),
    795  1.1  skrll 	CLK_GATE("can1_ipg", "ipg", CCM, CCGR0, CAN1_CLK_ENABLE),
    796  1.1  skrll 	CLK_GATE("can1_serial", "can_root", CCM, CCGR0, CAN1_SERIAL_CLK_ENABLE),
    797  1.1  skrll 	CLK_GATE("can2_ipg", "ipg", CCM, CCGR0, CAN2_CLK_ENABLE),
    798  1.1  skrll 	CLK_GATE("can2_serial", "can_root", CCM, CCGR0, CAN2_SERIAL_CLK_ENABLE),
    799  1.1  skrll 	CLK_GATE("ecspi1", "ecspi_root", CCM, CCGR1, ECSPI1_CLK_ENABLE),
    800  1.1  skrll 	CLK_GATE("ecspi2", "ecspi_root", CCM, CCGR1, ECSPI2_CLK_ENABLE),
    801  1.1  skrll 	CLK_GATE("ecspi3", "ecspi_root", CCM, CCGR1, ECSPI3_CLK_ENABLE),
    802  1.1  skrll 	CLK_GATE("ecspi4", "ecspi_root", CCM, CCGR1, ECSPI4_CLK_ENABLE),
    803  1.1  skrll 	CLK_GATE("ecspi5", "ecspi_root", CCM, CCGR1, ECSPI5_CLK_ENABLE),
    804  1.1  skrll 	CLK_GATE("enet", "ipg", CCM, CCGR1, ENET_CLK_ENABLE),
    805  1.1  skrll 	CLK_GATE("esai_extal", "esai_podf", CCM, CCGR1, ESAI_CLK_ENABLE),
    806  1.1  skrll 	CLK_GATE("esai_ipg", "ahb", CCM, CCGR1, ESAI_CLK_ENABLE),
    807  1.1  skrll 	CLK_GATE("esai_mem", "ahb", CCM, CCGR1, ESAI_CLK_ENABLE),
    808  1.1  skrll 	CLK_GATE("gpt_ipg", "ipg", CCM, CCGR1, GPT_CLK_ENABLE),
    809  1.1  skrll 	CLK_GATE("gpt_ipg_per", "ipg_per", CCM, CCGR1, GPT_SERIAL_CLK_ENABLE),
    810  1.1  skrll 	CLK_GATE("gpu2d_core", "gpu2d_core_podf", CCM, CCGR1, GPU2D_CLK_ENABLE),
    811  1.1  skrll 	CLK_GATE("gpu3d_core", "gpu3d_core_podf", CCM, CCGR1, GPU3D_CLK_ENABLE),
    812  1.1  skrll 	CLK_GATE("hdmi_iahb", "ahb", CCM, CCGR2, HDMI_TX_IAHBCLK_ENABLE),
    813  1.1  skrll 	CLK_GATE("hdmi_isfr", "video_27m", CCM, CCGR2, HDMI_TX_ISFRCLK_ENABLE),
    814  1.1  skrll 	CLK_GATE("i2c1", "ipg_per", CCM, CCGR2, I2C1_SERIAL_CLK_ENABLE),
    815  1.1  skrll 	CLK_GATE("i2c2", "ipg_per", CCM, CCGR2, I2C2_SERIAL_CLK_ENABLE),
    816  1.1  skrll 	CLK_GATE("i2c3", "ipg_per", CCM, CCGR2, I2C3_SERIAL_CLK_ENABLE),
    817  1.1  skrll 	CLK_GATE("iim", "ipg", CCM, CCGR2, IIM_CLK_ENABLE),
    818  1.1  skrll 	CLK_GATE("enfc", "enfc_podf", CCM, CCGR2, IOMUX_IPT_CLK_IO_CLK_ENABLE),
    819  1.1  skrll 	CLK_GATE("vdoa", "vdo_axi", CCM, CCGR2, IPSYNC_VDOA_IPG_CLK_ENABLE),
    820  1.1  skrll 	CLK_GATE("ipu1", "ipu1_podf", CCM, CCGR3, IPU1_IPU_CLK_ENABLE),
    821  1.1  skrll 	CLK_GATE("ipu1_di0", "ipu1_di0_sel", CCM, CCGR3, IPU1_IPU_DI0_CLK_ENABLE),
    822  1.1  skrll 	CLK_GATE("ipu1_di1", "ipu1_di1_sel", CCM, CCGR3, IPU1_IPU_DI1_CLK_ENABLE),
    823  1.1  skrll 	CLK_GATE("ipu2", "ipu2_podf", CCM, CCGR3, IPU2_IPU_CLK_ENABLE),
    824  1.1  skrll 	CLK_GATE("ipu2_di0", "ipu2_di0_sel", CCM, CCGR3, IPU2_IPU_DI0_CLK_ENABLE),
    825  1.1  skrll 	CLK_GATE("ldb_di0", "ldb_di0_podf", CCM, CCGR3, LDB_DI0_CLK_ENABLE),
    826  1.1  skrll 	CLK_GATE("ldb_di1", "ldb_di1_podf", CCM, CCGR3, LDB_DI1_CLK_ENABLE),
    827  1.1  skrll 	CLK_GATE("ipu2_di1", "ipu2_di1_sel", CCM, CCGR3, IPU2_IPU_DI1_CLK_ENABLE),
    828  1.1  skrll 	CLK_GATE("hsi_tx", "hsi_tx_podf", CCM, CCGR3, MIPI_CORE_CFG_CLK_ENABLE),
    829  1.1  skrll 	CLK_GATE("mipi_core_cfg", "video_27m", CCM, CCGR3, MIPI_CORE_CFG_CLK_ENABLE),
    830  1.1  skrll 	CLK_GATE("mipi_ipg", "ipg", CCM, CCGR3, MIPI_CORE_CFG_CLK_ENABLE),
    831  1.1  skrll 	CLK_GATE("mlb", "axi", CCM, CCGR3, MLB_CLK_ENABLE),
    832  1.1  skrll 	CLK_GATE("mmdc_ch0_axi", "mmdc_ch0_axi_podf", CCM, CCGR3, MMDC_CORE_ACLK_FAST_CORE_P0_ENABLE),
    833  1.1  skrll 	CLK_GATE("mmdc_ch1_axi", "mmdc_ch1_axi_podf", CCM, CCGR3, MMDC_CORE_ACLK_FAST_CORE_P1_ENABLE),
    834  1.1  skrll 	CLK_GATE("ocram", "ahb", CCM, CCGR3, OCRAM_CLK_ENABLE),
    835  1.1  skrll 	CLK_GATE("openvg_axi", "axi", CCM, CCGR3, OPENVGAXICLK_CLK_ROOT_ENABLE),
    836  1.1  skrll 	CLK_GATE("pcie_axi", "pcie_axi_sel", CCM, CCGR4, PCIE_ROOT_ENABLE),
    837  1.1  skrll 	CLK_GATE("per1_bch", "usdhc3", CCM, CCGR4, PL301_MX6QPER1_BCHCLK_ENABLE),
    838  1.1  skrll 	CLK_GATE("pwm1", "ipg_per", CCM, CCGR4, PWM1_CLK_ENABLE),
    839  1.1  skrll 	CLK_GATE("pwm2", "ipg_per", CCM, CCGR4, PWM2_CLK_ENABLE),
    840  1.1  skrll 	CLK_GATE("pwm3", "ipg_per", CCM, CCGR4, PWM3_CLK_ENABLE),
    841  1.1  skrll 	CLK_GATE("pwm4", "ipg_per", CCM, CCGR4, PWM4_CLK_ENABLE),
    842  1.1  skrll 	CLK_GATE("gpmi_bch_apb", "usdhc3", CCM, CCGR4, RAWNAND_U_BCH_INPUT_APB_CLK_ENABLE),
    843  1.1  skrll 	CLK_GATE("gpmi_bch", "usdhc4", CCM, CCGR4, RAWNAND_U_GPMI_BCH_INPUT_BCH_CLK_ENABLE),
    844  1.1  skrll 	CLK_GATE("gpmi_io", "enfc", CCM, CCGR4, RAWNAND_U_GPMI_BCH_INPUT_GPMI_IO_CLK_ENABLE),
    845  1.1  skrll 	CLK_GATE("gpmi_apb", "usdhc3", CCM, CCGR4, RAWNAND_U_GPMI_INPUT_APB_CLK_ENABLE),
    846  1.1  skrll 	CLK_GATE("rom", "ahb", CCM, CCGR5, ROM_CLK_ENABLE),
    847  1.1  skrll 	CLK_GATE("sata", "ahb", CCM, CCGR5, SATA_CLK_ENABLE),
    848  1.1  skrll 	CLK_GATE("sdma", "ahb", CCM, CCGR5, SDMA_CLK_ENABLE),
    849  1.1  skrll 	CLK_GATE("spba", "ipg", CCM, CCGR5, SPBA_CLK_ENABLE),
    850  1.1  skrll 	CLK_GATE("spdif", "spdif_podf", CCM, CCGR5, SPDIF_CLK_ENABLE),
    851  1.1  skrll 	CLK_GATE("spdif_gclk", "ipg", CCM, CCGR5, SPDIF_CLK_ENABLE),
    852  1.1  skrll 	CLK_GATE("ssi1_ipg", "ipg", CCM, CCGR5, SSI1_CLK_ENABLE),
    853  1.1  skrll 	CLK_GATE("ssi2_ipg", "ipg", CCM, CCGR5, SSI2_CLK_ENABLE),
    854  1.1  skrll 	CLK_GATE("ssi3_ipg", "ipg", CCM, CCGR5, SSI3_CLK_ENABLE),
    855  1.1  skrll 	CLK_GATE("ssi1", "ssi1_podf", CCM, CCGR5, SSI1_CLK_ENABLE),
    856  1.1  skrll 	CLK_GATE("ssi2", "ssi2_podf", CCM, CCGR5, SSI2_CLK_ENABLE),
    857  1.1  skrll 	CLK_GATE("ssi3", "ssi3_podf", CCM, CCGR5, SSI3_CLK_ENABLE),
    858  1.1  skrll 	CLK_GATE("uart_ipg", "ipg", CCM, CCGR5, UART_CLK_ENABLE),
    859  1.1  skrll 	CLK_GATE("uart_serial", "uart_serial_podf", CCM, CCGR5, UART_SERIAL_CLK_ENABLE),
    860  1.1  skrll 	CLK_GATE("usboh3", "ipg", CCM, CCGR6, USBOH3_CLK_ENABLE),
    861  1.1  skrll 	CLK_GATE("usdhc1", "usdhc1_podf", CCM, CCGR6, USDHC1_CLK_ENABLE),
    862  1.1  skrll 	CLK_GATE("usdhc2", "usdhc2_podf", CCM, CCGR6, USDHC2_CLK_ENABLE),
    863  1.1  skrll 	CLK_GATE("usdhc3", "usdhc3_podf", CCM, CCGR6, USDHC3_CLK_ENABLE),
    864  1.1  skrll 	CLK_GATE("usdhc4", "usdhc4_podf", CCM, CCGR6, USDHC4_CLK_ENABLE),
    865  1.1  skrll 	CLK_GATE("eim_slow", "eim_slow_podf", CCM, CCGR6, EIM_SLOW_CLK_ENABLE),
    866  1.1  skrll 	CLK_GATE("vdo_axi", "vdo_axi_sel", CCM, CCGR6, VDOAXICLK_CLK_ENABLE),
    867  1.1  skrll 	CLK_GATE("vpu_axi", "vpu_axi_podf", CCM, CCGR6, VPU_CLK_ENABLE),
    868  1.1  skrll 	CLK_GATE("cko1", "cko1_podf", CCM, CCOSR, CLKO1_EN),
    869  1.1  skrll 	CLK_GATE("cko2", "cko2_podf", CCM, CCOSR, CLKO2_EN),
    870  1.1  skrll 
    871  1.1  skrll 	CLK_GATE("sata_ref_100m", "sata_ref", CCM_ANALOG, PLL_ENET, ENABLE_100M),
    872  1.1  skrll 	CLK_GATE("pcie_ref_125m", "pcie_ref", CCM_ANALOG, PLL_ENET, ENABLE_125M),
    873  1.1  skrll 
    874  1.1  skrll 	CLK_GATE("pll1_sys", "pll1_bypass", CCM_ANALOG, PLL_ARM, ENABLE),
    875  1.1  skrll 	CLK_GATE("pll2_bus", "pll2_bypass", CCM_ANALOG, PLL_SYS, ENABLE),
    876  1.1  skrll 	CLK_GATE("pll3_usb_otg", "pll3_bypass", CCM_ANALOG, PLL_USB1, ENABLE),
    877  1.1  skrll 	CLK_GATE("pll4_audio", "pll4_bypass", CCM_ANALOG, PLL_AUDIO, ENABLE),
    878  1.1  skrll 	CLK_GATE("pll5_video", "pll5_bypass", CCM_ANALOG, PLL_VIDEO, ENABLE),
    879  1.1  skrll 	CLK_GATE("pll6_enet", "pll6_bypass", CCM_ANALOG, PLL_ENET, ENABLE),
    880  1.1  skrll 	CLK_GATE("pll7_usb_host", "pll7_bypass", CCM_ANALOG, PLL_USB2, ENABLE),
    881  1.1  skrll 
    882  1.1  skrll 	CLK_GATE("usbphy1", "pll3_usb_otg", CCM_ANALOG, PLL_USB1, RESERVED),
    883  1.1  skrll 	CLK_GATE("usbphy2", "pll7_usb_host", CCM_ANALOG, PLL_USB2, RESERVED),
    884  1.1  skrll 
    885  1.1  skrll 	CLK_GATE_EXCLUSIVE("lvds1_gate", "lvds1_sel", CCM_ANALOG, MISC1, LVDS_CLK1_OBEN, LVDS_CLK1_IBEN),
    886  1.1  skrll 	CLK_GATE_EXCLUSIVE("lvds2_gate", "lvds2_sel", CCM_ANALOG, MISC1, LVDS_CLK2_OBEN, LVDS_CLK2_IBEN),
    887  1.1  skrll 	CLK_GATE_EXCLUSIVE("lvds1_in", "anaclk1", CCM_ANALOG, MISC1, LVDS_CLK1_IBEN, LVDS_CLK1_OBEN),
    888  1.1  skrll 	CLK_GATE_EXCLUSIVE("lvds2_in", "anaclk2", CCM_ANALOG, MISC1, LVDS_CLK2_IBEN, LVDS_CLK2_OBEN),
    889  1.1  skrll };
    890  1.1  skrll 
    891  1.1  skrll static struct imx6_clk *imx6_clk_find(const char *);
    892  1.1  skrll static struct imx6_clk *imx6_clk_find_by_id(u_int);
    893  1.1  skrll 
    894  1.1  skrll static void imxccm_init_clocks(struct imx6ccm_softc *);
    895  1.1  skrll static struct clk *imxccm_clk_get(void *, const char *);
    896  1.1  skrll static void imxccm_clk_put(void *, struct clk *);
    897  1.1  skrll static u_int imxccm_clk_get_rate(void *, struct clk *);
    898  1.1  skrll static int imxccm_clk_set_rate(void *, struct clk *, u_int);
    899  1.1  skrll static int imxccm_clk_enable(void *, struct clk *);
    900  1.1  skrll static int imxccm_clk_disable(void *, struct clk *);
    901  1.1  skrll static int imxccm_clk_set_parent(void *, struct clk *, struct clk *);
    902  1.1  skrll static struct clk *imxccm_clk_get_parent(void *, struct clk *);
    903  1.1  skrll 
    904  1.1  skrll static const struct clk_funcs imxccm_clk_funcs = {
    905  1.1  skrll 	.get = imxccm_clk_get,
    906  1.1  skrll 	.put = imxccm_clk_put,
    907  1.1  skrll 	.get_rate = imxccm_clk_get_rate,
    908  1.1  skrll 	.set_rate = imxccm_clk_set_rate,
    909  1.1  skrll 	.enable = imxccm_clk_enable,
    910  1.1  skrll 	.disable = imxccm_clk_disable,
    911  1.1  skrll 	.set_parent = imxccm_clk_set_parent,
    912  1.1  skrll 	.get_parent = imxccm_clk_get_parent,
    913  1.1  skrll };
    914  1.1  skrll 
    915  1.1  skrll void
    916  1.1  skrll imx6ccm_attach_common(device_t self)
    917  1.1  skrll {
    918  1.1  skrll 	struct imx6ccm_softc * const sc = device_private(self);
    919  1.1  skrll 
    920  1.1  skrll 	sc->sc_dev = self;
    921  1.1  skrll 
    922  1.1  skrll 	sc->sc_clkdom.name = device_xname(self);
    923  1.1  skrll 	sc->sc_clkdom.funcs = &imxccm_clk_funcs;
    924  1.1  skrll 	sc->sc_clkdom.priv = sc;
    925  1.1  skrll 	for (u_int n = 0; n < __arraycount(imx6_clks); n++) {
    926  1.1  skrll 		imx6_clks[n].base.domain = &sc->sc_clkdom;
    927  1.1  skrll 		clk_attach(&imx6_clks[n].base);
    928  1.1  skrll 	}
    929  1.1  skrll 
    930  1.1  skrll 	imxccm_init_clocks(sc);
    931  1.1  skrll 
    932  1.1  skrll 	for (int n = 0; n < __arraycount(imx6_clks); n++) {
    933  1.1  skrll 		struct clk *clk = &imx6_clks[n].base;
    934  1.1  skrll 		struct clk *clk_parent = clk_get_parent(clk);
    935  1.1  skrll 		const char *parent_str = clk_parent ? clk_parent->name : "none";
    936  1.1  skrll 		aprint_verbose_dev(self, "%s (%s) : %u Hz\n", clk->name,
    937  1.1  skrll 		    parent_str, clk_get_rate(clk));
    938  1.1  skrll 	}
    939  1.1  skrll }
    940  1.1  skrll 
    941  1.1  skrll struct clk *
    942  1.1  skrll imx6_get_clock(const char *name)
    943  1.1  skrll {
    944  1.1  skrll 	struct imx6_clk *iclk;
    945  1.1  skrll 	iclk = imx6_clk_find(name);
    946  1.1  skrll 
    947  1.1  skrll 	if (iclk == NULL)
    948  1.1  skrll 		return NULL;
    949  1.1  skrll 
    950  1.1  skrll 	return &iclk->base;
    951  1.1  skrll }
    952  1.1  skrll 
    953  1.1  skrll struct clk *
    954  1.1  skrll imx6_get_clock_by_id(u_int clock_id)
    955  1.1  skrll {
    956  1.1  skrll 	struct imx6_clk *iclk;
    957  1.1  skrll 	iclk = imx6_clk_find_by_id(clock_id);
    958  1.1  skrll 
    959  1.1  skrll 	if (iclk == NULL)
    960  1.1  skrll 		return NULL;
    961  1.1  skrll 
    962  1.1  skrll 	return &iclk->base;
    963  1.1  skrll }
    964  1.1  skrll 
    965  1.1  skrll static struct imx6_clk *
    966  1.1  skrll imx6_clk_find(const char *name)
    967  1.1  skrll {
    968  1.1  skrll 	if (name == NULL)
    969  1.1  skrll 		return NULL;
    970  1.1  skrll 
    971  1.1  skrll 	for (int n = 0; n < __arraycount(imx6_clks); n++) {
    972  1.1  skrll 		if (strcmp(imx6_clks[n].base.name, name) == 0)
    973  1.1  skrll 			return &imx6_clks[n];
    974  1.1  skrll 	}
    975  1.1  skrll 
    976  1.1  skrll 	return NULL;
    977  1.1  skrll }
    978  1.1  skrll 
    979  1.1  skrll static struct imx6_clk *
    980  1.1  skrll imx6_clk_find_by_id(u_int clock_id)
    981  1.1  skrll {
    982  1.1  skrll 	for (int n = 0; n < __arraycount(imx6_clock_ids); n++) {
    983  1.1  skrll 		if (imx6_clock_ids[n].id == clock_id) {
    984  1.1  skrll 			const char *name = imx6_clock_ids[n].name;
    985  1.1  skrll 			return imx6_clk_find(name);
    986  1.1  skrll 		}
    987  1.1  skrll 	}
    988  1.1  skrll 
    989  1.1  skrll 	return NULL;
    990  1.1  skrll }
    991  1.1  skrll 
    992  1.1  skrll struct imxccm_init_parent {
    993  1.1  skrll 	const char *clock;
    994  1.1  skrll 	const char *parent;
    995  1.1  skrll } imxccm_init_parents[] = {
    996  1.1  skrll 	{ "pll1_bypass",	"pll1" },
    997  1.1  skrll 	{ "pll2_bypass",	"pll2" },
    998  1.1  skrll 	{ "pll3_bypass",	"pll3" },
    999  1.1  skrll 	{ "pll4_bypass",	"pll4" },
   1000  1.1  skrll 	{ "pll5_bypass",	"pll5" },
   1001  1.1  skrll 	{ "pll6_bypass",	"pll6" },
   1002  1.1  skrll 	{ "pll7_bypass",	"pll7" },
   1003  1.1  skrll 	{ "lvds1_sel",		"sata_ref_100m" },
   1004  1.1  skrll };
   1005  1.1  skrll 
   1006  1.1  skrll static void
   1007  1.1  skrll imxccm_init_clocks(struct imx6ccm_softc *sc)
   1008  1.1  skrll {
   1009  1.1  skrll 	struct clk *clk;
   1010  1.1  skrll 	struct clk *clk_parent;
   1011  1.1  skrll 
   1012  1.1  skrll 	for (u_int n = 0; n < __arraycount(imxccm_init_parents); n++) {
   1013  1.1  skrll 		clk = clk_get(&sc->sc_clkdom, imxccm_init_parents[n].clock);
   1014  1.1  skrll 		KASSERT(clk != NULL);
   1015  1.1  skrll 		clk_parent = clk_get(&sc->sc_clkdom, imxccm_init_parents[n].parent);
   1016  1.1  skrll 		KASSERT(clk_parent != NULL);
   1017  1.1  skrll 
   1018  1.1  skrll 		int error = clk_set_parent(clk, clk_parent);
   1019  1.1  skrll 		if (error) {
   1020  1.1  skrll 			aprint_error_dev(sc->sc_dev,
   1021  1.1  skrll 			    "couldn't set '%s' parent to '%s': %d\n",
   1022  1.1  skrll 			    clk->name, clk_parent->name, error);
   1023  1.1  skrll 		}
   1024  1.1  skrll 		clk_put(clk_parent);
   1025  1.1  skrll 		clk_put(clk);
   1026  1.1  skrll 	}
   1027  1.1  skrll }
   1028  1.1  skrll 
   1029  1.1  skrll static u_int
   1030  1.1  skrll imxccm_clk_get_rate_pll_generic(struct imx6ccm_softc *sc, struct imx6_clk *iclk,
   1031  1.1  skrll     const u_int rate_parent)
   1032  1.1  skrll {
   1033  1.1  skrll 	struct imx6_clk_pll *pll = &iclk->clk.pll;
   1034  1.1  skrll 	uint64_t freq = rate_parent;
   1035  1.1  skrll 
   1036  1.1  skrll 	KASSERT((pll->type == IMX6_CLK_PLL_GENERIC) ||
   1037  1.1  skrll 	    (pll->type == IMX6_CLK_PLL_USB));
   1038  1.1  skrll 
   1039  1.1  skrll 	uint32_t v = bus_space_read_4(sc->sc_iot, sc->sc_ioh_analog, pll->reg);
   1040  1.1  skrll 	uint32_t div = __SHIFTOUT(v, pll->mask);
   1041  1.1  skrll 
   1042  1.1  skrll 	return freq * ((div == 1) ? 22 : 20);
   1043  1.1  skrll }
   1044  1.1  skrll 
   1045  1.1  skrll static u_int
   1046  1.1  skrll imxccm_clk_get_rate_pll_sys(struct imx6ccm_softc *sc, struct imx6_clk *iclk,
   1047  1.1  skrll     const u_int rate_parent)
   1048  1.1  skrll {
   1049  1.1  skrll 	struct imx6_clk_pll *pll = &iclk->clk.pll;
   1050  1.1  skrll 	uint64_t freq = rate_parent;
   1051  1.1  skrll 
   1052  1.1  skrll 	KASSERT(pll->type == IMX6_CLK_PLL_SYS);
   1053  1.1  skrll 
   1054  1.1  skrll 	uint32_t v = bus_space_read_4(sc->sc_iot, sc->sc_ioh_analog, pll->reg);
   1055  1.1  skrll 	uint32_t div = __SHIFTOUT(v, pll->mask);
   1056  1.1  skrll 
   1057  1.1  skrll 	return freq * div / 2;
   1058  1.1  skrll }
   1059  1.1  skrll 
   1060  1.1  skrll #define PLL_AUDIO_VIDEO_NUM_OFFSET	0x10
   1061  1.1  skrll #define PLL_AUDIO_VIDEO_DENOM_OFFSET	0x20
   1062  1.1  skrll 
   1063  1.1  skrll static u_int
   1064  1.1  skrll imxccm_clk_get_rate_pll_audio_video(struct imx6ccm_softc *sc,
   1065  1.1  skrll     struct imx6_clk *iclk, const u_int rate_parent)
   1066  1.1  skrll {
   1067  1.1  skrll 	struct imx6_clk_pll *pll = &iclk->clk.pll;
   1068  1.1  skrll 	uint64_t freq = rate_parent;
   1069  1.1  skrll 
   1070  1.1  skrll 	KASSERT(pll->type == IMX6_CLK_PLL_AUDIO_VIDEO);
   1071  1.1  skrll 
   1072  1.1  skrll 	uint32_t v = bus_space_read_4(sc->sc_iot, sc->sc_ioh_analog, pll->reg);
   1073  1.1  skrll 	uint32_t div = __SHIFTOUT(v, pll->mask);
   1074  1.1  skrll 	uint32_t num = bus_space_read_4(sc->sc_iot, sc->sc_ioh_analog,
   1075  1.1  skrll 	    pll->reg + PLL_AUDIO_VIDEO_NUM_OFFSET);
   1076  1.1  skrll 	uint32_t denom = bus_space_read_4(sc->sc_iot, sc->sc_ioh_analog,
   1077  1.1  skrll 	    pll->reg + PLL_AUDIO_VIDEO_DENOM_OFFSET);
   1078  1.1  skrll 
   1079  1.1  skrll 	uint64_t tmp = freq * num / denom;
   1080  1.1  skrll 
   1081  1.1  skrll 	return freq * div + tmp;
   1082  1.1  skrll }
   1083  1.1  skrll 
   1084  1.1  skrll static u_int
   1085  1.1  skrll imxccm_clk_get_rate_pll_enet(struct imx6ccm_softc *sc,
   1086  1.1  skrll     struct imx6_clk *iclk, const u_int rate_parent)
   1087  1.1  skrll {
   1088  1.1  skrll 	struct imx6_clk_pll *pll = &iclk->clk.pll;
   1089  1.1  skrll 
   1090  1.1  skrll 	KASSERT(pll->type == IMX6_CLK_PLL_ENET);
   1091  1.1  skrll 
   1092  1.1  skrll 	return pll->ref;
   1093  1.1  skrll }
   1094  1.1  skrll 
   1095  1.1  skrll static u_int
   1096  1.1  skrll imxccm_clk_get_rate_fixed_factor(struct imx6ccm_softc *sc, struct imx6_clk *iclk)
   1097  1.1  skrll {
   1098  1.1  skrll 	struct imx6_clk_fixed_factor *fixed_factor = &iclk->clk.fixed_factor;
   1099  1.1  skrll 	struct imx6_clk *parent;
   1100  1.1  skrll 
   1101  1.1  skrll 	KASSERT(iclk->type == IMX6_CLK_FIXED_FACTOR);
   1102  1.1  skrll 
   1103  1.1  skrll 	parent = imx6_clk_find(iclk->parent);
   1104  1.1  skrll 	KASSERT(parent != NULL);
   1105  1.1  skrll 
   1106  1.1  skrll 	uint64_t rate_parent = imxccm_clk_get_rate(sc, &parent->base);
   1107  1.1  skrll 
   1108  1.1  skrll 	return rate_parent * fixed_factor->mult / fixed_factor->div;
   1109  1.1  skrll }
   1110  1.1  skrll 
   1111  1.1  skrll static u_int
   1112  1.1  skrll imxccm_clk_get_rate_pll(struct imx6ccm_softc *sc, struct imx6_clk *iclk)
   1113  1.1  skrll {
   1114  1.1  skrll 	struct imx6_clk_pll *pll = &iclk->clk.pll;
   1115  1.1  skrll 	struct imx6_clk *parent;
   1116  1.1  skrll 
   1117  1.1  skrll 	KASSERT(iclk->type == IMX6_CLK_PLL);
   1118  1.1  skrll 
   1119  1.1  skrll 	parent = imx6_clk_find(iclk->parent);
   1120  1.1  skrll 	KASSERT(parent != NULL);
   1121  1.1  skrll 
   1122  1.1  skrll 	uint64_t rate_parent = imxccm_clk_get_rate(sc, &parent->base);
   1123  1.1  skrll 
   1124  1.1  skrll 	switch(pll->type) {
   1125  1.1  skrll 	case IMX6_CLK_PLL_GENERIC:
   1126  1.1  skrll 		return imxccm_clk_get_rate_pll_generic(sc, iclk, rate_parent);
   1127  1.1  skrll 	case IMX6_CLK_PLL_SYS:
   1128  1.1  skrll 		return imxccm_clk_get_rate_pll_sys(sc, iclk, rate_parent);
   1129  1.1  skrll 	case IMX6_CLK_PLL_USB:
   1130  1.1  skrll 		return imxccm_clk_get_rate_pll_generic(sc, iclk, rate_parent);
   1131  1.1  skrll 	case IMX6_CLK_PLL_AUDIO_VIDEO:
   1132  1.1  skrll 		return imxccm_clk_get_rate_pll_audio_video(sc, iclk, rate_parent);
   1133  1.1  skrll 	case IMX6_CLK_PLL_ENET:
   1134  1.1  skrll 		return imxccm_clk_get_rate_pll_enet(sc, iclk, rate_parent);
   1135  1.1  skrll 	default:
   1136  1.1  skrll 		panic("imx6: unknown pll type %d", iclk->type);
   1137  1.1  skrll 	}
   1138  1.1  skrll }
   1139  1.1  skrll 
   1140  1.1  skrll static u_int
   1141  1.1  skrll imxccm_clk_get_rate_div(struct imx6ccm_softc *sc, struct imx6_clk *iclk)
   1142  1.1  skrll {
   1143  1.1  skrll 	struct imx6_clk_div *div = &iclk->clk.div;
   1144  1.1  skrll 	struct imx6_clk *parent;
   1145  1.1  skrll 
   1146  1.1  skrll 	KASSERT(iclk->type == IMX6_CLK_DIV);
   1147  1.1  skrll 
   1148  1.1  skrll 	parent = imx6_clk_find(iclk->parent);
   1149  1.1  skrll 	KASSERT(parent != NULL);
   1150  1.1  skrll 
   1151  1.1  skrll 	u_int rate = imxccm_clk_get_rate(sc, &parent->base);
   1152  1.1  skrll 
   1153  1.1  skrll 	bus_space_handle_t ioh;
   1154  1.1  skrll 	if (div->base == IMX6_CLK_REG_CCM_ANALOG)
   1155  1.1  skrll 		ioh = sc->sc_ioh_analog;
   1156  1.1  skrll 	else
   1157  1.1  skrll 		ioh = sc->sc_ioh;
   1158  1.1  skrll 
   1159  1.1  skrll 	uint32_t v = bus_space_read_4(sc->sc_iot, ioh, div->reg);
   1160  1.1  skrll 	uint32_t n = __SHIFTOUT(v, div->mask);
   1161  1.1  skrll 
   1162  1.1  skrll 	if (div->type == IMX6_CLK_DIV_TABLE) {
   1163  1.1  skrll 		KASSERT(div->tbl != NULL);
   1164  1.1  skrll 
   1165  1.1  skrll 		for (int i = 0; div->tbl[i] != 0; i++)
   1166  1.1  skrll 			if (i == n)
   1167  1.1  skrll 				rate /= div->tbl[i];
   1168  1.1  skrll 	} else {
   1169  1.1  skrll 		rate /= n + 1;
   1170  1.1  skrll 	}
   1171  1.1  skrll 
   1172  1.1  skrll 	return rate;
   1173  1.1  skrll }
   1174  1.1  skrll 
   1175  1.1  skrll static u_int
   1176  1.1  skrll imxccm_clk_get_rate_pfd(struct imx6ccm_softc *sc, struct imx6_clk *iclk)
   1177  1.1  skrll {
   1178  1.1  skrll 	struct imx6_clk_pfd *pfd = &iclk->clk.pfd;
   1179  1.1  skrll 	struct imx6_clk *parent;
   1180  1.1  skrll 
   1181  1.1  skrll 	KASSERT(iclk->type == IMX6_CLK_PFD);
   1182  1.1  skrll 
   1183  1.1  skrll 	parent = imx6_clk_find(iclk->parent);
   1184  1.1  skrll 	KASSERT(parent != NULL);
   1185  1.1  skrll 
   1186  1.1  skrll 	uint64_t rate_parent = imxccm_clk_get_rate(sc, &parent->base);
   1187  1.1  skrll 
   1188  1.1  skrll 	uint32_t v = bus_space_read_4(sc->sc_iot, sc->sc_ioh_analog, pfd->reg);
   1189  1.1  skrll 	uint32_t n = __SHIFTOUT(v, __BITS(5, 0) << (pfd->index * 8));
   1190  1.1  skrll 
   1191  1.1  skrll 	KASSERT(n != 0);
   1192  1.1  skrll 
   1193  1.1  skrll 	return (rate_parent * 18) / n;
   1194  1.1  skrll }
   1195  1.1  skrll 
   1196  1.1  skrll static int
   1197  1.1  skrll imxccm_clk_mux_wait(struct imx6ccm_softc *sc, struct imx6_clk_mux *mux)
   1198  1.1  skrll {
   1199  1.1  skrll 	KASSERT(mux->busy_reg == 0);
   1200  1.1  skrll 	KASSERT(mux->busy_mask == 0);
   1201  1.1  skrll 
   1202  1.1  skrll 	bus_space_handle_t ioh;
   1203  1.1  skrll 	if (mux->base == IMX6_CLK_REG_CCM_ANALOG)
   1204  1.1  skrll 		ioh = sc->sc_ioh_analog;
   1205  1.1  skrll 	else
   1206  1.1  skrll 		ioh = sc->sc_ioh;
   1207  1.1  skrll 
   1208  1.1  skrll 	while (bus_space_read_4(sc->sc_iot, ioh, mux->busy_reg) & mux->busy_mask)
   1209  1.1  skrll 		delay(10);
   1210  1.1  skrll 
   1211  1.1  skrll 	return 0;
   1212  1.1  skrll }
   1213  1.1  skrll 
   1214  1.1  skrll static int
   1215  1.1  skrll imxccm_clk_set_parent_mux(struct imx6ccm_softc *sc,
   1216  1.1  skrll     struct imx6_clk *iclk, struct clk *parent)
   1217  1.1  skrll {
   1218  1.1  skrll 	struct imx6_clk_mux *mux = &iclk->clk.mux;
   1219  1.1  skrll 	const char *pname = parent->name;
   1220  1.1  skrll 	u_int sel;
   1221  1.1  skrll 
   1222  1.1  skrll 	KASSERT(iclk->type == IMX6_CLK_MUX);
   1223  1.1  skrll 
   1224  1.1  skrll 	for (sel = 0; sel < mux->nparents; sel++)
   1225  1.1  skrll 		if (strcmp(pname, mux->parents[sel]) == 0)
   1226  1.1  skrll 			break;
   1227  1.1  skrll 
   1228  1.1  skrll 	if (sel == mux->nparents)
   1229  1.1  skrll 		return EINVAL;
   1230  1.1  skrll 
   1231  1.1  skrll 	bus_space_handle_t ioh;
   1232  1.1  skrll 	if (mux->base == IMX6_CLK_REG_CCM_ANALOG)
   1233  1.1  skrll 		ioh = sc->sc_ioh_analog;
   1234  1.1  skrll 	else
   1235  1.1  skrll 		ioh = sc->sc_ioh;
   1236  1.1  skrll 
   1237  1.1  skrll 	uint32_t v = bus_space_read_4(sc->sc_iot, ioh, mux->reg);
   1238  1.1  skrll 	v &= ~mux->mask;
   1239  1.1  skrll 	v |= __SHIFTIN(sel, mux->mask);
   1240  1.1  skrll 
   1241  1.1  skrll 	bus_space_write_4(sc->sc_iot, ioh, mux->reg, v);
   1242  1.1  skrll 
   1243  1.1  skrll 	iclk->parent = pname;
   1244  1.1  skrll 
   1245  1.1  skrll 	if (mux->type == IMX6_CLK_MUX_BUSY)
   1246  1.1  skrll 		imxccm_clk_mux_wait(sc, mux);
   1247  1.1  skrll 
   1248  1.1  skrll 	return 0;
   1249  1.1  skrll }
   1250  1.1  skrll 
   1251  1.1  skrll static struct imx6_clk *
   1252  1.1  skrll imxccm_clk_get_parent_mux(struct imx6ccm_softc *sc, struct imx6_clk *iclk)
   1253  1.1  skrll {
   1254  1.1  skrll 	struct imx6_clk_mux *mux = &iclk->clk.mux;
   1255  1.1  skrll 
   1256  1.1  skrll 	KASSERT(iclk->type == IMX6_CLK_MUX);
   1257  1.1  skrll 
   1258  1.1  skrll 	bus_space_handle_t ioh;
   1259  1.1  skrll 	if (mux->base == IMX6_CLK_REG_CCM_ANALOG)
   1260  1.1  skrll 		ioh = sc->sc_ioh_analog;
   1261  1.1  skrll 	else
   1262  1.1  skrll 		ioh = sc->sc_ioh;
   1263  1.1  skrll 
   1264  1.1  skrll 	uint32_t v = bus_space_read_4(sc->sc_iot, ioh, mux->reg);
   1265  1.1  skrll 	u_int sel = __SHIFTOUT(v, mux->mask);
   1266  1.1  skrll 
   1267  1.1  skrll 	KASSERT(sel < mux->nparents);
   1268  1.1  skrll 
   1269  1.1  skrll 	iclk->parent = mux->parents[sel];
   1270  1.1  skrll 
   1271  1.1  skrll 	return imx6_clk_find(iclk->parent);
   1272  1.1  skrll }
   1273  1.1  skrll 
   1274  1.1  skrll static int
   1275  1.1  skrll imxccm_clk_set_rate_pll(struct imx6ccm_softc *sc,
   1276  1.1  skrll     struct imx6_clk *iclk, u_int rate)
   1277  1.1  skrll {
   1278  1.1  skrll 	/* ToDo */
   1279  1.1  skrll 
   1280  1.1  skrll 	return EOPNOTSUPP;
   1281  1.1  skrll }
   1282  1.1  skrll 
   1283  1.1  skrll static int
   1284  1.1  skrll imxccm_clk_set_rate_div(struct imx6ccm_softc *sc,
   1285  1.1  skrll     struct imx6_clk *iclk, u_int rate)
   1286  1.1  skrll {
   1287  1.1  skrll 	struct imx6_clk_div *div = &iclk->clk.div;
   1288  1.1  skrll 	struct imx6_clk *parent;
   1289  1.1  skrll 
   1290  1.1  skrll 	KASSERT(iclk->type == IMX6_CLK_DIV);
   1291  1.1  skrll 
   1292  1.1  skrll 	parent = imx6_clk_find(iclk->parent);
   1293  1.1  skrll 	KASSERT(parent != NULL);
   1294  1.1  skrll 
   1295  1.1  skrll 	u_int rate_parent = imxccm_clk_get_rate(sc, &parent->base);
   1296  1.1  skrll 	u_int divider = uimax(1, rate_parent / rate);
   1297  1.1  skrll 
   1298  1.1  skrll 	bus_space_handle_t ioh;
   1299  1.1  skrll 	if (div->base == IMX6_CLK_REG_CCM_ANALOG)
   1300  1.1  skrll 		ioh = sc->sc_ioh_analog;
   1301  1.1  skrll 	else
   1302  1.1  skrll 		ioh = sc->sc_ioh;
   1303  1.1  skrll 
   1304  1.1  skrll 	uint32_t v = bus_space_read_4(sc->sc_iot, ioh, div->reg);
   1305  1.1  skrll 	v &= ~div->mask;
   1306  1.1  skrll 	if (div->type == IMX6_CLK_DIV_TABLE) {
   1307  1.1  skrll 		int n = -1;
   1308  1.1  skrll 
   1309  1.1  skrll 		KASSERT(div->tbl != NULL);
   1310  1.1  skrll 		for (int i = 0; div->tbl[i] != 0; i++)
   1311  1.1  skrll 			if (div->tbl[i] == divider)
   1312  1.1  skrll 				n = i;
   1313  1.1  skrll 
   1314  1.1  skrll 		if (n >= 0)
   1315  1.1  skrll 			v |= __SHIFTIN(n, div->mask);
   1316  1.1  skrll 		else
   1317  1.1  skrll 			return EINVAL;
   1318  1.1  skrll 	} else {
   1319  1.1  skrll 		v |= __SHIFTIN(divider - 1, div->mask);
   1320  1.1  skrll 	}
   1321  1.1  skrll 	bus_space_write_4(sc->sc_iot, ioh, div->reg, v);
   1322  1.1  skrll 
   1323  1.1  skrll 	return 0;
   1324  1.1  skrll }
   1325  1.1  skrll 
   1326  1.1  skrll /*
   1327  1.1  skrll  * CLK Driver APIs
   1328  1.1  skrll  */
   1329  1.1  skrll static struct clk *
   1330  1.1  skrll imxccm_clk_get(void *priv, const char *name)
   1331  1.1  skrll {
   1332  1.1  skrll 	struct imx6_clk *iclk;
   1333  1.1  skrll 
   1334  1.1  skrll 	iclk = imx6_clk_find(name);
   1335  1.1  skrll 	if (iclk == NULL)
   1336  1.1  skrll 		return NULL;
   1337  1.1  skrll 
   1338  1.1  skrll 	atomic_inc_uint(&iclk->refcnt);
   1339  1.1  skrll 
   1340  1.1  skrll 	return &iclk->base;
   1341  1.1  skrll }
   1342  1.1  skrll 
   1343  1.1  skrll static void
   1344  1.1  skrll imxccm_clk_put(void *priv, struct clk *clk)
   1345  1.1  skrll {
   1346  1.1  skrll 	struct imx6_clk *iclk = (struct imx6_clk *)clk;
   1347  1.1  skrll 
   1348  1.1  skrll 	KASSERT(iclk->refcnt > 0);
   1349  1.1  skrll 
   1350  1.1  skrll 	atomic_dec_uint(&iclk->refcnt);
   1351  1.1  skrll }
   1352  1.1  skrll 
   1353  1.1  skrll static u_int
   1354  1.1  skrll imxccm_clk_get_rate(void *priv, struct clk *clk)
   1355  1.1  skrll {
   1356  1.1  skrll 	struct imx6_clk *iclk = (struct imx6_clk *)clk;
   1357  1.1  skrll 	struct clk *parent;
   1358  1.1  skrll 	struct imx6ccm_softc *sc = priv;
   1359  1.1  skrll 
   1360  1.1  skrll 	switch (iclk->type) {
   1361  1.1  skrll 	case IMX6_CLK_FIXED:
   1362  1.1  skrll 		return iclk->clk.fixed.rate;
   1363  1.1  skrll 	case IMX6_CLK_FIXED_FACTOR:
   1364  1.1  skrll 		return imxccm_clk_get_rate_fixed_factor(sc, iclk);
   1365  1.1  skrll 	case IMX6_CLK_PLL:
   1366  1.1  skrll 		return imxccm_clk_get_rate_pll(sc, iclk);
   1367  1.1  skrll 	case IMX6_CLK_MUX:
   1368  1.1  skrll 	case IMX6_CLK_GATE:
   1369  1.1  skrll 		parent = imxccm_clk_get_parent(sc, clk);
   1370  1.1  skrll 		return imxccm_clk_get_rate(sc, parent);
   1371  1.1  skrll 	case IMX6_CLK_DIV:
   1372  1.1  skrll 		return imxccm_clk_get_rate_div(sc, iclk);
   1373  1.1  skrll 	case IMX6_CLK_PFD:
   1374  1.1  skrll 		return imxccm_clk_get_rate_pfd(sc, iclk);
   1375  1.1  skrll 	default:
   1376  1.1  skrll 		panic("imx6: unknown clk type %d", iclk->type);
   1377  1.1  skrll 	}
   1378  1.1  skrll }
   1379  1.1  skrll 
   1380  1.1  skrll static int
   1381  1.1  skrll imxccm_clk_set_rate(void *priv, struct clk *clk, u_int rate)
   1382  1.1  skrll {
   1383  1.1  skrll 	struct imx6_clk *iclk = (struct imx6_clk *)clk;
   1384  1.1  skrll 	struct imx6ccm_softc *sc = priv;
   1385  1.1  skrll 
   1386  1.1  skrll 	switch (iclk->type) {
   1387  1.1  skrll 	case IMX6_CLK_FIXED:
   1388  1.1  skrll 	case IMX6_CLK_FIXED_FACTOR:
   1389  1.1  skrll 		return ENXIO;
   1390  1.1  skrll 	case IMX6_CLK_PLL:
   1391  1.1  skrll 		return imxccm_clk_set_rate_pll(sc, iclk, rate);
   1392  1.1  skrll 	case IMX6_CLK_MUX:
   1393  1.1  skrll 		return ENXIO;
   1394  1.1  skrll 	case IMX6_CLK_GATE:
   1395  1.1  skrll 		return ENXIO;
   1396  1.1  skrll 	case IMX6_CLK_DIV:
   1397  1.1  skrll 		return imxccm_clk_set_rate_div(sc, iclk, rate);
   1398  1.1  skrll 	case IMX6_CLK_PFD:
   1399  1.1  skrll 		return EINVAL;
   1400  1.1  skrll 	default:
   1401  1.1  skrll 		panic("imx6: unknown clk type %d", iclk->type);
   1402  1.1  skrll 	}
   1403  1.1  skrll }
   1404  1.1  skrll 
   1405  1.1  skrll static int
   1406  1.1  skrll imxccm_clk_enable_pll(struct imx6ccm_softc *sc, struct imx6_clk *iclk, bool enable)
   1407  1.1  skrll {
   1408  1.1  skrll 	struct imx6_clk_pll *pll = &iclk->clk.pll;
   1409  1.1  skrll 
   1410  1.1  skrll 	KASSERT(iclk->type == IMX6_CLK_PLL);
   1411  1.1  skrll 
   1412  1.1  skrll 	/* Power up bit */
   1413  1.1  skrll 	if (pll->type == IMX6_CLK_PLL_USB)
   1414  1.1  skrll 		enable = !enable;
   1415  1.1  skrll 
   1416  1.1  skrll 	bus_space_handle_t ioh = sc->sc_ioh_analog;
   1417  1.1  skrll 	uint32_t  v = bus_space_read_4(sc->sc_iot, ioh, pll->reg);
   1418  1.1  skrll 	if (__SHIFTOUT(v, pll->powerdown) != enable)
   1419  1.1  skrll 		return 0;
   1420  1.1  skrll 	if (enable)
   1421  1.1  skrll 		v &= ~pll->powerdown;
   1422  1.1  skrll 	else
   1423  1.1  skrll 		v |= pll->powerdown;
   1424  1.1  skrll 	bus_space_write_4(sc->sc_iot, ioh, pll->reg, v);
   1425  1.1  skrll 
   1426  1.1  skrll 	/* wait look */
   1427  1.1  skrll 	while (!(bus_space_read_4(sc->sc_iot, ioh, pll->reg) & CCM_ANALOG_PLL_LOCK))
   1428  1.1  skrll 		delay(10);
   1429  1.1  skrll 
   1430  1.1  skrll 	return 0;
   1431  1.1  skrll }
   1432  1.1  skrll 
   1433  1.1  skrll static int
   1434  1.1  skrll imxccm_clk_enable_gate(struct imx6ccm_softc *sc, struct imx6_clk *iclk, bool enable)
   1435  1.1  skrll {
   1436  1.1  skrll 	struct imx6_clk_gate *gate = &iclk->clk.gate;
   1437  1.1  skrll 
   1438  1.1  skrll 	KASSERT(iclk->type == IMX6_CLK_GATE);
   1439  1.1  skrll 
   1440  1.1  skrll 	bus_space_handle_t ioh;
   1441  1.1  skrll 	if (gate->base == IMX6_CLK_REG_CCM_ANALOG)
   1442  1.1  skrll 		ioh = sc->sc_ioh_analog;
   1443  1.1  skrll 	else
   1444  1.1  skrll 		ioh = sc->sc_ioh;
   1445  1.1  skrll 
   1446  1.1  skrll 	uint32_t v = bus_space_read_4(sc->sc_iot, ioh, gate->reg);
   1447  1.1  skrll 	if (enable) {
   1448  1.1  skrll 		if (gate->exclusive_mask)
   1449  1.1  skrll 			v &= ~gate->exclusive_mask;
   1450  1.1  skrll 		v |= gate->mask;
   1451  1.1  skrll 	} else {
   1452  1.1  skrll 		if (gate->exclusive_mask)
   1453  1.1  skrll 			v |= gate->exclusive_mask;
   1454  1.1  skrll 		v &= ~gate->mask;
   1455  1.1  skrll 	}
   1456  1.1  skrll 	bus_space_write_4(sc->sc_iot, ioh, gate->reg, v);
   1457  1.1  skrll 
   1458  1.1  skrll 	return 0;
   1459  1.1  skrll }
   1460  1.1  skrll 
   1461  1.1  skrll static int
   1462  1.1  skrll imxccm_clk_enable(void *priv, struct clk *clk)
   1463  1.1  skrll {
   1464  1.1  skrll 	struct imx6_clk *iclk = (struct imx6_clk *)clk;
   1465  1.1  skrll 	struct imx6_clk *parent = NULL;
   1466  1.1  skrll 	struct imx6ccm_softc *sc = priv;
   1467  1.1  skrll 
   1468  1.1  skrll 	if ((parent = imx6_clk_find(iclk->parent)) != NULL)
   1469  1.1  skrll 		imxccm_clk_enable(sc, &parent->base);
   1470  1.1  skrll 
   1471  1.1  skrll 	switch (iclk->type) {
   1472  1.1  skrll 	case IMX6_CLK_FIXED:
   1473  1.1  skrll 	case IMX6_CLK_FIXED_FACTOR:
   1474  1.1  skrll 		return 0;	/* always on */
   1475  1.1  skrll 	case IMX6_CLK_PLL:
   1476  1.1  skrll 		return imxccm_clk_enable_pll(sc, iclk, true);
   1477  1.1  skrll 	case IMX6_CLK_MUX:
   1478  1.1  skrll 	case IMX6_CLK_DIV:
   1479  1.1  skrll 	case IMX6_CLK_PFD:
   1480  1.1  skrll 		return 0;
   1481  1.1  skrll 	case IMX6_CLK_GATE:
   1482  1.1  skrll 		return imxccm_clk_enable_gate(sc, iclk, true);
   1483  1.1  skrll 	default:
   1484  1.1  skrll 		panic("imx6: unknown clk type %d", iclk->type);
   1485  1.1  skrll 	}
   1486  1.1  skrll }
   1487  1.1  skrll 
   1488  1.1  skrll static int
   1489  1.1  skrll imxccm_clk_disable(void *priv, struct clk *clk)
   1490  1.1  skrll {
   1491  1.1  skrll 	struct imx6_clk *iclk = (struct imx6_clk *)clk;
   1492  1.1  skrll 	struct imx6ccm_softc *sc = priv;
   1493  1.1  skrll 
   1494  1.1  skrll 	switch (iclk->type) {
   1495  1.1  skrll 	case IMX6_CLK_FIXED:
   1496  1.1  skrll 	case IMX6_CLK_FIXED_FACTOR:
   1497  1.1  skrll 		return EINVAL;	/* always on */
   1498  1.1  skrll 	case IMX6_CLK_PLL:
   1499  1.1  skrll 		return imxccm_clk_enable_pll(sc, iclk, false);
   1500  1.1  skrll 	case IMX6_CLK_MUX:
   1501  1.1  skrll 	case IMX6_CLK_DIV:
   1502  1.1  skrll 	case IMX6_CLK_PFD:
   1503  1.1  skrll 		return EINVAL;
   1504  1.1  skrll 	case IMX6_CLK_GATE:
   1505  1.1  skrll 		return imxccm_clk_enable_gate(sc, iclk, false);
   1506  1.1  skrll 	default:
   1507  1.1  skrll 		panic("imx6: unknown clk type %d", iclk->type);
   1508  1.1  skrll 	}
   1509  1.1  skrll }
   1510  1.1  skrll 
   1511  1.1  skrll static int
   1512  1.1  skrll imxccm_clk_set_parent(void *priv, struct clk *clk, struct clk *parent)
   1513  1.1  skrll {
   1514  1.1  skrll 	struct imx6_clk *iclk = (struct imx6_clk *)clk;
   1515  1.1  skrll 	struct imx6ccm_softc *sc = priv;
   1516  1.1  skrll 
   1517  1.1  skrll 	switch (iclk->type) {
   1518  1.1  skrll 	case IMX6_CLK_FIXED:
   1519  1.1  skrll 	case IMX6_CLK_FIXED_FACTOR:
   1520  1.1  skrll 	case IMX6_CLK_PLL:
   1521  1.1  skrll 	case IMX6_CLK_GATE:
   1522  1.1  skrll 	case IMX6_CLK_DIV:
   1523  1.1  skrll 	case IMX6_CLK_PFD:
   1524  1.1  skrll 		return EINVAL;
   1525  1.1  skrll 	case IMX6_CLK_MUX:
   1526  1.1  skrll 		return imxccm_clk_set_parent_mux(sc, iclk, parent);
   1527  1.1  skrll 	default:
   1528  1.1  skrll 		panic("imx6: unknown clk type %d", iclk->type);
   1529  1.1  skrll 	}
   1530  1.1  skrll }
   1531  1.1  skrll 
   1532  1.1  skrll static struct clk *
   1533  1.1  skrll imxccm_clk_get_parent(void *priv, struct clk *clk)
   1534  1.1  skrll {
   1535  1.1  skrll 	struct imx6_clk *iclk = (struct imx6_clk *)clk;
   1536  1.1  skrll 	struct imx6_clk *parent = NULL;
   1537  1.1  skrll 	struct imx6ccm_softc *sc = priv;
   1538  1.1  skrll 
   1539  1.1  skrll 	switch (iclk->type) {
   1540  1.1  skrll 	case IMX6_CLK_FIXED:
   1541  1.1  skrll 	case IMX6_CLK_FIXED_FACTOR:
   1542  1.1  skrll 	case IMX6_CLK_PLL:
   1543  1.1  skrll 	case IMX6_CLK_GATE:
   1544  1.1  skrll 	case IMX6_CLK_DIV:
   1545  1.1  skrll 	case IMX6_CLK_PFD:
   1546  1.1  skrll 		if (iclk->parent != NULL)
   1547  1.1  skrll 			parent = imx6_clk_find(iclk->parent);
   1548  1.1  skrll 		break;
   1549  1.1  skrll 	case IMX6_CLK_MUX:
   1550  1.1  skrll 		parent = imxccm_clk_get_parent_mux(sc, iclk);
   1551  1.1  skrll 		break;
   1552  1.1  skrll 	default:
   1553  1.1  skrll 		panic("imx6: unknown clk type %d", iclk->type);
   1554  1.1  skrll 	}
   1555  1.1  skrll 
   1556  1.1  skrll 	return (struct clk *)parent;
   1557  1.1  skrll }
   1558