| #ifndef __ASM_SH_HWBLK_H | 
 | #define __ASM_SH_HWBLK_H | 
 |  | 
 | #include <asm/clock.h> | 
 | #include <asm/io.h> | 
 |  | 
 | #define HWBLK_CNT_USAGE 0 | 
 | #define HWBLK_CNT_IDLE 1 | 
 | #define HWBLK_CNT_DEVICES 2 | 
 | #define HWBLK_CNT_NR 3 | 
 |  | 
 | #define HWBLK_AREA_FLAG_PARENT (1 << 0) /* valid parent */ | 
 |  | 
 | #define HWBLK_AREA(_flags, _parent)		\ | 
 | {						\ | 
 | 	.flags = _flags,			\ | 
 | 	.parent = _parent,			\ | 
 | } | 
 |  | 
 | struct hwblk_area { | 
 | 	int cnt[HWBLK_CNT_NR]; | 
 | 	unsigned char parent; | 
 | 	unsigned char flags; | 
 | }; | 
 |  | 
 | #define HWBLK(_mstp, _bit, _area)		\ | 
 | {						\ | 
 | 	.mstp = (void __iomem *)_mstp,		\ | 
 | 	.bit = _bit,				\ | 
 | 	.area = _area,				\ | 
 | } | 
 |  | 
 | struct hwblk { | 
 | 	void __iomem *mstp; | 
 | 	unsigned char bit; | 
 | 	unsigned char area; | 
 | 	int cnt[HWBLK_CNT_NR]; | 
 | }; | 
 |  | 
 | struct hwblk_info { | 
 | 	struct hwblk_area *areas; | 
 | 	int nr_areas; | 
 | 	struct hwblk *hwblks; | 
 | 	int nr_hwblks; | 
 | }; | 
 |  | 
 | /* Should be defined by processor-specific code */ | 
 | int arch_hwblk_init(void); | 
 | int arch_hwblk_sleep_mode(void); | 
 |  | 
 | int hwblk_register(struct hwblk_info *info); | 
 | int hwblk_init(void); | 
 |  | 
 | void hwblk_enable(struct hwblk_info *info, int hwblk); | 
 | void hwblk_disable(struct hwblk_info *info, int hwblk); | 
 |  | 
 | void hwblk_cnt_inc(struct hwblk_info *info, int hwblk, int cnt); | 
 | void hwblk_cnt_dec(struct hwblk_info *info, int hwblk, int cnt); | 
 |  | 
 | /* allow clocks to enable and disable hardware blocks */ | 
 | #define SH_HWBLK_CLK(_hwblk, _parent, _flags)	\ | 
 | [_hwblk] = {					\ | 
 | 	.parent		= _parent,		\ | 
 | 	.arch_flags	= _hwblk,		\ | 
 | 	.flags		= _flags,		\ | 
 | } | 
 |  | 
 | int sh_hwblk_clk_register(struct clk *clks, int nr); | 
 |  | 
 | #endif /* __ASM_SH_HWBLK_H */ |