Changeset View
Changeset View
Standalone View
Standalone View
sys/arm/ti/clk/ti_clkctrl.c
Show All 40 Lines | |||||
#include <sys/rman.h> | #include <sys/rman.h> | ||||
#include <sys/resource.h> | #include <sys/resource.h> | ||||
#include <machine/bus.h> | #include <machine/bus.h> | ||||
#include <vm/vm.h> | #include <vm/vm.h> | ||||
#include <vm/vm_extern.h> | #include <vm/vm_extern.h> | ||||
#include <vm/vm_kern.h> | #include <vm/vm_kern.h> | ||||
#include <vm/pmap.h> | #include <vm/pmap.h> | ||||
#include <dev/extres/clk/clk_gate.h> | |||||
#include <dev/extres/clk/clk_div.h> | |||||
#include <dev/extres/clk/clk_mux.h> | |||||
#include <dev/fdt/simplebus.h> | #include <dev/fdt/simplebus.h> | ||||
#include <dev/ofw/ofw_bus.h> | #include <dev/ofw/ofw_bus.h> | ||||
#include <dev/ofw/ofw_bus_subr.h> | #include <dev/ofw/ofw_bus_subr.h> | ||||
#include <arm/ti/clk/clock_common.h> | |||||
#include <arm/ti/clk/ti_clk_clkctrl.h> | #include <arm/ti/clk/ti_clk_clkctrl.h> | ||||
#include <arm/ti/ti_omap4_cm.h> | #include <arm/ti/ti_omap4_cm.h> | ||||
#include <arm/ti/ti_cpuid.h> | #include <arm/ti/ti_cpuid.h> | ||||
#include <dt-bindings/clock/am3.h> | |||||
#if 0 | #if 0 | ||||
#define DPRINTF(dev, msg...) device_printf(dev, msg) | #define DPRINTF(dev, msg...) device_printf(dev, msg) | ||||
#else | #else | ||||
#define DPRINTF(dev, msg...) | #define DPRINTF(dev, msg...) | ||||
#endif | #endif | ||||
#define L4LS_CLKCTRL_38 2 | |||||
#define L4_WKUP_CLKCTRL_0 1 | |||||
#define NO_SPECIAL_REG 0 | |||||
/* Documentation/devicetree/bindings/clock/ti-clkctrl.txt */ | /* Documentation/devicetree/bindings/clock/ti-clkctrl.txt */ | ||||
#define TI_CLKCTRL_L4_WKUP 5 | #define TI_CLKCTRL_L4_WKUP 5 | ||||
#define TI_CLKCTRL_L4_SECURE 4 | #define TI_CLKCTRL_L4_SECURE 4 | ||||
#define TI_CLKCTRL_L4_PER 3 | #define TI_CLKCTRL_L4_PER 3 | ||||
#define TI_CLKCTRL_L4_CFG 2 | #define TI_CLKCTRL_L4_CFG 2 | ||||
#define TI_CLKCTRL 1 | #define TI_CLKCTRL 1 | ||||
#define TI_CLKCTRL_END 0 | #define TI_CLKCTRL_END 0 | ||||
static struct ofw_compat_data compat_data[] = { | static struct ofw_compat_data compat_data[] = { | ||||
{ "ti,clkctrl-l4-wkup", TI_CLKCTRL_L4_WKUP }, | { "ti,clkctrl-l4-wkup", TI_CLKCTRL_L4_WKUP }, | ||||
{ "ti,clkctrl-l4-secure", TI_CLKCTRL_L4_SECURE }, | { "ti,clkctrl-l4-secure", TI_CLKCTRL_L4_SECURE }, | ||||
{ "ti,clkctrl-l4-per", TI_CLKCTRL_L4_PER }, | { "ti,clkctrl-l4-per", TI_CLKCTRL_L4_PER }, | ||||
{ "ti,clkctrl-l4-cfg", TI_CLKCTRL_L4_CFG }, | { "ti,clkctrl-l4-cfg", TI_CLKCTRL_L4_CFG }, | ||||
{ "ti,clkctrl", TI_CLKCTRL }, | { "ti,clkctrl", TI_CLKCTRL }, | ||||
{ NULL, TI_CLKCTRL_END } | { NULL, TI_CLKCTRL_END } | ||||
}; | }; | ||||
struct ti_clkctrl_softc { | struct ti_clkctrl_softc { | ||||
device_t dev; | device_t dev; | ||||
struct clkdom *clkdom; | struct clkdom *clkdom; | ||||
}; | }; | ||||
/* | |||||
* Check out XX_CLKCTRL-INDEX(offset)-macro dance in | |||||
* sys/gnu/dts/dts/include/dt-bindings/clock/am3.h | |||||
* sys/gnu/dts/dts/include/dt-bindings/clock/am4.h | |||||
* sys/gnu/dts/dts/include/dt-bindings/clock/dra7.h | |||||
* it is the basis for the name scheme | |||||
* xxx_clkctrl_[baseoffset]_[offset from base] | |||||
*/ | |||||
#ifdef SOC_TI_AM335X | |||||
/* reg = <0x38 0x2c>, <0x6c 0x28>, <0xac 0xc>, <0xc0 0x1c>, <0xec 0xc>, <0x10c 0x8>, <0x130 0x4>; */ | |||||
/* <0x38 0x2c> */ | |||||
PLIST(l4ls_clkctrl_38_0) = { "dpll_per_m2_div4_ck" }; /* am3.h UART6 clkctrl, TRM 19.2.2 */ | |||||
PLIST(l4ls_clkctrl_38_4) = { "mmc_clk" }; /* am3.h MMC1 clkctrl, TRM 18.2.2 */ | |||||
PLIST(l4ls_clkctrl_38_8) = { "l4ls_gclk" }; /* am3.h ELM clkctrl, TRM 7.4.2.2 */ | |||||
PLIST(l4ls_clkctrl_38_c) = { "dpll_per_m2_div4_ck" }; /* am3.h I2C3 clkctrl, TRM 21.2.2 */ | |||||
PLIST(l4ls_clkctrl_38_10) = { "dpll_per_m2_div4_ck" }; /* am3.h I2C2 clkctrl, TRM 21.2.2 */ | |||||
PLIST(l4ls_clkctrl_38_14) = { "dpll_per_m2_div4_ck" }; /* am3.h SPI0 clkctrl, TRM 24.2.2 */ | |||||
PLIST(l4ls_clkctrl_38_18) = { "dpll_per_m2_div4_ck" }; /* am3.h SPI1 clkctrl, TRM 24.2.2 */ | |||||
/* 1c, 20, 24 are not described in the TRM */ | |||||
//PLIST(l4ls_clkctrl_38_1c) = { NULL }; /* am3.h TRM ? */ | |||||
//PLIST(l4ls_clkctrl_38_20) = { NULL }; /* am3.h TRM ? */ | |||||
//PLIST(l4ls_clkctrl_38_24) = { NULL }; /* am3.h TRM ? */ | |||||
PLIST(l4ls_clkctrl_38_28) = { "l4ls_gclk" }; /* am3.h L4_LS clkctrl, TRM 8.1.12.1.19 */ | |||||
/* <0x6c 0x28> */ | |||||
PLIST(l4ls_clkctrl_38_34) = { "dpll_per_m2_div4_ck" }; /* am3.h UART2 clkctrl, TRM 19.2.2 */ | |||||
PLIST(l4ls_clkctrl_38_38) = { "dpll_per_m2_div4_ck" }; /* am3.h UART3 clkctrl, TRM 19.2.2 */ | |||||
PLIST(l4ls_clkctrl_38_3c) = { "dpll_per_m2_div4_ck" }; /* am3.h UART4 clkctrl, TRM 19.2.2 */ | |||||
PLIST(l4ls_clkctrl_38_40) = { "dpll_per_m2_div4_ck" }; /* am3.h UART5 clkctrl, TRM 19.2.2 */ | |||||
PLIST(l4ls_clkctrl_38_44) = { "timer7_fck@504" }; /* am3.h TIMER7 clkctrl, TRM 20.1.2.3 */ | |||||
PLIST(l4ls_clkctrl_38_48) = { "timer2_fck@508" }; /* am3.h TIMER7 clkctrl, TRM 20.1.2.3 */ | |||||
PLIST(l4ls_clkctrl_38_4c) = { "timer3_fck@50c" }; /* am3.h TIMER2 clkctrl, TRM 20.1.2.3 */ | |||||
PLIST(l4ls_clkctrl_38_50) = { "timer4_fck@510" }; /* am3.h TIMER3 clkctrl, TRM 20.1.2.3 */ | |||||
//PLIST(l4ls_clkctrl_38_54) = { NULL }; /* am3.h ? TRM ? */ | |||||
PLIST(l4ls_clkctrl_38_58) = { "rng_fck" }; /* am3.h RNG clkctrl, TRM doesnt describe the rng, rng_fck only from the am33xx-clocks.dtsi */ | |||||
/* <0xac 0xc> */ | |||||
PLIST(l4ls_clkctrl_38_74) = { "l4ls_gclk" }; /* am3.h GPIO2 clkctrl, TRM 25.2.2 */ | |||||
PLIST(l4ls_clkctrl_38_75) = { "clk_32768_ck" }; /* am3.h GPIO2 clkctrl, TRM 25.2.2 */ | |||||
PLIST(l4ls_clkctrl_38_78) = { "l4ls_gclk" }; /* am3.h GPIO3 clkctrl, TRM 25.2.2 */ | |||||
PLIST(l4ls_clkctrl_38_79) = { "clk_32768_ck" }; /* am3.h GPIO3 clkctrl, TRM 25.2.2 */ | |||||
PLIST(l4ls_clkctrl_38_7c) = { "l4ls_gclk" }; /* am3.h GPIO4 clkctrl, TRM 25.2.2 */ | |||||
PLIST(l4ls_clkctrl_38_7d) = { "clk_32768_ck" }; /* am3.h GPIO4 clkctrl, TRM 25.2.2 */ | |||||
/* <0xc0 0x1c> */ | |||||
PLIST(l4ls_clkctrl_38_88) = { "dcan0_fck" }; /* am3.h D_CAN0 clkctrl, TRM 23.2.2 */ | |||||
PLIST(l4ls_clkctrl_38_8c) = { "dcan1_fck" }; /* am3.h D_CAN1 clkctrl, TRM 23.2.2 */ | |||||
/* 90 not described in am3.h */ | |||||
//PLIST(l4ls_clkctrl_38_90) = { NULL }; /* am3.h */ | |||||
PLIST(l4ls_clkctrl_38_94) = { "l4ls_gclk" }; /* am3.h EPWMMS1 clkctrl, TRM 15.1.2.3 */ | |||||
/* 98 not described in am3.h */ | |||||
//PLIST(l4ls_clkctrl_38_98) = { NULL }; /* am3.h */ | |||||
PLIST(l4ls_clkctrl_38_9c) = { "l4ls_gclk" }; /* am3.h EPWMMS0 clkctrl, TRM 15.1.2.3 */ | |||||
PLIST(l4ls_clkctrl_38_a0) = { "l4ls_gclk" }; /* am3.h EPWMMS2 clkctrl, TRM 15.1.2.3 */ | |||||
/* <0xec 0xc> */ | |||||
PLIST(l4ls_clkctrl_38_b4) = { "timer5_fck@518" }; /* am3.h TIMER5 clkctrl, TRM 20.1.2.3 */ | |||||
PLIST(l4ls_clkctrl_38_b8) = { "timer6_fck@51c" }; /* am3.h TIMER6 clkctrl, TRM 20.1.2.3 */ | |||||
PLIST(l4ls_clkctrl_38_bc) = { "mmc_clk" }; /* am3.h MMC2 clkctrl, TRM 18.2.2 */ | |||||
/* <0xd4 0x8> */ | |||||
PLIST(l4ls_clkctrl_38_d4) = { "l4ls_gclk" }; /* am3.h SPINLOCK clkctrl, TRM 8.1.12.1.48 "SPINLOCK clocks" */ | |||||
PLIST(l4ls_clkctrl_38_d8) = { "l4ls_gclk" }; /* am3.h MAILBOX clkctrl, TRM 17.1.1.2 */ | |||||
/* <0x130 0x4> */ | |||||
PLIST(l4ls_clkctrl_38_f8) = { "l4ls_gclk" }; /* am3.h OCPWP clkctrl, TRM 8.1.12.1.53 "OCPWP clocks" */ | |||||
/* reg = <0x1c 0x4>, <0x30 0x8>, <0x68 0x4>, <0xf8 0x4> */ | |||||
/* <0x1c 0x4> */ | |||||
PLIST(l3s_clkctrl_1c_0) = { "usbotg_fck@47c" }; /* am3.h USB_OTG_HS clkctrl, TRM 16.1.2 fig 16-1 */ | |||||
/* <0x30 0x8> */ | |||||
PLIST(l3s_clkctrl_1c_14) = { "l3s_gclk" }; /* am3.h GPMC clkctrl, TRM 7.1.2.2 */ | |||||
PLIST(l3s_clkctrl_1c_18) = { "mcasp0_fck" }; /* am3.h MCASP0 clkctrl, TRM 22.2.2 */ | |||||
/* <0x68 0x4> */ | |||||
PLIST(l3s_clkctrl_1c_4c) = { "mcasp1_fck" }; /* am3.h MCASP1 clkctrl, TRM 22.2.2 */ | |||||
/* <0xf8 0x4> */ | |||||
PLIST(l3s_clkctrl_1c_dc) = { "mmc_clk" }; /* am3.h MMC3 clkctrl, TRM 18.2.2 */ | |||||
/* reg = <0x24 0xc>, <0x94 0x10>, <0xbc 0x4>, <0xdc 0x8>, <0xfc 0x8>; */ | |||||
/* <0x24 0xc> */ | |||||
PLIST(l3_clkctrl_24_0) = { "l3_gclk" }; /* am3.h TPTC0 clkctrl, TRM 11.2.2.2 */ | |||||
PLIST(l3_clkctrl_24_4) = { "dpll_ddr_m2_div2_ck" }; /* am3.h EMIF clkctrl, TRM 7.3.2.2 */ | |||||
PLIST(l3_clkctrl_24_8) = { "l3_gclk" }; /* am3.h OCMCRAM clkctrl, TRM 7.2.2.2 */ | |||||
/* <0x94 0x10> */ | |||||
PLIST(l3_clkctrl_24_70) = { "aes0_fck" }; /* am3.h AES clkctrl, not in TRM, derived from am33xx-clocks.dtsi */ | |||||
//PLIST(l3_clkctrl_24_74) = { NULL }; /* am3.h ?? clkctrl, TRM ??? */ | |||||
//PLIST(l3_clkctrl_24_78) = { NULL }; /* am3.h ?? clkctrl, TRM ???? */ | |||||
PLIST(l3_clkctrl_24_7c) = { "l3_gclk" }; /* am3.h SHAM clkctrl, not in TRM, assume l3_gclk */ | |||||
/* <0xbc 0x4> */ | |||||
PLIST(l3_clkctrl_24_98) = { "l3_gclk" }; /* am3.h TPCC clkctrl, TRM 11.2.1.2 */ | |||||
/* <0xdc 0x8> */ | |||||
PLIST(l3_clkctrl_24_b8) = { "l3_gclk" }; /* am3.h L3 INSTR clkctrl, TRM 8.1.12.1.38 "L3 INSTR clocks" */ | |||||
PLIST(l3_clkctrl_24_bc) = { "l3_gclk" }; /* am3.h L3 Main clkctrl, TRM 18.1.12.1.39 "L3 interconnect clocks" */ | |||||
/* <0xfc 0x8> */ | |||||
PLIST(l3_clkctrl_24_d8) = { "l3_gclk" }; /* am3.h TPTC1 clkctrl, TRM 11.2.2.2 */ | |||||
PLIST(l3_clkctrl_24_dc) = { "l3_gclk" }; /* am3.h TPTC2 clkctrl, TRM 11.2.2.2 */ | |||||
/* reg = <0x120 0x4>; */ | |||||
PLIST(l4hs_clkctrl_120_0) = { "l4hs_gclk" }; /* am3.h L4HS clkctrl, TRM 8.1.12.1.50 */ | |||||
/* reg = <0xe8 0x4>; */ | |||||
PLIST(pruss_ocp_clkctrl_e8_0) = { "pruss_ocp_gclk@530" }; /* am3.h ocp pruss clkctrl, TRM 4.2.2 */ | |||||
/* reg = <0x0 0x18>; */ | |||||
#if 0 | |||||
PLIST(cpsw_125mhz_clkctrl_0_0) = { NULL }; /* am3.h Not mentioned in TRM, TRM 14.2.2 */ | |||||
PLIST(cpsw_125mhz_clkctrl_0_4) = { NULL }; /* am3.h Not mentioned in TRM, TRM 14.2.2 */ | |||||
PLIST(cpsw_125mhz_clkctrl_0_8) = { NULL }; /* am3.h Not mentioned in TRM, TRM 14.2.2 */ | |||||
PLIST(cpsw_125mhz_clkctrl_0_c) = { NULL }; /* am3.h Not mentioned in TRM, TRM 14.2.2 */ | |||||
PLIST(cpsw_125mhz_clkctrl_0_10) = { NULL }; /* am3.h Not mentioned in TRM, TRM 14.2.2 */ | |||||
#endif | |||||
PLIST(cpsw_125mhz_clkctrl_0_14) = { "cpsw_125mhz_gclk" }; /* am3.h cpsw 125 mhz cpgmaco clkctrl, TRM 14.2.2 */ | |||||
/* reg = <0x18 0x4>; */ | |||||
PLIST(lcdc_clkctrl_18_0) = { "lcd_gclk@534" }; /* am3.h lcdc clkctrl, TRM 13.2.2 */ | |||||
/* reg = <0x14c 0x4>; */ | |||||
PLIST(clk_24mhz_clkctrl_14c_0) = { "clkdiv32k_ck" }; /* am3.h clkdiv32k clkctrl, TRM 8.1.12.1.57 */ | |||||
/* reg = <0x0 0x10>, <0xb4 0x24>; */ | |||||
/* <0x0 0x10> */ | |||||
//PLIST(l4_wkup_clkctrl_0_0) = { NULL }; /* am3.h clkstctrl, TRM 8.1.12.2.1 */ | |||||
PLIST(l4_wkup_clkctrl_0_4) = { "mmc_clk" }; /* am3.h control clkctrl, TRM 18.2.2 */ | |||||
PLIST(l4_wkup_clkctrl_0_8) = { "dpll_core_m4_div2_ck" }; /* am3.h gpio1 clkctrl, TRM 25.2.2 */ | |||||
PLIST(l4_wkup_clkctrl_0_9) = { "gpio0_dbclk_mux_ck@53c" }; /* am3.h gpio1 clkctrl, TRM 25.2.2 */ | |||||
PLIST(l4_wkup_clkctrl_0_c) = { "mmc_clk" }; /* am3.h L4 wkup clkctrl, TRM 18.2.2 */ | |||||
/* <0xb4 0x24> */ | |||||
PLIST(l4_wkup_clkctrl_0_b4) = { "dpll_per_m2_div4_wkupdm_ck" }; /* am3.h uart1 clkctrl, TRM 19.2.2 */ | |||||
PLIST(l4_wkup_clkctrl_0_b8) = { "dpll_per_m2_div4_wkupdm_ck" }; /* am3.h i2c1 wkup clkctrl, TRM 21.2.2 */ | |||||
PLIST(l4_wkup_clkctrl_0_bc) = { "adc_tsc_fck" }; /* am3.h adc tsc clkctrl, TRM 12.2.2 */ | |||||
PLIST(l4_wkup_clkctrl_0_c0) = { "smartreflex0_fck" }; /* am3.h smartreflex0 clkctrl, TRM 8.1.12.2.49 */ | |||||
PLIST(l4_wkup_clkctrl_0_c4) = { "timer1_fck@528" }; /* am3.h timer1 clkctrl, TRM 20.1.2.3 */ | |||||
PLIST(l4_wkup_clkctrl_0_c8) = { "smartreflex1_fck" }; /* am3.h smartreflex1 clkctrl, TRM 8.1.12.2.51 */ | |||||
//PLIST(l4_wkup_clkctrl_0_cc) = { NULL }; /* am3.h l4_wkup_aon_clkstctrl, TRM 8.1.12.2.52 */ | |||||
//PLIST(l4_wkup_clkctrl_0_d0) = { NULL }; /* am3.h ??? clkctrl, not in TRM */ | |||||
PLIST(l4_wkup_clkctrl_0_d4) = { "wdt1_fck@538" }; /* am3.h wd timer2 clkctrl, TRM 20.4.2.2 */ | |||||
/* reg = <0x14 0x4>; */ | |||||
//PLIST(l3_aon_clkctrl_14_0) = { NULL }; /* am3.h debugss clkctrl, TRM 8.1.12.2.6 multiple sub clocks - todo */ | |||||
/* reg = <0xb0 0x4>; */ | |||||
//PLIST(l4_wkup_aon_wkup_m3_clkctrl_b0_0) = { NULL }; /* am3.h l4 wkup aon wkup m3 clkctrl, TRM 8.1.12.2.45 */ | |||||
/* reg = <0x0 0x8>; */ | |||||
//PLIST(mpu_clkctrl_0_0) = { NULL }; /* am3.h mpu clkstctrl, TRM 8.1.12.4.1 */ | |||||
PLIST(mpu_clkctrl_0_4) = { "dpll_mpu_ck@488" }; /* am3.h mpu clkctrl, TRM 8.1.12.4.2 / 3.1.3 */ | |||||
/* reg = <0x0 0x4>; */ | |||||
PLIST(l4_rtc_clkctrl_0_0) = { "clk_32768_ck" }; /* am3.h RTC clkctrl, TRM 20.3.2.2 */ | |||||
/* reg = <0x0 0x8>; */ | |||||
//PLIST(gfx_l3_clkctrl_0_0) = { NULL }; /* am3.h L3 GFX clkctrl, TRM 5.1.2 */ | |||||
PLIST(gfx_l3_clkctrl_0_4) = { "gfx_fck_div_ck@52c" }; /* am3.h L3 GFX clkctrl, TRM 5.1.2 */ | |||||
/* reg = <0x0 0x24>; */ | |||||
#if 0 | |||||
PLIST(l4_cefuse_clkctrl_0_0) = { NULL }; /* am3.h cefuse clkctrl, TRM 8.1.12.8.2 */ | |||||
PLIST(l4_cefuse_clkctrl_0_4) = { NULL }; /* am3.h cefuse clkctrl, TRM 8.1.12.8.2 */ | |||||
PLIST(l4_cefuse_clkctrl_0_8) = { NULL }; /* am3.h cefuse clkctrl, TRM 8.1.12.8.2 */ | |||||
PLIST(l4_cefuse_clkctrl_0_c) = { NULL }; /* am3.h cefuse clkctrl, TRM 8.1.12.8.2 */ | |||||
PLIST(l4_cefuse_clkctrl_0_10) = { NULL }; /* am3.h cefuse clkctrl, TRM 8.1.12.8.2 */ | |||||
PLIST(l4_cefuse_clkctrl_0_14) = { NULL }; /* am3.h cefuse clkctrl, TRM 8.1.12.8.2 */ | |||||
PLIST(l4_cefuse_clkctrl_0_18) = { NULL }; /* am3.h cefuse clkctrl, TRM 8.1.12.8.2 */ | |||||
PLIST(l4_cefuse_clkctrl_0_1c) = { NULL }; /* am3.h cefuse clkctrl, TRM 8.1.12.8.2 */ | |||||
PLIST(l4_cefuse_clkctrl_0_20) = { NULL }; /* am3.h cefuse clkctrl, TRM 8.1.12.8.2 */ | |||||
#endif | |||||
static struct ti_clkctrl_lookup_table am33xx_l4ls_clkctrl_table[] = { | |||||
/* reg = <0x38 0x2c>, <0x6c 0x28>, <0xac 0xc>, <0xc0 0x1c>, <0xec 0xc>, <0x10c 0x8>, <0x130 0x4>; | |||||
*/ | |||||
/* <0x38 0x2c> */ | |||||
{ "l4ls-clkctrl@38_0", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_UART6_CLKCTRL, 0, nitems(l4ls_clkctrl_38_0), l4ls_clkctrl_38_0 }, | |||||
{ "l4ls-clkctrl@38_4", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_MMC1_CLKCTRL, 0, nitems(l4ls_clkctrl_38_4), l4ls_clkctrl_38_4 }, | |||||
{ "l4ls-clkctrl@38_8", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_ELM_CLKCTRL, 0, nitems(l4ls_clkctrl_38_8), l4ls_clkctrl_38_8 }, | |||||
{ "l4ls-clkctrl@38_c", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_I2C3_CLKCTRL, 0, nitems(l4ls_clkctrl_38_c), l4ls_clkctrl_38_c }, | |||||
{ "l4ls-clkctrl@38_10", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_I2C2_CLKCTRL, 0, nitems(l4ls_clkctrl_38_10), l4ls_clkctrl_38_10 }, | |||||
{ "l4ls-clkctrl@38_14", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_SPI0_CLKCTRL, 0, nitems(l4ls_clkctrl_38_14), l4ls_clkctrl_38_14 }, | |||||
{ "l4ls-clkctrl@38_18", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_SPI1_CLKCTRL, 0, nitems(l4ls_clkctrl_38_18), l4ls_clkctrl_38_18 }, | |||||
{ "l4ls-clkctrl@38_1c", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, 0, 0, 0, NULL }, | |||||
{ "l4ls-clkctrl@38_20", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, 0, 0, 0, NULL }, | |||||
{ "l4ls-clkctrl@38_24", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, 0, 0, 0, NULL }, | |||||
{ "l4ls-clkctrl@38_28", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_L4_LS_CLKCTRL, 0, nitems(l4ls_clkctrl_38_28), l4ls_clkctrl_38_28 }, | |||||
/* <0x6c 0x28> */ | |||||
{ "l4ls-clkctrl@38_34", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_UART2_CLKCTRL, 0, nitems(l4ls_clkctrl_38_34), l4ls_clkctrl_38_34 }, | |||||
{ "l4ls-clkctrl@38_38", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_UART3_CLKCTRL, 0, nitems(l4ls_clkctrl_38_38), l4ls_clkctrl_38_38 }, | |||||
{ "l4ls-clkctrl@38_3c", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_UART4_CLKCTRL, 0, nitems(l4ls_clkctrl_38_3c), l4ls_clkctrl_38_3c }, | |||||
{ "l4ls-clkctrl@38_40", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_UART5_CLKCTRL, 0, nitems(l4ls_clkctrl_38_40), l4ls_clkctrl_38_40 }, | |||||
{ "l4ls-clkctrl@38_44", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_TIMER7_CLKCTRL, 0, nitems(l4ls_clkctrl_38_44), l4ls_clkctrl_38_44 }, | |||||
{ "l4ls-clkctrl@38_48", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_TIMER2_CLKCTRL, 0, nitems(l4ls_clkctrl_38_48), l4ls_clkctrl_38_48 }, | |||||
{ "l4ls-clkctrl@38_4c", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_TIMER3_CLKCTRL, 0, nitems(l4ls_clkctrl_38_4c), l4ls_clkctrl_38_4c }, | |||||
{ "l4ls-clkctrl@38_50", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_TIMER4_CLKCTRL, 0, nitems(l4ls_clkctrl_38_50), l4ls_clkctrl_38_50 }, | |||||
{ "l4ls-clkctrl@38_54", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, 0, 0, 0, NULL }, | |||||
{ "l4ls-clkctrl@38_58", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_RNG_CLKCTRL, 0, nitems(l4ls_clkctrl_38_58), l4ls_clkctrl_38_58 }, | |||||
/* <0xac 0xc> */ | |||||
{ "l4ls-clkctrl@38_74", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_GPIO2_CLKCTRL, 0, nitems(l4ls_clkctrl_38_74), l4ls_clkctrl_38_74 }, | |||||
{ "l4ls-clkctrl@38_75", TI_CLKCTRL_GATE, 18, 0x40000, 0, AM3_L4LS_GPIO2_CLKCTRL, 1, nitems(l4ls_clkctrl_38_75), l4ls_clkctrl_38_75 }, | |||||
{ "l4ls-clkctrl@38_78", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_GPIO3_CLKCTRL, 0, nitems(l4ls_clkctrl_38_78), l4ls_clkctrl_38_78 }, | |||||
{ "l4ls-clkctrl@38_79", TI_CLKCTRL_GATE, 18, 0x40000, 0, AM3_L4LS_GPIO3_CLKCTRL, 1, nitems(l4ls_clkctrl_38_79), l4ls_clkctrl_38_79 }, | |||||
{ "l4ls-clkctrl@38_7c", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_GPIO4_CLKCTRL, 0, nitems(l4ls_clkctrl_38_7c), l4ls_clkctrl_38_7c }, | |||||
{ "l4ls-clkctrl@38_7d", TI_CLKCTRL_GATE, 18, 0x40000, 0, AM3_L4LS_GPIO4_CLKCTRL, 1, nitems(l4ls_clkctrl_38_7d), l4ls_clkctrl_38_7d }, | |||||
/* <0xc0 0x1c> */ | |||||
{ "l4ls-clkctrl@38_88", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_D_CAN0_CLKCTRL, 0, nitems(l4ls_clkctrl_38_88), l4ls_clkctrl_38_88 }, | |||||
{ "l4ls-clkctrl@38_8c", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_D_CAN1_CLKCTRL, 0, nitems(l4ls_clkctrl_38_8c), l4ls_clkctrl_38_8c }, | |||||
{ "l4ls-clkctrl@38_90", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, 0, 0, 0, NULL }, | |||||
{ "l4ls-clkctrl@38_94", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_EPWMSS1_CLKCTRL, 0, nitems(l4ls_clkctrl_38_94), l4ls_clkctrl_38_94 }, | |||||
{ "l4ls-clkctrl@38_98", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, 0, 0, 0, NULL }, | |||||
{ "l4ls-clkctrl@38_9c", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_EPWMSS0_CLKCTRL, 0, nitems(l4ls_clkctrl_38_9c), l4ls_clkctrl_38_9c }, | |||||
{ "l4ls-clkctrl@38_a0", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_EPWMSS2_CLKCTRL, 0, nitems(l4ls_clkctrl_38_a0), l4ls_clkctrl_38_a0 }, | |||||
/* <0xec 0xc> */ | |||||
{ "l4ls-clkctrl@38_b4", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_TIMER5_CLKCTRL, 0, nitems(l4ls_clkctrl_38_b4), l4ls_clkctrl_38_b4 }, | |||||
{ "l4ls-clkctrl@38_b8", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_TIMER6_CLKCTRL, 0, nitems(l4ls_clkctrl_38_b8), l4ls_clkctrl_38_b8 }, | |||||
{ "l4ls-clkctrl@38_bc", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_MMC2_CLKCTRL, 0, nitems(l4ls_clkctrl_38_bc), l4ls_clkctrl_38_bc }, | |||||
/* <0xd4 0x8> */ | |||||
{ "l4ls-clkctrl@38_d4", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_SPINLOCK_CLKCTRL, 0, nitems(l4ls_clkctrl_38_d4), l4ls_clkctrl_38_d4 }, | |||||
{ "l4ls-clkctrl@38_d8", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_MAILBOX_CLKCTRL, 0, nitems(l4ls_clkctrl_38_d8), l4ls_clkctrl_38_d8 }, | |||||
/* <0x130 0x4> */ | |||||
{ "l4ls-clkctrl@38_f8", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4LS_OCPWP_CLKCTRL, 0, nitems(l4ls_clkctrl_38_f8), l4ls_clkctrl_38_f8 }, | |||||
}; | |||||
static struct ti_clkctrl_lookup_table am33xx_l3s_clkctrl_table[] = { | |||||
/* reg = <0x1c 0x4>, <0x30 0x8>, <0x68 0x4>, <0xf8 0x4> */ | |||||
/* <0x1c 0x4> */ | |||||
{ "l3s-clkctrl@1c_0", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L3S_USB_OTG_HS_CLKCTRL, 0, nitems(l3s_clkctrl_1c_0), l3s_clkctrl_1c_0 }, | |||||
/* <0x30 0x8> */ | |||||
{ "l3s-clkctrl@1c_14", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L3S_GPMC_CLKCTRL, 0, nitems(l3s_clkctrl_1c_14), l3s_clkctrl_1c_14 }, | |||||
{ "l3s-clkctrl@1c_18", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L3S_MCASP0_CLKCTRL, 0, nitems(l3s_clkctrl_1c_18), l3s_clkctrl_1c_18 }, | |||||
/* <0x68 0x4> */ | |||||
{ "l3s-clkctrl@1c_4c", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L3S_MCASP1_CLKCTRL, 0, nitems(l3s_clkctrl_1c_4c), l3s_clkctrl_1c_4c }, | |||||
/* <0xf8 0x4> */ | |||||
{ "l3s-clkctrl@1c_dc", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L3S_MMC3_CLKCTRL, 0, nitems(l3s_clkctrl_1c_dc), l3s_clkctrl_1c_dc }, | |||||
}; | |||||
static struct ti_clkctrl_lookup_table am33xx_l3_clkctrl_table[] = { | |||||
/* reg = <0x24 0xc>, <0x94 0x10>, <0xbc 0x4>, <0xdc 0x8>, <0xfc 0x8>; */ | |||||
/* <0x24 0xc> */ | |||||
{ "l3-clkctrl@24_0", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L3_TPTC0_CLKCTRL, 0, nitems(l3_clkctrl_24_0), l3_clkctrl_24_0 }, | |||||
{ "l3-clkctrl@24_4", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L3_EMIF_CLKCTRL, 0, nitems(l3_clkctrl_24_4), l3_clkctrl_24_4 }, | |||||
{ "l3-clkctrl@24_8", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L3_OCMCRAM_CLKCTRL, 0, nitems(l3_clkctrl_24_8), l3_clkctrl_24_8 }, | |||||
/* <0x94 0x10> */ | |||||
{ "l3-clkctrl@24_70", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L3_AES_CLKCTRL, 0, nitems(l3_clkctrl_24_70), l3_clkctrl_24_70 }, | |||||
{ "l3-clkctrl@24_74", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, 0, 0, 0, NULL }, | |||||
{ "l3-clkctrl@24_78", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, 0, 0, 0, NULL }, | |||||
{ "l3-clkctrl@24_7c", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L3_SHAM_CLKCTRL, 0, nitems(l3_clkctrl_24_7c), l3_clkctrl_24_7c }, | |||||
/* <0xbc 0x4> */ | |||||
{ "l3-clkctrl@24_98", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L3_TPCC_CLKCTRL, 0, nitems(l3_clkctrl_24_98), l3_clkctrl_24_98 }, | |||||
/* <0xdc 0x8> */ | |||||
{ "l3-clkctrl@24_b8", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L3_L3_INSTR_CLKCTRL, 0, nitems(l3_clkctrl_24_b8), l3_clkctrl_24_b8 }, | |||||
{ "l3-clkctrl@24_bc", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L3_L3_MAIN_CLKCTRL, 0, nitems(l3_clkctrl_24_bc), l3_clkctrl_24_bc }, | |||||
/* <0xfc 0x8> */ | |||||
{ "l3-clkctrl@24_d8", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L3_TPTC1_CLKCTRL, 0, nitems(l3_clkctrl_24_d8), l3_clkctrl_24_d8 }, | |||||
{ "l3-clkctrl@24_dc", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L3_TPTC2_CLKCTRL, 0, nitems(l3_clkctrl_24_dc), l3_clkctrl_24_dc }, | |||||
}; | |||||
static struct ti_clkctrl_lookup_table am33xx_l4hs_clkctrl_table[] = { | |||||
/* reg = <0x120 0x4>; */ | |||||
{ "l4hs-clkctrl@120_0", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4HS_L4_HS_CLKCTRL, 0, nitems(l4hs_clkctrl_120_0), l4hs_clkctrl_120_0 }, | |||||
}; | |||||
static struct ti_clkctrl_lookup_table am33xx_pruss_clkctrl_table[] = { | |||||
/* reg = <0xe8 0x4>; */ | |||||
{ "pruss-ocp-clkctrl@e8_0", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_PRUSS_OCP_PRUSS_CLKCTRL, 0, nitems(pruss_ocp_clkctrl_e8_0), pruss_ocp_clkctrl_e8_0 }, | |||||
}; | |||||
static struct ti_clkctrl_lookup_table am33xx_cpsw_clkctrl_table[] = { | |||||
/* reg = <0x0 0x18>; */ | |||||
{ "cpsw-125mhz-clkctrl@0_0", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, 0, 0, 0, NULL }, | |||||
{ "cpsw-125mhz-clkctrl@0_4", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, 0, 0, 0, NULL }, | |||||
{ "cpsw-125mhz-clkctrl@0_8", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, 0, 0, 0, NULL }, | |||||
{ "cpsw-125mhz-clkctrl@0_c", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, 0, 0, 0, NULL }, | |||||
{ "cpsw-125mhz-clkctrl@0_10", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, 0, 0, 0, NULL }, | |||||
{ "cpsw-125mhz-clkctrl@0_14", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_CPSW_125MHZ_CPGMAC0_CLKCTRL, 0, nitems(cpsw_125mhz_clkctrl_0_14), cpsw_125mhz_clkctrl_0_14 }, | |||||
}; | |||||
static struct ti_clkctrl_lookup_table am33xx_lcdc_clkctrl_table[] = { | |||||
/* reg = <0x18 0x4>; */ | |||||
{ "lcdc-clkctrl@18_0", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_LCDC_LCDC_CLKCTRL, 0, nitems(lcdc_clkctrl_18_0), lcdc_clkctrl_18_0 }, | |||||
}; | |||||
static struct ti_clkctrl_lookup_table am33xx_clk_24mhz_clkctrl_table[] = { | |||||
/* reg = <0x14c 0x4>; */ | |||||
{ "clk-24mhz-clkctrl@14c_0", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_CLK_24MHZ_CLKDIV32K_CLKCTRL, 0, nitems(clk_24mhz_clkctrl_14c_0), clk_24mhz_clkctrl_14c_0 }, | |||||
}; | |||||
static struct ti_clkctrl_lookup_table am33xx_l4_wkup_clkctrl_table[] = { | |||||
/* reg = <0x0 0x10>, <0xb4 0x24>; */ | |||||
/* <0x0 0x10> */ | |||||
{ "l4-wkup-clkctrl@0_0", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, 0, 0, 0, NULL }, | |||||
{ "l4-wkup-clkctrl@0_4", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4_WKUP_CONTROL_CLKCTRL, 0, nitems(l4_wkup_clkctrl_0_4), l4_wkup_clkctrl_0_4 }, | |||||
{ "l4-wkup-clkctrl@0_8", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4_WKUP_GPIO1_CLKCTRL, 0, nitems(l4_wkup_clkctrl_0_8), l4_wkup_clkctrl_0_8 }, | |||||
{ "l4-wkup-clkctrl@0_9", TI_CLKCTRL_GATE, 18, 0x40000, 0, AM3_L4_WKUP_GPIO1_CLKCTRL, 1, nitems(l4_wkup_clkctrl_0_9), l4_wkup_clkctrl_0_9 }, | |||||
{ "l4-wkup-clkctrl@0_c", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4_WKUP_L4_WKUP_CLKCTRL, 0, nitems(l4_wkup_clkctrl_0_c), l4_wkup_clkctrl_0_c }, | |||||
/* <0xb4 0x24> */ | |||||
{ "l4-wkup-clkctrl@0_b4", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4_WKUP_UART1_CLKCTRL, 0, nitems(l4_wkup_clkctrl_0_b4), l4_wkup_clkctrl_0_b4 }, | |||||
{ "l4-wkup-clkctrl@0_b8", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4_WKUP_I2C1_CLKCTRL, 0, nitems(l4_wkup_clkctrl_0_b8), l4_wkup_clkctrl_0_b8 }, | |||||
{ "l4-wkup-clkctrl@0_bc", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4_WKUP_ADC_TSC_CLKCTRL, 0, nitems(l4_wkup_clkctrl_0_bc), l4_wkup_clkctrl_0_bc }, | |||||
{ "l4-wkup-clkctrl@0_c0", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4_WKUP_SMARTREFLEX0_CLKCTRL, 0, nitems(l4_wkup_clkctrl_0_c0), l4_wkup_clkctrl_0_c0 }, | |||||
{ "l4-wkup-clkctrl@0_c4", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4_WKUP_TIMER1_CLKCTRL, 0, nitems(l4_wkup_clkctrl_0_c4), l4_wkup_clkctrl_0_c4 }, | |||||
{ "l4-wkup-clkctrl@0_c8", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4_WKUP_SMARTREFLEX1_CLKCTRL, 0, nitems(l4_wkup_clkctrl_0_c8), l4_wkup_clkctrl_0_c8 }, | |||||
{ "l4-wkup-clkctrl@0_cc", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, 0, 0, 0, NULL }, | |||||
{ "l4-wkup-clkctrl@0_d0", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, 0, 0, 0, NULL }, | |||||
{ "l4-wkup-clkctrl@0_d4", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4_WKUP_WD_TIMER2_CLKCTRL, 0, nitems(l4_wkup_clkctrl_0_d4), l4_wkup_clkctrl_0_d4 }, | |||||
}; | |||||
static struct ti_clkctrl_lookup_table am33xx_l3_aon_clkctrl_table[] = { | |||||
/* reg = <0x14 0x4>; */ | |||||
{ "l3-aon-clkctrl@14_0", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, 0, 0, 0, NULL }, | |||||
}; | |||||
static struct ti_clkctrl_lookup_table am33xx_l4_wkup_aon_clkctrl_table[] = { | |||||
/* reg = <0xb0 0x4>; */ | |||||
{ "l4-wkup-aon-clkctrl@b0_0", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, 0, 0, 0, NULL }, | |||||
}; | |||||
static struct ti_clkctrl_lookup_table am33xx_mpu_clkctrl_table[] = { | |||||
/* reg = <0x0 0x8>; */ | |||||
{ "mpu-clkctrl@0_0", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, 0, 0, 0, NULL }, | |||||
{ "mpu-clkctrl@0_4", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_MPU_MPU_CLKCTRL, 0, nitems(mpu_clkctrl_0_4), mpu_clkctrl_0_4 }, | |||||
}; | |||||
static struct ti_clkctrl_lookup_table am33xx_l4_rtc_clkctrl_table[] = { | |||||
/* reg = <0x0 0x4>; */ | |||||
{ "l4-rtc-clkctrl@0_0", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_L4_RTC_RTC_CLKCTRL, 0, nitems(l4_rtc_clkctrl_0_0), l4_rtc_clkctrl_0_0 }, | |||||
}; | |||||
static struct ti_clkctrl_lookup_table am33xx_gfx_l3_clkctrl_table[] = { | |||||
/* reg = <0x0 0x8>; */ | |||||
{ "gfx-l3-clkctrl@0_0", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, 0, 0, 0, NULL }, | |||||
{ "gfx-l3-clkctrl@0_4", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, AM3_GFX_L3_GFX_CLKCTRL, 0, nitems(gfx_l3_clkctrl_0_4), gfx_l3_clkctrl_0_4 }, | |||||
}; | |||||
static struct ti_clkctrl_lookup_table am33xx_l4_cefuse_clkctrl_table[] = { | |||||
/* reg = <0x0 0x24>; */ | |||||
{ "l4-cefuse-clkctrl@0_0", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, 0, 0, 0, NULL }, | |||||
{ "l4-cefuse-clkctrl@0_4", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, 0, 0, 0, NULL }, | |||||
{ "l4-cefuse-clkctrl@0_8", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, 0, 0, 0, NULL }, | |||||
{ "l4-cefuse-clkctrl@0_c", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, 0, 0, 0, NULL }, | |||||
{ "l4-cefuse-clkctrl@0_10", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, 0, 0, 0, NULL }, | |||||
{ "l4-cefuse-clkctrl@0_14", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, 0, 0, 0, NULL }, | |||||
{ "l4-cefuse-clkctrl@0_18", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, 0, 0, 0, NULL }, | |||||
{ "l4-cefuse-clkctrl@0_1c", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, 0, 0, 0, NULL }, | |||||
{ "l4-cefuse-clkctrl@0_20", TI_CLKCTRL_NO_SUB_CLOCK, 0, 0, 0, 0, 0, 0, NULL }, | |||||
}; | |||||
#endif /* SOC_TI_AM335X */ | |||||
static int ti_clkctrl_probe(device_t dev); | static int ti_clkctrl_probe(device_t dev); | ||||
static int ti_clkctrl_attach(device_t dev); | static int ti_clkctrl_attach(device_t dev); | ||||
static int ti_clkctrl_detach(device_t dev); | static int ti_clkctrl_detach(device_t dev); | ||||
int clkctrl_ofw_map(struct clkdom *clkdom, uint32_t ncells, | int clkctrl_ofw_map(struct clkdom *clkdom, uint32_t ncells, | ||||
phandle_t *cells, struct clknode **clk); | phandle_t *cells, struct clknode **clk); | ||||
static int | static int | ||||
create_clkctrl(struct ti_clkctrl_softc *sc, cell_t *reg, uint32_t index, uint32_t reg_offset, | create_clkctrl(struct ti_clkctrl_softc *sc, struct ti_clkctrl_lookup_table *table, int nitems, uint32_t reg_offset); | ||||
uint64_t parent_offset, const char *org_name, bool special_gdbclk_reg); | |||||
static int | static int | ||||
ti_clkctrl_probe(device_t dev) | ti_clkctrl_probe(device_t dev) | ||||
{ | { | ||||
if (!ofw_bus_status_okay(dev)) | if (!ofw_bus_status_okay(dev)) | ||||
return (ENXIO); | return (ENXIO); | ||||
if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0) | if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0) | ||||
return (ENXIO); | return (ENXIO); | ||||
device_set_desc(dev, "TI clkctrl"); | device_set_desc(dev, "TI clkctrl"); | ||||
return (BUS_PROBE_DEFAULT); | return (BUS_PROBE_DEFAULT); | ||||
} | } | ||||
static int | static int | ||||
ti_clkctrl_attach(device_t dev) | ti_clkctrl_attach(device_t dev) | ||||
{ | { | ||||
struct ti_clkctrl_softc *sc; | struct ti_clkctrl_softc *sc; | ||||
phandle_t node; | phandle_t node; | ||||
cell_t *reg; | cell_t *reg; | ||||
ssize_t numbytes_reg; | ssize_t numbytes_reg; | ||||
int num_reg, err, ti_clock_cells; | int num_reg, err, ti_clock_cells; | ||||
uint32_t index, reg_offset, reg_address; | |||||
const char *org_name; | const char *org_name; | ||||
uint64_t parent_offset; | uint64_t parent_offset; | ||||
uint8_t special_reg = NO_SPECIAL_REG; | |||||
sc = device_get_softc(dev); | sc = device_get_softc(dev); | ||||
sc->dev = dev; | sc->dev = dev; | ||||
node = ofw_bus_get_node(dev); | node = ofw_bus_get_node(dev); | ||||
/* Sanity check */ | /* Sanity check */ | ||||
err = OF_searchencprop(node, "#clock-cells", | err = OF_searchencprop(node, "#clock-cells", | ||||
&ti_clock_cells, sizeof(ti_clock_cells)); | &ti_clock_cells, sizeof(ti_clock_cells)); | ||||
Show All 30 Lines | ti_clkctrl_attach(device_t dev) | ||||
/* Create clock nodes */ | /* Create clock nodes */ | ||||
/* name */ | /* name */ | ||||
clk_parse_ofw_clk_name(sc->dev, node, &org_name); | clk_parse_ofw_clk_name(sc->dev, node, &org_name); | ||||
/* Get parent range */ | /* Get parent range */ | ||||
parent_offset = ti_omap4_cm_get_simplebus_base_host(device_get_parent(dev)); | parent_offset = ti_omap4_cm_get_simplebus_base_host(device_get_parent(dev)); | ||||
/* Check if this is a clkctrl with special registers like gpio */ | /* Find which clkctrl to populate */ | ||||
switch (ti_chip()) { | switch (ti_chip()) { | ||||
#ifdef SOC_OMAP4 | #ifdef SOC_OMAP4 | ||||
case CHIP_OMAP_4: | case CHIP_OMAP_4: | ||||
/* FIXME: Todo */ | /* FIXME: Todo */ | ||||
break; | break; | ||||
#endif /* SOC_OMAP4 */ | #endif /* SOC_OMAP4 */ | ||||
#ifdef SOC_TI_AM335X | #ifdef SOC_TI_AM335X | ||||
/* Checkout TRM 8.1.12.1.29 - 8.1.12.31 and 8.1.12.2.3 | /* Checkout TRM 8.1.12.1.29 - 8.1.12.31 and 8.1.12.2.3 | ||||
* and the DTS. | * and the DTS. | ||||
*/ | */ | ||||
case CHIP_AM335X: | case CHIP_AM335X: | ||||
if (strcmp(org_name, "l4ls-clkctrl@38") == 0) | if (strcmp(org_name, "l4ls-clkctrl@38") == 0) | ||||
special_reg = L4LS_CLKCTRL_38; | err = create_clkctrl(sc, am33xx_l4ls_clkctrl_table, | ||||
nitems(am33xx_l4ls_clkctrl_table), parent_offset + AM3_L4LS_CLKCTRL_OFFSET); | |||||
else if (strcmp(org_name, "l3s-clkctrl@1c") == 0) | |||||
err = create_clkctrl(sc, am33xx_l3s_clkctrl_table, | |||||
nitems(am33xx_l3s_clkctrl_table), parent_offset + AM3_L3S_CLKCTRL_OFFSET); | |||||
else if (strcmp(org_name, "l3-clkctrl@24") == 0) | |||||
err = create_clkctrl(sc, am33xx_l3_clkctrl_table, | |||||
nitems(am33xx_l3_clkctrl_table), parent_offset + AM3_L3_CLKCTRL_OFFSET); | |||||
else if (strcmp(org_name, "l4hs-clkctrl@120") == 0) | |||||
err = create_clkctrl(sc, am33xx_l4hs_clkctrl_table, | |||||
nitems(am33xx_l4hs_clkctrl_table), parent_offset + AM3_L4HS_CLKCTRL_OFFSET); | |||||
else if (strcmp(org_name, "pruss-ocp-clkctrl@e8") == 0) | |||||
err = create_clkctrl(sc, am33xx_pruss_clkctrl_table, | |||||
nitems(am33xx_pruss_clkctrl_table), parent_offset + AM3_PRUSS_OCP_CLKCTRL_OFFSET); | |||||
else if (strcmp(org_name, "cpsw-125mhz-clkctrl@0") == 0) | |||||
err = create_clkctrl(sc, am33xx_cpsw_clkctrl_table, | |||||
nitems(am33xx_cpsw_clkctrl_table), parent_offset + 0); | |||||
else if (strcmp(org_name, "lcdc-clkctrl@18") == 0) | |||||
err = create_clkctrl(sc, am33xx_lcdc_clkctrl_table, | |||||
nitems(am33xx_lcdc_clkctrl_table), parent_offset + AM3_LCDC_CLKCTRL_OFFSET); | |||||
else if (strcmp(org_name, "clk-24mhz-clkctrl@14c") == 0) | |||||
err = create_clkctrl(sc, am33xx_clk_24mhz_clkctrl_table, | |||||
nitems(am33xx_clk_24mhz_clkctrl_table), parent_offset + AM3_CLK_24MHZ_CLKCTRL_OFFSET); | |||||
else if (strcmp(org_name, "l4-wkup-clkctrl@0") == 0) | else if (strcmp(org_name, "l4-wkup-clkctrl@0") == 0) | ||||
special_reg = L4_WKUP_CLKCTRL_0; | err = create_clkctrl(sc, am33xx_l4_wkup_clkctrl_table, | ||||
nitems(am33xx_l4_wkup_clkctrl_table), parent_offset + 0); | |||||
else if (strcmp(org_name, "l3-aon-clkctrl@14") == 0) | |||||
err = create_clkctrl(sc, am33xx_l3_aon_clkctrl_table, | |||||
nitems(am33xx_l3_aon_clkctrl_table), parent_offset + AM3_L3_AON_CLKCTRL_OFFSET); | |||||
else if (strcmp(org_name, "l4-wkup-aon-clkctrl@b0") == 0) | |||||
err = create_clkctrl(sc, am33xx_l4_wkup_aon_clkctrl_table, | |||||
nitems(am33xx_l4_wkup_aon_clkctrl_table), parent_offset + AM3_L4_WKUP_AON_CLKCTRL_OFFSET); | |||||
else if (strcmp(org_name, "mpu-clkctrl@0") == 0) | |||||
err = create_clkctrl(sc, am33xx_mpu_clkctrl_table, | |||||
nitems(am33xx_mpu_clkctrl_table), parent_offset + 0); | |||||
else if (strcmp(org_name, "l4-rtc-clkctrl@0") == 0) | |||||
err = create_clkctrl(sc, am33xx_l4_rtc_clkctrl_table, | |||||
nitems(am33xx_l4_rtc_clkctrl_table), parent_offset + 0); | |||||
else if (strcmp(org_name, "gfx-l3-clkctrl@0") == 0) | |||||
err = create_clkctrl(sc, am33xx_gfx_l3_clkctrl_table, | |||||
nitems(am33xx_gfx_l3_clkctrl_table), parent_offset + 0); | |||||
else if (strcmp(org_name, "l4-cefuse-clkctrl@0") == 0) | |||||
err = create_clkctrl(sc, am33xx_l4_cefuse_clkctrl_table, | |||||
nitems(am33xx_l4_cefuse_clkctrl_table), parent_offset + 0); | |||||
else | |||||
panic("Not expected clkctrl %s", org_name); | |||||
break; | break; | ||||
#endif /* SOC_TI_AM335X */ | #endif /* SOC_TI_AM335X */ | ||||
default: | default: | ||||
break; | break; | ||||
} | } | ||||
/* reg property has a pair of (base address, length) */ | if (err != 0) { | ||||
for (index = 0; index < num_reg; index += 2) { | DPRINTF(sc->dev, "%s failed to create clock\n", | ||||
for (reg_offset = 0; reg_offset < reg[index+1]; reg_offset += sizeof(cell_t)) { | org_name); | ||||
err = create_clkctrl(sc, reg, index, reg_offset, parent_offset, | err = ENXIO; | ||||
org_name, false); | |||||
if (err) | |||||
goto cleanup; | goto cleanup; | ||||
/* Create special clkctrl for GDBCLK in GPIO registers */ | |||||
switch (special_reg) { | |||||
case NO_SPECIAL_REG: | |||||
break; | |||||
case L4LS_CLKCTRL_38: | |||||
reg_address = reg[index] + reg_offset-reg[0]; | |||||
if (reg_address == 0x74 || | |||||
reg_address == 0x78 || | |||||
reg_address == 0x7C) | |||||
{ | |||||
err = create_clkctrl(sc, reg, index, reg_offset, | |||||
parent_offset, org_name, true); | |||||
if (err) | |||||
goto cleanup; | |||||
} | } | ||||
break; | |||||
case L4_WKUP_CLKCTRL_0: | |||||
reg_address = reg[index] + reg_offset - reg[0]; | |||||
if (reg_address == 0x8) | |||||
{ | |||||
err = create_clkctrl(sc, reg, index, reg_offset, | |||||
parent_offset, org_name, true); | |||||
if (err) | |||||
goto cleanup; | |||||
} | |||||
break; | |||||
} /* switch (special_reg) */ | |||||
} /* inner for */ | |||||
} /* for */ | |||||
err = clkdom_finit(sc->clkdom); | err = clkdom_finit(sc->clkdom); | ||||
if (err) { | if (err != 0) { | ||||
DPRINTF(sc->dev, "Clk domain finit fails %x.\n", err); | DPRINTF(sc->dev, "Clk domain finit fails %x.\n", err); | ||||
err = ENXIO; | err = ENXIO; | ||||
goto cleanup; | goto cleanup; | ||||
} | } | ||||
cleanup: | cleanup: | ||||
OF_prop_free(__DECONST(char *, org_name)); | OF_prop_free(__DECONST(char *, org_name)); | ||||
free(reg, M_DEVBUF); | free(reg, M_DEVBUF); | ||||
if (err) | if (err != 0) | ||||
return (err); | return (err); | ||||
return (bus_generic_attach(dev)); | return (bus_generic_attach(dev)); | ||||
} | } | ||||
static int | static int | ||||
ti_clkctrl_detach(device_t dev) | ti_clkctrl_detach(device_t dev) | ||||
{ | { | ||||
Show All 22 Lines | clkctrl_ofw_map(struct clkdom *clkdom, uint32_t ncells, | ||||
if (*clk == NULL) | if (*clk == NULL) | ||||
return (ENXIO); | return (ENXIO); | ||||
return (0); | return (0); | ||||
} | } | ||||
static int | static int | ||||
create_clkctrl(struct ti_clkctrl_softc *sc, cell_t *reg, uint32_t index, uint32_t reg_offset, | create_clkctrl(struct ti_clkctrl_softc *sc, struct ti_clkctrl_lookup_table *table, int nitems, uint32_t reg_offset) { | ||||
uint64_t parent_offset, const char *org_name, bool special_gdbclk_reg) { | struct ti_clk_clkctrl_def clkctrl; | ||||
struct ti_clk_clkctrl_def def; | struct clk_gate_def gate; | ||||
char *name; | struct clk_mux_def mux; | ||||
size_t name_len; | struct clk_div_def divider; | ||||
int err; | int err; | ||||
name_len = strlen(org_name) + 1 + 5; /* 5 = _xxxx */ | for (int index = 0; index < nitems; index++) { | ||||
name = malloc(name_len, M_OFWPROP, M_WAITOK); | switch (table[index].clk_type) { | ||||
case TI_CLKCTRL_NO_SUB_CLOCK: | |||||
DPRINTF(sc->dev, "NO_SUB_CLOCK: %s\n", table[index].node_name); | |||||
/* set flags and name */ | |||||
clkctrl.clkdef.flags = CLK_NODE_STATIC_STRINGS; | |||||
clkctrl.clkdef.name = table[index].node_name; | |||||
clkctrl.clkdef.id = table[index].offset + table[index].id_subclock; | |||||
/* | /* Handle parents */ | ||||
* Check out XX_CLKCTRL-INDEX(offset)-macro dance in | clkctrl.clkdef.parent_cnt = table[index].parent_cnt; | ||||
* sys/gnu/dts/dts/include/dt-bindings/clock/am3.h | clkctrl.clkdef.parent_names = table[index].parents; | ||||
* sys/gnu/dts/dts/include/dt-bindings/clock/am4.h | |||||
* sys/gnu/dts/dts/include/dt-bindings/clock/dra7.h | |||||
* reg[0] are in practice the same as the offset described in the dts. | |||||
*/ | |||||
/* special_gdbclk_reg are 0 or 1 */ | |||||
def.clkdef.id = reg[index] + reg_offset - reg[0] + special_gdbclk_reg; | |||||
def.register_offset = parent_offset + reg[index] + reg_offset; | |||||
/* Indicate this clkctrl is special and dont use IDLEST/MODULEMODE */ | clkctrl.register_offset = table[index].offset + reg_offset; | ||||
def.gdbclk = special_gdbclk_reg; | |||||
/* Make up an uniq name in the namespace for each clkctrl */ | /* Register the clkctrl */ | ||||
snprintf(name, name_len, "%s_%x", | err = ti_clknode_clkctrl_register(sc->clkdom, &clkctrl); | ||||
org_name, def.clkdef.id); | break; | ||||
def.clkdef.name = (const char *) name; | case TI_CLKCTRL_GATE: | ||||
DPRINTF(sc->dev, "GATE %s\n", table[index].node_name); | |||||
/* set flags and name */ | |||||
gate.clkdef.flags = CLK_NODE_STATIC_STRINGS; | |||||
gate.clkdef.name = table[index].node_name; | |||||
gate.clkdef.id = table[index].offset + table[index].id_subclock; | |||||
gate.clkdef.parent_names = table[index].parents; | |||||
gate.clkdef.parent_cnt = table[index].parent_cnt; | |||||
DPRINTF(sc->dev, "ti_clkctrl_attach: reg[%d]: %s %x\n", | gate.offset = table[index].offset + reg_offset; | ||||
index, def.clkdef.name, def.clkdef.id); | gate.shift = table[index].shift; | ||||
gate.mask = table[index].mask; | |||||
gate.on_value = 1; | |||||
gate.off_value = 0; | |||||
gate.gate_flags = 0; | |||||
/* No parent name */ | err = clknode_gate_register(sc->clkdom, &gate); | ||||
def.clkdef.parent_cnt = 0; | break; | ||||
case TI_CLKCTRL_MUX: | |||||
DPRINTF(sc->dev, "MUX %s\n", table[index].node_name); | |||||
/* set flags and name */ | |||||
mux.clkdef.flags = CLK_NODE_STATIC_STRINGS; | |||||
mux.clkdef.name = table[index].node_name; | |||||
mux.clkdef.id = table[index].offset + table[index].id_subclock; | |||||
mux.clkdef.parent_names = table[index].parents; | |||||
mux.clkdef.parent_cnt = table[index].parent_cnt; | |||||
/* set flags */ | mux.offset = table[index].offset + reg_offset; | ||||
def.clkdef.flags = 0x0; | mux.shift = table[index].shift; | ||||
mux.width = fls(table[index].mask >> table[index].shift); | |||||
/* Register the clkctrl */ | err = clknode_mux_register(sc->clkdom, &mux); | ||||
err = ti_clknode_clkctrl_register(sc->clkdom, &def); | break; | ||||
if (err) { | case TI_CLKCTRL_DIVIDER: | ||||
DPRINTF(sc->dev, "DIVIDER %s\n", table[index].node_name); | |||||
/* set flags and name */ | |||||
divider.clkdef.flags = CLK_NODE_STATIC_STRINGS; | |||||
divider.clkdef.name = table[index].node_name; | |||||
divider.clkdef.id = table[index].offset + table[index].id_subclock; | |||||
divider.clkdef.parent_names = table[index].parents; | |||||
divider.clkdef.parent_cnt = table[index].parent_cnt; | |||||
divider.offset = table[index].offset + reg_offset; | |||||
divider.i_shift = table[index].shift; | |||||
divider.i_width = fls(table[index].mask >> table[index].shift); | |||||
divider.f_shift = 0; | |||||
divider.f_width = 0; | |||||
divider.div_flags = 0; | |||||
divider.div_table = NULL; | |||||
err = clknode_div_register(sc->clkdom, ÷r); | |||||
break; | |||||
default: | |||||
panic("clk_type %x not implemented\n", | |||||
table[index].clk_type); | |||||
break; | |||||
} | |||||
if (err != 0) { | |||||
DPRINTF(sc->dev, | DPRINTF(sc->dev, | ||||
"ti_clknode_clkctrl_register[%d:%d] failed %x\n", | "ti_clknode_clkctrl_register[%d:%d] failed %x\n", | ||||
index, reg_offset, err); | index, reg_offset, err); | ||||
err = ENXIO; | err = ENXIO; | ||||
break; | |||||
} | } | ||||
OF_prop_free(name); | } /* for */ | ||||
return (err); | return (err); | ||||
} | } | ||||
static device_method_t ti_clkctrl_methods[] = { | static device_method_t ti_clkctrl_methods[] = { | ||||
/* Device interface */ | /* Device interface */ | ||||
DEVMETHOD(device_probe, ti_clkctrl_probe), | DEVMETHOD(device_probe, ti_clkctrl_probe), | ||||
DEVMETHOD(device_attach, ti_clkctrl_attach), | DEVMETHOD(device_attach, ti_clkctrl_attach), | ||||
DEVMETHOD(device_detach, ti_clkctrl_detach), | DEVMETHOD(device_detach, ti_clkctrl_detach), | ||||
Show All 13 Lines |