Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * Copyright 2013-15 Advanced Micro Devices, Inc.
0003  *
0004  * Permission is hereby granted, free of charge, to any person obtaining a
0005  * copy of this software and associated documentation files (the "Software"),
0006  * to deal in the Software without restriction, including without limitation
0007  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
0008  * and/or sell copies of the Software, and to permit persons to whom the
0009  * Software is furnished to do so, subject to the following conditions:
0010  *
0011  * The above copyright notice and this permission notice shall be included in
0012  * all copies or substantial portions of the Software.
0013  *
0014  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
0015  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
0016  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
0017  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
0018  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
0019  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
0020  * OTHER DEALINGS IN THE SOFTWARE.
0021  *
0022  * Authors: AMD
0023  *
0024  */
0025 
0026 /*
0027  * Pre-requisites: headers required by header of this unit
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     /* GENERIC */
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     /* HPD */
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     /* SYNCA */
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     /* mmDC_GPIO_GENLK_MASK */
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     /* DDC */
0140     /* we don't care about the GPIO_ID for DDC
0141      * in DdcHandle it will use GPIO_ID_DDC_DATA/GPIO_ID_DDC_CLOCK
0142      * directly in the create method */
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     /* GPIO_I2CPAD */
0165     case mmDC_GPIO_I2CPAD_A:
0166         *en = GPIO_DDC_LINE_I2C_PAD;
0167         return true;
0168     /* Not implemented */
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     /* UNEXPECTED */
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 /* function table */
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  * dal_hw_translate_dce110_init
0376  *
0377  * @brief
0378  * Initialize Hw translate function pointers.
0379  *
0380  * @param
0381  * struct hw_translate *tr - [out] struct of function pointers
0382  *
0383  */
0384 void dal_hw_translate_dce110_init(struct hw_translate *tr)
0385 {
0386     tr->funcs = &funcs;
0387 }