forked from Minki/linux
f6361c6b38
The restart-handler series from Guenter Roeck got accepted recently and implements among other things also the restart handler in the samsung watchdog driver and where applicable in the clock drivers. So there is no need for having the restart callbacks in s3c24xx boards anymore. Signed-off-by: Heiko Stuebner <heiko@sntech.de> Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
266 lines
6.5 KiB
C
266 lines
6.5 KiB
C
/* linux/arch/arm/mach-s3c2416/mach-hanlin_v3c.c
|
|
*
|
|
* Copyright (c) 2009 Yauhen Kharuzhy <jekhor@gmail.com>,
|
|
* as part of OpenInkpot project
|
|
* Copyright (c) 2009 Promwad Innovation Company
|
|
* Yauhen Kharuzhy <yauhen.kharuzhy@promwad.com>
|
|
*
|
|
* 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.
|
|
*
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/types.h>
|
|
#include <linux/interrupt.h>
|
|
#include <linux/list.h>
|
|
#include <linux/timer.h>
|
|
#include <linux/init.h>
|
|
#include <linux/serial_core.h>
|
|
#include <linux/serial_s3c.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/io.h>
|
|
#include <linux/mtd/partitions.h>
|
|
#include <linux/gpio.h>
|
|
#include <linux/fb.h>
|
|
#include <linux/delay.h>
|
|
|
|
#include <asm/mach/arch.h>
|
|
#include <asm/mach/map.h>
|
|
#include <asm/mach/irq.h>
|
|
|
|
#include <video/samsung_fimd.h>
|
|
#include <mach/hardware.h>
|
|
#include <asm/irq.h>
|
|
#include <asm/mach-types.h>
|
|
|
|
#include <mach/regs-gpio.h>
|
|
#include <mach/regs-lcd.h>
|
|
#include <mach/regs-s3c2443-clock.h>
|
|
#include <mach/gpio-samsung.h>
|
|
|
|
#include <linux/platform_data/leds-s3c24xx.h>
|
|
#include <linux/platform_data/i2c-s3c2410.h>
|
|
|
|
#include <plat/gpio-cfg.h>
|
|
#include <plat/devs.h>
|
|
#include <plat/cpu.h>
|
|
#include <linux/platform_data/mtd-nand-s3c2410.h>
|
|
#include <plat/sdhci.h>
|
|
#include <linux/platform_data/usb-s3c2410_udc.h>
|
|
#include <linux/platform_data/s3c-hsudc.h>
|
|
#include <plat/samsung-time.h>
|
|
|
|
#include <plat/fb.h>
|
|
|
|
#include "common.h"
|
|
#include "common-smdk.h"
|
|
|
|
static struct map_desc smdk2416_iodesc[] __initdata = {
|
|
/* ISA IO Space map (memory space selected by A24) */
|
|
|
|
{
|
|
.virtual = (u32)S3C24XX_VA_ISA_WORD,
|
|
.pfn = __phys_to_pfn(S3C2410_CS2),
|
|
.length = 0x10000,
|
|
.type = MT_DEVICE,
|
|
}, {
|
|
.virtual = (u32)S3C24XX_VA_ISA_WORD + 0x10000,
|
|
.pfn = __phys_to_pfn(S3C2410_CS2 + (1<<24)),
|
|
.length = SZ_4M,
|
|
.type = MT_DEVICE,
|
|
}, {
|
|
.virtual = (u32)S3C24XX_VA_ISA_BYTE,
|
|
.pfn = __phys_to_pfn(S3C2410_CS2),
|
|
.length = 0x10000,
|
|
.type = MT_DEVICE,
|
|
}, {
|
|
.virtual = (u32)S3C24XX_VA_ISA_BYTE + 0x10000,
|
|
.pfn = __phys_to_pfn(S3C2410_CS2 + (1<<24)),
|
|
.length = SZ_4M,
|
|
.type = MT_DEVICE,
|
|
}
|
|
};
|
|
|
|
#define UCON (S3C2410_UCON_DEFAULT | \
|
|
S3C2440_UCON_PCLK | \
|
|
S3C2443_UCON_RXERR_IRQEN)
|
|
|
|
#define ULCON (S3C2410_LCON_CS8 | S3C2410_LCON_PNONE)
|
|
|
|
#define UFCON (S3C2410_UFCON_RXTRIG8 | \
|
|
S3C2410_UFCON_FIFOMODE | \
|
|
S3C2440_UFCON_TXTRIG16)
|
|
|
|
static struct s3c2410_uartcfg smdk2416_uartcfgs[] __initdata = {
|
|
[0] = {
|
|
.hwport = 0,
|
|
.flags = 0,
|
|
.ucon = UCON,
|
|
.ulcon = ULCON,
|
|
.ufcon = UFCON,
|
|
},
|
|
[1] = {
|
|
.hwport = 1,
|
|
.flags = 0,
|
|
.ucon = UCON,
|
|
.ulcon = ULCON,
|
|
.ufcon = UFCON,
|
|
},
|
|
/* IR port */
|
|
[2] = {
|
|
.hwport = 2,
|
|
.flags = 0,
|
|
.ucon = UCON,
|
|
.ulcon = ULCON | 0x50,
|
|
.ufcon = UFCON,
|
|
},
|
|
[3] = {
|
|
.hwport = 3,
|
|
.flags = 0,
|
|
.ucon = UCON,
|
|
.ulcon = ULCON,
|
|
.ufcon = UFCON,
|
|
}
|
|
};
|
|
|
|
static void smdk2416_hsudc_gpio_init(void)
|
|
{
|
|
s3c_gpio_setpull(S3C2410_GPH(14), S3C_GPIO_PULL_UP);
|
|
s3c_gpio_setpull(S3C2410_GPF(2), S3C_GPIO_PULL_NONE);
|
|
s3c_gpio_cfgpin(S3C2410_GPH(14), S3C_GPIO_SFN(1));
|
|
s3c2410_modify_misccr(S3C2416_MISCCR_SEL_SUSPND, 0);
|
|
}
|
|
|
|
static void smdk2416_hsudc_gpio_uninit(void)
|
|
{
|
|
s3c2410_modify_misccr(S3C2416_MISCCR_SEL_SUSPND, 1);
|
|
s3c_gpio_setpull(S3C2410_GPH(14), S3C_GPIO_PULL_NONE);
|
|
s3c_gpio_cfgpin(S3C2410_GPH(14), S3C_GPIO_SFN(0));
|
|
}
|
|
|
|
static struct s3c24xx_hsudc_platdata smdk2416_hsudc_platdata = {
|
|
.epnum = 9,
|
|
.gpio_init = smdk2416_hsudc_gpio_init,
|
|
.gpio_uninit = smdk2416_hsudc_gpio_uninit,
|
|
};
|
|
|
|
static struct s3c_fb_pd_win smdk2416_fb_win[] = {
|
|
[0] = {
|
|
.default_bpp = 16,
|
|
.max_bpp = 32,
|
|
.xres = 800,
|
|
.yres = 480,
|
|
},
|
|
};
|
|
|
|
static struct fb_videomode smdk2416_lcd_timing = {
|
|
.pixclock = 41094,
|
|
.left_margin = 8,
|
|
.right_margin = 13,
|
|
.upper_margin = 7,
|
|
.lower_margin = 5,
|
|
.hsync_len = 3,
|
|
.vsync_len = 1,
|
|
.xres = 800,
|
|
.yres = 480,
|
|
};
|
|
|
|
static void s3c2416_fb_gpio_setup_24bpp(void)
|
|
{
|
|
unsigned int gpio;
|
|
|
|
for (gpio = S3C2410_GPC(1); gpio <= S3C2410_GPC(4); gpio++) {
|
|
s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
|
|
s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
|
|
}
|
|
|
|
for (gpio = S3C2410_GPC(8); gpio <= S3C2410_GPC(15); gpio++) {
|
|
s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
|
|
s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
|
|
}
|
|
|
|
for (gpio = S3C2410_GPD(0); gpio <= S3C2410_GPD(15); gpio++) {
|
|
s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
|
|
s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
|
|
}
|
|
}
|
|
|
|
static struct s3c_fb_platdata smdk2416_fb_platdata = {
|
|
.win[0] = &smdk2416_fb_win[0],
|
|
.vtiming = &smdk2416_lcd_timing,
|
|
.setup_gpio = s3c2416_fb_gpio_setup_24bpp,
|
|
.vidcon0 = VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB,
|
|
.vidcon1 = VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC,
|
|
};
|
|
|
|
static struct s3c_sdhci_platdata smdk2416_hsmmc0_pdata __initdata = {
|
|
.max_width = 4,
|
|
.cd_type = S3C_SDHCI_CD_GPIO,
|
|
.ext_cd_gpio = S3C2410_GPF(1),
|
|
.ext_cd_gpio_invert = 1,
|
|
};
|
|
|
|
static struct s3c_sdhci_platdata smdk2416_hsmmc1_pdata __initdata = {
|
|
.max_width = 4,
|
|
.cd_type = S3C_SDHCI_CD_NONE,
|
|
};
|
|
|
|
static struct platform_device *smdk2416_devices[] __initdata = {
|
|
&s3c_device_fb,
|
|
&s3c_device_wdt,
|
|
&s3c_device_ohci,
|
|
&s3c_device_i2c0,
|
|
&s3c_device_hsmmc0,
|
|
&s3c_device_hsmmc1,
|
|
&s3c_device_usb_hsudc,
|
|
&s3c2443_device_dma,
|
|
};
|
|
|
|
static void __init smdk2416_init_time(void)
|
|
{
|
|
s3c2416_init_clocks(12000000);
|
|
samsung_timer_init();
|
|
}
|
|
|
|
static void __init smdk2416_map_io(void)
|
|
{
|
|
s3c24xx_init_io(smdk2416_iodesc, ARRAY_SIZE(smdk2416_iodesc));
|
|
s3c24xx_init_uarts(smdk2416_uartcfgs, ARRAY_SIZE(smdk2416_uartcfgs));
|
|
samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4);
|
|
}
|
|
|
|
static void __init smdk2416_machine_init(void)
|
|
{
|
|
s3c_i2c0_set_platdata(NULL);
|
|
s3c_fb_set_platdata(&smdk2416_fb_platdata);
|
|
|
|
s3c_sdhci0_set_platdata(&smdk2416_hsmmc0_pdata);
|
|
s3c_sdhci1_set_platdata(&smdk2416_hsmmc1_pdata);
|
|
|
|
s3c24xx_hsudc_set_platdata(&smdk2416_hsudc_platdata);
|
|
|
|
gpio_request(S3C2410_GPB(4), "USBHost Power");
|
|
gpio_direction_output(S3C2410_GPB(4), 1);
|
|
|
|
gpio_request(S3C2410_GPB(3), "Display Power");
|
|
gpio_direction_output(S3C2410_GPB(3), 1);
|
|
|
|
gpio_request(S3C2410_GPB(1), "Display Reset");
|
|
gpio_direction_output(S3C2410_GPB(1), 1);
|
|
|
|
platform_add_devices(smdk2416_devices, ARRAY_SIZE(smdk2416_devices));
|
|
smdk_machine_init();
|
|
}
|
|
|
|
MACHINE_START(SMDK2416, "SMDK2416")
|
|
/* Maintainer: Yauhen Kharuzhy <jekhor@gmail.com> */
|
|
.atag_offset = 0x100,
|
|
|
|
.init_irq = s3c2416_init_irq,
|
|
.map_io = smdk2416_map_io,
|
|
.init_machine = smdk2416_machine_init,
|
|
.init_time = smdk2416_init_time,
|
|
MACHINE_END
|