| Magnus Damm | 79714ac | 2009-07-03 10:08:05 +0000 | [diff] [blame] | 1 | #ifndef __ASM_SH_HWBLK_H | 
|  | 2 | #define __ASM_SH_HWBLK_H | 
|  | 3 |  | 
|  | 4 | #include <asm/clock.h> | 
|  | 5 | #include <asm/io.h> | 
|  | 6 |  | 
| Magnus Damm | 0f8ee18 | 2009-07-17 14:24:55 +0000 | [diff] [blame] | 7 | #define HWBLK_CNT_USAGE 0 | 
| Magnus Damm | 6a93dde | 2009-08-14 10:48:16 +0000 | [diff] [blame] | 8 | #define HWBLK_CNT_IDLE 1 | 
|  | 9 | #define HWBLK_CNT_DEVICES 2 | 
|  | 10 | #define HWBLK_CNT_NR 3 | 
| Magnus Damm | 0f8ee18 | 2009-07-17 14:24:55 +0000 | [diff] [blame] | 11 |  | 
| Magnus Damm | 79714ac | 2009-07-03 10:08:05 +0000 | [diff] [blame] | 12 | #define HWBLK_AREA_FLAG_PARENT (1 << 0) /* valid parent */ | 
|  | 13 |  | 
|  | 14 | #define HWBLK_AREA(_flags, _parent)		\ | 
|  | 15 | {						\ | 
|  | 16 | .flags = _flags,			\ | 
|  | 17 | .parent = _parent,			\ | 
|  | 18 | } | 
|  | 19 |  | 
|  | 20 | struct hwblk_area { | 
| Magnus Damm | 0f8ee18 | 2009-07-17 14:24:55 +0000 | [diff] [blame] | 21 | int cnt[HWBLK_CNT_NR]; | 
| Magnus Damm | 79714ac | 2009-07-03 10:08:05 +0000 | [diff] [blame] | 22 | unsigned char parent; | 
|  | 23 | unsigned char flags; | 
|  | 24 | }; | 
|  | 25 |  | 
|  | 26 | #define HWBLK(_mstp, _bit, _area)		\ | 
|  | 27 | {						\ | 
|  | 28 | .mstp = (void __iomem *)_mstp,		\ | 
|  | 29 | .bit = _bit,				\ | 
|  | 30 | .area = _area,				\ | 
|  | 31 | } | 
|  | 32 |  | 
|  | 33 | struct hwblk { | 
|  | 34 | void __iomem *mstp; | 
|  | 35 | unsigned char bit; | 
|  | 36 | unsigned char area; | 
| Magnus Damm | 0f8ee18 | 2009-07-17 14:24:55 +0000 | [diff] [blame] | 37 | int cnt[HWBLK_CNT_NR]; | 
| Magnus Damm | 79714ac | 2009-07-03 10:08:05 +0000 | [diff] [blame] | 38 | }; | 
|  | 39 |  | 
|  | 40 | struct hwblk_info { | 
|  | 41 | struct hwblk_area *areas; | 
|  | 42 | int nr_areas; | 
|  | 43 | struct hwblk *hwblks; | 
|  | 44 | int nr_hwblks; | 
|  | 45 | }; | 
|  | 46 |  | 
|  | 47 | /* Should be defined by processor-specific code */ | 
|  | 48 | int arch_hwblk_init(void); | 
|  | 49 | int arch_hwblk_sleep_mode(void); | 
|  | 50 |  | 
|  | 51 | int hwblk_register(struct hwblk_info *info); | 
|  | 52 | int hwblk_init(void); | 
|  | 53 |  | 
| Magnus Damm | 0f8ee18 | 2009-07-17 14:24:55 +0000 | [diff] [blame] | 54 | void hwblk_enable(struct hwblk_info *info, int hwblk); | 
|  | 55 | void hwblk_disable(struct hwblk_info *info, int hwblk); | 
|  | 56 |  | 
|  | 57 | void hwblk_cnt_inc(struct hwblk_info *info, int hwblk, int cnt); | 
|  | 58 | void hwblk_cnt_dec(struct hwblk_info *info, int hwblk, int cnt); | 
|  | 59 |  | 
| Magnus Damm | 79714ac | 2009-07-03 10:08:05 +0000 | [diff] [blame] | 60 | /* allow clocks to enable and disable hardware blocks */ | 
|  | 61 | #define SH_HWBLK_CLK(_name, _id, _parent, _hwblk, _flags)	\ | 
|  | 62 | {							\ | 
|  | 63 | .name		= _name,			\ | 
|  | 64 | .id		= _id,				\ | 
|  | 65 | .parent		= _parent,			\ | 
|  | 66 | .arch_flags	= _hwblk,			\ | 
|  | 67 | .flags		= _flags,			\ | 
|  | 68 | } | 
|  | 69 |  | 
|  | 70 | int sh_hwblk_clk_register(struct clk *clks, int nr); | 
|  | 71 |  | 
|  | 72 | #endif /* __ASM_SH_HWBLK_H */ |