clk: ti: clkctrl clock support
Subsystems (8)
Hi,
This series is a derivative of the hwmod clock support framework
(https://www.spinics.net/lists/arm-kernel/msg536742.html.) This adds support for clkctrl main and optional clocks, which can be linked initially with hwmod framework, and later with the interconnect driver functionality. The implementation is based on the DT bindings patch from Tony:
https://patchwork.kernel.org/patch/9533605/
This series also depends on the TI clock driver cleanup series posted here: https://www.spinics.net/lists/arm-kernel/msg562362.html
OMAP4 used as a reference platform for the work, patches 4-6 contain SoC specific patches, out of which 5-6 should not be merged; these are only provided as a reference and for testing purposes and are incomplete. Rest of the data can be provided once the code is approved / merged.
Boot testing done on am335x-evm, am335x-evmsk, am37x-evm, am437x-sk, am437x-gp-evm, am57xx-evm, omap3-beagle-xm, omap3-beagle, am335x-bone, am335x-boneblack, craneboard, dra72-evm, dra7xx-evm, omap3-n900, omap5-uevm, omap4-panda-es, omap4-panda, omap2430-sdp, omap3430-sdp, omap3-sdp-es23plus. Also, suspend resume testing done on omap4-panda-es.
Fully functional branch available here (with Tony's DT bindings patch merged in also):
tree: https://github.com/t-kristo/linux-pm.git
branch: 4.10-rc2-clkctrl
-Tero
PATCH 1/6 clk: ti: add support for clkctrl clocks
Previously, hwmod core has been used for controlling the hwmod level clocks directly. This has certain drawbacks, like being unable to share the clocks for multiple users, missing usecounting and generally being totally incompatible with the common clock framework.
This patch adds support for clkctrl clocks for addressing the above issues. These support the modulemode handling, which will replace the direct hwmod clkctrl linkage. Any optional clocks are also supported, gate, mux and divider.
--- drivers/clk/ti/Makefile | 3 +- drivers/clk/ti/clkctrl.c | 481 +++++++++++++++++++++++++++++++++++++++++++++++ drivers/clk/ti/clock.h | 31 +++ 3 files changed, 514 insertions(+), 1 deletion(-) create mode 100644 drivers/clk/ti/clkctrl.c
drivers/clk/ti/Makefile +2 -1
@@ -3,7 +3,8 @@ ifeq ($(CONFIG_ARCH_OMAP2PLUS), y) obj-y += clk.o autoidle.o clockdomain.o clk-common = dpll.o composite.o divider.o gate.o \ fixed-factor.o mux.o apll.o \ - clkt_dpll.o clkt_iclk.o clkt_dflt.o + clkt_dpll.o clkt_iclk.o clkt_dflt.o \ + clkctrl.o obj-$(CONFIG_SOC_AM33XX) += $(clk-common) clk-33xx.o dpll3xxx.o obj-$(CONFIG_SOC_TI81XX) += $(clk-common) fapll.o clk-814x.o clk-816x.o obj-$(CONFIG_ARCH_OMAP2) += $(clk-common) interface.o clk-2xxx.o
drivers/clk/ti/clkctrl.c new file +481 -0
481 lines not on this page · raw message
drivers/clk/ti/clock.h +31 -0
@@ -205,6 +205,37 @@ struct ti_dt_clk { .node_name = name, \ } +/* CLKCTRL type definitions */ +struct omap_clkctrl_div_data { +const int *dividers; +int max_div; +}; + +struct omap_clkctrl_bit_data { +u8 bit; +u8 type; +const char *const *parents; +const void *data; +}; + +struct omap_clkctrl_reg_data { +u16 offset; +const struct omap_clkctrl_bit_data *bit_data; +u16 flags; +const char *parent; +}; + +struct omap_clkctrl_data { +u32 addr; +const struct omap_clkctrl_reg_data *regs; +}; + +extern const struct omap_clkctrl_data omap4_clkctrl_data[]; + +#define CLKF_SW_SUP BIT(0) +#define CLKF_HW_SUP BIT(1) +#define CLKF_NO_IDLEST BIT(2) +typedef void (*ti_of_clk_init_cb_t )(struct clk_hw *,struct device_node *);struct clk *ti_clk_register_gate (struct ti_clk *setup);
Signature · 1 line
1.9.1
PATCH 2/6 dt-bindings: clk: add omap4 clkctrl definitions
In reply to Tero KristoContains offsets for all omap4 clkctrl main and optional clocks.
--- include/dt-bindings/clock/omap4.h | 89 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 include/dt-bindings/clock/omap4.h
include/dt-bindings/clock/omap4.h new file +89 -0
@@ -0,0 +1,89 @@ +#define OMAP4_CLKCTRL_OFFSET 0x20 +#define OMAP4_CLKCTRL_INDEX (offset) ((offset) - OMAP4_CLKCTRL_OFFSET) +#define OMAP4_MPU_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_DSP_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_L4_ABE_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_AESS_CLKCTRL OMAP4_CLKCTRL_INDEX(0x28) +#define OMAP4_MCPDM_CLKCTRL OMAP4_CLKCTRL_INDEX(0x30) +#define OMAP4_DMIC_CLKCTRL OMAP4_CLKCTRL_INDEX(0x38) +#define OMAP4_MCASP_CLKCTRL OMAP4_CLKCTRL_INDEX(0x40) +#define OMAP4_MCBSP1_CLKCTRL OMAP4_CLKCTRL_INDEX(0x48) +#define OMAP4_MCBSP2_CLKCTRL OMAP4_CLKCTRL_INDEX(0x50) +#define OMAP4_MCBSP3_CLKCTRL OMAP4_CLKCTRL_INDEX(0x58) +#define OMAP4_SLIMBUS1_CLKCTRL OMAP4_CLKCTRL_INDEX(0x60) +#define OMAP4_TIMER5_CLKCTRL OMAP4_CLKCTRL_INDEX(0x68) +#define OMAP4_TIMER6_CLKCTRL OMAP4_CLKCTRL_INDEX(0x70) +#define OMAP4_TIMER7_CLKCTRL OMAP4_CLKCTRL_INDEX(0x78) +#define OMAP4_TIMER8_CLKCTRL OMAP4_CLKCTRL_INDEX(0x80) +#define OMAP4_WD_TIMER3_CLKCTRL OMAP4_CLKCTRL_INDEX(0x88) +#define OMAP4_SMARTREFLEX_MPU_CLKCTRL OMAP4_CLKCTRL_INDEX(0x28) +#define OMAP4_SMARTREFLEX_IVA_CLKCTRL OMAP4_CLKCTRL_INDEX(0x30) +#define OMAP4_SMARTREFLEX_CORE_CLKCTRL OMAP4_CLKCTRL_INDEX(0x38) +#define OMAP4_L3_MAIN_1_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_L3_MAIN_2_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_GPMC_CLKCTRL OMAP4_CLKCTRL_INDEX(0x28) +#define OMAP4_OCMC_RAM_CLKCTRL OMAP4_CLKCTRL_INDEX(0x30) +#define OMAP4_IPU_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_DMA_SYSTEM_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_DMM_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_EMIF1_CLKCTRL OMAP4_CLKCTRL_INDEX(0x30) +#define OMAP4_EMIF2_CLKCTRL OMAP4_CLKCTRL_INDEX(0x38) +#define OMAP4_C2C_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_L4_CFG_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_SPINLOCK_CLKCTRL OMAP4_CLKCTRL_INDEX(0x28) +#define OMAP4_MAILBOX_CLKCTRL OMAP4_CLKCTRL_INDEX(0x30) +#define OMAP4_L3_MAIN_3_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_L3_INSTR_CLKCTRL OMAP4_CLKCTRL_INDEX(0x28) +#define OMAP4_OCP_WP_NOC_CLKCTRL OMAP4_CLKCTRL_INDEX(0x40) +#define OMAP4_IVA_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_SL2IF_CLKCTRL OMAP4_CLKCTRL_INDEX(0x28) +#define OMAP4_ISS_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_FDIF_CLKCTRL OMAP4_CLKCTRL_INDEX(0x28) +#define OMAP4_DSS_DISPC_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_GPU_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_MMC1_CLKCTRL OMAP4_CLKCTRL_INDEX(0x28) +#define OMAP4_MMC2_CLKCTRL OMAP4_CLKCTRL_INDEX(0x30) +#define OMAP4_HSI_CLKCTRL OMAP4_CLKCTRL_INDEX(0x38) +#define OMAP4_USB_HOST_HS_CLKCTRL OMAP4_CLKCTRL_INDEX(0x58) +#define OMAP4_USB_OTG_HS_CLKCTRL OMAP4_CLKCTRL_INDEX(0x60) +#define OMAP4_USB_TLL_HS_CLKCTRL OMAP4_CLKCTRL_INDEX(0x68) +#define OMAP4_USB_HOST_FS_CLKCTRL OMAP4_CLKCTRL_INDEX(0xd0) +#define OMAP4_OCP2SCP_USB_PHY_CLKCTRL OMAP4_CLKCTRL_INDEX(0xe0) +#define OMAP4_TIMER10_CLKCTRL OMAP4_CLKCTRL_INDEX(0x28) +#define OMAP4_TIMER11_CLKCTRL OMAP4_CLKCTRL_INDEX(0x30) +#define OMAP4_TIMER2_CLKCTRL OMAP4_CLKCTRL_INDEX(0x38) +#define OMAP4_TIMER3_CLKCTRL OMAP4_CLKCTRL_INDEX(0x40) +#define OMAP4_TIMER4_CLKCTRL OMAP4_CLKCTRL_INDEX(0x48) +#define OMAP4_TIMER9_CLKCTRL OMAP4_CLKCTRL_INDEX(0x50) +#define OMAP4_ELM_CLKCTRL OMAP4_CLKCTRL_INDEX(0x58) +#define OMAP4_GPIO2_CLKCTRL OMAP4_CLKCTRL_INDEX(0x60) +#define OMAP4_GPIO3_CLKCTRL OMAP4_CLKCTRL_INDEX(0x68) +#define OMAP4_GPIO4_CLKCTRL OMAP4_CLKCTRL_INDEX(0x70) +#define OMAP4_GPIO5_CLKCTRL OMAP4_CLKCTRL_INDEX(0x78) +#define OMAP4_GPIO6_CLKCTRL OMAP4_CLKCTRL_INDEX(0x80) +#define OMAP4_HDQ1W_CLKCTRL OMAP4_CLKCTRL_INDEX(0x88) +#define OMAP4_I2C1_CLKCTRL OMAP4_CLKCTRL_INDEX(0xa0) +#define OMAP4_I2C2_CLKCTRL OMAP4_CLKCTRL_INDEX(0xa8) +#define OMAP4_I2C3_CLKCTRL OMAP4_CLKCTRL_INDEX(0xb0) +#define OMAP4_I2C4_CLKCTRL OMAP4_CLKCTRL_INDEX(0xb8) +#define OMAP4_L4_PER_CLKCTRL OMAP4_CLKCTRL_INDEX(0xc0) +#define OMAP4_MCBSP4_CLKCTRL OMAP4_CLKCTRL_INDEX(0xe0) +#define OMAP4_MCSPI1_CLKCTRL OMAP4_CLKCTRL_INDEX(0xf0) +#define OMAP4_MCSPI2_CLKCTRL OMAP4_CLKCTRL_INDEX(0xf8) +#define OMAP4_MCSPI3_CLKCTRL OMAP4_CLKCTRL_INDEX(0x100) +#define OMAP4_MCSPI4_CLKCTRL OMAP4_CLKCTRL_INDEX(0x108) +#define OMAP4_MMC3_CLKCTRL OMAP4_CLKCTRL_INDEX(0x120) +#define OMAP4_MMC4_CLKCTRL OMAP4_CLKCTRL_INDEX(0x128) +#define OMAP4_SLIMBUS2_CLKCTRL OMAP4_CLKCTRL_INDEX(0x138) +#define OMAP4_UART1_CLKCTRL OMAP4_CLKCTRL_INDEX(0x140) +#define OMAP4_UART2_CLKCTRL OMAP4_CLKCTRL_INDEX(0x148) +#define OMAP4_UART3_CLKCTRL OMAP4_CLKCTRL_INDEX(0x150) +#define OMAP4_UART4_CLKCTRL OMAP4_CLKCTRL_INDEX(0x158) +#define OMAP4_MMC5_CLKCTRL OMAP4_CLKCTRL_INDEX(0x160) +#define OMAP4_L4_WKUP_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_WD_TIMER2_CLKCTRL OMAP4_CLKCTRL_INDEX(0x30) +#define OMAP4_GPIO1_CLKCTRL OMAP4_CLKCTRL_INDEX(0x38) +#define OMAP4_TIMER1_CLKCTRL OMAP4_CLKCTRL_INDEX(0x40) +#define OMAP4_COUNTER_32K_CLKCTRL OMAP4_CLKCTRL_INDEX(0x50) +#define OMAP4_KBD_CLKCTRL OMAP4_CLKCTRL_INDEX(0x78) +#define OMAP4_DEBUGSS_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20)
Signature · 1 line
1.9.1
PATCH 2/6 dt-bindings: clk: add omap4 clkctrl definitions
include/dt-bindings/clock/omap4.h
Quoted 14 lines · Tero Kristo
Contains offsets for all omap4 clkctrl main and optional clocks.
Signed-off-by Tero Kristo <[email protected]>--- include/dt-bindings/clock/omap4.h | 89 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 include/dt-bindings/clock/omap4.hinclude/dt-bindings/clock/omap4.h new file +0
-0@@ -0,0 +1,89 @@
Just noticed this autogenerated file missed its header. >.<
Will add once I rebase the whole series on top of 4.11-rc.
-Tero
Quoted 90 lines
include/dt-bindings/clock/omap4.h new file +89
-0+#define OMAP4_CLKCTRL_OFFSET 0x20 +#define OMAP4_CLKCTRL_INDEX (offset) ((offset) - OMAP4_CLKCTRL_OFFSET) +#define OMAP4_MPU_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_DSP_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_L4_ABE_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_AESS_CLKCTRL OMAP4_CLKCTRL_INDEX(0x28) +#define OMAP4_MCPDM_CLKCTRL OMAP4_CLKCTRL_INDEX(0x30) +#define OMAP4_DMIC_CLKCTRL OMAP4_CLKCTRL_INDEX(0x38) +#define OMAP4_MCASP_CLKCTRL OMAP4_CLKCTRL_INDEX(0x40) +#define OMAP4_MCBSP1_CLKCTRL OMAP4_CLKCTRL_INDEX(0x48) +#define OMAP4_MCBSP2_CLKCTRL OMAP4_CLKCTRL_INDEX(0x50) +#define OMAP4_MCBSP3_CLKCTRL OMAP4_CLKCTRL_INDEX(0x58) +#define OMAP4_SLIMBUS1_CLKCTRL OMAP4_CLKCTRL_INDEX(0x60) +#define OMAP4_TIMER5_CLKCTRL OMAP4_CLKCTRL_INDEX(0x68) +#define OMAP4_TIMER6_CLKCTRL OMAP4_CLKCTRL_INDEX(0x70) +#define OMAP4_TIMER7_CLKCTRL OMAP4_CLKCTRL_INDEX(0x78) +#define OMAP4_TIMER8_CLKCTRL OMAP4_CLKCTRL_INDEX(0x80) +#define OMAP4_WD_TIMER3_CLKCTRL OMAP4_CLKCTRL_INDEX(0x88) +#define OMAP4_SMARTREFLEX_MPU_CLKCTRL OMAP4_CLKCTRL_INDEX(0x28) +#define OMAP4_SMARTREFLEX_IVA_CLKCTRL OMAP4_CLKCTRL_INDEX(0x30) +#define OMAP4_SMARTREFLEX_CORE_CLKCTRL OMAP4_CLKCTRL_INDEX(0x38) +#define OMAP4_L3_MAIN_1_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_L3_MAIN_2_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_GPMC_CLKCTRL OMAP4_CLKCTRL_INDEX(0x28) +#define OMAP4_OCMC_RAM_CLKCTRL OMAP4_CLKCTRL_INDEX(0x30) +#define OMAP4_IPU_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_DMA_SYSTEM_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_DMM_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_EMIF1_CLKCTRL OMAP4_CLKCTRL_INDEX(0x30) +#define OMAP4_EMIF2_CLKCTRL OMAP4_CLKCTRL_INDEX(0x38) +#define OMAP4_C2C_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_L4_CFG_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_SPINLOCK_CLKCTRL OMAP4_CLKCTRL_INDEX(0x28) +#define OMAP4_MAILBOX_CLKCTRL OMAP4_CLKCTRL_INDEX(0x30) +#define OMAP4_L3_MAIN_3_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_L3_INSTR_CLKCTRL OMAP4_CLKCTRL_INDEX(0x28) +#define OMAP4_OCP_WP_NOC_CLKCTRL OMAP4_CLKCTRL_INDEX(0x40) +#define OMAP4_IVA_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_SL2IF_CLKCTRL OMAP4_CLKCTRL_INDEX(0x28) +#define OMAP4_ISS_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_FDIF_CLKCTRL OMAP4_CLKCTRL_INDEX(0x28) +#define OMAP4_DSS_DISPC_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_GPU_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_MMC1_CLKCTRL OMAP4_CLKCTRL_INDEX(0x28) +#define OMAP4_MMC2_CLKCTRL OMAP4_CLKCTRL_INDEX(0x30) +#define OMAP4_HSI_CLKCTRL OMAP4_CLKCTRL_INDEX(0x38) +#define OMAP4_USB_HOST_HS_CLKCTRL OMAP4_CLKCTRL_INDEX(0x58) +#define OMAP4_USB_OTG_HS_CLKCTRL OMAP4_CLKCTRL_INDEX(0x60) +#define OMAP4_USB_TLL_HS_CLKCTRL OMAP4_CLKCTRL_INDEX(0x68) +#define OMAP4_USB_HOST_FS_CLKCTRL OMAP4_CLKCTRL_INDEX(0xd0) +#define OMAP4_OCP2SCP_USB_PHY_CLKCTRL OMAP4_CLKCTRL_INDEX(0xe0) +#define OMAP4_TIMER10_CLKCTRL OMAP4_CLKCTRL_INDEX(0x28) +#define OMAP4_TIMER11_CLKCTRL OMAP4_CLKCTRL_INDEX(0x30) +#define OMAP4_TIMER2_CLKCTRL OMAP4_CLKCTRL_INDEX(0x38) +#define OMAP4_TIMER3_CLKCTRL OMAP4_CLKCTRL_INDEX(0x40) +#define OMAP4_TIMER4_CLKCTRL OMAP4_CLKCTRL_INDEX(0x48) +#define OMAP4_TIMER9_CLKCTRL OMAP4_CLKCTRL_INDEX(0x50) +#define OMAP4_ELM_CLKCTRL OMAP4_CLKCTRL_INDEX(0x58) +#define OMAP4_GPIO2_CLKCTRL OMAP4_CLKCTRL_INDEX(0x60) +#define OMAP4_GPIO3_CLKCTRL OMAP4_CLKCTRL_INDEX(0x68) +#define OMAP4_GPIO4_CLKCTRL OMAP4_CLKCTRL_INDEX(0x70) +#define OMAP4_GPIO5_CLKCTRL OMAP4_CLKCTRL_INDEX(0x78) +#define OMAP4_GPIO6_CLKCTRL OMAP4_CLKCTRL_INDEX(0x80) +#define OMAP4_HDQ1W_CLKCTRL OMAP4_CLKCTRL_INDEX(0x88) +#define OMAP4_I2C1_CLKCTRL OMAP4_CLKCTRL_INDEX(0xa0) +#define OMAP4_I2C2_CLKCTRL OMAP4_CLKCTRL_INDEX(0xa8) +#define OMAP4_I2C3_CLKCTRL OMAP4_CLKCTRL_INDEX(0xb0) +#define OMAP4_I2C4_CLKCTRL OMAP4_CLKCTRL_INDEX(0xb8) +#define OMAP4_L4_PER_CLKCTRL OMAP4_CLKCTRL_INDEX(0xc0) +#define OMAP4_MCBSP4_CLKCTRL OMAP4_CLKCTRL_INDEX(0xe0) +#define OMAP4_MCSPI1_CLKCTRL OMAP4_CLKCTRL_INDEX(0xf0) +#define OMAP4_MCSPI2_CLKCTRL OMAP4_CLKCTRL_INDEX(0xf8) +#define OMAP4_MCSPI3_CLKCTRL OMAP4_CLKCTRL_INDEX(0x100) +#define OMAP4_MCSPI4_CLKCTRL OMAP4_CLKCTRL_INDEX(0x108) +#define OMAP4_MMC3_CLKCTRL OMAP4_CLKCTRL_INDEX(0x120) +#define OMAP4_MMC4_CLKCTRL OMAP4_CLKCTRL_INDEX(0x128) +#define OMAP4_SLIMBUS2_CLKCTRL OMAP4_CLKCTRL_INDEX(0x138) +#define OMAP4_UART1_CLKCTRL OMAP4_CLKCTRL_INDEX(0x140) +#define OMAP4_UART2_CLKCTRL OMAP4_CLKCTRL_INDEX(0x148) +#define OMAP4_UART3_CLKCTRL OMAP4_CLKCTRL_INDEX(0x150) +#define OMAP4_UART4_CLKCTRL OMAP4_CLKCTRL_INDEX(0x158) +#define OMAP4_MMC5_CLKCTRL OMAP4_CLKCTRL_INDEX(0x160) +#define OMAP4_L4_WKUP_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20) +#define OMAP4_WD_TIMER2_CLKCTRL OMAP4_CLKCTRL_INDEX(0x30) +#define OMAP4_GPIO1_CLKCTRL OMAP4_CLKCTRL_INDEX(0x38) +#define OMAP4_TIMER1_CLKCTRL OMAP4_CLKCTRL_INDEX(0x40) +#define OMAP4_COUNTER_32K_CLKCTRL OMAP4_CLKCTRL_INDEX(0x50) +#define OMAP4_KBD_CLKCTRL OMAP4_CLKCTRL_INDEX(0x78) +#define OMAP4_DEBUGSS_CLKCTRL OMAP4_CLKCTRL_INDEX(0x20)
PATCH 3/6 clk: ti: omap4: add clkctrl clock data
In reply to Tero KristoAdd data for omap4 clkctrl clocks.
--- drivers/clk/ti/clk-44xx.c | 663 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 663 insertions(+)
drivers/clk/ti/clk-44xx.c +663 -0
@@ -15,6 +15,7 @@#include <linux/clk.h> #include <linux/clkdev.h> #include <linux/clk/ti.h> +#include <dt-bindings/clock/omap4.h> #include "clock.h"
@@ -33,6 +34,668 @@*/ #define OMAP4_DPLL_USB_DEFFREQ 960000000 +static const struct omap_clkctrl_reg_data omap4_mpuss_clkctrl_regs[]__initconst = { + {OMAP4_MPU_CLKCTRL ,NULL ,CLKF_HW_SUP ,"dpll_mpu_m2_ck" }, + {0 }, +}; + +static const struct omap_clkctrl_reg_data omap4_tesla_clkctrl_regs[]__initconst = { + {OMAP4_DSP_CLKCTRL ,NULL ,CLKF_HW_SUP ,"dpll_iva_m4x2_ck" }, + {0 }, +}; + +static const char *const omap4_aess_fclk_parents[]__initconst = { +"abe_clk" , +NULL , +}; + +static const struct omap_clkctrl_div_data omap4_aess_fclk_data__initconst = { + .max_div =2 , +}; + +static const struct omap_clkctrl_bit_data omap4_aess_bit_data[]__initconst = { + {24 ,TI_CLK_DIVIDER , omap4_aess_fclk_parents, &omap4_aess_fclk_data }, + {0 }, +}; + +static const char *const omap4_func_dmic_abe_gfclk_parents[]__initconst = { +"dmic_sync_mux_ck" , +"pad_clks_ck" , +"slimbus_clk" , +NULL , +}; + +static const char *const omap4_dmic_sync_mux_ck_parents[]__initconst = { +"abe_24m_fclk" , +"syc_clk_div_ck" , +"func_24m_clk" , +NULL , +}; + +static const struct omap_clkctrl_bit_data omap4_dmic_bit_data[]__initconst = { + {24 ,TI_CLK_MUX , omap4_func_dmic_abe_gfclk_parents,NULL }, + {26 ,TI_CLK_MUX , omap4_dmic_sync_mux_ck_parents,NULL }, + {0 }, +}; + +static const char *const omap4_func_mcasp_abe_gfclk_parents[]__initconst = { +"mcasp_sync_mux_ck" , +"pad_clks_ck" , +"slimbus_clk" , +NULL , +}; + +static const struct omap_clkctrl_bit_data omap4_mcasp_bit_data[]__initconst = { + {24 ,TI_CLK_MUX , omap4_func_mcasp_abe_gfclk_parents,NULL }, + {26 ,TI_CLK_MUX , omap4_dmic_sync_mux_ck_parents,NULL }, + {0 }, +}; + +static const char *const omap4_func_mcbsp1_gfclk_parents[]__initconst = { +"mcbsp1_sync_mux_ck" , +"pad_clks_ck" , +"slimbus_clk" , +NULL , +}; + +static const struct omap_clkctrl_bit_data omap4_mcbsp1_bit_data[]__initconst = { + {24 ,TI_CLK_MUX , omap4_func_mcbsp1_gfclk_parents,NULL }, + {26 ,TI_CLK_MUX , omap4_dmic_sync_mux_ck_parents,NULL }, + {0 }, +}; + +static const char *const omap4_func_mcbsp2_gfclk_parents[]__initconst = { +"mcbsp2_sync_mux_ck" , +"pad_clks_ck" , +"slimbus_clk" , +NULL , +}; + +static const struct omap_clkctrl_bit_data omap4_mcbsp2_bit_data[]__initconst = { + {24 ,TI_CLK_MUX , omap4_func_mcbsp2_gfclk_parents,NULL }, + {26 ,TI_CLK_MUX , omap4_dmic_sync_mux_ck_parents,NULL }, + {0 }, +}; + +static const char *const omap4_func_mcbsp3_gfclk_parents[]__initconst = { +"mcbsp3_sync_mux_ck" , +"pad_clks_ck" , +"slimbus_clk" , +NULL , +}; + +static const struct omap_clkctrl_bit_data omap4_mcbsp3_bit_data[]__initconst = { + {24 ,TI_CLK_MUX , omap4_func_mcbsp3_gfclk_parents,NULL }, + {26 ,TI_CLK_MUX , omap4_dmic_sync_mux_ck_parents,NULL }, + {0 }, +}; + +static const char *const omap4_slimbus1_fclk_0_parents[]__initconst = { +"abe_24m_fclk" , +NULL , +}; + +static const char *const omap4_slimbus1_fclk_1_parents[]__initconst = { +"func_24m_clk" , +NULL , +}; + +static const char *const omap4_slimbus1_fclk_2_parents[]__initconst = { +"pad_clks_ck" , +NULL , +}; + +static const char *const omap4_slimbus1_slimbus_clk_parents[]__initconst = { +"slimbus_clk" , +NULL , +}; + +static const struct omap_clkctrl_bit_data omap4_slimbus1_bit_data[]__initconst = { + {8 ,TI_CLK_GATE , omap4_slimbus1_fclk_0_parents,NULL }, + {9 ,TI_CLK_GATE , omap4_slimbus1_fclk_1_parents,NULL }, + {10 ,TI_CLK_GATE , omap4_slimbus1_fclk_2_parents,NULL }, + {11 ,TI_CLK_GATE , omap4_slimbus1_slimbus_clk_parents,NULL }, + {0 }, +}; + +static const char *const omap4_timer5_sync_mux_parents[]__initconst = { +"syc_clk_div_ck" , +"sys_32k_ck" , +NULL , +}; + +static const struct omap_clkctrl_bit_data omap4_timer5_bit_data[]__initconst = { + {24 ,TI_CLK_MUX , omap4_timer5_sync_mux_parents,NULL }, + {0 }, +}; + +static const struct omap_clkctrl_bit_data omap4_timer6_bit_data[]__initconst = { + {24 ,TI_CLK_MUX , omap4_timer5_sync_mux_parents,NULL }, + {0 }, +}; + +static const struct omap_clkctrl_bit_data omap4_timer7_bit_data[]__initconst = { + {24 ,TI_CLK_MUX , omap4_timer5_sync_mux_parents,NULL }, + {0 }, +}; + +static const struct omap_clkctrl_bit_data omap4_timer8_bit_data[]__initconst = { + {24 ,TI_CLK_MUX , omap4_timer5_sync_mux_parents,NULL }, + {0 }, +}; + +static const struct omap_clkctrl_reg_data omap4_abe_clkctrl_regs[]__initconst = { + {OMAP4_L4_ABE_CLKCTRL ,NULL ,0 ,"ocp_abe_iclk" }, + {OMAP4_AESS_CLKCTRL , omap4_aess_bit_data,CLKF_SW_SUP ,"aess_fclk" }, + {OMAP4_MCPDM_CLKCTRL ,NULL ,CLKF_SW_SUP ,"pad_clks_ck" }, + {OMAP4_DMIC_CLKCTRL , omap4_dmic_bit_data,CLKF_SW_SUP ,"func_dmic_abe_gfclk" }, + {OMAP4_MCASP_CLKCTRL , omap4_mcasp_bit_data,CLKF_SW_SUP ,"func_mcasp_abe_gfclk" }, + {OMAP4_MCBSP1_CLKCTRL , omap4_mcbsp1_bit_data,CLKF_SW_SUP ,"func_mcbsp1_gfclk" }, + {OMAP4_MCBSP2_CLKCTRL , omap4_mcbsp2_bit_data,CLKF_SW_SUP ,"func_mcbsp2_gfclk" }, + {OMAP4_MCBSP3_CLKCTRL , omap4_mcbsp3_bit_data,CLKF_SW_SUP ,"func_mcbsp3_gfclk" }, + {OMAP4_SLIMBUS1_CLKCTRL , omap4_slimbus1_bit_data,CLKF_SW_SUP ,"slimbus1_fclk_0" }, + {OMAP4_TIMER5_CLKCTRL , omap4_timer5_bit_data,CLKF_SW_SUP ,"timer5_sync_mux" }, + {OMAP4_TIMER6_CLKCTRL , omap4_timer6_bit_data,CLKF_SW_SUP ,"timer6_sync_mux" }, + {OMAP4_TIMER7_CLKCTRL , omap4_timer7_bit_data,CLKF_SW_SUP ,"timer7_sync_mux" }, + {OMAP4_TIMER8_CLKCTRL , omap4_timer8_bit_data,CLKF_SW_SUP ,"timer8_sync_mux" }, + {OMAP4_WD_TIMER3_CLKCTRL ,NULL ,CLKF_SW_SUP ,"sys_32k_ck" }, + {0 }, +}; + +static const struct omap_clkctrl_reg_data omap4_l4_ao_clkctrl_regs[]__initconst = { + {OMAP4_SMARTREFLEX_MPU_CLKCTRL ,NULL ,CLKF_SW_SUP ,"l4_wkup_clk_mux_ck" }, + {OMAP4_SMARTREFLEX_IVA_CLKCTRL ,NULL ,CLKF_SW_SUP ,"l4_wkup_clk_mux_ck" }, + {OMAP4_SMARTREFLEX_CORE_CLKCTRL ,NULL ,CLKF_SW_SUP ,"l4_wkup_clk_mux_ck" }, + {0 }, +}; + +static const struct omap_clkctrl_reg_data omap4_l3_1_clkctrl_regs[]__initconst = { + {OMAP4_L3_MAIN_1_CLKCTRL ,NULL ,0 ,"l3_div_ck" }, + {0 }, +}; + +static const struct omap_clkctrl_reg_data omap4_l3_2_clkctrl_regs[]__initconst = { + {OMAP4_L3_MAIN_2_CLKCTRL ,NULL ,0 ,"l3_div_ck" }, + {OMAP4_GPMC_CLKCTRL ,NULL ,CLKF_HW_SUP ,"l3_div_ck" }, + {OMAP4_OCMC_RAM_CLKCTRL ,NULL ,0 ,"l3_div_ck" }, + {0 }, +}; + +static const struct omap_clkctrl_reg_data omap4_ducati_clkctrl_regs[]__initconst = { + {OMAP4_IPU_CLKCTRL ,NULL ,CLKF_HW_SUP ,"ducati_clk_mux_ck" }, + {0 }, +}; + +static const struct omap_clkctrl_reg_data omap4_l3_dma_clkctrl_regs[]__initconst = { + {OMAP4_DMA_SYSTEM_CLKCTRL ,NULL ,0 ,"l3_div_ck" }, + {0 }, +}; + +static const struct omap_clkctrl_reg_data omap4_l3_emif_clkctrl_regs[]__initconst = { + {OMAP4_DMM_CLKCTRL ,NULL ,0 ,"l3_div_ck" }, + {OMAP4_EMIF1_CLKCTRL ,NULL ,CLKF_HW_SUP ,"ddrphy_ck" }, + {OMAP4_EMIF2_CLKCTRL ,NULL ,CLKF_HW_SUP ,"ddrphy_ck" }, + {0 }, +}; + +static const struct omap_clkctrl_reg_data omap4_d2d_clkctrl_regs[]__initconst = { + {OMAP4_C2C_CLKCTRL ,NULL ,0 ,"div_core_ck" }, + {0 }, +}; + +static const struct omap_clkctrl_reg_data omap4_l4_cfg_clkctrl_regs[]__initconst = { + {OMAP4_L4_CFG_CLKCTRL ,NULL ,0 ,"l4_div_ck" }, + {OMAP4_SPINLOCK_CLKCTRL ,NULL ,0 ,"l4_div_ck" }, + {OMAP4_MAILBOX_CLKCTRL ,NULL ,0 ,"l4_div_ck" }, + {0 }, +}; + +static const struct omap_clkctrl_reg_data omap4_l3_instr_clkctrl_regs[]__initconst = { + {OMAP4_L3_MAIN_3_CLKCTRL ,NULL ,CLKF_HW_SUP ,"l3_div_ck" }, + {OMAP4_L3_INSTR_CLKCTRL ,NULL ,CLKF_HW_SUP ,"l3_div_ck" }, + {OMAP4_OCP_WP_NOC_CLKCTRL ,NULL ,CLKF_HW_SUP ,"l3_div_ck" }, + {0 }, +}; + +static const struct omap_clkctrl_reg_data omap4_ivahd_clkctrl_regs[]__initconst = { + {OMAP4_IVA_CLKCTRL ,NULL ,CLKF_HW_SUP ,"dpll_iva_m5x2_ck" }, + {OMAP4_SL2IF_CLKCTRL ,NULL ,CLKF_HW_SUP ,"dpll_iva_m5x2_ck" }, + {0 }, +}; + +static const char *const omap4_iss_ctrlclk_parents[]__initconst = { +"func_96m_fclk" , +NULL , +}; + +static const struct omap_clkctrl_bit_data omap4_iss_bit_data[]__initconst = { + {8 ,TI_CLK_GATE , omap4_iss_ctrlclk_parents,NULL }, + {0 }, +}; + +static const char *const omap4_fdif_fck_parents[]__initconst = { +"dpll_per_m4x2_ck" , +NULL , +}; + +static const struct omap_clkctrl_div_data omap4_fdif_fck_data__initconst = { + .max_div =4 , +}; + +static const struct omap_clkctrl_bit_data omap4_fdif_bit_data[]__initconst = { + {24 ,TI_CLK_DIVIDER , omap4_fdif_fck_parents, &omap4_fdif_fck_data }, + {0 }, +}; + +static const struct omap_clkctrl_reg_data omap4_iss_clkctrl_regs[]__initconst = { + {OMAP4_ISS_CLKCTRL , omap4_iss_bit_data,CLKF_SW_SUP ,"ducati_clk_mux_ck" }, + {OMAP4_FDIF_CLKCTRL , omap4_fdif_bit_data,CLKF_SW_SUP ,"fdif_fck" }, + {0 }, +}; + +static const char *const omap4_dss_dss_clk_parents[]__initconst = { +"dpll_per_m5x2_ck" , +NULL , +}; + +static const char *const omap4_dss_48mhz_clk_parents[]__initconst = { +"func_48mc_fclk" , +NULL , +}; + +static const char *const omap4_dss_sys_clk_parents[]__initconst = { +"syc_clk_div_ck" , +NULL , +}; + +static const char *const omap4_dss_tv_clk_parents[]__initconst = { +"extalt_clkin_ck" , +NULL , +}; + +static const struct omap_clkctrl_bit_data omap4_dss_dispc_bit_data[]__initconst = { + {8 ,TI_CLK_GATE , omap4_dss_dss_clk_parents,NULL }, + {9 ,TI_CLK_GATE , omap4_dss_48mhz_clk_parents,NULL }, + {10 ,TI_CLK_GATE , omap4_dss_sys_clk_parents,NULL }, + {11 ,TI_CLK_GATE , omap4_dss_tv_clk_parents,NULL }, + {0 }, +}; + +static const struct omap_clkctrl_reg_data omap4_l3_dss_clkctrl_regs[]__initconst = { + {OMAP4_DSS_DISPC_CLKCTRL , omap4_dss_dispc_bit_data,0 ,"dss_dss_clk" }, + {0 }, +}; + +static const char *const omap4_sgx_clk_mux_parents[]__initconst = { +"dpll_core_m7x2_ck" , +"dpll_per_m7x2_ck" , +NULL , +}; + +static const struct omap_clkctrl_bit_data omap4_gpu_bit_data[]__initconst = { + {24 ,TI_CLK_MUX , omap4_sgx_clk_mux_parents,NULL }, + {0 }, +}; + +static const struct omap_clkctrl_reg_data omap4_l3_gfx_clkctrl_regs[]__initconst = { + {OMAP4_GPU_CLKCTRL , omap4_gpu_bit_data,CLKF_SW_SUP ,"sgx_clk_mux" }, + {0 }, +}; + +static const char *const omap4_hsmmc1_fclk_parents[]__initconst = { +"func_64m_fclk" , +"func_96m_fclk" , +NULL , +}; + +static const struct omap_clkctrl_bit_data omap4_mmc1_bit_data[]__initconst = { + {24 ,TI_CLK_MUX , omap4_hsmmc1_fclk_parents,NULL }, + {0 }, +}; + +static const struct omap_clkctrl_bit_data omap4_mmc2_bit_data[]__initconst = { + {24 ,TI_CLK_MUX , omap4_hsmmc1_fclk_parents,NULL }, + {0 }, +}; + +static const char *const omap4_hsi_fck_parents[]__initconst = { +"dpll_per_m2x2_ck" , +NULL , +}; + +static const struct omap_clkctrl_div_data omap4_hsi_fck_data__initconst = { + .max_div =4 , +}; + +static const struct omap_clkctrl_bit_data omap4_hsi_bit_data[]__initconst = { + {24 ,TI_CLK_DIVIDER , omap4_hsi_fck_parents, &omap4_hsi_fck_data }, + {0 }, +}; + +static const char *const omap4_usb_host_hs_utmi_p1_clk_parents[]__initconst = { +"utmi_p1_gfclk" , +NULL , +}; + +static const char *const omap4_usb_host_hs_utmi_p2_clk_parents[]__initconst = { +"utmi_p2_gfclk" , +NULL , +}; + +static const char *const omap4_usb_host_hs_utmi_p3_clk_parents[]__initconst = { +"init_60m_fclk" , +NULL , +}; + +static const char *const omap4_usb_host_hs_hsic480m_p1_clk_parents[]__initconst = { +"dpll_usb_m2_ck" , +NULL , +}; + +static const char *const omap4_utmi_p1_gfclk_parents[]__initconst = { +"init_60m_fclk" , +"xclk60mhsp1_ck" , +NULL , +}; + +static const char *const omap4_utmi_p2_gfclk_parents[]__initconst = { +"init_60m_fclk" , +"xclk60mhsp2_ck" , +NULL , +}; + +static const struct omap_clkctrl_bit_data omap4_usb_host_hs_bit_data[]__initconst = { + {8 ,TI_CLK_GATE , omap4_usb_host_hs_utmi_p1_clk_parents,NULL }, + {9 ,TI_CLK_GATE , omap4_usb_host_hs_utmi_p2_clk_parents,NULL }, + {10 ,TI_CLK_GATE , omap4_usb_host_hs_utmi_p3_clk_parents,NULL }, + {11 ,TI_CLK_GATE , omap4_usb_host_hs_utmi_p3_clk_parents,NULL }, + {12 ,TI_CLK_GATE , omap4_usb_host_hs_utmi_p3_clk_parents,NULL }, + {13 ,TI_CLK_GATE , omap4_usb_host_hs_hsic480m_p1_clk_parents,NULL }, + {14 ,TI_CLK_GATE , omap4_usb_host_hs_hsic480m_p1_clk_parents,NULL }, + {15 ,TI_CLK_GATE , omap4_dss_48mhz_clk_parents,NULL }, + {24 ,TI_CLK_MUX , omap4_utmi_p1_gfclk_parents,NULL }, + {25 ,TI_CLK_MUX , omap4_utmi_p2_gfclk_parents,NULL }, + {0 }, +}; + +static const char *const omap4_usb_otg_hs_xclk_parents[]__initconst = { +"otg_60m_gfclk" , +NULL , +}; + +static const char *const omap4_otg_60m_gfclk_parents[]__initconst = { +"utmi_phy_clkout_ck" , +"xclk60motg_ck" , +NULL , +}; + +static const struct omap_clkctrl_bit_data omap4_usb_otg_hs_bit_data[]__initconst = { + {8 ,TI_CLK_GATE , omap4_usb_otg_hs_xclk_parents,NULL }, + {24 ,TI_CLK_MUX , omap4_otg_60m_gfclk_parents,NULL }, + {0 }, +}; + +static const struct omap_clkctrl_bit_data omap4_usb_tll_hs_bit_data[]__initconst = { + {8 ,TI_CLK_GATE , omap4_usb_host_hs_utmi_p3_clk_parents,NULL }, + {9 ,TI_CLK_GATE , omap4_usb_host_hs_utmi_p3_clk_parents,NULL }, + {10 ,TI_CLK_GATE , omap4_usb_host_hs_utmi_p3_clk_parents,NULL }, + {0 }, +}; + +static const char *const omap4_ocp2scp_usb_phy_phy_48m_parents[]__initconst = { +"func_48m_fclk" , +NULL , +}; + +static const struct omap_clkctrl_bit_data omap4_ocp2scp_usb_phy_bit_data[]__initconst = { + {8 ,TI_CLK_GATE , omap4_ocp2scp_usb_phy_phy_48m_parents,NULL }, + {0 }, +}; + +static const struct omap_clkctrl_reg_data omap4_l3_init_clkctrl_regs[]__initconst = { + {OMAP4_MMC1_CLKCTRL , omap4_mmc1_bit_data,CLKF_SW_SUP ,"hsmmc1_fclk" }, + {OMAP4_MMC2_CLKCTRL , omap4_mmc2_bit_data,CLKF_SW_SUP ,"hsmmc2_fclk" }, + {OMAP4_HSI_CLKCTRL , omap4_hsi_bit_data,CLKF_HW_SUP ,"hsi_fck" }, + {OMAP4_USB_HOST_HS_CLKCTRL , omap4_usb_host_hs_bit_data,CLKF_SW_SUP ,"init_60m_fclk" }, + {OMAP4_USB_OTG_HS_CLKCTRL , omap4_usb_otg_hs_bit_data,CLKF_HW_SUP ,"l3_div_ck" }, + {OMAP4_USB_TLL_HS_CLKCTRL , omap4_usb_tll_hs_bit_data,CLKF_HW_SUP ,"l4_div_ck" }, + {OMAP4_USB_HOST_FS_CLKCTRL ,NULL ,CLKF_SW_SUP ,"func_48mc_fclk" }, + {OMAP4_OCP2SCP_USB_PHY_CLKCTRL , omap4_ocp2scp_usb_phy_bit_data,CLKF_HW_SUP ,"ocp2scp_usb_phy_phy_48m" }, + {0 }, +}; + +static const char *const omap4_cm2_dm10_mux_parents[]__initconst = { +"sys_clkin_ck" , +"sys_32k_ck" , +NULL , +}; + +static const struct omap_clkctrl_bit_data omap4_timer10_bit_data[]__initconst = { + {24 ,TI_CLK_MUX , omap4_cm2_dm10_mux_parents,NULL }, + {0 }, +}; + +static const struct omap_clkctrl_bit_data omap4_timer11_bit_data[]__initconst = { + {24 ,TI_CLK_MUX , omap4_cm2_dm10_mux_parents,NULL }, + {0 }, +}; + +static const struct omap_clkctrl_bit_data omap4_timer2_bit_data[]__initconst = { + {24 ,TI_CLK_MUX , omap4_cm2_dm10_mux_parents,NULL }, + {0 }, +}; + +static const struct omap_clkctrl_bit_data omap4_timer3_bit_data[]__initconst = { + {24 ,TI_CLK_MUX , omap4_cm2_dm10_mux_parents,NULL }, + {0 }, +}; + +static const struct omap_clkctrl_bit_data omap4_timer4_bit_data[]__initconst = { + {24 ,TI_CLK_MUX , omap4_cm2_dm10_mux_parents,NULL }, + {0 }, +}; + +static const struct omap_clkctrl_bit_data omap4_timer9_bit_data[]__initconst = { + {24 ,TI_CLK_MUX , omap4_cm2_dm10_mux_parents,NULL }, + {0 }, +}; + +static const char *const omap4_gpio2_dbclk_parents[]__initconst = { +"sys_32k_ck" , +NULL , +}; + +static const struct omap_clkctrl_bit_data omap4_gpio2_bit_data[]__initconst = { + {8 ,TI_CLK_GATE , omap4_gpio2_dbclk_parents,NULL }, + {0 }, +}; + +static const struct omap_clkctrl_bit_data omap4_gpio3_bit_data[]__initconst = { + {8 ,TI_CLK_GATE , omap4_gpio2_dbclk_parents,NULL }, + {0 }, +}; + +static const struct omap_clkctrl_bit_data omap4_gpio4_bit_data[]__initconst = { + {8 ,TI_CLK_GATE , omap4_gpio2_dbclk_parents,NULL }, + {0 }, +}; + +static const struct omap_clkctrl_bit_data omap4_gpio5_bit_data[]__initconst = { + {8 ,TI_CLK_GATE , omap4_gpio2_dbclk_parents,NULL }, + {0 }, +}; + +static const struct omap_clkctrl_bit_data omap4_gpio6_bit_data[]__initconst = { + {8 ,TI_CLK_GATE , omap4_gpio2_dbclk_parents,NULL }, + {0 }, +}; + +static const char *const omap4_per_mcbsp4_gfclk_parents[]__initconst = { +"mcbsp4_sync_mux_ck" , +"pad_clks_ck" , +NULL , +}; + +static const char *const omap4_mcbsp4_sync_mux_ck_parents[]__initconst = { +"func_96m_fclk" , +"per_abe_nc_fclk" , +NULL , +}; + +static const struct omap_clkctrl_bit_data omap4_mcbsp4_bit_data[]__initconst = { + {24 ,TI_CLK_MUX , omap4_per_mcbsp4_gfclk_parents,NULL }, + {25 ,TI_CLK_MUX , omap4_mcbsp4_sync_mux_ck_parents,NULL }, + {0 }, +}; + +static const char *const omap4_slimbus2_fclk_0_parents[]__initconst = { +"func_24mc_fclk" , +NULL , +}; + +static const char *const omap4_slimbus2_fclk_1_parents[]__initconst = { +"per_abe_24m_fclk" , +NULL , +}; + +static const char *const omap4_slimbus2_slimbus_clk_parents[]__initconst = { +"pad_slimbus_core_clks_ck" , +NULL , +}; + +static const struct omap_clkctrl_bit_data omap4_slimbus2_bit_data[]__initconst = { + {8 ,TI_CLK_GATE , omap4_slimbus2_fclk_0_parents,NULL }, + {9 ,TI_CLK_GATE , omap4_slimbus2_fclk_1_parents,NULL }, + {10 ,TI_CLK_GATE , omap4_slimbus2_slimbus_clk_parents,NULL }, + {0 }, +}; + +static const struct omap_clkctrl_reg_data omap4_l4_per_clkctrl_regs[]__initconst = { + {OMAP4_TIMER10_CLKCTRL , omap4_timer10_bit_data,CLKF_SW_SUP ,"cm2_dm10_mux" }, + {OMAP4_TIMER11_CLKCTRL , omap4_timer11_bit_data,CLKF_SW_SUP ,"cm2_dm11_mux" }, + {OMAP4_TIMER2_CLKCTRL , omap4_timer2_bit_data,CLKF_SW_SUP ,"cm2_dm2_mux" }, + {OMAP4_TIMER3_CLKCTRL , omap4_timer3_bit_data,CLKF_SW_SUP ,"cm2_dm3_mux" }, + {OMAP4_TIMER4_CLKCTRL , omap4_timer4_bit_data,CLKF_SW_SUP ,"cm2_dm4_mux" }, + {OMAP4_TIMER9_CLKCTRL , omap4_timer9_bit_data,CLKF_SW_SUP ,"cm2_dm9_mux" }, + {OMAP4_ELM_CLKCTRL ,NULL ,0 ,"l4_div_ck" }, + {OMAP4_GPIO2_CLKCTRL , omap4_gpio2_bit_data,CLKF_HW_SUP ,"l4_div_ck" }, + {OMAP4_GPIO3_CLKCTRL , omap4_gpio3_bit_data,CLKF_HW_SUP ,"l4_div_ck" }, + {OMAP4_GPIO4_CLKCTRL , omap4_gpio4_bit_data,CLKF_HW_SUP ,"l4_div_ck" }, + {OMAP4_GPIO5_CLKCTRL , omap4_gpio5_bit_data,CLKF_HW_SUP ,"l4_div_ck" }, + {OMAP4_GPIO6_CLKCTRL , omap4_gpio6_bit_data,CLKF_HW_SUP ,"l4_div_ck" }, + {OMAP4_HDQ1W_CLKCTRL ,NULL ,CLKF_SW_SUP ,"func_12m_fclk" }, + {OMAP4_I2C1_CLKCTRL ,NULL ,CLKF_SW_SUP ,"func_96m_fclk" }, + {OMAP4_I2C2_CLKCTRL ,NULL ,CLKF_SW_SUP ,"func_96m_fclk" }, + {OMAP4_I2C3_CLKCTRL ,NULL ,CLKF_SW_SUP ,"func_96m_fclk" }, + {OMAP4_I2C4_CLKCTRL ,NULL ,CLKF_SW_SUP ,"func_96m_fclk" }, + {OMAP4_L4_PER_CLKCTRL ,NULL ,0 ,"l4_div_ck" }, + {OMAP4_MCBSP4_CLKCTRL , omap4_mcbsp4_bit_data,CLKF_SW_SUP ,"per_mcbsp4_gfclk" }, + {OMAP4_MCSPI1_CLKCTRL ,NULL ,CLKF_SW_SUP ,"func_48m_fclk" }, + {OMAP4_MCSPI2_CLKCTRL ,NULL ,CLKF_SW_SUP ,"func_48m_fclk" }, + {OMAP4_MCSPI3_CLKCTRL ,NULL ,CLKF_SW_SUP ,"func_48m_fclk" }, + {OMAP4_MCSPI4_CLKCTRL ,NULL ,CLKF_SW_SUP ,"func_48m_fclk" }, + {OMAP4_MMC3_CLKCTRL ,NULL ,CLKF_SW_SUP ,"func_48m_fclk" }, + {OMAP4_MMC4_CLKCTRL ,NULL ,CLKF_SW_SUP ,"func_48m_fclk" }, + {OMAP4_SLIMBUS2_CLKCTRL , omap4_slimbus2_bit_data,CLKF_SW_SUP ,"slimbus2_fclk_0" }, + {OMAP4_UART1_CLKCTRL ,NULL ,CLKF_SW_SUP ,"func_48m_fclk" }, + {OMAP4_UART2_CLKCTRL ,NULL ,CLKF_SW_SUP ,"func_48m_fclk" }, + {OMAP4_UART3_CLKCTRL ,NULL ,CLKF_SW_SUP ,"func_48m_fclk" }, + {OMAP4_UART4_CLKCTRL ,NULL ,CLKF_SW_SUP ,"func_48m_fclk" }, + {OMAP4_MMC5_CLKCTRL ,NULL ,CLKF_SW_SUP ,"func_48m_fclk" }, + {0 }, +}; + +static const struct omap_clkctrl_bit_data omap4_gpio1_bit_data[]__initconst = { + {8 ,TI_CLK_GATE , omap4_gpio2_dbclk_parents,NULL }, + {0 }, +}; + +static const struct omap_clkctrl_bit_data omap4_timer1_bit_data[]__initconst = { + {24 ,TI_CLK_MUX , omap4_cm2_dm10_mux_parents,NULL }, + {0 }, +}; + +static const struct omap_clkctrl_reg_data omap4_l4_wkup_clkctrl_regs[]__initconst = { + {OMAP4_L4_WKUP_CLKCTRL ,NULL ,0 ,"l4_wkup_clk_mux_ck" }, + {OMAP4_WD_TIMER2_CLKCTRL ,NULL ,CLKF_SW_SUP ,"sys_32k_ck" }, + {OMAP4_GPIO1_CLKCTRL , omap4_gpio1_bit_data,CLKF_HW_SUP ,"l4_wkup_clk_mux_ck" }, + {OMAP4_TIMER1_CLKCTRL , omap4_timer1_bit_data,CLKF_SW_SUP ,"dmt1_clk_mux" }, + {OMAP4_COUNTER_32K_CLKCTRL ,NULL ,0 ,"sys_32k_ck" }, + {OMAP4_KBD_CLKCTRL ,NULL ,CLKF_SW_SUP ,"sys_32k_ck" }, + {0 }, +}; + +static const char *const omap4_pmd_stm_clock_mux_ck_parents[]__initconst = { +"sys_clkin_ck" , +"dpll_core_m6x2_ck" , +"tie_low_clock_ck" , +NULL , +}; + +static const char *const omap4_trace_clk_div_div_ck_parents[]__initconst = { +"pmd_trace_clk_mux_ck" , +NULL , +}; + +static const int omap4_trace_clk_div_div_ck_divs[]__initconst = { +0 , +1 , +2 , +0 , +4 , +-1 , +}; + +static const struct omap_clkctrl_div_data omap4_trace_clk_div_div_ck_data__initconst = { + .dividers = omap4_trace_clk_div_div_ck_divs, +}; + +static const char *const omap4_stm_clk_div_ck_parents[]__initconst = { +"pmd_stm_clock_mux_ck" , +NULL , +}; + +static const struct omap_clkctrl_div_data omap4_stm_clk_div_ck_data__initconst = { + .max_div =64 , +}; + +static const struct omap_clkctrl_bit_data omap4_debugss_bit_data[]__initconst = { + {20 ,TI_CLK_MUX , omap4_pmd_stm_clock_mux_ck_parents,NULL }, + {22 ,TI_CLK_MUX , omap4_pmd_stm_clock_mux_ck_parents,NULL }, + {24 ,TI_CLK_DIVIDER , omap4_trace_clk_div_div_ck_parents, &omap4_trace_clk_div_div_ck_data }, + {27 ,TI_CLK_DIVIDER , omap4_stm_clk_div_ck_parents, &omap4_stm_clk_div_ck_data }, + {0 }, +}; + +static const struct omap_clkctrl_reg_data omap4_emu_sys_clkctrl_regs[]__initconst = { + {OMAP4_DEBUGSS_CLKCTRL , omap4_debugss_bit_data,0 ,"trace_clk_div_ck" }, + {0 }, +}; + +const struct omap_clkctrl_data omap4_clkctrl_data[]__initconst = { + {0x4a004320 , omap4_mpuss_clkctrl_regs }, + {0x4a004420 , omap4_tesla_clkctrl_regs }, + {0x4a004520 , omap4_abe_clkctrl_regs }, + {0x4a008620 , omap4_l4_ao_clkctrl_regs }, + {0x4a008720 , omap4_l3_1_clkctrl_regs }, + {0x4a008820 , omap4_l3_2_clkctrl_regs }, + {0x4a008920 , omap4_ducati_clkctrl_regs }, + {0x4a008a20 , omap4_l3_dma_clkctrl_regs }, + {0x4a008b20 , omap4_l3_emif_clkctrl_regs }, + {0x4a008c20 , omap4_d2d_clkctrl_regs }, + {0x4a008d20 , omap4_l4_cfg_clkctrl_regs }, + {0x4a008e20 , omap4_l3_instr_clkctrl_regs }, + {0x4a008f20 , omap4_ivahd_clkctrl_regs }, + {0x4a009020 , omap4_iss_clkctrl_regs }, + {0x4a009120 , omap4_l3_dss_clkctrl_regs }, + {0x4a009220 , omap4_l3_gfx_clkctrl_regs }, + {0x4a009320 , omap4_l3_init_clkctrl_regs }, + {0x4a009420 , omap4_l4_per_clkctrl_regs }, + {0x4a307820 , omap4_l4_wkup_clkctrl_regs }, + {0x4a307a20 , omap4_emu_sys_clkctrl_regs }, + {0 }, +}; +static struct ti_dt_clk omap44xx_clks[] = {DT_CLK ("smp_twd" ,NULL ,"mpu_periphclk" ),DT_CLK ("omapdss_dss" ,"ick" ,"dss_fck" ),
Signature · 1 line
1.9.1
PATCH 4/6 ARM: OMAP2+: hwmod: assign hwmod-ck as main clock from DT if available
In reply to Tero KristoFix the main clock assignment to assign hwmod-ck from DT as the main clock if available. If main clock is assigned via DT, the direct PRCM access for module handling is not used on OMAP4+ architectures either, as it is assumed the main clock will be doing this instead.
This patch also drops the obsolete "_mod_ck" search as the implementation required for this was not accepted upstream.
--- arch/arm/mach-omap2/omap_hwmod.c | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-)
arch/arm/mach-omap2/omap_hwmod.c +18 -20
@@ -731,31 +731,29 @@ static int _del_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh)/** * _init_main_clk - get a struct clk * for the the hwmod's main functional clk * @oh: struct omap_hwmod * +* @np: device node mapped to this hwmod * * Called from _init_clocks(). Populates the @oh _clk (main * functional clock pointer) if a clock matching the hwmod name is found, * or a main_clk is present. Returns 0 on success or -EINVAL on error. */ -static int _init_main_clk (struct omap_hwmod *oh) +static int _init_main_clk (struct omap_hwmod *oh,struct device_node *np) {int ret =0 ; -char name[MOD_CLK_MAX_NAME_LEN ]; -struct clk *clk; +struct clk *clk =NULL ; -/* +7 magic comes from '_mod_ck' suffix */ -if (strlen (oh->name) +7 >MOD_CLK_MAX_NAME_LEN ) -pr_warn ("%s: warning: cropping name for %s\n" , __func__, - oh->name); - -strncpy (name, oh->name,MOD_CLK_MAX_NAME_LEN -7 ); -strcat (name,"_mod_ck" ); +if (np) { + clk =of_clk_get_by_name (np,"clkctrl" ); +if (!IS_ERR (clk)) { +pr_debug ("%s: mapped main_clk %s for %s\n" , __func__, +__clk_get_name (clk), oh->name); + oh->main_clk =__clk_get_name (clk); + oh->_clk = clk; + soc_ops.disable_direct_prcm (oh); + } + } - clk =clk_get (NULL , name); -if (!IS_ERR (clk)) { - oh->_clk = clk; - soc_ops.disable_direct_prcm (oh); - oh->main_clk =kstrdup (name,GFP_KERNEL ); - }else { +if (IS_ERR_OR_NULL (clk)) {if (!oh->main_clk)return 0 ;
@@ -1547,13 +1545,13 @@ static int _init_clkdm(struct omap_hwmod *oh)* _init_clocks - clk_get() all clocks associated with this hwmod. Retrieve as * well the clockdomain. * @oh: struct omap_hwmod * -* @data: not used; pass NULL +* @np: device_node mapped to this hwmod * * Called by omap_hwmod_setup_*() (after omap2_clk_init()). * Resolves all clock names embedded in the hwmod. Returns 0 on * success, or a negative error code on failure. */ -static int _init_clocks (struct omap_hwmod *oh,void *data) +static int _init_clocks (struct omap_hwmod *oh,struct device_node *np) {int ret =0 ;
@@ -1565,7 +1563,7 @@ static int _init_clocks(struct omap_hwmod *oh, void *data)if (soc_ops.init_clkdm) ret |= soc_ops.init_clkdm (oh); - ret |=_init_main_clk (oh); + ret |=_init_main_clk (oh, np); ret |=_init_interface_clks (oh); ret |=_init_opt_clks (oh);
@@ -2420,7 +2418,7 @@ static int __init _init(struct omap_hwmod *oh, void *data)return 0 ; } - r =_init_clocks (oh,NULL ); + r =_init_clocks (oh, np);if (r <0 ) {WARN (1 ,"omap_hwmod: %s: couldn't init clocks\n" , oh->name);return -EINVAL ;
Signature · 1 line
1.9.1
PATCH 5/6 ARM: dts: omap4: add some sample clkctrl data
In reply to Tero KristoAdds clkctrl nodes for cm_l4per and cm_abe as example. Peripherals using clocks from these nodes are modified also.
--- arch/arm/boot/dts/omap4.dtsi | 72 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 70 insertions(+), 2 deletions(-)
arch/arm/boot/dts/omap4.dtsi +70 -2
@@ -9,6 +9,7 @@ #include <dt-bindings/gpio/gpio.h> #include <dt-bindings/interrupt-controller/arm-gic.h> #include <dt-bindings/pinctrl/omap.h> +#include <dt-bindings/clock/omap4.h> / { compatible = "ti,omap4430", "ti,omap4";
@@ -131,27 +132,61 @@ ranges = <0 0x4a000000 0x1000000>; cm1: cm1 at 4000 { - compatible = "ti,omap4-cm1"; + compatible = "ti,omap4-cm1", "simple-bus"; reg = <0x4000 0x2000>; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0x4000 0x2000>; cm1_clocks: clocks { #address-cells = <1>; #size-cells = <0>; }; + cm_abe: cm_abe at 0 { + compatible = "ti,omap4-cm"; + reg = <0x500 0x100>; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0x500 0x100>; + + cm_abe_clkctrl: cm_abe_clkctrl at 20 { + compatible = "ti,omap4-clkctrl"; + reg = <0x20 0x6c>; + #clock-cells = <2>; + }; + }; + cm1_clockdomains: clockdomains { }; }; cm2: cm2 at 8000 { - compatible = "ti,omap4-cm2"; + compatible = "ti,omap4-cm2", "simple-bus"; reg = <0x8000 0x3000>; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0x8000 0x3000>; cm2_clocks: clocks { #address-cells = <1>; #size-cells = <0>; }; + cm_l4per: cm_l4per at 0 { + compatible = "ti,omap4-cm"; + reg = <0x1400 0x200>; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0x1400 0x200>; + + cm_l4per_clkctrl: cm_l4per_clkctrl at 20 { + compatible = "ti,omap4-clkctrl"; + reg = <0x20 0x1b0>; + #clock-cells = <2>; + }; + }; + cm2_clockdomains: clockdomains { }; };
@@ -304,6 +339,8 @@ #gpio-cells = <2>; interrupt-controller; #interrupt-cells = <2>; + clocks = <&cm_l4per_clkctrl OMAP4_GPIO2_CLKCTRL 0>; + clock-names = "clkctrl"; }; gpio3: gpio at 48057000 {
@@ -315,6 +352,8 @@ #gpio-cells = <2>; interrupt-controller; #interrupt-cells = <2>; + clocks = <&cm_l4per_clkctrl OMAP4_GPIO3_CLKCTRL 0>; + clock-names = "clkctrl"; }; gpio4: gpio at 48059000 {
@@ -384,6 +423,8 @@ interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>; ti,hwmods = "uart1"; clock-frequency = <48000000>; + clocks = <&cm_l4per_clkctrl OMAP4_UART1_CLKCTRL 0>; + clock-names = "clkctrl"; }; uart2: serial at 4806c000 {
@@ -392,6 +433,8 @@ interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>; ti,hwmods = "uart2"; clock-frequency = <48000000>; + clocks = <&cm_l4per_clkctrl OMAP4_UART2_CLKCTRL 0>; + clock-names = "clkctrl"; }; uart3: serial at 48020000 {
@@ -400,6 +443,8 @@ interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>; ti,hwmods = "uart3"; clock-frequency = <48000000>; + clocks = <&cm_l4per_clkctrl OMAP4_UART3_CLKCTRL 0>; + clock-names = "clkctrl"; }; uart4: serial at 4806e000 {
@@ -408,6 +453,8 @@ interrupts = <GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>; ti,hwmods = "uart4"; clock-frequency = <48000000>; + clocks = <&cm_l4per_clkctrl OMAP4_UART4_CLKCTRL 0>; + clock-names = "clkctrl"; }; hwspinlock: spinlock at 4a0f6000 {
@@ -424,6 +471,8 @@ #address-cells = <1>; #size-cells = <0>; ti,hwmods = "i2c1"; + clocks = <&cm_l4per_clkctrl OMAP4_I2C1_CLKCTRL 0>; + clock-names = "clkctrl"; }; i2c2: i2c at 48072000 {
@@ -433,6 +482,8 @@ #address-cells = <1>; #size-cells = <0>; ti,hwmods = "i2c2"; + clocks = <&cm_l4per_clkctrl OMAP4_I2C2_CLKCTRL 0>; + clock-names = "clkctrl"; }; i2c3: i2c at 48060000 {
@@ -442,6 +493,8 @@ #address-cells = <1>; #size-cells = <0>; ti,hwmods = "i2c3"; + clocks = <&cm_l4per_clkctrl OMAP4_I2C3_CLKCTRL 0>; + clock-names = "clkctrl"; }; i2c4: i2c at 48350000 {
@@ -451,6 +504,8 @@ #address-cells = <1>; #size-cells = <0>; ti,hwmods = "i2c4"; + clocks = <&cm_l4per_clkctrl OMAP4_I2C4_CLKCTRL 0>; + clock-names = "clkctrl"; }; mcspi1: spi at 48098000 {
@@ -522,6 +577,7 @@ dmas = <&sdma 61>, <&sdma 62>; dma-names = "tx", "rx"; pbias-supply = <&pbias_mmc_reg>; + }; mmc2: mmc at 480b4000 {
@@ -542,6 +598,8 @@ ti,needs-special-reset; dmas = <&sdma 77>, <&sdma 78>; dma-names = "tx", "rx"; + clocks = <&cm_l4per_clkctrl OMAP4_MMC3_CLKCTRL 0>; + clock-names = "clkctrl"; }; mmc4: mmc at 480d1000 {
@@ -552,6 +610,8 @@ ti,needs-special-reset; dmas = <&sdma 57>, <&sdma 58>; dma-names = "tx", "rx"; + clocks = <&cm_l4per_clkctrl OMAP4_MMC4_CLKCTRL 0>; + clock-names = "clkctrl"; }; mmc5: mmc at 480d5000 {
@@ -562,6 +622,8 @@ ti,needs-special-reset; dmas = <&sdma 59>, <&sdma 60>; dma-names = "tx", "rx"; + clocks = <&cm_l4per_clkctrl OMAP4_MMC5_CLKCTRL 0>; + clock-names = "clkctrl"; }; mmu_dsp: mmu at 4a066000 {
@@ -598,6 +660,8 @@ dmas = <&sdma 65>, <&sdma 66>; dma-names = "up_link", "dn_link"; + clocks = <&cm_abe_clkctrl OMAP4_MCPDM_CLKCTRL 0>; + clock-names = "clkctrl"; status = "disabled"; };
@@ -610,6 +674,8 @@ ti,hwmods = "dmic"; dmas = <&sdma 67>; dma-names = "up_link"; + clocks = <&cm_abe_clkctrl OMAP4_DMIC_CLKCTRL 0>; + clock-names = "clkctrl"; status = "disabled"; };
@@ -625,6 +691,8 @@ dmas = <&sdma 33>, <&sdma 34>; dma-names = "tx", "rx"; + clocks = <&cm_abe_clkctrl OMAP4_MCBSP1_CLKCTRL 0>; + clock-names = "clkctrl"; status = "disabled"; };
Signature · 1 line
1.9.1
Tony Lindgren
maintainerPATCH 5/6 ARM: dts: omap4: add some sample clkctrl data
Hi,
Quoted 2 lines · Tero Kristo
Adds clkctrl nodes for
cm_l4perandcm_abeas example. Peripherals using clocks from these nodes are modified also.
Finally got around testing these. Looks like applying this patch breaks things for devices not using the new clocks entry?
For example, SPI now breaks causing "imprecise external abort" during boot at least on droid 4.
arch/arm/boot/dts/omap4.dtsi line 176
Quoted 3 lines
arch/arm/boot/dts/omap4.dtsi +1
-0+ cm_l4per: cm_l4per at 0 {
Above should be cm_l4per: cm_l4per at 1400, right?
arch/arm/boot/dts/omap4.dtsi line 188
Quoted 12 lines
arch/arm/boot/dts/omap4.dtsi +12
-0+ compatible = "ti,omap4-cm"; + reg = <0x1400 0x200>; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0x1400 0x200>; + + cm_l4per_clkctrl: cm_l4per_clkctrl at 20 { + compatible = "ti,omap4-clkctrl"; + reg = <0x20 0x1b0>; + #clock-cells = <2>; + }; + };
You should update the binding doc accordingly if the "cm_l4per at 0" node there is not needed. I also noticed the binding doc still has "#clock-cells = <4>" while it should be 2.
Regards,
Tony
PATCH 5/6 ARM: dts: omap4: add some sample clkctrl data
Quoted 11 lines · Tony Lindgren
Hi,
Quoted 2 lines · Tero Kristo
Adds clkctrl nodes for
cm_l4perandcm_abeas example. Peripherals using clocks from these nodes are modified also.Finally got around testing these. Looks like applying this patch breaks things for devices not using the new clocks entry?
For example, SPI now breaks causing "imprecise external abort" during boot at least on droid 4.
If SPI is under l4per, then yes, a breakage is expected. This will cause a conflict with the existing hwmod data, and the new clock data, effectively disabling the IP clocks during boot. This patch only converts part of the DT data to the new format, and as such is only suitable for testing purposes.
I will provide a full data conversion for the DT file for 4.11-rc.
Quoted 6 lines
arch/arm/boot/dts/omap4.dtsi line 176
Quoted 4 lines
arch/arm/boot/dts/omap4.dtsi +1
-0+ cm_l4per: cm_l4per at 0 {Above should be
cm_l4per:cm_l4perat 1400, right?
Yea thats a bug in this test patch. Same issue with other nodes. DT compiler isn't too picky about these so it works even with wrong node name.
Quoted 17 lines
arch/arm/boot/dts/omap4.dtsi line 188
Quoted 13 lines
arch/arm/boot/dts/omap4.dtsi +12
-0+ compatible = "ti,omap4-cm"; + reg = <0x1400 0x200>; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0x1400 0x200>; + + cm_l4per_clkctrl: cm_l4per_clkctrl at 20 { + compatible = "ti,omap4-clkctrl"; + reg = <0x20 0x1b0>; + #clock-cells = <2>; + }; + };You should update the binding doc accordingly if the "
cm_l4perat 0" node there is not needed. I also noticed the binding doc still has "#clock-cells = <4>" while it should be 2.
cm_l4per is somewhat redundant right now, but we want to add clockdomains under that one in the future. Or, we could just add those directly under parent node also (cm2 in this case.)
-Tero
Tony Lindgren
maintainerPATCH 5/6 ARM: dts: omap4: add some sample clkctrl data
Quoted 13 lines · Tero Kristo
Quoted 11 lines · Tony Lindgren
Hi,
Quoted 2 lines · Tero Kristo
Adds clkctrl nodes for
cm_l4perandcm_abeas example. Peripherals using clocks from these nodes are modified also.Finally got around testing these. Looks like applying this patch breaks things for devices not using the new clocks entry?
For example, SPI now breaks causing "imprecise external abort" during boot at least on droid 4.
Quoted 6 lines
If SPI is under l4per, then yes, a breakage is expected. This will cause a conflict with the existing hwmod data, and the new clock data, effectively disabling the IP clocks during boot. This patch only converts part of the DT data to the new format, and as such is only suitable for testing purposes.
I will provide a full data conversion for the DT file for 4.11-rc.
OK
Quoted 27 lines
Quoted 5 lines
arch/arm/boot/dts/omap4.dtsi line 176
Quoted 3 lines
arch/arm/boot/dts/omap4.dtsi +1
-0+ cm_l4per: cm_l4per at 0 {Above should be
cm_l4per:cm_l4perat 1400, right?Yea thats a bug in this test patch. Same issue with other nodes. DT compiler isn't too picky about these so it works even with wrong node name.
Quoted 17 lines
arch/arm/boot/dts/omap4.dtsi line 188
Quoted 13 lines
arch/arm/boot/dts/omap4.dtsi +12
-0+ compatible = "ti,omap4-cm"; + reg = <0x1400 0x200>; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0x1400 0x200>; + + cm_l4per_clkctrl: cm_l4per_clkctrl at 20 { + compatible = "ti,omap4-clkctrl"; + reg = <0x20 0x1b0>; + #clock-cells = <2>; + }; + };You should update the binding doc accordingly if the "
cm_l4perat 0" node there is not needed. I also noticed the binding doc still has "#clock-cells = <4>" while it should be 2.
Quoted 3 lines
cm_l4peris somewhat redundant right now, but we want to add clockdomains under that one in the future. Or, we could just add those directly under parent node also (cm2 in this case.)
OK so probably best to add it to avoid tweaking the dts files again later on.
Regards,
Tony
Tony Lindgren
maintainerPATCH 5/6 ARM: dts: omap4: add some sample clkctrl data
In reply to Tero KristoQuoted 19 lines · Tero Kristo
arch/arm/boot/dts/omap4.dtsi +4
-0@@ -304,6 +339,8 @@ #gpio-cells = <2>; interrupt-controller; #interrupt-cells = <2>; + clocks = <&cm_l4per_clkctrl OMAP4_GPIO2_CLKCTRL 0>; + clock-names = "clkctrl"; }; gpio3: gpio at 48057000 {@@ -315,6 +352,8 @@ #gpio-cells = <2>; interrupt-controller; #interrupt-cells = <2>; + clocks = <&cm_l4per_clkctrl OMAP4_GPIO3_CLKCTRL 0>; + clock-names = "clkctrl"; }; gpio4: gpio at 48059000 {
arch/arm/boot/dts/omap4.dtsi line 428
Quoted 6 lines
arch/arm/boot/dts/omap4.dtsi +2
-0@@ -384,6 +423,8 @@ interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>; ti,hwmods = "uart1"; clock-frequency = <48000000>; + clocks = <&cm_l4per_clkctrl OMAP4_UART1_CLKCTRL 0>; + clock-names = "clkctrl"; };
BTW, one thing you might want to test also is that the opt clocks can be mapped here properly for gpios to reset. That can be easily tested by kexec booting on beagle-x15 where we currently get warnings on kexec boot about GPIOs failing to reset.
Regards,
Tony
PATCH 5/6 ARM: dts: omap4: add some sample clkctrl data
Quoted 18 lines · Tony Lindgren
Quoted 17 lines · Tero Kristo
arch/arm/boot/dts/omap4.dtsi +4
-0@@ -304,6 +339,8 @@ #gpio-cells = <2>; interrupt-controller; #interrupt-cells = <2>; + clocks = <&cm_l4per_clkctrl OMAP4_GPIO2_CLKCTRL 0>; + clock-names = "clkctrl"; }; gpio3: gpio at 48057000 {@@ -315,6 +352,8 @@ #gpio-cells = <2>; interrupt-controller; #interrupt-cells = <2>; + clocks = <&cm_l4per_clkctrl OMAP4_GPIO3_CLKCTRL 0>; + clock-names = "clkctrl"; };
Quoted 13 lines
arch/arm/boot/dts/omap4.dtsi line 428
Quoted 8 lines
arch/arm/boot/dts/omap4.dtsi +2
-0gpio4: gpio at 48059000 {@@ -384,6 +423,8 @@ interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>; ti,hwmods = "uart1"; clock-frequency = <48000000>; + clocks = <&cm_l4per_clkctrl OMAP4_UART1_CLKCTRL 0>; + clock-names = "clkctrl"; };BTW, one thing you might want to test also is that the opt clocks can be mapped here properly for gpios to reset. That can be easily tested by kexec booting on beagle-x15 where we currently get warnings on kexec boot about GPIOs failing to reset.
Ok, I'll check that also. I am planning to post the cleanup series this week, and post the clkctrl support next, as this one needs some data changes + additional testing.
-Tero
PATCH 5/6 ARM: dts: omap4: add some sample clkctrl data
In reply to Tero KristoQuoted 8 lines · Tero Kristo
Adds clkctrl nodes for
cm_l4perandcm_abeas example. Peripherals usingarch/arm/boot/dts/omap4.dtsi +1
-1@@ -131,27 +132,61 @@ ranges = <0 0x4a000000 0x1000000>; cm1: cm1 at 4000 { - compatible = "ti,omap4-cm1"; + compatible = "ti,omap4-cm1", "simple-bus"; reg = <0x4000 0x2000>;
arch/arm/boot/dts/omap4.dtsi line 146
Quoted 10 lines
arch/arm/boot/dts/omap4.dtsi +4
-0+ #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0x4000 0x2000>; cm1_clocks: clocks { #address-cells = <1>; #size-cells = <0>; }; + cm_abe: cm_abe at 0 {
The unit address should be 500 here.
Quoted 21 lines
arch/arm/boot/dts/omap4.dtsi +14
-1+ compatible = "ti,omap4-cm"; + reg = <0x500 0x100>; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0x500 0x100>; + + cm_abe_clkctrl: cm_abe_clkctrl at 20 { + compatible = "ti,omap4-clkctrl"; + reg = <0x20 0x6c>; + #clock-cells = <2>; + }; + }; + cm1_clockdomains: clockdomains { }; }; cm2: cm2 at 8000 { - compatible = "ti,omap4-cm2"; + compatible = "ti,omap4-cm2", "simple-bus"; reg = <0x8000 0x3000>;
arch/arm/boot/dts/omap4.dtsi line 176
Quoted 10 lines
arch/arm/boot/dts/omap4.dtsi +4
-0+ #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0x8000 0x3000>; cm2_clocks: clocks { #address-cells = <1>; #size-cells = <0>; }; + cm_l4per: cm_l4per at 0 {
and 1400 here.
Quoted 7 lines
arch/arm/boot/dts/omap4.dtsi +7
-0+ compatible = "ti,omap4-cm"; + reg = <0x1400 0x200>; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0x1400 0x200>; + + cm_l4per_clkctrl: cm_l4per_clkctrl at 20 {
Signature · 2 lines
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project
PATCH 5/6 ARM: dts: omap4: add some sample clkctrl data
Quoted 13 lines · Stephen Boyd
Quoted 12 lines · Tero Kristo
Adds clkctrl nodes for
cm_l4perandcm_abeas example. Peripherals usingarch/arm/boot/dts/omap4.dtsi +4
-1@@ -131,27 +132,61 @@ ranges = <0 0x4a000000 0x1000000>; cm1: cm1 at 4000 { - compatible = "ti,omap4-cm1"; + compatible = "ti,omap4-cm1", "simple-bus"; reg = <0x4000 0x2000>; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0x4000 0x2000>;
Quoted 8 lines
arch/arm/boot/dts/omap4.dtsi line 146
Quoted 6 lines
arch/arm/boot/dts/omap4.dtsi +1
-0cm1_clocks: clocks { #address-cells = <1>; #size-cells = <0>; }; + cm_abe: cm_abe at 0 {The unit address should be 500 here.
True.
Quoted 25 lines
Quoted 25 lines
arch/arm/boot/dts/omap4.dtsi +17
-1+ compatible = "ti,omap4-cm"; + reg = <0x500 0x100>; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0x500 0x100>; + + cm_abe_clkctrl: cm_abe_clkctrl at 20 { + compatible = "ti,omap4-clkctrl"; + reg = <0x20 0x6c>; + #clock-cells = <2>; + }; + }; + cm1_clockdomains: clockdomains { }; }; cm2: cm2 at 8000 { - compatible = "ti,omap4-cm2"; + compatible = "ti,omap4-cm2", "simple-bus"; reg = <0x8000 0x3000>; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0x8000 0x3000>;
Quoted 8 lines
arch/arm/boot/dts/omap4.dtsi line 176
Quoted 6 lines
arch/arm/boot/dts/omap4.dtsi +1
-0cm2_clocks: clocks { #address-cells = <1>; #size-cells = <0>; }; + cm_l4per: cm_l4per at 0 {and 1400 here.
Yeah, these two are obviously wrong as noted before. Will be fixed in the full patch I will provide hopefully next week.
-Tero
Quoted 9 lines
Quoted 8 lines
arch/arm/boot/dts/omap4.dtsi +7
-0+ compatible = "ti,omap4-cm"; + reg = <0x1400 0x200>; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0x1400 0x200>; + + cm_l4per_clkctrl: cm_l4per_clkctrl at 20 {
PATCH 6/6 ARM: OMAP4: hwmod_data: drop a few clkctrl setups replaced with clocks
In reply to Tero KristoWith the clkctrl clocks being available as clocks now, the clkctrl data within hwmod can be dropped away. Do this for the few sample clocks that have been converted.
--- arch/arm/mach-omap2/omap_hwmod_44xx_data.c | 30 ------------------------------ 1 file changed, 30 deletions(-)
arch/arm/mach-omap2/omap_hwmod_44xx_data.c +0 -30
@@ -517,9 +517,7 @@ .main_clk = "func_dmic_abe_gfclk", .prcm = { .omap4 = { - .clkctrl_offs = OMAP4_CM1_ABE_DMIC_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_ABE_DMIC_CONTEXT_OFFSET, - .modulemode = MODULEMODE_SWCTRL, }, }, };
@@ -1060,9 +1058,7 @@ .main_clk = "l4_div_ck", .prcm = { .omap4 = { - .clkctrl_offs = OMAP4_CM_L4PER_GPIO2_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_GPIO2_CONTEXT_OFFSET, - .modulemode = MODULEMODE_HWCTRL, }, }, .opt_clks = gpio2_opt_clks,
@@ -1083,9 +1079,7 @@ .main_clk = "l4_div_ck", .prcm = { .omap4 = { - .clkctrl_offs = OMAP4_CM_L4PER_GPIO3_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_GPIO3_CONTEXT_OFFSET, - .modulemode = MODULEMODE_HWCTRL, }, }, .opt_clks = gpio3_opt_clks,
@@ -1361,9 +1355,7 @@ .main_clk = "func_96m_fclk", .prcm = { .omap4 = { - .clkctrl_offs = OMAP4_CM_L4PER_I2C2_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_I2C2_CONTEXT_OFFSET, - .modulemode = MODULEMODE_SWCTRL, }, }, .dev_attr = &i2c_dev_attr,
@@ -1378,9 +1370,7 @@ .main_clk = "func_96m_fclk", .prcm = { .omap4 = { - .clkctrl_offs = OMAP4_CM_L4PER_I2C3_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_I2C3_CONTEXT_OFFSET, - .modulemode = MODULEMODE_SWCTRL, }, }, .dev_attr = &i2c_dev_attr,
@@ -1395,9 +1385,7 @@ .main_clk = "func_96m_fclk", .prcm = { .omap4 = { - .clkctrl_offs = OMAP4_CM_L4PER_I2C4_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_I2C4_CONTEXT_OFFSET, - .modulemode = MODULEMODE_SWCTRL, }, }, .dev_attr = &i2c_dev_attr,
@@ -1659,9 +1647,7 @@ .main_clk = "func_mcbsp1_gfclk", .prcm = { .omap4 = { - .clkctrl_offs = OMAP4_CM1_ABE_MCBSP1_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_ABE_MCBSP1_CONTEXT_OFFSET, - .modulemode = MODULEMODE_SWCTRL, }, }, .opt_clks = mcbsp1_opt_clks,
@@ -1775,9 +1761,7 @@ .main_clk = "pad_clks_ck", .prcm = { .omap4 = { - .clkctrl_offs = OMAP4_CM1_ABE_PDM_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_ABE_PDM_CONTEXT_OFFSET, - .modulemode = MODULEMODE_SWCTRL, }, }, };
@@ -2013,9 +1997,7 @@ .main_clk = "func_48m_fclk", .prcm = { .omap4 = { - .clkctrl_offs = OMAP4_CM_L4PER_MMCSD3_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_MMCSD3_CONTEXT_OFFSET, - .modulemode = MODULEMODE_SWCTRL, }, }, };
@@ -2035,9 +2017,7 @@ .main_clk = "func_48m_fclk", .prcm = { .omap4 = { - .clkctrl_offs = OMAP4_CM_L4PER_MMCSD4_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_MMCSD4_CONTEXT_OFFSET, - .modulemode = MODULEMODE_SWCTRL, }, }, };
@@ -2057,9 +2037,7 @@ .main_clk = "func_48m_fclk", .prcm = { .omap4 = { - .clkctrl_offs = OMAP4_CM_L4PER_MMCSD5_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_MMCSD5_CONTEXT_OFFSET, - .modulemode = MODULEMODE_SWCTRL, }, }, };
@@ -2799,9 +2777,7 @@ .main_clk = "func_48m_fclk", .prcm = { .omap4 = { - .clkctrl_offs = OMAP4_CM_L4PER_UART1_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_UART1_CONTEXT_OFFSET, - .modulemode = MODULEMODE_SWCTRL, }, }, };
@@ -2815,9 +2791,7 @@ .main_clk = "func_48m_fclk", .prcm = { .omap4 = { - .clkctrl_offs = OMAP4_CM_L4PER_UART2_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_UART2_CONTEXT_OFFSET, - .modulemode = MODULEMODE_SWCTRL, }, }, };
@@ -2831,9 +2805,7 @@ .main_clk = "func_48m_fclk", .prcm = { .omap4 = { - .clkctrl_offs = OMAP4_CM_L4PER_UART3_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_UART3_CONTEXT_OFFSET, - .modulemode = MODULEMODE_SWCTRL, }, }, };
@@ -2847,9 +2819,7 @@ .main_clk = "func_48m_fclk", .prcm = { .omap4 = { - .clkctrl_offs = OMAP4_CM_L4PER_UART4_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_UART4_CONTEXT_OFFSET, - .modulemode = MODULEMODE_SWCTRL, }, }, };
Signature · 1 line
1.9.1
Tony Lindgren
maintainerQuoted 9 lines · Tero Kristo
Hi,
This series is a derivative of the hwmod clock support framework
(https://www.spinics.net/lists/arm-kernel/msg536742.html.) This adds support for clkctrl main and optional clocks, which can be linked initially with hwmod framework, and later with the interconnect driver functionality. The implementation is based on the DT bindings patch from Tony:
https://patchwork.kernel.org/patch/9533605/
Probably best to merge that binding patch along with this series, so feel free to pick it.
Regards,
Tony
Quoted 10 lines · Tero Kristo
Hi,
This series is a derivative of the hwmod clock support framework
(https://www.spinics.net/lists/arm-kernel/msg536742.html.) This adds support for clkctrl main and optional clocks, which can be linked initially with hwmod framework, and later with the interconnect driver functionality. The implementation is based on the DT bindings patch from Tony:
https://patchwork.kernel.org/patch/9533605/
Quoted 8 lines
This series also depends on the TI clock driver cleanup series posted here: https://www.spinics.net/lists/arm-kernel/msg562362.html
OMAP4 used as a reference platform for the work, patches 4-6 contain SoC specific patches, out of which 5-6 should not be merged; these are only provided as a reference and for testing purposes and are incomplete. Rest of the data can be provided once the code is approved / merged.
Looks good to me: