162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * arch/arm/mach-dove/common.c 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Core functions for Marvell Dove 88AP510 System On Chip 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/clk-provider.h> 962306a36Sopenharmony_ci#include <linux/dma-mapping.h> 1062306a36Sopenharmony_ci#include <linux/init.h> 1162306a36Sopenharmony_ci#include <linux/io.h> 1262306a36Sopenharmony_ci#include <linux/platform_data/dma-mv_xor.h> 1362306a36Sopenharmony_ci#include <linux/platform_data/usb-ehci-orion.h> 1462306a36Sopenharmony_ci#include <linux/platform_device.h> 1562306a36Sopenharmony_ci#include <linux/soc/dove/pmu.h> 1662306a36Sopenharmony_ci#include <asm/hardware/cache-tauros2.h> 1762306a36Sopenharmony_ci#include <asm/mach/arch.h> 1862306a36Sopenharmony_ci#include <asm/mach/map.h> 1962306a36Sopenharmony_ci#include <asm/mach/time.h> 2062306a36Sopenharmony_ci#include <plat/common.h> 2162306a36Sopenharmony_ci#include <plat/irq.h> 2262306a36Sopenharmony_ci#include <plat/time.h> 2362306a36Sopenharmony_ci#include "bridge-regs.h" 2462306a36Sopenharmony_ci#include "pm.h" 2562306a36Sopenharmony_ci#include "common.h" 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci/* These can go away once Dove uses the mvebu-mbus DT binding */ 2862306a36Sopenharmony_ci#define DOVE_MBUS_PCIE0_MEM_TARGET 0x4 2962306a36Sopenharmony_ci#define DOVE_MBUS_PCIE0_MEM_ATTR 0xe8 3062306a36Sopenharmony_ci#define DOVE_MBUS_PCIE0_IO_TARGET 0x4 3162306a36Sopenharmony_ci#define DOVE_MBUS_PCIE0_IO_ATTR 0xe0 3262306a36Sopenharmony_ci#define DOVE_MBUS_PCIE1_MEM_TARGET 0x8 3362306a36Sopenharmony_ci#define DOVE_MBUS_PCIE1_MEM_ATTR 0xe8 3462306a36Sopenharmony_ci#define DOVE_MBUS_PCIE1_IO_TARGET 0x8 3562306a36Sopenharmony_ci#define DOVE_MBUS_PCIE1_IO_ATTR 0xe0 3662306a36Sopenharmony_ci#define DOVE_MBUS_CESA_TARGET 0x3 3762306a36Sopenharmony_ci#define DOVE_MBUS_CESA_ATTR 0x1 3862306a36Sopenharmony_ci#define DOVE_MBUS_BOOTROM_TARGET 0x1 3962306a36Sopenharmony_ci#define DOVE_MBUS_BOOTROM_ATTR 0xfd 4062306a36Sopenharmony_ci#define DOVE_MBUS_SCRATCHPAD_TARGET 0xd 4162306a36Sopenharmony_ci#define DOVE_MBUS_SCRATCHPAD_ATTR 0x0 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci/***************************************************************************** 4462306a36Sopenharmony_ci * I/O Address Mapping 4562306a36Sopenharmony_ci ****************************************************************************/ 4662306a36Sopenharmony_cistatic struct map_desc __maybe_unused dove_io_desc[] __initdata = { 4762306a36Sopenharmony_ci { 4862306a36Sopenharmony_ci .virtual = (unsigned long) DOVE_SB_REGS_VIRT_BASE, 4962306a36Sopenharmony_ci .pfn = __phys_to_pfn(DOVE_SB_REGS_PHYS_BASE), 5062306a36Sopenharmony_ci .length = DOVE_SB_REGS_SIZE, 5162306a36Sopenharmony_ci .type = MT_DEVICE, 5262306a36Sopenharmony_ci }, { 5362306a36Sopenharmony_ci .virtual = (unsigned long) DOVE_NB_REGS_VIRT_BASE, 5462306a36Sopenharmony_ci .pfn = __phys_to_pfn(DOVE_NB_REGS_PHYS_BASE), 5562306a36Sopenharmony_ci .length = DOVE_NB_REGS_SIZE, 5662306a36Sopenharmony_ci .type = MT_DEVICE, 5762306a36Sopenharmony_ci }, 5862306a36Sopenharmony_ci}; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_civoid __init dove_map_io(void) 6162306a36Sopenharmony_ci{ 6262306a36Sopenharmony_ci iotable_init(dove_io_desc, ARRAY_SIZE(dove_io_desc)); 6362306a36Sopenharmony_ci} 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci/***************************************************************************** 6662306a36Sopenharmony_ci * CLK tree 6762306a36Sopenharmony_ci ****************************************************************************/ 6862306a36Sopenharmony_cistatic int dove_tclk; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_cistatic DEFINE_SPINLOCK(gating_lock); 7162306a36Sopenharmony_cistatic struct clk *tclk; 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_cistatic struct clk __init *dove_register_gate(const char *name, 7462306a36Sopenharmony_ci const char *parent, u8 bit_idx) 7562306a36Sopenharmony_ci{ 7662306a36Sopenharmony_ci return clk_register_gate(NULL, name, parent, 0, 7762306a36Sopenharmony_ci (void __iomem *)CLOCK_GATING_CONTROL, 7862306a36Sopenharmony_ci bit_idx, 0, &gating_lock); 7962306a36Sopenharmony_ci} 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_cistatic void __init dove_clk_init(void) 8262306a36Sopenharmony_ci{ 8362306a36Sopenharmony_ci struct clk *usb0, *usb1, *sata, *pex0, *pex1, *sdio0, *sdio1; 8462306a36Sopenharmony_ci struct clk *nand, *camera, *i2s0, *i2s1, *crypto, *ac97, *pdma; 8562306a36Sopenharmony_ci struct clk *xor0, *xor1, *ge, *gephy; 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci tclk = clk_register_fixed_rate(NULL, "tclk", NULL, 0, dove_tclk); 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci usb0 = dove_register_gate("usb0", "tclk", CLOCK_GATING_BIT_USB0); 9062306a36Sopenharmony_ci usb1 = dove_register_gate("usb1", "tclk", CLOCK_GATING_BIT_USB1); 9162306a36Sopenharmony_ci sata = dove_register_gate("sata", "tclk", CLOCK_GATING_BIT_SATA); 9262306a36Sopenharmony_ci pex0 = dove_register_gate("pex0", "tclk", CLOCK_GATING_BIT_PCIE0); 9362306a36Sopenharmony_ci pex1 = dove_register_gate("pex1", "tclk", CLOCK_GATING_BIT_PCIE1); 9462306a36Sopenharmony_ci sdio0 = dove_register_gate("sdio0", "tclk", CLOCK_GATING_BIT_SDIO0); 9562306a36Sopenharmony_ci sdio1 = dove_register_gate("sdio1", "tclk", CLOCK_GATING_BIT_SDIO1); 9662306a36Sopenharmony_ci nand = dove_register_gate("nand", "tclk", CLOCK_GATING_BIT_NAND); 9762306a36Sopenharmony_ci camera = dove_register_gate("camera", "tclk", CLOCK_GATING_BIT_CAMERA); 9862306a36Sopenharmony_ci i2s0 = dove_register_gate("i2s0", "tclk", CLOCK_GATING_BIT_I2S0); 9962306a36Sopenharmony_ci i2s1 = dove_register_gate("i2s1", "tclk", CLOCK_GATING_BIT_I2S1); 10062306a36Sopenharmony_ci crypto = dove_register_gate("crypto", "tclk", CLOCK_GATING_BIT_CRYPTO); 10162306a36Sopenharmony_ci ac97 = dove_register_gate("ac97", "tclk", CLOCK_GATING_BIT_AC97); 10262306a36Sopenharmony_ci pdma = dove_register_gate("pdma", "tclk", CLOCK_GATING_BIT_PDMA); 10362306a36Sopenharmony_ci xor0 = dove_register_gate("xor0", "tclk", CLOCK_GATING_BIT_XOR0); 10462306a36Sopenharmony_ci xor1 = dove_register_gate("xor1", "tclk", CLOCK_GATING_BIT_XOR1); 10562306a36Sopenharmony_ci gephy = dove_register_gate("gephy", "tclk", CLOCK_GATING_BIT_GIGA_PHY); 10662306a36Sopenharmony_ci ge = dove_register_gate("ge", "gephy", CLOCK_GATING_BIT_GBE); 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci orion_clkdev_add(NULL, "orion_spi.0", tclk); 10962306a36Sopenharmony_ci orion_clkdev_add(NULL, "orion_spi.1", tclk); 11062306a36Sopenharmony_ci orion_clkdev_add(NULL, "orion_wdt", tclk); 11162306a36Sopenharmony_ci orion_clkdev_add(NULL, "mv64xxx_i2c.0", tclk); 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci orion_clkdev_add(NULL, "orion-ehci.0", usb0); 11462306a36Sopenharmony_ci orion_clkdev_add(NULL, "orion-ehci.1", usb1); 11562306a36Sopenharmony_ci orion_clkdev_add(NULL, "mv643xx_eth_port.0", ge); 11662306a36Sopenharmony_ci orion_clkdev_add(NULL, "sata_mv.0", sata); 11762306a36Sopenharmony_ci orion_clkdev_add("0", "pcie", pex0); 11862306a36Sopenharmony_ci orion_clkdev_add("1", "pcie", pex1); 11962306a36Sopenharmony_ci orion_clkdev_add(NULL, "sdhci-dove.0", sdio0); 12062306a36Sopenharmony_ci orion_clkdev_add(NULL, "sdhci-dove.1", sdio1); 12162306a36Sopenharmony_ci orion_clkdev_add(NULL, "orion_nand", nand); 12262306a36Sopenharmony_ci orion_clkdev_add(NULL, "cafe1000-ccic.0", camera); 12362306a36Sopenharmony_ci orion_clkdev_add(NULL, "mvebu-audio.0", i2s0); 12462306a36Sopenharmony_ci orion_clkdev_add(NULL, "mvebu-audio.1", i2s1); 12562306a36Sopenharmony_ci orion_clkdev_add(NULL, "mv_crypto", crypto); 12662306a36Sopenharmony_ci orion_clkdev_add(NULL, "dove-ac97", ac97); 12762306a36Sopenharmony_ci orion_clkdev_add(NULL, "dove-pdma", pdma); 12862306a36Sopenharmony_ci orion_clkdev_add(NULL, MV_XOR_NAME ".0", xor0); 12962306a36Sopenharmony_ci orion_clkdev_add(NULL, MV_XOR_NAME ".1", xor1); 13062306a36Sopenharmony_ci} 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci/***************************************************************************** 13362306a36Sopenharmony_ci * EHCI0 13462306a36Sopenharmony_ci ****************************************************************************/ 13562306a36Sopenharmony_civoid __init dove_ehci0_init(void) 13662306a36Sopenharmony_ci{ 13762306a36Sopenharmony_ci orion_ehci_init(DOVE_USB0_PHYS_BASE, IRQ_DOVE_USB0, EHCI_PHY_NA); 13862306a36Sopenharmony_ci} 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci/***************************************************************************** 14162306a36Sopenharmony_ci * EHCI1 14262306a36Sopenharmony_ci ****************************************************************************/ 14362306a36Sopenharmony_civoid __init dove_ehci1_init(void) 14462306a36Sopenharmony_ci{ 14562306a36Sopenharmony_ci orion_ehci_1_init(DOVE_USB1_PHYS_BASE, IRQ_DOVE_USB1); 14662306a36Sopenharmony_ci} 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci/***************************************************************************** 14962306a36Sopenharmony_ci * GE00 15062306a36Sopenharmony_ci ****************************************************************************/ 15162306a36Sopenharmony_civoid __init dove_ge00_init(struct mv643xx_eth_platform_data *eth_data) 15262306a36Sopenharmony_ci{ 15362306a36Sopenharmony_ci orion_ge00_init(eth_data, DOVE_GE00_PHYS_BASE, 15462306a36Sopenharmony_ci IRQ_DOVE_GE00_SUM, IRQ_DOVE_GE00_ERR, 15562306a36Sopenharmony_ci 1600); 15662306a36Sopenharmony_ci} 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci/***************************************************************************** 15962306a36Sopenharmony_ci * SoC RTC 16062306a36Sopenharmony_ci ****************************************************************************/ 16162306a36Sopenharmony_cistatic void __init dove_rtc_init(void) 16262306a36Sopenharmony_ci{ 16362306a36Sopenharmony_ci orion_rtc_init(DOVE_RTC_PHYS_BASE, IRQ_DOVE_RTC); 16462306a36Sopenharmony_ci} 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci/***************************************************************************** 16762306a36Sopenharmony_ci * SATA 16862306a36Sopenharmony_ci ****************************************************************************/ 16962306a36Sopenharmony_civoid __init dove_sata_init(struct mv_sata_platform_data *sata_data) 17062306a36Sopenharmony_ci{ 17162306a36Sopenharmony_ci orion_sata_init(sata_data, DOVE_SATA_PHYS_BASE, IRQ_DOVE_SATA); 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci} 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ci/***************************************************************************** 17662306a36Sopenharmony_ci * UART0 17762306a36Sopenharmony_ci ****************************************************************************/ 17862306a36Sopenharmony_civoid __init dove_uart0_init(void) 17962306a36Sopenharmony_ci{ 18062306a36Sopenharmony_ci orion_uart0_init(DOVE_UART0_VIRT_BASE, DOVE_UART0_PHYS_BASE, 18162306a36Sopenharmony_ci IRQ_DOVE_UART_0, tclk); 18262306a36Sopenharmony_ci} 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci/***************************************************************************** 18562306a36Sopenharmony_ci * UART1 18662306a36Sopenharmony_ci ****************************************************************************/ 18762306a36Sopenharmony_civoid __init dove_uart1_init(void) 18862306a36Sopenharmony_ci{ 18962306a36Sopenharmony_ci orion_uart1_init(DOVE_UART1_VIRT_BASE, DOVE_UART1_PHYS_BASE, 19062306a36Sopenharmony_ci IRQ_DOVE_UART_1, tclk); 19162306a36Sopenharmony_ci} 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci/***************************************************************************** 19462306a36Sopenharmony_ci * UART2 19562306a36Sopenharmony_ci ****************************************************************************/ 19662306a36Sopenharmony_civoid __init dove_uart2_init(void) 19762306a36Sopenharmony_ci{ 19862306a36Sopenharmony_ci orion_uart2_init(DOVE_UART2_VIRT_BASE, DOVE_UART2_PHYS_BASE, 19962306a36Sopenharmony_ci IRQ_DOVE_UART_2, tclk); 20062306a36Sopenharmony_ci} 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci/***************************************************************************** 20362306a36Sopenharmony_ci * UART3 20462306a36Sopenharmony_ci ****************************************************************************/ 20562306a36Sopenharmony_civoid __init dove_uart3_init(void) 20662306a36Sopenharmony_ci{ 20762306a36Sopenharmony_ci orion_uart3_init(DOVE_UART3_VIRT_BASE, DOVE_UART3_PHYS_BASE, 20862306a36Sopenharmony_ci IRQ_DOVE_UART_3, tclk); 20962306a36Sopenharmony_ci} 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci/***************************************************************************** 21262306a36Sopenharmony_ci * SPI 21362306a36Sopenharmony_ci ****************************************************************************/ 21462306a36Sopenharmony_civoid __init dove_spi0_init(void) 21562306a36Sopenharmony_ci{ 21662306a36Sopenharmony_ci orion_spi_init(DOVE_SPI0_PHYS_BASE); 21762306a36Sopenharmony_ci} 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_civoid __init dove_spi1_init(void) 22062306a36Sopenharmony_ci{ 22162306a36Sopenharmony_ci orion_spi_1_init(DOVE_SPI1_PHYS_BASE); 22262306a36Sopenharmony_ci} 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_ci/***************************************************************************** 22562306a36Sopenharmony_ci * I2C 22662306a36Sopenharmony_ci ****************************************************************************/ 22762306a36Sopenharmony_civoid __init dove_i2c_init(void) 22862306a36Sopenharmony_ci{ 22962306a36Sopenharmony_ci orion_i2c_init(DOVE_I2C_PHYS_BASE, IRQ_DOVE_I2C, 10); 23062306a36Sopenharmony_ci} 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci/***************************************************************************** 23362306a36Sopenharmony_ci * Time handling 23462306a36Sopenharmony_ci ****************************************************************************/ 23562306a36Sopenharmony_civoid __init dove_init_early(void) 23662306a36Sopenharmony_ci{ 23762306a36Sopenharmony_ci orion_time_set_base(TIMER_VIRT_BASE); 23862306a36Sopenharmony_ci mvebu_mbus_init("marvell,dove-mbus", 23962306a36Sopenharmony_ci BRIDGE_WINS_BASE, BRIDGE_WINS_SZ, 24062306a36Sopenharmony_ci DOVE_MC_WINS_BASE, DOVE_MC_WINS_SZ); 24162306a36Sopenharmony_ci} 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_cistatic int __init dove_find_tclk(void) 24462306a36Sopenharmony_ci{ 24562306a36Sopenharmony_ci return 166666667; 24662306a36Sopenharmony_ci} 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_civoid __init dove_timer_init(void) 24962306a36Sopenharmony_ci{ 25062306a36Sopenharmony_ci dove_tclk = dove_find_tclk(); 25162306a36Sopenharmony_ci orion_time_init(BRIDGE_VIRT_BASE, BRIDGE_INT_TIMER1_CLR, 25262306a36Sopenharmony_ci IRQ_DOVE_BRIDGE, dove_tclk); 25362306a36Sopenharmony_ci} 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ci/***************************************************************************** 25662306a36Sopenharmony_ci * XOR 0 25762306a36Sopenharmony_ci ****************************************************************************/ 25862306a36Sopenharmony_cistatic void __init dove_xor0_init(void) 25962306a36Sopenharmony_ci{ 26062306a36Sopenharmony_ci orion_xor0_init(DOVE_XOR0_PHYS_BASE, DOVE_XOR0_HIGH_PHYS_BASE, 26162306a36Sopenharmony_ci IRQ_DOVE_XOR_00, IRQ_DOVE_XOR_01); 26262306a36Sopenharmony_ci} 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci/***************************************************************************** 26562306a36Sopenharmony_ci * XOR 1 26662306a36Sopenharmony_ci ****************************************************************************/ 26762306a36Sopenharmony_cistatic void __init dove_xor1_init(void) 26862306a36Sopenharmony_ci{ 26962306a36Sopenharmony_ci orion_xor1_init(DOVE_XOR1_PHYS_BASE, DOVE_XOR1_HIGH_PHYS_BASE, 27062306a36Sopenharmony_ci IRQ_DOVE_XOR_10, IRQ_DOVE_XOR_11); 27162306a36Sopenharmony_ci} 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci/***************************************************************************** 27462306a36Sopenharmony_ci * SDIO 27562306a36Sopenharmony_ci ****************************************************************************/ 27662306a36Sopenharmony_cistatic u64 sdio_dmamask = DMA_BIT_MASK(32); 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_cistatic struct resource dove_sdio0_resources[] = { 27962306a36Sopenharmony_ci { 28062306a36Sopenharmony_ci .start = DOVE_SDIO0_PHYS_BASE, 28162306a36Sopenharmony_ci .end = DOVE_SDIO0_PHYS_BASE + 0xff, 28262306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 28362306a36Sopenharmony_ci }, { 28462306a36Sopenharmony_ci .start = IRQ_DOVE_SDIO0, 28562306a36Sopenharmony_ci .end = IRQ_DOVE_SDIO0, 28662306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 28762306a36Sopenharmony_ci }, 28862306a36Sopenharmony_ci}; 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_cistatic struct platform_device dove_sdio0 = { 29162306a36Sopenharmony_ci .name = "sdhci-dove", 29262306a36Sopenharmony_ci .id = 0, 29362306a36Sopenharmony_ci .dev = { 29462306a36Sopenharmony_ci .dma_mask = &sdio_dmamask, 29562306a36Sopenharmony_ci .coherent_dma_mask = DMA_BIT_MASK(32), 29662306a36Sopenharmony_ci }, 29762306a36Sopenharmony_ci .resource = dove_sdio0_resources, 29862306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(dove_sdio0_resources), 29962306a36Sopenharmony_ci}; 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_civoid __init dove_sdio0_init(void) 30262306a36Sopenharmony_ci{ 30362306a36Sopenharmony_ci platform_device_register(&dove_sdio0); 30462306a36Sopenharmony_ci} 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_cistatic struct resource dove_sdio1_resources[] = { 30762306a36Sopenharmony_ci { 30862306a36Sopenharmony_ci .start = DOVE_SDIO1_PHYS_BASE, 30962306a36Sopenharmony_ci .end = DOVE_SDIO1_PHYS_BASE + 0xff, 31062306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 31162306a36Sopenharmony_ci }, { 31262306a36Sopenharmony_ci .start = IRQ_DOVE_SDIO1, 31362306a36Sopenharmony_ci .end = IRQ_DOVE_SDIO1, 31462306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 31562306a36Sopenharmony_ci }, 31662306a36Sopenharmony_ci}; 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_cistatic struct platform_device dove_sdio1 = { 31962306a36Sopenharmony_ci .name = "sdhci-dove", 32062306a36Sopenharmony_ci .id = 1, 32162306a36Sopenharmony_ci .dev = { 32262306a36Sopenharmony_ci .dma_mask = &sdio_dmamask, 32362306a36Sopenharmony_ci .coherent_dma_mask = DMA_BIT_MASK(32), 32462306a36Sopenharmony_ci }, 32562306a36Sopenharmony_ci .resource = dove_sdio1_resources, 32662306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(dove_sdio1_resources), 32762306a36Sopenharmony_ci}; 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_civoid __init dove_sdio1_init(void) 33062306a36Sopenharmony_ci{ 33162306a36Sopenharmony_ci platform_device_register(&dove_sdio1); 33262306a36Sopenharmony_ci} 33362306a36Sopenharmony_ci 33462306a36Sopenharmony_civoid __init dove_setup_cpu_wins(void) 33562306a36Sopenharmony_ci{ 33662306a36Sopenharmony_ci /* 33762306a36Sopenharmony_ci * The PCIe windows will no longer be statically allocated 33862306a36Sopenharmony_ci * here once Dove is migrated to the pci-mvebu driver. The 33962306a36Sopenharmony_ci * non-PCIe windows will no longer be created here once Dove 34062306a36Sopenharmony_ci * fully moves to DT. 34162306a36Sopenharmony_ci */ 34262306a36Sopenharmony_ci mvebu_mbus_add_window_remap_by_id(DOVE_MBUS_PCIE0_IO_TARGET, 34362306a36Sopenharmony_ci DOVE_MBUS_PCIE0_IO_ATTR, 34462306a36Sopenharmony_ci DOVE_PCIE0_IO_PHYS_BASE, 34562306a36Sopenharmony_ci DOVE_PCIE0_IO_SIZE, 34662306a36Sopenharmony_ci DOVE_PCIE0_IO_BUS_BASE); 34762306a36Sopenharmony_ci mvebu_mbus_add_window_remap_by_id(DOVE_MBUS_PCIE1_IO_TARGET, 34862306a36Sopenharmony_ci DOVE_MBUS_PCIE1_IO_ATTR, 34962306a36Sopenharmony_ci DOVE_PCIE1_IO_PHYS_BASE, 35062306a36Sopenharmony_ci DOVE_PCIE1_IO_SIZE, 35162306a36Sopenharmony_ci DOVE_PCIE1_IO_BUS_BASE); 35262306a36Sopenharmony_ci mvebu_mbus_add_window_by_id(DOVE_MBUS_PCIE0_MEM_TARGET, 35362306a36Sopenharmony_ci DOVE_MBUS_PCIE0_MEM_ATTR, 35462306a36Sopenharmony_ci DOVE_PCIE0_MEM_PHYS_BASE, 35562306a36Sopenharmony_ci DOVE_PCIE0_MEM_SIZE); 35662306a36Sopenharmony_ci mvebu_mbus_add_window_by_id(DOVE_MBUS_PCIE1_MEM_TARGET, 35762306a36Sopenharmony_ci DOVE_MBUS_PCIE1_MEM_ATTR, 35862306a36Sopenharmony_ci DOVE_PCIE1_MEM_PHYS_BASE, 35962306a36Sopenharmony_ci DOVE_PCIE1_MEM_SIZE); 36062306a36Sopenharmony_ci mvebu_mbus_add_window_by_id(DOVE_MBUS_CESA_TARGET, 36162306a36Sopenharmony_ci DOVE_MBUS_CESA_ATTR, 36262306a36Sopenharmony_ci DOVE_CESA_PHYS_BASE, 36362306a36Sopenharmony_ci DOVE_CESA_SIZE); 36462306a36Sopenharmony_ci mvebu_mbus_add_window_by_id(DOVE_MBUS_BOOTROM_TARGET, 36562306a36Sopenharmony_ci DOVE_MBUS_BOOTROM_ATTR, 36662306a36Sopenharmony_ci DOVE_BOOTROM_PHYS_BASE, 36762306a36Sopenharmony_ci DOVE_BOOTROM_SIZE); 36862306a36Sopenharmony_ci mvebu_mbus_add_window_by_id(DOVE_MBUS_SCRATCHPAD_TARGET, 36962306a36Sopenharmony_ci DOVE_MBUS_SCRATCHPAD_ATTR, 37062306a36Sopenharmony_ci DOVE_SCRATCHPAD_PHYS_BASE, 37162306a36Sopenharmony_ci DOVE_SCRATCHPAD_SIZE); 37262306a36Sopenharmony_ci} 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_cistatic struct resource orion_wdt_resource[] = { 37562306a36Sopenharmony_ci DEFINE_RES_MEM(TIMER_PHYS_BASE, 0x04), 37662306a36Sopenharmony_ci DEFINE_RES_MEM(RSTOUTn_MASK_PHYS, 0x04), 37762306a36Sopenharmony_ci}; 37862306a36Sopenharmony_ci 37962306a36Sopenharmony_cistatic struct platform_device orion_wdt_device = { 38062306a36Sopenharmony_ci .name = "orion_wdt", 38162306a36Sopenharmony_ci .id = -1, 38262306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(orion_wdt_resource), 38362306a36Sopenharmony_ci .resource = orion_wdt_resource, 38462306a36Sopenharmony_ci}; 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_cistatic void __init __maybe_unused orion_wdt_init(void) 38762306a36Sopenharmony_ci{ 38862306a36Sopenharmony_ci platform_device_register(&orion_wdt_device); 38962306a36Sopenharmony_ci} 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_cistatic const struct dove_pmu_domain_initdata pmu_domains[] __initconst = { 39262306a36Sopenharmony_ci { 39362306a36Sopenharmony_ci .pwr_mask = PMU_PWR_VPU_PWR_DWN_MASK, 39462306a36Sopenharmony_ci .rst_mask = PMU_SW_RST_VIDEO_MASK, 39562306a36Sopenharmony_ci .iso_mask = PMU_ISO_VIDEO_MASK, 39662306a36Sopenharmony_ci .name = "vpu-domain", 39762306a36Sopenharmony_ci }, { 39862306a36Sopenharmony_ci .pwr_mask = PMU_PWR_GPU_PWR_DWN_MASK, 39962306a36Sopenharmony_ci .rst_mask = PMU_SW_RST_GPU_MASK, 40062306a36Sopenharmony_ci .iso_mask = PMU_ISO_GPU_MASK, 40162306a36Sopenharmony_ci .name = "gpu-domain", 40262306a36Sopenharmony_ci }, { 40362306a36Sopenharmony_ci /* sentinel */ 40462306a36Sopenharmony_ci }, 40562306a36Sopenharmony_ci}; 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_cistatic const struct dove_pmu_initdata pmu_data __initconst = { 40862306a36Sopenharmony_ci .pmc_base = DOVE_PMU_VIRT_BASE, 40962306a36Sopenharmony_ci .pmu_base = DOVE_PMU_VIRT_BASE + 0x8000, 41062306a36Sopenharmony_ci .irq = IRQ_DOVE_PMU, 41162306a36Sopenharmony_ci .irq_domain_start = IRQ_DOVE_PMU_START, 41262306a36Sopenharmony_ci .domains = pmu_domains, 41362306a36Sopenharmony_ci}; 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_civoid __init dove_init(void) 41662306a36Sopenharmony_ci{ 41762306a36Sopenharmony_ci pr_info("Dove 88AP510 SoC, TCLK = %d MHz.\n", 41862306a36Sopenharmony_ci (dove_tclk + 499999) / 1000000); 41962306a36Sopenharmony_ci 42062306a36Sopenharmony_ci#ifdef CONFIG_CACHE_TAUROS2 42162306a36Sopenharmony_ci tauros2_init(0); 42262306a36Sopenharmony_ci#endif 42362306a36Sopenharmony_ci dove_setup_cpu_wins(); 42462306a36Sopenharmony_ci 42562306a36Sopenharmony_ci /* Setup root of clk tree */ 42662306a36Sopenharmony_ci dove_clk_init(); 42762306a36Sopenharmony_ci 42862306a36Sopenharmony_ci /* internal devices that every board has */ 42962306a36Sopenharmony_ci dove_init_pmu_legacy(&pmu_data); 43062306a36Sopenharmony_ci dove_rtc_init(); 43162306a36Sopenharmony_ci dove_xor0_init(); 43262306a36Sopenharmony_ci dove_xor1_init(); 43362306a36Sopenharmony_ci} 43462306a36Sopenharmony_ci 43562306a36Sopenharmony_civoid dove_restart(enum reboot_mode mode, const char *cmd) 43662306a36Sopenharmony_ci{ 43762306a36Sopenharmony_ci /* 43862306a36Sopenharmony_ci * Enable soft reset to assert RSTOUTn. 43962306a36Sopenharmony_ci */ 44062306a36Sopenharmony_ci writel(SOFT_RESET_OUT_EN, RSTOUTn_MASK); 44162306a36Sopenharmony_ci 44262306a36Sopenharmony_ci /* 44362306a36Sopenharmony_ci * Assert soft reset. 44462306a36Sopenharmony_ci */ 44562306a36Sopenharmony_ci writel(SOFT_RESET, SYSTEM_SOFT_RESET); 44662306a36Sopenharmony_ci 44762306a36Sopenharmony_ci while (1) 44862306a36Sopenharmony_ci ; 44962306a36Sopenharmony_ci} 450