diff options
Diffstat (limited to 'arch/arm/plat-samsung/init.c')
| -rw-r--r-- | arch/arm/plat-samsung/init.c | 36 | 
1 files changed, 25 insertions, 11 deletions
diff --git a/arch/arm/plat-samsung/init.c b/arch/arm/plat-samsung/init.c index 6790edfaca6..a1f925f3121 100644 --- a/arch/arm/plat-samsung/init.c +++ b/arch/arm/plat-samsung/init.c @@ -11,14 +11,19 @@   * 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 <mach/hardware.h> +#include <linux/of.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h> @@ -27,8 +32,6 @@  #include <plat/devs.h>  #include <plat/clock.h> -#include <plat/regs-serial.h> -  static struct cpu_table *cpu;  static struct cpu_table * __init s3c_lookup_cpu(unsigned long idcode, @@ -36,7 +39,7 @@ static struct cpu_table * __init s3c_lookup_cpu(unsigned long idcode,  						unsigned int count)  {  	for (; count != 0; count--, tab++) { -		if ((idcode & tab->idmask) == tab->idcode) +		if ((idcode & tab->idmask) == (tab->idcode & tab->idmask))  			return tab;  	} @@ -55,12 +58,13 @@ void __init s3c_init_cpu(unsigned long idcode,  	printk("CPU %s (id 0x%08lx)\n", cpu->name, idcode); -	if (cpu->map_io == NULL || cpu->init == NULL) { +	if (cpu->init == NULL) {  		printk(KERN_ERR "CPU %s support not enabled\n", cpu->name);  		panic("Unsupported Samsung CPU");  	} -	cpu->map_io(); +	if (cpu->map_io) +		cpu->map_io();  }  /* s3c24xx_init_clocks @@ -87,10 +91,12 @@ void __init s3c24xx_init_clocks(int 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   * @@ -105,6 +111,7 @@ 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; @@ -127,6 +134,7 @@ void __init s3c24xx_init_uartdevs(char *name,  	}  	nr_uarts = no; +#endif  }  void __init s3c24xx_init_uarts(struct s3c2410_uartcfg *cfg, int no) @@ -134,11 +142,12 @@ void __init s3c24xx_init_uarts(struct s3c2410_uartcfg *cfg, int no)  	if (cpu == NULL)  		return; -	if (cpu->init_uarts == NULL) { +	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)  { @@ -146,14 +155,19 @@ static int __init s3c_arch_init(void)  	// do the correct init for cpu -	if (cpu == NULL) +	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;  }  | 
