162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Device Tree support for Mediatek SoCs
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (c) 2014 MundoReader S.L.
662306a36Sopenharmony_ci * Author: Matthias Brugger <matthias.bgg@gmail.com>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci#include <linux/init.h>
962306a36Sopenharmony_ci#include <linux/io.h>
1062306a36Sopenharmony_ci#include <asm/mach/arch.h>
1162306a36Sopenharmony_ci#include <linux/of.h>
1262306a36Sopenharmony_ci#include <linux/of_clk.h>
1362306a36Sopenharmony_ci#include <linux/clocksource.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#define GPT6_CON_MT65xx 0x10008060
1762306a36Sopenharmony_ci#define GPT_ENABLE      0x31
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cistatic void __init mediatek_timer_init(void)
2062306a36Sopenharmony_ci{
2162306a36Sopenharmony_ci	void __iomem *gpt_base;
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci	if (of_machine_is_compatible("mediatek,mt6589") ||
2462306a36Sopenharmony_ci	    of_machine_is_compatible("mediatek,mt7623") ||
2562306a36Sopenharmony_ci	    of_machine_is_compatible("mediatek,mt8135") ||
2662306a36Sopenharmony_ci	    of_machine_is_compatible("mediatek,mt8127")) {
2762306a36Sopenharmony_ci		/* turn on GPT6 which ungates arch timer clocks */
2862306a36Sopenharmony_ci		gpt_base = ioremap(GPT6_CON_MT65xx, 0x04);
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci		/* enable clock and set to free-run */
3162306a36Sopenharmony_ci		writel(GPT_ENABLE, gpt_base);
3262306a36Sopenharmony_ci		iounmap(gpt_base);
3362306a36Sopenharmony_ci	}
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	of_clk_init(NULL);
3662306a36Sopenharmony_ci	timer_probe();
3762306a36Sopenharmony_ci};
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_cistatic const char * const mediatek_board_dt_compat[] = {
4062306a36Sopenharmony_ci	"mediatek,mt2701",
4162306a36Sopenharmony_ci	"mediatek,mt6589",
4262306a36Sopenharmony_ci	"mediatek,mt6592",
4362306a36Sopenharmony_ci	"mediatek,mt7623",
4462306a36Sopenharmony_ci	"mediatek,mt7629",
4562306a36Sopenharmony_ci	"mediatek,mt8127",
4662306a36Sopenharmony_ci	"mediatek,mt8135",
4762306a36Sopenharmony_ci	NULL,
4862306a36Sopenharmony_ci};
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ciDT_MACHINE_START(MEDIATEK_DT, "Mediatek Cortex-A7 (Device Tree)")
5162306a36Sopenharmony_ci	.dt_compat	= mediatek_board_dt_compat,
5262306a36Sopenharmony_ci	.init_time	= mediatek_timer_init,
5362306a36Sopenharmony_ciMACHINE_END
54