|  | #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 */ |