| /* |
| * Copyright (c) 2013 Samsung Electronics Co., Ltd. |
| * Authors: Thomas Abraham <thomas.ab@samsung.com> |
| * Chander Kashyap <k.chander@samsung.com> |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 as |
| * published by the Free Software Foundation. |
| * |
| * Common Clock Framework support for Exynos7872 SoC. |
| */ |
| |
| #include <linux/clk.h> |
| #include <linux/clkdev.h> |
| #include <linux/clk-provider.h> |
| #include <linux/of.h> |
| #include <linux/of_address.h> |
| #include <soc/samsung/cal-if.h> |
| #include <dt-bindings/clock/exynos7872.h> |
| |
| #include "../../soc/samsung/cal-if/exynos7872/cmucal-vclk.h" |
| #include "../../soc/samsung/cal-if/exynos7872/cmucal-node.h" |
| #include "../../soc/samsung/cal-if/exynos7872/cmucal-qch.h" |
| #include "../../soc/samsung/cal-if/exynos7872/clkout_exynos7872.h" |
| #include "composite.h" |
| |
| static struct samsung_clk_provider *exynos7872_clk_provider; |
| /* |
| * list of controller registers to be saved and restored during a |
| * suspend/resume cycle. |
| */ |
| /* fixed rate clocks generated outside the soc */ |
| struct samsung_fixed_rate exynos7872_fixed_rate_ext_clks[] __initdata = { |
| FRATE(OSCCLK, "fin_pll", NULL, CLK_IS_ROOT, 26000000), |
| }; |
| |
| struct init_vclk exynos7872_apm_hwacg_vclks[] __initdata = { |
| HWACG_VCLK(UMUX_CLKCMU_APM_BUS, MUX_CLKCMU_APM_BUS_USER, "UMUX_CLKCMU_APM_BUS", NULL, 0, VCLK_GATE, NULL), |
| |
| HWACG_VCLK(GATE_APM_SYS, APM_QCH_SYS, "GATE_APM_SYS", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_APM_CPU, APM_QCH_CPU, "GATE_APM_CPU", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_MAILBOX_APM2AP, MAILBOX_APM2AP_QCH, "GATE_MAILBOX_APM2AP", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_MAILBOX_APM2CP, MAILBOX_APM2CP_QCH, "GATE_MAILBOX_APM2CP", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_MAILBOX_APM2GNSS, MAILBOX_APM2GNSS_QCH, "GATE_MAILBOX_APM2GNSS", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_MAILBOX_APM2WLBT, MAILBOX_APM2WLBT_QCH, "GATE_MAILBOX_APM2WLBT", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_I2C_APM, I2C_APM_QCH, "GATE_I2C_APM", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_SPEEDY_APM, SPEEDY_QCH, "GATE_SPEEDY_APM", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_WDT_APM, WDT_APM_QCH, "GATE_WDT_APM", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), |
| }; |
| |
| struct init_vclk exynos7872_cmu_hwacg_vclks[] __initdata = { |
| HWACG_VCLK(GATE_DFTMUX_TOP_CIS_CLK0, DFTMUX_TOP_QCH_CLK_CSIS0, "GATE_DFTMUX_TOP_CIS_CLK0", NULL, 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_DFTMUX_TOP_CIS_CLK1, DFTMUX_TOP_QCH_CLK_CSIS1, "GATE_DFTMUX_TOP_CIS_CLK1", NULL, 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_DFTMUX_TOP_CIS_CLK2, DFTMUX_TOP_QCH_CLK_CSIS2, "GATE_DFTMUX_TOP_CIS_CLK2", NULL, 0, VCLK_GATE, NULL), |
| }; |
| |
| struct init_vclk exynos7872_dispaud_hwacg_vclks[] __initdata = { |
| HWACG_VCLK(UMUX_CLKCMU_DISPAUD_BUS, MUX_CLKCMU_DISPAUD_BUS_USER, "UMUX_CLKCMU_DISPAUD_BUS", NULL, 0, VCLK_GATE, NULL), |
| |
| HWACG_VCLK(GATE_ABOX_ABOX, ABOX_QCH_ABOX, "GATE_ABOX_ABOX", NULL, 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_ABOX_CPU, ABOX_QCH_CPU, "GATE_ABOX_CPU", NULL, 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_ABOX_BUS, ABOX_QCH_BUS, "GATE_ABOX_BUS", NULL, 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_UAIF0, ABOX_QCH_UAIF0, "GATE_UAIF0", NULL, 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_UAIF2, ABOX_QCH_UAIF2, "GATE_UAIF2", NULL, 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_UAIF3, ABOX_QCH_UAIF3, "GATE_UAIF3", NULL, 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_FM, ABOX_QCH_FM, "GATE_FM", NULL, 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_WDT_ABOXCPU, WDT_ABOXCPU_QCH, "GATE_WDT_ABOXCPU", NULL, 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_DPU_DPP, DPU_QCH_DPP, "GATE_DPU_DPP", "UMUX_CLKCMU_DISPAUD_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_DPU_DMA, DPU_QCH_DMA, "GATE_DPU_DMA", "UMUX_CLKCMU_DISPAUD_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_DPU_DECON0, DPU_QCH_DECON0, "GATE_DPU_QCH_DECON0", "UMUX_CLKCMU_DISPAUD_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_SMMU_ABOX, SMMU_ABOX_QCH, "GATE_SMMU_ABOX", NULL, 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_SMMU_DPU, SMMU_DPU_QCH, "GATE_SMMU_DPU", "UMUX_CLKCMU_DISPAUD_BUS", 0, VCLK_GATE, NULL), |
| }; |
| |
| struct init_vclk exynos7872_fsys_hwacg_vclks[] __initdata = { |
| HWACG_VCLK(UMUX_CLKCMU_FSYS_BUS, MUX_CLKCMU_FSYS_BUS_USER, "UMUX_CLKCMU_FSYS_BUS", NULL, 0, VCLK_GATE, NULL), |
| HWACG_VCLK(UMUX_CLKCMU_FSYS_MMC_CARD, MUX_CLKCMU_FSYS_MMC_CARD_USER, "UMUX_CLKCMU_FSYS_MMC_CARD", "UMUX_CLKCMU_FSYS_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(UMUX_CLKCMU_FSYS_MMC_EMBD, MUX_CLKCMU_FSYS_MMC_EMBD_USER, "UMUX_CLKCMU_FSYS_MMC_EMBD", "UMUX_CLKCMU_FSYS_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(UMUX_CLKCMU_FSYS_MMC_SDIO, MUX_CLKCMU_FSYS_MMC_SDIO_USER, "UMUX_CLKCMU_FSYS_MMC_SDIO", "UMUX_CLKCMU_FSYS_BUS", 0, VCLK_GATE, NULL), |
| |
| HWACG_VCLK(GATE_MMC_CARD, MMC_CARD_QCH, "GATE_MMC_CARD", "UMUX_CLKCMU_FSYS_MMC_CARD", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_MMC_EMBD, MMC_EMBD_QCH, "GATE_MMC_EMBD", "UMUX_CLKCMU_FSYS_MMC_EMBD", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_MMC_SDIO, MMC_SDIO_QCH, "GATE_MMC_SDIO", "UMUX_CLKCMU_FSYS_MMC_SDIO", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_RTIC, RTIC_QCH, "GATE_RTIC", "UMUX_CLKCMU_FSYS_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_SSS, SSS_QCH, "GATE_SSS", "UMUX_CLKCMU_FSYS_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_USB20DRD_HSDRD, USB20DRD_QCH_HSDRD, "GATE_USB20DRD_HSDRD", "UMUX_CLKCMU_FSYS_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_USB20DRD_USB, USB20DRD_QCH_USB, "GATE_USB20DRD_USB", "UMUX_CLKCMU_FSYS_BUS", 0, VCLK_GATE, NULL), |
| }; |
| |
| struct init_vclk exynos7872_g3d_hwacg_vclks[] __initdata = { |
| HWACG_VCLK(GATE_AGPU_G3D, AGPU_QCH, "GATE_AGPU_G3D", NULL, 0, VCLK_GATE, NULL), |
| }; |
| |
| struct init_vclk exynos7872_isp_hwacg_vclks[] __initdata = { |
| HWACG_VCLK(UMUX_CLKCMU_IS_VRA, MUX_CLKCMU_IS_VRA_USER, "UMUX_CLKCMU_IS_VRA", NULL, 0, VCLK_GATE, NULL), |
| HWACG_VCLK(UMUX_CLKCMU_IS_ISP, MUX_CLKCMU_IS_ISP_USER, "UMUX_CLKCMU_IS_ISP", NULL, 0, VCLK_GATE, NULL), |
| HWACG_VCLK(UMUX_CLKCMU_IS_3AA, MUX_CLKCMU_IS_3AA_USER, "UMUX_CLKCMU_IS_3AA", NULL, 0, VCLK_GATE, NULL), |
| HWACG_VCLK(UMUX_CLKCMU_IS_TPU, MUX_CLKCMU_IS_TPU_USER, "UMUX_CLKCMU_IS_TPU", NULL, 0, VCLK_GATE, NULL), |
| |
| HWACG_VCLK(GATE_IS5P15P0_IS_ISP, IS5P15P0_IS_QCH_ISP, "GATE_IS5P15P0_IS_ISP", "UMUX_CLKCMU_IS_ISP", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_IS5P15P0_IS_MCSC, IS5P15P0_IS_QCH_MCSC, "GATE_IS5P15P0_IS_MCSC", "UMUX_CLKCMU_IS_ISP", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_IS5P15P0_IS_VRA, IS5P15P0_IS_QCH_VRA, "GATE_IS5P15P0_IS_VRA", "UMUX_CLKCMU_IS_VRA", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_IS5P15P0_IS_CSIS_0, IS5P15P0_IS_QCH_CSIS_0, "GATE_IS5P15P0_IS_CSIS_0", "UMUX_CLKCMU_IS_3AA", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_IS5P15P0_IS_CSIS_1, IS5P15P0_IS_QCH_CSIS_1, "GATE_IS5P15P0_IS_CSIS_1", "UMUX_CLKCMU_IS_3AA", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_IS5P15P0_IS_IS_3AA, IS5P15P0_IS_QCH_IS_3AA, "GATE_IS5P15P0_IS_IS_3AA", "UMUX_CLKCMU_IS_3AA", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_IS5P15P0_IS_TPU, IS5P15P0_IS_QCH_TPU, "GATE_IS5P15P0_IS_TPU", "UMUX_CLKCMU_IS_TPU", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_IS5P15P0_IS_CSIS_DMA, IS5P15P0_IS_QCH_CSIS_DMA, "GATE_IS5P15P0_IS_CSIS_DMA", "UMUX_CLKCMU_IS_3AA", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_SMMU_IS, SMMU_IS_QCH, "GATE_SMMU_IS", "UMUX_CLKCMU_IS_3AA", 0, VCLK_GATE, NULL), |
| }; |
| |
| struct init_vclk exynos7872_mfcmscl_hwacg_vclks[] __initdata = { |
| HWACG_VCLK(UMUX_CLKCMU_MFCMSCL_MSCL, MUX_CLKCMU_MFCMSCL_MSCL_USER, "UMUX_CLKCMU_MFCMSCL_MSCL", NULL, 0, VCLK_GATE, NULL), |
| HWACG_VCLK(UMUX_CLKCMU_MFCMSCL_MFC, MUX_CLKCMU_MFCMSCL_MFC_USER, "UMUX_CLKCMU_MFCMSCL_MFC","UMUX_CLKCMU_MFCMSCL_MSCL", 0, VCLK_GATE, NULL), |
| |
| HWACG_VCLK(GATE_G2D, G2D_QCH, "GATE_G2D", "UMUX_CLKCMU_MFCMSCL_MSCL", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_JPEG, JPEG_QCH, "GATE_JPEG", "UMUX_CLKCMU_MFCMSCL_MSCL", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_MFC, MFC_QCH, "GATE_MFC", "UMUX_CLKCMU_MFCMSCL_MFC", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_MSCL, MSCL_QCH, "GATE_MSCL", "UMUX_CLKCMU_MFCMSCL_MSCL", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_SMMU_MFCMSCL, SMMU_MFCMSCL_QCH, "GATE_SMMU_MFCMSCL", "UMUX_CLKCMU_MFCMSCL_MSCL", 0, VCLK_GATE, NULL), |
| }; |
| |
| struct init_vclk exynos7872_mif_hwacg_vclks[] __initdata = { |
| HWACG_VCLK(GATE_WRAP_ADC_IF_0, WRAP_ADC_IF_QCH_0, "GATE_WRAP_ADC_IF_0", NULL, 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_WRAP_ADC_IF_1, WRAP_ADC_IF_QCH_1, "GATE_WRAP_ADC_IF_1", NULL, 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_PDMA, PDMA_CORE_QCH, "GATE_PDMA", NULL, 0, VCLK_GATE, NULL), |
| }; |
| |
| struct init_vclk exynos7872_peri_hwacg_vclks[] __initdata = { |
| HWACG_VCLK(UMUX_CLKCMU_PERI_BUS, MUX_CLKCMU_PERI_BUS_USER, "UMUX_CLKCMU_PERI_BUS", NULL, 0, VCLK_GATE, NULL), |
| HWACG_VCLK(UMUX_CLKCMU_PERI_UART_0, MUX_CLKCMU_PERI_UART_0_USER, "UMUX_CLKCMU_PERI_UART_0", "UMUX_CLKCMU_PERI_BUS_USER", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(UMUX_CLKCMU_PERI_UART_1, MUX_CLKCMU_PERI_UART_1_USER, "UMUX_CLKCMU_PERI_UART_1", "UMUX_CLKCMU_PERI_BUS_USER", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(UMUX_CLKCMU_PERI_UART_2, MUX_CLKCMU_PERI_UART_2_USER, "UMUX_CLKCMU_PERI_UART_2", "UMUX_CLKCMU_PERI_BUS_USER", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(UMUX_CLKCMU_PERI_USI0, MUX_CLKCMU_PERI_USI0_USER, "UMUX_CLKCMU_PERI_USI0", "UMUX_CLKCMU_PERI_BUS_USER", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(UMUX_CLKCMU_PERI_USI1, MUX_CLKCMU_PERI_USI1_USER, "UMUX_CLKCMU_PERI_USI1", "UMUX_CLKCMU_PERI_BUS_USER", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(UMUX_CLKCMU_PERI_USI2, MUX_CLKCMU_PERI_USI2_USER, "UMUX_CLKCMU_PERI_USI2", "UMUX_CLKCMU_PERI_BUS_USER", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(UMUX_CLKCMU_PERI_SPI0, MUX_CLKCMU_PERI_SPI0_USER, "UMUX_CLKCMU_PERI_SPI0", "UMUX_CLKCMU_PERI_BUS_USER", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(UMUX_CLKCMU_PERI_SPI1, MUX_CLKCMU_PERI_SPI1_USER, "UMUX_CLKCMU_PERI_SPI1", "UMUX_CLKCMU_PERI_BUS_USER", 0, VCLK_GATE, NULL), |
| |
| HWACG_VCLK(GATE_BUSIF_TMU, BUSIF_TMU_QCH, "GATE_BUSIF_TMU", "UMUX_CLKCMU_PERI_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_PWM_MOTOR, LBLK_PERIC_QCH_PWM_MOTOR, "GATE_PWM_MOTOR", "UMUX_CLKCMU_PERI_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_I2C0, LBLK_PERIC_QCH_I2C0, "GATE_I2C0", "UMUX_CLKCMU_PERI_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_I2C1, LBLK_PERIC_QCH_I2C1, "GATE_I2C1", "UMUX_CLKCMU_PERI_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_I2C2, LBLK_PERIC_QCH_I2C2, "GATE_I2C2", "UMUX_CLKCMU_PERI_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_I2C3, LBLK_PERIC_QCH_I2C3, "GATE_I2C3", "UMUX_CLKCMU_PERI_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_I2C4, LBLK_PERIC_QCH_I2C4, "GATE_I2C4", "UMUX_CLKCMU_PERI_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_I2C5, LBLK_PERIC_QCH_I2C5, "GATE_I2C5", "UMUX_CLKCMU_PERI_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_I2C6, LBLK_PERIC_QCH_I2C6, "GATE_I2C6", "UMUX_CLKCMU_PERI_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_SPI0, LBLK_PERIC_QCH_SPI0, "GATE_SPI0", "UMUX_CLKCMU_PERI_SPI0", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_SPI1, LBLK_PERIC_QCH_SPI1, "GATE_SPI1", "UMUX_CLKCMU_PERI_SPI1", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_HSI2C0, LBLK_PERIC_QCH_HSI2C0, "GATE_HSI2C0", "UMUX_CLKCMU_PERI_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_HSI2C1, LBLK_PERIC_QCH_HSI2C1, "GATE_HSI2C1", "UMUX_CLKCMU_PERI_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_HSI2C2, LBLK_PERIC_QCH_HSI2C2, "GATE_HSI2C2", "UMUX_CLKCMU_PERI_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_HSI2C3, LBLK_PERIC_QCH_HSI2C3, "GATE_HSI2C3", "UMUX_CLKCMU_PERI_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_USI0, LBLK_PERIC_QCH_USI0, "GATE_USI0", "UMUX_CLKCMU_PERI_USI0", 0, VCLK_GATE | VCLK_QCH_DIS, NULL), |
| HWACG_VCLK(GATE_USI1, LBLK_PERIC_QCH_USI1, "GATE_USI1", "UMUX_CLKCMU_PERI_USI1", 0, VCLK_GATE | VCLK_QCH_DIS, NULL), |
| HWACG_VCLK(GATE_USI2, LBLK_PERIC_QCH_USI2, "GATE_USI2", "UMUX_CLKCMU_PERI_USI2", 0, VCLK_GATE | VCLK_QCH_DIS, NULL), |
| HWACG_VCLK(GATE_UART0, LBLK_PERIC_QCH_UART0, "GATE_UART0", "UMUX_CLKCMU_PERI_UART_0", 0, VCLK_GATE, "console-pclk0"), |
| HWACG_VCLK(GATE_UART1, LBLK_PERIC_QCH_UART1, "GATE_UART1", "UMUX_CLKCMU_PERI_UART_1", 0, VCLK_GATE, "console-pclk1"), |
| HWACG_VCLK(GATE_UART2, LBLK_PERIC_QCH_UART2, "GATE_UART2", "UMUX_CLKCMU_PERI_UART_2", 0, VCLK_GATE, "console-pclk2"), |
| HWACG_VCLK(GATE_MCT, MCT_QCH, "GATE_MCT", "UMUX_CLKCMU_PERI_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_OTP_CON_TOP, OTP_CON_TOP_QCH, "GATE_OTP_CON_TOP", "UMUX_CLKCMU_PERI_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_SECUCON, SECUCON_QCH, "GATE_SECUCON", "UMUX_CLKCMU_PERI_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_WDT_CLUSTER0, WDT_CLUSTER0_QCH, "GATE_WDT_CLUSTER0", "UMUX_CLKCMU_PERI_BUS", 0, VCLK_GATE, NULL), |
| HWACG_VCLK(GATE_WDT_CLUSTER1, WDT_CLUSTER1_QCH, "GATE_WDT_CLUSTER1", "UMUX_CLKCMU_PERI_BUS", 0, VCLK_GATE, NULL), |
| }; |
| |
| static struct init_vclk exynos7872_clkout_vclks[] __initdata = { |
| VCLK(OSCCLK_NFC, VCLK_CLKOUT1, "OSCCLK_NFC", 0, 0, NULL), |
| VCLK(OSCCLK_AUD, VCLK_CLKOUT0, "OSCCLK_AUD", 0, 0, NULL), |
| }; |
| |
| /* Special VCLK */ |
| struct init_vclk exynos7872_fsys_vclks[] __initdata = { |
| VCLK(MMC_EMBD, VCLK_SPL_CLK_FSYS_MMC_EMBD_BLK_CMU, "MMC_EMBD", 0, 0, NULL), |
| VCLK(MMC_CARD, VCLK_SPL_CLK_FSYS_MMC_CARD_BLK_CMU, "MMC_CARD", 0, 0, NULL), |
| VCLK(MMC_SDIO, VCLK_SPL_CLK_FSYS_MMC_SDIO_BLK_CMU, "MMC_SDIO", 0, 0, NULL), |
| VCLK(WIFI2AP_USBPLL, VCLK_WPLL_USBPLL, "WIFI2AP_USBPLL", 0, 0, NULL), |
| }; |
| |
| struct init_vclk exynos7872_cmu_vclks[] __initdata = { |
| VCLK(CIS_CLK0, VCLK_CLKCMU_CIS_CLK0_BLK_CMU, "CIS_CLK0", 0, 0, NULL), |
| VCLK(CIS_CLK1, VCLK_CLKCMU_CIS_CLK1_BLK_CMU, "CIS_CLK1", 0, 0, NULL), |
| VCLK(CIS_CLK2, VCLK_CLKCMU_CIS_CLK2_BLK_CMU, "CIS_CLK2", 0, 0, NULL), |
| }; |
| |
| struct init_vclk exynos7872_peri_vclks[] __initdata = { |
| VCLK(UART_0, VCLK_SPL_CLK_PERI_UART_0_BLK_CMU, "UART_0", 0, 0, "console-sclk0"), |
| VCLK(UART_1, VCLK_SPL_CLK_PERI_UART_1_BLK_CMU, "UART_1", 0, 0, "console-sclk1"), |
| VCLK(UART_2, VCLK_SPL_CLK_PERI_UART_2_BLK_CMU, "UART_2", 0, 0, "console-sclk2"), |
| VCLK(SPI_0, VCLK_SPL_CLK_PERI_SPI_0_BLK_CMU, "SPI_0", 0, 0, NULL), |
| VCLK(SPI_1, VCLK_SPL_CLK_PERI_SPI_1_BLK_CMU, "SPI_1", 0, 0, NULL), |
| VCLK(USI0, VCLK_SPL_CLK_PERI_USI0_BLK_CMU, "USI0", 0, 0, NULL), |
| VCLK(USI1, VCLK_SPL_CLK_PERI_USI1_BLK_CMU, "USI1", 0, 0, NULL), |
| VCLK(USI2, VCLK_SPL_CLK_PERI_USI2_BLK_CMU, "USI2", 0, 0, NULL), |
| }; |
| |
| struct init_vclk exynos7872_dispaud_vclks[] __initdata = { |
| VCLK(DOUT_CLK_ABOX_AUDIF, DIV_CLK_AUD_AUDIF, "DOUT_CLK_ABOX_AUDIF", 0, 0, NULL), |
| VCLK(DOUT_CLK_ABOX_UAIF0, DIV_CLK_AUD_UAIF0, "DOUT_CLK_ABOX_UAIF0", 0, 0, NULL), |
| VCLK(DOUT_CLK_ABOX_UAIF2, DIV_CLK_AUD_UAIF2, "DOUT_CLK_ABOX_UAIF2", 0, 0, NULL), |
| VCLK(DOUT_CLK_ABOX_UAIF3, DIV_CLK_AUD_UAIF3, "DOUT_CLK_ABOX_UAIF3", 0, 0, NULL), |
| VCLK(PLL_OUT_AUD, PLL_AUD, "PLL_OUT_AUD", 0, 0, NULL), |
| }; |
| |
| struct init_vclk exynos7872_dvfs_vclks[] __initdata = { |
| VCLK(DFS_ABOX, VCLK_DFS_ABOX, "dfs_abox", 0, VCLK_DFS, NULL), |
| }; |
| |
| static __initdata struct of_device_id ext_clk_match[] = { |
| {.compatible = "samsung,exynos7872-oscclk", .data = (void *)0}, |
| {}, |
| }; |
| |
| void exynos7872_vclk_init(void) |
| { |
| } |
| |
| /* register exynos7872 clocks */ |
| void __init exynos7872_clk_init(struct device_node *np) |
| { |
| void __iomem *reg_base; |
| int ret; |
| |
| if (np) { |
| reg_base = of_iomap(np, 0); |
| if (!reg_base) |
| panic("%s: failed to map registers\n", __func__); |
| } else { |
| panic("%s: unable to determine soc\n", __func__); |
| } |
| |
| ret = cal_if_init(np); |
| if (ret) |
| panic("%s: unable to initialize cal-if\n", __func__); |
| |
| exynos7872_clk_provider = samsung_clk_init(np, reg_base, CLK_NR_CLKS); |
| if (!exynos7872_clk_provider) |
| panic("%s: unable to allocate context.\n", __func__); |
| |
| samsung_register_of_fixed_ext(exynos7872_clk_provider, exynos7872_fixed_rate_ext_clks, |
| ARRAY_SIZE(exynos7872_fixed_rate_ext_clks), |
| ext_clk_match); |
| /* register HWACG vclk */ |
| samsung_register_vclk(exynos7872_clk_provider, exynos7872_apm_hwacg_vclks, ARRAY_SIZE(exynos7872_apm_hwacg_vclks)); |
| samsung_register_vclk(exynos7872_clk_provider, exynos7872_cmu_hwacg_vclks, ARRAY_SIZE(exynos7872_cmu_hwacg_vclks)); |
| samsung_register_vclk(exynos7872_clk_provider, exynos7872_dispaud_hwacg_vclks, ARRAY_SIZE(exynos7872_dispaud_hwacg_vclks)); |
| samsung_register_vclk(exynos7872_clk_provider, exynos7872_fsys_hwacg_vclks, ARRAY_SIZE(exynos7872_fsys_hwacg_vclks)); |
| samsung_register_vclk(exynos7872_clk_provider, exynos7872_g3d_hwacg_vclks, ARRAY_SIZE(exynos7872_g3d_hwacg_vclks)); |
| samsung_register_vclk(exynos7872_clk_provider, exynos7872_isp_hwacg_vclks, ARRAY_SIZE(exynos7872_isp_hwacg_vclks)); |
| samsung_register_vclk(exynos7872_clk_provider, exynos7872_mfcmscl_hwacg_vclks, ARRAY_SIZE(exynos7872_mfcmscl_hwacg_vclks)); |
| samsung_register_vclk(exynos7872_clk_provider, exynos7872_mif_hwacg_vclks, ARRAY_SIZE(exynos7872_mif_hwacg_vclks)); |
| samsung_register_vclk(exynos7872_clk_provider, exynos7872_peri_hwacg_vclks, ARRAY_SIZE(exynos7872_peri_hwacg_vclks)); |
| |
| /* register special vclk */ |
| samsung_register_vclk(exynos7872_clk_provider, exynos7872_fsys_vclks, ARRAY_SIZE(exynos7872_fsys_vclks)); |
| samsung_register_vclk(exynos7872_clk_provider, exynos7872_cmu_vclks, ARRAY_SIZE(exynos7872_cmu_vclks)); |
| samsung_register_vclk(exynos7872_clk_provider, exynos7872_peri_vclks, ARRAY_SIZE(exynos7872_peri_vclks)); |
| samsung_register_vclk(exynos7872_clk_provider, exynos7872_dispaud_vclks, ARRAY_SIZE(exynos7872_dispaud_vclks)); |
| samsung_register_vclk(exynos7872_clk_provider, exynos7872_clkout_vclks, ARRAY_SIZE(exynos7872_clkout_vclks)); |
| |
| /* register DVFS vclk */ |
| samsung_register_vclk(exynos7872_clk_provider, exynos7872_dvfs_vclks, ARRAY_SIZE(exynos7872_dvfs_vclks)); |
| |
| clk_register_fixed_factor(NULL, "pwm-clock", "fin_pll",CLK_SET_RATE_PARENT, 1, 1); |
| |
| samsung_clk_of_add_provider(np, exynos7872_clk_provider); |
| |
| late_time_init = exynos7872_vclk_init; |
| |
| pr_info("EXYNOS7872: Clock setup completed\n"); |
| } |
| |
| CLK_OF_DECLARE(exynos7872_clk, "samsung,exynos7872-clock", exynos7872_clk_init); |