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
75enum 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
91struct 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
100extern struct ipaq_model_ops ipaq_model_ops;
101
102static __inline__ const char * h3600_generic_name(void)
103{
104	return ipaq_model_ops.generic_name;
105}
106
107static __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
113static __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
119static __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
125static __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
132static __inline__ int  h3600_register_blank_callback(void (*f)(int))
133{
134	ipaq_model_ops.blank_callback = f;
135	return 0;
136}
137
138static __inline__ void h3600_unregister_blank_callback(void (*f)(int))
139{
140	ipaq_model_ops.blank_callback = NULL;
141}
142
143
144static __inline__ int  h3600_register_pm_callback(int (*f)(int))
145{
146	ipaq_model_ops.pm_callback_aux = f;
147	return 0;
148}
149
150static __inline__ void h3600_unregister_pm_callback(int (*f)(int))
151{
152	ipaq_model_ops.pm_callback_aux = NULL;
153}
154
155static __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_ */
165