97231e52a087862940726c513c9ac2d46c41112e
[coreboot.git] / src / mainboard / thomson / ip1000 / gpio.c
1 /*\r
2  * This file is part of the coreboot project.\r
3  *\r
4  * Copyright (C) 2008 Joseph Smith <joe@settoplinux.org>\r
5  *\r
6  * This program is free software; you can redistribute it and/or modify\r
7  * it under the terms of the GNU General Public License as published by\r
8  * the Free Software Foundation; either version 2 of the License, or\r
9  * (at your option) any later version.\r
10  *\r
11  * This program is distributed in the hope that it will be useful,\r
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14  * GNU General Public License for more details.\r
15  *\r
16  * You should have received a copy of the GNU General Public License\r
17  * along with this program; if not, write to the Free Software\r
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA\r
19  */\r
20 \r
21 #define PME_DEV                 PNP_DEV(0x2e, 0x0a)\r
22 #define PME_IO_BASE_ADDR        0x800      /* Runtime register base address */\r
23 #define ICH_IO_BASE_ADDR        0x00000500 /* GPIO base address register */\r
24 \r
25 /* Early mainboard specific GPIO setup. */\r
26 static void mb_gpio_init(void)\r
27 {\r
28         device_t dev;\r
29         uint16_t port;\r
30         uint32_t set_gpio;\r
31 \r
32         /* Southbridge GPIOs. */\r
33         /* Set the LPC device statically. */\r
34         dev = PCI_DEV(0x0, 0x1f, 0x0);\r
35 \r
36         /* Set the value for GPIO base address register and enable GPIO. */\r
37         pci_write_config32(dev, GPIO_BASE_ICH0_5, (ICH_IO_BASE_ADDR | 1));\r
38         pci_write_config8(dev, GPIO_CNTL_ICH0_5, 0x10);\r
39 \r
40         /* Set GPIO23 to high, this enables the LAN controller. */\r
41         udelay(10);\r
42         set_gpio = inl(ICH_IO_BASE_ADDR + 0x0c);\r
43         set_gpio |= 1 << 23;\r
44         outl(set_gpio, ICH_IO_BASE_ADDR + 0x0c);\r
45 \r
46         /* Super I/O GPIOs. */\r
47         dev = PME_DEV;\r
48         port = dev >> 8;\r
49 \r
50         /* Enter the configuration state. */\r
51         outb(0x55, port);\r
52         pnp_set_logical_device(dev);\r
53         pnp_set_enable(dev, 0);\r
54         pnp_set_iobase(dev, PNP_IDX_IO0, PME_IO_BASE_ADDR);\r
55         pnp_set_enable(dev, 1);\r
56 \r
57         /* GP21 - LED_RED */\r
58         outl(0x01, PME_IO_BASE_ADDR + 0x2c);\r
59 \r
60         /* GP30 - FAN2_TACH */\r
61         outl(0x05, PME_IO_BASE_ADDR + 0x33); \r
62 \r
63         /* GP31 - FAN1_TACH */\r
64         outl(0x05, PME_IO_BASE_ADDR + 0x34);\r
65 \r
66         /* GP32 - FAN2_CTRL */\r
67         outl(0x04, PME_IO_BASE_ADDR + 0x35); \r
68 \r
69         /* GP33 - FAN1_CTRL */\r
70         outl(0x04, PME_IO_BASE_ADDR + 0x36);\r
71 \r
72         /* GP34 - AUD_MUTE_OUT_R */\r
73         outl(0x00, PME_IO_BASE_ADDR + 0x37);\r
74 \r
75         /* GP36 - KBRST */\r
76         outl(0x00, PME_IO_BASE_ADDR + 0x39);\r
77 \r
78         /* GP37 - A20GATE */\r
79         outl(0x00, PME_IO_BASE_ADDR + 0x3a);\r
80 \r
81         /* GP42 - GPIO_PME_OUT */\r
82         outl(0x00, PME_IO_BASE_ADDR + 0x3d); \r
83 \r
84         /* GP50 - SER2_RI */\r
85         outl(0x05, PME_IO_BASE_ADDR + 0x3f);\r
86 \r
87         /* GP51 - SER2_DCD */\r
88         outl(0x05, PME_IO_BASE_ADDR + 0x40);\r
89 \r
90         /* GP52 - SER2_RX */\r
91         outl(0x05, PME_IO_BASE_ADDR + 0x41);\r
92 \r
93         /* GP53 - SER2_TX */\r
94         outl(0x04, PME_IO_BASE_ADDR + 0x42);\r
95 \r
96         /* GP55 - SER2_RTS */\r
97         outl(0x04, PME_IO_BASE_ADDR + 0x44);\r
98 \r
99         /* GP56 - SER2_CTS */\r
100         outl(0x05, PME_IO_BASE_ADDR + 0x45);\r
101 \r
102         /* GP57 - SER2_DTR */\r
103         outl(0x04, PME_IO_BASE_ADDR + 0x46);\r
104 \r
105         /* GP60 - LED_GREEN */\r
106         outl(0x01, PME_IO_BASE_ADDR + 0x47);\r
107 \r
108         /* GP61 - LED_YELLOW */\r
109         outl(0x01, PME_IO_BASE_ADDR + 0x48);\r
110 \r
111         /* GP3 */\r
112         outl(0xc0, PME_IO_BASE_ADDR + 0x4d);\r
113 \r
114         /* GP4 */\r
115         outl(0x04, PME_IO_BASE_ADDR + 0x4e);\r
116 \r
117         /* FAN1 */\r
118         outl(0x01, PME_IO_BASE_ADDR + 0x56);\r
119 \r
120         /* FAN2 */\r
121         outl(0x01, PME_IO_BASE_ADDR + 0x57);\r
122 \r
123         /* Fan Control */\r
124         outl(0x50, PME_IO_BASE_ADDR + 0x58);\r
125 \r
126         /* Fan1 Tachometer */\r
127         outl(0xff, PME_IO_BASE_ADDR + 0x59);\r
128 \r
129         /* Fan2 Tachometer */\r
130         outl(0xff, PME_IO_BASE_ADDR + 0x5a);\r
131 \r
132         /* LED1 */\r
133         outl(0x00, PME_IO_BASE_ADDR + 0x5d);\r
134 \r
135         /* LED2 */\r
136         outl(0x00, PME_IO_BASE_ADDR + 0x5e);\r
137 \r
138         /* Keyboard Scan Code */\r
139         outl(0x00, PME_IO_BASE_ADDR + 0x5f);\r
140 \r
141         /* Exit the configuration state. */\r
142         outb(0xaa, port);\r
143 }\r