linux/arch/arm/mach-ep93xx/snappercl15.c
<<
>>
Prefs
   1/*
   2 * arch/arm/mach-ep93xx/snappercl15.c
   3 * Bluewater Systems Snapper CL15 system module
   4 *
   5 * Copyright (C) 2009 Bluewater Systems Ltd
   6 * Author: Ryan Mallon
   7 *
   8 * NAND code adapted from driver by:
   9 *   Andre Renaud <andre@bluewatersys.com>
  10 *   James R. McKaskill
  11 *
  12 * This program is free software; you can redistribute it and/or modify
  13 * it under the terms of the GNU General Public License as published by
  14 * the Free Software Foundation; either version 2 of the License, or (at
  15 * your option) any later version.
  16 *
  17 */
  18
  19#include <linux/platform_device.h>
  20#include <linux/kernel.h>
  21#include <linux/init.h>
  22#include <linux/io.h>
  23#include <linux/i2c.h>
  24#include <linux/i2c-gpio.h>
  25#include <linux/fb.h>
  26
  27#include <linux/mtd/partitions.h>
  28#include <linux/mtd/nand.h>
  29
  30#include <mach/hardware.h>
  31#include <linux/platform_data/video-ep93xx.h>
  32#include <mach/gpio-ep93xx.h>
  33
  34#include <asm/mach-types.h>
  35#include <asm/mach/arch.h>
  36
  37#include "soc.h"
  38
  39#define SNAPPERCL15_NAND_BASE   (EP93XX_CS7_PHYS_BASE + SZ_16M)
  40
  41#define SNAPPERCL15_NAND_WPN    (1 << 8)  /* Write protect (active low) */
  42#define SNAPPERCL15_NAND_ALE    (1 << 9)  /* Address latch */
  43#define SNAPPERCL15_NAND_CLE    (1 << 10) /* Command latch */
  44#define SNAPPERCL15_NAND_CEN    (1 << 11) /* Chip enable (active low) */
  45#define SNAPPERCL15_NAND_RDY    (1 << 14) /* Device ready */
  46
  47#define NAND_CTRL_ADDR(chip)    (chip->IO_ADDR_W + 0x40)
  48
  49static void snappercl15_nand_cmd_ctrl(struct mtd_info *mtd, int cmd,
  50                                      unsigned int ctrl)
  51{
  52        struct nand_chip *chip = mtd->priv;
  53        static u16 nand_state = SNAPPERCL15_NAND_WPN;
  54        u16 set;
  55
  56        if (ctrl & NAND_CTRL_CHANGE) {
  57                set = SNAPPERCL15_NAND_CEN | SNAPPERCL15_NAND_WPN;
  58
  59                if (ctrl & NAND_NCE)
  60                        set &= ~SNAPPERCL15_NAND_CEN;
  61                if (ctrl & NAND_CLE)
  62                        set |= SNAPPERCL15_NAND_CLE;
  63                if (ctrl & NAND_ALE)
  64                        set |= SNAPPERCL15_NAND_ALE;
  65
  66                nand_state &= ~(SNAPPERCL15_NAND_CEN |
  67                                SNAPPERCL15_NAND_CLE |
  68                                SNAPPERCL15_NAND_ALE);
  69                nand_state |= set;
  70                __raw_writew(nand_state, NAND_CTRL_ADDR(chip));
  71        }
  72
  73        if (cmd != NAND_CMD_NONE)
  74                __raw_writew((cmd & 0xff) | nand_state, chip->IO_ADDR_W);
  75}
  76
  77static int snappercl15_nand_dev_ready(struct mtd_info *mtd)
  78{
  79        struct nand_chip *chip = mtd->priv;
  80
  81        return !!(__raw_readw(NAND_CTRL_ADDR(chip)) & SNAPPERCL15_NAND_RDY);
  82}
  83
  84static struct mtd_partition snappercl15_nand_parts[] = {
  85        {
  86                .name           = "Kernel",
  87                .offset         = 0,
  88                .size           = SZ_2M,
  89        },
  90        {
  91                .name           = "Filesystem",
  92                .offset         = MTDPART_OFS_APPEND,
  93                .size           = MTDPART_SIZ_FULL,
  94        },
  95};
  96
  97static struct platform_nand_data snappercl15_nand_data = {
  98        .chip = {
  99                .nr_chips               = 1,
 100                .partitions             = snappercl15_nand_parts,
 101                .nr_partitions          = ARRAY_SIZE(snappercl15_nand_parts),
 102                .chip_delay             = 25,
 103        },
 104        .ctrl = {
 105                .dev_ready              = snappercl15_nand_dev_ready,
 106                .cmd_ctrl               = snappercl15_nand_cmd_ctrl,
 107        },
 108};
 109
 110static struct resource snappercl15_nand_resource[] = {
 111        {
 112                .start          = SNAPPERCL15_NAND_BASE,
 113                .end            = SNAPPERCL15_NAND_BASE + SZ_4K - 1,
 114                .flags          = IORESOURCE_MEM,
 115        },
 116};
 117
 118static struct platform_device snappercl15_nand_device = {
 119        .name                   = "gen_nand",
 120        .id                     = -1,
 121        .dev.platform_data      = &snappercl15_nand_data,
 122        .resource               = snappercl15_nand_resource,
 123        .num_resources          = ARRAY_SIZE(snappercl15_nand_resource),
 124};
 125
 126static struct ep93xx_eth_data __initdata snappercl15_eth_data = {
 127        .phy_id                 = 1,
 128};
 129
 130static struct i2c_gpio_platform_data __initdata snappercl15_i2c_gpio_data = {
 131        .sda_pin                = EP93XX_GPIO_LINE_EEDAT,
 132        .sda_is_open_drain      = 0,
 133        .scl_pin                = EP93XX_GPIO_LINE_EECLK,
 134        .scl_is_open_drain      = 0,
 135        .udelay                 = 0,
 136        .timeout                = 0,
 137};
 138
 139static struct i2c_board_info __initdata snappercl15_i2c_data[] = {
 140        {
 141                /* Audio codec */
 142                I2C_BOARD_INFO("tlv320aic23", 0x1a),
 143        },
 144};
 145
 146static struct ep93xxfb_mach_info __initdata snappercl15_fb_info = {
 147};
 148
 149static struct platform_device snappercl15_audio_device = {
 150        .name           = "snappercl15-audio",
 151        .id             = -1,
 152};
 153
 154static void __init snappercl15_register_audio(void)
 155{
 156        ep93xx_register_i2s();
 157        platform_device_register(&snappercl15_audio_device);
 158}
 159
 160static void __init snappercl15_init_machine(void)
 161{
 162        ep93xx_init_devices();
 163        ep93xx_register_eth(&snappercl15_eth_data, 1);
 164        ep93xx_register_i2c(&snappercl15_i2c_gpio_data, snappercl15_i2c_data,
 165                            ARRAY_SIZE(snappercl15_i2c_data));
 166        ep93xx_register_fb(&snappercl15_fb_info);
 167        snappercl15_register_audio();
 168        platform_device_register(&snappercl15_nand_device);
 169}
 170
 171MACHINE_START(SNAPPER_CL15, "Bluewater Systems Snapper CL15")
 172        /* Maintainer: Ryan Mallon */
 173        .atag_offset    = 0x100,
 174        .map_io         = ep93xx_map_io,
 175        .init_irq       = ep93xx_init_irq,
 176        .init_time      = ep93xx_timer_init,
 177        .init_machine   = snappercl15_init_machine,
 178        .init_late      = ep93xx_init_late,
 179        .restart        = ep93xx_restart,
 180MACHINE_END
 181