162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) 2015 MediaTek Inc.
462306a36Sopenharmony_ci * Author: Hongzhou.Yang <hongzhou.yang@mediatek.com>
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <linux/init.h>
862306a36Sopenharmony_ci#include <linux/platform_device.h>
962306a36Sopenharmony_ci#include <linux/of.h>
1062306a36Sopenharmony_ci#include <linux/pinctrl/pinctrl.h>
1162306a36Sopenharmony_ci#include <linux/pinctrl/pinconf-generic.h>
1262306a36Sopenharmony_ci#include <linux/mfd/mt6397/core.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include "pinctrl-mtk-common.h"
1562306a36Sopenharmony_ci#include "pinctrl-mtk-mt6397.h"
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#define MT6397_PIN_REG_BASE  0xc000
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cistatic const struct mtk_pinctrl_devdata mt6397_pinctrl_data = {
2062306a36Sopenharmony_ci	.pins = mtk_pins_mt6397,
2162306a36Sopenharmony_ci	.npins = ARRAY_SIZE(mtk_pins_mt6397),
2262306a36Sopenharmony_ci	.dir_offset = (MT6397_PIN_REG_BASE + 0x000),
2362306a36Sopenharmony_ci	.ies_offset = MTK_PINCTRL_NOT_SUPPORT,
2462306a36Sopenharmony_ci	.smt_offset = MTK_PINCTRL_NOT_SUPPORT,
2562306a36Sopenharmony_ci	.pullen_offset = (MT6397_PIN_REG_BASE + 0x020),
2662306a36Sopenharmony_ci	.pullsel_offset = (MT6397_PIN_REG_BASE + 0x040),
2762306a36Sopenharmony_ci	.dout_offset = (MT6397_PIN_REG_BASE + 0x080),
2862306a36Sopenharmony_ci	.din_offset = (MT6397_PIN_REG_BASE + 0x0a0),
2962306a36Sopenharmony_ci	.pinmux_offset = (MT6397_PIN_REG_BASE + 0x0c0),
3062306a36Sopenharmony_ci	.type1_start = 41,
3162306a36Sopenharmony_ci	.type1_end = 41,
3262306a36Sopenharmony_ci	.port_shf = 3,
3362306a36Sopenharmony_ci	.port_mask = 0x3,
3462306a36Sopenharmony_ci	.port_align = 2,
3562306a36Sopenharmony_ci	.mode_mask = 0xf,
3662306a36Sopenharmony_ci	.mode_per_reg = 5,
3762306a36Sopenharmony_ci	.mode_shf = 4,
3862306a36Sopenharmony_ci};
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_cistatic int mt6397_pinctrl_probe(struct platform_device *pdev)
4162306a36Sopenharmony_ci{
4262306a36Sopenharmony_ci	struct mt6397_chip *mt6397;
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci	mt6397 = dev_get_drvdata(pdev->dev.parent);
4562306a36Sopenharmony_ci	return mtk_pctrl_init(pdev, &mt6397_pinctrl_data, mt6397->regmap);
4662306a36Sopenharmony_ci}
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_cistatic const struct of_device_id mt6397_pctrl_match[] = {
4962306a36Sopenharmony_ci	{ .compatible = "mediatek,mt6397-pinctrl", },
5062306a36Sopenharmony_ci	{ }
5162306a36Sopenharmony_ci};
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cistatic struct platform_driver mtk_pinctrl_driver = {
5462306a36Sopenharmony_ci	.probe = mt6397_pinctrl_probe,
5562306a36Sopenharmony_ci	.driver = {
5662306a36Sopenharmony_ci		.name = "mediatek-mt6397-pinctrl",
5762306a36Sopenharmony_ci		.of_match_table = mt6397_pctrl_match,
5862306a36Sopenharmony_ci	},
5962306a36Sopenharmony_ci};
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_cibuiltin_platform_driver(mtk_pinctrl_driver);
62