2013-03-29 17:00:02 +09:00
/*
* APE6EVM 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-03-29 17:00:21 +09:00
# include <linux/gpio.h>
2013-07-30 10:59:00 +09:00
# include <linux/gpio_keys.h>
# include <linux/input.h>
2013-03-29 17:00:02 +09:00
# include <linux/interrupt.h>
# include <linux/kernel.h>
2013-07-08 17:54:42 +02:00
# include <linux/mfd/tmio.h>
2013-07-10 10:13:08 +02:00
# include <linux/mmc/host.h>
# include <linux/mmc/sh_mmcif.h>
2013-07-08 17:54:42 +02:00
# include <linux/mmc/sh_mobile_sdhi.h>
2013-03-29 17:00:12 +09:00
# include <linux/pinctrl/machine.h>
2013-03-29 17:00:02 +09:00
# include <linux/platform_device.h>
2013-03-29 17:00:21 +09:00
# include <linux/regulator/fixed.h>
# include <linux/regulator/machine.h>
2013-04-04 21:24:27 -07:00
# include <linux/sh_clk.h>
2013-03-29 17:00:21 +09:00
# include <linux/smsc911x.h>
2014-06-20 18:53:02 +02:00
2013-03-29 17:00:02 +09:00
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
2014-06-17 16:47:37 +09:00
# include "common.h"
2014-06-17 16:47:29 +09:00
# include "irqs.h"
2014-06-20 18:53:02 +02:00
# include "r8a73a4.h"
2013-03-29 17:00:02 +09:00
2013-07-30 10:59:02 +09:00
/* LEDS */
static struct gpio_led ape6evm_leds [ ] = {
{
. name = " gnss-en " ,
. gpio = 28 ,
. default_state = LEDS_GPIO_DEFSTATE_OFF ,
} , {
. name = " nfc-nrst " ,
. gpio = 126 ,
. default_state = LEDS_GPIO_DEFSTATE_OFF ,
} , {
. name = " gnss-nrst " ,
. gpio = 132 ,
. default_state = LEDS_GPIO_DEFSTATE_OFF ,
} , {
. name = " bt-wakeup " ,
. gpio = 232 ,
. default_state = LEDS_GPIO_DEFSTATE_OFF ,
} , {
. name = " strobe " ,
. gpio = 250 ,
. default_state = LEDS_GPIO_DEFSTATE_OFF ,
} , {
. name = " bbresetout " ,
. gpio = 288 ,
. default_state = LEDS_GPIO_DEFSTATE_OFF ,
} ,
} ;
static __initdata struct gpio_led_platform_data ape6evm_leds_pdata = {
. leds = ape6evm_leds ,
. num_leds = ARRAY_SIZE ( ape6evm_leds ) ,
} ;
2013-07-30 10:59:00 +09:00
/* GPIO KEY */
# define GPIO_KEY(c, g, d, ...) \
{ . code = c , . gpio = g , . desc = d , . active_low = 1 }
static struct gpio_keys_button gpio_buttons [ ] = {
GPIO_KEY ( KEY_0 , 324 , " S16 " ) ,
GPIO_KEY ( KEY_MENU , 325 , " S17 " ) ,
GPIO_KEY ( KEY_HOME , 326 , " S18 " ) ,
GPIO_KEY ( KEY_BACK , 327 , " S19 " ) ,
GPIO_KEY ( KEY_VOLUMEUP , 328 , " S20 " ) ,
GPIO_KEY ( KEY_VOLUMEDOWN , 329 , " S21 " ) ,
} ;
2013-09-30 17:34:36 +02:00
static struct gpio_keys_platform_data ape6evm_keys_pdata __initdata = {
2013-07-30 10:59:00 +09:00
. buttons = gpio_buttons ,
. nbuttons = ARRAY_SIZE ( gpio_buttons ) ,
} ;
2013-03-29 17:00:21 +09:00
/* Dummy supplies, where voltage doesn't matter */
static struct regulator_consumer_supply dummy_supplies [ ] = {
REGULATOR_SUPPLY ( " vddvario " , " smsc911x " ) ,
REGULATOR_SUPPLY ( " vdd33a " , " smsc911x " ) ,
} ;
/* SMSC LAN9220 */
2013-07-31 14:40:14 +02:00
static const struct resource lan9220_res [ ] __initconst = {
2013-03-29 17:00:21 +09:00
DEFINE_RES_MEM ( 0x08000000 , 0x1000 ) ,
{
. start = irq_pin ( 40 ) , /* IRQ40 */
. flags = IORESOURCE_IRQ | IRQF_TRIGGER_HIGH ,
} ,
} ;
2013-07-31 14:40:14 +02:00
static const struct smsc911x_platform_config lan9220_data __initconst = {
2013-03-29 17:00:21 +09:00
. flags = SMSC911X_USE_32BIT ,
. irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL ,
. irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_HIGH ,
} ;
2013-07-10 10:13:08 +02:00
/*
2013-08-01 09:41:20 +02:00
* MMC0 power supplies :
* Both Vcc and VccQ to eMMC on APE6EVM are supplied by a tps80032 voltage
* regulator . Until support for it is added to this file we simulate the
* Vcc supply by a fixed always - on regulator
2013-07-10 10:13:08 +02:00
*/
2013-08-01 09:41:20 +02:00
static struct regulator_consumer_supply vcc_mmc0_consumers [ ] =
2013-07-10 10:13:08 +02:00
{
REGULATOR_SUPPLY ( " vmmc " , " sh_mmcif.0 " ) ,
2013-08-01 09:41:20 +02:00
} ;
/*
* SDHI0 power supplies :
* Vcc to SDHI0 on APE6EVM is supplied by a GPIO - switchable regulator . VccQ is
* provided by the same tps80032 regulator as both MMC0 voltages - see comment
* above
*/
static struct regulator_consumer_supply vcc_sdhi0_consumers [ ] =
{
2013-07-08 17:54:42 +02:00
REGULATOR_SUPPLY ( " vmmc " , " sh_mobile_sdhi.0 " ) ,
2013-08-01 09:41:20 +02:00
} ;
static struct regulator_init_data vcc_sdhi0_init_data = {
. constraints = {
. valid_ops_mask = REGULATOR_CHANGE_STATUS ,
} ,
. num_consumer_supplies = ARRAY_SIZE ( vcc_sdhi0_consumers ) ,
. consumer_supplies = vcc_sdhi0_consumers ,
} ;
static const struct fixed_voltage_config vcc_sdhi0_info __initconst = {
. supply_name = " SDHI0 Vcc " ,
. microvolts = 3300000 ,
. gpio = 76 ,
. enable_high = 1 ,
. init_data = & vcc_sdhi0_init_data ,
} ;
/*
* SDHI1 power supplies :
* Vcc and VccQ to SDHI1 on APE6EVM are both fixed at 3.3 V
*/
static struct regulator_consumer_supply vcc_sdhi1_consumers [ ] =
{
2013-07-08 17:54:42 +02:00
REGULATOR_SUPPLY ( " vmmc " , " sh_mobile_sdhi.1 " ) ,
2013-07-10 10:13:08 +02:00
} ;
/* MMCIF */
2013-07-31 14:40:14 +02:00
static const struct sh_mmcif_plat_data mmcif0_pdata __initconst = {
2013-07-10 10:13:08 +02:00
. caps = MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE ,
2013-07-22 15:16:16 +02:00
. slave_id_tx = SHDMA_SLAVE_MMCIF0_TX ,
. slave_id_rx = SHDMA_SLAVE_MMCIF0_RX ,
2013-07-10 21:21:16 +02:00
. ccs_unsupported = true ,
2013-07-10 10:13:08 +02:00
} ;
2013-07-31 14:40:14 +02:00
static const struct resource mmcif0_resources [ ] __initconst = {
2013-10-07 22:58:08 -07:00
DEFINE_RES_MEM ( 0xee200000 , 0x100 ) ,
2013-07-10 10:13:08 +02:00
DEFINE_RES_IRQ ( gic_spi ( 169 ) ) ,
} ;
2013-07-08 17:54:42 +02:00
/* SDHI0 */
2013-07-31 14:40:14 +02:00
static const struct sh_mobile_sdhi_info sdhi0_pdata __initconst = {
2013-07-08 17:54:42 +02:00
. tmio_flags = TMIO_MMC_HAS_IDLE_WAIT | TMIO_MMC_WRPROTECT_DISABLE ,
. tmio_caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ ,
} ;
2013-07-31 14:40:14 +02:00
static const struct resource sdhi0_resources [ ] __initconst = {
2013-10-07 22:58:20 -07:00
DEFINE_RES_MEM ( 0xee100000 , 0x100 ) ,
2013-07-08 17:54:42 +02:00
DEFINE_RES_IRQ ( gic_spi ( 165 ) ) ,
} ;
/* SDHI1 */
2013-07-31 14:40:14 +02:00
static const struct sh_mobile_sdhi_info sdhi1_pdata __initconst = {
2013-07-08 17:54:42 +02:00
. tmio_flags = TMIO_MMC_HAS_IDLE_WAIT | TMIO_MMC_WRPROTECT_DISABLE ,
. tmio_caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ |
MMC_CAP_NEEDS_POLL ,
} ;
2013-07-31 14:40:14 +02:00
static const struct resource sdhi1_resources [ ] __initconst = {
2013-10-07 22:58:20 -07:00
DEFINE_RES_MEM ( 0xee120000 , 0x100 ) ,
2013-07-08 17:54:42 +02:00
DEFINE_RES_IRQ ( gic_spi ( 166 ) ) ,
} ;
2013-07-31 14:40:14 +02:00
static const struct pinctrl_map ape6evm_pinctrl_map [ ] __initconst = {
2013-03-29 17:00:12 +09:00
/* SCIFA0 console */
PIN_MAP_MUX_GROUP_DEFAULT ( " sh-sci.0 " , " pfc-r8a73a4 " ,
" scifa0_data " , " scifa0 " ) ,
2013-03-29 17:00:21 +09:00
/* SMSC */
PIN_MAP_MUX_GROUP_DEFAULT ( " smsc911x " , " pfc-r8a73a4 " ,
" irqc_irq40 " , " irqc " ) ,
2013-07-10 10:13:08 +02:00
/* MMCIF0 */
PIN_MAP_MUX_GROUP_DEFAULT ( " sh_mmcif.0 " , " pfc-r8a73a4 " ,
" mmc0_data8 " , " mmc0 " ) ,
PIN_MAP_MUX_GROUP_DEFAULT ( " sh_mmcif.0 " , " pfc-r8a73a4 " ,
" mmc0_ctrl " , " mmc0 " ) ,
2013-07-08 17:54:42 +02:00
/* SDHI0: uSD: no WP */
PIN_MAP_MUX_GROUP_DEFAULT ( " sh_mobile_sdhi.0 " , " pfc-r8a73a4 " ,
" sdhi0_data4 " , " sdhi0 " ) ,
PIN_MAP_MUX_GROUP_DEFAULT ( " sh_mobile_sdhi.0 " , " pfc-r8a73a4 " ,
" sdhi0_ctrl " , " sdhi0 " ) ,
PIN_MAP_MUX_GROUP_DEFAULT ( " sh_mobile_sdhi.0 " , " pfc-r8a73a4 " ,
" sdhi0_cd " , " sdhi0 " ) ,
/* SDHI1 */
PIN_MAP_MUX_GROUP_DEFAULT ( " sh_mobile_sdhi.1 " , " pfc-r8a73a4 " ,
" sdhi1_data4 " , " sdhi1 " ) ,
PIN_MAP_MUX_GROUP_DEFAULT ( " sh_mobile_sdhi.1 " , " pfc-r8a73a4 " ,
" sdhi1_ctrl " , " sdhi1 " ) ,
2013-03-29 17:00:12 +09:00
} ;
2013-03-29 17:00:02 +09:00
static void __init ape6evm_add_standard_devices ( void )
{
2013-04-04 21:24:27 -07:00
struct clk * parent ;
struct clk * mp ;
2013-03-29 17:00:02 +09:00
r8a73a4_clock_init ( ) ;
2013-04-04 21:24:27 -07:00
/* MP clock parent = extal2 */
parent = clk_get ( NULL , " extal2 " ) ;
mp = clk_get ( NULL , " mp " ) ;
BUG_ON ( IS_ERR ( parent ) | | IS_ERR ( mp ) ) ;
clk_set_parent ( mp , parent ) ;
clk_put ( parent ) ;
clk_put ( mp ) ;
2013-03-29 17:00:12 +09:00
pinctrl_register_mappings ( ape6evm_pinctrl_map ,
ARRAY_SIZE ( ape6evm_pinctrl_map ) ) ;
r8a73a4_pinmux_init ( ) ;
2013-03-29 17:00:02 +09:00
r8a73a4_add_standard_devices ( ) ;
2013-03-29 17:00:21 +09:00
/* LAN9220 ethernet */
gpio_request_one ( 270 , GPIOF_OUT_INIT_HIGH , NULL ) ; /* smsc9220 RESET */
regulator_register_fixed ( 0 , dummy_supplies , ARRAY_SIZE ( dummy_supplies ) ) ;
2014-07-23 18:07:18 +01:00
platform_device_register_resndata ( NULL , " smsc911x " , - 1 ,
2013-03-29 17:00:21 +09:00
lan9220_res , ARRAY_SIZE ( lan9220_res ) ,
& lan9220_data , sizeof ( lan9220_data ) ) ;
2013-08-01 09:41:20 +02:00
regulator_register_always_on ( 1 , " MMC0 Vcc " , vcc_mmc0_consumers ,
ARRAY_SIZE ( vcc_mmc0_consumers ) , 2800000 ) ;
2014-07-23 18:07:18 +01:00
platform_device_register_resndata ( NULL , " sh_mmcif " , 0 ,
2013-07-10 10:13:08 +02:00
mmcif0_resources , ARRAY_SIZE ( mmcif0_resources ) ,
& mmcif0_pdata , sizeof ( mmcif0_pdata ) ) ;
2014-07-23 18:07:18 +01:00
platform_device_register_data ( NULL , " reg-fixed-voltage " , 2 ,
2013-08-01 09:41:20 +02:00
& vcc_sdhi0_info , sizeof ( vcc_sdhi0_info ) ) ;
2014-07-23 18:07:18 +01:00
platform_device_register_resndata ( NULL , " sh_mobile_sdhi " , 0 ,
2013-07-08 17:54:42 +02:00
sdhi0_resources , ARRAY_SIZE ( sdhi0_resources ) ,
& sdhi0_pdata , sizeof ( sdhi0_pdata ) ) ;
2013-08-01 09:41:20 +02:00
regulator_register_always_on ( 3 , " SDHI1 Vcc " , vcc_sdhi1_consumers ,
ARRAY_SIZE ( vcc_sdhi1_consumers ) , 3300000 ) ;
2014-07-23 18:07:18 +01:00
platform_device_register_resndata ( NULL , " sh_mobile_sdhi " , 1 ,
2013-07-08 17:54:42 +02:00
sdhi1_resources , ARRAY_SIZE ( sdhi1_resources ) ,
& sdhi1_pdata , sizeof ( sdhi1_pdata ) ) ;
2014-07-23 18:07:18 +01:00
platform_device_register_data ( NULL , " gpio-keys " , - 1 ,
2013-07-30 10:59:00 +09:00
& ape6evm_keys_pdata ,
sizeof ( ape6evm_keys_pdata ) ) ;
2014-07-23 18:07:18 +01:00
platform_device_register_data ( NULL , " leds-gpio " , - 1 ,
2013-07-30 10:59:02 +09:00
& ape6evm_leds_pdata ,
sizeof ( ape6evm_leds_pdata ) ) ;
2013-03-29 17:00:02 +09:00
}
static const char * ape6evm_boards_compat_dt [ ] __initdata = {
" renesas,ape6evm " ,
NULL ,
} ;
DT_MACHINE_START ( APE6EVM_DT , " ape6evm " )
2013-08-08 07:26:48 +09:00
. init_early = r8a73a4_init_early ,
2013-03-29 17:00:02 +09:00
. init_machine = ape6evm_add_standard_devices ,
. dt_compat = ape6evm_boards_compat_dt ,
MACHINE_END