2019-06-04 11:11:33 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2005-04-17 02:20:36 +04:00
/*
2005-07-10 22:58:11 +04:00
* linux / arch / arm / mach - omap1 / board - h2 . c
2005-04-17 02:20:36 +04:00
*
* Board specific inits for OMAP - 1610 H2
*
* Copyright ( C ) 2001 RidgeRun , Inc .
* Author : Greg Lonnon < glonnon @ ridgerun . com >
*
* Copyright ( C ) 2002 MontaVista Software , Inc .
*
* Separated FPGA interrupts from innovator1510 . c and cleaned up for 2.6
* Copyright ( C ) 2004 Nokia Corporation by Tony Lindrgen < tony @ atomide . com >
*
* H2 specific changes and cleanup
* Copyright ( C ) 2004 Nokia Corporation by Imre Deak < imre . deak @ nokia . com >
*/
2011-07-26 13:53:52 +04:00
# include <linux/gpio.h>
2005-04-17 02:20:36 +04:00
# include <linux/kernel.h>
2005-10-29 22:07:23 +04:00
# include <linux/platform_device.h>
2005-04-17 02:20:36 +04:00
# include <linux/delay.h>
2007-10-14 01:56:30 +04:00
# include <linux/i2c.h>
2005-04-17 02:20:36 +04:00
# include <linux/mtd/mtd.h>
2018-09-07 01:38:46 +03:00
# include <linux/mtd/platnand.h>
2010-02-15 21:03:32 +03:00
# include <linux/mtd/physmap.h>
2006-04-02 20:46:30 +04:00
# include <linux/input.h>
2017-08-14 19:34:23 +03:00
# include <linux/mfd/tps65010.h>
2009-12-12 03:16:33 +03:00
# include <linux/smc91x.h>
2011-09-20 16:23:13 +04:00
# include <linux/omapfb.h>
2012-09-18 03:24:20 +04:00
# include <linux/platform_data/gpio-omap.h>
2012-03-13 22:14:39 +04:00
# include <linux/leds.h>
2005-04-17 02:20:36 +04:00
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
# include <asm/mach/map.h>
2012-09-19 21:46:56 +04:00
# include <mach/mux.h>
2012-11-30 20:41:50 +04:00
# include <linux/omap-dma.h>
2012-10-03 00:39:28 +04:00
# include <mach/tc.h>
2012-08-24 17:21:06 +04:00
# include <linux/platform_data/keypad-omap.h>
2015-01-30 12:45:33 +03:00
# include "flash.h"
2005-04-17 02:20:36 +04:00
2012-02-24 22:34:34 +04:00
# include <mach/hardware.h>
2012-06-04 11:56:15 +04:00
# include <mach/usb.h>
2012-02-24 22:34:34 +04:00
# include "common.h"
2009-03-24 04:07:33 +03:00
# include "board-h2.h"
/* At OMAP1610 Innovator the Ethernet is directly connected to CS1 */
# define OMAP1610_ETHR_START 0x04000300
2010-12-21 00:09:22 +03:00
static const unsigned int h2_keymap [ ] = {
2006-04-02 20:46:30 +04:00
KEY ( 0 , 0 , KEY_LEFT ) ,
2010-12-21 00:09:22 +03:00
KEY ( 1 , 0 , KEY_RIGHT ) ,
KEY ( 2 , 0 , KEY_3 ) ,
KEY ( 3 , 0 , KEY_F10 ) ,
KEY ( 4 , 0 , KEY_F5 ) ,
KEY ( 5 , 0 , KEY_9 ) ,
KEY ( 0 , 1 , KEY_DOWN ) ,
2006-04-02 20:46:30 +04:00
KEY ( 1 , 1 , KEY_UP ) ,
2010-12-21 00:09:22 +03:00
KEY ( 2 , 1 , KEY_2 ) ,
KEY ( 3 , 1 , KEY_F9 ) ,
KEY ( 4 , 1 , KEY_F7 ) ,
KEY ( 5 , 1 , KEY_0 ) ,
KEY ( 0 , 2 , KEY_ENTER ) ,
KEY ( 1 , 2 , KEY_6 ) ,
2006-04-02 20:46:30 +04:00
KEY ( 2 , 2 , KEY_1 ) ,
2010-12-21 00:09:22 +03:00
KEY ( 3 , 2 , KEY_F2 ) ,
KEY ( 4 , 2 , KEY_F6 ) ,
KEY ( 5 , 2 , KEY_HOME ) ,
KEY ( 0 , 3 , KEY_8 ) ,
KEY ( 1 , 3 , KEY_5 ) ,
KEY ( 2 , 3 , KEY_F12 ) ,
2006-04-02 20:46:30 +04:00
KEY ( 3 , 3 , KEY_F3 ) ,
2010-12-21 00:09:22 +03:00
KEY ( 4 , 3 , KEY_F8 ) ,
KEY ( 5 , 3 , KEY_END ) ,
KEY ( 0 , 4 , KEY_7 ) ,
KEY ( 1 , 4 , KEY_4 ) ,
KEY ( 2 , 4 , KEY_F11 ) ,
KEY ( 3 , 4 , KEY_F1 ) ,
2006-04-02 20:46:30 +04:00
KEY ( 4 , 4 , KEY_F4 ) ,
2010-12-21 00:09:22 +03:00
KEY ( 5 , 4 , KEY_ESC ) ,
KEY ( 0 , 5 , KEY_F13 ) ,
KEY ( 1 , 5 , KEY_F14 ) ,
KEY ( 2 , 5 , KEY_F15 ) ,
KEY ( 3 , 5 , KEY_F16 ) ,
KEY ( 4 , 5 , KEY_SLEEP ) ,
2006-04-02 20:46:30 +04:00
} ;
static struct mtd_partition h2_nor_partitions [ ] = {
2005-04-17 02:20:36 +04:00
/* bootloader (U-Boot, etc) in first sector */
{
. name = " bootloader " ,
. offset = 0 ,
. size = SZ_128K ,
. mask_flags = MTD_WRITEABLE , /* force read-only */
} ,
/* bootloader params in the next sector */
{
. name = " params " ,
. offset = MTDPART_OFS_APPEND ,
. size = SZ_128K ,
. mask_flags = 0 ,
} ,
/* kernel */
{
. name = " kernel " ,
. offset = MTDPART_OFS_APPEND ,
. size = SZ_2M ,
. mask_flags = 0
} ,
/* file system */
{
. name = " filesystem " ,
. offset = MTDPART_OFS_APPEND ,
. size = MTDPART_SIZ_FULL ,
. mask_flags = 0
}
} ;
2010-02-15 21:03:32 +03:00
static struct physmap_flash_data h2_nor_data = {
2005-04-17 02:20:36 +04:00
. width = 2 ,
2010-02-15 21:03:32 +03:00
. set_vpp = omap1_set_vpp ,
2006-04-02 20:46:30 +04:00
. parts = h2_nor_partitions ,
. nr_parts = ARRAY_SIZE ( h2_nor_partitions ) ,
2005-04-17 02:20:36 +04:00
} ;
2006-04-02 20:46:30 +04:00
static struct resource h2_nor_resource = {
2005-09-09 02:07:38 +04:00
/* This is on CS3, wherever it's mapped */
2005-04-17 02:20:36 +04:00
. flags = IORESOURCE_MEM ,
} ;
2006-04-02 20:46:30 +04:00
static struct platform_device h2_nor_device = {
2010-02-15 21:03:32 +03:00
. name = " physmap-flash " ,
2005-04-17 02:20:36 +04:00
. id = 0 ,
. dev = {
2006-04-02 20:46:30 +04:00
. platform_data = & h2_nor_data ,
2005-04-17 02:20:36 +04:00
} ,
. num_resources = 1 ,
2006-04-02 20:46:30 +04:00
. resource = & h2_nor_resource ,
2005-04-17 02:20:36 +04:00
} ;
2006-12-08 00:58:17 +03:00
static struct mtd_partition h2_nand_partitions [ ] = {
#if 0
/* REVISIT: enable these partitions if you make NAND BOOT
* work on your H2 ( rev C or newer ) ; published versions of
* x - load only support P2 and H3 .
*/
{
. name = " xloader " ,
. offset = 0 ,
. size = 64 * 1024 ,
. mask_flags = MTD_WRITEABLE , /* force read-only */
} ,
{
. name = " bootloader " ,
. offset = MTDPART_OFS_APPEND ,
. size = 256 * 1024 ,
. mask_flags = MTD_WRITEABLE , /* force read-only */
} ,
{
. name = " params " ,
. offset = MTDPART_OFS_APPEND ,
. size = 192 * 1024 ,
} ,
{
. name = " kernel " ,
. offset = MTDPART_OFS_APPEND ,
. size = 2 * SZ_1M ,
} ,
# endif
{
. name = " filesystem " ,
. size = MTDPART_SIZ_FULL ,
. offset = MTDPART_OFS_APPEND ,
} ,
} ;
2009-12-12 03:16:33 +03:00
# define H2_NAND_RB_GPIO_PIN 62
2018-09-06 15:05:13 +03:00
static int h2_nand_dev_ready ( struct nand_chip * chip )
2009-12-12 03:16:33 +03:00
{
return gpio_get_value ( H2_NAND_RB_GPIO_PIN ) ;
}
2011-01-28 03:39:43 +03:00
static struct platform_nand_data h2_nand_platdata = {
2009-12-12 03:16:33 +03:00
. chip = {
. nr_chips = 1 ,
. chip_offset = 0 ,
. nr_partitions = ARRAY_SIZE ( h2_nand_partitions ) ,
. partitions = h2_nand_partitions ,
. options = NAND_SAMSUNG_LP_OPTIONS ,
} ,
. ctrl = {
2012-04-13 16:34:31 +04:00
. cmd_ctrl = omap1_nand_cmd_ctl ,
2009-12-12 03:16:33 +03:00
. dev_ready = h2_nand_dev_ready ,
} ,
2006-12-08 00:58:17 +03:00
} ;
static struct resource h2_nand_resource = {
. flags = IORESOURCE_MEM ,
} ;
static struct platform_device h2_nand_device = {
2009-12-12 03:16:33 +03:00
. name = " gen_nand " ,
2006-12-08 00:58:17 +03:00
. id = 0 ,
. dev = {
2009-12-12 03:16:33 +03:00
. platform_data = & h2_nand_platdata ,
2006-12-08 00:58:17 +03:00
} ,
. num_resources = 1 ,
. resource = & h2_nand_resource ,
} ;
2009-12-12 03:16:33 +03:00
static struct smc91x_platdata h2_smc91x_info = {
. flags = SMC91X_USE_16BIT | SMC91X_NOWAIT ,
. leda = RPC_LED_100_10 ,
. ledb = RPC_LED_TX_RX ,
} ;
2005-04-17 02:20:36 +04:00
static struct resource h2_smc91x_resources [ ] = {
[ 0 ] = {
. start = OMAP1610_ETHR_START , /* Physical */
. end = OMAP1610_ETHR_START + 0xf ,
. flags = IORESOURCE_MEM ,
} ,
[ 1 ] = {
2008-01-15 01:30:10 +03:00
. flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE ,
2005-04-17 02:20:36 +04:00
} ,
} ;
static struct platform_device h2_smc91x_device = {
. name = " smc91x " ,
. id = 0 ,
2009-12-12 03:16:33 +03:00
. dev = {
. platform_data = & h2_smc91x_info ,
} ,
2005-04-17 02:20:36 +04:00
. num_resources = ARRAY_SIZE ( h2_smc91x_resources ) ,
. resource = h2_smc91x_resources ,
} ;
2006-04-02 20:46:30 +04:00
static struct resource h2_kp_resources [ ] = {
[ 0 ] = {
. start = INT_KEYBOARD ,
. end = INT_KEYBOARD ,
. flags = IORESOURCE_IRQ ,
} ,
} ;
2010-12-21 00:09:22 +03:00
static const struct matrix_keymap_data h2_keymap_data = {
. keymap = h2_keymap ,
. keymap_size = ARRAY_SIZE ( h2_keymap ) ,
} ;
2006-04-02 20:46:30 +04:00
static struct omap_kp_platform_data h2_kp_data = {
2006-09-29 12:59:20 +04:00
. rows = 8 ,
. cols = 8 ,
2010-12-21 00:09:22 +03:00
. keymap_data = & h2_keymap_data ,
. rep = true ,
2006-09-29 12:59:20 +04:00
. delay = 9 ,
2010-12-21 00:09:22 +03:00
. dbounce = true ,
2006-04-02 20:46:30 +04:00
} ;
static struct platform_device h2_kp_device = {
. name = " omap-keypad " ,
. id = - 1 ,
. dev = {
. platform_data = & h2_kp_data ,
} ,
. num_resources = ARRAY_SIZE ( h2_kp_resources ) ,
. resource = h2_kp_resources ,
} ;
2017-12-26 09:37:11 +03:00
static const struct gpio_led h2_gpio_led_pins [ ] = {
2012-03-13 22:14:39 +04:00
{
. name = " h2:red " ,
. default_trigger = " heartbeat " ,
. gpio = 3 ,
} ,
{
. name = " h2:green " ,
. default_trigger = " cpu0 " ,
. gpio = OMAP_MPUIO ( 4 ) ,
} ,
} ;
static struct gpio_led_platform_data h2_gpio_led_data = {
. leds = h2_gpio_led_pins ,
. num_leds = ARRAY_SIZE ( h2_gpio_led_pins ) ,
} ;
static struct platform_device h2_gpio_leds = {
. name = " leds-gpio " ,
. id = - 1 ,
. dev = {
. platform_data = & h2_gpio_led_data ,
} ,
} ;
2005-04-17 02:20:36 +04:00
static struct platform_device * h2_devices [ ] __initdata = {
2006-04-02 20:46:30 +04:00
& h2_nor_device ,
2007-12-12 00:50:17 +03:00
& h2_nand_device ,
2005-04-17 02:20:36 +04:00
& h2_smc91x_device ,
2006-04-02 20:46:30 +04:00
& h2_kp_device ,
2012-03-13 22:14:39 +04:00
& h2_gpio_leds ,
2005-04-17 02:20:36 +04:00
} ;
static void __init h2_init_smc91x ( void )
{
2008-12-11 04:35:30 +03:00
if ( gpio_request ( 0 , " SMC91x irq " ) < 0 ) {
2005-04-17 02:20:36 +04:00
printk ( " Error requesting gpio 0 for smc91x irq \n " ) ;
return ;
}
}
2008-12-11 04:37:16 +03:00
static int tps_setup ( struct i2c_client * client , void * context )
{
2014-03-21 16:33:03 +04:00
if ( ! IS_BUILTIN ( CONFIG_TPS65010 ) )
return - ENOSYS ;
2008-12-11 04:37:16 +03:00
tps65010_config_vregs1 ( TPS_LDO2_ENABLE | TPS_VLDO2_3_0V |
TPS_LDO1_ENABLE | TPS_VLDO1_3_0V ) ;
return 0 ;
}
static struct tps65010_board tps_board = {
. base = H2_TPS_GPIO_BASE ,
. outmask = 0x0f ,
. setup = tps_setup ,
} ;
2007-12-19 07:58:32 +03:00
static struct i2c_board_info __initdata h2_i2c_board_info [ ] = {
{
2008-02-29 01:40:53 +03:00
I2C_BOARD_INFO ( " tps65010 " , 0x48 ) ,
2008-12-11 04:37:16 +03:00
. platform_data = & tps_board ,
2008-02-29 01:40:53 +03:00
} , {
2007-12-19 07:58:32 +03:00
I2C_BOARD_INFO ( " isp1301_omap " , 0x2d ) ,
} ,
} ;
2005-04-17 02:20:36 +04:00
static struct omap_usb_config h2_usb_config __initdata = {
/* usb1 has a Mini-AB port and external isp1301 transceiver */
. otg = 2 ,
2014-05-16 14:00:57 +04:00
# if IS_ENABLED(CONFIG_USB_OMAP)
2007-12-14 05:27:15 +03:00
. hmc_mode = 19 , /* 0:host(off) 1:dev|otg 2:disabled */
/* .hmc_mode = 21,*/ /* 0:host(off) 1:dev(loopback) 2:host(loopback) */
2016-08-11 22:29:44 +03:00
# elif IS_ENABLED(CONFIG_USB_OHCI_HCD)
2005-04-17 02:20:36 +04:00
/* needs OTG cable, or NONSTANDARD (B-to-MiniB) */
2007-12-14 05:27:15 +03:00
. hmc_mode = 20 , /* 1:dev|otg(off) 1:host 2:disabled */
2005-04-17 02:20:36 +04:00
# endif
. pins [ 1 ] = 3 ,
} ;
2017-08-22 09:25:50 +03:00
static const struct omap_lcd_config h2_lcd_config __initconst = {
2005-11-10 17:26:48 +03:00
. ctrl_name = " internal " ,
} ;
2005-04-17 02:20:36 +04:00
static void __init h2_init ( void )
{
2010-12-08 03:26:55 +03:00
h2_init_smc91x ( ) ;
2006-04-02 20:46:30 +04:00
/* Here we assume the NOR boot config: NOR on CS3 (possibly swapped
* to address 0 by a dip switch ) , NAND on CS2B . The NAND driver will
* notice whether a NAND chip is enabled at probe time .
*
* FIXME revC boards ( and H3 ) support NAND - boot , with a dip switch to
* put NOR on CS2B and NAND ( which on H2 may be 16 bit ) on CS3 . Try
* detecting that in code here , to avoid probing every possible flash
* configuration . . .
2005-09-09 02:07:38 +04:00
*/
2006-04-02 20:46:30 +04:00
h2_nor_resource . end = h2_nor_resource . start = omap_cs3_phys ( ) ;
h2_nor_resource . end + = SZ_32M - 1 ;
2006-12-08 00:58:17 +03:00
h2_nand_resource . end = h2_nand_resource . start = OMAP_CS2B_PHYS ;
h2_nand_resource . end + = SZ_4K - 1 ;
2012-11-09 00:23:09 +04:00
BUG_ON ( gpio_request ( H2_NAND_RB_GPIO_PIN , " NAND ready " ) < 0 ) ;
2008-12-11 04:35:30 +03:00
gpio_direction_input ( H2_NAND_RB_GPIO_PIN ) ;
2006-12-08 00:58:17 +03:00
2006-04-02 20:46:30 +04:00
omap_cfg_reg ( L3_1610_FLASH_CS2B_OE ) ;
omap_cfg_reg ( M8_1610_FLASH_CS2B_WE ) ;
2005-09-09 02:07:38 +04:00
/* MMC: card detect and WP */
2007-12-14 05:27:15 +03:00
/* omap_cfg_reg(U19_ARMIO1); */ /* CD */
2005-09-09 02:07:38 +04:00
omap_cfg_reg ( BALLOUT_V8_ARMIO3 ) ; /* WP */
2010-07-05 17:31:39 +04:00
/* Mux pins for keypad */
omap_cfg_reg ( F18_1610_KBC0 ) ;
omap_cfg_reg ( D20_1610_KBC1 ) ;
omap_cfg_reg ( D19_1610_KBC2 ) ;
omap_cfg_reg ( E18_1610_KBC3 ) ;
omap_cfg_reg ( C21_1610_KBC4 ) ;
omap_cfg_reg ( G18_1610_KBR0 ) ;
omap_cfg_reg ( F19_1610_KBR1 ) ;
omap_cfg_reg ( H14_1610_KBR2 ) ;
omap_cfg_reg ( E20_1610_KBR3 ) ;
omap_cfg_reg ( E19_1610_KBR4 ) ;
omap_cfg_reg ( N19_1610_KBR5 ) ;
2012-03-13 22:14:39 +04:00
/* GPIO based LEDs */
omap_cfg_reg ( P18_1610_GPIO3 ) ;
omap_cfg_reg ( MPUIO4 ) ;
2012-03-29 19:41:01 +04:00
h2_smc91x_resources [ 1 ] . start = gpio_to_irq ( 0 ) ;
h2_smc91x_resources [ 1 ] . end = gpio_to_irq ( 0 ) ;
2005-04-17 02:20:36 +04:00
platform_add_devices ( h2_devices , ARRAY_SIZE ( h2_devices ) ) ;
2005-11-10 17:26:48 +03:00
omap_serial_init ( ) ;
2012-03-29 19:41:01 +04:00
h2_i2c_board_info [ 0 ] . irq = gpio_to_irq ( 58 ) ;
h2_i2c_board_info [ 1 ] . irq = gpio_to_irq ( 2 ) ;
2007-11-07 07:54:32 +03:00
omap_register_i2c_bus ( 1 , 100 , h2_i2c_board_info ,
ARRAY_SIZE ( h2_i2c_board_info ) ) ;
2010-07-05 17:31:30 +04:00
omap1_usb_init ( & h2_usb_config ) ;
2007-11-27 07:01:45 +03:00
h2_mmc_init ( ) ;
2011-09-20 16:23:13 +04:00
omapfb_set_lcd_config ( & h2_lcd_config ) ;
2005-04-17 02:20:36 +04:00
}
MACHINE_START ( OMAP_H2 , " TI-H2 " )
2005-07-03 20:38:58 +04:00
/* Maintainer: Imre Deak <imre.deak@nokia.com> */
2011-07-06 06:38:15 +04:00
. atag_offset = 0x100 ,
2011-10-06 02:14:02 +04:00
. map_io = omap16xx_map_io ,
. init_early = omap1_init_early ,
. init_irq = omap1_init_irq ,
2015-05-20 19:01:21 +03:00
. handle_irq = omap1_handle_irq ,
2005-07-03 20:38:58 +04:00
. init_machine = h2_init ,
2012-04-26 09:49:29 +04:00
. init_late = omap1_init_late ,
2012-11-08 23:40:59 +04:00
. init_time = omap1_timer_init ,
2011-11-05 21:06:28 +04:00
. restart = omap1_restart ,
2005-04-17 02:20:36 +04:00
MACHINE_END