1 /* 2 * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 /* 8 * ZynqMP system level PM-API functions for pin control. 9 */ 10 11 #include <arch_helpers.h> 12 #include <platform.h> 13 #include "pm_api_pinctrl.h" 14 #include "pm_api_sys.h" 15 #include "pm_client.h" 16 #include "pm_common.h" 17 #include "pm_ipi.h" 18 19 #define PINCTRL_FUNCTION_MASK 0xFE 20 #define NFUNCS_PER_PIN 13 21 22 #define PINMUX_MAP(pin, f0, f1, f2, f3, f4, f5, f6, \ 23 f7, f8, f9, f10, f11, f12) \ 24 [pin] = { \ 25 .funcs = { \ 26 f0, \ 27 f1, \ 28 f2, \ 29 f3, \ 30 f4, \ 31 f5, \ 32 f6, \ 33 f7, \ 34 f8, \ 35 f9, \ 36 f10, \ 37 f11, \ 38 f12, \ 39 }, \ 40 } 41 42 struct pm_pinctrl_pinmux_map { 43 uint8_t funcs[NFUNCS_PER_PIN]; 44 }; 45 46 static uint8_t pm_pinctrl_mux[NFUNCS_PER_PIN] = { 47 0x02, 0x04, 0x08, 0x10, 0x18, 48 0x00, 0x20, 0x40, 0x60, 0x80, 49 0xA0, 0xC0, 0xE0 50 }; 51 52 struct pm_pinctrl_pinmux_map pinmux_maps[] = { 53 PINMUX_MAP(0, NODE_QSPI, NODE_UNKNOWN, NODE_UNKNOWN, NODE_TESTSCAN, 54 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_PJTAG, 55 NODE_SPI_0, NODE_TTC_3, NODE_UART_1, NODE_TRACE), 56 PINMUX_MAP(1, NODE_QSPI, NODE_UNKNOWN, NODE_UNKNOWN, NODE_TESTSCAN, 57 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_PJTAG, 58 NODE_SPI_0, NODE_TTC_3, NODE_UART_1, NODE_TRACE), 59 PINMUX_MAP(2, NODE_QSPI, NODE_UNKNOWN, NODE_UNKNOWN, NODE_TESTSCAN, 60 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_PJTAG, 61 NODE_SPI_0, NODE_TTC_2, NODE_UART_0, NODE_TRACE), 62 PINMUX_MAP(3, NODE_QSPI, NODE_UNKNOWN, NODE_UNKNOWN, NODE_TESTSCAN, 63 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_PJTAG, 64 NODE_SPI_0, NODE_TTC_2, NODE_UART_0, NODE_TRACE), 65 PINMUX_MAP(4, NODE_QSPI, NODE_UNKNOWN, NODE_UNKNOWN, NODE_TESTSCAN, 66 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_SWDT_1, 67 NODE_SPI_0, NODE_TTC_1, NODE_UART_1, NODE_TRACE), 68 PINMUX_MAP(5, NODE_QSPI, NODE_UNKNOWN, NODE_UNKNOWN, NODE_TESTSCAN, 69 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_SWDT_1, 70 NODE_SPI_0, NODE_TTC_1, NODE_UART_1, NODE_TRACE), 71 PINMUX_MAP(6, NODE_QSPI, NODE_UNKNOWN, NODE_UNKNOWN, NODE_TESTSCAN, 72 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_SWDT_0, 73 NODE_SPI_1, NODE_TTC_0, NODE_UART_0, NODE_TRACE), 74 PINMUX_MAP(7, NODE_QSPI, NODE_UNKNOWN, NODE_UNKNOWN, NODE_TESTSCAN, 75 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_SWDT_0, 76 NODE_SPI_1, NODE_TTC_0, NODE_UART_0, NODE_TRACE), 77 PINMUX_MAP(8, NODE_QSPI, NODE_UNKNOWN, NODE_UNKNOWN, NODE_TESTSCAN, 78 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_SWDT_1, 79 NODE_SPI_1, NODE_TTC_3, NODE_UART_1, NODE_TRACE), 80 PINMUX_MAP(9, NODE_QSPI, NODE_NAND, NODE_UNKNOWN, NODE_TESTSCAN, 81 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_SWDT_1, 82 NODE_SPI_1, NODE_TTC_3, NODE_UART_1, NODE_TRACE), 83 PINMUX_MAP(10, NODE_QSPI, NODE_NAND, NODE_UNKNOWN, NODE_TESTSCAN, 84 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_SWDT_0, 85 NODE_SPI_1, NODE_TTC_2, NODE_UART_0, NODE_TRACE), 86 PINMUX_MAP(11, NODE_QSPI, NODE_NAND, NODE_UNKNOWN, NODE_TESTSCAN, 87 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_SWDT_0, 88 NODE_SPI_1, NODE_TTC_2, NODE_UART_0, NODE_TRACE), 89 PINMUX_MAP(12, NODE_QSPI, NODE_NAND, NODE_UNKNOWN, NODE_TESTSCAN, 90 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_PJTAG, 91 NODE_SPI_0, NODE_TTC_1, NODE_UART_1, NODE_TRACE), 92 PINMUX_MAP(13, NODE_UNKNOWN, NODE_NAND, NODE_SD_0, NODE_TESTSCAN, 93 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_PJTAG, 94 NODE_SPI_0, NODE_TTC_1, NODE_UART_1, NODE_TRACE), 95 PINMUX_MAP(14, NODE_UNKNOWN, NODE_NAND, NODE_SD_0, NODE_TESTSCAN, 96 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_PJTAG, 97 NODE_SPI_0, NODE_TTC_0, NODE_UART_0, NODE_TRACE), 98 PINMUX_MAP(15, NODE_UNKNOWN, NODE_NAND, NODE_SD_0, NODE_TESTSCAN, 99 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_PJTAG, 100 NODE_SPI_0, NODE_TTC_0, NODE_UART_0, NODE_TRACE), 101 PINMUX_MAP(16, NODE_UNKNOWN, NODE_NAND, NODE_SD_0, NODE_TESTSCAN, 102 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_SWDT_1, 103 NODE_SPI_0, NODE_TTC_3, NODE_UART_1, NODE_TRACE), 104 PINMUX_MAP(17, NODE_UNKNOWN, NODE_NAND, NODE_SD_0, NODE_TESTSCAN, 105 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_SWDT_1, 106 NODE_SPI_0, NODE_TTC_3, NODE_UART_1, NODE_TRACE), 107 PINMUX_MAP(18, NODE_UNKNOWN, NODE_NAND, NODE_SD_0, NODE_TESTSCAN, 108 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_SWDT_0, 109 NODE_SPI_1, NODE_TTC_2, NODE_UART_0, NODE_UNKNOWN), 110 PINMUX_MAP(19, NODE_UNKNOWN, NODE_NAND, NODE_SD_0, NODE_TESTSCAN, 111 NODE_CSU, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_SWDT_0, 112 NODE_SPI_1, NODE_TTC_2, NODE_UART_0, NODE_UNKNOWN), 113 PINMUX_MAP(20, NODE_UNKNOWN, NODE_NAND, NODE_SD_0, NODE_TESTSCAN, 114 NODE_CSU, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_SWDT_1, 115 NODE_SPI_1, NODE_TTC_1, NODE_UART_1, NODE_UNKNOWN), 116 PINMUX_MAP(21, NODE_UNKNOWN, NODE_NAND, NODE_SD_0, NODE_TESTSCAN, 117 NODE_CSU, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_SWDT_1, 118 NODE_SPI_1, NODE_TTC_1, NODE_UART_1, NODE_UNKNOWN), 119 PINMUX_MAP(22, NODE_UNKNOWN, NODE_NAND, NODE_SD_0, NODE_TESTSCAN, 120 NODE_CSU, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_SWDT_0, 121 NODE_SPI_1, NODE_TTC_0, NODE_UART_0, NODE_UNKNOWN), 122 PINMUX_MAP(23, NODE_UNKNOWN, NODE_NAND, NODE_SD_0, NODE_TESTSCAN, 123 NODE_CSU, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_SWDT_0, 124 NODE_SPI_1, NODE_TTC_0, NODE_UART_0, NODE_UNKNOWN), 125 PINMUX_MAP(24, NODE_UNKNOWN, NODE_NAND, NODE_SD_0, NODE_TESTSCAN, 126 NODE_CSU, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_SWDT_1, 127 NODE_UNKNOWN, NODE_TTC_3, NODE_UART_1, NODE_UNKNOWN), 128 PINMUX_MAP(25, NODE_UNKNOWN, NODE_NAND, NODE_SD_0, NODE_TESTSCAN, 129 NODE_CSU, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_SWDT_1, 130 NODE_UNKNOWN, NODE_TTC_3, NODE_UART_1, NODE_UNKNOWN), 131 PINMUX_MAP(26, NODE_ETH_0, NODE_NAND, NODE_PMU, NODE_TESTSCAN, 132 NODE_CSU, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_PJTAG, 133 NODE_SPI_0, NODE_TTC_2, NODE_UART_0, NODE_TRACE), 134 PINMUX_MAP(27, NODE_ETH_0, NODE_NAND, NODE_PMU, NODE_TESTSCAN, 135 NODE_DP, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_PJTAG, 136 NODE_SPI_0, NODE_TTC_2, NODE_UART_0, NODE_TRACE), 137 PINMUX_MAP(28, NODE_ETH_0, NODE_NAND, NODE_PMU, NODE_TESTSCAN, 138 NODE_DP, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_PJTAG, 139 NODE_SPI_0, NODE_TTC_1, NODE_UART_1, NODE_TRACE), 140 PINMUX_MAP(29, NODE_ETH_0, NODE_PCIE, NODE_PMU, NODE_TESTSCAN, 141 NODE_DP, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_PJTAG, 142 NODE_SPI_0, NODE_TTC_1, NODE_UART_1, NODE_TRACE), 143 PINMUX_MAP(30, NODE_ETH_0, NODE_PCIE, NODE_PMU, NODE_TESTSCAN, 144 NODE_DP, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_SWDT_0, 145 NODE_SPI_0, NODE_TTC_0, NODE_UART_0, NODE_TRACE), 146 PINMUX_MAP(31, NODE_ETH_0, NODE_PCIE, NODE_PMU, NODE_TESTSCAN, 147 NODE_CSU, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_SWDT_0, 148 NODE_SPI_0, NODE_TTC_0, NODE_UART_0, NODE_TRACE), 149 PINMUX_MAP(32, NODE_ETH_0, NODE_NAND, NODE_PMU, NODE_TESTSCAN, 150 NODE_CSU, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_SWDT_1, 151 NODE_SPI_1, NODE_TTC_3, NODE_UART_1, NODE_TRACE), 152 PINMUX_MAP(33, NODE_ETH_0, NODE_PCIE, NODE_PMU, NODE_TESTSCAN, 153 NODE_CSU, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_SWDT_1, 154 NODE_SPI_1, NODE_TTC_3, NODE_UART_1, NODE_TRACE), 155 PINMUX_MAP(34, NODE_ETH_0, NODE_PCIE, NODE_PMU, NODE_TESTSCAN, 156 NODE_DP, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_SWDT_0, 157 NODE_SPI_1, NODE_TTC_2, NODE_UART_0, NODE_TRACE), 158 PINMUX_MAP(35, NODE_ETH_0, NODE_PCIE, NODE_PMU, NODE_TESTSCAN, 159 NODE_DP, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_SWDT_0, 160 NODE_SPI_1, NODE_TTC_2, NODE_UART_0, NODE_TRACE), 161 PINMUX_MAP(36, NODE_ETH_0, NODE_PCIE, NODE_PMU, NODE_TESTSCAN, 162 NODE_DP, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_SWDT_1, 163 NODE_SPI_1, NODE_TTC_1, NODE_UART_1, NODE_TRACE), 164 PINMUX_MAP(37, NODE_ETH_0, NODE_PCIE, NODE_PMU, NODE_TESTSCAN, 165 NODE_DP, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_SWDT_1, 166 NODE_SPI_1, NODE_TTC_1, NODE_UART_1, NODE_TRACE), 167 PINMUX_MAP(38, NODE_ETH_1, NODE_UNKNOWN, NODE_SD_0, NODE_UNKNOWN, 168 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_PJTAG, 169 NODE_SPI_0, NODE_TTC_0, NODE_UART_0, NODE_TRACE), 170 PINMUX_MAP(39, NODE_ETH_1, NODE_UNKNOWN, NODE_SD_0, NODE_SD_1, 171 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_PJTAG, 172 NODE_SPI_0, NODE_TTC_0, NODE_UART_0, NODE_TRACE), 173 PINMUX_MAP(40, NODE_ETH_1, NODE_UNKNOWN, NODE_SD_0, NODE_SD_1, 174 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_PJTAG, 175 NODE_SPI_0, NODE_TTC_3, NODE_UART_1, NODE_TRACE), 176 PINMUX_MAP(41, NODE_ETH_1, NODE_UNKNOWN, NODE_SD_0, NODE_SD_1, 177 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_PJTAG, 178 NODE_SPI_0, NODE_TTC_3, NODE_UART_1, NODE_TRACE), 179 PINMUX_MAP(42, NODE_ETH_1, NODE_UNKNOWN, NODE_SD_0, NODE_SD_1, 180 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_SWDT_0, 181 NODE_SPI_0, NODE_TTC_2, NODE_UART_0, NODE_TRACE), 182 PINMUX_MAP(43, NODE_ETH_1, NODE_UNKNOWN, NODE_SD_0, NODE_SD_1, 183 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_SWDT_0, 184 NODE_SPI_0, NODE_TTC_2, NODE_UART_0, NODE_TRACE), 185 PINMUX_MAP(44, NODE_ETH_1, NODE_UNKNOWN, NODE_SD_0, NODE_SD_1, 186 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_SWDT_1, 187 NODE_SPI_1, NODE_TTC_1, NODE_UART_1, NODE_UNKNOWN), 188 PINMUX_MAP(45, NODE_ETH_1, NODE_UNKNOWN, NODE_SD_0, NODE_SD_1, 189 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_SWDT_1, 190 NODE_SPI_1, NODE_TTC_1, NODE_UART_1, NODE_UNKNOWN), 191 PINMUX_MAP(46, NODE_ETH_1, NODE_UNKNOWN, NODE_SD_0, NODE_SD_1, 192 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_SWDT_0, 193 NODE_SPI_1, NODE_TTC_0, NODE_UART_0, NODE_UNKNOWN), 194 PINMUX_MAP(47, NODE_ETH_1, NODE_UNKNOWN, NODE_SD_0, NODE_SD_1, 195 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_SWDT_0, 196 NODE_SPI_1, NODE_TTC_0, NODE_UART_0, NODE_UNKNOWN), 197 PINMUX_MAP(48, NODE_ETH_1, NODE_UNKNOWN, NODE_SD_0, NODE_SD_1, 198 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_SWDT_1, 199 NODE_SPI_1, NODE_TTC_3, NODE_UART_1, NODE_UNKNOWN), 200 PINMUX_MAP(49, NODE_ETH_1, NODE_UNKNOWN, NODE_SD_0, NODE_SD_1, 201 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_SWDT_1, 202 NODE_SPI_1, NODE_TTC_3, NODE_UART_1, NODE_UNKNOWN), 203 PINMUX_MAP(50, NODE_GEM_TSU, NODE_UNKNOWN, NODE_SD_0, NODE_SD_1, 204 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_SWDT_0, 205 NODE_ETH_1, NODE_TTC_2, NODE_UART_0, NODE_UNKNOWN), 206 PINMUX_MAP(51, NODE_GEM_TSU, NODE_UNKNOWN, NODE_UNKNOWN, NODE_SD_1, 207 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_SWDT_0, 208 NODE_ETH_1, NODE_TTC_2, NODE_UART_0, NODE_UNKNOWN), 209 PINMUX_MAP(52, NODE_ETH_2, NODE_USB_0, NODE_UNKNOWN, NODE_UNKNOWN, 210 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_PJTAG, 211 NODE_SPI_0, NODE_TTC_1, NODE_UART_1, NODE_TRACE), 212 PINMUX_MAP(53, NODE_ETH_2, NODE_USB_0, NODE_UNKNOWN, NODE_UNKNOWN, 213 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_PJTAG, 214 NODE_SPI_0, NODE_TTC_1, NODE_UART_1, NODE_TRACE), 215 PINMUX_MAP(54, NODE_ETH_2, NODE_USB_0, NODE_UNKNOWN, NODE_UNKNOWN, 216 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_PJTAG, 217 NODE_SPI_0, NODE_TTC_0, NODE_UART_0, NODE_TRACE), 218 PINMUX_MAP(55, NODE_ETH_2, NODE_USB_0, NODE_UNKNOWN, NODE_UNKNOWN, 219 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_PJTAG, 220 NODE_SPI_0, NODE_TTC_0, NODE_UART_0, NODE_TRACE), 221 PINMUX_MAP(56, NODE_ETH_2, NODE_USB_0, NODE_UNKNOWN, NODE_UNKNOWN, 222 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_SWDT_1, 223 NODE_SPI_0, NODE_TTC_3, NODE_UART_1, NODE_TRACE), 224 PINMUX_MAP(57, NODE_ETH_2, NODE_USB_0, NODE_UNKNOWN, NODE_UNKNOWN, 225 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_SWDT_1, 226 NODE_SPI_0, NODE_TTC_3, NODE_UART_1, NODE_TRACE), 227 PINMUX_MAP(58, NODE_ETH_2, NODE_USB_0, NODE_UNKNOWN, NODE_UNKNOWN, 228 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_PJTAG, 229 NODE_SPI_1, NODE_TTC_2, NODE_UART_0, NODE_TRACE), 230 PINMUX_MAP(59, NODE_ETH_2, NODE_USB_0, NODE_UNKNOWN, NODE_UNKNOWN, 231 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_PJTAG, 232 NODE_SPI_1, NODE_TTC_2, NODE_UART_0, NODE_TRACE), 233 PINMUX_MAP(60, NODE_ETH_2, NODE_USB_0, NODE_UNKNOWN, NODE_UNKNOWN, 234 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_PJTAG, 235 NODE_SPI_1, NODE_TTC_1, NODE_UART_1, NODE_TRACE), 236 PINMUX_MAP(61, NODE_ETH_2, NODE_USB_0, NODE_UNKNOWN, NODE_UNKNOWN, 237 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_PJTAG, 238 NODE_SPI_1, NODE_TTC_1, NODE_UART_1, NODE_TRACE), 239 PINMUX_MAP(62, NODE_ETH_2, NODE_USB_0, NODE_UNKNOWN, NODE_UNKNOWN, 240 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_SWDT_0, 241 NODE_SPI_1, NODE_TTC_0, NODE_UART_0, NODE_TRACE), 242 PINMUX_MAP(63, NODE_ETH_2, NODE_USB_0, NODE_UNKNOWN, NODE_UNKNOWN, 243 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_SWDT_0, 244 NODE_SPI_1, NODE_TTC_0, NODE_UART_0, NODE_TRACE), 245 PINMUX_MAP(64, NODE_ETH_3, NODE_USB_1, NODE_SD_0, NODE_UNKNOWN, 246 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_SWDT_1, 247 NODE_SPI_0, NODE_TTC_3, NODE_UART_1, NODE_TRACE), 248 PINMUX_MAP(65, NODE_ETH_3, NODE_USB_1, NODE_SD_0, NODE_UNKNOWN, 249 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_SWDT_1, 250 NODE_SPI_0, NODE_TTC_3, NODE_UART_1, NODE_TRACE), 251 PINMUX_MAP(66, NODE_ETH_3, NODE_USB_1, NODE_SD_0, NODE_UNKNOWN, 252 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_SWDT_0, 253 NODE_SPI_0, NODE_TTC_2, NODE_UART_0, NODE_TRACE), 254 PINMUX_MAP(67, NODE_ETH_3, NODE_USB_1, NODE_SD_0, NODE_UNKNOWN, 255 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_SWDT_0, 256 NODE_SPI_0, NODE_TTC_2, NODE_UART_0, NODE_TRACE), 257 PINMUX_MAP(68, NODE_ETH_3, NODE_USB_1, NODE_SD_0, NODE_UNKNOWN, 258 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_SWDT_1, 259 NODE_SPI_0, NODE_TTC_1, NODE_UART_1, NODE_TRACE), 260 PINMUX_MAP(69, NODE_ETH_3, NODE_USB_1, NODE_SD_0, NODE_SD_1, 261 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_SWDT_1, 262 NODE_SPI_0, NODE_TTC_1, NODE_UART_1, NODE_TRACE), 263 PINMUX_MAP(70, NODE_ETH_3, NODE_USB_1, NODE_SD_0, NODE_SD_1, 264 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_SWDT_0, 265 NODE_SPI_1, NODE_TTC_0, NODE_UART_0, NODE_UNKNOWN), 266 PINMUX_MAP(71, NODE_ETH_3, NODE_USB_1, NODE_SD_0, NODE_SD_1, 267 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_SWDT_0, 268 NODE_SPI_1, NODE_TTC_0, NODE_UART_0, NODE_UNKNOWN), 269 PINMUX_MAP(72, NODE_ETH_3, NODE_USB_1, NODE_SD_0, NODE_SD_1, 270 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_SWDT_1, 271 NODE_SPI_1, NODE_UNKNOWN, NODE_UART_1, NODE_UNKNOWN), 272 PINMUX_MAP(73, NODE_ETH_3, NODE_USB_1, NODE_SD_0, NODE_SD_1, 273 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_SWDT_1, 274 NODE_SPI_1, NODE_UNKNOWN, NODE_UART_1, NODE_UNKNOWN), 275 PINMUX_MAP(74, NODE_ETH_3, NODE_USB_1, NODE_SD_0, NODE_SD_1, 276 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_SWDT_0, 277 NODE_SPI_1, NODE_UNKNOWN, NODE_UART_0, NODE_UNKNOWN), 278 PINMUX_MAP(75, NODE_ETH_3, NODE_USB_1, NODE_SD_0, NODE_SD_1, 279 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_0, NODE_I2C_0, NODE_SWDT_0, 280 NODE_SPI_1, NODE_UNKNOWN, NODE_UART_0, NODE_UNKNOWN), 281 PINMUX_MAP(76, NODE_UNKNOWN, NODE_UNKNOWN, NODE_SD_0, NODE_SD_1, 282 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_ETH_0, 283 NODE_ETH_1, NODE_ETH_2, NODE_ETH_3, NODE_UNKNOWN), 284 PINMUX_MAP(77, NODE_UNKNOWN, NODE_UNKNOWN, NODE_UNKNOWN, NODE_SD_1, 285 NODE_UNKNOWN, NODE_GPIO, NODE_CAN_1, NODE_I2C_1, NODE_ETH_0, 286 NODE_ETH_1, NODE_ETH_2, NODE_ETH_3, NODE_UNKNOWN), 287 }; 288 289 /** 290 * pm_api_pinctrl_get_function() - Read function id set for the given pin 291 * @pin Pin number 292 * @nid Node ID of function currently set for given pin 293 * 294 * This function provides the function currently set for the given pin. 295 * 296 * @return Returns status, either success or error+reason 297 */ 298 enum pm_ret_status pm_api_pinctrl_get_function(unsigned int pin, 299 enum pm_node_id *nid) 300 { 301 struct pm_pinctrl_pinmux_map *pinmux_map = &pinmux_maps[pin]; 302 int i, ret = PM_RET_SUCCESS; 303 unsigned int reg, val; 304 305 reg = IOU_SLCR_BASEADDR + 4 * pin; 306 ret = pm_mmio_read(reg, &val); 307 if (ret) 308 return ret; 309 310 val &= PINCTRL_FUNCTION_MASK; 311 312 for (i = 0; i < NFUNCS_PER_PIN; i++) 313 if (val == pm_pinctrl_mux[i]) 314 break; 315 316 if (i == NFUNCS_PER_PIN) 317 return PM_RET_ERROR_NOTSUPPORTED; 318 319 *nid = pinmux_map->funcs[i]; 320 321 return ret; 322 } 323 324 /** 325 * pm_api_pinctrl_set_function() - Set function id set for the given pin 326 * @pin Pin number 327 * @nid Node ID of function to set for given pin 328 * 329 * This function provides the function currently set for the given pin. 330 * 331 * @return Returns status, either success or error+reason 332 */ 333 enum pm_ret_status pm_api_pinctrl_set_function(unsigned int pin, 334 enum pm_node_id nid) 335 { 336 struct pm_pinctrl_pinmux_map *pinmux_map = &pinmux_maps[pin]; 337 int i; 338 unsigned int reg, val; 339 340 for (i = 0; i < NFUNCS_PER_PIN; i++) 341 if (nid == pinmux_map->funcs[i]) 342 break; 343 344 if (i == NFUNCS_PER_PIN) 345 return PM_RET_ERROR_NOTSUPPORTED; 346 347 reg = IOU_SLCR_BASEADDR + 4 * pin; 348 val = pm_pinctrl_mux[i]; 349 350 return pm_mmio_write(reg, PINCTRL_FUNCTION_MASK, val); 351 } 352