forked from Minki/linux
c78a41fc04
As a final bit of preparation for converting to ARCH_MULTIPLATFORM, change the interrupt handling for s3c24xx to use sparse IRQs. Since the number of possible interrupts is already fixed and relatively small per chip, just make it use all legacy interrupts preallocated using the .nr_irqs field in the machine descriptor, rather than actually allocating domains on the fly. Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
249 lines
6.0 KiB
C
249 lines
6.0 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
//
|
|
// 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>
|
|
|
|
#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 <asm/irq.h>
|
|
#include <asm/mach-types.h>
|
|
|
|
#include "hardware-s3c24xx.h"
|
|
#include "regs-gpio.h"
|
|
#include "regs-s3c2443-clock.h"
|
|
#include "gpio-samsung.h"
|
|
|
|
#include <linux/platform_data/leds-s3c24xx.h>
|
|
#include <linux/platform_data/i2c-s3c2410.h>
|
|
|
|
#include "gpio-cfg.h"
|
|
#include "devs.h"
|
|
#include "cpu.h"
|
|
#include <linux/platform_data/mtd-nand-s3c2410.h>
|
|
#include "sdhci.h"
|
|
#include <linux/platform_data/usb-s3c2410_udc.h>
|
|
#include <linux/platform_data/s3c-hsudc.h>
|
|
|
|
#include "fb.h"
|
|
|
|
#include "s3c24xx.h"
|
|
#include "common-smdk-s3c24xx.h"
|
|
|
|
static struct map_desc smdk2416_iodesc[] __initdata = {
|
|
/* ISA IO Space map (memory space selected by A24) */
|
|
|
|
{
|
|
.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);
|
|
s3c24xx_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));
|
|
s3c24xx_set_timer_source(S3C24XX_PWM3, S3C24XX_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,
|
|
.nr_irqs = NR_IRQS_S3C2416,
|
|
|
|
.init_irq = s3c2416_init_irq,
|
|
.map_io = smdk2416_map_io,
|
|
.init_machine = smdk2416_machine_init,
|
|
.init_time = smdk2416_init_time,
|
|
MACHINE_END
|