0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030 #include "dm_services.h"
0031 #include "include/gpio_types.h"
0032 #include "../hw_translate.h"
0033
0034 #include "hw_translate_dce110.h"
0035
0036 #include "dce/dce_11_0_d.h"
0037 #include "dce/dce_11_0_sh_mask.h"
0038
0039 static bool offset_to_id(
0040 uint32_t offset,
0041 uint32_t mask,
0042 enum gpio_id *id,
0043 uint32_t *en)
0044 {
0045 switch (offset) {
0046
0047 case mmDC_GPIO_GENERIC_A:
0048 *id = GPIO_ID_GENERIC;
0049 switch (mask) {
0050 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICA_A_MASK:
0051 *en = GPIO_GENERIC_A;
0052 return true;
0053 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICB_A_MASK:
0054 *en = GPIO_GENERIC_B;
0055 return true;
0056 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICC_A_MASK:
0057 *en = GPIO_GENERIC_C;
0058 return true;
0059 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICD_A_MASK:
0060 *en = GPIO_GENERIC_D;
0061 return true;
0062 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICE_A_MASK:
0063 *en = GPIO_GENERIC_E;
0064 return true;
0065 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICF_A_MASK:
0066 *en = GPIO_GENERIC_F;
0067 return true;
0068 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICG_A_MASK:
0069 *en = GPIO_GENERIC_G;
0070 return true;
0071 default:
0072 ASSERT_CRITICAL(false);
0073 return false;
0074 }
0075 break;
0076
0077 case mmDC_GPIO_HPD_A:
0078 *id = GPIO_ID_HPD;
0079 switch (mask) {
0080 case DC_GPIO_HPD_A__DC_GPIO_HPD1_A_MASK:
0081 *en = GPIO_HPD_1;
0082 return true;
0083 case DC_GPIO_HPD_A__DC_GPIO_HPD2_A_MASK:
0084 *en = GPIO_HPD_2;
0085 return true;
0086 case DC_GPIO_HPD_A__DC_GPIO_HPD3_A_MASK:
0087 *en = GPIO_HPD_3;
0088 return true;
0089 case DC_GPIO_HPD_A__DC_GPIO_HPD4_A_MASK:
0090 *en = GPIO_HPD_4;
0091 return true;
0092 case DC_GPIO_HPD_A__DC_GPIO_HPD5_A_MASK:
0093 *en = GPIO_HPD_5;
0094 return true;
0095 case DC_GPIO_HPD_A__DC_GPIO_HPD6_A_MASK:
0096 *en = GPIO_HPD_6;
0097 return true;
0098 default:
0099 ASSERT_CRITICAL(false);
0100 return false;
0101 }
0102 break;
0103
0104 case mmDC_GPIO_SYNCA_A:
0105 *id = GPIO_ID_SYNC;
0106 switch (mask) {
0107 case DC_GPIO_SYNCA_A__DC_GPIO_HSYNCA_A_MASK:
0108 *en = GPIO_SYNC_HSYNC_A;
0109 return true;
0110 case DC_GPIO_SYNCA_A__DC_GPIO_VSYNCA_A_MASK:
0111 *en = GPIO_SYNC_VSYNC_A;
0112 return true;
0113 default:
0114 ASSERT_CRITICAL(false);
0115 return false;
0116 }
0117 break;
0118
0119 case mmDC_GPIO_GENLK_A:
0120 *id = GPIO_ID_GSL;
0121 switch (mask) {
0122 case DC_GPIO_GENLK_A__DC_GPIO_GENLK_CLK_A_MASK:
0123 *en = GPIO_GSL_GENLOCK_CLOCK;
0124 return true;
0125 case DC_GPIO_GENLK_A__DC_GPIO_GENLK_VSYNC_A_MASK:
0126 *en = GPIO_GSL_GENLOCK_VSYNC;
0127 return true;
0128 case DC_GPIO_GENLK_A__DC_GPIO_SWAPLOCK_A_A_MASK:
0129 *en = GPIO_GSL_SWAPLOCK_A;
0130 return true;
0131 case DC_GPIO_GENLK_A__DC_GPIO_SWAPLOCK_B_A_MASK:
0132 *en = GPIO_GSL_SWAPLOCK_B;
0133 return true;
0134 default:
0135 ASSERT_CRITICAL(false);
0136 return false;
0137 }
0138 break;
0139
0140
0141
0142
0143 case mmDC_GPIO_DDC1_A:
0144 *en = GPIO_DDC_LINE_DDC1;
0145 return true;
0146 case mmDC_GPIO_DDC2_A:
0147 *en = GPIO_DDC_LINE_DDC2;
0148 return true;
0149 case mmDC_GPIO_DDC3_A:
0150 *en = GPIO_DDC_LINE_DDC3;
0151 return true;
0152 case mmDC_GPIO_DDC4_A:
0153 *en = GPIO_DDC_LINE_DDC4;
0154 return true;
0155 case mmDC_GPIO_DDC5_A:
0156 *en = GPIO_DDC_LINE_DDC5;
0157 return true;
0158 case mmDC_GPIO_DDC6_A:
0159 *en = GPIO_DDC_LINE_DDC6;
0160 return true;
0161 case mmDC_GPIO_DDCVGA_A:
0162 *en = GPIO_DDC_LINE_DDC_VGA;
0163 return true;
0164
0165 case mmDC_GPIO_I2CPAD_A:
0166 *en = GPIO_DDC_LINE_I2C_PAD;
0167 return true;
0168
0169 case mmDC_GPIO_PWRSEQ_A:
0170 case mmDC_GPIO_PAD_STRENGTH_1:
0171 case mmDC_GPIO_PAD_STRENGTH_2:
0172 case mmDC_GPIO_DEBUG:
0173 return false;
0174
0175 default:
0176 ASSERT_CRITICAL(false);
0177 return false;
0178 }
0179 }
0180
0181 static bool id_to_offset(
0182 enum gpio_id id,
0183 uint32_t en,
0184 struct gpio_pin_info *info)
0185 {
0186 bool result = true;
0187
0188 switch (id) {
0189 case GPIO_ID_DDC_DATA:
0190 info->mask = DC_GPIO_DDC6_A__DC_GPIO_DDC6DATA_A_MASK;
0191 switch (en) {
0192 case GPIO_DDC_LINE_DDC1:
0193 info->offset = mmDC_GPIO_DDC1_A;
0194 break;
0195 case GPIO_DDC_LINE_DDC2:
0196 info->offset = mmDC_GPIO_DDC2_A;
0197 break;
0198 case GPIO_DDC_LINE_DDC3:
0199 info->offset = mmDC_GPIO_DDC3_A;
0200 break;
0201 case GPIO_DDC_LINE_DDC4:
0202 info->offset = mmDC_GPIO_DDC4_A;
0203 break;
0204 case GPIO_DDC_LINE_DDC5:
0205 info->offset = mmDC_GPIO_DDC5_A;
0206 break;
0207 case GPIO_DDC_LINE_DDC6:
0208 info->offset = mmDC_GPIO_DDC6_A;
0209 break;
0210 case GPIO_DDC_LINE_DDC_VGA:
0211 info->offset = mmDC_GPIO_DDCVGA_A;
0212 break;
0213 case GPIO_DDC_LINE_I2C_PAD:
0214 info->offset = mmDC_GPIO_I2CPAD_A;
0215 break;
0216 default:
0217 ASSERT_CRITICAL(false);
0218 result = false;
0219 }
0220 break;
0221 case GPIO_ID_DDC_CLOCK:
0222 info->mask = DC_GPIO_DDC6_A__DC_GPIO_DDC6CLK_A_MASK;
0223 switch (en) {
0224 case GPIO_DDC_LINE_DDC1:
0225 info->offset = mmDC_GPIO_DDC1_A;
0226 break;
0227 case GPIO_DDC_LINE_DDC2:
0228 info->offset = mmDC_GPIO_DDC2_A;
0229 break;
0230 case GPIO_DDC_LINE_DDC3:
0231 info->offset = mmDC_GPIO_DDC3_A;
0232 break;
0233 case GPIO_DDC_LINE_DDC4:
0234 info->offset = mmDC_GPIO_DDC4_A;
0235 break;
0236 case GPIO_DDC_LINE_DDC5:
0237 info->offset = mmDC_GPIO_DDC5_A;
0238 break;
0239 case GPIO_DDC_LINE_DDC6:
0240 info->offset = mmDC_GPIO_DDC6_A;
0241 break;
0242 case GPIO_DDC_LINE_DDC_VGA:
0243 info->offset = mmDC_GPIO_DDCVGA_A;
0244 break;
0245 case GPIO_DDC_LINE_I2C_PAD:
0246 info->offset = mmDC_GPIO_I2CPAD_A;
0247 break;
0248 default:
0249 ASSERT_CRITICAL(false);
0250 result = false;
0251 }
0252 break;
0253 case GPIO_ID_GENERIC:
0254 info->offset = mmDC_GPIO_GENERIC_A;
0255 switch (en) {
0256 case GPIO_GENERIC_A:
0257 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICA_A_MASK;
0258 break;
0259 case GPIO_GENERIC_B:
0260 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICB_A_MASK;
0261 break;
0262 case GPIO_GENERIC_C:
0263 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICC_A_MASK;
0264 break;
0265 case GPIO_GENERIC_D:
0266 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICD_A_MASK;
0267 break;
0268 case GPIO_GENERIC_E:
0269 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICE_A_MASK;
0270 break;
0271 case GPIO_GENERIC_F:
0272 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICF_A_MASK;
0273 break;
0274 case GPIO_GENERIC_G:
0275 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICG_A_MASK;
0276 break;
0277 default:
0278 ASSERT_CRITICAL(false);
0279 result = false;
0280 }
0281 break;
0282 case GPIO_ID_HPD:
0283 info->offset = mmDC_GPIO_HPD_A;
0284 switch (en) {
0285 case GPIO_HPD_1:
0286 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD1_A_MASK;
0287 break;
0288 case GPIO_HPD_2:
0289 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD2_A_MASK;
0290 break;
0291 case GPIO_HPD_3:
0292 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD3_A_MASK;
0293 break;
0294 case GPIO_HPD_4:
0295 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD4_A_MASK;
0296 break;
0297 case GPIO_HPD_5:
0298 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD5_A_MASK;
0299 break;
0300 case GPIO_HPD_6:
0301 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD6_A_MASK;
0302 break;
0303 default:
0304 ASSERT_CRITICAL(false);
0305 result = false;
0306 }
0307 break;
0308 case GPIO_ID_SYNC:
0309 switch (en) {
0310 case GPIO_SYNC_HSYNC_A:
0311 info->offset = mmDC_GPIO_SYNCA_A;
0312 info->mask = DC_GPIO_SYNCA_A__DC_GPIO_HSYNCA_A_MASK;
0313 break;
0314 case GPIO_SYNC_VSYNC_A:
0315 info->offset = mmDC_GPIO_SYNCA_A;
0316 info->mask = DC_GPIO_SYNCA_A__DC_GPIO_VSYNCA_A_MASK;
0317 break;
0318 case GPIO_SYNC_HSYNC_B:
0319 case GPIO_SYNC_VSYNC_B:
0320 default:
0321 ASSERT_CRITICAL(false);
0322 result = false;
0323 }
0324 break;
0325 case GPIO_ID_GSL:
0326 switch (en) {
0327 case GPIO_GSL_GENLOCK_CLOCK:
0328 info->offset = mmDC_GPIO_GENLK_A;
0329 info->mask = DC_GPIO_GENLK_A__DC_GPIO_GENLK_CLK_A_MASK;
0330 break;
0331 case GPIO_GSL_GENLOCK_VSYNC:
0332 info->offset = mmDC_GPIO_GENLK_A;
0333 info->mask =
0334 DC_GPIO_GENLK_A__DC_GPIO_GENLK_VSYNC_A_MASK;
0335 break;
0336 case GPIO_GSL_SWAPLOCK_A:
0337 info->offset = mmDC_GPIO_GENLK_A;
0338 info->mask = DC_GPIO_GENLK_A__DC_GPIO_SWAPLOCK_A_A_MASK;
0339 break;
0340 case GPIO_GSL_SWAPLOCK_B:
0341 info->offset = mmDC_GPIO_GENLK_A;
0342 info->mask = DC_GPIO_GENLK_A__DC_GPIO_SWAPLOCK_B_A_MASK;
0343 break;
0344 default:
0345 ASSERT_CRITICAL(false);
0346 result = false;
0347 }
0348 break;
0349 case GPIO_ID_VIP_PAD:
0350 default:
0351 ASSERT_CRITICAL(false);
0352 result = false;
0353 }
0354
0355 if (result) {
0356 info->offset_y = info->offset + 2;
0357 info->offset_en = info->offset + 1;
0358 info->offset_mask = info->offset - 1;
0359
0360 info->mask_y = info->mask;
0361 info->mask_en = info->mask;
0362 info->mask_mask = info->mask;
0363 }
0364
0365 return result;
0366 }
0367
0368
0369 static const struct hw_translate_funcs funcs = {
0370 .offset_to_id = offset_to_id,
0371 .id_to_offset = id_to_offset,
0372 };
0373
0374
0375
0376
0377
0378
0379
0380
0381
0382
0383
0384 void dal_hw_translate_dce110_init(struct hw_translate *tr)
0385 {
0386 tr->funcs = &funcs;
0387 }