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