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