162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * arch/arm/mach-spear3xx/spear3xx.c
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * SPEAr3XX machines common source file
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Copyright (C) 2009-2012 ST Microelectronics
862306a36Sopenharmony_ci * Viresh Kumar <vireshk@kernel.org>
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#define pr_fmt(fmt) "SPEAr3xx: " fmt
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <linux/amba/pl022.h>
1462306a36Sopenharmony_ci#include <linux/amba/pl080.h>
1562306a36Sopenharmony_ci#include <linux/clk.h>
1662306a36Sopenharmony_ci#include <linux/clk/spear.h>
1762306a36Sopenharmony_ci#include <linux/io.h>
1862306a36Sopenharmony_ci#include <asm/mach/map.h>
1962306a36Sopenharmony_ci#include "pl080.h"
2062306a36Sopenharmony_ci#include "generic.h"
2162306a36Sopenharmony_ci#include "spear.h"
2262306a36Sopenharmony_ci#include "misc_regs.h"
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci/* ssp device registration */
2562306a36Sopenharmony_cistruct pl022_ssp_controller pl022_plat_data = {
2662306a36Sopenharmony_ci	.bus_id = 0,
2762306a36Sopenharmony_ci	.enable_dma = 1,
2862306a36Sopenharmony_ci	.dma_filter = pl08x_filter_id,
2962306a36Sopenharmony_ci	.dma_tx_param = "ssp0_tx",
3062306a36Sopenharmony_ci	.dma_rx_param = "ssp0_rx",
3162306a36Sopenharmony_ci};
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci/* dmac device registration */
3462306a36Sopenharmony_cistruct pl08x_platform_data pl080_plat_data = {
3562306a36Sopenharmony_ci	.memcpy_burst_size = PL08X_BURST_SZ_16,
3662306a36Sopenharmony_ci	.memcpy_bus_width = PL08X_BUS_WIDTH_32_BITS,
3762306a36Sopenharmony_ci	.memcpy_prot_buff = true,
3862306a36Sopenharmony_ci	.memcpy_prot_cache = true,
3962306a36Sopenharmony_ci	.lli_buses = PL08X_AHB1,
4062306a36Sopenharmony_ci	.mem_buses = PL08X_AHB1,
4162306a36Sopenharmony_ci	.get_xfer_signal = pl080_get_signal,
4262306a36Sopenharmony_ci	.put_xfer_signal = pl080_put_signal,
4362306a36Sopenharmony_ci};
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci/*
4662306a36Sopenharmony_ci * Following will create 16MB static virtual/physical mappings
4762306a36Sopenharmony_ci * PHYSICAL		VIRTUAL
4862306a36Sopenharmony_ci * 0xD0000000		0xFD000000
4962306a36Sopenharmony_ci * 0xFC000000		0xFC000000
5062306a36Sopenharmony_ci */
5162306a36Sopenharmony_cistruct map_desc spear3xx_io_desc[] __initdata = {
5262306a36Sopenharmony_ci	{
5362306a36Sopenharmony_ci		.virtual	= (unsigned long)VA_SPEAR_ICM1_2_BASE,
5462306a36Sopenharmony_ci		.pfn		= __phys_to_pfn(SPEAR_ICM1_2_BASE),
5562306a36Sopenharmony_ci		.length		= SZ_16M,
5662306a36Sopenharmony_ci		.type		= MT_DEVICE
5762306a36Sopenharmony_ci	}, {
5862306a36Sopenharmony_ci		.virtual	= (unsigned long)VA_SPEAR_ICM3_SMI_CTRL_BASE,
5962306a36Sopenharmony_ci		.pfn		= __phys_to_pfn(SPEAR_ICM3_SMI_CTRL_BASE),
6062306a36Sopenharmony_ci		.length		= SZ_16M,
6162306a36Sopenharmony_ci		.type		= MT_DEVICE
6262306a36Sopenharmony_ci	},
6362306a36Sopenharmony_ci};
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci/* This will create static memory mapping for selected devices */
6662306a36Sopenharmony_civoid __init spear3xx_map_io(void)
6762306a36Sopenharmony_ci{
6862306a36Sopenharmony_ci	iotable_init(spear3xx_io_desc, ARRAY_SIZE(spear3xx_io_desc));
6962306a36Sopenharmony_ci}
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_civoid __init spear3xx_timer_init(void)
7262306a36Sopenharmony_ci{
7362306a36Sopenharmony_ci	char pclk_name[] = "pll3_clk";
7462306a36Sopenharmony_ci	struct clk *gpt_clk, *pclk;
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci	spear3xx_clk_init(MISC_BASE, VA_SPEAR320_SOC_CONFIG_BASE);
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci	/* get the system timer clock */
7962306a36Sopenharmony_ci	gpt_clk = clk_get_sys("gpt0", NULL);
8062306a36Sopenharmony_ci	if (IS_ERR(gpt_clk)) {
8162306a36Sopenharmony_ci		pr_err("%s:couldn't get clk for gpt\n", __func__);
8262306a36Sopenharmony_ci		BUG();
8362306a36Sopenharmony_ci	}
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci	/* get the suitable parent clock for timer*/
8662306a36Sopenharmony_ci	pclk = clk_get(NULL, pclk_name);
8762306a36Sopenharmony_ci	if (IS_ERR(pclk)) {
8862306a36Sopenharmony_ci		pr_err("%s:couldn't get %s as parent for gpt\n",
8962306a36Sopenharmony_ci				__func__, pclk_name);
9062306a36Sopenharmony_ci		BUG();
9162306a36Sopenharmony_ci	}
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci	clk_set_parent(gpt_clk, pclk);
9462306a36Sopenharmony_ci	clk_put(gpt_clk);
9562306a36Sopenharmony_ci	clk_put(pclk);
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci	spear_setup_of_timer();
9862306a36Sopenharmony_ci}
99