OMAP4: Add modulemode support to hwmod framework
Subsystems (6)
v3 cover OMAP4: Add modulemode support to hwmod framework
Hi Paul,
Here is the series that finally add the management of the modulemode directly from hwmod fmwk instead of using a fake clock node to represent the IP.
This v2 update is fixing a couple of regressions I introduced in the first release.
A second series will clean most of the remaining data from the clock data file. Before that I have to rebase Rajendra's series to control the clockdomain from the hwmod framework, otherwise the modules will not be enabled properly since their clockdomain will not be changed to SW_SUP during enable.
The series is based on for_3.1/3_hwmod_fixes and tested
on OMAP4430 ES2.1 + SDP. It should not affect OMAP2 & 3, but some testing are definitively needed.
The patches are available here:git://gitorious.org/omap-pm/linux.git for_3.1/4_hwmod_modulemode
Regards,
Benoit
Change since v1: http://www.spinics.net/lists/linux-omap/msg53094.html
- Change pr_warning to pr_debug to reduce verbosity
- Fix hardreset APIs that were using mask instead of shift
- Remove cdoffs addition with clkctrl_offs since the the cdoffs is already included in the register offset.
Change since v2:
- Fix name in reset prm code
Benoit Cousson (13):
OMAP4: hwmod data: Add clock domain attribute
OMAP2+: hwmod: Init clkdm field at boot time
OMAP4: hwmod: Replace CLKCTRL absolute address with offset macros
OMAP: hwmod: Wait the idle status to be disabled
OMAP2+: hwmod: Replace clkdm access from main_clk using hwmod attribute
OMAP4: hwmod: Replace RSTCTRL absolute address with offset macros
OMAP4: prm: Replace warm reset API with the offset based version
OMAP4: prm: Remove deprecated functions
OMAP4: hwmod data: Align interconnect format with regular modules
OMAP4: hwmod data: Add PRM context register offset
OMAP4: hwmod data: Add modulemode entry in omap_hwmod structure
OMAP4: cm: Add two new APIs for modulemode control
OMAP4: hwmod: Introduce the module control in hwmod control
arch/arm/mach-omap2/cm44xx.h | 3 +- arch/arm/mach-omap2/cminst44xx.c | 86 +++++- arch/arm/mach-omap2/cminst44xx.h | 8 +- arch/arm/mach-omap2/omap_hwmod.c | 196 +++++++++-- arch/arm/mach-omap2/omap_hwmod_44xx_data.c | 457 ++++++++++++++++++++------ arch/arm/mach-omap2/prcm.c | 2 +- arch/arm/mach-omap2/prm44xx.c | 145 +-------- arch/arm/mach-omap2/prm44xx.h | 6 - arch/arm/mach-omap2/prminst44xx.c | 108 ++++++- arch/arm/mach-omap2/prminst44xx.h | 12 +- arch/arm/plat-omap/include/plat/omap_hwmod.h | 14 +- 11 files changed, 738 insertions(+), 299 deletions(-)
PATCH v3 1/13 OMAP4: hwmod data: Add clock domain attribute
In OMAP PRCM terminology, the clock domain is defined as a group of IPs that share some clocks and most of the time an interface clock. Every IP does belong to a clockdomain.
For the moment the clock domain attribute is affected to a clock node. The issue with that approach, is that a clock might or not belong to a clock domain. Moreover during module transition, it is up to a module to handle properly the clock domain state and not to a clock node.
Create a clkdm_name attribute to provide this information per hwmod.
Populate this attribute for every OMAP4 hwmod entries.
Future cleanup series with remove that information from the OMAP4 clock when it is relevant.
--- arch/arm/mach-omap2/omap_hwmod_44xx_data.c | 82 ++++++++++++++++++++++++++ arch/arm/plat-omap/include/plat/omap_hwmod.h | 1 + 2 files changed, 83 insertions(+), 0 deletions(-)
arch/arm/mach-omap2/omap_hwmod_44xx_data.c +82 -0
@@ -120,6 +120,7 @@ static struct omap_hwmod_irq_info omap44xx_dmm_irqs[] = {static struct omap_hwmod omap44xx_dmm_hwmod = { .name ="dmm" , .class = &omap44xx_dmm_hwmod_class, + .clkdm_name ="l3_emif_clkdm" , .slaves = omap44xx_dmm_slaves, .slaves_cnt =ARRAY_SIZE (omap44xx_dmm_slaves), .mpu_irqs = omap44xx_dmm_irqs,
@@ -171,6 +172,7 @@ static struct omap_hwmod_ocp_if *omap44xx_emif_fw_slaves[] = {static struct omap_hwmod omap44xx_emif_fw_hwmod = { .name ="emif_fw" , .class = &omap44xx_emif_fw_hwmod_class, + .clkdm_name ="l3_emif_clkdm" , .slaves = omap44xx_emif_fw_slaves, .slaves_cnt =ARRAY_SIZE (omap44xx_emif_fw_slaves), .omap_chip =OMAP_CHIP_INIT (CHIP_IS_OMAP44XX ),
@@ -210,6 +212,7 @@ static struct omap_hwmod_ocp_if *omap44xx_l3_instr_slaves[] = {static struct omap_hwmod omap44xx_l3_instr_hwmod = { .name ="l3_instr" , .class = &omap44xx_l3_hwmod_class, + .clkdm_name ="l3_instr_clkdm" , .slaves = omap44xx_l3_instr_slaves, .slaves_cnt =ARRAY_SIZE (omap44xx_l3_instr_slaves), .omap_chip =OMAP_CHIP_INIT (CHIP_IS_OMAP44XX ),
@@ -301,6 +304,7 @@ static struct omap_hwmod_irq_info omap44xx_l3_main_1_irqs[] = {static struct omap_hwmod omap44xx_l3_main_1_hwmod = { .name ="l3_main_1" , .class = &omap44xx_l3_hwmod_class, + .clkdm_name ="l3_1_clkdm" , .slaves = omap44xx_l3_main_1_slaves, .slaves_cnt =ARRAY_SIZE (omap44xx_l3_main_1_slaves), .mpu_irqs = omap44xx_l3_main_1_irqs,
@@ -398,6 +402,7 @@ static struct omap_hwmod_ocp_if *omap44xx_l3_main_2_slaves[] = {static struct omap_hwmod omap44xx_l3_main_2_hwmod = { .name ="l3_main_2" , .class = &omap44xx_l3_hwmod_class, + .clkdm_name ="l3_2_clkdm" , .slaves = omap44xx_l3_main_2_slaves, .slaves_cnt =ARRAY_SIZE (omap44xx_l3_main_2_slaves), .omap_chip =OMAP_CHIP_INIT (CHIP_IS_OMAP44XX ),
@@ -448,6 +453,7 @@ static struct omap_hwmod_ocp_if *omap44xx_l3_main_3_slaves[] = {static struct omap_hwmod omap44xx_l3_main_3_hwmod = { .name ="l3_main_3" , .class = &omap44xx_l3_hwmod_class, + .clkdm_name ="l3_instr_clkdm" , .slaves = omap44xx_l3_main_3_slaves, .slaves_cnt =ARRAY_SIZE (omap44xx_l3_main_3_slaves), .omap_chip =OMAP_CHIP_INIT (CHIP_IS_OMAP44XX ),
@@ -505,6 +511,7 @@ static struct omap_hwmod_ocp_if *omap44xx_l4_abe_slaves[] = {static struct omap_hwmod omap44xx_l4_abe_hwmod = { .name ="l4_abe" , .class = &omap44xx_l4_hwmod_class, + .clkdm_name ="abe_clkdm" , .slaves = omap44xx_l4_abe_slaves, .slaves_cnt =ARRAY_SIZE (omap44xx_l4_abe_slaves), .omap_chip =OMAP_CHIP_INIT (CHIP_IS_OMAP44XX ),
@@ -527,6 +534,7 @@ static struct omap_hwmod_ocp_if *omap44xx_l4_cfg_slaves[] = {static struct omap_hwmod omap44xx_l4_cfg_hwmod = { .name ="l4_cfg" , .class = &omap44xx_l4_hwmod_class, + .clkdm_name ="l4_cfg_clkdm" , .slaves = omap44xx_l4_cfg_slaves, .slaves_cnt =ARRAY_SIZE (omap44xx_l4_cfg_slaves), .omap_chip =OMAP_CHIP_INIT (CHIP_IS_OMAP44XX ),
@@ -549,6 +557,7 @@ static struct omap_hwmod_ocp_if *omap44xx_l4_per_slaves[] = {static struct omap_hwmod omap44xx_l4_per_hwmod = { .name ="l4_per" , .class = &omap44xx_l4_hwmod_class, + .clkdm_name ="l4_per_clkdm" , .slaves = omap44xx_l4_per_slaves, .slaves_cnt =ARRAY_SIZE (omap44xx_l4_per_slaves), .omap_chip =OMAP_CHIP_INIT (CHIP_IS_OMAP44XX ),
@@ -571,6 +580,7 @@ static struct omap_hwmod_ocp_if *omap44xx_l4_wkup_slaves[] = {static struct omap_hwmod omap44xx_l4_wkup_hwmod = { .name ="l4_wkup" , .class = &omap44xx_l4_hwmod_class, + .clkdm_name ="l4_wkup_clkdm" , .slaves = omap44xx_l4_wkup_slaves, .slaves_cnt =ARRAY_SIZE (omap44xx_l4_wkup_slaves), .omap_chip =OMAP_CHIP_INIT (CHIP_IS_OMAP44XX ),
@@ -601,6 +611,7 @@ static struct omap_hwmod_ocp_if *omap44xx_mpu_private_slaves[] = {static struct omap_hwmod omap44xx_mpu_private_hwmod = { .name ="mpu_private" , .class = &omap44xx_mpu_bus_hwmod_class, + .clkdm_name ="mpu_clkdm" , .slaves = omap44xx_mpu_private_slaves, .slaves_cnt =ARRAY_SIZE (omap44xx_mpu_private_slaves), .omap_chip =OMAP_CHIP_INIT (CHIP_IS_OMAP44XX ),
@@ -737,6 +748,7 @@ static struct omap_hwmod_ocp_if *omap44xx_aess_slaves[] = {static struct omap_hwmod omap44xx_aess_hwmod = { .name ="aess" , .class = &omap44xx_aess_hwmod_class, + .clkdm_name ="abe_clkdm" , .mpu_irqs = omap44xx_aess_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_aess_irqs), .sdma_reqs = omap44xx_aess_sdma_reqs,
@@ -771,6 +783,7 @@ static struct omap_hwmod_opt_clk bandgap_opt_clks[] = {static struct omap_hwmod omap44xx_bandgap_hwmod = { .name ="bandgap" , .class = &omap44xx_bandgap_hwmod_class, + .clkdm_name ="l4_wkup_clkdm" , .prcm = { .omap4 = { .clkctrl_reg =OMAP4430_CM_WKUP_BANDGAP_CLKCTRL ,
@@ -828,6 +841,7 @@ static struct omap_hwmod_ocp_if *omap44xx_counter_32k_slaves[] = {static struct omap_hwmod omap44xx_counter_32k_hwmod = { .name ="counter_32k" , .class = &omap44xx_counter_hwmod_class, + .clkdm_name ="l4_wkup_clkdm" , .flags =HWMOD_SWSUP_SIDLE , .main_clk ="sys_32k_ck" , .prcm = {
@@ -910,6 +924,7 @@ static struct omap_hwmod_ocp_if *omap44xx_dma_system_slaves[] = {static struct omap_hwmod omap44xx_dma_system_hwmod = { .name ="dma_system" , .class = &omap44xx_dma_hwmod_class, + .clkdm_name ="l3_dma_clkdm" , .mpu_irqs = omap44xx_dma_system_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_dma_system_irqs), .main_clk ="l3_div_ck" ,
@@ -1001,6 +1016,7 @@ static struct omap_hwmod_ocp_if *omap44xx_dmic_slaves[] = {static struct omap_hwmod omap44xx_dmic_hwmod = { .name ="dmic" , .class = &omap44xx_dmic_hwmod_class, + .clkdm_name ="abe_clkdm" , .mpu_irqs = omap44xx_dmic_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_dmic_irqs), .sdma_reqs = omap44xx_dmic_sdma_reqs,
@@ -1069,6 +1085,7 @@ static struct omap_hwmod_ocp_if *omap44xx_dsp_slaves[] = {static struct omap_hwmod omap44xx_dsp_c0_hwmod = { .name ="dsp_c0" , .class = &omap44xx_dsp_hwmod_class, + .clkdm_name ="tesla_clkdm" , .flags =HWMOD_INIT_NO_RESET , .rst_lines = omap44xx_dsp_c0_resets, .rst_lines_cnt =ARRAY_SIZE (omap44xx_dsp_c0_resets),
@@ -1083,6 +1100,7 @@ static struct omap_hwmod omap44xx_dsp_c0_hwmod = {static struct omap_hwmod omap44xx_dsp_hwmod = { .name ="dsp" , .class = &omap44xx_dsp_hwmod_class, + .clkdm_name ="tesla_clkdm" , .mpu_irqs = omap44xx_dsp_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_dsp_irqs), .rst_lines = omap44xx_dsp_resets,
@@ -1176,6 +1194,7 @@ static struct omap_hwmod_opt_clk dss_opt_clks[] = {static struct omap_hwmod omap44xx_dss_hwmod = { .name ="dss_core" , .class = &omap44xx_dss_hwmod_class, + .clkdm_name ="l3_dss_clkdm" , .main_clk ="dss_dss_clk" , .prcm = { .omap4 = {
@@ -1277,6 +1296,7 @@ static struct omap_hwmod omap44xx_dss_dispc_hwmod = { .name = "dss_dispc", .class = &omap44xx_dispc_hwmod_class, .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, + .clkdm_name = "l3_dss_clkdm", .mpu_irqs = omap44xx_dss_dispc_irqs, .mpu_irqs_cnt = ARRAY_SIZE(omap44xx_dss_dispc_irqs), .sdma_reqs = omap44xx_dss_dispc_sdma_reqs,
@@ -1375,6 +1395,7 @@ static struct omap_hwmod_opt_clk dss_dsi1_opt_clks[] = {static struct omap_hwmod omap44xx_dss_dsi1_hwmod = { .name ="dss_dsi1" , .class = &omap44xx_dsi_hwmod_class, + .clkdm_name ="l3_dss_clkdm" , .mpu_irqs = omap44xx_dss_dsi1_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_dss_dsi1_irqs), .sdma_reqs = omap44xx_dss_dsi1_sdma_reqs,
@@ -1452,6 +1473,7 @@ static struct omap_hwmod_opt_clk dss_dsi2_opt_clks[] = {static struct omap_hwmod omap44xx_dss_dsi2_hwmod = { .name ="dss_dsi2" , .class = &omap44xx_dsi_hwmod_class, + .clkdm_name ="l3_dss_clkdm" , .mpu_irqs = omap44xx_dss_dsi2_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_dss_dsi2_irqs), .sdma_reqs = omap44xx_dss_dsi2_sdma_reqs,
@@ -1549,6 +1571,7 @@ static struct omap_hwmod_opt_clk dss_hdmi_opt_clks[] = {static struct omap_hwmod omap44xx_dss_hdmi_hwmod = { .name ="dss_hdmi" , .class = &omap44xx_hdmi_hwmod_class, + .clkdm_name ="l3_dss_clkdm" , .mpu_irqs = omap44xx_dss_hdmi_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_dss_hdmi_irqs), .sdma_reqs = omap44xx_dss_hdmi_sdma_reqs,
@@ -1641,6 +1664,7 @@ static struct omap_hwmod_opt_clk dss_rfbi_opt_clks[] = {static struct omap_hwmod omap44xx_dss_rfbi_hwmod = { .name ="dss_rfbi" , .class = &omap44xx_rfbi_hwmod_class, + .clkdm_name ="l3_dss_clkdm" , .sdma_reqs = omap44xx_dss_rfbi_sdma_reqs, .sdma_reqs_cnt =ARRAY_SIZE (omap44xx_dss_rfbi_sdma_reqs), .main_clk ="dss_dss_clk" ,
@@ -1716,6 +1740,7 @@ static struct omap_hwmod_opt_clk dss_venc_opt_clks[] = {static struct omap_hwmod omap44xx_dss_venc_hwmod = { .name ="dss_venc" , .class = &omap44xx_venc_hwmod_class, + .clkdm_name ="l3_dss_clkdm" , .main_clk ="dss_dss_clk" , .prcm = { .omap4 = {
@@ -1794,6 +1819,7 @@ static struct omap_hwmod_opt_clk gpio1_opt_clks[] = {static struct omap_hwmod omap44xx_gpio1_hwmod = { .name ="gpio1" , .class = &omap44xx_gpio_hwmod_class, + .clkdm_name ="l4_wkup_clkdm" , .mpu_irqs = omap44xx_gpio1_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_gpio1_irqs), .main_clk ="gpio1_ick" ,
@@ -1846,6 +1872,7 @@ static struct omap_hwmod_opt_clk gpio2_opt_clks[] = {static struct omap_hwmod omap44xx_gpio2_hwmod = { .name ="gpio2" , .class = &omap44xx_gpio_hwmod_class, + .clkdm_name ="l4_per_clkdm" , .flags =HWMOD_CONTROL_OPT_CLKS_IN_RESET , .mpu_irqs = omap44xx_gpio2_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_gpio2_irqs),
@@ -1899,6 +1926,7 @@ static struct omap_hwmod_opt_clk gpio3_opt_clks[] = {static struct omap_hwmod omap44xx_gpio3_hwmod = { .name ="gpio3" , .class = &omap44xx_gpio_hwmod_class, + .clkdm_name ="l4_per_clkdm" , .flags =HWMOD_CONTROL_OPT_CLKS_IN_RESET , .mpu_irqs = omap44xx_gpio3_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_gpio3_irqs),
@@ -1952,6 +1980,7 @@ static struct omap_hwmod_opt_clk gpio4_opt_clks[] = {static struct omap_hwmod omap44xx_gpio4_hwmod = { .name ="gpio4" , .class = &omap44xx_gpio_hwmod_class, + .clkdm_name ="l4_per_clkdm" , .flags =HWMOD_CONTROL_OPT_CLKS_IN_RESET , .mpu_irqs = omap44xx_gpio4_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_gpio4_irqs),
@@ -2005,6 +2034,7 @@ static struct omap_hwmod_opt_clk gpio5_opt_clks[] = {static struct omap_hwmod omap44xx_gpio5_hwmod = { .name ="gpio5" , .class = &omap44xx_gpio_hwmod_class, + .clkdm_name ="l4_per_clkdm" , .flags =HWMOD_CONTROL_OPT_CLKS_IN_RESET , .mpu_irqs = omap44xx_gpio5_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_gpio5_irqs),
@@ -2058,6 +2088,7 @@ static struct omap_hwmod_opt_clk gpio6_opt_clks[] = {static struct omap_hwmod omap44xx_gpio6_hwmod = { .name ="gpio6" , .class = &omap44xx_gpio_hwmod_class, + .clkdm_name ="l4_per_clkdm" , .flags =HWMOD_CONTROL_OPT_CLKS_IN_RESET , .mpu_irqs = omap44xx_gpio6_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_gpio6_irqs),
@@ -2137,6 +2168,7 @@ static struct omap_hwmod_ocp_if *omap44xx_hsi_slaves[] = {static struct omap_hwmod omap44xx_hsi_hwmod = { .name ="hsi" , .class = &omap44xx_hsi_hwmod_class, + .clkdm_name ="l3_init_clkdm" , .mpu_irqs = omap44xx_hsi_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_hsi_irqs), .main_clk ="hsi_fck" ,
@@ -2210,6 +2242,7 @@ static struct omap_hwmod_ocp_if *omap44xx_i2c1_slaves[] = {static struct omap_hwmod omap44xx_i2c1_hwmod = { .name ="i2c1" , .class = &omap44xx_i2c_hwmod_class, + .clkdm_name ="l4_per_clkdm" , .flags =HWMOD_INIT_NO_RESET , .mpu_irqs = omap44xx_i2c1_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_i2c1_irqs),
@@ -2263,6 +2296,7 @@ static struct omap_hwmod_ocp_if *omap44xx_i2c2_slaves[] = {static struct omap_hwmod omap44xx_i2c2_hwmod = { .name ="i2c2" , .class = &omap44xx_i2c_hwmod_class, + .clkdm_name ="l4_per_clkdm" , .flags =HWMOD_INIT_NO_RESET , .mpu_irqs = omap44xx_i2c2_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_i2c2_irqs),
@@ -2316,6 +2350,7 @@ static struct omap_hwmod_ocp_if *omap44xx_i2c3_slaves[] = {static struct omap_hwmod omap44xx_i2c3_hwmod = { .name ="i2c3" , .class = &omap44xx_i2c_hwmod_class, + .clkdm_name ="l4_per_clkdm" , .flags =HWMOD_INIT_NO_RESET , .mpu_irqs = omap44xx_i2c3_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_i2c3_irqs),
@@ -2369,6 +2404,7 @@ static struct omap_hwmod_ocp_if *omap44xx_i2c4_slaves[] = {static struct omap_hwmod omap44xx_i2c4_hwmod = { .name ="i2c4" , .class = &omap44xx_i2c_hwmod_class, + .clkdm_name ="l4_per_clkdm" , .flags =HWMOD_INIT_NO_RESET , .mpu_irqs = omap44xx_i2c4_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_i2c4_irqs),
@@ -2433,6 +2469,7 @@ static struct omap_hwmod_ocp_if *omap44xx_ipu_slaves[] = {static struct omap_hwmod omap44xx_ipu_c0_hwmod = { .name ="ipu_c0" , .class = &omap44xx_ipu_hwmod_class, + .clkdm_name ="ducati_clkdm" , .flags =HWMOD_INIT_NO_RESET , .rst_lines = omap44xx_ipu_c0_resets, .rst_lines_cnt =ARRAY_SIZE (omap44xx_ipu_c0_resets),
@@ -2448,6 +2485,7 @@ static struct omap_hwmod omap44xx_ipu_c0_hwmod = {static struct omap_hwmod omap44xx_ipu_c1_hwmod = { .name ="ipu_c1" , .class = &omap44xx_ipu_hwmod_class, + .clkdm_name ="ducati_clkdm" , .flags =HWMOD_INIT_NO_RESET , .rst_lines = omap44xx_ipu_c1_resets, .rst_lines_cnt =ARRAY_SIZE (omap44xx_ipu_c1_resets),
@@ -2462,6 +2500,7 @@ static struct omap_hwmod omap44xx_ipu_c1_hwmod = {static struct omap_hwmod omap44xx_ipu_hwmod = { .name ="ipu" , .class = &omap44xx_ipu_hwmod_class, + .clkdm_name ="ducati_clkdm" , .mpu_irqs = omap44xx_ipu_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_ipu_irqs), .rst_lines = omap44xx_ipu_resets,
@@ -2548,6 +2587,7 @@ static struct omap_hwmod_opt_clk iss_opt_clks[] = {static struct omap_hwmod omap44xx_iss_hwmod = { .name ="iss" , .class = &omap44xx_iss_hwmod_class, + .clkdm_name ="iss_clkdm" , .mpu_irqs = omap44xx_iss_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_iss_irqs), .sdma_reqs = omap44xx_iss_sdma_reqs,
@@ -2629,6 +2669,7 @@ static struct omap_hwmod_ocp_if *omap44xx_iva_slaves[] = {static struct omap_hwmod omap44xx_iva_seq0_hwmod = { .name ="iva_seq0" , .class = &omap44xx_iva_hwmod_class, + .clkdm_name ="ivahd_clkdm" , .flags =HWMOD_INIT_NO_RESET , .rst_lines = omap44xx_iva_seq0_resets, .rst_lines_cnt =ARRAY_SIZE (omap44xx_iva_seq0_resets),
@@ -2644,6 +2685,7 @@ static struct omap_hwmod omap44xx_iva_seq0_hwmod = {static struct omap_hwmod omap44xx_iva_seq1_hwmod = { .name ="iva_seq1" , .class = &omap44xx_iva_hwmod_class, + .clkdm_name ="ivahd_clkdm" , .flags =HWMOD_INIT_NO_RESET , .rst_lines = omap44xx_iva_seq1_resets, .rst_lines_cnt =ARRAY_SIZE (omap44xx_iva_seq1_resets),
@@ -2658,6 +2700,7 @@ static struct omap_hwmod omap44xx_iva_seq1_hwmod = {static struct omap_hwmod omap44xx_iva_hwmod = { .name ="iva" , .class = &omap44xx_iva_hwmod_class, + .clkdm_name ="ivahd_clkdm" , .mpu_irqs = omap44xx_iva_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_iva_irqs), .rst_lines = omap44xx_iva_resets,
@@ -2730,6 +2773,7 @@ static struct omap_hwmod_ocp_if *omap44xx_kbd_slaves[] = {static struct omap_hwmod omap44xx_kbd_hwmod = { .name ="kbd" , .class = &omap44xx_kbd_hwmod_class, + .clkdm_name ="l4_wkup_clkdm" , .mpu_irqs = omap44xx_kbd_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_kbd_irqs), .main_clk ="kbd_fck" ,
@@ -2795,6 +2839,7 @@ static struct omap_hwmod_ocp_if *omap44xx_mailbox_slaves[] = {static struct omap_hwmod omap44xx_mailbox_hwmod = { .name ="mailbox" , .class = &omap44xx_mailbox_hwmod_class, + .clkdm_name ="l4_cfg_clkdm" , .mpu_irqs = omap44xx_mailbox_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_mailbox_irqs), .prcm = {
@@ -2884,6 +2929,7 @@ static struct omap_hwmod_ocp_if *omap44xx_mcbsp1_slaves[] = {static struct omap_hwmod omap44xx_mcbsp1_hwmod = { .name ="mcbsp1" , .class = &omap44xx_mcbsp_hwmod_class, + .clkdm_name ="abe_clkdm" , .mpu_irqs = omap44xx_mcbsp1_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_mcbsp1_irqs), .sdma_reqs = omap44xx_mcbsp1_sdma_reqs,
@@ -2957,6 +3003,7 @@ static struct omap_hwmod_ocp_if *omap44xx_mcbsp2_slaves[] = {static struct omap_hwmod omap44xx_mcbsp2_hwmod = { .name ="mcbsp2" , .class = &omap44xx_mcbsp_hwmod_class, + .clkdm_name ="abe_clkdm" , .mpu_irqs = omap44xx_mcbsp2_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_mcbsp2_irqs), .sdma_reqs = omap44xx_mcbsp2_sdma_reqs,
@@ -3030,6 +3077,7 @@ static struct omap_hwmod_ocp_if *omap44xx_mcbsp3_slaves[] = {static struct omap_hwmod omap44xx_mcbsp3_hwmod = { .name ="mcbsp3" , .class = &omap44xx_mcbsp_hwmod_class, + .clkdm_name ="abe_clkdm" , .mpu_irqs = omap44xx_mcbsp3_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_mcbsp3_irqs), .sdma_reqs = omap44xx_mcbsp3_sdma_reqs,
@@ -3082,6 +3130,7 @@ static struct omap_hwmod_ocp_if *omap44xx_mcbsp4_slaves[] = {static struct omap_hwmod omap44xx_mcbsp4_hwmod = { .name ="mcbsp4" , .class = &omap44xx_mcbsp_hwmod_class, + .clkdm_name ="l4_per_clkdm" , .mpu_irqs = omap44xx_mcbsp4_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_mcbsp4_irqs), .sdma_reqs = omap44xx_mcbsp4_sdma_reqs,
@@ -3174,6 +3223,7 @@ static struct omap_hwmod_ocp_if *omap44xx_mcpdm_slaves[] = {static struct omap_hwmod omap44xx_mcpdm_hwmod = { .name ="mcpdm" , .class = &omap44xx_mcpdm_hwmod_class, + .clkdm_name ="abe_clkdm" , .mpu_irqs = omap44xx_mcpdm_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_mcpdm_irqs), .sdma_reqs = omap44xx_mcpdm_sdma_reqs,
@@ -3259,6 +3309,7 @@ static struct omap2_mcspi_dev_attr mcspi1_dev_attr = {static struct omap_hwmod omap44xx_mcspi1_hwmod = { .name ="mcspi1" , .class = &omap44xx_mcspi_hwmod_class, + .clkdm_name ="l4_per_clkdm" , .mpu_irqs = omap44xx_mcspi1_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_mcspi1_irqs), .sdma_reqs = omap44xx_mcspi1_sdma_reqs,
@@ -3319,6 +3370,7 @@ static struct omap2_mcspi_dev_attr mcspi2_dev_attr = {static struct omap_hwmod omap44xx_mcspi2_hwmod = { .name ="mcspi2" , .class = &omap44xx_mcspi_hwmod_class, + .clkdm_name ="l4_per_clkdm" , .mpu_irqs = omap44xx_mcspi2_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_mcspi2_irqs), .sdma_reqs = omap44xx_mcspi2_sdma_reqs,
@@ -3379,6 +3431,7 @@ static struct omap2_mcspi_dev_attr mcspi3_dev_attr = {static struct omap_hwmod omap44xx_mcspi3_hwmod = { .name ="mcspi3" , .class = &omap44xx_mcspi_hwmod_class, + .clkdm_name ="l4_per_clkdm" , .mpu_irqs = omap44xx_mcspi3_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_mcspi3_irqs), .sdma_reqs = omap44xx_mcspi3_sdma_reqs,
@@ -3437,6 +3490,7 @@ static struct omap2_mcspi_dev_attr mcspi4_dev_attr = {static struct omap_hwmod omap44xx_mcspi4_hwmod = { .name ="mcspi4" , .class = &omap44xx_mcspi_hwmod_class, + .clkdm_name ="l4_per_clkdm" , .mpu_irqs = omap44xx_mcspi4_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_mcspi4_irqs), .sdma_reqs = omap44xx_mcspi4_sdma_reqs,
@@ -3521,6 +3575,7 @@ static struct omap_mmc_dev_attr mmc1_dev_attr = {static struct omap_hwmod omap44xx_mmc1_hwmod = { .name ="mmc1" , .class = &omap44xx_mmc_hwmod_class, + .clkdm_name ="l3_init_clkdm" , .mpu_irqs = omap44xx_mmc1_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_mmc1_irqs), .sdma_reqs = omap44xx_mmc1_sdma_reqs,
@@ -3580,6 +3635,7 @@ static struct omap_hwmod_ocp_if *omap44xx_mmc2_slaves[] = {static struct omap_hwmod omap44xx_mmc2_hwmod = { .name ="mmc2" , .class = &omap44xx_mmc_hwmod_class, + .clkdm_name ="l3_init_clkdm" , .mpu_irqs = omap44xx_mmc2_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_mmc2_irqs), .sdma_reqs = omap44xx_mmc2_sdma_reqs,
@@ -3634,6 +3690,7 @@ static struct omap_hwmod_ocp_if *omap44xx_mmc3_slaves[] = {static struct omap_hwmod omap44xx_mmc3_hwmod = { .name ="mmc3" , .class = &omap44xx_mmc_hwmod_class, + .clkdm_name ="l4_per_clkdm" , .mpu_irqs = omap44xx_mmc3_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_mmc3_irqs), .sdma_reqs = omap44xx_mmc3_sdma_reqs,
@@ -3686,6 +3743,7 @@ static struct omap_hwmod_ocp_if *omap44xx_mmc4_slaves[] = {static struct omap_hwmod omap44xx_mmc4_hwmod = { .name ="mmc4" , .class = &omap44xx_mmc_hwmod_class, + .clkdm_name ="l4_per_clkdm" , .mpu_irqs = omap44xx_mmc4_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_mmc4_irqs), .sdma_reqs = omap44xx_mmc4_sdma_reqs,
@@ -3738,6 +3796,7 @@ static struct omap_hwmod_ocp_if *omap44xx_mmc5_slaves[] = {static struct omap_hwmod omap44xx_mmc5_hwmod = { .name ="mmc5" , .class = &omap44xx_mmc_hwmod_class, + .clkdm_name ="l4_per_clkdm" , .mpu_irqs = omap44xx_mmc5_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_mmc5_irqs), .sdma_reqs = omap44xx_mmc5_sdma_reqs,
@@ -3779,6 +3838,7 @@ static struct omap_hwmod_ocp_if *omap44xx_mpu_masters[] = {static struct omap_hwmod omap44xx_mpu_hwmod = { .name ="mpu" , .class = &omap44xx_mpu_hwmod_class, + .clkdm_name ="mpu_clkdm" , .flags =HWMOD_INIT_NO_IDLE |HWMOD_INIT_NO_RESET , .mpu_irqs = omap44xx_mpu_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_mpu_irqs),
@@ -3851,6 +3911,7 @@ static struct omap_hwmod_ocp_if *omap44xx_smartreflex_core_slaves[] = {static struct omap_hwmod omap44xx_smartreflex_core_hwmod = { .name ="smartreflex_core" , .class = &omap44xx_smartreflex_hwmod_class, + .clkdm_name ="l4_ao_clkdm" , .mpu_irqs = omap44xx_smartreflex_core_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_smartreflex_core_irqs), .main_clk ="smartreflex_core_fck" ,
@@ -3897,6 +3958,7 @@ static struct omap_hwmod_ocp_if *omap44xx_smartreflex_iva_slaves[] = {static struct omap_hwmod omap44xx_smartreflex_iva_hwmod = { .name ="smartreflex_iva" , .class = &omap44xx_smartreflex_hwmod_class, + .clkdm_name ="l4_ao_clkdm" , .mpu_irqs = omap44xx_smartreflex_iva_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_smartreflex_iva_irqs), .main_clk ="smartreflex_iva_fck" ,
@@ -3943,6 +4005,7 @@ static struct omap_hwmod_ocp_if *omap44xx_smartreflex_mpu_slaves[] = {static struct omap_hwmod omap44xx_smartreflex_mpu_hwmod = { .name ="smartreflex_mpu" , .class = &omap44xx_smartreflex_hwmod_class, + .clkdm_name ="l4_ao_clkdm" , .mpu_irqs = omap44xx_smartreflex_mpu_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_smartreflex_mpu_irqs), .main_clk ="smartreflex_mpu_fck" ,
@@ -4008,6 +4071,7 @@ static struct omap_hwmod_ocp_if *omap44xx_spinlock_slaves[] = {static struct omap_hwmod omap44xx_spinlock_hwmod = { .name ="spinlock" , .class = &omap44xx_spinlock_hwmod_class, + .clkdm_name ="l4_cfg_clkdm" , .prcm = { .omap4 = { .clkctrl_reg =OMAP4430_CM_L4CFG_HW_SEM_CLKCTRL ,
@@ -4088,6 +4152,7 @@ static struct omap_hwmod_ocp_if *omap44xx_timer1_slaves[] = {static struct omap_hwmod omap44xx_timer1_hwmod = { .name ="timer1" , .class = &omap44xx_timer_1ms_hwmod_class, + .clkdm_name ="l4_wkup_clkdm" , .mpu_irqs = omap44xx_timer1_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_timer1_irqs), .main_clk ="timer1_fck" ,
@@ -4133,6 +4198,7 @@ static struct omap_hwmod_ocp_if *omap44xx_timer2_slaves[] = {static struct omap_hwmod omap44xx_timer2_hwmod = { .name ="timer2" , .class = &omap44xx_timer_1ms_hwmod_class, + .clkdm_name ="l4_per_clkdm" , .mpu_irqs = omap44xx_timer2_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_timer2_irqs), .main_clk ="timer2_fck" ,
@@ -4178,6 +4244,7 @@ static struct omap_hwmod_ocp_if *omap44xx_timer3_slaves[] = {static struct omap_hwmod omap44xx_timer3_hwmod = { .name ="timer3" , .class = &omap44xx_timer_hwmod_class, + .clkdm_name ="l4_per_clkdm" , .mpu_irqs = omap44xx_timer3_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_timer3_irqs), .main_clk ="timer3_fck" ,
@@ -4223,6 +4290,7 @@ static struct omap_hwmod_ocp_if *omap44xx_timer4_slaves[] = {static struct omap_hwmod omap44xx_timer4_hwmod = { .name ="timer4" , .class = &omap44xx_timer_hwmod_class, + .clkdm_name ="l4_per_clkdm" , .mpu_irqs = omap44xx_timer4_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_timer4_irqs), .main_clk ="timer4_fck" ,
@@ -4287,6 +4355,7 @@ static struct omap_hwmod_ocp_if *omap44xx_timer5_slaves[] = {static struct omap_hwmod omap44xx_timer5_hwmod = { .name ="timer5" , .class = &omap44xx_timer_hwmod_class, + .clkdm_name ="abe_clkdm" , .mpu_irqs = omap44xx_timer5_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_timer5_irqs), .main_clk ="timer5_fck" ,
@@ -4351,6 +4420,7 @@ static struct omap_hwmod_ocp_if *omap44xx_timer6_slaves[] = {static struct omap_hwmod omap44xx_timer6_hwmod = { .name ="timer6" , .class = &omap44xx_timer_hwmod_class, + .clkdm_name ="abe_clkdm" , .mpu_irqs = omap44xx_timer6_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_timer6_irqs), .main_clk ="timer6_fck" ,
@@ -4415,6 +4485,7 @@ static struct omap_hwmod_ocp_if *omap44xx_timer7_slaves[] = {static struct omap_hwmod omap44xx_timer7_hwmod = { .name ="timer7" , .class = &omap44xx_timer_hwmod_class, + .clkdm_name ="abe_clkdm" , .mpu_irqs = omap44xx_timer7_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_timer7_irqs), .main_clk ="timer7_fck" ,
@@ -4479,6 +4550,7 @@ static struct omap_hwmod_ocp_if *omap44xx_timer8_slaves[] = {static struct omap_hwmod omap44xx_timer8_hwmod = { .name ="timer8" , .class = &omap44xx_timer_hwmod_class, + .clkdm_name ="abe_clkdm" , .mpu_irqs = omap44xx_timer8_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_timer8_irqs), .main_clk ="timer8_fck" ,
@@ -4524,6 +4596,7 @@ static struct omap_hwmod_ocp_if *omap44xx_timer9_slaves[] = {static struct omap_hwmod omap44xx_timer9_hwmod = { .name ="timer9" , .class = &omap44xx_timer_hwmod_class, + .clkdm_name ="l4_per_clkdm" , .mpu_irqs = omap44xx_timer9_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_timer9_irqs), .main_clk ="timer9_fck" ,
@@ -4569,6 +4642,7 @@ static struct omap_hwmod_ocp_if *omap44xx_timer10_slaves[] = {static struct omap_hwmod omap44xx_timer10_hwmod = { .name ="timer10" , .class = &omap44xx_timer_1ms_hwmod_class, + .clkdm_name ="l4_per_clkdm" , .mpu_irqs = omap44xx_timer10_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_timer10_irqs), .main_clk ="timer10_fck" ,
@@ -4614,6 +4688,7 @@ static struct omap_hwmod_ocp_if *omap44xx_timer11_slaves[] = {static struct omap_hwmod omap44xx_timer11_hwmod = { .name ="timer11" , .class = &omap44xx_timer_hwmod_class, + .clkdm_name ="l4_per_clkdm" , .mpu_irqs = omap44xx_timer11_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_timer11_irqs), .main_clk ="timer11_fck" ,
@@ -4686,6 +4761,7 @@ static struct omap_hwmod_ocp_if *omap44xx_uart1_slaves[] = {static struct omap_hwmod omap44xx_uart1_hwmod = { .name ="uart1" , .class = &omap44xx_uart_hwmod_class, + .clkdm_name ="l4_per_clkdm" , .mpu_irqs = omap44xx_uart1_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_uart1_irqs), .sdma_reqs = omap44xx_uart1_sdma_reqs,
@@ -4738,6 +4814,7 @@ static struct omap_hwmod_ocp_if *omap44xx_uart2_slaves[] = {static struct omap_hwmod omap44xx_uart2_hwmod = { .name ="uart2" , .class = &omap44xx_uart_hwmod_class, + .clkdm_name ="l4_per_clkdm" , .mpu_irqs = omap44xx_uart2_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_uart2_irqs), .sdma_reqs = omap44xx_uart2_sdma_reqs,
@@ -4790,6 +4867,7 @@ static struct omap_hwmod_ocp_if *omap44xx_uart3_slaves[] = {static struct omap_hwmod omap44xx_uart3_hwmod = { .name ="uart3" , .class = &omap44xx_uart_hwmod_class, + .clkdm_name ="l4_per_clkdm" , .flags =HWMOD_INIT_NO_IDLE |HWMOD_INIT_NO_RESET , .mpu_irqs = omap44xx_uart3_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_uart3_irqs),
@@ -4843,6 +4921,7 @@ static struct omap_hwmod_ocp_if *omap44xx_uart4_slaves[] = {static struct omap_hwmod omap44xx_uart4_hwmod = { .name ="uart4" , .class = &omap44xx_uart_hwmod_class, + .clkdm_name ="l4_per_clkdm" , .mpu_irqs = omap44xx_uart4_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_uart4_irqs), .sdma_reqs = omap44xx_uart4_sdma_reqs,
@@ -4922,6 +5001,7 @@ static struct omap_hwmod_opt_clk usb_otg_hs_opt_clks[] = {static struct omap_hwmod omap44xx_usb_otg_hs_hwmod = { .name ="usb_otg_hs" , .class = &omap44xx_usb_otg_hs_hwmod_class, + .clkdm_name ="l3_init_clkdm" , .flags =HWMOD_SWSUP_SIDLE |HWMOD_SWSUP_MSTANDBY , .mpu_irqs = omap44xx_usb_otg_hs_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_usb_otg_hs_irqs),
@@ -4995,6 +5075,7 @@ static struct omap_hwmod_ocp_if *omap44xx_wd_timer2_slaves[] = {static struct omap_hwmod omap44xx_wd_timer2_hwmod = { .name ="wd_timer2" , .class = &omap44xx_wd_timer_hwmod_class, + .clkdm_name ="l4_wkup_clkdm" , .mpu_irqs = omap44xx_wd_timer2_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_wd_timer2_irqs), .main_clk ="wd_timer2_fck" ,
@@ -5059,6 +5140,7 @@ static struct omap_hwmod_ocp_if *omap44xx_wd_timer3_slaves[] = {static struct omap_hwmod omap44xx_wd_timer3_hwmod = { .name ="wd_timer3" , .class = &omap44xx_wd_timer_hwmod_class, + .clkdm_name ="abe_clkdm" , .mpu_irqs = omap44xx_wd_timer3_irqs, .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_wd_timer3_irqs), .main_clk ="wd_timer3_fck" ,
arch/arm/plat-omap/include/plat/omap_hwmod.h +1 -0
@@ -519,6 +519,7 @@ struct omap_hwmod {const char *main_clk;struct clk *_clk;struct omap_hwmod_opt_clk *opt_clks; +char *clkdm_name;char *vdd_name;struct voltagedomain *voltdm;struct omap_hwmod_ocp_if **masters;/* connect to *_IA */
Signature · 1 line
1.7.0.4
PATCH v3 2/13 OMAP2+: hwmod: Init clkdm field at boot time
In reply to Benoit CoussonAt boot time, lookup the clkdm_name to get the clkdm structure pointer for further usage.
--- arch/arm/mach-omap2/omap_hwmod.c | 34 +++++++++++++++++++++++++- arch/arm/plat-omap/include/plat/omap_hwmod.h | 1 + 2 files changed, 34 insertions(+), 1 deletions(-)
arch/arm/mach-omap2/omap_hwmod.c +33 -1
@@ -919,9 +919,40 @@ static struct omap_hwmod *_lookup(const char *name)return oh; } +/** +* _init_clkdm - look up a clockdomain name, store pointer in omap_hwmod +* @oh: struct omap_hwmod * +* +* Convert a clockdomain name stored in a struct omap_hwmod into a +* clockdomain pointer, and save it into the struct omap_hwmod. +* return -EINVAL if clkdm_name does not exist or if the lookup failed. +*/ +static int _init_clkdm (struct omap_hwmod *oh) +{ +if (cpu_is_omap24xx () ||cpu_is_omap34xx ()) +return 0 ; + +if (!oh->clkdm_name) { +pr_warning ("omap_hwmod: %s: no clkdm_name\n" , oh->name); +return -EINVAL ; + } + + oh->clkdm =clkdm_lookup (oh->clkdm_name); +if (!oh->clkdm) { +pr_warning ("omap_hwmod: %s: could not associate to clkdm %s\n" , + oh->name, oh->clkdm_name); +return -EINVAL ; + } + +pr_debug ("omap_hwmod: %s: associated to clkdm %s\n" , + oh->name, oh->clkdm_name); + +return 0 ; +}/** -* _init_clocks - clk_get() all clocks associated with this hwmod +* _init_clocks - clk_get() all clocks associated with this hwmod. Retrieve as +* well the clockdomain. * @oh: struct omap_hwmod * * @data: not used; pass NULL *
@@ -941,6 +972,7 @@ static int _init_clocks(struct omap_hwmod *oh, void *data) ret |=_init_main_clk (oh); ret |=_init_interface_clks (oh); ret |=_init_opt_clks (oh); + ret |=_init_clkdm (oh);if (!ret) oh->_state = _HWMOD_STATE_CLKS_INITED;
arch/arm/plat-omap/include/plat/omap_hwmod.h +1 -0
@@ -520,6 +520,7 @@ struct omap_hwmod {struct clk *_clk;struct omap_hwmod_opt_clk *opt_clks;char *clkdm_name; +struct clockdomain *clkdm;char *vdd_name;struct voltagedomain *voltdm;struct omap_hwmod_ocp_if **masters;/* connect to *_IA */
Signature · 1 line
1.7.0.4
PATCH v3 3/13 OMAP4: hwmod: Replace CLKCTRL absolute address with offset macros
In reply to Benoit CoussonThe CLKCTRL register was accessed using an absolute address. The usage of hardcoded macros to calculate virtual address from physical one should be avoided as much as possible.
The usage of a offset will allow future improvement like migration from the current architecture code toward a module driver.
Update cm_xxx accessor, move definition to the proper header file and update copyrights.
--- arch/arm/mach-omap2/cm44xx.h | 3 +- arch/arm/mach-omap2/cminst44xx.c | 23 +++- arch/arm/mach-omap2/cminst44xx.h | 4 +- arch/arm/mach-omap2/omap_hwmod.c | 10 +- arch/arm/mach-omap2/omap_hwmod_44xx_data.c | 182 ++++++++++++++++--------- arch/arm/plat-omap/include/plat/omap_hwmod.h | 2 +- 6 files changed, 145 insertions(+), 79 deletions(-)
arch/arm/mach-omap2/cm44xx.h +1 -2
@@ -1,7 +1,7 @@/* * OMAP4 Clock Management (CM) definitions * -* Copyright (C) 2007-2009 Texas Instruments, Inc. +* Copyright (C) 2007-2011 Texas Instruments, Inc. * Copyright (C) 2007-2009 Nokia Corporation * * Written by Paul Walmsley
@@ -26,7 +26,6 @@/* Function prototypes */ # ifndef __ASSEMBLER__ -extern int omap4_cm_wait_module_ready (void __iomem *clkctrl_reg);# endif #endif
arch/arm/mach-omap2/cminst44xx.c +17 -6
@@ -2,6 +2,7 @@* OMAP4 CM instance functions * * Copyright (C) 2009 Nokia Corporation +* Copyright (C) 2011 Texas Instruments, Inc. * Paul Walmsley * * This program is free software; you can redistribute it and/or modify
@@ -199,9 +200,20 @@ void omap4_cminst_clkdm_force_wakeup(u8 part, s16 inst, u16 cdoffs)* */ +static u32 _clkctrl_idlest (u8 part,u16 inst,s16 cdoffs,u16 clkctrl_offs) +{ +u32 v =omap4_cminst_read_inst_reg (part, inst, clkctrl_offs); + v &=OMAP4430_IDLEST_MASK ; + v >>=OMAP4430_IDLEST_SHIFT ; +return v; +} +/** * omap4_cm_wait_module_ready - wait for a module to be in 'func' state -* @clkctrl_reg: CLKCTRL module address +* @part: PRCM partition ID that the CM_CLKCTRL register exists in +* @inst: CM instance register offset (*_INST macro) +* @cdoffs: Clockdomain register offset (*_CDOFFS macro) +* @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro) * * Wait for the module IDLEST to be functional. If the idle state is in any * the non functional state (trans, idle or disabled), module and thus the
@@ -217,17 +229,16 @@ void omap4_cminst_clkdm_force_wakeup(u8 part, s16 inst, u16 cdoffs)* 0x3 disabled: Module is disabled and cannot be accessed * */ -int omap4_cm_wait_module_ready (void __iomem *clkctrl_reg) +int omap4_cm_wait_module_ready (u8 part,u16 inst,s16 cdoffs,u16 clkctrl_offs) {int i =0 ; -if (!clkctrl_reg) +if (!clkctrl_offs)return 0 ;omap_test_timeout (( - ((__raw_readl (clkctrl_reg) &OMAP4430_IDLEST_MASK ) ==0 ) || - (((__raw_readl (clkctrl_reg) &OMAP4430_IDLEST_MASK ) >> -OMAP4430_IDLEST_SHIFT ) ==0x2 )), +_clkctrl_idlest (part, inst, cdoffs, clkctrl_offs) ==0 || +_clkctrl_idlest (part, inst, cdoffs, clkctrl_offs) ==0x2 ),MAX_MODULE_READY_TIME , i);return (i <MAX_MODULE_READY_TIME ) ?0 : -EBUSY ;
arch/arm/mach-omap2/cminst44xx.h +2 -2
@@ -17,6 +17,8 @@ extern void omap4_cminst_clkdm_disable_hwsup(u8 part, s16 inst, u16 cdoffs);extern void omap4_cminst_clkdm_force_sleep (u8 part,s16 inst,u16 cdoffs);extern void omap4_cminst_clkdm_force_wakeup (u8 part,s16 inst,u16 cdoffs); +extern int omap4_cm_wait_module_ready (u8 part,u16 inst,s16 cdoffs,u16 clkctrl_offs); +/* * In an ideal world, we would not export these low-level functions, * but this will probably take some time to fix properly
@@ -32,6 +34,4 @@ extern u32 omap4_cminst_clear_inst_reg_bits(u32 bits, u8 part, s16 inst,extern u32 omap4_cminst_read_inst_reg_bits (u8 part,u16 inst,s16 idx,u32 mask); -extern int omap4_cm_wait_module_ready (void __iomem *clkctrl_reg); -#endif
arch/arm/mach-omap2/omap_hwmod.c +8 -2
@@ -145,7 +145,7 @@#include <plat/prcm.h> #include "cm2xxx_3xxx.h" -#include "cm44xx.h" +#include "cminst44xx.h" #include "prm2xxx_3xxx.h" #include "prm44xx.h" #include "mux.h"
@@ -1016,7 +1016,13 @@ static int _wait_target_ready(struct omap_hwmod *oh) oh->prcm.omap2.idlest_reg_id, oh->prcm.omap2.idlest_idle_bit); }else if (cpu_is_omap44xx ()) { - ret =omap4_cm_wait_module_ready (oh->prcm.omap4.clkctrl_reg); +if (!oh->clkdm) +return -EINVAL ; + + ret =omap4_cm_wait_module_ready (oh->clkdm->prcm_partition, + oh->clkdm->cm_inst, + oh->clkdm->clkdm_offs, + oh->prcm.omap4.clkctrl_offs); }else {BUG (); };
arch/arm/mach-omap2/omap_hwmod_44xx_data.c +116 -66
638 lines not on this page · raw message
arch/arm/plat-omap/include/plat/omap_hwmod.h +1 -1
@@ -362,7 +362,7 @@ struct omap_hwmod_omap2_prcm {* @submodule_wkdep_bit: bit shift of the WKDEP range */ struct omap_hwmod_omap4_prcm { -void __iomem *clkctrl_reg; +u16 clkctrl_offs;void __iomem *rstctrl_reg;u8 submodule_wkdep_bit; };
Signature · 1 line
1.7.0.4
Paul Walmsley
maintainerPATCH v3 3/13 OMAP4: hwmod: Replace CLKCTRL absolute address with offset macros
Quoted 6 lines · Benoit Cousson
The CLKCTRL register was accessed using an absolute address. The usage of hardcoded macros to calculate virtual address from physical one should be avoided as much as possible.
The usage of a offset will allow future improvement like migration from the current architecture code toward a module driver.
Quoted 6 lines
Update
cm_xxxaccessor, move definition to the proper header file and update copyrights.Signed-off-by Benoit Cousson <[email protected]>Cc Paul Walmsley <[email protected]>Cc Rajendra Nayak <[email protected]>
This patch was updated to use '_cminst_' in the function names that are in the cminst44xx.c file, rather than '_cm_', to preserve consistency with the rest of the file. Updated patch below.
- Paul
PATCH v3 3/13 OMAP4: hwmod: Replace CLKCTRL absolute address with offset macros
Quoted 19 lines · Paul Walmsley
Quoted 6 lines · Benoit Cousson
The CLKCTRL register was accessed using an absolute address. The usage of hardcoded macros to calculate virtual address from physical one should be avoided as much as possible.
The usage of a offset will allow future improvement like migration from the current architecture code toward a module driver.Quoted 6 lines
Update
cm_xxxaccessor, move definition to the proper header file and update copyrights.Signed-off-by Benoit Cousson <[email protected]>Cc Paul Walmsley <[email protected]>Cc Rajendra Nayak <[email protected]>This patch was updated to use '_cminst_' in the function names that are in the
cminst44xx.cfile, rather than '_cm_', to preserve consistency with the rest of the file. Updated patch below.
...
Quoted 6 lines
arch/arm/mach-omap2/cminst44xx.c +1
-2-int omap4_cm_wait_module_ready (void __iomem *clkctrl_reg) +int omap4_cminst_wait_module_ready (u8 part,u16 inst,s16 cdoffs,u16 clkctrl_offs) {int i =0 ; -if (!clkctrl_reg)
arch/arm/mach-omap2/cminst44xx.c void omap4_cminst_clkdm_force_wakeup(u8 part, s16 inst, u16 cdoffs) · line 242
Quoted 10 lines
arch/arm/mach-omap2/cminst44xx.c +3
-3+if (!clkctrl_offs)return 0 ;omap_test_timeout (( - ((__raw_readl (clkctrl_reg) &OMAP4430_IDLEST_MASK ) ==0 ) || - (((__raw_readl (clkctrl_reg) &OMAP4430_IDLEST_MASK ) >> -OMAP4430_IDLEST_SHIFT ) ==0x2 )), +_clkctrl_idlest (part, inst, cdoffs, clkctrl_offs) ==0 || +_clkctrl_idlest (part, inst, cdoffs, clkctrl_offs) ==0x2 ),MAX_MODULE_READY_TIME , i);
Suggest adding symbols for the constant IDLEST values, next to the 0x3 value added for "[PATCH v2 04/13] OMAP: hwmod: Wait the idle status to be disabled".
Would be nice to call _clkctrl_idlest() once.
Similar vague questioning of the API names as for the above-mentioned
patch: this waits for the module slave to be ready, don't know if anything similar is needed for module masters or if it's important to keep this distinction.
Todd
Paul Walmsley
maintainerPATCH v3 3/13 OMAP4: hwmod: Replace CLKCTRL absolute address with offset macros
Hi Todd,
Quoted 11 lines · Todd Poynor
Quoted 9 lines · Paul Walmsley
arch/arm/mach-omap2/cminst44xx.c +2
-2-int omap4_cm_wait_module_ready (void __iomem *clkctrl_reg) +int omap4_cminst_wait_module_ready (u8 part,u16 inst,s16 cdoffs,u16 clkctrl_offs) {int i =0 ; -if (!clkctrl_reg) +if (!clkctrl_offs)return 0 ;
Quoted 11 lines
arch/arm/mach-omap2/cminst44xx.c void omap4_cminst_clkdm_force_wakeup(u8 part, s16 inst, u16 cdoffs) · line 242
Quoted 7 lines
arch/arm/mach-omap2/cminst44xx.c +2
-3omap_test_timeout (( - ((__raw_readl (clkctrl_reg) &OMAP4430_IDLEST_MASK ) ==0 ) || - (((__raw_readl (clkctrl_reg) &OMAP4430_IDLEST_MASK ) >> -OMAP4430_IDLEST_SHIFT ) ==0x2 )), +_clkctrl_idlest (part, inst, cdoffs, clkctrl_offs) ==0 || +_clkctrl_idlest (part, inst, cdoffs, clkctrl_offs) ==0x2 ),MAX_MODULE_READY_TIME , i);Suggest adding symbols for the constant IDLEST values, next to the
0x3value added for "[PATCH v2 04/13] OMAP: hwmod: Wait the idle status to be disabled".
Done.
Quoted 1 line
Would be nice to call
_clkctrl_idlest()once.
Agreed. That's now implemented by creating a new static function, _is_module_ready(), that only does one read.
Quoted 4 lines
Similar vague questioning of the API names as for the above-mentioned
patch: this waits for the module slave to be ready, don't know if anything similar is needed for module masters or if it's important to keep this distinction.
I think I know the answer to this one, but would rather not speculate without some hardware investigation. Let's review this issue when Beno?t returns.
Thanks for the comments, they are much appreciated.
- Paul
Paul Walmsley
maintainerPATCH v3 3/13 OMAP4: hwmod: Replace CLKCTRL absolute address with offset macros
In reply to Todd PoynorBy the way, here's the updated patch.
- Paul
PATCH v3 4/13 OMAP: hwmod: Wait the idle status to be disabled
In reply to Benoit CoussonIt is mandatory to wait for a module to be in disabled state before potentially disabling source clock or re-asserting a reset.
omap_hwmod_idle and omap_hwmod_shutdown does not wait for the module to be fully idle.
Add a cm_xxx accessor to wait the clkctrl idle status to be disabled. Fix hwmod_[idle|shutdown] to use this API.
Based on Rajendra's initial patch.
Please note that most interconnects hwmod will return one timeout because it is impossible for them to be in idle since the processor is accessing the registers though the interconnect.
--- arch/arm/mach-omap2/cminst44xx.c | 25 +++++++++++++++++++++++ arch/arm/mach-omap2/cminst44xx.h | 1 + arch/arm/mach-omap2/omap_hwmod.c | 40 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 0 deletions(-)
arch/arm/mach-omap2/cminst44xx.c +25 -0
@@ -244,3 +244,28 @@ int omap4_cm_wait_module_ready(u8 part, u16 inst, s16 cdoffs, u16 clkctrl_offs)return (i <MAX_MODULE_READY_TIME ) ?0 : -EBUSY ; } +/** +* omap4_cm_wait_module_idle - wait for a module to be in 'disabled' +* state +* @part: PRCM partition ID that the CM_CLKCTRL register exists in +* @inst: CM instance register offset (*_INST macro) +* @cdoffs: Clockdomain register offset (*_CDOFFS macro) +* @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro) +* +* Wait for the module IDLEST to be disabled. Some PRCM transition, +* like reset assertion or parent clock de-activation must wait the +* module to be fully disabled. +*/ +int omap4_cm_wait_module_idle (u8 part,u16 inst,s16 cdoffs,u16 clkctrl_offs) +{ +int i =0 ; + +if (!clkctrl_offs) +return 0 ; + +omap_test_timeout ( +_clkctrl_idlest (part, inst, cdoffs, clkctrl_offs) ==0x3 , +MAX_MODULE_READY_TIME , i); + +return (i <MAX_MODULE_READY_TIME ) ?0 : -EBUSY ; +}
arch/arm/mach-omap2/cminst44xx.h +1 -0
@@ -18,6 +18,7 @@ extern void omap4_cminst_clkdm_force_sleep(u8 part, s16 inst, u16 cdoffs);extern void omap4_cminst_clkdm_force_wakeup (u8 part,s16 inst,u16 cdoffs);extern int omap4_cm_wait_module_ready (u8 part,u16 inst,s16 cdoffs,u16 clkctrl_offs); +extern int omap4_cm_wait_module_idle (u8 part,u16 inst,s16 cdoffs,u16 clkctrl_offs);/* * In an ideal world, we would not export these low-level functions,
arch/arm/mach-omap2/omap_hwmod.c +40 -0
@@ -1031,6 +1031,36 @@ static int _wait_target_ready(struct omap_hwmod *oh) }/** +* _wait_target_disable - wait for a module to be disabled +* @oh: struct omap_hwmod * +* +* Wait for a module @oh to leave slave idle. Returns 0 if the module +* does not have an IDLEST bit or if the module successfully leaves +* slave idle; otherwise, pass along the return value of the +* appropriate *_cm_wait_module_ready() function. +*/ +static int _wait_target_disable (struct omap_hwmod *oh) +{ +if (!oh) +return -EINVAL ; + +if (oh->_int_flags & _HWMOD_NO_MPU_PORT) +return 0 ; + +if (oh->flags &HWMOD_NO_IDLEST ) +return 0 ; + +/* TODO: For now just handle OMAP4+ */ +if (cpu_is_omap24xx () ||cpu_is_omap34xx ()) +return 0 ; + +return omap4_cm_wait_module_idle (oh->clkdm->prcm_partition, + oh->clkdm->cm_inst, + oh->clkdm->clkdm_offs, + oh->prcm.omap4.clkctrl_offs); +} + +/** * _lookup_hardreset - fill register bit info for this hwmod/reset line * @oh: struct omap_hwmod * * @name: name of the reset line in the context of this hwmod
@@ -1339,6 +1369,8 @@ static int _enable(struct omap_hwmod *oh)*/ static int _idle (struct omap_hwmod *oh) { +int ret; +pr_debug ("omap_hwmod: %s: idling\n" , oh->name);if (oh->_state != _HWMOD_STATE_ENABLED) {
@@ -1351,6 +1383,10 @@ static int _idle(struct omap_hwmod *oh)_idle_sysc (oh);_del_initiator_dep (oh, mpu_oh);_disable_clocks (oh); + ret =_wait_target_disable (oh); +if (ret) +pr_debug ("omap_hwmod: %s: _wait_target_disable failed\n" , + oh->name);/* Mux pins for device idle if populated */ if (oh->mux && oh->mux->pads_dynamic)
@@ -1443,6 +1479,10 @@ static int _shutdown(struct omap_hwmod *oh)_del_initiator_dep (oh, mpu_oh);/* XXX what about the other system initiators here? dma, dsp */ _disable_clocks (oh); + ret =_wait_target_disable (oh); +if (ret) +pr_debug ("omap_hwmod: %s: _wait_target_disable failed\n" , + oh->name); }/* XXX Should this code also force-disable the optional clocks? */
Signature · 1 line
1.7.0.4
PATCH v3 4/13 OMAP: hwmod: Wait the idle status to be disabled
Quoted 8 lines · Benoit Cousson
It is mandatory to wait for a module to be in disabled state before potentially disabling source clock or re-asserting a reset.
omap_hwmod_idleandomap_hwmod_shutdowndoes not wait for the module to be fully idle.Add a
cm_xxxaccessor to wait the clkctrl idle status to be disabled. Fix hwmod_[idle|shutdown] to use this API.
...
Quoted 1 line
+int
omap4_cm_wait_module_idle(u8 part, u16 inst, s16 cdoffs, u16 clkctrl_offs)
Technically this waits for a module slave to enter "full idle" -- "interface idle" not good enough, and if the module is also a master its standby status could possibly be different... personally, these details make my brain hurt, but thought I'd mention this in case the naming of this interface should capture any of these distinctions.
arch/arm/mach-omap2/cminst44xx.c int omap4_cm_wait_module_ready(u8 part, u16 inst, s16 cdoffs, u16 clkctrl_offs) · line 268
Quoted 9 lines
arch/arm/mach-omap2/cminst44xx.c +9
-0+{ +int i =0 ; + +if (!clkctrl_offs) +return 0 ; + +omap_test_timeout ( +_clkctrl_idlest (part, inst, cdoffs, clkctrl_offs) ==0x3 , +MAX_MODULE_READY_TIME , i);
The numeric constant may already have an equivalent symbol defined, or suggest adding one.
Quoted 8 lines
/**
+ *_wait_target_disable- wait for a module to be disabled
+ * @oh: structomap_hwmod*
+ *
+ * Wait for a module @oh to leave slave idle. Returns 0 if the module
+ * does not have an IDLEST bit or if the module successfully leaves
+ * slave idle; otherwise, pass along the return value of the
+ * appropriate*_cm_wait_module_ready()function.
This paragraph probably c&p from a function with opposite meaning.
...
Quoted 8 lines
static int
_idle(struct omap_hwmod *oh)
{arch/arm/mach-omap2/omap_hwmod.c +2
-0+int ret; +pr_debug ("omap_hwmod: %s: idling\n" , oh->name);if (oh->_state != _HWMOD_STATE_ENABLED) {
arch/arm/mach-omap2/omap_hwmod.c static int _idle(struct omap_hwmod *oh) · line 1389
Quoted 7 lines
arch/arm/mach-omap2/omap_hwmod.c +4
-0@@ -1351,6 +1383,10 @@ static int _idle(struct omap_hwmod *oh)_idle_sysc (oh);_del_initiator_dep (oh, mpu_oh);_disable_clocks (oh); + ret =_wait_target_disable (oh); +if (ret) +pr_debug ("omap_hwmod: %s: _wait_target_disable failed\n" , + oh->name);
Should callers see an error function return in this case?
Todd
Paul Walmsley
maintainerPATCH v3 4/13 OMAP: hwmod: Wait the idle status to be disabled
Hi Todd,
Beno?t is away right now, so I'll deal with the straightforward aspects of your comments, and leave the more complex parts for him when he gets back.
Quoted 9 lines · Todd Poynor
Quoted 8 lines · Benoit Cousson
It is mandatory to wait for a module to be in disabled state before potentially disabling source clock or re-asserting a reset.
omap_hwmod_idleandomap_hwmod_shutdowndoes not wait for the module to be fully idle.Add a
cm_xxxaccessor to wait the clkctrl idle status to be disabled. Fix hwmod_[idle|shutdown] to use this API.
Quoted 8 lines
...
Quoted 1 line
+int
omap4_cm_wait_module_idle(u8 part, u16 inst, s16 cdoffs, u16 clkctrl_offs)Technically this waits for a module slave to enter "full idle" -- "interface idle" not good enough, and if the module is also a master its standby status could possibly be different... personally, these details make my brain hurt, but thought I'd mention this in case the naming of this interface should capture any of these distinctions.
This is probably going to need clarification from someone who knows the PRCM state machine.
Quoted 13 lines
Review
Quoted 10 lines
(quoted diff) +9
-0+{ + int i = 0; + + if (!clkctrl_offs) + return 0; + + omap_test_timeout( + _clkctrl_idlest(part, inst, cdoffs, clkctrl_offs) == 0x3, + MAX_MODULE_READY_TIME, i);The numeric constant may already have an equivalent symbol defined, or suggest adding one.
Added.
Quoted 11 lines
Quoted 9 lines
/**
+ *_wait_target_disable- wait for a module to be disabled
+ * @oh: structomap_hwmod*
+ *
+ * Wait for a module @oh to leave slave idle. Returns 0 if the module
+ * does not have an IDLEST bit or if the module successfully leaves
+ * slave idle; otherwise, pass along the return value of the
+ * appropriate*_cm_wait_module_ready()function.This paragraph probably c&p from a function with opposite meaning.
Fixed.
Quoted 6 lines
Quoted 6 lines
static int
_idle(struct omap_hwmod *oh)
{(quoted diff) +2
-0+ int ret; + pr_debug("omap_hwmod: %s: idling\n", oh->name);
Quoted 11 lines
Review static int _idle(struct omap_hwmod *oh) · line 1389
Quoted 9 lines
(quoted diff) +4
-0if (oh->_state != _HWMOD_STATE_ENABLED) {@@ -1351,6 +1383,10 @@ static int _idle(struct omap_hwmod *oh) _idle_sysc(oh); _del_initiator_dep(oh, mpu_oh); _disable_clocks(oh); + ret = _wait_target_disable(oh); + if (ret) + pr_debug("omap_hwmod: %s: _wait_target_disable failed\n", + oh->name);Should callers see an error function return in this case?
I don't know, but I've changed the pr_debug() to pr_warn() so that these aren't hidden. That will result in some warnings on boot. The goal is to 'inspire' someone to fix those issues in the -rc series or 3.2.
The updated patch is below.
- Paul
From: Benoit Cousson <[email protected]>
Date: Fri, 1 Jul 2011 23:09:09 +0200
Subject: [PATCH] OMAP: hwmod: Wait the idle status to be disabled
It is mandatory to wait for a module to be in disabled state before potentially disabling source clock or re-asserting a reset.
omap_hwmod_idle and omap_hwmod_shutdown does not wait for the module to be fully idle.
Add a cm_xxx accessor to wait the clkctrl idle status to be disabled. Fix hwmod_[idle|shutdown] to use this API.
Based on Rajendra's initial patch.
Please note that most interconnects hwmod will return one timeout because it is impossible for them to be in idle since the processor is accessing the registers though the interconnect.
[paul at pwsan.com: move cpu_is_*() tests to the top of _wait_target_disable();
incorporate some feedback from Todd]
--- arch/arm/mach-omap2/cminst44xx.c | 27 +++++++++++++++++++++++++ arch/arm/mach-omap2/cminst44xx.h | 1 + arch/arm/mach-omap2/omap_hwmod.c | 40 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 0 deletions(-)
arch/arm/mach-omap2/cminst44xx.c +27 -0
@@ -33,6 +33,8 @@#include "prm44xx.h" #include "prcm_mpu44xx.h" +#define CLKCTRL_IDLEST_DISABLED 0x3 +static u32 _cm_bases[OMAP4_MAX_PRCM_PARTITIONS ] = { [OMAP4430_INVALID_PRCM_PARTITION ] =0 , [OMAP4430_PRM_PARTITION ] =OMAP4430_PRM_BASE ,
@@ -244,3 +246,28 @@ int omap4_cminst_wait_module_ready(u8 part, u16 inst, s16 cdoffs, u16 clkctrl_ofreturn (i <MAX_MODULE_READY_TIME ) ?0 : -EBUSY ; } +/** +* omap4_cminst_wait_module_idle - wait for a module to be in 'disabled' +* state +* @part: PRCM partition ID that the CM_CLKCTRL register exists in +* @inst: CM instance register offset (*_INST macro) +* @cdoffs: Clockdomain register offset (*_CDOFFS macro) +* @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro) +* +* Wait for the module IDLEST to be disabled. Some PRCM transition, +* like reset assertion or parent clock de-activation must wait the +* module to be fully disabled. +*/ +int omap4_cminst_wait_module_idle (u8 part,u16 inst,s16 cdoffs,u16 clkctrl_offs) +{ +int i =0 ; + +if (!clkctrl_offs) +return 0 ; + +omap_test_timeout ((_clkctrl_idlest (part, inst, cdoffs, clkctrl_offs) == +CLKCTRL_IDLEST_DISABLED ), +MAX_MODULE_READY_TIME , i); + +return (i <MAX_MODULE_READY_TIME ) ?0 : -EBUSY ; +}
arch/arm/mach-omap2/cminst44xx.h +1 -0
@@ -18,6 +18,7 @@ extern void omap4_cminst_clkdm_force_sleep(u8 part, s16 inst, u16 cdoffs);extern void omap4_cminst_clkdm_force_wakeup (u8 part,s16 inst,u16 cdoffs);extern int omap4_cminst_wait_module_ready (u8 part,u16 inst,s16 cdoffs,u16 clkctrl_offs); +extern int omap4_cminst_wait_module_idle (u8 part,u16 inst,s16 cdoffs,u16 clkctrl_offs);/* * In an ideal world, we would not export these low-level functions,
arch/arm/mach-omap2/omap_hwmod.c +40 -0
@@ -1013,6 +1013,36 @@ static int _wait_target_ready(struct omap_hwmod *oh) }/** +* _wait_target_disable - wait for a module to be disabled +* @oh: struct omap_hwmod * +* +* Wait for a module @oh to enter slave idle. Returns 0 if the module +* does not have an IDLEST bit or if the module successfully enters +* slave idle; otherwise, pass along the return value of the +* appropriate *_cm*_wait_module_idle() function. +*/ +static int _wait_target_disable (struct omap_hwmod *oh) +{ +/* TODO: For now just handle OMAP4+ */ +if (cpu_is_omap24xx () ||cpu_is_omap34xx ()) +return 0 ; + +if (!oh) +return -EINVAL ; + +if (oh->_int_flags & _HWMOD_NO_MPU_PORT) +return 0 ; + +if (oh->flags &HWMOD_NO_IDLEST ) +return 0 ; + +return omap4_cminst_wait_module_idle (oh->clkdm->prcm_partition, + oh->clkdm->cm_inst, + oh->clkdm->clkdm_offs, + oh->prcm.omap4.clkctrl_offs); +} + +/** * _lookup_hardreset - fill register bit info for this hwmod/reset line * @oh: struct omap_hwmod * * @name: name of the reset line in the context of this hwmod
@@ -1319,6 +1349,8 @@ static int _enable(struct omap_hwmod *oh)*/ static int _idle (struct omap_hwmod *oh) { +int ret; +if (oh->_state != _HWMOD_STATE_ENABLED) {WARN (1 ,"omap_hwmod: %s: idle state can only be entered from " "enabled state\n" , oh->name);
@@ -1331,6 +1363,10 @@ static int _idle(struct omap_hwmod *oh)_idle_sysc (oh);_del_initiator_dep (oh, mpu_oh);_disable_clocks (oh); + ret =_wait_target_disable (oh); +if (ret) +pr_warn ("omap_hwmod: %s: _wait_target_disable failed\n" , + oh->name);/* Mux pins for device idle if populated */ if (oh->mux && oh->mux->pads_dynamic)
@@ -1427,6 +1463,10 @@ static int _shutdown(struct omap_hwmod *oh)_del_initiator_dep (oh, mpu_oh);/* XXX what about the other system initiators here? dma, dsp */ _disable_clocks (oh); + ret =_wait_target_disable (oh); +if (ret) +pr_warn ("omap_hwmod: %s: _wait_target_disable failed\n" , + oh->name); }/* XXX Should this code also force-disable the optional clocks? */
Signature · 1 line
1.7.5.4
PATCH v3 5/13 OMAP2+: hwmod: Replace clkdm access from main_clk using hwmod attribute
In reply to Benoit CoussonSince the clkdm is now part of the omap_hwmod structure, there is no need to retrieve it from the main_clock or interface clock.
The code can be simplified a little bit with a direct access.
--- arch/arm/mach-omap2/omap_hwmod.c | 34 ++++++++-------------------------- 1 files changed, 8 insertions(+), 26 deletions(-)
arch/arm/mach-omap2/omap_hwmod.c +8 -26
@@ -463,13 +463,13 @@ static int _disable_wakeup(struct omap_hwmod *oh, u32 *v)*/ static int _add_initiator_dep (struct omap_hwmod *oh,struct omap_hwmod *init_oh) { -if (!oh->_clk) +if (!oh->clkdm)return -EINVAL ; -if (oh->_clk->clkdm && oh->_clk->clkdm->flags &CLKDM_NO_AUTODEPS ) +if (oh->clkdm->flags &CLKDM_NO_AUTODEPS )return 0 ; -return clkdm_add_sleepdep (oh->_clk->clkdm, init_oh->_clk->clkdm); +return clkdm_add_sleepdep (oh->clkdm, init_oh->clkdm); }/**
@@ -487,13 +487,13 @@ static int _add_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh)*/ static int _del_initiator_dep (struct omap_hwmod *oh,struct omap_hwmod *init_oh) { -if (!oh->_clk) +if (!oh->clkdm)return -EINVAL ; -if (oh->_clk->clkdm && oh->_clk->clkdm->flags &CLKDM_NO_AUTODEPS ) +if (oh->clkdm->flags &CLKDM_NO_AUTODEPS )return 0 ; -return clkdm_del_sleepdep (oh->_clk->clkdm, init_oh->_clk->clkdm); +return clkdm_del_sleepdep (oh->clkdm, init_oh->clkdm); }/**
@@ -518,10 +518,6 @@ static int _init_main_clk(struct omap_hwmod *oh)return -EINVAL ; } -if (!oh->_clk->clkdm) -pr_warning ("omap_hwmod: %s: missing clockdomain for %s.\n" , - oh->main_clk, oh->_clk->name); -return ret; }
@@ -2108,24 +2104,10 @@ int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res)*/ struct powerdomain *omap_hwmod_get_pwrdm (struct omap_hwmod *oh) { -struct clk *c; - -if (!oh) +if (!oh || !oh->clkdm)return NULL ; -if (oh->_clk) { - c = oh->_clk; - }else { -if (oh->_int_flags & _HWMOD_NO_MPU_PORT) -return NULL ; - c = oh->slaves[oh->_mpu_port_index]->_clk; - } - -if (!c->clkdm) -return NULL ; - -return c->clkdm->pwrdm.ptr; - +return oh->clkdm->pwrdm.ptr; }/**
Signature · 1 line
1.7.0.4
Paul Walmsley
maintainerPATCH v3 5/13 OMAP2+: hwmod: Replace clkdm access from main_clk using hwmod attribute
Hi,
Quoted 7 lines · Benoit Cousson
Since the clkdm is now part of the
omap_hwmodstructure, there is no need to retrieve it from themain_clockor interface clock.
The code can be simplified a little bit with a direct access.Signed-off-by Benoit Cousson <[email protected]>Cc Paul Walmsley <[email protected]>Cc Rajendra Nayak <[email protected]>
this won't work on OMAP2/3, so, dropping.
- Paul
PATCH v3 6/13 OMAP4: hwmod: Replace RSTCTRL absolute address with offset macros
In reply to Benoit CoussonThe RSTCTRL register was accessed using an absolute address. The usage of hardcoded macros to calculate virtual address from physical one should be avoided as much as possible.
The usage of an offset will allow future improvement like migration from the current architecture code toward a module driver.
Update prm_xxx accessors, move definition to the proper header file and update copyrights.
Change the s16 register offset parameter to u16.
--- arch/arm/mach-omap2/omap_hwmod.c | 19 ++++-- arch/arm/mach-omap2/omap_hwmod_44xx_data.c | 16 ++-- arch/arm/mach-omap2/prm44xx.c | 93 +------------------------- arch/arm/mach-omap2/prm44xx.h | 4 - arch/arm/mach-omap2/prminst44xx.c | 89 ++++++++++++++++++++++++- arch/arm/mach-omap2/prminst44xx.h | 10 +++- arch/arm/plat-omap/include/plat/omap_hwmod.h | 3 +- 7 files changed, 121 insertions(+), 113 deletions(-)
arch/arm/mach-omap2/omap_hwmod.c +13 -6
@@ -148,6 +148,7 @@#include "cminst44xx.h" #include "prm2xxx_3xxx.h" #include "prm44xx.h" +#include "prminst44xx.h" #include "mux.h" /* Maximum microseconds to wait for OMAP module to softreset */
@@ -1112,8 +1113,10 @@ static int _assert_hardreset(struct omap_hwmod *oh, const char *name)return omap2_prm_assert_hardreset (oh->prcm.omap2.module_offs, ohri.rst_shift); else if (cpu_is_omap44xx()) - return omap4_prm_assert_hardreset(oh->prcm.omap4.rstctrl_reg, - ohri.rst_shift); + return omap4_prm_assert_hardreset(ohri.rst_shift, + oh->clkdm->pwrdm.ptr->prcm_partition, + oh->clkdm->pwrdm.ptr->prcm_offs, + oh->prcm.omap4.rstctrl_offs); else return -EINVAL; }
@@ -1148,8 +1151,10 @@ static int _deassert_hardreset(struct omap_hwmod *oh, const char *name)if (ohri.st_shift)pr_err ("omap_hwmod: %s: %s: hwmod data error: OMAP4 does not support st_shift\n" , oh->name, name); - ret =omap4_prm_deassert_hardreset (oh->prcm.omap4.rstctrl_reg, - ohri.rst_shift); + ret =omap4_prm_deassert_hardreset (ohri.rst_shift, + oh->clkdm->pwrdm.ptr->prcm_partition, + oh->clkdm->pwrdm.ptr->prcm_offs, + oh->prcm.omap4.rstctrl_offs); }else {return -EINVAL ; }
@@ -1184,8 +1189,10 @@ static int _read_hardreset(struct omap_hwmod *oh, const char *name)return omap2_prm_is_hardreset_asserted (oh->prcm.omap2.module_offs, ohri.st_shift); }else if (cpu_is_omap44xx ()) { -return omap4_prm_is_hardreset_asserted (oh->prcm.omap4.rstctrl_reg, - ohri.rst_shift); +return omap4_prm_is_hardreset_asserted (ohri.rst_shift, + oh->clkdm->pwrdm.ptr->prcm_partition, + oh->clkdm->pwrdm.ptr->prcm_offs, + oh->prcm.omap4.rstctrl_offs); }else {return -EINVAL ; }
arch/arm/mach-omap2/omap_hwmod_44xx_data.c +8 -8
@@ -1141,7 +1141,7 @@ static struct omap_hwmod omap44xx_dsp_c0_hwmod = { .rst_lines_cnt = ARRAY_SIZE(omap44xx_dsp_c0_resets), .prcm = { .omap4 = { - .rstctrl_reg = OMAP4430_RM_TESLA_RSTCTRL, + .rstctrl_offs = OMAP4_RM_TESLA_RSTCTRL_OFFSET, }, }, .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP44XX),
@@ -1159,7 +1159,7 @@ static struct omap_hwmod omap44xx_dsp_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_TESLA_TESLA_CLKCTRL_OFFSET, - .rstctrl_reg = OMAP4430_RM_TESLA_RSTCTRL, + .rstctrl_offs = OMAP4_RM_TESLA_RSTCTRL_OFFSET, }, }, .slaves = omap44xx_dsp_slaves,
@@ -2525,7 +2525,7 @@ static struct omap_hwmod omap44xx_ipu_c0_hwmod = { .rst_lines_cnt = ARRAY_SIZE(omap44xx_ipu_c0_resets), .prcm = { .omap4 = { - .rstctrl_reg = OMAP4430_RM_DUCATI_RSTCTRL, + .rstctrl_offs = OMAP4_RM_DUCATI_RSTCTRL_OFFSET, }, }, .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP44XX),
@@ -2541,7 +2541,7 @@ static struct omap_hwmod omap44xx_ipu_c1_hwmod = { .rst_lines_cnt = ARRAY_SIZE(omap44xx_ipu_c1_resets), .prcm = { .omap4 = { - .rstctrl_reg = OMAP4430_RM_DUCATI_RSTCTRL, + .rstctrl_offs = OMAP4_RM_DUCATI_RSTCTRL_OFFSET, }, }, .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP44XX),
@@ -2559,7 +2559,7 @@ static struct omap_hwmod omap44xx_ipu_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_DUCATI_DUCATI_CLKCTRL_OFFSET, - .rstctrl_reg = OMAP4430_RM_DUCATI_RSTCTRL, + .rstctrl_offs = OMAP4_RM_DUCATI_RSTCTRL_OFFSET, }, }, .slaves = omap44xx_ipu_slaves,
@@ -2725,7 +2725,7 @@ static struct omap_hwmod omap44xx_iva_seq0_hwmod = { .rst_lines_cnt = ARRAY_SIZE(omap44xx_iva_seq0_resets), .prcm = { .omap4 = { - .rstctrl_reg = OMAP4430_RM_IVAHD_RSTCTRL, + .rstctrl_offs = OMAP4_RM_IVAHD_RSTCTRL_OFFSET, }, }, .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP44XX),
@@ -2741,7 +2741,7 @@ static struct omap_hwmod omap44xx_iva_seq1_hwmod = { .rst_lines_cnt = ARRAY_SIZE(omap44xx_iva_seq1_resets), .prcm = { .omap4 = { - .rstctrl_reg = OMAP4430_RM_IVAHD_RSTCTRL, + .rstctrl_offs = OMAP4_RM_IVAHD_RSTCTRL_OFFSET, }, }, .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP44XX),
@@ -2759,7 +2759,7 @@ static struct omap_hwmod omap44xx_iva_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_IVAHD_IVAHD_CLKCTRL_OFFSET, - .rstctrl_reg = OMAP4430_RM_IVAHD_RSTCTRL, + .rstctrl_offs = OMAP4_RM_IVAHD_RSTCTRL_OFFSET, }, }, .slaves = omap44xx_iva_slaves,
arch/arm/mach-omap2/prm44xx.c +1 -92
111 lines not on this page · raw message
arch/arm/mach-omap2/prm44xx.h +0 -4
@@ -691,10 +691,6 @@ extern u32 omap4_prm_set_inst_reg_bits(u32 bits, s16 inst, s16 idx);extern u32 omap4_prm_clear_inst_reg_bits (u32 bits,s16 inst,s16 idx);extern u32 omap4_prm_read_bits_shift (void __iomem *reg,u32 mask); -extern int omap4_prm_is_hardreset_asserted (void __iomem *rstctrl_reg,u8 shift); -extern int omap4_prm_assert_hardreset (void __iomem *rstctrl_reg,u8 shift); -extern int omap4_prm_deassert_hardreset (void __iomem *rstctrl_reg,u8 shift); -extern void omap4_prm_global_warm_sw_reset (void );# endif
arch/arm/mach-omap2/prminst44xx.c +88 -1
104 lines not on this page · raw message
arch/arm/mach-omap2/prminst44xx.h +9 -1
@@ -2,6 +2,7 @@* OMAP4 Power/Reset Management (PRM) function prototypes * * Copyright (C) 2010 Nokia Corporation +* Copyright (C) 2011 Texas Instruments, Inc. * Paul Walmsley * * This program is free software; you can redistribute it and/or modify
@@ -18,8 +19,15 @@extern u32 omap4_prminst_read_inst_reg (u8 part,s16 inst,u16 idx);extern void omap4_prminst_write_inst_reg (u32 val,u8 part,s16 inst,u16 idx);extern u32 omap4_prminst_rmw_inst_reg_bits (u32 mask,u32 bits,u8 part, -s16 inst,s16 idx); +s16 inst,u16 idx);extern void omap4_prm_global_warm_sw_reset (void ); +extern int omap4_prm_is_hardreset_asserted (u8 shift,u8 part,s16 inst, +u16 rstctrl_offs); +extern int omap4_prm_assert_hardreset (u8 shift,u8 part,s16 inst, +u16 rstctrl_offs); +extern int omap4_prm_deassert_hardreset (u8 shift,u8 part,s16 inst, +u16 rstctrl_offs); +#endif
arch/arm/plat-omap/include/plat/omap_hwmod.h +2 -1
@@ -2,6 +2,7 @@* omap_hwmod macros, structures * * Copyright (C) 2009-2011 Nokia Corporation +* Copyright (C) 2011 Texas Instruments, Inc. * Paul Walmsley * * Created in collaboration with (alphabetical order): Beno??t Cousson,
@@ -363,7 +364,7 @@ struct omap_hwmod_omap2_prcm {*/ struct omap_hwmod_omap4_prcm {u16 clkctrl_offs; -void __iomem *rstctrl_reg; +u16 rstctrl_offs;u8 submodule_wkdep_bit; };
Signature · 1 line
1.7.0.4
Paul Walmsley
maintainerPATCH v3 6/13 OMAP4: hwmod: Replace RSTCTRL absolute address with offset macros
Quoted 6 lines · Benoit Cousson
The RSTCTRL register was accessed using an absolute address. The usage of hardcoded macros to calculate virtual address from physical one should be avoided as much as possible.
The usage of an offset will allow future improvement like migration from the current architecture code toward a module driver.
Quoted 7 lines
Update
prm_xxxaccessors, move definition to the proper header file and update copyrights.
Change the s16 register offset parameter to u16.Signed-off-by Benoit Cousson <[email protected]>Cc Paul Walmsley <[email protected]>Cc Rajendra Nayak <[email protected]>
This patch was updated to use '_prminst_' in function names that are part of the prminst44xx.c file, rather than '_prm_', to preserve consistency with the rest of the file. Updated patch below.
- Paul
Quoted 1 line
From
d321d28e3df135330dc9d3143214c67122d1175eMon Sep 17 00:00:00 2001
From: Benoit Cousson <[email protected]>
Date: Fri, 1 Jul 2011 23:09:11 +0200
Subject: [PATCH] OMAP4: hwmod: Replace RSTCTRL absolute address with offset
macros
The RSTCTRL register was accessed using an absolute address. The usage of hardcoded macros to calculate virtual address from physical one should be avoided as much as possible.
The usage of an offset will allow future improvement like migration from the current architecture code toward a module driver.
Update prm_xxx accessors, move definition to the proper header file and update copyrights.
Change the s16 register offset parameter to u16.
[paul at pwsan.com: use '_prminst_' in function names that are part of the
prminst44xx.c file]
--- arch/arm/mach-omap2/omap_hwmod.c | 19 ++++-- arch/arm/mach-omap2/omap_hwmod_44xx_data.c | 16 ++-- arch/arm/mach-omap2/prm44xx.c | 93 +------------------------- arch/arm/mach-omap2/prm44xx.h | 4 - arch/arm/mach-omap2/prminst44xx.c | 93 +++++++++++++++++++++++++- arch/arm/mach-omap2/prminst44xx.h | 10 +++- arch/arm/plat-omap/include/plat/omap_hwmod.h | 3 +- 7 files changed, 125 insertions(+), 113 deletions(-)
arch/arm/mach-omap2/omap_hwmod.c +13 -6
@@ -148,6 +148,7 @@#include "cminst44xx.h" #include "prm2xxx_3xxx.h" #include "prm44xx.h" +#include "prminst44xx.h" #include "mux.h" /* Maximum microseconds to wait for OMAP module to softreset */
@@ -1098,8 +1099,10 @@ static int _assert_hardreset(struct omap_hwmod *oh, const char *name)return omap2_prm_assert_hardreset (oh->prcm.omap2.module_offs, ohri.rst_shift); else if (cpu_is_omap44xx()) - return omap4_prm_assert_hardreset(oh->prcm.omap4.rstctrl_reg, - ohri.rst_shift); + return omap4_prminst_assert_hardreset(ohri.rst_shift, + oh->clkdm->pwrdm.ptr->prcm_partition, + oh->clkdm->pwrdm.ptr->prcm_offs, + oh->prcm.omap4.rstctrl_offs); else return -EINVAL; }
@@ -1134,8 +1137,10 @@ static int _deassert_hardreset(struct omap_hwmod *oh, const char *name)if (ohri.st_shift)pr_err ("omap_hwmod: %s: %s: hwmod data error: OMAP4 does not support st_shift\n" , oh->name, name); - ret =omap4_prm_deassert_hardreset (oh->prcm.omap4.rstctrl_reg, - ohri.rst_shift); + ret =omap4_prminst_deassert_hardreset (ohri.rst_shift, + oh->clkdm->pwrdm.ptr->prcm_partition, + oh->clkdm->pwrdm.ptr->prcm_offs, + oh->prcm.omap4.rstctrl_offs); }else {return -EINVAL ; }
@@ -1170,8 +1175,10 @@ static int _read_hardreset(struct omap_hwmod *oh, const char *name)return omap2_prm_is_hardreset_asserted (oh->prcm.omap2.module_offs, ohri.st_shift); }else if (cpu_is_omap44xx ()) { -return omap4_prm_is_hardreset_asserted (oh->prcm.omap4.rstctrl_reg, - ohri.rst_shift); +return omap4_prminst_is_hardreset_asserted (ohri.rst_shift, + oh->clkdm->pwrdm.ptr->prcm_partition, + oh->clkdm->pwrdm.ptr->prcm_offs, + oh->prcm.omap4.rstctrl_offs); }else {return -EINVAL ; }
arch/arm/mach-omap2/omap_hwmod_44xx_data.c +8 -8
@@ -1139,7 +1139,7 @@ static struct omap_hwmod omap44xx_dsp_c0_hwmod = { .rst_lines_cnt = ARRAY_SIZE(omap44xx_dsp_c0_resets), .prcm = { .omap4 = { - .rstctrl_reg = OMAP4430_RM_TESLA_RSTCTRL, + .rstctrl_offs = OMAP4_RM_TESLA_RSTCTRL_OFFSET, }, }, .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
@@ -1157,7 +1157,7 @@ static struct omap_hwmod omap44xx_dsp_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_TESLA_TESLA_CLKCTRL_OFFSET, - .rstctrl_reg = OMAP4430_RM_TESLA_RSTCTRL, + .rstctrl_offs = OMAP4_RM_TESLA_RSTCTRL_OFFSET, }, }, .slaves = omap44xx_dsp_slaves,
@@ -2479,7 +2479,7 @@ static struct omap_hwmod omap44xx_ipu_c0_hwmod = { .rst_lines_cnt = ARRAY_SIZE(omap44xx_ipu_c0_resets), .prcm = { .omap4 = { - .rstctrl_reg = OMAP4430_RM_DUCATI_RSTCTRL, + .rstctrl_offs = OMAP4_RM_DUCATI_RSTCTRL_OFFSET, }, }, .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
@@ -2495,7 +2495,7 @@ static struct omap_hwmod omap44xx_ipu_c1_hwmod = { .rst_lines_cnt = ARRAY_SIZE(omap44xx_ipu_c1_resets), .prcm = { .omap4 = { - .rstctrl_reg = OMAP4430_RM_DUCATI_RSTCTRL, + .rstctrl_offs = OMAP4_RM_DUCATI_RSTCTRL_OFFSET, }, }, .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
@@ -2513,7 +2513,7 @@ static struct omap_hwmod omap44xx_ipu_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_DUCATI_DUCATI_CLKCTRL_OFFSET, - .rstctrl_reg = OMAP4430_RM_DUCATI_RSTCTRL, + .rstctrl_offs = OMAP4_RM_DUCATI_RSTCTRL_OFFSET, }, }, .slaves = omap44xx_ipu_slaves,
@@ -2679,7 +2679,7 @@ static struct omap_hwmod omap44xx_iva_seq0_hwmod = { .rst_lines_cnt = ARRAY_SIZE(omap44xx_iva_seq0_resets), .prcm = { .omap4 = { - .rstctrl_reg = OMAP4430_RM_IVAHD_RSTCTRL, + .rstctrl_offs = OMAP4_RM_IVAHD_RSTCTRL_OFFSET, }, }, .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
@@ -2695,7 +2695,7 @@ static struct omap_hwmod omap44xx_iva_seq1_hwmod = { .rst_lines_cnt = ARRAY_SIZE(omap44xx_iva_seq1_resets), .prcm = { .omap4 = { - .rstctrl_reg = OMAP4430_RM_IVAHD_RSTCTRL, + .rstctrl_offs = OMAP4_RM_IVAHD_RSTCTRL_OFFSET, }, }, .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
@@ -2713,7 +2713,7 @@ static struct omap_hwmod omap44xx_iva_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_IVAHD_IVAHD_CLKCTRL_OFFSET, - .rstctrl_reg = OMAP4430_RM_IVAHD_RSTCTRL, + .rstctrl_offs = OMAP4_RM_IVAHD_RSTCTRL_OFFSET, }, }, .slaves = omap44xx_iva_slaves,
arch/arm/mach-omap2/prm44xx.c +1 -92
111 lines not on this page · raw message
arch/arm/mach-omap2/prm44xx.h +0 -4
@@ -767,10 +767,6 @@ extern u32 omap4_prm_set_inst_reg_bits(u32 bits, s16 inst, s16 idx);extern u32 omap4_prm_clear_inst_reg_bits (u32 bits,s16 inst,s16 idx);extern u32 omap4_prm_read_bits_shift (void __iomem *reg,u32 mask); -extern int omap4_prm_is_hardreset_asserted (void __iomem *rstctrl_reg,u8 shift); -extern int omap4_prm_assert_hardreset (void __iomem *rstctrl_reg,u8 shift); -extern int omap4_prm_deassert_hardreset (void __iomem *rstctrl_reg,u8 shift); -extern void omap4_prm_global_warm_sw_reset (void );# endif
arch/arm/mach-omap2/prminst44xx.c +92 -1
108 lines not on this page · raw message
arch/arm/mach-omap2/prminst44xx.h +9 -1
@@ -2,6 +2,7 @@* OMAP4 Power/Reset Management (PRM) function prototypes * * Copyright (C) 2010 Nokia Corporation +* Copyright (C) 2011 Texas Instruments, Inc. * Paul Walmsley * * This program is free software; you can redistribute it and/or modify
@@ -18,8 +19,15 @@extern u32 omap4_prminst_read_inst_reg (u8 part,s16 inst,u16 idx);extern void omap4_prminst_write_inst_reg (u32 val,u8 part,s16 inst,u16 idx);extern u32 omap4_prminst_rmw_inst_reg_bits (u32 mask,u32 bits,u8 part, -s16 inst,s16 idx); +s16 inst,u16 idx);extern void omap4_prm_global_warm_sw_reset (void ); +extern int omap4_prminst_is_hardreset_asserted (u8 shift,u8 part,s16 inst, +u16 rstctrl_offs); +extern int omap4_prminst_assert_hardreset (u8 shift,u8 part,s16 inst, +u16 rstctrl_offs); +extern int omap4_prminst_deassert_hardreset (u8 shift,u8 part,s16 inst, +u16 rstctrl_offs); +#endif
arch/arm/plat-omap/include/plat/omap_hwmod.h +2 -1
@@ -2,6 +2,7 @@* omap_hwmod macros, structures * * Copyright (C) 2009-2011 Nokia Corporation +* Copyright (C) 2011 Texas Instruments, Inc. * Paul Walmsley * * Created in collaboration with (alphabetical order): Beno?t Cousson,
@@ -363,7 +364,7 @@ struct omap_hwmod_omap2_prcm {*/ struct omap_hwmod_omap4_prcm {u16 clkctrl_offs; -void __iomem *rstctrl_reg; +u16 rstctrl_offs;u8 submodule_wkdep_bit; };
Signature · 1 line
1.7.5.4
PATCH v3 7/13 OMAP4: prm: Replace warm reset API with the offset based version
In reply to Benoit CoussonThe warm reset function was still using the obsolete API. Replace it by the new one and move the file to the proper c file.
Change the function names to stick to the file convention as suggested by Paul Walmsley <[email protected]>:prm_xxx -> prminst_xxx
--- arch/arm/mach-omap2/omap_hwmod.c | 6 +++--- arch/arm/mach-omap2/prcm.c | 2 +- arch/arm/mach-omap2/prm44xx.c | 15 --------------- arch/arm/mach-omap2/prm44xx.h | 2 -- arch/arm/mach-omap2/prminst44xx.c | 29 ++++++++++++++++++++++++----- arch/arm/mach-omap2/prminst44xx.h | 14 +++++++------- 6 files changed, 35 insertions(+), 33 deletions(-)
arch/arm/mach-omap2/omap_hwmod.c +3 -3
@@ -1113,7 +1113,7 @@ static int _assert_hardreset(struct omap_hwmod *oh, const char *name)return omap2_prm_assert_hardreset (oh->prcm.omap2.module_offs, ohri.rst_shift); else if (cpu_is_omap44xx()) - return omap4_prm_assert_hardreset(ohri.rst_shift, + return omap4_prminst_assert_hardreset(ohri.rst_shift, oh->clkdm->pwrdm.ptr->prcm_partition, oh->clkdm->pwrdm.ptr->prcm_offs, oh->prcm.omap4.rstctrl_offs);
@@ -1151,7 +1151,7 @@ static int _deassert_hardreset(struct omap_hwmod *oh, const char *name)if (ohri.st_shift)pr_err ("omap_hwmod: %s: %s: hwmod data error: OMAP4 does not support st_shift\n" , oh->name, name); - ret =omap4_prm_deassert_hardreset (ohri.rst_shift, + ret =omap4_prminst_deassert_hardreset (ohri.rst_shift, oh->clkdm->pwrdm.ptr->prcm_partition, oh->clkdm->pwrdm.ptr->prcm_offs, oh->prcm.omap4.rstctrl_offs);
@@ -1189,7 +1189,7 @@ static int _read_hardreset(struct omap_hwmod *oh, const char *name)return omap2_prm_is_hardreset_asserted (oh->prcm.omap2.module_offs, ohri.st_shift); }else if (cpu_is_omap44xx ()) { -return omap4_prm_is_hardreset_asserted (ohri.rst_shift, +return omap4_prminst_is_hardreset_asserted (ohri.rst_shift, oh->clkdm->pwrdm.ptr->prcm_partition, oh->clkdm->pwrdm.ptr->prcm_offs, oh->prcm.omap4.rstctrl_offs);
arch/arm/mach-omap2/prcm.c +1 -1
@@ -70,7 +70,7 @@ static void omap_prcm_arch_reset(char mode, const char *cmd) prcm_offs =OMAP3430_GR_MOD ;omap3_ctrl_write_boot_mode ((cmd ? (u8)*cmd :0 )); }else if (cpu_is_omap44xx ()) { -omap4_prm_global_warm_sw_reset ();/* never returns */ +omap4_prminst_global_warm_sw_reset ();/* never returns */ }else {WARN_ON (1 ); }
arch/arm/mach-omap2/prm44xx.c +0 -15
@@ -87,18 +87,3 @@ u32 omap4_prm_clear_inst_reg_bits(u32 bits, s16 inst, s16 reg) {return omap4_prm_rmw_inst_reg_bits (bits,0x0 , inst, reg); } - -void omap4_prm_global_warm_sw_reset (void ) -{ -u32 v; - - v =omap4_prm_read_inst_reg (OMAP4430_PRM_DEVICE_INST , -OMAP4_RM_RSTCTRL ); - v |=OMAP4430_RST_GLOBAL_WARM_SW_MASK ; -omap4_prm_write_inst_reg (v,OMAP4430_PRM_DEVICE_INST , -OMAP4_RM_RSTCTRL ); - -/* OCP barrier */ - v =omap4_prm_read_inst_reg (OMAP4430_PRM_DEVICE_INST , -OMAP4_RM_RSTCTRL ); -}
arch/arm/mach-omap2/prm44xx.h +0 -2
@@ -691,8 +691,6 @@ extern u32 omap4_prm_set_inst_reg_bits(u32 bits, s16 inst, s16 idx);extern u32 omap4_prm_clear_inst_reg_bits (u32 bits,s16 inst,s16 idx);extern u32 omap4_prm_read_bits_shift (void __iomem *reg,u32 mask); -extern void omap4_prm_global_warm_sw_reset (void ); -# endif #endif
arch/arm/mach-omap2/prminst44xx.c +24 -5
@@ -82,7 +82,7 @@ u32 omap4_prminst_rmw_inst_reg_bits(u32 mask, u32 bits, u8 part, s16 inst,* 0 if the (sub)module hardreset line is not currently asserted, or * -EINVAL upon parameter error. */ -int omap4_prm_is_hardreset_asserted (u8 shift,u8 part,s16 inst, +int omap4_prminst_is_hardreset_asserted (u8 shift,u8 part,s16 inst,u16 rstctrl_offs) {u32 v;
@@ -106,7 +106,7 @@ int omap4_prm_is_hardreset_asserted(u8 shift, u8 part, s16 inst,* place the submodule into reset. Returns 0 upon success or -EINVAL * upon an argument error. */ -int omap4_prm_assert_hardreset (u8 shift,u8 part,s16 inst, +int omap4_prminst_assert_hardreset (u8 shift,u8 part,s16 inst,u16 rstctrl_offs) {u32 mask =1 << shift;
@@ -130,7 +130,7 @@ int omap4_prm_assert_hardreset(u8 shift, u8 part, s16 inst,* -EINVAL upon an argument error, -EEXIST if the submodule was already out * of reset, or -EBUSY if the submodule did not exit reset promptly. */ -int omap4_prm_deassert_hardreset (u8 shift,u8 part,s16 inst, +int omap4_prminst_deassert_hardreset (u8 shift,u8 part,s16 inst,u16 rstctrl_offs) {int c;
@@ -138,7 +138,7 @@ int omap4_prm_deassert_hardreset(u8 shift, u8 part, s16 inst,u16 rstst_offs = rstctrl_offs +OMAP4_RST_CTRL_ST_OFFSET ;/* Check the current status to avoid de-asserting the line twice */ -if (omap4_prm_is_hardreset_asserted (shift, part, inst, rstctrl_offs) ==0 ) +if (omap4_prminst_is_hardreset_asserted (shift, part, inst, rstctrl_offs) ==0 )return -EEXIST ;/* Clear the reset status by writing 1 to the status bit */
@@ -146,8 +146,27 @@ int omap4_prm_deassert_hardreset(u8 shift, u8 part, s16 inst,/* de-assert the reset control line */ omap4_prminst_rmw_inst_reg_bits (mask,0 , part, inst, rstctrl_offs);/* wait the status to be set */ -omap_test_timeout (omap4_prm_is_hardreset_asserted (shift, part, inst, rstst_offs), +omap_test_timeout (omap4_prminst_is_hardreset_asserted (shift, part, inst, rstst_offs),MAX_MODULE_HARDRESET_WAIT , c);return (c ==MAX_MODULE_HARDRESET_WAIT ) ? -EBUSY :0 ; } + + +void omap4_prminst_global_warm_sw_reset (void ) +{ +u32 v; + + v =omap4_prminst_read_inst_reg (OMAP4430_PRM_PARTITION , +OMAP4430_PRM_DEVICE_INST , +OMAP4_PRM_RSTCTRL_OFFSET ); + v |=OMAP4430_RST_GLOBAL_WARM_SW_MASK ; +omap4_prminst_write_inst_reg (v,OMAP4430_PRM_PARTITION , +OMAP4430_PRM_DEVICE_INST , +OMAP4_PRM_RSTCTRL_OFFSET ); + +/* OCP barrier */ + v =omap4_prminst_read_inst_reg (OMAP4430_PRM_PARTITION , +OMAP4430_PRM_DEVICE_INST , +OMAP4_PRM_RSTCTRL_OFFSET ); +}
arch/arm/mach-omap2/prminst44xx.h +7 -7
@@ -21,13 +21,13 @@ extern void omap4_prminst_write_inst_reg(u32 val, u8 part, s16 inst, u16 idx);extern u32 omap4_prminst_rmw_inst_reg_bits (u32 mask,u32 bits,u8 part,s16 inst,u16 idx); -extern void omap4_prm_global_warm_sw_reset (void ); +extern void omap4_prminst_global_warm_sw_reset (void ); -extern int omap4_prm_is_hardreset_asserted (u8 shift,u8 part,s16 inst, -u16 rstctrl_offs); -extern int omap4_prm_assert_hardreset (u8 shift,u8 part,s16 inst, -u16 rstctrl_offs); -extern int omap4_prm_deassert_hardreset (u8 shift,u8 part,s16 inst, -u16 rstctrl_offs); +extern int omap4_prminst_is_hardreset_asserted (u8 shift,u8 part,s16 inst, +u16 rstctrl_offs); +extern int omap4_prminst_assert_hardreset (u8 shift,u8 part,s16 inst, +u16 rstctrl_offs); +extern int omap4_prminst_deassert_hardreset (u8 shift,u8 part,s16 inst, +u16 rstctrl_offs);#endif
Signature · 1 line
1.7.0.4
PATCH v3 8/13 OMAP4: prm: Remove deprecated functions
In reply to Benoit CoussonThe new prminst_xxx accessors based on partition and offset is now used, so removed all the previous prcm_xxx accessors.
--- arch/arm/mach-omap2/prm44xx.c | 37 ------------------------------------- 1 files changed, 0 insertions(+), 37 deletions(-)
arch/arm/mach-omap2/prm44xx.c +0 -37
@@ -50,40 +50,3 @@ u32 omap4_prm_rmw_inst_reg_bits(u32 mask, u32 bits, s16 inst, s16 reg)return v; } - -/* Read a PRM register, AND it, and shift the result down to bit 0 */ -/* XXX deprecated */ -u32 omap4_prm_read_bits_shift (void __iomem *reg,u32 mask) -{ -u32 v; - - v =__raw_readl (reg); - v &= mask; - v >>=__ffs (mask); - -return v; -} - -/* Read-modify-write a register in a PRM module. Caller must lock */ -/* XXX deprecated */ -u32 omap4_prm_rmw_reg_bits (u32 mask,u32 bits,void __iomem *reg) -{ -u32 v; - - v =__raw_readl (reg); - v &= ~mask; - v |= bits; -__raw_writel (v, reg); - -return v; -} - -u32 omap4_prm_set_inst_reg_bits (u32 bits,s16 inst,s16 reg) -{ -return omap4_prm_rmw_inst_reg_bits (bits, bits, inst, reg); -} - -u32 omap4_prm_clear_inst_reg_bits (u32 bits,s16 inst,s16 reg) -{ -return omap4_prm_rmw_inst_reg_bits (bits,0x0 , inst, reg); -}
Signature · 1 line
1.7.0.4
PATCH v3 9/13 OMAP4: hwmod data: Align interconnect format with regular modules
In reply to Benoit CoussonThe interconnect modules were using a slightly different layout than the regular modules.
Align the layout for better consitency.
--- arch/arm/mach-omap2/omap_hwmod_44xx_data.c | 48 ++++++++++++++-------------- 1 files changed, 24 insertions(+), 24 deletions(-)
arch/arm/mach-omap2/omap_hwmod_44xx_data.c +24 -24
@@ -80,7 +80,11 @@ static struct omap_hwmod_class omap44xx_dmm_hwmod_class = { .name = "dmm", }; -/* dmm interface data */ +/* dmm */ +static struct omap_hwmod_irq_info omap44xx_dmm_irqs[] = { + { .irq =113 +OMAP44XX_IRQ_GIC_START }, +}; +/* l3_main_1 -> dmm */ static struct omap_hwmod_ocp_if omap44xx_l3_main_1__dmm = { .master = &omap44xx_l3_main_1_hwmod,
@@ -113,14 +117,12 @@ static struct omap_hwmod_ocp_if *omap44xx_dmm_slaves[] = { &omap44xx_mpu__dmm, }; -static struct omap_hwmod_irq_info omap44xx_dmm_irqs[] = { - { .irq =113 +OMAP44XX_IRQ_GIC_START }, -}; -static struct omap_hwmod omap44xx_dmm_hwmod = { .name ="dmm" , .class = &omap44xx_dmm_hwmod_class, .clkdm_name ="l3_emif_clkdm" , + .mpu_irqs = omap44xx_dmm_irqs, + .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_dmm_irqs), .prcm = { .omap4 = { .clkctrl_offs =OMAP4_CM_MEMIF_DMM_CLKCTRL_OFFSET ,
@@ -128,8 +130,6 @@ static struct omap_hwmod omap44xx_dmm_hwmod = { }, .slaves = omap44xx_dmm_slaves, .slaves_cnt = ARRAY_SIZE(omap44xx_dmm_slaves), - .mpu_irqs = omap44xx_dmm_irqs, - .mpu_irqs_cnt = ARRAY_SIZE(omap44xx_dmm_irqs), .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP44XX), };
@@ -141,7 +141,7 @@ static struct omap_hwmod_class omap44xx_emif_fw_hwmod_class = { .name = "emif_fw", }; -/* emif_fw interface data */ +/* emif_fw */ /* dmm -> emif_fw */ static struct omap_hwmod_ocp_if omap44xx_dmm__emif_fw = { .master = &omap44xx_dmm_hwmod,
@@ -196,7 +196,7 @@ static struct omap_hwmod_class omap44xx_l3_hwmod_class = { .name = "l3", }; -/* l3_instr interface data */ +/* l3_instr */ /* iva -> l3_instr */ static struct omap_hwmod_ocp_if omap44xx_iva__l3_instr = { .master = &omap44xx_iva_hwmod,
@@ -233,7 +233,12 @@ static struct omap_hwmod omap44xx_l3_instr_hwmod = { .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP44XX), }; -/* l3_main_1 interface data */ +/* l3_main_1 */ +static struct omap_hwmod_irq_info omap44xx_l3_main_1_irqs[] = { + { .name ="dbg_err" , .irq =9 +OMAP44XX_IRQ_GIC_START }, + { .name ="app_err" , .irq =10 +OMAP44XX_IRQ_GIC_START }, +}; +/* dsp -> l3_main_1 */ static struct omap_hwmod_ocp_if omap44xx_dsp__l3_main_1 = { .master = &omap44xx_dsp_hwmod,
@@ -311,15 +316,12 @@ static struct omap_hwmod_ocp_if *omap44xx_l3_main_1_slaves[] = { &omap44xx_mpu__l3_main_1, }; -static struct omap_hwmod_irq_info omap44xx_l3_main_1_irqs[] = { - { .name ="dbg_err" , .irq =9 +OMAP44XX_IRQ_GIC_START }, - { .name ="app_err" , .irq =10 +OMAP44XX_IRQ_GIC_START }, -}; -static struct omap_hwmod omap44xx_l3_main_1_hwmod = { .name ="l3_main_1" , .class = &omap44xx_l3_hwmod_class, .clkdm_name ="l3_1_clkdm" , + .mpu_irqs = omap44xx_l3_main_1_irqs, + .mpu_irqs_cnt =ARRAY_SIZE (omap44xx_l3_main_1_irqs), .prcm = { .omap4 = { .clkctrl_offs =OMAP4_CM_L3_1_L3_1_CLKCTRL_OFFSET ,
@@ -327,12 +329,10 @@ static struct omap_hwmod omap44xx_l3_main_1_hwmod = { }, .slaves = omap44xx_l3_main_1_slaves, .slaves_cnt = ARRAY_SIZE(omap44xx_l3_main_1_slaves), - .mpu_irqs = omap44xx_l3_main_1_irqs, - .mpu_irqs_cnt = ARRAY_SIZE(omap44xx_l3_main_1_irqs), .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP44XX), }; -/* l3_main_2 interface data */ +/* l3_main_2 */ /* dma_system -> l3_main_2 */ static struct omap_hwmod_ocp_if omap44xx_dma_system__l3_main_2 = { .master = &omap44xx_dma_system_hwmod,
@@ -433,7 +433,7 @@ static struct omap_hwmod omap44xx_l3_main_2_hwmod = { .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP44XX), }; -/* l3_main_3 interface data */ +/* l3_main_3 */ static struct omap_hwmod_addr_space omap44xx_l3_main_3_addrs[] = { { .pa_start =0x45000000 ,
@@ -497,7 +497,7 @@ static struct omap_hwmod_class omap44xx_l4_hwmod_class = { .name = "l4", }; -/* l4_abe interface data */ +/* l4_abe */ /* aess -> l4_abe */ static struct omap_hwmod_ocp_if omap44xx_aess__l4_abe = { .master = &omap44xx_aess_hwmod,
@@ -552,7 +552,7 @@ static struct omap_hwmod omap44xx_l4_abe_hwmod = { .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP44XX), }; -/* l4_cfg interface data */ +/* l4_cfg */ /* l3_main_1 -> l4_cfg */ static struct omap_hwmod_ocp_if omap44xx_l3_main_1__l4_cfg = { .master = &omap44xx_l3_main_1_hwmod,
@@ -580,7 +580,7 @@ static struct omap_hwmod omap44xx_l4_cfg_hwmod = { .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP44XX), }; -/* l4_per interface data */ +/* l4_per */ /* l3_main_2 -> l4_per */ static struct omap_hwmod_ocp_if omap44xx_l3_main_2__l4_per = { .master = &omap44xx_l3_main_2_hwmod,
@@ -608,7 +608,7 @@ static struct omap_hwmod omap44xx_l4_per_hwmod = { .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP44XX), }; -/* l4_wkup interface data */ +/* l4_wkup */ /* l4_cfg -> l4_wkup */ static struct omap_hwmod_ocp_if omap44xx_l4_cfg__l4_wkup = { .master = &omap44xx_l4_cfg_hwmod,
@@ -644,7 +644,7 @@ static struct omap_hwmod_class omap44xx_mpu_bus_hwmod_class = { .name = "mpu_bus", }; -/* mpu_private interface data */ +/* mpu_private */ /* mpu -> mpu_private */ static struct omap_hwmod_ocp_if omap44xx_mpu__mpu_private = { .master = &omap44xx_mpu_hwmod,
Signature · 1 line
1.7.0.4
Paul Walmsley
maintainerPATCH v3 9/13 OMAP4: hwmod data: Align interconnect format with regular modules
Quoted 3 lines · Benoit Cousson
The interconnect modules were using a slightly different layout than the regular modules.
Align the layout for better consitency.
Thanks, this patch has been queued for 3.1 atgit://git.pwsan.com/linux-2.6 in the 'omap4_hwmod_data_cleanup_a_3.1' branch.
- Paul
PATCH v3 10/13 OMAP4: hwmod data: Add PRM context register offset
In reply to Benoit CoussonAdd a 'context_offs' entry in the prcm.omap4 structure to all IPs when applicable.
The offset will be used to retrieve the per module context lost information now available on OMAP4.
--- arch/arm/mach-omap2/omap_hwmod_44xx_data.c | 74 ++++++++++++++++++++++++++ arch/arm/plat-omap/include/plat/omap_hwmod.h | 1 + 2 files changed, 75 insertions(+), 0 deletions(-)
arch/arm/mach-omap2/omap_hwmod_44xx_data.c +74 -0
@@ -126,6 +126,7 @@ static struct omap_hwmod omap44xx_dmm_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_MEMIF_DMM_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_MEMIF_DMM_CONTEXT_OFFSET, }, }, .slaves = omap44xx_dmm_slaves,
@@ -181,6 +182,7 @@ static struct omap_hwmod omap44xx_emif_fw_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_MEMIF_EMIF_FW_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_MEMIF_EMIF_FW_CONTEXT_OFFSET, }, }, .slaves = omap44xx_emif_fw_slaves,
@@ -226,6 +228,7 @@ static struct omap_hwmod omap44xx_l3_instr_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L3INSTR_L3_INSTR_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L3INSTR_L3_INSTR_CONTEXT_OFFSET, }, }, .slaves = omap44xx_l3_instr_slaves,
@@ -325,6 +328,7 @@ static struct omap_hwmod omap44xx_l3_main_1_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L3_1_L3_1_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L3_1_L3_1_CONTEXT_OFFSET, }, }, .slaves = omap44xx_l3_main_1_slaves,
@@ -426,6 +430,7 @@ static struct omap_hwmod omap44xx_l3_main_2_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L3_2_L3_2_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L3_2_L3_2_CONTEXT_OFFSET, }, }, .slaves = omap44xx_l3_main_2_slaves,
@@ -482,6 +487,7 @@ static struct omap_hwmod omap44xx_l3_main_3_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L3INSTR_L3_3_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L3INSTR_L3_3_CONTEXT_OFFSET, }, }, .slaves = omap44xx_l3_main_3_slaves,
@@ -573,6 +579,7 @@ static struct omap_hwmod omap44xx_l4_cfg_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4CFG_L4_CFG_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4CFG_L4_CFG_CONTEXT_OFFSET, }, }, .slaves = omap44xx_l4_cfg_slaves,
@@ -601,6 +608,7 @@ static struct omap_hwmod omap44xx_l4_per_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_L4PER_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4PER_L4_PER_CONTEXT_OFFSET, }, }, .slaves = omap44xx_l4_per_slaves,
@@ -629,6 +637,7 @@ static struct omap_hwmod omap44xx_l4_wkup_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_WKUP_L4WKUP_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_WKUP_L4WKUP_CONTEXT_OFFSET, }, }, .slaves = omap44xx_l4_wkup_slaves,
@@ -807,6 +816,7 @@ static struct omap_hwmod omap44xx_aess_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM1_ABE_AESS_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_ABE_AESS_CONTEXT_OFFSET, }, }, .slaves = omap44xx_aess_slaves,
@@ -897,6 +907,7 @@ static struct omap_hwmod omap44xx_counter_32k_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_WKUP_SYNCTIMER_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_WKUP_SYNCTIMER_CONTEXT_OFFSET, }, }, .slaves = omap44xx_counter_32k_slaves,
@@ -981,6 +992,7 @@ static struct omap_hwmod omap44xx_dma_system_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_SDMA_SDMA_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_SDMA_SDMA_CONTEXT_OFFSET, }, }, .dev_attr = &dma_dev_attr,
@@ -1075,6 +1087,7 @@ static struct omap_hwmod omap44xx_dmic_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM1_ABE_DMIC_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_ABE_DMIC_CONTEXT_OFFSET, }, }, .slaves = omap44xx_dmic_slaves,
@@ -1160,6 +1173,7 @@ static struct omap_hwmod omap44xx_dsp_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_TESLA_TESLA_CLKCTRL_OFFSET, .rstctrl_offs = OMAP4_RM_TESLA_RSTCTRL_OFFSET, + .context_offs = OMAP4_RM_TESLA_TESLA_CONTEXT_OFFSET, }, }, .slaves = omap44xx_dsp_slaves,
@@ -1249,6 +1263,7 @@ static struct omap_hwmod omap44xx_dss_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_DSS_DSS_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_DSS_DSS_CONTEXT_OFFSET, }, }, .opt_clks = dss_opt_clks,
@@ -1355,6 +1370,7 @@ static struct omap_hwmod omap44xx_dss_dispc_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_DSS_DSS_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_DSS_DSS_CONTEXT_OFFSET, }, }, .opt_clks = dss_dispc_opt_clks,
@@ -1454,6 +1470,7 @@ static struct omap_hwmod omap44xx_dss_dsi1_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_DSS_DSS_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_DSS_DSS_CONTEXT_OFFSET, }, }, .opt_clks = dss_dsi1_opt_clks,
@@ -1532,6 +1549,7 @@ static struct omap_hwmod omap44xx_dss_dsi2_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_DSS_DSS_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_DSS_DSS_CONTEXT_OFFSET, }, }, .opt_clks = dss_dsi2_opt_clks,
@@ -1630,6 +1648,7 @@ static struct omap_hwmod omap44xx_dss_hdmi_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_DSS_DSS_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_DSS_DSS_CONTEXT_OFFSET, }, }, .opt_clks = dss_hdmi_opt_clks,
@@ -1721,6 +1740,7 @@ static struct omap_hwmod omap44xx_dss_rfbi_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_DSS_DSS_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_DSS_DSS_CONTEXT_OFFSET, }, }, .opt_clks = dss_rfbi_opt_clks,
@@ -1795,6 +1815,7 @@ static struct omap_hwmod omap44xx_dss_venc_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_DSS_DSS_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_DSS_DSS_CONTEXT_OFFSET, }, }, .opt_clks = dss_venc_opt_clks,
@@ -1876,6 +1897,7 @@ static struct omap_hwmod omap44xx_gpio1_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_WKUP_GPIO1_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_WKUP_GPIO1_CONTEXT_OFFSET, }, }, .opt_clks = gpio1_opt_clks,
@@ -1930,6 +1952,7 @@ static struct omap_hwmod omap44xx_gpio2_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_GPIO2_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4PER_GPIO2_CONTEXT_OFFSET, }, }, .opt_clks = gpio2_opt_clks,
@@ -1984,6 +2007,7 @@ static struct omap_hwmod omap44xx_gpio3_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_GPIO3_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4PER_GPIO3_CONTEXT_OFFSET, }, }, .opt_clks = gpio3_opt_clks,
@@ -2038,6 +2062,7 @@ static struct omap_hwmod omap44xx_gpio4_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_GPIO4_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4PER_GPIO4_CONTEXT_OFFSET, }, }, .opt_clks = gpio4_opt_clks,
@@ -2092,6 +2117,7 @@ static struct omap_hwmod omap44xx_gpio5_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_GPIO5_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4PER_GPIO5_CONTEXT_OFFSET, }, }, .opt_clks = gpio5_opt_clks,
@@ -2146,6 +2172,7 @@ static struct omap_hwmod omap44xx_gpio6_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_GPIO6_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4PER_GPIO6_CONTEXT_OFFSET, }, }, .opt_clks = gpio6_opt_clks,
@@ -2225,6 +2252,7 @@ static struct omap_hwmod omap44xx_hsi_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L3INIT_HSI_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L3INIT_HSI_CONTEXT_OFFSET, }, }, .slaves = omap44xx_hsi_slaves,
@@ -2302,6 +2330,7 @@ static struct omap_hwmod omap44xx_i2c1_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_I2C1_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4PER_I2C1_CONTEXT_OFFSET, }, }, .slaves = omap44xx_i2c1_slaves,
@@ -2356,6 +2385,7 @@ static struct omap_hwmod omap44xx_i2c2_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_I2C2_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4PER_I2C2_CONTEXT_OFFSET, }, }, .slaves = omap44xx_i2c2_slaves,
@@ -2410,6 +2440,7 @@ static struct omap_hwmod omap44xx_i2c3_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_I2C3_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4PER_I2C3_CONTEXT_OFFSET, }, }, .slaves = omap44xx_i2c3_slaves,
@@ -2464,6 +2495,7 @@ static struct omap_hwmod omap44xx_i2c4_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_I2C4_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4PER_I2C4_CONTEXT_OFFSET, }, }, .slaves = omap44xx_i2c4_slaves,
@@ -2560,6 +2592,7 @@ static struct omap_hwmod omap44xx_ipu_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_DUCATI_DUCATI_CLKCTRL_OFFSET, .rstctrl_offs = OMAP4_RM_DUCATI_RSTCTRL_OFFSET, + .context_offs = OMAP4_RM_DUCATI_DUCATI_CONTEXT_OFFSET, }, }, .slaves = omap44xx_ipu_slaves,
@@ -2646,6 +2679,7 @@ static struct omap_hwmod omap44xx_iss_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_CAM_ISS_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_CAM_ISS_CONTEXT_OFFSET, }, }, .opt_clks = iss_opt_clks,
@@ -2760,6 +2794,7 @@ static struct omap_hwmod omap44xx_iva_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_IVAHD_IVAHD_CLKCTRL_OFFSET, .rstctrl_offs = OMAP4_RM_IVAHD_RSTCTRL_OFFSET, + .context_offs = OMAP4_RM_IVAHD_IVAHD_CONTEXT_OFFSET, }, }, .slaves = omap44xx_iva_slaves,
@@ -2830,6 +2865,7 @@ static struct omap_hwmod omap44xx_kbd_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_WKUP_KEYBOARD_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_WKUP_KEYBOARD_CONTEXT_OFFSET, }, }, .slaves = omap44xx_kbd_slaves,
@@ -2895,6 +2931,7 @@ static struct omap_hwmod omap44xx_mailbox_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4CFG_MAILBOX_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4CFG_MAILBOX_CONTEXT_OFFSET, }, }, .slaves = omap44xx_mailbox_slaves,
@@ -2988,6 +3025,7 @@ static struct omap_hwmod omap44xx_mcbsp1_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM1_ABE_MCBSP1_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_ABE_MCBSP1_CONTEXT_OFFSET, }, }, .slaves = omap44xx_mcbsp1_slaves,
@@ -3062,6 +3100,7 @@ static struct omap_hwmod omap44xx_mcbsp2_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM1_ABE_MCBSP2_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_ABE_MCBSP2_CONTEXT_OFFSET, }, }, .slaves = omap44xx_mcbsp2_slaves,
@@ -3136,6 +3175,7 @@ static struct omap_hwmod omap44xx_mcbsp3_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM1_ABE_MCBSP3_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_ABE_MCBSP3_CONTEXT_OFFSET, }, }, .slaves = omap44xx_mcbsp3_slaves,
@@ -3189,6 +3229,7 @@ static struct omap_hwmod omap44xx_mcbsp4_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_MCBSP4_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4PER_MCBSP4_CONTEXT_OFFSET, }, }, .slaves = omap44xx_mcbsp4_slaves,
@@ -3282,6 +3323,7 @@ static struct omap_hwmod omap44xx_mcpdm_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM1_ABE_PDM_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_ABE_PDM_CONTEXT_OFFSET, }, }, .slaves = omap44xx_mcpdm_slaves,
@@ -3368,6 +3410,7 @@ static struct omap_hwmod omap44xx_mcspi1_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_MCSPI1_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4PER_MCSPI1_CONTEXT_OFFSET, }, }, .dev_attr = &mcspi1_dev_attr,
@@ -3429,6 +3472,7 @@ static struct omap_hwmod omap44xx_mcspi2_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_MCSPI2_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4PER_MCSPI2_CONTEXT_OFFSET, }, }, .dev_attr = &mcspi2_dev_attr,
@@ -3490,6 +3534,7 @@ static struct omap_hwmod omap44xx_mcspi3_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_MCSPI3_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4PER_MCSPI3_CONTEXT_OFFSET, }, }, .dev_attr = &mcspi3_dev_attr,
@@ -3549,6 +3594,7 @@ static struct omap_hwmod omap44xx_mcspi4_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_MCSPI4_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4PER_MCSPI4_CONTEXT_OFFSET, }, }, .dev_attr = &mcspi4_dev_attr,
@@ -3634,6 +3680,7 @@ static struct omap_hwmod omap44xx_mmc1_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L3INIT_MMC1_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L3INIT_MMC1_CONTEXT_OFFSET, }, }, .dev_attr = &mmc1_dev_attr,
@@ -3694,6 +3741,7 @@ static struct omap_hwmod omap44xx_mmc2_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L3INIT_MMC2_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L3INIT_MMC2_CONTEXT_OFFSET, }, }, .slaves = omap44xx_mmc2_slaves,
@@ -3749,6 +3797,7 @@ static struct omap_hwmod omap44xx_mmc3_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_MMCSD3_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4PER_MMCSD3_CONTEXT_OFFSET, }, }, .slaves = omap44xx_mmc3_slaves,
@@ -3802,6 +3851,7 @@ static struct omap_hwmod omap44xx_mmc4_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_MMCSD4_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4PER_MMCSD4_CONTEXT_OFFSET, }, }, .slaves = omap44xx_mmc4_slaves,
@@ -3855,6 +3905,7 @@ static struct omap_hwmod omap44xx_mmc5_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_MMCSD5_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4PER_MMCSD5_CONTEXT_OFFSET, }, }, .slaves = omap44xx_mmc5_slaves,
@@ -3896,6 +3947,7 @@ static struct omap_hwmod omap44xx_mpu_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_MPU_MPU_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_MPU_MPU_CONTEXT_OFFSET, }, }, .masters = omap44xx_mpu_masters,
@@ -3969,6 +4021,7 @@ static struct omap_hwmod omap44xx_smartreflex_core_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_ALWON_SR_CORE_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_ALWON_SR_CORE_CONTEXT_OFFSET, }, }, .slaves = omap44xx_smartreflex_core_slaves,
@@ -4016,6 +4069,7 @@ static struct omap_hwmod omap44xx_smartreflex_iva_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_ALWON_SR_IVA_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_ALWON_SR_IVA_CONTEXT_OFFSET, }, }, .slaves = omap44xx_smartreflex_iva_slaves,
@@ -4063,6 +4117,7 @@ static struct omap_hwmod omap44xx_smartreflex_mpu_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_ALWON_SR_MPU_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_ALWON_SR_MPU_CONTEXT_OFFSET, }, }, .slaves = omap44xx_smartreflex_mpu_slaves,
@@ -4125,6 +4180,7 @@ static struct omap_hwmod omap44xx_spinlock_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4CFG_HW_SEM_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4CFG_HW_SEM_CONTEXT_OFFSET, }, }, .slaves = omap44xx_spinlock_slaves,
@@ -4209,6 +4265,7 @@ static struct omap_hwmod omap44xx_timer1_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_WKUP_TIMER1_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_WKUP_TIMER1_CONTEXT_OFFSET, }, }, .slaves = omap44xx_timer1_slaves,
@@ -4255,6 +4312,7 @@ static struct omap_hwmod omap44xx_timer2_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER2_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4PER_DMTIMER2_CONTEXT_OFFSET, }, }, .slaves = omap44xx_timer2_slaves,
@@ -4301,6 +4359,7 @@ static struct omap_hwmod omap44xx_timer3_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER3_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4PER_DMTIMER3_CONTEXT_OFFSET, }, }, .slaves = omap44xx_timer3_slaves,
@@ -4347,6 +4406,7 @@ static struct omap_hwmod omap44xx_timer4_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER4_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4PER_DMTIMER4_CONTEXT_OFFSET, }, }, .slaves = omap44xx_timer4_slaves,
@@ -4412,6 +4472,7 @@ static struct omap_hwmod omap44xx_timer5_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM1_ABE_TIMER5_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_ABE_TIMER5_CONTEXT_OFFSET, }, }, .slaves = omap44xx_timer5_slaves,
@@ -4477,6 +4538,7 @@ static struct omap_hwmod omap44xx_timer6_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM1_ABE_TIMER6_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_ABE_TIMER6_CONTEXT_OFFSET, }, }, .slaves = omap44xx_timer6_slaves,
@@ -4542,6 +4604,7 @@ static struct omap_hwmod omap44xx_timer7_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM1_ABE_TIMER7_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_ABE_TIMER7_CONTEXT_OFFSET, }, }, .slaves = omap44xx_timer7_slaves,
@@ -4607,6 +4670,7 @@ static struct omap_hwmod omap44xx_timer8_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM1_ABE_TIMER8_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_ABE_TIMER8_CONTEXT_OFFSET, }, }, .slaves = omap44xx_timer8_slaves,
@@ -4653,6 +4717,7 @@ static struct omap_hwmod omap44xx_timer9_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER9_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4PER_DMTIMER9_CONTEXT_OFFSET, }, }, .slaves = omap44xx_timer9_slaves,
@@ -4699,6 +4764,7 @@ static struct omap_hwmod omap44xx_timer10_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER10_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4PER_DMTIMER10_CONTEXT_OFFSET, }, }, .slaves = omap44xx_timer10_slaves,
@@ -4745,6 +4811,7 @@ static struct omap_hwmod omap44xx_timer11_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER11_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4PER_DMTIMER11_CONTEXT_OFFSET, }, }, .slaves = omap44xx_timer11_slaves,
@@ -4820,6 +4887,7 @@ static struct omap_hwmod omap44xx_uart1_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_UART1_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4PER_UART1_CONTEXT_OFFSET, }, }, .slaves = omap44xx_uart1_slaves,
@@ -4873,6 +4941,7 @@ static struct omap_hwmod omap44xx_uart2_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_UART2_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4PER_UART2_CONTEXT_OFFSET, }, }, .slaves = omap44xx_uart2_slaves,
@@ -4927,6 +4996,7 @@ static struct omap_hwmod omap44xx_uart3_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_UART3_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4PER_UART3_CONTEXT_OFFSET, }, }, .slaves = omap44xx_uart3_slaves,
@@ -4980,6 +5050,7 @@ static struct omap_hwmod omap44xx_uart4_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_UART4_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L4PER_UART4_CONTEXT_OFFSET, }, }, .slaves = omap44xx_uart4_slaves,
@@ -5059,6 +5130,7 @@ static struct omap_hwmod omap44xx_usb_otg_hs_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_L3INIT_USB_OTG_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_L3INIT_USB_OTG_CONTEXT_OFFSET, }, }, .opt_clks = usb_otg_hs_opt_clks,
@@ -5132,6 +5204,7 @@ static struct omap_hwmod omap44xx_wd_timer2_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM_WKUP_WDT2_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_WKUP_WDT2_CONTEXT_OFFSET, }, }, .slaves = omap44xx_wd_timer2_slaves,
@@ -5197,6 +5270,7 @@ static struct omap_hwmod omap44xx_wd_timer3_hwmod = { .prcm = { .omap4 = { .clkctrl_offs = OMAP4_CM1_ABE_WDT3_CLKCTRL_OFFSET, + .context_offs = OMAP4_RM_ABE_WDT3_CONTEXT_OFFSET, }, }, .slaves = omap44xx_wd_timer3_slaves,
arch/arm/plat-omap/include/plat/omap_hwmod.h +1 -0
@@ -365,6 +365,7 @@ struct omap_hwmod_omap2_prcm {struct omap_hwmod_omap4_prcm {u16 clkctrl_offs;u16 rstctrl_offs; +u16 context_offs;u8 submodule_wkdep_bit; };
Signature · 1 line
1.7.0.4
PATCH v3 11/13 OMAP4: hwmod data: Add modulemode entry in omap_hwmod structure
In reply to Benoit CoussonAdd a new field to provide the mode supported by the module. The mode will control the way mandatory clocks are managed by the PRCM.
0 : Module is temporarily disabled by SW. OCP access to module are stalled.
Can be used to change timing parameter of GPMC module.
1 : Module is managed automatically by HW according to clock domain
transition. A clock domain sleep transition put module into idle. A wakeup domain transition put it back into function.
If CLKTRCTRL=3, any OCP access to module is always granted. Module clocks may be gated according to the clock domain state.
2 : Module is explicitly enabled. Interface clock (if not used for
functions) may be gated according to the clock domain state. Functional clocks are guarantied to stay present. As long as in this configuration, power domain sleep transition cannot happen.
Some modules will have a modulemode initialized at 1 (HWCTRL) by default. This is the case for interconnect and simple module like GPIO, WDT, MAILBOX.
--- arch/arm/mach-omap2/omap_hwmod_44xx_data.c | 55 ++++++++++++++++++++++++++ arch/arm/plat-omap/include/plat/omap_hwmod.h | 6 +++ 2 files changed, 61 insertions(+), 0 deletions(-)
arch/arm/mach-omap2/omap_hwmod_44xx_data.c +55 -0
@@ -229,6 +229,7 @@ static struct omap_hwmod omap44xx_l3_instr_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L3INSTR_L3_INSTR_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L3INSTR_L3_INSTR_CONTEXT_OFFSET, + .modulemode = MODULEMODE_HWCTRL, }, }, .slaves = omap44xx_l3_instr_slaves,
@@ -488,6 +489,7 @@ static struct omap_hwmod omap44xx_l3_main_3_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L3INSTR_L3_3_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L3INSTR_L3_3_CONTEXT_OFFSET, + .modulemode = MODULEMODE_HWCTRL, }, }, .slaves = omap44xx_l3_main_3_slaves,
@@ -817,6 +819,7 @@ static struct omap_hwmod omap44xx_aess_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM1_ABE_AESS_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_ABE_AESS_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_aess_slaves,
@@ -1088,6 +1091,7 @@ static struct omap_hwmod omap44xx_dmic_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM1_ABE_DMIC_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_ABE_DMIC_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_dmic_slaves,
@@ -1174,6 +1178,7 @@ static struct omap_hwmod omap44xx_dsp_hwmod = { .clkctrl_offs = OMAP4_CM_TESLA_TESLA_CLKCTRL_OFFSET, .rstctrl_offs = OMAP4_RM_TESLA_RSTCTRL_OFFSET, .context_offs = OMAP4_RM_TESLA_TESLA_CONTEXT_OFFSET, + .modulemode = MODULEMODE_HWCTRL, }, }, .slaves = omap44xx_dsp_slaves,
@@ -1898,6 +1903,7 @@ static struct omap_hwmod omap44xx_gpio1_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_WKUP_GPIO1_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_WKUP_GPIO1_CONTEXT_OFFSET, + .modulemode = MODULEMODE_HWCTRL, }, }, .opt_clks = gpio1_opt_clks,
@@ -1953,6 +1959,7 @@ static struct omap_hwmod omap44xx_gpio2_hwmod = { .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,
@@ -2008,6 +2015,7 @@ static struct omap_hwmod omap44xx_gpio3_hwmod = { .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,
@@ -2063,6 +2071,7 @@ static struct omap_hwmod omap44xx_gpio4_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_GPIO4_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_GPIO4_CONTEXT_OFFSET, + .modulemode = MODULEMODE_HWCTRL, }, }, .opt_clks = gpio4_opt_clks,
@@ -2118,6 +2127,7 @@ static struct omap_hwmod omap44xx_gpio5_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_GPIO5_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_GPIO5_CONTEXT_OFFSET, + .modulemode = MODULEMODE_HWCTRL, }, }, .opt_clks = gpio5_opt_clks,
@@ -2173,6 +2183,7 @@ static struct omap_hwmod omap44xx_gpio6_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_GPIO6_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_GPIO6_CONTEXT_OFFSET, + .modulemode = MODULEMODE_HWCTRL, }, }, .opt_clks = gpio6_opt_clks,
@@ -2253,6 +2264,7 @@ static struct omap_hwmod omap44xx_hsi_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L3INIT_HSI_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L3INIT_HSI_CONTEXT_OFFSET, + .modulemode = MODULEMODE_HWCTRL, }, }, .slaves = omap44xx_hsi_slaves,
@@ -2331,6 +2343,7 @@ static struct omap_hwmod omap44xx_i2c1_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_I2C1_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_I2C1_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_i2c1_slaves,
@@ -2386,6 +2399,7 @@ static struct omap_hwmod omap44xx_i2c2_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_I2C2_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_I2C2_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_i2c2_slaves,
@@ -2441,6 +2455,7 @@ static struct omap_hwmod omap44xx_i2c3_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_I2C3_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_I2C3_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_i2c3_slaves,
@@ -2496,6 +2511,7 @@ static struct omap_hwmod omap44xx_i2c4_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_I2C4_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_I2C4_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_i2c4_slaves,
@@ -2593,6 +2609,7 @@ static struct omap_hwmod omap44xx_ipu_hwmod = { .clkctrl_offs = OMAP4_CM_DUCATI_DUCATI_CLKCTRL_OFFSET, .rstctrl_offs = OMAP4_RM_DUCATI_RSTCTRL_OFFSET, .context_offs = OMAP4_RM_DUCATI_DUCATI_CONTEXT_OFFSET, + .modulemode = MODULEMODE_HWCTRL, }, }, .slaves = omap44xx_ipu_slaves,
@@ -2680,6 +2697,7 @@ static struct omap_hwmod omap44xx_iss_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_CAM_ISS_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_CAM_ISS_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .opt_clks = iss_opt_clks,
@@ -2795,6 +2813,7 @@ static struct omap_hwmod omap44xx_iva_hwmod = { .clkctrl_offs = OMAP4_CM_IVAHD_IVAHD_CLKCTRL_OFFSET, .rstctrl_offs = OMAP4_RM_IVAHD_RSTCTRL_OFFSET, .context_offs = OMAP4_RM_IVAHD_IVAHD_CONTEXT_OFFSET, + .modulemode = MODULEMODE_HWCTRL, }, }, .slaves = omap44xx_iva_slaves,
@@ -2866,6 +2885,7 @@ static struct omap_hwmod omap44xx_kbd_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_WKUP_KEYBOARD_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_WKUP_KEYBOARD_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_kbd_slaves,
@@ -3026,6 +3046,7 @@ static struct omap_hwmod omap44xx_mcbsp1_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM1_ABE_MCBSP1_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_ABE_MCBSP1_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_mcbsp1_slaves,
@@ -3101,6 +3122,7 @@ static struct omap_hwmod omap44xx_mcbsp2_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM1_ABE_MCBSP2_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_ABE_MCBSP2_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_mcbsp2_slaves,
@@ -3176,6 +3198,7 @@ static struct omap_hwmod omap44xx_mcbsp3_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM1_ABE_MCBSP3_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_ABE_MCBSP3_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_mcbsp3_slaves,
@@ -3230,6 +3253,7 @@ static struct omap_hwmod omap44xx_mcbsp4_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_MCBSP4_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_MCBSP4_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_mcbsp4_slaves,
@@ -3324,6 +3348,7 @@ static struct omap_hwmod omap44xx_mcpdm_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM1_ABE_PDM_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_ABE_PDM_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_mcpdm_slaves,
@@ -3411,6 +3436,7 @@ static struct omap_hwmod omap44xx_mcspi1_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_MCSPI1_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_MCSPI1_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .dev_attr = &mcspi1_dev_attr,
@@ -3473,6 +3499,7 @@ static struct omap_hwmod omap44xx_mcspi2_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_MCSPI2_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_MCSPI2_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .dev_attr = &mcspi2_dev_attr,
@@ -3535,6 +3562,7 @@ static struct omap_hwmod omap44xx_mcspi3_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_MCSPI3_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_MCSPI3_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .dev_attr = &mcspi3_dev_attr,
@@ -3595,6 +3623,7 @@ static struct omap_hwmod omap44xx_mcspi4_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_MCSPI4_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_MCSPI4_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .dev_attr = &mcspi4_dev_attr,
@@ -3681,6 +3710,7 @@ static struct omap_hwmod omap44xx_mmc1_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L3INIT_MMC1_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L3INIT_MMC1_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .dev_attr = &mmc1_dev_attr,
@@ -3742,6 +3772,7 @@ static struct omap_hwmod omap44xx_mmc2_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L3INIT_MMC2_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L3INIT_MMC2_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_mmc2_slaves,
@@ -3798,6 +3829,7 @@ static struct omap_hwmod omap44xx_mmc3_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_MMCSD3_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_MMCSD3_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_mmc3_slaves,
@@ -3852,6 +3884,7 @@ static struct omap_hwmod omap44xx_mmc4_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_MMCSD4_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_MMCSD4_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_mmc4_slaves,
@@ -3906,6 +3939,7 @@ static struct omap_hwmod omap44xx_mmc5_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_MMCSD5_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_MMCSD5_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_mmc5_slaves,
@@ -4022,6 +4056,7 @@ static struct omap_hwmod omap44xx_smartreflex_core_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_ALWON_SR_CORE_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_ALWON_SR_CORE_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_smartreflex_core_slaves,
@@ -4070,6 +4105,7 @@ static struct omap_hwmod omap44xx_smartreflex_iva_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_ALWON_SR_IVA_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_ALWON_SR_IVA_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_smartreflex_iva_slaves,
@@ -4118,6 +4154,7 @@ static struct omap_hwmod omap44xx_smartreflex_mpu_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_ALWON_SR_MPU_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_ALWON_SR_MPU_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_smartreflex_mpu_slaves,
@@ -4266,6 +4303,7 @@ static struct omap_hwmod omap44xx_timer1_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_WKUP_TIMER1_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_WKUP_TIMER1_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_timer1_slaves,
@@ -4313,6 +4351,7 @@ static struct omap_hwmod omap44xx_timer2_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER2_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_DMTIMER2_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_timer2_slaves,
@@ -4360,6 +4399,7 @@ static struct omap_hwmod omap44xx_timer3_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER3_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_DMTIMER3_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_timer3_slaves,
@@ -4407,6 +4447,7 @@ static struct omap_hwmod omap44xx_timer4_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER4_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_DMTIMER4_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_timer4_slaves,
@@ -4473,6 +4514,7 @@ static struct omap_hwmod omap44xx_timer5_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM1_ABE_TIMER5_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_ABE_TIMER5_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_timer5_slaves,
@@ -4539,6 +4581,7 @@ static struct omap_hwmod omap44xx_timer6_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM1_ABE_TIMER6_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_ABE_TIMER6_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_timer6_slaves,
@@ -4605,6 +4648,7 @@ static struct omap_hwmod omap44xx_timer7_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM1_ABE_TIMER7_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_ABE_TIMER7_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_timer7_slaves,
@@ -4671,6 +4715,7 @@ static struct omap_hwmod omap44xx_timer8_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM1_ABE_TIMER8_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_ABE_TIMER8_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_timer8_slaves,
@@ -4718,6 +4763,7 @@ static struct omap_hwmod omap44xx_timer9_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER9_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_DMTIMER9_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_timer9_slaves,
@@ -4765,6 +4811,7 @@ static struct omap_hwmod omap44xx_timer10_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER10_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_DMTIMER10_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_timer10_slaves,
@@ -4812,6 +4859,7 @@ static struct omap_hwmod omap44xx_timer11_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER11_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_DMTIMER11_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_timer11_slaves,
@@ -4888,6 +4936,7 @@ static struct omap_hwmod omap44xx_uart1_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_UART1_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_UART1_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_uart1_slaves,
@@ -4942,6 +4991,7 @@ static struct omap_hwmod omap44xx_uart2_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_UART2_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_UART2_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_uart2_slaves,
@@ -4997,6 +5047,7 @@ static struct omap_hwmod omap44xx_uart3_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_UART3_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_UART3_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_uart3_slaves,
@@ -5051,6 +5102,7 @@ static struct omap_hwmod omap44xx_uart4_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L4PER_UART4_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L4PER_UART4_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_uart4_slaves,
@@ -5131,6 +5183,7 @@ static struct omap_hwmod omap44xx_usb_otg_hs_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_L3INIT_USB_OTG_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_L3INIT_USB_OTG_CONTEXT_OFFSET, + .modulemode = MODULEMODE_HWCTRL, }, }, .opt_clks = usb_otg_hs_opt_clks,
@@ -5205,6 +5258,7 @@ static struct omap_hwmod omap44xx_wd_timer2_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM_WKUP_WDT2_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_WKUP_WDT2_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_wd_timer2_slaves,
@@ -5271,6 +5325,7 @@ static struct omap_hwmod omap44xx_wd_timer3_hwmod = { .omap4 = { .clkctrl_offs = OMAP4_CM1_ABE_WDT3_CLKCTRL_OFFSET, .context_offs = OMAP4_RM_ABE_WDT3_CONTEXT_OFFSET, + .modulemode = MODULEMODE_SWCTRL, }, }, .slaves = omap44xx_wd_timer3_slaves,
arch/arm/plat-omap/include/plat/omap_hwmod.h +6 -0
@@ -80,6 +80,11 @@ extern struct omap_hwmod_sysc_fields omap_hwmod_sysc_type2;#define HWMOD_IDLEMODE_SMART (1 << 2)#define HWMOD_IDLEMODE_SMART_WKUP (1 << 3) +/* modulemode control type (SW or HW) */ +#define MODULEMODE_HWCTRL 1 +#define MODULEMODE_SWCTRL 2 + +/** * struct omap_hwmod_mux_info - hwmod specific mux configuration * @pads: array of omap_device_pad entries
@@ -367,6 +372,7 @@ struct omap_hwmod_omap4_prcm {u16 rstctrl_offs;u16 context_offs;u8 submodule_wkdep_bit; +u8 modulemode; };
Signature · 1 line
1.7.0.4
PATCH v3 12/13 OMAP4: cm: Add two new APIs for modulemode control
In reply to Benoit CoussonIn OMAP4, a new programming model based on module control instead of clock control was introduced.
Expose two APIs to allow the upper layer (omap_hwmod) to control the module mode independently of the parent clocks management.
--- arch/arm/mach-omap2/cminst44xx.c | 38 ++++++++++++++++++++++++++++++++++++++ arch/arm/mach-omap2/cminst44xx.h | 3 +++ 2 files changed, 41 insertions(+), 0 deletions(-)
arch/arm/mach-omap2/cminst44xx.c +38 -0
@@ -269,3 +269,41 @@ int omap4_cm_wait_module_idle(u8 part, u16 inst, s16 cdoffs, u16 clkctrl_offs)return (i <MAX_MODULE_READY_TIME ) ?0 : -EBUSY ; } + +/** +* omap4_cm_module_enable - Enable the modulemode inside CLKCTRL +* @mode: Module mode (SW or HW) +* @part: PRCM partition ID that the CM_CLKCTRL register exists in +* @inst: CM instance register offset (*_INST macro) +* @cdoffs: Clockdomain register offset (*_CDOFFS macro) +* @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro) +* No return value. +*/ +void omap4_cm_module_enable (u8 mode,u8 part,u16 inst,s16 cdoffs, +u16 clkctrl_offs) +{ +u32 v; + + v =omap4_cminst_read_inst_reg (part, inst, clkctrl_offs); + v &= ~OMAP4430_MODULEMODE_MASK ; + v |= mode <<OMAP4430_MODULEMODE_SHIFT ; +omap4_cminst_write_inst_reg (v, part, inst, clkctrl_offs); +} + +/** +* omap4_cm_module_disable - Disable the module inside CLKCTRL +* @part: PRCM partition ID that the CM_CLKCTRL register exists in +* @inst: CM instance register offset (*_INST macro) +* @cdoffs: Clockdomain register offset (*_CDOFFS macro) +* @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro) +* No return value. +*/ +void omap4_cm_module_disable (u8 part,u16 inst,s16 cdoffs, +u16 clkctrl_offs) +{ +u32 v; + + v =omap4_cminst_read_inst_reg (part, inst, clkctrl_offs); + v &= ~OMAP4430_MODULEMODE_MASK ; +omap4_cminst_write_inst_reg (v, part, inst, clkctrl_offs); +}
arch/arm/mach-omap2/cminst44xx.h +3 -0
@@ -20,6 +20,9 @@ extern void omap4_cminst_clkdm_force_wakeup(u8 part, s16 inst, u16 cdoffs);extern int omap4_cm_wait_module_ready (u8 part,u16 inst,s16 cdoffs,u16 clkctrl_offs);extern int omap4_cm_wait_module_idle (u8 part,u16 inst,s16 cdoffs,u16 clkctrl_offs); +extern void omap4_cm_module_enable (u8 mode,u8 part,u16 inst,s16 cdoffs,u16 clkctrl_offs); +extern void omap4_cm_module_disable (u8 part,u16 inst,s16 cdoffs,u16 clkctrl_offs); +/* * In an ideal world, we would not export these low-level functions, * but this will probably take some time to fix properly
Signature · 1 line
1.7.0.4
Paul Walmsley
maintainerPATCH v3 12/13 OMAP4: cm: Add two new APIs for modulemode control
Quoted 8 lines · Benoit Cousson
In OMAP4, a new programming model based on module control instead of clock control was introduced.
Expose two APIs to allow the upper layer (omap_hwmod) to control the module mode independently of the parent clocks management.Signed-off-by Benoit Cousson <[email protected]>Cc Paul Walmsley <[email protected]>Cc Rajendra Nayak <[email protected]>
This patch was updated to use '_cminst_' in function names that are part of the cminst44xx.c file, rather than '_cm_', to preserve consistency with the rest of the file. Updated patch below.
- Paul
From: Benoit Cousson <[email protected]>
Date: Fri, 1 Jul 2011 23:09:17 +0200
Subject: [PATCH] OMAP4: cm: Add two new APIs for modulemode control
In OMAP4, a new programming model based on module control instead of clock control was introduced.
Expose two APIs to allow the upper layer (omap_hwmod) to control the module mode independently of the parent clocks management.
[paul at pwsan.com: renamed 'omap4_cm_' fns to 'omap4_cminst_'; cleaned up
kerneldoc]
--- arch/arm/mach-omap2/cminst44xx.c | 40 ++++++++++++++++++++++++++++++++++++++ arch/arm/mach-omap2/cminst44xx.h | 5 ++++ 2 files changed, 45 insertions(+), 0 deletions(-)
arch/arm/mach-omap2/cminst44xx.c +40 -0
@@ -271,3 +271,43 @@ int omap4_cminst_wait_module_idle(u8 part, u16 inst, s16 cdoffs, u16 clkctrl_offreturn (i <MAX_MODULE_READY_TIME ) ?0 : -EBUSY ; } + +/** +* omap4_cminst_module_enable - Enable the modulemode inside CLKCTRL +* @mode: Module mode (SW or HW) +* @part: PRCM partition ID that the CM_CLKCTRL register exists in +* @inst: CM instance register offset (*_INST macro) +* @cdoffs: Clockdomain register offset (*_CDOFFS macro) +* @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro) +* +* No return value. +*/ +void omap4_cminst_module_enable (u8 mode,u8 part,u16 inst,s16 cdoffs, +u16 clkctrl_offs) +{ +u32 v; + + v =omap4_cminst_read_inst_reg (part, inst, clkctrl_offs); + v &= ~OMAP4430_MODULEMODE_MASK ; + v |= mode <<OMAP4430_MODULEMODE_SHIFT ; +omap4_cminst_write_inst_reg (v, part, inst, clkctrl_offs); +} + +/** +* omap4_cminst_module_disable - Disable the module inside CLKCTRL +* @part: PRCM partition ID that the CM_CLKCTRL register exists in +* @inst: CM instance register offset (*_INST macro) +* @cdoffs: Clockdomain register offset (*_CDOFFS macro) +* @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro) +* +* No return value. +*/ +void omap4_cminst_module_disable (u8 part,u16 inst,s16 cdoffs, +u16 clkctrl_offs) +{ +u32 v; + + v =omap4_cminst_read_inst_reg (part, inst, clkctrl_offs); + v &= ~OMAP4430_MODULEMODE_MASK ; +omap4_cminst_write_inst_reg (v, part, inst, clkctrl_offs); +}
arch/arm/mach-omap2/cminst44xx.h +5 -0
@@ -20,6 +20,11 @@ extern void omap4_cminst_clkdm_force_wakeup(u8 part, s16 inst, u16 cdoffs);extern int omap4_cminst_wait_module_ready (u8 part,u16 inst,s16 cdoffs,u16 clkctrl_offs);extern int omap4_cminst_wait_module_idle (u8 part,u16 inst,s16 cdoffs,u16 clkctrl_offs); +extern void omap4_cminst_module_enable (u8 mode,u8 part,u16 inst,s16 cdoffs, +u16 clkctrl_offs); +extern void omap4_cminst_module_disable (u8 part,u16 inst,s16 cdoffs, +u16 clkctrl_offs); +/* * In an ideal world, we would not export these low-level functions, * but this will probably take some time to fix properly
Signature · 1 line
1.7.5.4
PATCH v3 13/13 OMAP4: hwmod: Introduce the module control in hwmod control
In reply to Benoit CoussonTake advantage of the explicit modulemode control to fix the way parents clocks are managed.
A module must be disabled before any parents are disabled. That programming model was not possible with the previous implementation that was considering a modulemode as a leaf clock node managed by the clock fmwk.
This was leading to bad crash upon disable when the parent clock was gated before the module completed its transition to idle.
--- arch/arm/mach-omap2/omap_hwmod.c | 63 ++++++++++++++++++++++++++++++++++++- 1 files changed, 61 insertions(+), 2 deletions(-)
arch/arm/mach-omap2/omap_hwmod.c +61 -2
@@ -675,6 +675,56 @@ static void _disable_optional_clocks(struct omap_hwmod *oh) }/** +* _enable_module - enable CLKCTRL modulemode on OMAP4 +* @oh: struct omap_hwmod * +* +* Enables the PRCM module mode related to the hwmod @oh. +* No return value. +*/ +static void _enable_module (struct omap_hwmod *oh) +{ +/* The module mode does not exist prior OMAP4 */ +if (cpu_is_omap24xx () ||cpu_is_omap34xx ()) +return ; + +if (!oh->clkdm || !oh->prcm.omap4.modulemode) +return ; + +pr_debug ("omap_hwmod: %s: _enable_module: %d\n" , + oh->name, oh->prcm.omap4.modulemode); + +omap4_cm_module_enable (oh->prcm.omap4.modulemode, + oh->clkdm->prcm_partition, + oh->clkdm->cm_inst, + oh->clkdm->clkdm_offs, + oh->prcm.omap4.clkctrl_offs); +} + +/** +* _disable_module - enable CLKCTRL modulemode on OMAP4 +* @oh: struct omap_hwmod * +* +* Disable the PRCM module mode related to the hwmod @oh. +* No return value. +*/ +static void _disable_module (struct omap_hwmod *oh) +{ +/* The module mode does not exist prior OMAP4 */ +if (cpu_is_omap24xx () ||cpu_is_omap34xx ()) +return ; + +if (!oh->clkdm || !oh->prcm.omap4.modulemode) +return ; + +pr_debug ("omap_hwmod: %s: _disable_module\n" , oh->name); + +omap4_cm_module_disable (oh->clkdm->prcm_partition, + oh->clkdm->cm_inst, + oh->clkdm->clkdm_offs, + oh->prcm.omap4.clkctrl_offs); +} + +/** * _find_mpu_port_index - find hwmod OCP slave port ID intended for MPU use * @oh: struct omap_hwmod * *
@@ -1331,6 +1381,7 @@ static int _enable(struct omap_hwmod *oh)_add_initiator_dep (oh, mpu_oh);_enable_clocks (oh); +_enable_module (oh);/* * If an IP contains only one HW reset line, then de-assert it in order
@@ -1385,11 +1436,18 @@ static int _idle(struct omap_hwmod *oh)if (oh->class->sysc)_idle_sysc (oh);_del_initiator_dep (oh, mpu_oh); -_disable_clocks (oh); +_disable_module (oh); ret =_wait_target_disable (oh);if (ret)pr_debug ("omap_hwmod: %s: _wait_target_disable failed\n" , oh->name); +/* +* The module must be in idle mode before disabling any parents +* clocks. Otherwise, the parent clock might be disabled before +* the module transition is done, and thus will prevent the +* transition to complete properly. +*/ +_disable_clocks (oh);/* Mux pins for device idle if populated */ if (oh->mux && oh->mux->pads_dynamic)
@@ -1481,11 +1539,12 @@ static int _shutdown(struct omap_hwmod *oh)if (oh->_state == _HWMOD_STATE_ENABLED) {_del_initiator_dep (oh, mpu_oh);/* XXX what about the other system initiators here? dma, dsp */ -_disable_clocks (oh); +_disable_module (oh); ret =_wait_target_disable (oh);if (ret)pr_debug ("omap_hwmod: %s: _wait_target_disable failed\n" , oh->name); +_disable_clocks (oh); }/* XXX Should this code also force-disable the optional clocks? */
Signature · 1 line
1.7.0.4
Paul Walmsley
maintainerv3 cover OMAP4: Add modulemode support to hwmod framework
In reply to Benoit CoussonQuoted 13 lines · Benoit Cousson
Here is the series that finally add the management of the modulemode directly from hwmod fmwk instead of using a fake clock node to represent the IP.
This v2 update is fixing a couple of regressions I introduced in the first release.
A second series will clean most of the remaining data from the clock data file. Before that I have to rebase Rajendra's series to control the clockdomain from the hwmod framework, otherwise the modules will not be enabled properly since their clockdomain will not be changed to
SW_SUPduring enable.
Quoted 3 lines
The series is based on for_3.1/3_hwmod_fixes and tested
on OMAP4430 ES2.1 + SDP. It should not affect OMAP2 & 3, but some testing are definitively needed.
Okay. So I've changed this series to be based on v3.0-rc6, so it can be considered independently of cleanups, as is my understanding of what Tony wants. As mentioned before, I've also dropped some code that breaks on OMAP2/3. Some of Todd's comments have been addressed. Also, functions in cminst*.c now have 'cminst' in their name, to conform to the rest of the functions in those files. Not sure how I missed that the first time.
The updated series has been queued for 3.1 atgit://git.pwsan.com/linux-2.6 in the 'omap4_hwmod_modulemode_a_3.1' branch.
- Paul