// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2023 Rockchip Electronics Co., Ltd. * * Author: Steven Liu */ #include "pinctrl_rkx110_x120.h" /********************* Private MACRO Definition ******************************/ #define _PINCTRL_GENMASK(w) ((1U << (w)) - 1U) #define _PINCTRL_OFFSET(gp, w) ((gp) * (w)) #define _PINCTRL_GENVAL(gp, v, w) ((_PINCTRL_GENMASK(w) << (_PINCTRL_OFFSET(gp, w) + 16)) \ | (((v) & _PINCTRL_GENMASK(w)) << _PINCTRL_OFFSET(gp, w))) #define RKX110_GRF_BASE 0x00010000U #define RKX120_GRF_BASE 0x01010000U #define RKX110_GRF_REG(x) ((x) + RKX110_GRF_BASE) #define RKX120_GRF_REG(x) ((x) + RKX120_GRF_BASE) /************************** SER_GRF Register Define ***************************/ #define RKX110_GRF_GPIO0A_IOMUX_L RKX110_GRF_REG(0x0000) #define RKX110_GRF_GPIO0A_IOMUX_H RKX110_GRF_REG(0x0004) #define RKX110_GRF_GPIO0B_IOMUX_L RKX110_GRF_REG(0x0008) #define RKX110_GRF_GPIO0B_IOMUX_H RKX110_GRF_REG(0x000c) #define RKX110_GRF_GPIO0C_IOMUX_L RKX110_GRF_REG(0x0010) #define RKX110_GRF_GPIO0C_IOMUX_H RKX110_GRF_REG(0x0014) #define RKX110_GRF_GPIO0A_P RKX110_GRF_REG(0x0020) #define RKX110_GRF_GPIO0B_P RKX110_GRF_REG(0x0024) #define RKX110_GRF_GPIO0C_P RKX110_GRF_REG(0x0028) #define RKX110_GRF_GPIO1A_IOMUX RKX110_GRF_REG(0x0080) #define RKX110_GRF_GPIO1B_IOMUX RKX110_GRF_REG(0x0084) #define RKX110_GRF_GPIO1C_IOMUX RKX110_GRF_REG(0x0088) #define RKX110_GRF_GPIO1A_P RKX110_GRF_REG(0x0090) #define RKX110_GRF_GPIO1B_P RKX110_GRF_REG(0x0094) #define RKX110_GRF_GPIO1C_P RKX110_GRF_REG(0x0098) #define RKX110_GRF_GPIO1A_SMT RKX110_GRF_REG(0x00A0) #define RKX110_GRF_GPIO1B_SMT RKX110_GRF_REG(0x00A4) #define RKX110_GRF_GPIO1C_SMT RKX110_GRF_REG(0x00A8) #define RKX110_GRF_GPIO1A_E RKX110_GRF_REG(0x00B0) #define RKX110_GRF_GPIO1B_E RKX110_GRF_REG(0x00B4) #define RKX110_GRF_GPIO1C_E RKX110_GRF_REG(0x00B8) #define RKX110_GRF_GPIO1A_IE RKX110_GRF_REG(0x00C0) #define RKX110_GRF_GPIO1B_IE RKX110_GRF_REG(0x00C4) #define RKX110_GRF_GPIO1C_IE RKX110_GRF_REG(0x00C8) /************************** DES_GRF Register Define ***************************/ #define RKX120_GRF_GPIO0A_IOMUX_L RKX120_GRF_REG(0x0000) #define RKX120_GRF_GPIO0A_IOMUX_H RKX120_GRF_REG(0x0004) #define RKX120_GRF_GPIO0B_IOMUX_L RKX120_GRF_REG(0x0008) #define RKX120_GRF_GPIO0B_IOMUX_H RKX120_GRF_REG(0x000C) #define RKX120_GRF_GPIO0C_IOMUX_L RKX120_GRF_REG(0x0010) #define RKX120_GRF_GPIO0C_IOMUX_H RKX120_GRF_REG(0x0014) #define RKX120_GRF_GPIO0A_P RKX120_GRF_REG(0x0020) #define RKX120_GRF_GPIO0B_P RKX120_GRF_REG(0x0024) #define RKX120_GRF_GPIO0C_P RKX120_GRF_REG(0x0028) #define RKX120_GRF_GPIO1A_IOMUX RKX120_GRF_REG(0x0080) #define RKX120_GRF_GPIO1B_IOMUX RKX120_GRF_REG(0x0084) #define RKX120_GRF_GPIO1C_IOMUX RKX120_GRF_REG(0x0088) #define RKX120_GRF_GPIO1A_P RKX120_GRF_REG(0x0090) #define RKX120_GRF_GPIO1B_P RKX120_GRF_REG(0x0094) #define RKX120_GRF_GPIO1C_P RKX120_GRF_REG(0x0098) #define RKX120_GRF_GPIO1A_SMT RKX120_GRF_REG(0x00A0) #define RKX120_GRF_GPIO1B_SMT RKX120_GRF_REG(0x00A4) #define RKX120_GRF_GPIO1C_SMT RKX120_GRF_REG(0x00A8) #define RKX120_GRF_GPIO1A_E RKX120_GRF_REG(0x00B0) #define RKX120_GRF_GPIO1B_E RKX120_GRF_REG(0x00B4) #define RKX120_GRF_GPIO1C_E RKX120_GRF_REG(0x00B8) #define RKX120_GRF_GPIO1A_IE RKX120_GRF_REG(0x00C0) #define RKX120_GRF_GPIO1B_IE RKX120_GRF_REG(0x00C4) #define RKX120_GRF_GPIO1C_IE RKX120_GRF_REG(0x00C8) #define IOMUX_3_BIT_PER_PIN (3) #define IOMUX_PER_REG (8) #define RKX110_IOMUX_L(__B, __G) (RKX110_GRF_GPIO##__B##__G##_IOMUX_L) #define RKX110_IOMUX_H(__B, __G) (RKX110_GRF_GPIO##__B##__G##_IOMUX_H) #define RKX110_SET_IOMUX_L(_HW, _B, _G, _GP, _V, _W) \ { \ HAL_PINCTRL_Write(_HW, RKX110_IOMUX_L(_B, _G), _PINCTRL_GENVAL(_GP, _V, _W)); \ } #define RKX110_SET_IOMUX_H(_HW, _B, _G, _GP, _V, _W) \ { \ HAL_PINCTRL_Write(_HW, RKX110_IOMUX_H(_B, _G), _PINCTRL_GENVAL(_GP, _V, _W)); \ } #define HAL_RKX110_SET_IOMUX_L(HW, B, G, BP, V) \ RKX110_SET_IOMUX_L(HW, B, G, BP % IOMUX_PER_REG, V, IOMUX_3_BIT_PER_PIN) #define HAL_RKX110_SET_IOMUX_H(HW, B, G, BP, V) \ RKX110_SET_IOMUX_H(HW, B, G, (BP % IOMUX_PER_REG - 5), V, IOMUX_3_BIT_PER_PIN) #define RKX120_IOMUX_L(__B, __G) (RKX120_GRF_GPIO##__B##__G##_IOMUX_L) #define RKX120_IOMUX_H(__B, __G) (RKX120_GRF_GPIO##__B##__G##_IOMUX_H) #define RKX120_SET_IOMUX_L(_HW, _B, _G, _GP, _V, _W) \ { \ HAL_PINCTRL_Write(_HW, RKX120_IOMUX_L(_B, _G), _PINCTRL_GENVAL(_GP, _V, _W)); \ } #define RKX120_SET_IOMUX_H(_HW, _B, _G, _GP, _V, _W) \ { \ HAL_PINCTRL_Write(_HW, RKX120_IOMUX_H(_B, _G), _PINCTRL_GENVAL(_GP, _V, _W)); \ } #define HAL_RKX120_SET_IOMUX_L(HW, B, G, BP, V) \ RKX120_SET_IOMUX_L(HW, B, G, BP % IOMUX_PER_REG, V, IOMUX_3_BIT_PER_PIN) #define HAL_RKX120_SET_IOMUX_H(HW, B, G, BP, V) \ RKX120_SET_IOMUX_H(HW, B, G, (BP % IOMUX_PER_REG - 5), V, IOMUX_3_BIT_PER_PIN) #define IOMUX_2_BIT_PER_PIN (2) #define IOMUX_8_PIN_PER_REG (8) #define RKX110_IOMUX_0(__B, __G) (RKX110_GRF_GPIO##__B##__G##_IOMUX) #define RKX110_SET_IOMUX_0(_HW, _B, _G, _GP, _V, _W) \ { \ HAL_PINCTRL_Write(_HW, RKX110_IOMUX_0(_B, _G), _PINCTRL_GENVAL(_GP, _V, _W)); \ } #define HAL_RKX110_SET_IOMUX_0(HW, B, G, BP, V) \ RKX110_SET_IOMUX_0(HW, B, G, BP % IOMUX_8_PIN_PER_REG, V, IOMUX_2_BIT_PER_PIN) #define RKX120_IOMUX_0(__B, __G) (RKX120_GRF_GPIO##__B##__G##_IOMUX) #define RKX120_SET_IOMUX_0(_HW, _B, _G, _GP, _V, _W) \ { \ HAL_PINCTRL_Write(_HW, RKX120_IOMUX_0(_B, _G), _PINCTRL_GENVAL(_GP, _V, _W)); \ } #define HAL_RKX120_SET_IOMUX_0(HW, B, G, BP, V) \ RKX120_SET_IOMUX_0(HW, B, G, BP % IOMUX_8_PIN_PER_REG, V, IOMUX_2_BIT_PER_PIN) #define PULL_2_BIT_PER_PIN (2) #define PULL_8_PIN_PER_REG (8) #define RKX110_PULL_0(__B, __G) (RKX110_GRF_GPIO##__B##__G##_P) #define RKX110_SET_PULL_0(_HW, _B, _G, _GP, _V, _W) \ { \ HAL_PINCTRL_Write(_HW, RKX110_PULL_0(_B, _G), _PINCTRL_GENVAL(_GP, _V, _W)); \ } #define HAL_RKX110_SET_PULL_0(HW, B, G, BP, V) \ RKX110_SET_PULL_0(HW, B, G, BP % PULL_8_PIN_PER_REG, V, PULL_2_BIT_PER_PIN) #define RKX120_PULL_0(__B, __G) (RKX120_GRF_GPIO##__B##__G##_P) #define RKX120_SET_PULL_0(_HW, _B, _G, _GP, _V, _W) \ { \ HAL_PINCTRL_Write(_HW, RKX120_PULL_0(_B, _G), _PINCTRL_GENVAL(_GP, _V, _W)); \ } #define HAL_RKX120_SET_PULL_0(HW, B, G, BP, V) \ RKX120_SET_PULL_0(HW, B, G, BP % PULL_8_PIN_PER_REG, V, PULL_2_BIT_PER_PIN) #define PULLEN_1_BIT_PER_PIN (1) #define PULLEN_8_PIN_PER_REG (8) #define RKX110_PULLEN_0(__B, __G) (RKX110_GRF_GPIO##__B##__G##_P) #define RKX110_SET_PULLEN_0(_HW, _B, _G, _GP, _V, _W) \ { \ HAL_PINCTRL_Write(_HW, RKX110_PULLEN_0(_B, _G), _PINCTRL_GENVAL(_GP, _V, _W)); \ } #define HAL_RKX110_SET_PULLEN_0(HW, B, G, BP, V) \ RKX110_SET_PULLEN_0(HW, B, G, BP % PULLEN_8_PIN_PER_REG, V, PULLEN_1_BIT_PER_PIN) #define RKX120_PULLEN_0(__B, __G) (RKX120_GRF_GPIO##__B##__G##_P) #define RKX120_SET_PULLEN_0(_HW, _B, _G, _GP, _V, _W) \ { \ HAL_PINCTRL_Write(_HW, RKX120_PULLEN_0(_B, _G), _PINCTRL_GENVAL(_GP, _V, _W)); \ } #define HAL_RKX120_SET_PULLEN_0(HW, B, G, BP, V) \ RKX120_SET_PULLEN_0(HW, B, G, BP % PULLEN_8_PIN_PER_REG, V, PULLEN_1_BIT_PER_PIN) #define DRV_2_BIT_PER_PIN (2) #define DRV_8_PIN_PER_REG (8) #define RKX110_DRV_0(__B, __G) (RKX110_GRF_GPIO##__B##__G##_E) #define RKX110_SET_DRV_0(_HW, _B, _G, _GP, _V, _W) \ { \ HAL_PINCTRL_Write(_HW, RKX110_DRV_0(_B, _G), _PINCTRL_GENVAL(_GP, _V, _W)); \ } #define HAL_RKX110_SET_DRV_0(HW, B, G, BP, V) \ RKX110_SET_DRV_0(HW, B, G, BP % DRV_8_PIN_PER_REG, V, DRV_2_BIT_PER_PIN) #define RKX120_DRV_0(__B, __G) (RKX120_GRF_GPIO##__B##__G##_E) #define RKX120_SET_DRV_0(_HW, _B, _G, _GP, _V, _W) \ { \ HAL_PINCTRL_Write(_HW, RKX120_DRV_0(_B, _G), _PINCTRL_GENVAL(_GP, _V, _W)); \ } #define HAL_RKX120_SET_DRV_0(HW, B, G, BP, V) \ RKX120_SET_DRV_0(HW, B, G, BP % DRV_8_PIN_PER_REG, V, DRV_2_BIT_PER_PIN) #define SMT_1_BIT_PER_PIN (1) #define SMT_8_PIN_PER_REG (8) #define RKX110_SMT_0(__B, __G) (RKX110_GRF_GPIO##__B##__G##_SMT) #define RKX110_SET_SMT_0(_HW, _B, _G, _GP, _V, _W) \ { \ HAL_PINCTRL_Write(_HW, RKX110_SMT_0(_B, _G), _PINCTRL_GENVAL(_GP, _V, _W)); \ } #define HAL_RKX110_SET_SMT_0(HW, B, G, BP, V) \ RKX110_SET_SMT_0(HW, B, G, BP % SMT_8_PIN_PER_REG, V, SMT_1_BIT_PER_PIN) #define RKX120_SMT_0(__B, __G) (RKX120_GRF_GPIO##__B##__G##_SMT) #define RKX120_SET_SMT_0(_HW, _B, _G, _GP, _V, _W) \ { \ HAL_PINCTRL_Write(_HW, RKX120_SMT_0(_B, _G), _PINCTRL_GENVAL(_GP, _V, _W)); \ } #define HAL_RKX120_SET_SMT_0(HW, B, G, BP, V) \ RKX120_SET_SMT_0(HW, B, G, BP % SMT_8_PIN_PER_REG, V, SMT_1_BIT_PER_PIN) /********************* Private Function Definition ***************************/ static HAL_Status RKX110_PINCTRL_SetIOMUX(struct hwpin *hw, uint8_t pin, uint32_t val) { switch (hw->bank) { case 0: if (pin < 5) { HAL_RKX110_SET_IOMUX_L(hw, 0, A, pin, val); } else if (pin < 8) { HAL_RKX110_SET_IOMUX_H(hw, 0, A, pin, val); } else if (pin < 13) { HAL_RKX110_SET_IOMUX_L(hw, 0, B, pin, val); } else if (pin < 16) { HAL_RKX110_SET_IOMUX_H(hw, 0, B, pin, val); } else if (pin < 21) { HAL_RKX110_SET_IOMUX_L(hw, 0, C, pin, val); } else if (pin < 24) { HAL_RKX110_SET_IOMUX_H(hw, 0, C, pin, val); } else { HAL_ERR("PINCTRL: iomux unknown gpio pin-%d\n", pin); } break; case 1: if (pin < 8) { HAL_RKX110_SET_IOMUX_0(hw, 1, A, pin, val); } else if (pin < 16) { HAL_RKX110_SET_IOMUX_0(hw, 1, B, pin, val); } else if (pin < 24) { HAL_RKX110_SET_IOMUX_0(hw, 1, C, pin, val); } else { HAL_ERR("PINCTRL: iomux unknown gpio pin-%d\n", pin); } break; default: HAL_ERR("PINCTRL: iomux unknown gpio bank-%d\n", hw->bank); break; } return HAL_OK; } static HAL_Status RKX110_PINCTRL_SetPULL(struct hwpin *hw, uint8_t pin, uint32_t val) { switch (hw->bank) { case 1: if (pin < 8) { HAL_RKX110_SET_PULL_0(hw, 1, A, pin, val); } else if (pin < 16) { HAL_RKX110_SET_PULL_0(hw, 1, B, pin, val); } else if (pin < 24) { HAL_RKX110_SET_PULL_0(hw, 1, C, pin, val); } else { HAL_ERR("PINCTRL: pull unknown gpio pin-%d\n", pin); } break; default: HAL_ERR("PINCTRL: pull unknown gpio bank-%d\n", hw->bank); break; } return HAL_OK; } static HAL_Status RKX110_PINCTRL_SetPULLEN(struct hwpin *hw, uint8_t pin, uint32_t val) { switch (hw->bank) { case 0: if (pin < 8) { HAL_RKX110_SET_PULLEN_0(hw, 0, A, pin, val); } else if (pin < 16) { HAL_RKX110_SET_PULLEN_0(hw, 0, B, pin, val); } else if (pin < 24) { HAL_RKX110_SET_PULLEN_0(hw, 0, C, pin, val); } else { HAL_ERR("PINCTRL: pull enable unknown gpio pin-%d\n", pin); } break; default: HAL_ERR("PINCTRL: pull enable unknown gpio bank-%d\n", hw->bank); break; } return HAL_OK; } static HAL_Status RKX110_PINCTRL_SetDRV(struct hwpin *hw, uint8_t pin, uint32_t val) { switch (hw->bank) { case 1: if (pin < 8) { HAL_RKX110_SET_DRV_0(hw, 1, A, pin, val); } else if (pin < 16) { HAL_RKX110_SET_DRV_0(hw, 1, B, pin, val); } else if (pin < 24) { HAL_RKX110_SET_DRV_0(hw, 1, C, pin, val); } else { HAL_ERR("PINCTRL: drive strengh unknown gpio pin-%d\n", pin); } break; default: HAL_ERR("PINCTRL: drive strengh gpio bank-%d\n", hw->bank); break; } return HAL_OK; } static HAL_Status RKX110_PINCTRL_SetSMT(struct hwpin *hw, uint8_t pin, uint32_t val) { switch (hw->bank) { case 1: if (pin < 8) { HAL_RKX110_SET_SMT_0(hw, 1, A, pin, val); } else if (pin < 16) { HAL_RKX110_SET_SMT_0(hw, 1, B, pin, val); } else if (pin < 24) { HAL_RKX110_SET_SMT_0(hw, 1, C, pin, val); } else { HAL_ERR("PINCTRL: smt gpio pin-%d\n", pin); } break; default: HAL_ERR("PINCTRL: smt gpio bank-%d\n", hw->bank); break; } return HAL_OK; } static HAL_Status RKX120_PINCTRL_SetIOMUX(struct hwpin *hw, uint8_t pin, uint32_t val) { switch (hw->bank) { case 5: if (pin < 5) { HAL_RKX120_SET_IOMUX_L(hw, 0, A, pin, val); } else if (pin < 8) { HAL_RKX120_SET_IOMUX_H(hw, 0, A, pin, val); } else if (pin < 13) { HAL_RKX120_SET_IOMUX_L(hw, 0, B, pin, val); } else if (pin < 16) { HAL_RKX120_SET_IOMUX_H(hw, 0, B, pin, val); } else if (pin < 21) { HAL_RKX120_SET_IOMUX_L(hw, 0, C, pin, val); } else if (pin < 24) { HAL_RKX120_SET_IOMUX_H(hw, 0, C, pin, val); } else { HAL_ERR("PINCTRL: iomux unknown gpio pin-%d\n", pin); } break; case 6: if (pin < 8) { HAL_RKX120_SET_IOMUX_0(hw, 1, A, pin, val); } else if (pin < 16) { HAL_RKX120_SET_IOMUX_0(hw, 1, B, pin, val); } else if (pin < 24) { HAL_RKX120_SET_IOMUX_0(hw, 1, C, pin, val); } else { HAL_ERR("PINCTRL: iomux unknown gpio pin-%d\n", pin); } break; default: HAL_ERR("PINCTRL: iomux unknown gpio bank-%d\n", hw->bank); break; } return HAL_OK; } static HAL_Status RKX120_PINCTRL_SetPULL(struct hwpin *hw, uint8_t pin, uint32_t val) { switch (hw->bank) { case 6: if (pin < 8) { HAL_RKX120_SET_PULL_0(hw, 1, A, pin, val); } else if (pin < 16) { HAL_RKX120_SET_PULL_0(hw, 1, B, pin, val); } else if (pin < 24) { HAL_RKX120_SET_PULL_0(hw, 1, C, pin, val); } else { HAL_ERR("PINCTRL: pull unknown gpio pin-%d\n", pin); } break; default: HAL_ERR("PINCTRL: pull unknown gpio bank-%d\n", hw->bank); break; } return HAL_OK; } static HAL_Status RKX120_PINCTRL_SetPULLEN(struct hwpin *hw, uint8_t pin, uint32_t val) { switch (hw->bank) { case 5: if (pin < 8) { HAL_RKX120_SET_PULLEN_0(hw, 0, A, pin, val); } else if (pin < 16) { HAL_RKX120_SET_PULLEN_0(hw, 0, B, pin, val); } else if (pin < 24) { HAL_RKX120_SET_PULLEN_0(hw, 0, C, pin, val); } else { HAL_ERR("PINCTRL: pull enable unknown gpio pin-%d\n", pin); } break; default: HAL_ERR("PINCTRL: pull enable unknown gpio bank-%d\n", hw->bank); break; } return HAL_OK; } static HAL_Status RKX120_PINCTRL_SetDRV(struct hwpin *hw, uint8_t pin, uint32_t val) { switch (hw->bank) { case 6: if (pin < 8) { HAL_RKX120_SET_DRV_0(hw, 1, A, pin, val); } else if (pin < 16) { HAL_RKX120_SET_DRV_0(hw, 1, B, pin, val); } else if (pin < 24) { HAL_RKX120_SET_DRV_0(hw, 1, C, pin, val); } else { HAL_ERR("PINCTRL: drive strengh unknown gpio pin-%d\n", pin); } break; default: HAL_ERR("PINCTRL: drive strengh gpio bank-%d\n", hw->bank); break; } return HAL_OK; } static HAL_Status RKX120_PINCTRL_SetSMT(struct hwpin *hw, uint8_t pin, uint32_t val) { switch (hw->bank) { case 6: if (pin < 8) { HAL_RKX120_SET_SMT_0(hw, 1, A, pin, val); } else if (pin < 16) { HAL_RKX120_SET_SMT_0(hw, 1, B, pin, val); } else if (pin < 24) { HAL_RKX120_SET_SMT_0(hw, 1, C, pin, val); } else { HAL_ERR("PINCTRL: smt gpio pin-%d\n", pin); } break; default: HAL_ERR("PINCTRL: smt gpio bank-%d\n", hw->bank); break; } return HAL_OK; } static HAL_Status PINCTRL_SetPinParam(struct hwpin *hw, uint8_t pin, uint32_t param) { HAL_Status rc = HAL_OK; uint8_t val; if (hw->type == PIN_RKX110) { if (param & RK_SERDES_FLAG_MUX) { val = (param & RK_SERDES_MASK_MUX) >> RK_SERDES_SHIFT_MUX; rc |= RKX110_PINCTRL_SetIOMUX(hw, pin, val); } if (param & RK_SERDES_FLAG_PUL) { val = (param & RK_SERDES_MASK_PUL) >> RK_SERDES_SHIFT_PUL; rc |= RKX110_PINCTRL_SetPULL(hw, pin, val); } if (param & RK_SERDES_FLAG_PEN) { val = (param & RK_SERDES_MASK_PEN) >> RK_SERDES_SHIFT_PEN; rc |= RKX110_PINCTRL_SetPULLEN(hw, pin, val); } if (param & RK_SERDES_FLAG_DRV) { val = (param & RK_SERDES_MASK_DRV) >> RK_SERDES_SHIFT_DRV; rc |= RKX110_PINCTRL_SetDRV(hw, pin, val); } if (param & RK_SERDES_FLAG_SMT) { val = (param & RK_SERDES_MASK_SMT) >> RK_SERDES_SHIFT_SMT; rc |= RKX110_PINCTRL_SetSMT(hw, pin, val); } } else if (hw->type == PIN_RKX120) { if (param & RK_SERDES_FLAG_MUX) { val = (param & RK_SERDES_MASK_MUX) >> RK_SERDES_SHIFT_MUX; rc |= RKX120_PINCTRL_SetIOMUX(hw, pin, val); } if (param & RK_SERDES_FLAG_PUL) { val = (param & RK_SERDES_MASK_PUL) >> RK_SERDES_SHIFT_PUL; rc |= RKX120_PINCTRL_SetPULL(hw, pin, val); } if (param & RK_SERDES_FLAG_PEN) { val = (param & RK_SERDES_MASK_PEN) >> RK_SERDES_SHIFT_PEN; rc |= RKX120_PINCTRL_SetPULLEN(hw, pin, val); } if (param & RK_SERDES_FLAG_DRV) { val = (param & RK_SERDES_MASK_DRV) >> RK_SERDES_SHIFT_DRV; rc |= RKX120_PINCTRL_SetDRV(hw, pin, val); } if (param & RK_SERDES_FLAG_SMT) { val = (param & RK_SERDES_MASK_SMT) >> RK_SERDES_SHIFT_SMT; rc |= RKX120_PINCTRL_SetSMT(hw, pin, val); } } else { HAL_ERR("PINCTRL: error pin type %d\n", hw->type); } return rc; } /********************* Public Function Definition ***************************/ uint32_t HAL_PINCTRL_Read(struct hwpin *hw, uint32_t reg) { uint32_t val; int ret; ret = hw->xfer.read(hw->xfer.client, reg, &val); if (ret) { HAL_ERR("%s: read reg=0x%08x failed, ret=%d\n", hw->name, reg, ret); } HAL_DBG("%s: %s: reg=0x%08x, val=0x%08x\n", __func__, hw->name, reg, val); return val; } uint32_t HAL_PINCTRL_Write(struct hwpin *hw, uint32_t reg, uint32_t val) { int ret; HAL_DBG("%s: %s: reg=0x%08x, val=0x%08x\n", __func__, hw->name, reg, val); ret = hw->xfer.write(hw->xfer.client, reg, val); if (ret) { HAL_ERR("%s: write reg=0x%08x, val=0x%08x failed, ret=%d\n", hw->name, reg, val, ret); } return ret; } HAL_Status HAL_PINCTRL_Init(void) { return HAL_OK; } HAL_Status HAL_PINCTRL_SetParam(struct hwpin *hw, uint32_t mPins, uint32_t param) { uint8_t pin; HAL_Status rc; if (!(param & (RK_SERDES_FLAG_MUX | RK_SERDES_FLAG_PUL | RK_SERDES_FLAG_PEN | RK_SERDES_FLAG_DRV | RK_SERDES_FLAG_SMT))) { HAL_ERR("PINCTRL: no parameter!\n"); return HAL_ERROR; } for (pin = 0; pin < 32; pin++) { if (mPins & (1 << pin)) { rc = PINCTRL_SetPinParam(hw, pin, param); if (rc) { return rc; } } } return HAL_OK; } HAL_Status HAL_PINCTRL_SetIOMUX(struct hwpin *hw, uint32_t mPins, uint32_t param) { return HAL_PINCTRL_SetParam(hw, mPins, param); }