blob: c46ed187cfc95d167e4ad4d431057d751d4833ed [file] [log] [blame]
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (C) 2018 MediaTek Inc.
*
* Author: Light Hsieh <light.hsieh@mediatek.com>
*
*/
#include "pinctrl-mtk-mt6768.h"
#include "pinctrl-paris.h"
/* MT6768 have multiple bases to program pin configuration listed as the below:
* gpio:0x10005000, iocfg_lt:0x10002000, iocfg_lm:0x10002200,
* iocfg_lb:0x10002400, iocfg_bl:0x10002600, iocfg_rm:0x10002800,
* iocfg_rb:0x10002A00, iocfg_rt:0x10002C00, iocfg_tl:0x10002E00
* _i_based could be used to indicate what base the pin should be mapped into.
*/
#define PIN_FIELD_BASE(s_pin, e_pin, i_base, s_addr, x_addrs, s_bit, x_bits) \
PIN_FIELD_CALC(s_pin, e_pin, i_base, s_addr, x_addrs, s_bit, x_bits, \
32, 0)
#define PINS_FIELD_BASE(s_pin, e_pin, i_base, s_addr, x_addrs, s_bit, x_bits) \
PIN_FIELD_CALC(s_pin, e_pin, i_base, s_addr, x_addrs, s_bit, x_bits, \
32, 1)
static const struct mtk_pin_reg_calc mt6768_reg_cals[PINCTRL_PIN_REG_MAX] = {
[PINCTRL_PIN_REG_MODE] = MTK_RANGE(mt6768_pin_mode_range),
[PINCTRL_PIN_REG_DIR] = MTK_RANGE(mt6768_pin_dir_range),
[PINCTRL_PIN_REG_DI] = MTK_RANGE(mt6768_pin_di_range),
[PINCTRL_PIN_REG_DO] = MTK_RANGE(mt6768_pin_do_range),
[PINCTRL_PIN_REG_SR] = MTK_RANGE(mt6768_pin_dir_range),
[PINCTRL_PIN_REG_SMT] = MTK_RANGE(mt6768_pin_smt_range),
[PINCTRL_PIN_REG_IES] = MTK_RANGE(mt6768_pin_ies_range),
[PINCTRL_PIN_REG_PU] = MTK_RANGE(mt6768_pin_pu_range),
[PINCTRL_PIN_REG_PD] = MTK_RANGE(mt6768_pin_pd_range),
[PINCTRL_PIN_REG_DRV] = MTK_RANGE(mt6768_pin_drv_range),
[PINCTRL_PIN_REG_PUPD] = MTK_RANGE(mt6768_pin_pupd_range),
[PINCTRL_PIN_REG_R0] = MTK_RANGE(mt6768_pin_r0_range),
[PINCTRL_PIN_REG_R1] = MTK_RANGE(mt6768_pin_r1_range),
};
static const struct mtk_eint_hw mt6768_eint_hw = {
.port_mask = 7,
.ports = 6,
.ap_num = 212,
.db_cnt = 13,
};
static const struct mtk_pin_soc mt6768_data = {
.reg_cal = mt6768_reg_cals,
.pins = mtk_pins_mt6768,
.npins = ARRAY_SIZE(mtk_pins_mt6768),
.ngrps = ARRAY_SIZE(mtk_pins_mt6768),
.nfuncs = 8,
.eint_hw = &mt6768_eint_hw,
.gpio_m = 0,
.race_free_access = true,
.bias_set_combo = mtk_pinconf_bias_set_combo,
.bias_get_combo = mtk_pinconf_bias_get_combo,
.drive_set = mtk_pinconf_drive_set_direct_val,
.drive_get = mtk_pinconf_drive_get_direct_val,
};
static const struct of_device_id mt6768_pinctrl_of_match[] = {
{ .compatible = "mediatek,mt6768-pinctrl", },
{ }
};
static int mt6768_pinctrl_probe(struct platform_device *pdev)
{
return mtk_paris_pinctrl_probe(pdev, &mt6768_data);
}
static struct platform_driver mt6768_pinctrl_driver = {
.driver = {
.name = "mt6768-pinctrl",
.of_match_table = mt6768_pinctrl_of_match,
.pm = &mtk_eint_pm_ops_v2,
},
.probe = mt6768_pinctrl_probe,
};
static int __init mt6768_pinctrl_init(void)
{
return platform_driver_register(&mt6768_pinctrl_driver);
}
arch_initcall(mt6768_pinctrl_init);