2010-02-15 01:16:01 +01:00
/*
* arch / arm / mach - ep93xx / snappercl15 . c
* Bluewater Systems Snapper CL15 system module
*
* Copyright ( C ) 2009 Bluewater Systems Ltd
2011-06-15 14:45:36 +10:00
* Author : Ryan Mallon
2010-02-15 01:16:01 +01:00
*
* NAND code adapted from driver by :
* Andre Renaud < andre @ bluewatersys . com >
* James R . McKaskill
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or ( at
* your option ) any later version .
*
*/
# include <linux/platform_device.h>
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/io.h>
# include <linux/i2c.h>
# include <linux/i2c-gpio.h>
# include <linux/fb.h>
# include <linux/mtd/partitions.h>
# include <linux/mtd/nand.h>
# include <mach/hardware.h>
2012-08-24 15:12:11 +02:00
# include <linux/platform_data/video-ep93xx.h>
2011-09-22 08:07:00 +01:00
# include <mach/gpio-ep93xx.h>
2010-02-15 01:16:01 +01:00
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
2012-01-11 09:06:08 +11:00
# include "soc.h"
2010-02-15 01:16:01 +01:00
# define SNAPPERCL15_NAND_BASE (EP93XX_CS7_PHYS_BASE + SZ_16M)
# define SNAPPERCL15_NAND_WPN (1 << 8) /* Write protect (active low) */
# define SNAPPERCL15_NAND_ALE (1 << 9) /* Address latch */
# define SNAPPERCL15_NAND_CLE (1 << 10) /* Command latch */
# define SNAPPERCL15_NAND_CEN (1 << 11) /* Chip enable (active low) */
# define SNAPPERCL15_NAND_RDY (1 << 14) /* Device ready */
# define NAND_CTRL_ADDR(chip) (chip->IO_ADDR_W + 0x40)
static void snappercl15_nand_cmd_ctrl ( struct mtd_info * mtd , int cmd ,
unsigned int ctrl )
{
2015-12-01 12:02:58 +01:00
struct nand_chip * chip = mtd_to_nand ( mtd ) ;
2010-02-15 01:16:01 +01:00
static u16 nand_state = SNAPPERCL15_NAND_WPN ;
u16 set ;
if ( ctrl & NAND_CTRL_CHANGE ) {
set = SNAPPERCL15_NAND_CEN | SNAPPERCL15_NAND_WPN ;
if ( ctrl & NAND_NCE )
set & = ~ SNAPPERCL15_NAND_CEN ;
if ( ctrl & NAND_CLE )
set | = SNAPPERCL15_NAND_CLE ;
if ( ctrl & NAND_ALE )
set | = SNAPPERCL15_NAND_ALE ;
nand_state & = ~ ( SNAPPERCL15_NAND_CEN |
SNAPPERCL15_NAND_CLE |
SNAPPERCL15_NAND_ALE ) ;
nand_state | = set ;
__raw_writew ( nand_state , NAND_CTRL_ADDR ( chip ) ) ;
}
if ( cmd ! = NAND_CMD_NONE )
__raw_writew ( ( cmd & 0xff ) | nand_state , chip - > IO_ADDR_W ) ;
}
static int snappercl15_nand_dev_ready ( struct mtd_info * mtd )
{
2015-12-01 12:02:58 +01:00
struct nand_chip * chip = mtd_to_nand ( mtd ) ;
2010-02-15 01:16:01 +01:00
return ! ! ( __raw_readw ( NAND_CTRL_ADDR ( chip ) ) & SNAPPERCL15_NAND_RDY ) ;
}
static struct mtd_partition snappercl15_nand_parts [ ] = {
{
. name = " Kernel " ,
. offset = 0 ,
. size = SZ_2M ,
} ,
{
. name = " Filesystem " ,
. offset = MTDPART_OFS_APPEND ,
. size = MTDPART_SIZ_FULL ,
} ,
} ;
static struct platform_nand_data snappercl15_nand_data = {
. chip = {
. nr_chips = 1 ,
. partitions = snappercl15_nand_parts ,
. nr_partitions = ARRAY_SIZE ( snappercl15_nand_parts ) ,
. chip_delay = 25 ,
} ,
. ctrl = {
. dev_ready = snappercl15_nand_dev_ready ,
. cmd_ctrl = snappercl15_nand_cmd_ctrl ,
} ,
} ;
static struct resource snappercl15_nand_resource [ ] = {
{
. start = SNAPPERCL15_NAND_BASE ,
. end = SNAPPERCL15_NAND_BASE + SZ_4K - 1 ,
. flags = IORESOURCE_MEM ,
} ,
} ;
static struct platform_device snappercl15_nand_device = {
. name = " gen_nand " ,
. id = - 1 ,
. dev . platform_data = & snappercl15_nand_data ,
. resource = snappercl15_nand_resource ,
. num_resources = ARRAY_SIZE ( snappercl15_nand_resource ) ,
} ;
2010-03-18 18:04:06 +01:00
static struct ep93xx_eth_data __initdata snappercl15_eth_data = {
2010-02-15 01:16:01 +01:00
. phy_id = 1 ,
} ;
2010-03-18 18:04:06 +01:00
static struct i2c_gpio_platform_data __initdata snappercl15_i2c_gpio_data = {
2010-02-15 01:16:01 +01:00
. sda_pin = EP93XX_GPIO_LINE_EEDAT ,
. sda_is_open_drain = 0 ,
. scl_pin = EP93XX_GPIO_LINE_EECLK ,
. scl_is_open_drain = 0 ,
. udelay = 0 ,
. timeout = 0 ,
} ;
static struct i2c_board_info __initdata snappercl15_i2c_data [ ] = {
{
/* Audio codec */
I2C_BOARD_INFO ( " tlv320aic23 " , 0x1a ) ,
} ,
} ;
2010-03-18 18:04:06 +01:00
static struct ep93xxfb_mach_info __initdata snappercl15_fb_info = {
2010-02-15 01:16:01 +01:00
} ;
2011-09-11 12:28:55 +03:00
static struct platform_device snappercl15_audio_device = {
. name = " snappercl15-audio " ,
. id = - 1 ,
} ;
static void __init snappercl15_register_audio ( void )
{
ep93xx_register_i2s ( ) ;
platform_device_register ( & snappercl15_audio_device ) ;
}
2010-02-15 01:16:01 +01:00
static void __init snappercl15_init_machine ( void )
{
ep93xx_init_devices ( ) ;
ep93xx_register_eth ( & snappercl15_eth_data , 1 ) ;
ep93xx_register_i2c ( & snappercl15_i2c_gpio_data , snappercl15_i2c_data ,
ARRAY_SIZE ( snappercl15_i2c_data ) ) ;
ep93xx_register_fb ( & snappercl15_fb_info ) ;
2011-09-11 12:28:55 +03:00
snappercl15_register_audio ( ) ;
2010-02-15 01:16:01 +01:00
platform_device_register ( & snappercl15_nand_device ) ;
}
MACHINE_START ( SNAPPER_CL15 , " Bluewater Systems Snapper CL15 " )
2011-06-15 14:45:36 +10:00
/* Maintainer: Ryan Mallon */
2011-07-05 22:38:11 -04:00
. atag_offset = 0x100 ,
2010-02-15 01:16:01 +01:00
. map_io = ep93xx_map_io ,
. init_irq = ep93xx_init_irq ,
2012-11-08 12:40:59 -07:00
. init_time = ep93xx_timer_init ,
2010-02-15 01:16:01 +01:00
. init_machine = snappercl15_init_machine ,
2012-04-26 10:05:15 +08:00
. init_late = ep93xx_init_late ,
2011-11-05 09:54:14 +00:00
. restart = ep93xx_restart ,
2010-02-15 01:16:01 +01:00
MACHINE_END