Module Name: src Committed By: hkenken Date: Wed Jul 24 11:58:00 UTC 2019
Modified Files: src/sys/arch/arm/imx: files.imx6 imx6_board.c imx6_ccm.c imx6_ccmreg.h imx6_ccmvar.h imx6_reg.h Added Files: src/sys/arch/arm/imx: imx6_clk.c Log Message: Modified imx6 Clock Controller Module (CCM). + Add imx6_get_clock_by_id(). To generate a diff of this commit: cvs rdiff -u -r1.15 -r1.16 src/sys/arch/arm/imx/files.imx6 cvs rdiff -u -r1.12 -r1.13 src/sys/arch/arm/imx/imx6_board.c cvs rdiff -u -r1.10 -r1.11 src/sys/arch/arm/imx/imx6_ccm.c \ src/sys/arch/arm/imx/imx6_ccmreg.h cvs rdiff -u -r1.6 -r1.7 src/sys/arch/arm/imx/imx6_ccmvar.h cvs rdiff -u -r0 -r1.1 src/sys/arch/arm/imx/imx6_clk.c cvs rdiff -u -r1.9 -r1.10 src/sys/arch/arm/imx/imx6_reg.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/imx/files.imx6 diff -u src/sys/arch/arm/imx/files.imx6:1.15 src/sys/arch/arm/imx/files.imx6:1.16 --- src/sys/arch/arm/imx/files.imx6:1.15 Thu Jun 20 08:16:19 2019 +++ src/sys/arch/arm/imx/files.imx6 Wed Jul 24 11:58:00 2019 @@ -1,4 +1,4 @@ -# $NetBSD: files.imx6,v 1.15 2019/06/20 08:16:19 hkenken Exp $ +# $NetBSD: files.imx6,v 1.16 2019/07/24 11:58:00 hkenken Exp $ # # Configuration info for the Freescale i.MX6 # @@ -34,8 +34,8 @@ file arch/arm/imx/imx6_pcie.c imxpcie # iMX6 Clock Control Module device imxccm : clk attach imxccm at axi -file arch/arm/imx/imx6_ccm.c imxccm needs-flag -defflag opt_imx6clk.h IMXCCMDEBUG +file arch/arm/imx/imx6_ccm.c imxccm needs-flag +file arch/arm/imx/imx6_clk.c imxccm defparam opt_imx6clk.h IMX6_OSC_FREQ defparam opt_imx6clk.h IMX6_CKIL_FREQ defparam opt_imx6clk.h IMX6_CKIH_FREQ Index: src/sys/arch/arm/imx/imx6_board.c diff -u src/sys/arch/arm/imx/imx6_board.c:1.12 src/sys/arch/arm/imx/imx6_board.c:1.13 --- src/sys/arch/arm/imx/imx6_board.c:1.12 Thu Oct 18 09:01:52 2018 +++ src/sys/arch/arm/imx/imx6_board.c Wed Jul 24 11:58:00 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: imx6_board.c,v 1.12 2018/10/18 09:01:52 skrll Exp $ */ +/* $NetBSD: imx6_board.c,v 1.13 2019/07/24 11:58:00 hkenken Exp $ */ /* * Copyright (c) 2012 Genetec Corporation. All rights reserved. @@ -27,12 +27,14 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: imx6_board.c,v 1.12 2018/10/18 09:01:52 skrll Exp $"); +__KERNEL_RCSID(1, "$NetBSD: imx6_board.c,v 1.13 2019/07/24 11:58:00 hkenken Exp $"); #include "arml2cc.h" #include "opt_cputypes.h" #include "opt_imx.h" +#define _INTR_PRIVATE + #include <sys/param.h> #include <sys/bus.h> #include <sys/cpu.h> @@ -189,7 +191,7 @@ imx6_armrootclk(void) uint32_t v; v = bus_space_read_4(imx6_ioreg_bst, imx6_ioreg_bsh, - AIPS1_CCM_ANALOG_BASE + CCM_ANALOG_PLL_ARM); + AIPS1_CCM_BASE + CCM_ANALOG_BASE + CCM_ANALOG_PLL_ARM); clk = IMX6_OSC_FREQ * (v & CCM_ANALOG_PLL_ARM_DIV_SELECT) / 2; v = bus_space_read_4(imx6_ioreg_bst, imx6_ioreg_bsh, AIPS1_CCM_BASE + CCM_CACRR); Index: src/sys/arch/arm/imx/imx6_ccm.c diff -u src/sys/arch/arm/imx/imx6_ccm.c:1.10 src/sys/arch/arm/imx/imx6_ccm.c:1.11 --- src/sys/arch/arm/imx/imx6_ccm.c:1.10 Thu Jun 20 08:16:19 2019 +++ src/sys/arch/arm/imx/imx6_ccm.c Wed Jul 24 11:58:00 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: imx6_ccm.c,v 1.10 2019/06/20 08:16:19 hkenken Exp $ */ +/* $NetBSD: imx6_ccm.c,v 1.11 2019/07/24 11:58:00 hkenken Exp $ */ /* * Copyright (c) 2010-2012, 2014 Genetec Corporation. All rights reserved. @@ -30,10 +30,9 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: imx6_ccm.c,v 1.10 2019/06/20 08:16:19 hkenken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: imx6_ccm.c,v 1.11 2019/07/24 11:58:00 hkenken Exp $"); #include "opt_imx.h" -#include "opt_imx6clk.h" #include "opt_cputypes.h" #include "locators.h" @@ -48,9 +47,6 @@ __KERNEL_RCSID(0, "$NetBSD: imx6_ccm.c,v #include <sys/param.h> #include <machine/cpu.h> -#ifdef CPU_CORTEXA9 -#include <arm/cortex/a9tmr_var.h> -#endif #include <arm/imx/imx6_ccmvar.h> #include <arm/imx/imx6_ccmreg.h> @@ -60,15 +56,6 @@ __KERNEL_RCSID(0, "$NetBSD: imx6_ccm.c,v #include <dev/clk/clk_backend.h> -struct imxccm_softc { - device_t sc_dev; - bus_space_tag_t sc_iot; - bus_space_handle_t sc_ioh; - bus_space_handle_t sc_ioh_analog; - - struct clk_domain sc_clkdom; -}; - /* Clock Parents Tables */ static const char *step_p[] = { "osc", @@ -369,6 +356,275 @@ static const char *lvds_p[] = { "sata_ref_100m" }; +/* DT clock ID to clock name mappings */ +static struct imx_clock_id { + u_int id; + const char *name; +} imx6_clock_ids[] = { + { IMX6CLK_DUMMY, "dummy" }, + { IMX6CLK_CKIL, "ckil" }, + { IMX6CLK_CKIH, "ckih" }, + { IMX6CLK_OSC, "osc" }, + { IMX6CLK_PLL2_PFD0_352M, "pll2_pfd0_352m" }, + { IMX6CLK_PLL2_PFD1_594M, "pll2_pfd1_594m" }, + { IMX6CLK_PLL2_PFD2_396M, "pll2_pfd2_396m" }, + { IMX6CLK_PLL3_PFD0_720M, "pll3_pfd0_720m" }, + { IMX6CLK_PLL3_PFD1_540M, "pll3_pfd1_540m" }, + { IMX6CLK_PLL3_PFD2_508M, "pll3_pfd2_508m" }, + { IMX6CLK_PLL3_PFD3_454M, "pll3_pfd3_454m" }, + { IMX6CLK_PLL2_198M, "pll2_198m" }, + { IMX6CLK_PLL3_120M, "pll3_120m" }, + { IMX6CLK_PLL3_80M, "pll3_80m" }, + { IMX6CLK_PLL3_60M, "pll3_60m" }, + { IMX6CLK_TWD, "twd" }, + { IMX6CLK_STEP, "step" }, + { IMX6CLK_PLL1_SW, "pll1_sw" }, + { IMX6CLK_PERIPH_PRE, "periph_pre" }, + { IMX6CLK_PERIPH2_PRE, "periph2_pre" }, + { IMX6CLK_PERIPH_CLK2_SEL, "periph_clk2_sel" }, + { IMX6CLK_PERIPH2_CLK2_SEL, "periph2_clk2_sel" }, + { IMX6CLK_AXI_SEL, "axi_sel" }, + { IMX6CLK_ESAI_SEL, "esai_sel" }, + { IMX6CLK_ASRC_SEL, "asrc_sel" }, + { IMX6CLK_SPDIF_SEL, "spdif_sel" }, + { IMX6CLK_GPU2D_AXI, "gpu2d_axi" }, + { IMX6CLK_GPU3D_AXI, "gpu3d_axi" }, + { IMX6CLK_GPU2D_CORE_SEL, "gpu2d_core_sel" }, + { IMX6CLK_GPU3D_CORE_SEL, "gpu3d_core_sel" }, + { IMX6CLK_GPU3D_SHADER_SEL, "gpu3d_shader_sel" }, + { IMX6CLK_IPU1_SEL, "ipu1_sel" }, + { IMX6CLK_IPU2_SEL, "ipu2_sel" }, + { IMX6CLK_LDB_DI0_SEL, "ldb_di0_sel" }, + { IMX6CLK_LDB_DI1_SEL, "ldb_di1_sel" }, + { IMX6CLK_IPU1_DI0_PRE_SEL, "ipu1_di0_pre_sel" }, + { IMX6CLK_IPU1_DI1_PRE_SEL, "ipu1_di1_pre_sel" }, + { IMX6CLK_IPU2_DI0_PRE_SEL, "ipu2_di0_pre_sel" }, + { IMX6CLK_IPU2_DI1_PRE_SEL, "ipu2_di1_pre_sel" }, + { IMX6CLK_IPU1_DI0_SEL, "ipu1_di0_sel" }, + { IMX6CLK_IPU1_DI1_SEL, "ipu1_di1_sel" }, + { IMX6CLK_IPU2_DI0_SEL, "ipu2_di0_sel" }, + { IMX6CLK_IPU2_DI1_SEL, "ipu2_di1_sel" }, + { IMX6CLK_HSI_TX_SEL, "hsi_tx_sel" }, + { IMX6CLK_PCIE_AXI_SEL, "pcie_axi_sel" }, + { IMX6CLK_SSI1_SEL, "ssi1_sel" }, + { IMX6CLK_SSI2_SEL, "ssi2_sel" }, + { IMX6CLK_SSI3_SEL, "ssi3_sel" }, + { IMX6CLK_USDHC1_SEL, "usdhc1_sel" }, + { IMX6CLK_USDHC2_SEL, "usdhc2_sel" }, + { IMX6CLK_USDHC3_SEL, "usdhc3_sel" }, + { IMX6CLK_USDHC4_SEL, "usdhc4_sel" }, + { IMX6CLK_ENFC_SEL, "enfc_sel" }, + { IMX6CLK_EIM_SEL, "eim_sel" }, + { IMX6CLK_EIM_SLOW_SEL, "eim_slow_sel" }, + { IMX6CLK_VDO_AXI_SEL, "vdo_axi_sel" }, + { IMX6CLK_VPU_AXI_SEL, "vpu_axi_sel" }, + { IMX6CLK_CKO1_SEL, "cko1_sel" }, + { IMX6CLK_PERIPH, "periph" }, + { IMX6CLK_PERIPH2, "periph2" }, + { IMX6CLK_PERIPH_CLK2, "periph_clk2" }, + { IMX6CLK_PERIPH2_CLK2, "periph2_clk2" }, + { IMX6CLK_IPG, "ipg" }, + { IMX6CLK_IPG_PER, "ipg_per" }, + { IMX6CLK_ESAI_PRED, "esai_pred" }, + { IMX6CLK_ESAI_PODF, "esai_podf" }, + { IMX6CLK_ASRC_PRED, "asrc_pred" }, + { IMX6CLK_ASRC_PODF, "asrc_podf" }, + { IMX6CLK_SPDIF_PRED, "spdif_pred" }, + { IMX6CLK_SPDIF_PODF, "spdif_podf" }, + { IMX6CLK_CAN_ROOT, "can_root" }, + { IMX6CLK_ECSPI_ROOT, "ecspi_root" }, + { IMX6CLK_GPU2D_CORE_PODF, "gpu2d_core_podf" }, + { IMX6CLK_GPU3D_CORE_PODF, "gpu3d_core_podf" }, + { IMX6CLK_GPU3D_SHADER, "gpu3d_shader" }, + { IMX6CLK_IPU1_PODF, "ipu1_podf" }, + { IMX6CLK_IPU2_PODF, "ipu2_podf" }, + { IMX6CLK_LDB_DI0_PODF, "ldb_di0_podf" }, + { IMX6CLK_LDB_DI1_PODF, "ldb_di1_podf" }, + { IMX6CLK_IPU1_DI0_PRE, "ipu1_di0_pre" }, + { IMX6CLK_IPU1_DI1_PRE, "ipu1_di1_pre" }, + { IMX6CLK_IPU2_DI0_PRE, "ipu2_di0_pre" }, + { IMX6CLK_IPU2_DI1_PRE, "ipu2_di1_pre" }, + { IMX6CLK_HSI_TX_PODF, "hsi_tx_podf" }, + { IMX6CLK_SSI1_PRED, "ssi1_pred" }, + { IMX6CLK_SSI1_PODF, "ssi1_podf" }, + { IMX6CLK_SSI2_PRED, "ssi2_pred" }, + { IMX6CLK_SSI2_PODF, "ssi2_podf" }, + { IMX6CLK_SSI3_PRED, "ssi3_pred" }, + { IMX6CLK_SSI3_PODF, "ssi3_podf" }, + { IMX6CLK_UART_SERIAL_PODF, "uart_serial_podf" }, + { IMX6CLK_USDHC1_PODF, "usdhc1_podf" }, + { IMX6CLK_USDHC2_PODF, "usdhc2_podf" }, + { IMX6CLK_USDHC3_PODF, "usdhc3_podf" }, + { IMX6CLK_USDHC4_PODF, "usdhc4_podf" }, + { IMX6CLK_ENFC_PRED, "enfc_pred" }, + { IMX6CLK_ENFC_PODF, "enfc_podf" }, + { IMX6CLK_EIM_PODF, "eim_podf" }, + { IMX6CLK_EIM_SLOW_PODF, "eim_slow_podf" }, + { IMX6CLK_VPU_AXI_PODF, "vpu_axi_podf" }, + { IMX6CLK_CKO1_PODF, "cko1_podf" }, + { IMX6CLK_AXI, "axi" }, + { IMX6CLK_MMDC_CH0_AXI_PODF, "mmdc_ch0_axi_podf" }, + { IMX6CLK_MMDC_CH1_AXI_PODF, "mmdc_ch1_axi_podf" }, + { IMX6CLK_ARM, "arm" }, + { IMX6CLK_AHB, "ahb" }, + { IMX6CLK_APBH_DMA, "apbh_dma" }, + { IMX6CLK_ASRC, "asrc" }, + { IMX6CLK_CAN1_IPG, "can1_ipg" }, + { IMX6CLK_CAN1_SERIAL, "can1_serial" }, + { IMX6CLK_CAN2_IPG, "can2_ipg" }, + { IMX6CLK_CAN2_SERIAL, "can2_serial" }, + { IMX6CLK_ECSPI1, "ecspi1" }, + { IMX6CLK_ECSPI2, "ecspi2" }, + { IMX6CLK_ECSPI3, "ecspi3" }, + { IMX6CLK_ECSPI4, "ecspi4" }, + { IMX6CLK_ECSPI5, "ecspi5" }, + { IMX6CLK_ENET, "enet" }, + { IMX6CLK_ESAI_EXTAL, "esai_extal" }, + { IMX6CLK_GPT_IPG, "gpt_ipg" }, + { IMX6CLK_GPT_IPG_PER, "gpt_ipg_per" }, + { IMX6CLK_GPU2D_CORE, "gpu2d_core" }, + { IMX6CLK_GPU3D_CORE, "gpu3d_core" }, + { IMX6CLK_HDMI_IAHB, "hdmi_iahb" }, + { IMX6CLK_HDMI_ISFR, "hdmi_isfr" }, + { IMX6CLK_I2C1, "i2c1" }, + { IMX6CLK_I2C2, "i2c2" }, + { IMX6CLK_I2C3, "i2c3" }, + { IMX6CLK_IIM, "iim" }, + { IMX6CLK_ENFC, "enfc" }, + { IMX6CLK_IPU1, "ipu1" }, + { IMX6CLK_IPU1_DI0, "ipu1_di0" }, + { IMX6CLK_IPU1_DI1, "ipu1_di1" }, + { IMX6CLK_IPU2, "ipu2" }, + { IMX6CLK_IPU2_DI0, "ipu2_di0" }, + { IMX6CLK_LDB_DI0, "ldb_di0" }, + { IMX6CLK_LDB_DI1, "ldb_di1" }, + { IMX6CLK_IPU2_DI1, "ipu2_di1" }, + { IMX6CLK_HSI_TX, "hsi_tx" }, + { IMX6CLK_MLB, "mlb" }, + { IMX6CLK_MMDC_CH0_AXI, "mmdc_ch0_axi" }, + { IMX6CLK_MMDC_CH1_AXI, "mmdc_ch1_axi" }, + { IMX6CLK_OCRAM, "ocram" }, + { IMX6CLK_OPENVG_AXI, "openvg_axi" }, + { IMX6CLK_PCIE_AXI, "pcie_axi" }, + { IMX6CLK_PWM1, "pwm1" }, + { IMX6CLK_PWM2, "pwm2" }, + { IMX6CLK_PWM3, "pwm3" }, + { IMX6CLK_PWM4, "pwm4" }, + { IMX6CLK_PER1_BCH, "per1_bch" }, + { IMX6CLK_GPMI_BCH_APB, "gpmi_bch_apb" }, + { IMX6CLK_GPMI_BCH, "gpmi_bch" }, + { IMX6CLK_GPMI_IO, "gpmi_io" }, + { IMX6CLK_GPMI_APB, "gpmi_apb" }, + { IMX6CLK_SATA, "sata" }, + { IMX6CLK_SDMA, "sdma" }, + { IMX6CLK_SPBA, "spba" }, + { IMX6CLK_SSI1, "ssi1" }, + { IMX6CLK_SSI2, "ssi2" }, + { IMX6CLK_SSI3, "ssi3" }, + { IMX6CLK_UART_IPG, "uart_ipg" }, + { IMX6CLK_UART_SERIAL, "uart_serial" }, + { IMX6CLK_USBOH3, "usboh3" }, + { IMX6CLK_USDHC1, "usdhc1" }, + { IMX6CLK_USDHC2, "usdhc2" }, + { IMX6CLK_USDHC3, "usdhc3" }, + { IMX6CLK_USDHC4, "usdhc4" }, + { IMX6CLK_VDO_AXI, "vdo_axi" }, + { IMX6CLK_VPU_AXI, "vpu_axi" }, + { IMX6CLK_CKO1, "cko1" }, + { IMX6CLK_PLL1_SYS, "pll1_sys" }, + { IMX6CLK_PLL2_BUS, "pll2_bus" }, + { IMX6CLK_PLL3_USB_OTG, "pll3_usb_otg" }, + { IMX6CLK_PLL4_AUDIO, "pll4_audio" }, + { IMX6CLK_PLL5_VIDEO, "pll5_video" }, + { IMX6CLK_PLL8_MLB, "pll8_mlb" }, + { IMX6CLK_PLL7_USB_HOST, "pll7_usb_host" }, + { IMX6CLK_PLL6_ENET, "pll6_enet" }, + { IMX6CLK_SSI1_IPG, "ssi1_ipg" }, + { IMX6CLK_SSI2_IPG, "ssi2_ipg" }, + { IMX6CLK_SSI3_IPG, "ssi3_ipg" }, + { IMX6CLK_ROM, "rom" }, + { IMX6CLK_USBPHY1, "usbphy1" }, + { IMX6CLK_USBPHY2, "usbphy2" }, + { IMX6CLK_LDB_DI0_DIV_3_5, "ldb_di0_div_3_5" }, + { IMX6CLK_LDB_DI1_DIV_3_5, "ldb_di1_div_3_5" }, + { IMX6CLK_SATA_REF, "sata_ref" }, + { IMX6CLK_SATA_REF_100M, "sata_ref_100m" }, + { IMX6CLK_PCIE_REF, "pcie_ref" }, + { IMX6CLK_PCIE_REF_125M, "pcie_ref_125m" }, + { IMX6CLK_ENET_REF, "enet_ref" }, + { IMX6CLK_USBPHY1_GATE, "usbphy1_gate" }, + { IMX6CLK_USBPHY2_GATE, "usbphy2_gate" }, + { IMX6CLK_PLL4_POST_DIV, "pll4_post_div" }, + { IMX6CLK_PLL5_POST_DIV, "pll5_post_div" }, + { IMX6CLK_PLL5_VIDEO_DIV, "pll5_video_div" }, + { IMX6CLK_EIM_SLOW, "eim_slow" }, + { IMX6CLK_SPDIF, "spdif" }, + { IMX6CLK_CKO2_SEL, "cko2_sel" }, + { IMX6CLK_CKO2_PODF, "cko2_podf" }, + { IMX6CLK_CKO2, "cko2" }, + { IMX6CLK_CKO, "cko" }, + { IMX6CLK_VDOA, "vdoa" }, + { IMX6CLK_PLL4_AUDIO_DIV, "pll4_audio_div" }, + { IMX6CLK_LVDS1_SEL, "lvds1_sel" }, + { IMX6CLK_LVDS2_SEL, "lvds2_sel" }, + { IMX6CLK_LVDS1_GATE, "lvds1_gate" }, + { IMX6CLK_LVDS2_GATE, "lvds2_gate" }, + { IMX6CLK_ESAI_IPG, "esai_ipg" }, + { IMX6CLK_ESAI_MEM, "esai_mem" }, + { IMX6CLK_ASRC_IPG, "asrc_ipg" }, + { IMX6CLK_ASRC_MEM, "asrc_mem" }, + { IMX6CLK_LVDS1_IN, "lvds1_in" }, + { IMX6CLK_LVDS2_IN, "lvds2_in" }, + { IMX6CLK_ANACLK1, "anaclk1" }, + { IMX6CLK_ANACLK2, "anaclk2" }, + { IMX6CLK_PLL1_BYPASS_SRC, "pll1_bypass_src" }, + { IMX6CLK_PLL2_BYPASS_SRC, "pll2_bypass_src" }, + { IMX6CLK_PLL3_BYPASS_SRC, "pll3_bypass_src" }, + { IMX6CLK_PLL4_BYPASS_SRC, "pll4_bypass_src" }, + { IMX6CLK_PLL5_BYPASS_SRC, "pll5_bypass_src" }, + { IMX6CLK_PLL6_BYPASS_SRC, "pll6_bypass_src" }, + { IMX6CLK_PLL7_BYPASS_SRC, "pll7_bypass_src" }, + { IMX6CLK_PLL1, "pll1" }, + { IMX6CLK_PLL2, "pll2" }, + { IMX6CLK_PLL3, "pll3" }, + { IMX6CLK_PLL4, "pll4" }, + { IMX6CLK_PLL5, "pll5" }, + { IMX6CLK_PLL6, "pll6" }, + { IMX6CLK_PLL7, "pll7" }, + { IMX6CLK_PLL1_BYPASS, "pll1_bypass" }, + { IMX6CLK_PLL2_BYPASS, "pll2_bypass" }, + { IMX6CLK_PLL3_BYPASS, "pll3_bypass" }, + { IMX6CLK_PLL4_BYPASS, "pll4_bypass" }, + { IMX6CLK_PLL5_BYPASS, "pll5_bypass" }, + { IMX6CLK_PLL6_BYPASS, "pll6_bypass" }, + { IMX6CLK_PLL7_BYPASS, "pll7_bypass" }, + { IMX6CLK_GPT_3M, "gpt_3m" }, + { IMX6CLK_VIDEO_27M, "video_27m" }, + { IMX6CLK_MIPI_CORE_CFG, "mipi_core_cfg" }, + { IMX6CLK_MIPI_IPG, "mipi_ipg" }, + { IMX6CLK_CAAM_MEM, "caam_mem" }, + { IMX6CLK_CAAM_ACLK, "caam_aclk" }, + { IMX6CLK_CAAM_IPG, "caam_ipg" }, + { IMX6CLK_SPDIF_GCLK, "spdif_gclk" }, + { IMX6CLK_UART_SEL, "uart_sel" }, + { IMX6CLK_IPG_PER_SEL, "ipg_per_sel" }, + { IMX6CLK_ECSPI_SEL, "ecspi_sel" }, + { IMX6CLK_CAN_SEL, "can_sel" }, + { IMX6CLK_MMDC_CH1_AXI_CG, "mmdc_ch1_axi_cg" }, + { IMX6CLK_PRE0, "pre0" }, + { IMX6CLK_PRE1, "pre1" }, + { IMX6CLK_PRE2, "pre2" }, + { IMX6CLK_PRE3, "pre3" }, + { IMX6CLK_PRG0_AXI, "prg0_axi" }, + { IMX6CLK_PRG1_AXI, "prg1_axi" }, + { IMX6CLK_PRG0_APB, "prg0_apb" }, + { IMX6CLK_PRG1_APB, "prg1_apb" }, + { IMX6CLK_PRE_AXI, "pre_axi" }, + { IMX6CLK_MLB_SEL, "mlb_sel" }, + { IMX6CLK_MLB_PODF, "mlb_podf" }, + { IMX6CLK_END, "end" }, +}; + /* Clock Divider Tables */ static const int enet_ref_tbl[] = { 20, 10, 5, 4, 0 }; static const int post_div_tbl[] = { 4, 2, 1, 0 }; @@ -634,6 +890,7 @@ static struct imx6_clk imx6_clks[] = { }; static struct imx6_clk *imx6_clk_find(const char *); +static struct imx6_clk *imx6_clk_find_by_id(u_int); static void imxccm_init_clocks(struct imxccm_softc *); static struct clk *imxccm_clk_get(void *, const char *); @@ -656,47 +913,12 @@ static const struct clk_funcs imxccm_clk .get_parent = imxccm_clk_get_parent, }; -static int imxccm_match(device_t, cfdata_t, void *); -static void imxccm_attach(device_t, device_t, void *); - -CFATTACH_DECL_NEW(imxccm, sizeof(struct imxccm_softc), - imxccm_match, imxccm_attach, NULL, NULL); - -static int -imxccm_match(device_t parent, cfdata_t cfdata, void *aux) -{ - struct axi_attach_args *aa = aux; - - if (aa->aa_addr == IMX6_AIPS1_BASE + AIPS1_CCM_BASE) - return 1; - - return 0; -} - -static void -imxccm_attach(device_t parent, device_t self, void *aux) +void +imxccm_attach_common(device_t self) { struct imxccm_softc * const sc = device_private(self); - struct axi_attach_args *aa = aux; - bus_space_tag_t iot = aa->aa_iot; sc->sc_dev = self; - sc->sc_iot = iot; - - if (bus_space_map(iot, aa->aa_addr, AIPS1_CCM_SIZE, 0, &sc->sc_ioh)) { - aprint_error(": can't map CCM registers\n"); - return; - } - - if (bus_space_map(iot, IMX6_AIPS1_BASE + AIPS1_CCM_ANALOG_BASE, - AIPS1_CCM_ANALOG_SIZE, 0, &sc->sc_ioh_analog)) { - aprint_error(": can't map CCM_ANALOG registers\n"); - bus_space_unmap(iot, sc->sc_ioh, AIPS1_CCM_SIZE); - return; - } - - aprint_naive("\n"); - aprint_normal(": Clock Control Module\n"); sc->sc_clkdom.name = device_xname(self); sc->sc_clkdom.funcs = &imxccm_clk_funcs; @@ -712,7 +934,7 @@ imxccm_attach(device_t parent, device_t struct clk *clk = &imx6_clks[n].base; struct clk *clk_parent = clk_get_parent(clk); const char *parent_str = clk_parent ? clk_parent->name : "none"; - aprint_verbose_dev(self, "%s (%s): %u Hz\n", clk->name, + aprint_verbose_dev(self, "%s (%s) : %u Hz\n", clk->name, parent_str, clk_get_rate(clk)); } } @@ -729,6 +951,18 @@ imx6_get_clock(const char *name) return &iclk->base; } +struct clk * +imx6_get_clock_by_id(u_int clock_id) +{ + struct imx6_clk *iclk; + iclk = imx6_clk_find_by_id(clock_id); + + if (iclk == NULL) + return NULL; + + return &iclk->base; +} + static struct imx6_clk * imx6_clk_find(const char *name) { @@ -743,6 +977,19 @@ imx6_clk_find(const char *name) return NULL; } +static struct imx6_clk * +imx6_clk_find_by_id(u_int clock_id) +{ + for (int n = 0; n < __arraycount(imx6_clock_ids); n++) { + if (imx6_clock_ids[n].id == clock_id) { + const char *name = imx6_clock_ids[n].name; + return imx6_clk_find(name); + } + } + + return NULL; +} + struct imxccm_init_parent { const char *clock; const char *parent; Index: src/sys/arch/arm/imx/imx6_ccmreg.h diff -u src/sys/arch/arm/imx/imx6_ccmreg.h:1.10 src/sys/arch/arm/imx/imx6_ccmreg.h:1.11 --- src/sys/arch/arm/imx/imx6_ccmreg.h:1.10 Thu Jun 20 08:16:19 2019 +++ src/sys/arch/arm/imx/imx6_ccmreg.h Wed Jul 24 11:58:00 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: imx6_ccmreg.h,v 1.10 2019/06/20 08:16:19 hkenken Exp $ */ +/* $NetBSD: imx6_ccmreg.h,v 1.11 2019/07/24 11:58:00 hkenken Exp $ */ /* * Copyright (c) 2014 Ryo Shimizu <r...@nerv.org> @@ -303,6 +303,9 @@ #define CCM_CCGR6_USDHC1_CLK_ENABLE __BITS(3, 2) #define CCM_CCGR6_USBOH3_CLK_ENABLE __BITS(1, 0) +#define CCM_ANALOG_BASE 0x00004000 +#define CCM_ANALOG_SIZE 0x00001000 + #define CCM_ANALOG_PLL_ARM 0x00000000 /* = 020c8000 */ #define CCM_ANALOG_PLL_ARM_SET 0x00000004 #define CCM_ANALOG_PLL_ARM_CLR 0x00000008 Index: src/sys/arch/arm/imx/imx6_ccmvar.h diff -u src/sys/arch/arm/imx/imx6_ccmvar.h:1.6 src/sys/arch/arm/imx/imx6_ccmvar.h:1.7 --- src/sys/arch/arm/imx/imx6_ccmvar.h:1.6 Thu Jun 20 08:16:19 2019 +++ src/sys/arch/arm/imx/imx6_ccmvar.h Wed Jul 24 11:58:00 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: imx6_ccmvar.h,v 1.6 2019/06/20 08:16:19 hkenken Exp $ */ +/* $NetBSD: imx6_ccmvar.h,v 1.7 2019/07/24 11:58:00 hkenken Exp $ */ /* * Copyright (c) 2012,2019 Genetec Corporation. All rights reserved. * Written by Hashimoto Kenichi for Genetec Corporation. @@ -31,7 +31,19 @@ #include <dev/clk/clk.h> #include <dev/clk/clk_backend.h> -struct clk *imx6_get_clock(const char *name); +struct imxccm_softc { + device_t sc_dev; + bus_space_tag_t sc_iot; + bus_space_handle_t sc_ioh; + bus_space_handle_t sc_ioh_analog; + + struct clk_domain sc_clkdom; +}; + +void imxccm_attach_common(device_t); + +struct clk *imx6_get_clock(const char *); +struct clk *imx6_get_clock_by_id(u_int); /* Clock IDs */ #define IMX6CLK_DUMMY 0 Index: src/sys/arch/arm/imx/imx6_reg.h diff -u src/sys/arch/arm/imx/imx6_reg.h:1.9 src/sys/arch/arm/imx/imx6_reg.h:1.10 --- src/sys/arch/arm/imx/imx6_reg.h:1.9 Wed Jul 24 11:20:55 2019 +++ src/sys/arch/arm/imx/imx6_reg.h Wed Jul 24 11:58:00 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: imx6_reg.h,v 1.9 2019/07/24 11:20:55 hkenken Exp $ */ +/* $NetBSD: imx6_reg.h,v 1.10 2019/07/24 11:58:00 hkenken Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. * All rights reserved. @@ -144,9 +144,6 @@ #define AIPS1_USBPHY1_BASE 0x000c9000 #define AIPS1_USBPHY_SIZE 0x00001000 -#define AIPS1_CCM_ANALOG_BASE 0x000c8000 -#define AIPS1_CCM_ANALOG_SIZE 0x00001000 - #define AIPS1_CCM_BASE 0x000c4000 #define AIPS1_CCM_SIZE 0x00004000 Added files: Index: src/sys/arch/arm/imx/imx6_clk.c diff -u /dev/null src/sys/arch/arm/imx/imx6_clk.c:1.1 --- /dev/null Wed Jul 24 11:58:00 2019 +++ src/sys/arch/arm/imx/imx6_clk.c Wed Jul 24 11:58:00 2019 @@ -0,0 +1,94 @@ +/* $NetBSD: imx6_clk.c,v 1.1 2019/07/24 11:58:00 hkenken Exp $ */ + +/* + * Copyright (c) 2019 Genetec Corporation. All rights reserved. + * Written by Hashimoto Kenichi for Genetec Corporation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY GENETEC CORPORATION ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GENETEC CORPORATION + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: imx6_clk.c,v 1.1 2019/07/24 11:58:00 hkenken Exp $"); + +#include "locators.h" + +#include <sys/types.h> +#include <sys/time.h> +#include <sys/bus.h> +#include <sys/device.h> +#include <sys/sysctl.h> +#include <sys/cpufreq.h> +#include <sys/malloc.h> +#include <sys/param.h> + +#include <machine/cpu.h> + +#include <arm/imx/imx6_ccmvar.h> +#include <arm/imx/imx6_ccmreg.h> + +#include <arm/imx/imx6var.h> +#include <arm/imx/imx6_reg.h> + +static int imxccm_match(device_t, cfdata_t, void *); +static void imxccm_attach(device_t, device_t, void *); + +CFATTACH_DECL_NEW(imxccm, sizeof(struct imxccm_softc), + imxccm_match, imxccm_attach, NULL, NULL); + +static int +imxccm_match(device_t parent, cfdata_t cfdata, void *aux) +{ + struct axi_attach_args *aa = aux; + + if (aa->aa_addr == IMX6_AIPS1_BASE + AIPS1_CCM_BASE) + return 1; + + return 0; +} + +static void +imxccm_attach(device_t parent, device_t self, void *aux) +{ + struct imxccm_softc * const sc = device_private(self); + struct axi_attach_args *aa = aux; + bus_space_tag_t iot = aa->aa_iot; + + sc->sc_dev = self; + sc->sc_iot = iot; + + if (bus_space_map(iot, aa->aa_addr, AIPS1_CCM_SIZE, 0, &sc->sc_ioh)) { + aprint_error(": can't map CCM registers\n"); + return; + } + if (bus_space_map(iot, aa->aa_addr + CCM_ANALOG_BASE, + CCM_ANALOG_SIZE, 0, &sc->sc_ioh_analog)) { + aprint_error(": can't map CCM_ANALOG registers\n"); + bus_space_unmap(iot, sc->sc_ioh, AIPS1_CCM_SIZE); + return; + } + + aprint_naive("\n"); + aprint_normal(": Clock Control Module\n"); + + imxccm_attach_common(self); +} +