hw_translate_dce110.c (9593B)
1/* 2 * Copyright 2013-15 Advanced Micro Devices, Inc. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included in 12 * all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 * OTHER DEALINGS IN THE SOFTWARE. 21 * 22 * Authors: AMD 23 * 24 */ 25 26/* 27 * Pre-requisites: headers required by header of this unit 28 */ 29 30#include "dm_services.h" 31#include "include/gpio_types.h" 32#include "../hw_translate.h" 33 34#include "hw_translate_dce110.h" 35 36#include "dce/dce_11_0_d.h" 37#include "dce/dce_11_0_sh_mask.h" 38 39static bool offset_to_id( 40 uint32_t offset, 41 uint32_t mask, 42 enum gpio_id *id, 43 uint32_t *en) 44{ 45 switch (offset) { 46 /* GENERIC */ 47 case mmDC_GPIO_GENERIC_A: 48 *id = GPIO_ID_GENERIC; 49 switch (mask) { 50 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICA_A_MASK: 51 *en = GPIO_GENERIC_A; 52 return true; 53 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICB_A_MASK: 54 *en = GPIO_GENERIC_B; 55 return true; 56 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICC_A_MASK: 57 *en = GPIO_GENERIC_C; 58 return true; 59 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICD_A_MASK: 60 *en = GPIO_GENERIC_D; 61 return true; 62 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICE_A_MASK: 63 *en = GPIO_GENERIC_E; 64 return true; 65 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICF_A_MASK: 66 *en = GPIO_GENERIC_F; 67 return true; 68 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICG_A_MASK: 69 *en = GPIO_GENERIC_G; 70 return true; 71 default: 72 ASSERT_CRITICAL(false); 73 return false; 74 } 75 break; 76 /* HPD */ 77 case mmDC_GPIO_HPD_A: 78 *id = GPIO_ID_HPD; 79 switch (mask) { 80 case DC_GPIO_HPD_A__DC_GPIO_HPD1_A_MASK: 81 *en = GPIO_HPD_1; 82 return true; 83 case DC_GPIO_HPD_A__DC_GPIO_HPD2_A_MASK: 84 *en = GPIO_HPD_2; 85 return true; 86 case DC_GPIO_HPD_A__DC_GPIO_HPD3_A_MASK: 87 *en = GPIO_HPD_3; 88 return true; 89 case DC_GPIO_HPD_A__DC_GPIO_HPD4_A_MASK: 90 *en = GPIO_HPD_4; 91 return true; 92 case DC_GPIO_HPD_A__DC_GPIO_HPD5_A_MASK: 93 *en = GPIO_HPD_5; 94 return true; 95 case DC_GPIO_HPD_A__DC_GPIO_HPD6_A_MASK: 96 *en = GPIO_HPD_6; 97 return true; 98 default: 99 ASSERT_CRITICAL(false); 100 return false; 101 } 102 break; 103 /* SYNCA */ 104 case mmDC_GPIO_SYNCA_A: 105 *id = GPIO_ID_SYNC; 106 switch (mask) { 107 case DC_GPIO_SYNCA_A__DC_GPIO_HSYNCA_A_MASK: 108 *en = GPIO_SYNC_HSYNC_A; 109 return true; 110 case DC_GPIO_SYNCA_A__DC_GPIO_VSYNCA_A_MASK: 111 *en = GPIO_SYNC_VSYNC_A; 112 return true; 113 default: 114 ASSERT_CRITICAL(false); 115 return false; 116 } 117 break; 118 /* mmDC_GPIO_GENLK_MASK */ 119 case mmDC_GPIO_GENLK_A: 120 *id = GPIO_ID_GSL; 121 switch (mask) { 122 case DC_GPIO_GENLK_A__DC_GPIO_GENLK_CLK_A_MASK: 123 *en = GPIO_GSL_GENLOCK_CLOCK; 124 return true; 125 case DC_GPIO_GENLK_A__DC_GPIO_GENLK_VSYNC_A_MASK: 126 *en = GPIO_GSL_GENLOCK_VSYNC; 127 return true; 128 case DC_GPIO_GENLK_A__DC_GPIO_SWAPLOCK_A_A_MASK: 129 *en = GPIO_GSL_SWAPLOCK_A; 130 return true; 131 case DC_GPIO_GENLK_A__DC_GPIO_SWAPLOCK_B_A_MASK: 132 *en = GPIO_GSL_SWAPLOCK_B; 133 return true; 134 default: 135 ASSERT_CRITICAL(false); 136 return false; 137 } 138 break; 139 /* DDC */ 140 /* we don't care about the GPIO_ID for DDC 141 * in DdcHandle it will use GPIO_ID_DDC_DATA/GPIO_ID_DDC_CLOCK 142 * directly in the create method */ 143 case mmDC_GPIO_DDC1_A: 144 *en = GPIO_DDC_LINE_DDC1; 145 return true; 146 case mmDC_GPIO_DDC2_A: 147 *en = GPIO_DDC_LINE_DDC2; 148 return true; 149 case mmDC_GPIO_DDC3_A: 150 *en = GPIO_DDC_LINE_DDC3; 151 return true; 152 case mmDC_GPIO_DDC4_A: 153 *en = GPIO_DDC_LINE_DDC4; 154 return true; 155 case mmDC_GPIO_DDC5_A: 156 *en = GPIO_DDC_LINE_DDC5; 157 return true; 158 case mmDC_GPIO_DDC6_A: 159 *en = GPIO_DDC_LINE_DDC6; 160 return true; 161 case mmDC_GPIO_DDCVGA_A: 162 *en = GPIO_DDC_LINE_DDC_VGA; 163 return true; 164 /* GPIO_I2CPAD */ 165 case mmDC_GPIO_I2CPAD_A: 166 *en = GPIO_DDC_LINE_I2C_PAD; 167 return true; 168 /* Not implemented */ 169 case mmDC_GPIO_PWRSEQ_A: 170 case mmDC_GPIO_PAD_STRENGTH_1: 171 case mmDC_GPIO_PAD_STRENGTH_2: 172 case mmDC_GPIO_DEBUG: 173 return false; 174 /* UNEXPECTED */ 175 default: 176 ASSERT_CRITICAL(false); 177 return false; 178 } 179} 180 181static bool id_to_offset( 182 enum gpio_id id, 183 uint32_t en, 184 struct gpio_pin_info *info) 185{ 186 bool result = true; 187 188 switch (id) { 189 case GPIO_ID_DDC_DATA: 190 info->mask = DC_GPIO_DDC6_A__DC_GPIO_DDC6DATA_A_MASK; 191 switch (en) { 192 case GPIO_DDC_LINE_DDC1: 193 info->offset = mmDC_GPIO_DDC1_A; 194 break; 195 case GPIO_DDC_LINE_DDC2: 196 info->offset = mmDC_GPIO_DDC2_A; 197 break; 198 case GPIO_DDC_LINE_DDC3: 199 info->offset = mmDC_GPIO_DDC3_A; 200 break; 201 case GPIO_DDC_LINE_DDC4: 202 info->offset = mmDC_GPIO_DDC4_A; 203 break; 204 case GPIO_DDC_LINE_DDC5: 205 info->offset = mmDC_GPIO_DDC5_A; 206 break; 207 case GPIO_DDC_LINE_DDC6: 208 info->offset = mmDC_GPIO_DDC6_A; 209 break; 210 case GPIO_DDC_LINE_DDC_VGA: 211 info->offset = mmDC_GPIO_DDCVGA_A; 212 break; 213 case GPIO_DDC_LINE_I2C_PAD: 214 info->offset = mmDC_GPIO_I2CPAD_A; 215 break; 216 default: 217 ASSERT_CRITICAL(false); 218 result = false; 219 } 220 break; 221 case GPIO_ID_DDC_CLOCK: 222 info->mask = DC_GPIO_DDC6_A__DC_GPIO_DDC6CLK_A_MASK; 223 switch (en) { 224 case GPIO_DDC_LINE_DDC1: 225 info->offset = mmDC_GPIO_DDC1_A; 226 break; 227 case GPIO_DDC_LINE_DDC2: 228 info->offset = mmDC_GPIO_DDC2_A; 229 break; 230 case GPIO_DDC_LINE_DDC3: 231 info->offset = mmDC_GPIO_DDC3_A; 232 break; 233 case GPIO_DDC_LINE_DDC4: 234 info->offset = mmDC_GPIO_DDC4_A; 235 break; 236 case GPIO_DDC_LINE_DDC5: 237 info->offset = mmDC_GPIO_DDC5_A; 238 break; 239 case GPIO_DDC_LINE_DDC6: 240 info->offset = mmDC_GPIO_DDC6_A; 241 break; 242 case GPIO_DDC_LINE_DDC_VGA: 243 info->offset = mmDC_GPIO_DDCVGA_A; 244 break; 245 case GPIO_DDC_LINE_I2C_PAD: 246 info->offset = mmDC_GPIO_I2CPAD_A; 247 break; 248 default: 249 ASSERT_CRITICAL(false); 250 result = false; 251 } 252 break; 253 case GPIO_ID_GENERIC: 254 info->offset = mmDC_GPIO_GENERIC_A; 255 switch (en) { 256 case GPIO_GENERIC_A: 257 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICA_A_MASK; 258 break; 259 case GPIO_GENERIC_B: 260 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICB_A_MASK; 261 break; 262 case GPIO_GENERIC_C: 263 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICC_A_MASK; 264 break; 265 case GPIO_GENERIC_D: 266 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICD_A_MASK; 267 break; 268 case GPIO_GENERIC_E: 269 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICE_A_MASK; 270 break; 271 case GPIO_GENERIC_F: 272 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICF_A_MASK; 273 break; 274 case GPIO_GENERIC_G: 275 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICG_A_MASK; 276 break; 277 default: 278 ASSERT_CRITICAL(false); 279 result = false; 280 } 281 break; 282 case GPIO_ID_HPD: 283 info->offset = mmDC_GPIO_HPD_A; 284 switch (en) { 285 case GPIO_HPD_1: 286 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD1_A_MASK; 287 break; 288 case GPIO_HPD_2: 289 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD2_A_MASK; 290 break; 291 case GPIO_HPD_3: 292 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD3_A_MASK; 293 break; 294 case GPIO_HPD_4: 295 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD4_A_MASK; 296 break; 297 case GPIO_HPD_5: 298 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD5_A_MASK; 299 break; 300 case GPIO_HPD_6: 301 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD6_A_MASK; 302 break; 303 default: 304 ASSERT_CRITICAL(false); 305 result = false; 306 } 307 break; 308 case GPIO_ID_SYNC: 309 switch (en) { 310 case GPIO_SYNC_HSYNC_A: 311 info->offset = mmDC_GPIO_SYNCA_A; 312 info->mask = DC_GPIO_SYNCA_A__DC_GPIO_HSYNCA_A_MASK; 313 break; 314 case GPIO_SYNC_VSYNC_A: 315 info->offset = mmDC_GPIO_SYNCA_A; 316 info->mask = DC_GPIO_SYNCA_A__DC_GPIO_VSYNCA_A_MASK; 317 break; 318 case GPIO_SYNC_HSYNC_B: 319 case GPIO_SYNC_VSYNC_B: 320 default: 321 ASSERT_CRITICAL(false); 322 result = false; 323 } 324 break; 325 case GPIO_ID_GSL: 326 switch (en) { 327 case GPIO_GSL_GENLOCK_CLOCK: 328 info->offset = mmDC_GPIO_GENLK_A; 329 info->mask = DC_GPIO_GENLK_A__DC_GPIO_GENLK_CLK_A_MASK; 330 break; 331 case GPIO_GSL_GENLOCK_VSYNC: 332 info->offset = mmDC_GPIO_GENLK_A; 333 info->mask = 334 DC_GPIO_GENLK_A__DC_GPIO_GENLK_VSYNC_A_MASK; 335 break; 336 case GPIO_GSL_SWAPLOCK_A: 337 info->offset = mmDC_GPIO_GENLK_A; 338 info->mask = DC_GPIO_GENLK_A__DC_GPIO_SWAPLOCK_A_A_MASK; 339 break; 340 case GPIO_GSL_SWAPLOCK_B: 341 info->offset = mmDC_GPIO_GENLK_A; 342 info->mask = DC_GPIO_GENLK_A__DC_GPIO_SWAPLOCK_B_A_MASK; 343 break; 344 default: 345 ASSERT_CRITICAL(false); 346 result = false; 347 } 348 break; 349 case GPIO_ID_VIP_PAD: 350 default: 351 ASSERT_CRITICAL(false); 352 result = false; 353 } 354 355 if (result) { 356 info->offset_y = info->offset + 2; 357 info->offset_en = info->offset + 1; 358 info->offset_mask = info->offset - 1; 359 360 info->mask_y = info->mask; 361 info->mask_en = info->mask; 362 info->mask_mask = info->mask; 363 } 364 365 return result; 366} 367 368/* function table */ 369static const struct hw_translate_funcs funcs = { 370 .offset_to_id = offset_to_id, 371 .id_to_offset = id_to_offset, 372}; 373 374/* 375 * dal_hw_translate_dce110_init 376 * 377 * @brief 378 * Initialize Hw translate function pointers. 379 * 380 * @param 381 * struct hw_translate *tr - [out] struct of function pointers 382 * 383 */ 384void dal_hw_translate_dce110_init(struct hw_translate *tr) 385{ 386 tr->funcs = &funcs; 387}