2013-03-29 17:49:37 +09:00
/*
* Lager board support
*
* Copyright ( C ) 2013 Renesas Solutions Corp .
* Copyright ( C ) 2013 Magnus Damm
*
* 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 ; version 2 of the License .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA
*/
2013-05-13 16:04:31 +09:00
# include <linux/gpio.h>
# include <linux/gpio_keys.h>
# include <linux/input.h>
2013-03-29 17:49:37 +09:00
# include <linux/interrupt.h>
# include <linux/kernel.h>
2013-04-23 02:37:05 +00:00
# include <linux/leds.h>
2013-07-08 17:54:43 +02:00
# include <linux/mmc/host.h>
# include <linux/mmc/sh_mmcif.h>
2013-04-08 11:36:22 +02:00
# include <linux/pinctrl/machine.h>
2013-04-23 02:37:05 +00:00
# include <linux/platform_data/gpio-rcar.h>
2013-04-16 12:39:11 +02:00
# include <linux/platform_data/rcar-du.h>
2013-03-29 17:49:37 +09:00
# include <linux/platform_device.h>
2013-07-08 17:54:43 +02:00
# include <linux/regulator/fixed.h>
# include <linux/regulator/machine.h>
2013-08-06 16:50:10 +09:00
# include <linux/sh_eth.h>
2013-03-29 17:49:37 +09:00
# include <mach/common.h>
2013-07-08 17:54:43 +02:00
# include <mach/irqs.h>
2013-03-29 17:49:37 +09:00
# include <mach/r8a7790.h>
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
2013-04-16 12:39:11 +02:00
/* DU */
static struct rcar_du_encoder_data lager_du_encoders [ ] = {
{
. type = RCAR_DU_ENCODER_VGA ,
. output = RCAR_DU_OUTPUT_DPAD0 ,
} , {
. type = RCAR_DU_ENCODER_NONE ,
. output = RCAR_DU_OUTPUT_LVDS1 ,
. connector . lvds . panel = {
. width_mm = 210 ,
. height_mm = 158 ,
. mode = {
. clock = 65000 ,
. hdisplay = 1024 ,
. hsync_start = 1048 ,
. hsync_end = 1184 ,
. htotal = 1344 ,
. vdisplay = 768 ,
. vsync_start = 771 ,
. vsync_end = 777 ,
. vtotal = 806 ,
. flags = 0 ,
} ,
} ,
} ,
} ;
static const struct rcar_du_platform_data lager_du_pdata __initconst = {
. encoders = lager_du_encoders ,
. num_encoders = ARRAY_SIZE ( lager_du_encoders ) ,
} ;
static const struct resource du_resources [ ] __initconst = {
DEFINE_RES_MEM ( 0xfeb00000 , 0x70000 ) ,
DEFINE_RES_MEM_NAMED ( 0xfeb90000 , 0x1c , " lvds.0 " ) ,
DEFINE_RES_MEM_NAMED ( 0xfeb94000 , 0x1c , " lvds.1 " ) ,
DEFINE_RES_IRQ ( gic_spi ( 256 ) ) ,
DEFINE_RES_IRQ ( gic_spi ( 268 ) ) ,
DEFINE_RES_IRQ ( gic_spi ( 269 ) ) ,
} ;
static void __init lager_add_du_device ( void )
{
struct platform_device_info info = {
. name = " rcar-du-r8a7790 " ,
. id = - 1 ,
. res = du_resources ,
. num_res = ARRAY_SIZE ( du_resources ) ,
2013-08-22 17:55:08 +02:00
. data = & lager_du_pdata ,
. size_data = sizeof ( lager_du_pdata ) ,
2013-04-16 12:39:11 +02:00
. dma_mask = DMA_BIT_MASK ( 32 ) ,
} ;
platform_device_register_full ( & info ) ;
}
2013-04-23 02:37:05 +00:00
/* LEDS */
static struct gpio_led lager_leds [ ] = {
{
. name = " led8 " ,
. gpio = RCAR_GP_PIN ( 5 , 17 ) ,
. default_state = LEDS_GPIO_DEFSTATE_ON ,
} , {
. name = " led7 " ,
. gpio = RCAR_GP_PIN ( 4 , 23 ) ,
. default_state = LEDS_GPIO_DEFSTATE_ON ,
} , {
. name = " led6 " ,
. gpio = RCAR_GP_PIN ( 4 , 22 ) ,
. default_state = LEDS_GPIO_DEFSTATE_ON ,
} ,
} ;
2013-05-13 16:04:31 +09:00
static __initdata struct gpio_led_platform_data lager_leds_pdata = {
2013-04-23 02:37:05 +00:00
. leds = lager_leds ,
. num_leds = ARRAY_SIZE ( lager_leds ) ,
} ;
2013-05-13 16:04:31 +09:00
/* GPIO KEY */
# define GPIO_KEY(c, g, d, ...) \
{ . code = c , . gpio = g , . desc = d , . active_low = 1 }
2013-07-26 17:53:42 +09:00
static struct gpio_keys_button gpio_buttons [ ] = {
2013-05-13 16:04:31 +09:00
GPIO_KEY ( KEY_4 , RCAR_GP_PIN ( 1 , 28 ) , " SW2-pin4 " ) ,
GPIO_KEY ( KEY_3 , RCAR_GP_PIN ( 1 , 26 ) , " SW2-pin3 " ) ,
GPIO_KEY ( KEY_2 , RCAR_GP_PIN ( 1 , 24 ) , " SW2-pin2 " ) ,
GPIO_KEY ( KEY_1 , RCAR_GP_PIN ( 1 , 14 ) , " SW2-pin1 " ) ,
} ;
static __initdata struct gpio_keys_platform_data lager_keys_pdata = {
. buttons = gpio_buttons ,
. nbuttons = ARRAY_SIZE ( gpio_buttons ) ,
} ;
2013-07-08 17:54:43 +02:00
/* Fixed 3.3V regulator to be used by MMCIF */
static struct regulator_consumer_supply fixed3v3_power_consumers [ ] =
{
REGULATOR_SUPPLY ( " vmmc " , " sh_mmcif.1 " ) ,
} ;
/* MMCIF */
2013-08-01 18:34:37 -07:00
static struct sh_mmcif_plat_data mmcif1_pdata __initdata = {
2013-07-08 17:54:43 +02:00
. caps = MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE ,
} ;
2013-08-01 18:34:37 -07:00
static struct resource mmcif1_resources [ ] __initdata = {
2013-07-08 17:54:43 +02:00
DEFINE_RES_MEM_NAMED ( 0xee220000 , 0x80 , " MMCIF1 " ) ,
DEFINE_RES_IRQ ( gic_spi ( 170 ) ) ,
} ;
2013-08-06 16:50:10 +09:00
/* Ether */
static struct sh_eth_plat_data ether_pdata __initdata = {
. phy = 0x1 ,
. edmac_endian = EDMAC_LITTLE_ENDIAN ,
. phy_interface = PHY_INTERFACE_MODE_RMII ,
. ether_link_active_low = 1 ,
} ;
static struct resource ether_resources [ ] __initdata = {
DEFINE_RES_MEM ( 0xee700000 , 0x400 ) ,
DEFINE_RES_IRQ ( gic_spi ( 162 ) ) ,
} ;
2013-04-08 11:36:22 +02:00
static const struct pinctrl_map lager_pinctrl_map [ ] = {
2013-04-16 12:39:11 +02:00
/* DU (CN10: ARGB0, CN13: LVDS) */
PIN_MAP_MUX_GROUP_DEFAULT ( " rcar-du-r8a7790 " , " pfc-r8a7790 " ,
" du_rgb666 " , " du " ) ,
PIN_MAP_MUX_GROUP_DEFAULT ( " rcar-du-r8a7790 " , " pfc-r8a7790 " ,
" du_sync_1 " , " du " ) ,
PIN_MAP_MUX_GROUP_DEFAULT ( " rcar-du-r8a7790 " , " pfc-r8a7790 " ,
" du_clk_out_0 " , " du " ) ,
2013-04-08 11:36:22 +02:00
/* SCIF0 (CN19: DEBUG SERIAL0) */
PIN_MAP_MUX_GROUP_DEFAULT ( " sh-sci.6 " , " pfc-r8a7790 " ,
" scif0_data " , " scif0 " ) ,
/* SCIF1 (CN20: DEBUG SERIAL1) */
PIN_MAP_MUX_GROUP_DEFAULT ( " sh-sci.7 " , " pfc-r8a7790 " ,
" scif1_data " , " scif1 " ) ,
2013-07-08 17:54:43 +02:00
/* MMCIF1 */
PIN_MAP_MUX_GROUP_DEFAULT ( " sh_mmcif.1 " , " pfc-r8a7790 " ,
" mmc1_data8 " , " mmc1 " ) ,
PIN_MAP_MUX_GROUP_DEFAULT ( " sh_mmcif.1 " , " pfc-r8a7790 " ,
" mmc1_ctrl " , " mmc1 " ) ,
2013-08-06 16:50:10 +09:00
/* Ether */
PIN_MAP_MUX_GROUP_DEFAULT ( " r8a7790-ether " , " pfc-r8a7790 " ,
" eth_link " , " eth " ) ,
PIN_MAP_MUX_GROUP_DEFAULT ( " r8a7790-ether " , " pfc-r8a7790 " ,
" eth_mdio " , " eth " ) ,
PIN_MAP_MUX_GROUP_DEFAULT ( " r8a7790-ether " , " pfc-r8a7790 " ,
" eth_rmii " , " eth " ) ,
PIN_MAP_MUX_GROUP_DEFAULT ( " r8a7790-ether " , " pfc-r8a7790 " ,
" intc_irq0 " , " intc " ) ,
2013-04-08 11:36:22 +02:00
} ;
2013-03-29 17:49:37 +09:00
static void __init lager_add_standard_devices ( void )
{
r8a7790_clock_init ( ) ;
2013-04-08 11:36:22 +02:00
pinctrl_register_mappings ( lager_pinctrl_map ,
ARRAY_SIZE ( lager_pinctrl_map ) ) ;
r8a7790_pinmux_init ( ) ;
2013-03-29 17:49:37 +09:00
r8a7790_add_standard_devices ( ) ;
2013-04-23 02:37:05 +00:00
platform_device_register_data ( & platform_bus , " leds-gpio " , - 1 ,
& lager_leds_pdata ,
sizeof ( lager_leds_pdata ) ) ;
2013-05-13 16:04:31 +09:00
platform_device_register_data ( & platform_bus , " gpio-keys " , - 1 ,
& lager_keys_pdata ,
sizeof ( lager_keys_pdata ) ) ;
2013-07-08 17:54:43 +02:00
regulator_register_always_on ( 0 , " fixed-3.3V " , fixed3v3_power_consumers ,
ARRAY_SIZE ( fixed3v3_power_consumers ) , 3300000 ) ;
platform_device_register_resndata ( & platform_bus , " sh_mmcif " , 1 ,
mmcif1_resources , ARRAY_SIZE ( mmcif1_resources ) ,
& mmcif1_pdata , sizeof ( mmcif1_pdata ) ) ;
2013-08-06 16:50:10 +09:00
platform_device_register_resndata ( & platform_bus , " r8a7790-ether " , - 1 ,
ether_resources ,
ARRAY_SIZE ( ether_resources ) ,
& ether_pdata , sizeof ( ether_pdata ) ) ;
2013-04-16 12:39:11 +02:00
lager_add_du_device ( ) ;
2013-03-29 17:49:37 +09:00
}
static const char * lager_boards_compat_dt [ ] __initdata = {
" renesas,lager " ,
NULL ,
} ;
DT_MACHINE_START ( LAGER_DT , " lager " )
2013-06-28 20:27:13 +09:00
. init_early = r8a7790_init_delay ,
2013-04-08 10:23:37 +09:00
. init_time = r8a7790_timer_init ,
2013-03-29 17:49:37 +09:00
. init_machine = lager_add_standard_devices ,
. dt_compat = lager_boards_compat_dt ,
MACHINE_END