Linux-2.6.12-rc2
[safe/jmp/linux-2.6] / include / asm-arm / arch-sa1100 / h3600.h
1 /*
2  *
3  * Definitions for H3600 Handheld Computer
4  *
5  * Copyright 2000 Compaq Computer Corporation.
6  *
7  * Use consistent with the GNU GPL is permitted,
8  * provided that this copyright notice is
9  * preserved in its entirety in all copies and derived works.
10  *
11  * COMPAQ COMPUTER CORPORATION MAKES NO WARRANTIES, EXPRESSED OR IMPLIED,
12  * AS TO THE USEFULNESS OR CORRECTNESS OF THIS CODE OR ITS
13  * FITNESS FOR ANY PARTICULAR PURPOSE.
14  *
15  * Author: Jamey Hicks.
16  *
17  * History:
18  *
19  * 2001-10-??   Andrew Christian   Added support for iPAQ H3800
20  *
21  */
22
23 #ifndef _INCLUDE_H3600_H_
24 #define _INCLUDE_H3600_H_
25
26 /* generalized support for H3xxx series Compaq Pocket PC's */
27 #define machine_is_h3xxx() (machine_is_h3100() || machine_is_h3600() || machine_is_h3800())
28
29 /* Physical memory regions corresponding to chip selects */
30 #define H3600_EGPIO_PHYS     (SA1100_CS5_PHYS + 0x01000000)
31 #define H3600_BANK_2_PHYS    SA1100_CS2_PHYS
32 #define H3600_BANK_4_PHYS    SA1100_CS4_PHYS
33
34 /* Virtual memory regions corresponding to chip selects 2 & 4 (used on sleeves) */
35 #define H3600_EGPIO_VIRT     0xf0000000
36 #define H3600_BANK_2_VIRT    0xf1000000
37 #define H3600_BANK_4_VIRT    0xf3800000
38
39 /*
40    Machine-independent GPIO definitions
41    --- these are common across all current iPAQ platforms
42 */
43
44 #define GPIO_H3600_NPOWER_BUTTON        GPIO_GPIO (0)   /* Also known as the "off button"  */
45
46 #define GPIO_H3600_PCMCIA_CD1           GPIO_GPIO (10)
47 #define GPIO_H3600_PCMCIA_IRQ1          GPIO_GPIO (11)
48
49 /* UDA1341 L3 Interface */
50 #define GPIO_H3600_L3_DATA              GPIO_GPIO (14)
51 #define GPIO_H3600_L3_MODE              GPIO_GPIO (15)
52 #define GPIO_H3600_L3_CLOCK             GPIO_GPIO (16)
53
54 #define GPIO_H3600_PCMCIA_CD0           GPIO_GPIO (17)
55 #define GPIO_H3600_SYS_CLK              GPIO_GPIO (19)
56 #define GPIO_H3600_PCMCIA_IRQ0          GPIO_GPIO (21)
57
58 #define GPIO_H3600_COM_DCD              GPIO_GPIO (23)
59 #define GPIO_H3600_OPT_IRQ              GPIO_GPIO (24)
60 #define GPIO_H3600_COM_CTS              GPIO_GPIO (25)
61 #define GPIO_H3600_COM_RTS              GPIO_GPIO (26)
62
63 #define IRQ_GPIO_H3600_NPOWER_BUTTON    IRQ_GPIO0
64 #define IRQ_GPIO_H3600_PCMCIA_CD1       IRQ_GPIO10
65 #define IRQ_GPIO_H3600_PCMCIA_IRQ1      IRQ_GPIO11
66 #define IRQ_GPIO_H3600_PCMCIA_CD0       IRQ_GPIO17
67 #define IRQ_GPIO_H3600_PCMCIA_IRQ0      IRQ_GPIO21
68 #define IRQ_GPIO_H3600_COM_DCD          IRQ_GPIO23
69 #define IRQ_GPIO_H3600_OPT_IRQ          IRQ_GPIO24
70 #define IRQ_GPIO_H3600_COM_CTS          IRQ_GPIO25
71
72
73 #ifndef __ASSEMBLY__
74
75 enum ipaq_egpio_type {
76         IPAQ_EGPIO_LCD_POWER,     /* Power to the LCD panel */
77         IPAQ_EGPIO_CODEC_NRESET,  /* Clear to reset the audio codec (remember to return high) */
78         IPAQ_EGPIO_AUDIO_ON,      /* Audio power */
79         IPAQ_EGPIO_QMUTE,         /* Audio muting */
80         IPAQ_EGPIO_OPT_NVRAM_ON,  /* Non-volatile RAM on extension sleeves (SPI interface) */
81         IPAQ_EGPIO_OPT_ON,        /* Power to extension sleeves */
82         IPAQ_EGPIO_CARD_RESET,    /* Reset PCMCIA cards on extension sleeve (???) */
83         IPAQ_EGPIO_OPT_RESET,     /* Reset option pack (???) */
84         IPAQ_EGPIO_IR_ON,         /* IR sensor/emitter power */
85         IPAQ_EGPIO_IR_FSEL,       /* IR speed selection 1->fast, 0->slow */
86         IPAQ_EGPIO_RS232_ON,      /* Maxim RS232 chip power */
87         IPAQ_EGPIO_VPP_ON,        /* Turn on power to flash programming */
88         IPAQ_EGPIO_LCD_ENABLE,    /* Enable/disable LCD controller */
89 };
90
91 struct ipaq_model_ops {
92         const char     *generic_name;
93         void          (*control)(enum ipaq_egpio_type, int);
94         unsigned long (*read)(void);
95         void          (*blank_callback)(int blank);
96         int           (*pm_callback)(int req);      /* Primary model callback */
97         int           (*pm_callback_aux)(int req);  /* Secondary callback (used by HAL modules) */
98 };
99
100 extern struct ipaq_model_ops ipaq_model_ops;
101
102 static __inline__ const char * h3600_generic_name(void)
103 {
104         return ipaq_model_ops.generic_name;
105 }
106
107 static __inline__ void assign_h3600_egpio(enum ipaq_egpio_type x, int level)
108 {
109         if (ipaq_model_ops.control)
110                 ipaq_model_ops.control(x,level);
111 }
112
113 static __inline__ void clr_h3600_egpio(enum ipaq_egpio_type x)
114 {
115         if (ipaq_model_ops.control)
116                 ipaq_model_ops.control(x,0);
117 }
118
119 static __inline__ void set_h3600_egpio(enum ipaq_egpio_type x)
120 {
121         if (ipaq_model_ops.control)
122                 ipaq_model_ops.control(x,1);
123 }
124
125 static __inline__ unsigned long read_h3600_egpio(void)
126 {
127         if (ipaq_model_ops.read)
128                 return ipaq_model_ops.read();
129         return 0;
130 }
131
132 static __inline__ int  h3600_register_blank_callback(void (*f)(int))
133 {
134         ipaq_model_ops.blank_callback = f;
135         return 0;
136 }
137
138 static __inline__ void h3600_unregister_blank_callback(void (*f)(int))
139 {
140         ipaq_model_ops.blank_callback = NULL;
141 }
142
143
144 static __inline__ int  h3600_register_pm_callback(int (*f)(int))
145 {
146         ipaq_model_ops.pm_callback_aux = f;
147         return 0;
148 }
149
150 static __inline__ void h3600_unregister_pm_callback(int (*f)(int))
151 {
152         ipaq_model_ops.pm_callback_aux = NULL;
153 }
154
155 static __inline__ int h3600_power_management(int req)
156 {
157         if (ipaq_model_ops.pm_callback)
158                 return ipaq_model_ops.pm_callback(req);
159         return 0;
160 }
161
162 #endif /* ASSEMBLY */
163
164 #endif /* _INCLUDE_H3600_H_ */