aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/plat-omap
diff options
context:
space:
mode:
authorPaul Walmsley <paul@pwsan.com>2012-04-19 06:04:30 -0400
committerPaul Walmsley <paul@pwsan.com>2012-04-19 06:04:30 -0400
commit2221b5cddc2ebcfa4b0217266d2edc98e7eec93b (patch)
tree41ab66741f2851614762657b3c02a0c5da1dbf71 /arch/arm/plat-omap
parent24dbc2130179ebd493a241f6f5972cf6524b933a (diff)
ARM: OMAP2+: hwmod: add support for link registration
Add support for direct IP block interconnect ("link") registration to the hwmod code via a new function, omap_hwmod_register_links(). This will replace direct registration of hwmods, and a subsequent patch will remove omap_hwmod_register(). This change will allow a subsequent patch to remove the hwmod data link arrays. This will reduce the size of the hwmod static data and also make it easier to generate the data files. It will also make it possible to share some of the struct omap_hwmod records across multiple SoCs, since the link array pointers will be removed from the struct omap_hwmod. The downside is that boot time will increase. Minimizing boot time was the reason why the link arrays were originally introduced. Removing them will require extra computation during boot to allocate memory and associate IP blocks with their interconnects. However, since the current kernel development focus is on reducing the number of lines in arch/arm/mach-omap2/, boot time impact is now seemingly considered a lower priority. This patch contains additional complexity to reduce the number of memory allocations required for this change. This reduces the boot time impact: total hwmod link registration time was ~ 2655 microseconds with a simple allocation strategy, but is now ~ 549 microseconds[1] with the approach taken by this patch. 1. Measured on a BeagleBoard 35xx @ 500MHz MPU/333 MHz CORE, average of 7 samples. Total uncertainty is +/- 61 microseconds. Signed-off-by: Paul Walmsley <paul@pwsan.com> Cc: BenoƮt Cousson <b-cousson@ti.com>
Diffstat (limited to 'arch/arm/plat-omap')
-rw-r--r--arch/arm/plat-omap/include/plat/omap_hwmod.h24
1 files changed, 24 insertions, 0 deletions
diff --git a/arch/arm/plat-omap/include/plat/omap_hwmod.h b/arch/arm/plat-omap/include/plat/omap_hwmod.h
index 65285317f80b..09679032603c 100644
--- a/arch/arm/plat-omap/include/plat/omap_hwmod.h
+++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h
@@ -219,6 +219,10 @@ struct omap_hwmod_addr_space {
219#define OCPIF_SWSUP_IDLE (1 << 0) 219#define OCPIF_SWSUP_IDLE (1 << 0)
220#define OCPIF_CAN_BURST (1 << 1) 220#define OCPIF_CAN_BURST (1 << 1)
221 221
222/* omap_hwmod_ocp_if._int_flags possibilities */
223#define _OCPIF_INT_FLAGS_REGISTERED (1 << 0)
224
225
222/** 226/**
223 * struct omap_hwmod_ocp_if - OCP interface data 227 * struct omap_hwmod_ocp_if - OCP interface data
224 * @master: struct omap_hwmod that initiates OCP transactions on this link 228 * @master: struct omap_hwmod that initiates OCP transactions on this link
@@ -230,6 +234,7 @@ struct omap_hwmod_addr_space {
230 * @width: OCP data width 234 * @width: OCP data width
231 * @user: initiators using this interface (see OCP_USER_* macros above) 235 * @user: initiators using this interface (see OCP_USER_* macros above)
232 * @flags: OCP interface flags (see OCPIF_* macros above) 236 * @flags: OCP interface flags (see OCPIF_* macros above)
237 * @_int_flags: internal flags (see _OCPIF_INT_FLAGS* macros above)
233 * 238 *
234 * It may also be useful to add a tag_cnt field for OCP2.x devices. 239 * It may also be useful to add a tag_cnt field for OCP2.x devices.
235 * 240 *
@@ -248,6 +253,7 @@ struct omap_hwmod_ocp_if {
248 u8 width; 253 u8 width;
249 u8 user; 254 u8 user;
250 u8 flags; 255 u8 flags;
256 u8 _int_flags;
251}; 257};
252 258
253 259
@@ -477,6 +483,16 @@ struct omap_hwmod_class {
477}; 483};
478 484
479/** 485/**
486 * struct omap_hwmod_link - internal structure linking hwmods with ocp_ifs
487 * @ocp_if: OCP interface structure record pointer
488 * @node: list_head pointing to next struct omap_hwmod_link in a list
489 */
490struct omap_hwmod_link {
491 struct omap_hwmod_ocp_if *ocp_if;
492 struct list_head node;
493};
494
495/**
480 * struct omap_hwmod - integration data for OMAP hardware "modules" (IP blocks) 496 * struct omap_hwmod - integration data for OMAP hardware "modules" (IP blocks)
481 * @name: name of the hwmod 497 * @name: name of the hwmod
482 * @class: struct omap_hwmod_class * to the class of this hwmod 498 * @class: struct omap_hwmod_class * to the class of this hwmod
@@ -494,6 +510,7 @@ struct omap_hwmod_class {
494 * @_sysc_cache: internal-use hwmod flags 510 * @_sysc_cache: internal-use hwmod flags
495 * @_mpu_rt_va: cached register target start address (internal use) 511 * @_mpu_rt_va: cached register target start address (internal use)
496 * @_mpu_port_index: cached MPU register target slave ID (internal use) 512 * @_mpu_port_index: cached MPU register target slave ID (internal use)
513 * @_mpu_port: cached MPU register target slave (internal use)
497 * @opt_clks_cnt: number of @opt_clks 514 * @opt_clks_cnt: number of @opt_clks
498 * @master_cnt: number of @master entries 515 * @master_cnt: number of @master entries
499 * @slaves_cnt: number of @slave entries 516 * @slaves_cnt: number of @slave entries
@@ -512,6 +529,8 @@ struct omap_hwmod_class {
512 * 529 *
513 * Parameter names beginning with an underscore are managed internally by 530 * Parameter names beginning with an underscore are managed internally by
514 * the omap_hwmod code and should not be set during initialization. 531 * the omap_hwmod code and should not be set during initialization.
532 *
533 * @masters and @slaves are now deprecated.
515 */ 534 */
516struct omap_hwmod { 535struct omap_hwmod {
517 const char *name; 536 const char *name;
@@ -532,11 +551,14 @@ struct omap_hwmod {
532 struct clockdomain *clkdm; 551 struct clockdomain *clkdm;
533 struct omap_hwmod_ocp_if **masters; /* connect to *_IA */ 552 struct omap_hwmod_ocp_if **masters; /* connect to *_IA */
534 struct omap_hwmod_ocp_if **slaves; /* connect to *_TA */ 553 struct omap_hwmod_ocp_if **slaves; /* connect to *_TA */
554 struct list_head master_ports; /* connect to *_IA */
555 struct list_head slave_ports; /* connect to *_TA */
535 void *dev_attr; 556 void *dev_attr;
536 u32 _sysc_cache; 557 u32 _sysc_cache;
537 void __iomem *_mpu_rt_va; 558 void __iomem *_mpu_rt_va;
538 spinlock_t _lock; 559 spinlock_t _lock;
539 struct list_head node; 560 struct list_head node;
561 struct omap_hwmod_ocp_if *_mpu_port;
540 u16 flags; 562 u16 flags;
541 u8 _mpu_port_index; 563 u8 _mpu_port_index;
542 u8 response_lat; 564 u8 response_lat;
@@ -622,4 +644,6 @@ extern int omap2430_hwmod_init(void);
622extern int omap3xxx_hwmod_init(void); 644extern int omap3xxx_hwmod_init(void);
623extern int omap44xx_hwmod_init(void); 645extern int omap44xx_hwmod_init(void);
624 646
647extern int __init omap_hwmod_register_links(struct omap_hwmod_ocp_if **ois);
648
625#endif 649#endif