forked from Minki/linux
2bf73dd61a
These could not be part of the first cleanup branch, because they either came too late in the cycle, or they have dependencies on other branches. Important changes are: * The integrator platform is almost multiplatform capable after some reorganization (Linus Walleij) * Minor cleanups on Zynq (Michal Simek) * Lots of changes for Exynos and other Samsung platforms, including further preparations for multiplatform support and the clocks bindings are rearranged. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIVAwUAUz/2IGCrR//JCVInAQI+sA//baZOXHTNRR7uBh5PJgaDFIyNjtBDDyyB m+yYgw24n3WP1YWtFhBKza7p5Eh2spWYgffKV/logWM4SC3HjkCUsLkQwruHa2qe H/pCknUXqUNiwH76WVbfrABb+0tARjEB+U0QfXh7af7Zk+ZXMqQ1/ItU0YdpJiGO mOAI5c6gzpr953cmzuHer8foATmF5DNuJPhPDPYlgeg2+yvXgcnfi9a+AXE8Eqb1 sZeWUJrqJERBlmsVgihq1+gPJjh0Kw7D9r835JqQeKRnywFgvGbmf5kYriPiEEBt hJUUnRHW6GCFQM9MemP0nOaRQlQYJA+EPqzB+0YRps0Gq+3QCIXFzZwLije/eMvr 2YjpITS2MaTqvag1o4yNmfeG+hGMN6MgbOh9q5kLagTXn/9nsQ6aYkD9tCXw4G08 bH3PP90AT6jQoNDoac5Pt2xPBPvY1JnnUegw5YmQQAlKeSEaiSJnHaC4gD9jzy7q fvoXey/Fz/ZgtZKL0wjbjhUrurS45xqZUW0MlMFOt6U7wdG4wsuemaI2PID6tKp8 ZmZ5gyHsX+CK4GfmhFFu3XhM8hyRj3/OBSy0/Wls3znFH/6j/X1gvrH87gnS9+ax +Ettut5uCutDaUJRymXDlqdF9ysLC3DVHpofQPSCqVZ+IHQkUadypyc6YY1Z5mtQ x/nxniFA7/A= =1i9x -----END PGP SIGNATURE----- Merge tag 'tags/cleanup2-3.15' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc Pull ARM SoC late cleanups from Arnd Bergmann: "These could not be part of the first cleanup branch, because they either came too late in the cycle, or they have dependencies on other branches. Important changes are: - The integrator platform is almost multiplatform capable after some reorganization (Linus Walleij) - Minor cleanups on Zynq (Michal Simek) - Lots of changes for Exynos and other Samsung platforms, including further preparations for multiplatform support and the clocks bindings are rearranged" * tag 'tags/cleanup2-3.15' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (54 commits) devicetree: fix newly added exynos sata bindings ARM: EXYNOS: Fix compilation error in cpuidle.c ARM: S5P64X0: Explicitly include linux/serial_s3c.h in mach/pm-core.h ARM: EXYNOS: Remove hardware.h file ARM: SAMSUNG: Remove hardware.h inclusion ARM: S3C24XX: Remove invalid code from hardware.h dt-bindings: clock: Move exynos-audss-clk.h to dt-bindings/clock ARM: dts: Keep some essential LDOs enabled for arndale-octa board ARM: dts: Disable MDMA1 node for arndale-octa board ARM: S3C64XX: Fix build for implicit serial_s3c.h inclusion serial: s3c: Fix build of header without serial_core.h preinclusion ARM: EXYNOS: Allow wake-up using GIC interrupts ARM: EXYNOS: Stop using legacy Samsung PM code ARM: EXYNOS: Remove PM initcalls and useless indirection ARM: EXYNOS: Fix abuse of CONFIG_PM ARM: SAMSUNG: Move s3c_pm_check_* prototypes to plat/pm-common.h ARM: SAMSUNG: Move common save/restore helpers to separate file ARM: SAMSUNG: Move Samsung PM debug code into separate file ARM: SAMSUNG: Consolidate PM debug functions ARM: SAMSUNG: Use debug_ll_addr() to get UART base address ...
175 lines
3.9 KiB
C
175 lines
3.9 KiB
C
/* linux/arch/arm/plat-s3c/init.c
|
|
*
|
|
* Copyright (c) 2008 Simtec Electronics
|
|
* Ben Dooks <ben@simtec.co.uk>
|
|
* http://armlinux.simtec.co.uk/
|
|
*
|
|
* S3C series CPU initialisation
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
/*
|
|
* NOTE: Code in this file is not used on S3C64xx when booting with
|
|
* Device Tree support.
|
|
*/
|
|
|
|
#include <linux/init.h>
|
|
#include <linux/module.h>
|
|
#include <linux/interrupt.h>
|
|
#include <linux/ioport.h>
|
|
#include <linux/serial_core.h>
|
|
#include <linux/serial_s3c.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/of.h>
|
|
|
|
#include <asm/mach/arch.h>
|
|
#include <asm/mach/map.h>
|
|
|
|
#include <plat/cpu.h>
|
|
#include <plat/devs.h>
|
|
#include <plat/clock.h>
|
|
|
|
static struct cpu_table *cpu;
|
|
|
|
static struct cpu_table * __init s3c_lookup_cpu(unsigned long idcode,
|
|
struct cpu_table *tab,
|
|
unsigned int count)
|
|
{
|
|
for (; count != 0; count--, tab++) {
|
|
if ((idcode & tab->idmask) == (tab->idcode & tab->idmask))
|
|
return tab;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
void __init s3c_init_cpu(unsigned long idcode,
|
|
struct cpu_table *cputab, unsigned int cputab_size)
|
|
{
|
|
cpu = s3c_lookup_cpu(idcode, cputab, cputab_size);
|
|
|
|
if (cpu == NULL) {
|
|
printk(KERN_ERR "Unknown CPU type 0x%08lx\n", idcode);
|
|
panic("Unknown S3C24XX CPU");
|
|
}
|
|
|
|
printk("CPU %s (id 0x%08lx)\n", cpu->name, idcode);
|
|
|
|
if (cpu->init == NULL) {
|
|
printk(KERN_ERR "CPU %s support not enabled\n", cpu->name);
|
|
panic("Unsupported Samsung CPU");
|
|
}
|
|
|
|
if (cpu->map_io)
|
|
cpu->map_io();
|
|
}
|
|
|
|
/* s3c24xx_init_clocks
|
|
*
|
|
* Initialise the clock subsystem and associated information from the
|
|
* given master crystal value.
|
|
*
|
|
* xtal = 0 -> use default PLL crystal value (normally 12MHz)
|
|
* != 0 -> PLL crystal value in Hz
|
|
*/
|
|
|
|
void __init s3c24xx_init_clocks(int xtal)
|
|
{
|
|
if (xtal == 0)
|
|
xtal = 12*1000*1000;
|
|
|
|
if (cpu == NULL)
|
|
panic("s3c24xx_init_clocks: no cpu setup?\n");
|
|
|
|
if (cpu->init_clocks == NULL)
|
|
panic("s3c24xx_init_clocks: cpu has no clock init\n");
|
|
else
|
|
(cpu->init_clocks)(xtal);
|
|
}
|
|
|
|
/* uart management */
|
|
#if IS_ENABLED(CONFIG_SAMSUNG_ATAGS)
|
|
static int nr_uarts __initdata = 0;
|
|
|
|
#ifdef CONFIG_SERIAL_SAMSUNG_UARTS
|
|
static struct s3c2410_uartcfg uart_cfgs[CONFIG_SERIAL_SAMSUNG_UARTS];
|
|
#endif
|
|
|
|
/* s3c24xx_init_uartdevs
|
|
*
|
|
* copy the specified platform data and configuration into our central
|
|
* set of devices, before the data is thrown away after the init process.
|
|
*
|
|
* This also fills in the array passed to the serial driver for the
|
|
* early initialisation of the console.
|
|
*/
|
|
|
|
void __init s3c24xx_init_uartdevs(char *name,
|
|
struct s3c24xx_uart_resources *res,
|
|
struct s3c2410_uartcfg *cfg, int no)
|
|
{
|
|
#ifdef CONFIG_SERIAL_SAMSUNG_UARTS
|
|
struct platform_device *platdev;
|
|
struct s3c2410_uartcfg *cfgptr = uart_cfgs;
|
|
struct s3c24xx_uart_resources *resp;
|
|
int uart;
|
|
|
|
memcpy(cfgptr, cfg, sizeof(struct s3c2410_uartcfg) * no);
|
|
|
|
for (uart = 0; uart < no; uart++, cfg++, cfgptr++) {
|
|
platdev = s3c24xx_uart_src[cfgptr->hwport];
|
|
|
|
resp = res + cfgptr->hwport;
|
|
|
|
s3c24xx_uart_devs[uart] = platdev;
|
|
|
|
platdev->name = name;
|
|
platdev->resource = resp->resources;
|
|
platdev->num_resources = resp->nr_resources;
|
|
|
|
platdev->dev.platform_data = cfgptr;
|
|
}
|
|
|
|
nr_uarts = no;
|
|
#endif
|
|
}
|
|
|
|
void __init s3c24xx_init_uarts(struct s3c2410_uartcfg *cfg, int no)
|
|
{
|
|
if (cpu == NULL)
|
|
return;
|
|
|
|
if (cpu->init_uarts == NULL && IS_ENABLED(CONFIG_SAMSUNG_ATAGS)) {
|
|
printk(KERN_ERR "s3c24xx_init_uarts: cpu has no uart init\n");
|
|
} else
|
|
(cpu->init_uarts)(cfg, no);
|
|
}
|
|
#endif
|
|
|
|
static int __init s3c_arch_init(void)
|
|
{
|
|
int ret;
|
|
|
|
// do the correct init for cpu
|
|
|
|
if (cpu == NULL) {
|
|
/* Not needed when booting with device tree. */
|
|
if (of_have_populated_dt())
|
|
return 0;
|
|
panic("s3c_arch_init: NULL cpu\n");
|
|
}
|
|
|
|
ret = (cpu->init)();
|
|
if (ret != 0)
|
|
return ret;
|
|
#if IS_ENABLED(CONFIG_SAMSUNG_ATAGS)
|
|
ret = platform_add_devices(s3c24xx_uart_devs, nr_uarts);
|
|
#endif
|
|
return ret;
|
|
}
|
|
|
|
arch_initcall(s3c_arch_init);
|