]> git.karo-electronics.de Git - karo-tx-uboot.git/blob - board/google/chromebook_link/link.c
9978e92006d92068ae2b0ce0a8aa6b25fbd91415
[karo-tx-uboot.git] / board / google / chromebook_link / link.c
1 /*
2  * Copyright (C) 2014 Google, Inc
3  *
4  * SPDX-License-Identifier:     GPL-2.0+
5  */
6
7 #include <common.h>
8 #include <cros_ec.h>
9 #include <asm/gpio.h>
10 #include <asm/io.h>
11 #include <asm/pci.h>
12 #include <asm/arch/pch.h>
13
14 int arch_early_init_r(void)
15 {
16         if (cros_ec_board_init())
17                 return -1;
18
19         return 0;
20 }
21
22 static const struct pch_gpio_set1 pch_gpio_set1_mode = {
23         .gpio0 = GPIO_MODE_GPIO,  /* NMI_DBG# */
24         .gpio3 = GPIO_MODE_GPIO,  /* ALS_INT# */
25         .gpio5 = GPIO_MODE_GPIO,  /* SIM_DET */
26         .gpio7 = GPIO_MODE_GPIO,  /* EC_SCI# */
27         .gpio8 = GPIO_MODE_GPIO,  /* EC_SMI# */
28         .gpio9 = GPIO_MODE_GPIO,  /* RECOVERY# */
29         .gpio10 = GPIO_MODE_GPIO, /* SPD vector D3 */
30         .gpio11 = GPIO_MODE_GPIO, /* smbalert#, let's keep it initialized */
31         .gpio12 = GPIO_MODE_GPIO, /* TP_INT# */
32         .gpio14 = GPIO_MODE_GPIO, /* Touch_INT_L */
33         .gpio15 = GPIO_MODE_GPIO, /* EC_LID_OUT# (EC_WAKE#) */
34         .gpio21 = GPIO_MODE_GPIO, /* EC_IN_RW */
35         .gpio24 = GPIO_MODE_GPIO, /* DDR3L_EN */
36         .gpio28 = GPIO_MODE_GPIO, /* SLP_ME_CSW_DEV# */
37 };
38
39 static const struct pch_gpio_set1 pch_gpio_set1_direction = {
40         .gpio0 = GPIO_DIR_INPUT,
41         .gpio3 = GPIO_DIR_INPUT,
42         .gpio5 = GPIO_DIR_INPUT,
43         .gpio7 = GPIO_DIR_INPUT,
44         .gpio8 = GPIO_DIR_INPUT,
45         .gpio9 = GPIO_DIR_INPUT,
46         .gpio10 = GPIO_DIR_INPUT,
47         .gpio11 = GPIO_DIR_INPUT,
48         .gpio12 = GPIO_DIR_INPUT,
49         .gpio14 = GPIO_DIR_INPUT,
50         .gpio15 = GPIO_DIR_INPUT,
51         .gpio21 = GPIO_DIR_INPUT,
52         .gpio24 = GPIO_DIR_OUTPUT,
53         .gpio28 = GPIO_DIR_INPUT,
54 };
55
56 static const struct pch_gpio_set1 pch_gpio_set1_level = {
57         .gpio1 = GPIO_LEVEL_HIGH,
58         .gpio6 = GPIO_LEVEL_HIGH,
59         .gpio24 = GPIO_LEVEL_LOW,
60 };
61
62 static const struct pch_gpio_set1 pch_gpio_set1_invert = {
63         .gpio7 = GPIO_INVERT,
64         .gpio8 = GPIO_INVERT,
65         .gpio12 = GPIO_INVERT,
66         .gpio14 = GPIO_INVERT,
67         .gpio15 = GPIO_INVERT,
68 };
69
70 static const struct pch_gpio_set2 pch_gpio_set2_mode = {
71         .gpio36 = GPIO_MODE_GPIO, /* W_DISABLE_L */
72         .gpio41 = GPIO_MODE_GPIO, /* SPD vector D0 */
73         .gpio42 = GPIO_MODE_GPIO, /* SPD vector D1 */
74         .gpio43 = GPIO_MODE_GPIO, /* SPD vector D2 */
75         .gpio57 = GPIO_MODE_GPIO, /* PCH_SPI_WP_D */
76         .gpio60 = GPIO_MODE_GPIO, /* DRAMRST_CNTRL_PCH */
77 };
78
79 static const struct pch_gpio_set2 pch_gpio_set2_direction = {
80         .gpio36 = GPIO_DIR_OUTPUT,
81         .gpio41 = GPIO_DIR_INPUT,
82         .gpio42 = GPIO_DIR_INPUT,
83         .gpio43 = GPIO_DIR_INPUT,
84         .gpio57 = GPIO_DIR_INPUT,
85         .gpio60 = GPIO_DIR_OUTPUT,
86 };
87
88 static const struct pch_gpio_set2 pch_gpio_set2_level = {
89         .gpio36 = GPIO_LEVEL_HIGH,
90         .gpio60 = GPIO_LEVEL_HIGH,
91 };
92
93 static const struct pch_gpio_set3 pch_gpio_set3_mode = {
94 };
95
96 static const struct pch_gpio_set3 pch_gpio_set3_direction = {
97 };
98
99 static const struct pch_gpio_set3 pch_gpio_set3_level = {
100 };
101
102 static const struct pch_gpio_map link_gpio_map = {
103         .set1 = {
104                 .mode      = &pch_gpio_set1_mode,
105                 .direction = &pch_gpio_set1_direction,
106                 .level     = &pch_gpio_set1_level,
107                 .invert    = &pch_gpio_set1_invert,
108         },
109         .set2 = {
110                 .mode      = &pch_gpio_set2_mode,
111                 .direction = &pch_gpio_set2_direction,
112                 .level     = &pch_gpio_set2_level,
113         },
114         .set3 = {
115                 .mode      = &pch_gpio_set3_mode,
116                 .direction = &pch_gpio_set3_direction,
117                 .level     = &pch_gpio_set3_level,
118         },
119 };
120
121 int board_early_init_f(void)
122 {
123         ich_gpio_set_gpio_map(&link_gpio_map);
124
125         return 0;
126 }
127
128 void setup_pch_gpios(u16 gpiobase, const struct pch_gpio_map *gpio)
129 {
130         /* GPIO Set 1 */
131         if (gpio->set1.level)
132                 outl(*((u32 *)gpio->set1.level), gpiobase + GP_LVL);
133         if (gpio->set1.mode)
134                 outl(*((u32 *)gpio->set1.mode), gpiobase + GPIO_USE_SEL);
135         if (gpio->set1.direction)
136                 outl(*((u32 *)gpio->set1.direction), gpiobase + GP_IO_SEL);
137         if (gpio->set1.reset)
138                 outl(*((u32 *)gpio->set1.reset), gpiobase + GP_RST_SEL1);
139         if (gpio->set1.invert)
140                 outl(*((u32 *)gpio->set1.invert), gpiobase + GPI_INV);
141         if (gpio->set1.blink)
142                 outl(*((u32 *)gpio->set1.blink), gpiobase + GPO_BLINK);
143
144         /* GPIO Set 2 */
145         if (gpio->set2.level)
146                 outl(*((u32 *)gpio->set2.level), gpiobase + GP_LVL2);
147         if (gpio->set2.mode)
148                 outl(*((u32 *)gpio->set2.mode), gpiobase + GPIO_USE_SEL2);
149         if (gpio->set2.direction)
150                 outl(*((u32 *)gpio->set2.direction), gpiobase + GP_IO_SEL2);
151         if (gpio->set2.reset)
152                 outl(*((u32 *)gpio->set2.reset), gpiobase + GP_RST_SEL2);
153
154         /* GPIO Set 3 */
155         if (gpio->set3.level)
156                 outl(*((u32 *)gpio->set3.level), gpiobase + GP_LVL3);
157         if (gpio->set3.mode)
158                 outl(*((u32 *)gpio->set3.mode), gpiobase + GPIO_USE_SEL3);
159         if (gpio->set3.direction)
160                 outl(*((u32 *)gpio->set3.direction), gpiobase + GP_IO_SEL3);
161         if (gpio->set3.reset)
162                 outl(*((u32 *)gpio->set3.reset), gpiobase + GP_RST_SEL3);
163 }