linux/arch/arm/mach-s3c24xx/mach-amlm5900.c
<<
>>
Prefs
   1/* linux/arch/arm/mach-s3c2410/mach-amlm5900.c
   2 *
   3 * linux/arch/arm/mach-s3c2410/mach-amlm5900.c
   4 *
   5 * Copyright (c) 2006 American Microsystems Limited
   6 *      David Anders <danders@amltd.com>
   7
   8 * This program is free software; you can redistribute it and/or
   9 * modify it under the terms of the GNU General Public License as
  10 * published by the Free Software Foundation; either version 2 of
  11 * the License, or (at your option) any later version.
  12 *
  13 * This program is distributed in the hope that it will be useful,
  14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16 * GNU General Public License for more details.
  17 *
  18 * You should have received a copy of the GNU General Public License
  19 * along with this program; if not, write to the Free Software
  20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  21 * MA 02111-1307 USA
  22 *
  23 * @History:
  24 * derived from linux/arch/arm/mach-s3c2410/mach-bast.c, written by
  25 * Ben Dooks <ben@simtec.co.uk>
  26 *
  27 ***********************************************************************/
  28
  29#include <linux/kernel.h>
  30#include <linux/types.h>
  31#include <linux/interrupt.h>
  32#include <linux/list.h>
  33#include <linux/timer.h>
  34#include <linux/init.h>
  35#include <linux/gpio.h>
  36#include <linux/device.h>
  37#include <linux/platform_device.h>
  38#include <linux/proc_fs.h>
  39#include <linux/serial_core.h>
  40#include <linux/serial_s3c.h>
  41#include <linux/io.h>
  42
  43#include <asm/mach/arch.h>
  44#include <asm/mach/map.h>
  45#include <asm/mach/irq.h>
  46#include <asm/mach/flash.h>
  47
  48#include <mach/hardware.h>
  49#include <asm/irq.h>
  50#include <asm/mach-types.h>
  51#include <mach/fb.h>
  52
  53#include <mach/regs-lcd.h>
  54#include <mach/regs-gpio.h>
  55#include <mach/gpio-samsung.h>
  56
  57#include <linux/platform_data/i2c-s3c2410.h>
  58#include <plat/devs.h>
  59#include <plat/cpu.h>
  60#include <plat/gpio-cfg.h>
  61
  62#include <linux/mtd/mtd.h>
  63#include <linux/mtd/partitions.h>
  64#include <linux/mtd/map.h>
  65#include <linux/mtd/physmap.h>
  66
  67#include <plat/samsung-time.h>
  68
  69#include "common.h"
  70
  71static struct resource amlm5900_nor_resource =
  72                        DEFINE_RES_MEM(0x00000000, SZ_16M);
  73
  74static struct mtd_partition amlm5900_mtd_partitions[] = {
  75        {
  76                .name           = "System",
  77                .size           = 0x240000,
  78                .offset         = 0,
  79                .mask_flags     = MTD_WRITEABLE,  /* force read-only */
  80        }, {
  81                .name           = "Kernel",
  82                .size           = 0x100000,
  83                .offset         = MTDPART_OFS_APPEND,
  84        }, {
  85                .name           = "Ramdisk",
  86                .size           = 0x300000,
  87                .offset         = MTDPART_OFS_APPEND,
  88        }, {
  89                .name           = "JFFS2",
  90                .size           = 0x9A0000,
  91                .offset         = MTDPART_OFS_APPEND,
  92        }, {
  93                .name           = "Settings",
  94                .size           = MTDPART_SIZ_FULL,
  95                .offset         = MTDPART_OFS_APPEND,
  96        }
  97};
  98
  99static struct physmap_flash_data amlm5900_flash_data = {
 100        .width          = 2,
 101        .parts          = amlm5900_mtd_partitions,
 102        .nr_parts       = ARRAY_SIZE(amlm5900_mtd_partitions),
 103};
 104
 105static struct platform_device amlm5900_device_nor = {
 106        .name           = "physmap-flash",
 107        .id             = 0,
 108        .dev = {
 109                        .platform_data = &amlm5900_flash_data,
 110                },
 111        .num_resources  = 1,
 112        .resource       = &amlm5900_nor_resource,
 113};
 114
 115static struct map_desc amlm5900_iodesc[] __initdata = {
 116};
 117
 118#define UCON S3C2410_UCON_DEFAULT
 119#define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB
 120#define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE
 121
 122static struct s3c2410_uartcfg amlm5900_uartcfgs[] = {
 123        [0] = {
 124                .hwport      = 0,
 125                .flags       = 0,
 126                .ucon        = UCON,
 127                .ulcon       = ULCON,
 128                .ufcon       = UFCON,
 129        },
 130        [1] = {
 131                .hwport      = 1,
 132                .flags       = 0,
 133                .ucon        = UCON,
 134                .ulcon       = ULCON,
 135                .ufcon       = UFCON,
 136        },
 137        [2] = {
 138                .hwport      = 2,
 139                .flags       = 0,
 140                .ucon        = UCON,
 141                .ulcon       = ULCON,
 142                .ufcon       = UFCON,
 143        }
 144};
 145
 146
 147static struct platform_device *amlm5900_devices[] __initdata = {
 148#ifdef CONFIG_FB_S3C2410
 149        &s3c_device_lcd,
 150#endif
 151        &s3c_device_adc,
 152        &s3c_device_wdt,
 153        &s3c_device_i2c0,
 154        &s3c_device_ohci,
 155        &s3c_device_rtc,
 156        &s3c_device_usbgadget,
 157        &s3c_device_sdi,
 158        &amlm5900_device_nor,
 159};
 160
 161static void __init amlm5900_map_io(void)
 162{
 163        s3c24xx_init_io(amlm5900_iodesc, ARRAY_SIZE(amlm5900_iodesc));
 164        s3c24xx_init_uarts(amlm5900_uartcfgs, ARRAY_SIZE(amlm5900_uartcfgs));
 165        samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4);
 166}
 167
 168static void __init amlm5900_init_time(void)
 169{
 170        s3c2410_init_clocks(12000000);
 171        samsung_timer_init();
 172}
 173
 174#ifdef CONFIG_FB_S3C2410
 175static struct s3c2410fb_display __initdata amlm5900_lcd_info = {
 176        .width          = 160,
 177        .height         = 160,
 178
 179        .type           = S3C2410_LCDCON1_STN4,
 180
 181        .pixclock       = 680000, /* HCLK = 100MHz */
 182        .xres           = 160,
 183        .yres           = 160,
 184        .bpp            = 4,
 185        .left_margin    = 1 << (4 + 3),
 186        .right_margin   = 8 << 3,
 187        .hsync_len      = 48,
 188        .upper_margin   = 0,
 189        .lower_margin   = 0,
 190
 191        .lcdcon5        = 0x00000001,
 192};
 193
 194static struct s3c2410fb_mach_info __initdata amlm5900_fb_info = {
 195
 196        .displays = &amlm5900_lcd_info,
 197        .num_displays = 1,
 198        .default_display = 0,
 199
 200        .gpccon =       0xaaaaaaaa,
 201        .gpccon_mask =  0xffffffff,
 202        .gpcup =        0x0000ffff,
 203        .gpcup_mask =   0xffffffff,
 204
 205        .gpdcon =       0xaaaaaaaa,
 206        .gpdcon_mask =  0xffffffff,
 207        .gpdup =        0x0000ffff,
 208        .gpdup_mask =   0xffffffff,
 209};
 210#endif
 211
 212static irqreturn_t
 213amlm5900_wake_interrupt(int irq, void *ignored)
 214{
 215        return IRQ_HANDLED;
 216}
 217
 218static void amlm5900_init_pm(void)
 219{
 220        int ret = 0;
 221
 222        ret = request_irq(IRQ_EINT9, &amlm5900_wake_interrupt,
 223                                IRQF_TRIGGER_RISING | IRQF_SHARED,
 224                                "amlm5900_wakeup", &amlm5900_wake_interrupt);
 225        if (ret != 0) {
 226                printk(KERN_ERR "AML-M5900: no wakeup irq, %d?\n", ret);
 227        } else {
 228                enable_irq_wake(IRQ_EINT9);
 229                /* configure the suspend/resume status pin */
 230                s3c_gpio_cfgpin(S3C2410_GPF(2), S3C2410_GPIO_OUTPUT);
 231                s3c_gpio_setpull(S3C2410_GPF(2), S3C_GPIO_PULL_UP);
 232        }
 233}
 234static void __init amlm5900_init(void)
 235{
 236        amlm5900_init_pm();
 237#ifdef CONFIG_FB_S3C2410
 238        s3c24xx_fb_set_platdata(&amlm5900_fb_info);
 239#endif
 240        s3c_i2c0_set_platdata(NULL);
 241        platform_add_devices(amlm5900_devices, ARRAY_SIZE(amlm5900_devices));
 242}
 243
 244MACHINE_START(AML_M5900, "AML_M5900")
 245        .atag_offset    = 0x100,
 246        .map_io         = amlm5900_map_io,
 247        .init_irq       = s3c2410_init_irq,
 248        .init_machine   = amlm5900_init,
 249        .init_time      = amlm5900_init_time,
 250MACHINE_END
 251