2013-03-29 12:49:37 +04:00
/*
* Lager board support
*
2014-02-15 05:30:20 +04:00
* Copyright ( C ) 2013 - 2014 Renesas Solutions Corp .
2013-03-29 12:49:37 +04:00
* Copyright ( C ) 2013 Magnus Damm
2014-02-15 05:30:20 +04:00
* Copyright ( C ) 2014 Cogent Embedded , Inc .
2013-03-29 12:49:37 +04:00
*
* 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 11:04:31 +04:00
# include <linux/gpio.h>
# include <linux/gpio_keys.h>
2014-01-14 06:25:50 +04:00
# include <linux/i2c.h>
2013-05-13 11:04:31 +04:00
# include <linux/input.h>
2013-03-29 12:49:37 +04:00
# include <linux/interrupt.h>
2014-02-04 19:53:50 +04:00
# include <linux/irq.h>
2013-03-29 12:49:37 +04:00
# include <linux/kernel.h>
2013-04-23 06:37:05 +04:00
# include <linux/leds.h>
2014-02-13 08:29:24 +04:00
# include <linux/mfd/tmio.h>
2013-07-08 19:54:43 +04:00
# include <linux/mmc/host.h>
# include <linux/mmc/sh_mmcif.h>
2014-02-13 08:29:24 +04:00
# include <linux/mmc/sh_mobile_sdhi.h>
2014-06-20 20:53:06 +04:00
# include <linux/mtd/partitions.h>
# include <linux/mtd/mtd.h>
2013-04-08 13:36:22 +04:00
# include <linux/pinctrl/machine.h>
2013-12-27 15:44:04 +04:00
# include <linux/platform_data/camera-rcar.h>
2013-04-23 06:37:05 +04:00
# include <linux/platform_data/gpio-rcar.h>
2013-04-16 14:39:11 +04:00
# include <linux/platform_data/rcar-du.h>
2014-01-25 02:28:47 +04:00
# include <linux/platform_data/usb-rcar-gen2-phy.h>
2013-03-29 12:49:37 +04:00
# include <linux/platform_device.h>
2013-09-14 04:29:22 +04:00
# include <linux/phy.h>
2013-12-05 10:11:06 +04:00
# include <linux/regulator/driver.h>
2013-07-08 19:54:43 +04:00
# include <linux/regulator/fixed.h>
2013-12-05 10:11:06 +04:00
# include <linux/regulator/gpio-regulator.h>
2013-07-08 19:54:43 +04:00
# include <linux/regulator/machine.h>
2013-08-06 11:50:10 +04:00
# include <linux/sh_eth.h>
2014-06-20 20:53:06 +04:00
# include <linux/spi/flash.h>
# include <linux/spi/rspi.h>
# include <linux/spi/spi.h>
2014-01-25 02:28:47 +04:00
# include <linux/usb/phy.h>
# include <linux/usb/renesas_usbhs.h>
2014-06-20 20:53:06 +04:00
2013-12-27 15:44:04 +04:00
# include <media/soc_camera.h>
2013-03-29 12:49:37 +04:00
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
2014-01-14 06:25:50 +04:00
# include <sound/rcar_snd.h>
# include <sound/simple_card.h>
2014-06-17 11:47:37 +04:00
# include "common.h"
2014-06-17 11:47:29 +04:00
# include "irqs.h"
2014-06-20 20:53:06 +04:00
# include "r8a7790.h"
2014-06-17 11:48:01 +04:00
# include "rcar-gen2.h"
2014-01-14 06:25:50 +04:00
/*
* SSI - AK4643
*
* SW1 : 1 : AK4643
* 2 : CN22
* 3 : ADV7511
*
* this command is required when playback .
*
* # amixer set " LINEOUT Mixer DACL " on
*/
2013-03-29 12:49:37 +04:00
2014-02-13 08:29:24 +04:00
/*
* SDHI0 ( CN8 )
*
* JP3 : pin1
* SW20 : pin1
* GP5_24 : 1 : VDD 3.3 V ( defult )
* 0 : VDD 0.0 V
* GP5_29 : 1 : VccQ 3.3 V ( defult )
* 0 : VccQ 1.8 V
*
*/
2013-04-16 14:39:11 +04: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 19:55:08 +04:00
. data = & lager_du_pdata ,
. size_data = sizeof ( lager_du_pdata ) ,
2013-04-16 14:39:11 +04:00
. dma_mask = DMA_BIT_MASK ( 32 ) ,
} ;
platform_device_register_full ( & info ) ;
}
2013-04-23 06:37:05 +04: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-08-08 02:43:00 +04:00
static const struct gpio_led_platform_data lager_leds_pdata __initconst = {
2013-04-23 06:37:05 +04:00
. leds = lager_leds ,
. num_leds = ARRAY_SIZE ( lager_leds ) ,
} ;
2013-05-13 11:04:31 +04:00
/* GPIO KEY */
# define GPIO_KEY(c, g, d, ...) \
2013-10-29 12:57:30 +04:00
{ . code = c , . gpio = g , . desc = d , . active_low = 1 , \
2013-11-14 02:40:26 +04:00
. wakeup = 1 , . debounce_interval = 20 }
2013-05-13 11:04:31 +04:00
2013-07-26 12:53:42 +04:00
static struct gpio_keys_button gpio_buttons [ ] = {
2013-05-13 11:04:31 +04: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 " ) ,
} ;
2013-08-08 02:43:00 +04:00
static const struct gpio_keys_platform_data lager_keys_pdata __initconst = {
2013-05-13 11:04:31 +04:00
. buttons = gpio_buttons ,
. nbuttons = ARRAY_SIZE ( gpio_buttons ) ,
} ;
2013-07-08 19:54:43 +04:00
/* Fixed 3.3V regulator to be used by MMCIF */
static struct regulator_consumer_supply fixed3v3_power_consumers [ ] =
{
REGULATOR_SUPPLY ( " vmmc " , " sh_mmcif.1 " ) ,
} ;
2013-12-05 10:11:06 +04:00
/*
* SDHI regulator macro
*
* * FIXME * *
* Lager board vqmmc is provided via DA9063 PMIC chip ,
* and we should use $ { LINK } / drivers / mfd / da9063 - * driver for it .
* but , it doesn ' t have regulator support at this point .
* It uses gpio - regulator for vqmmc as quick - hack .
*/
# define SDHI_REGULATOR(idx, vdd_pin, vccq_pin) \
static struct regulator_consumer_supply vcc_sdhi # # idx # # _consumer = \
REGULATOR_SUPPLY ( " vmmc " , " sh_mobile_sdhi. " # idx ) ; \
\
static struct regulator_init_data vcc_sdhi # # idx # # _init_data = { \
. constraints = { \
. valid_ops_mask = REGULATOR_CHANGE_STATUS , \
} , \
. consumer_supplies = & vcc_sdhi # # idx # # _consumer , \
. num_consumer_supplies = 1 , \
} ; \
\
static const struct fixed_voltage_config vcc_sdhi # # idx # # _info __initconst = { \
. supply_name = " SDHI " # idx " Vcc " , \
. microvolts = 3300000 , \
. gpio = vdd_pin , \
. enable_high = 1 , \
. init_data = & vcc_sdhi # # idx # # _init_data , \
} ; \
\
static struct regulator_consumer_supply vccq_sdhi # # idx # # _consumer = \
REGULATOR_SUPPLY ( " vqmmc " , " sh_mobile_sdhi. " # idx ) ; \
\
static struct regulator_init_data vccq_sdhi # # idx # # _init_data = { \
. constraints = { \
. input_uV = 3300000 , \
. min_uV = 1800000 , \
. max_uV = 3300000 , \
. valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | \
REGULATOR_CHANGE_STATUS , \
} , \
. consumer_supplies = & vccq_sdhi # # idx # # _consumer , \
. num_consumer_supplies = 1 , \
} ; \
\
static struct gpio vccq_sdhi # # idx # # _gpio = \
{ vccq_pin , GPIOF_OUT_INIT_HIGH , " vccq-sdhi " # idx } ; \
\
static struct gpio_regulator_state vccq_sdhi # # idx # # _states [ ] = { \
{ . value = 1800000 , . gpios = 0 } , \
{ . value = 3300000 , . gpios = 1 } , \
} ; \
\
static const struct gpio_regulator_config vccq_sdhi # # idx # # _info __initconst = { \
. supply_name = " vqmmc " , \
. gpios = & vccq_sdhi # # idx # # _gpio , \
. nr_gpios = 1 , \
. states = vccq_sdhi # # idx # # _states , \
. nr_states = ARRAY_SIZE ( vccq_sdhi # # idx # # _states ) , \
. type = REGULATOR_VOLTAGE , \
. init_data = & vccq_sdhi # # idx # # _init_data , \
} ;
SDHI_REGULATOR ( 0 , RCAR_GP_PIN ( 5 , 24 ) , RCAR_GP_PIN ( 5 , 29 ) ) ;
SDHI_REGULATOR ( 2 , RCAR_GP_PIN ( 5 , 25 ) , RCAR_GP_PIN ( 5 , 30 ) ) ;
2013-07-08 19:54:43 +04:00
/* MMCIF */
2013-08-08 02:43:00 +04:00
static const struct sh_mmcif_plat_data mmcif1_pdata __initconst = {
2013-07-08 19:54:43 +04:00
. caps = MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE ,
2013-07-10 23:21:17 +04:00
. clk_ctrl2_present = true ,
. ccs_unsupported = true ,
2013-07-08 19:54:43 +04:00
} ;
2013-08-08 02:43:00 +04:00
static const struct resource mmcif1_resources [ ] __initconst = {
2013-10-08 09:58:30 +04:00
DEFINE_RES_MEM ( 0xee220000 , 0x80 ) ,
2013-07-08 19:54:43 +04:00
DEFINE_RES_IRQ ( gic_spi ( 170 ) ) ,
} ;
2013-08-06 11:50:10 +04:00
/* Ether */
2013-08-08 02:43:00 +04:00
static const struct sh_eth_plat_data ether_pdata __initconst = {
2013-08-06 11:50:10 +04:00
. phy = 0x1 ,
2014-02-04 19:53:50 +04:00
. phy_irq = irq_pin ( 0 ) ,
2013-08-06 11:50:10 +04:00
. edmac_endian = EDMAC_LITTLE_ENDIAN ,
. phy_interface = PHY_INTERFACE_MODE_RMII ,
. ether_link_active_low = 1 ,
} ;
2013-08-08 02:43:00 +04:00
static const struct resource ether_resources [ ] __initconst = {
2013-08-06 11:50:10 +04:00
DEFINE_RES_MEM ( 0xee700000 , 0x400 ) ,
DEFINE_RES_IRQ ( gic_spi ( 162 ) ) ,
} ;
2014-02-15 05:30:20 +04:00
static const struct platform_device_info ether_info __initconst = {
. name = " r8a7790-ether " ,
. id = - 1 ,
. res = ether_resources ,
. num_res = ARRAY_SIZE ( ether_resources ) ,
. data = & ether_pdata ,
. size_data = sizeof ( ether_pdata ) ,
. dma_mask = DMA_BIT_MASK ( 32 ) ,
} ;
2013-10-22 06:21:12 +04:00
/* SPI Flash memory (Spansion S25FL512SAGMFIG11 64Mb) */
static struct mtd_partition spi_flash_part [ ] = {
/* Reserved for user loader program, read-only */
{
. name = " loader " ,
. offset = 0 ,
. size = SZ_256K ,
. mask_flags = MTD_WRITEABLE ,
} ,
/* Reserved for user program, read-only */
{
. name = " user " ,
. offset = MTDPART_OFS_APPEND ,
. size = SZ_4M ,
. mask_flags = MTD_WRITEABLE ,
} ,
/* All else is writable (e.g. JFFS2) */
{
. name = " flash " ,
. offset = MTDPART_OFS_APPEND ,
. size = MTDPART_SIZ_FULL ,
. mask_flags = 0 ,
} ,
} ;
2014-01-03 19:48:48 +04:00
static const struct flash_platform_data spi_flash_data = {
2013-10-22 06:21:12 +04:00
. name = " m25p80 " ,
. parts = spi_flash_part ,
. nr_parts = ARRAY_SIZE ( spi_flash_part ) ,
. type = " s25fl512s " ,
} ;
static const struct rspi_plat_data qspi_pdata __initconst = {
. num_chipselect = 1 ,
} ;
static const struct spi_board_info spi_info [ ] __initconst = {
{
2014-04-14 21:35:59 +04:00
. modalias = " m25p80 " ,
. platform_data = & spi_flash_data ,
. mode = SPI_MODE_0 | SPI_TX_QUAD | SPI_RX_QUAD ,
. max_speed_hz = 30000000 ,
. bus_num = 0 ,
. chip_select = 0 ,
2013-10-22 06:21:12 +04:00
} ,
} ;
/* QSPI resource */
static const struct resource qspi_resources [ ] __initconst = {
DEFINE_RES_MEM ( 0xe6b10000 , 0x1000 ) ,
2014-02-04 19:24:05 +04:00
DEFINE_RES_IRQ_NAMED ( gic_spi ( 184 ) , " mux " ) ,
2013-10-22 06:21:12 +04:00
} ;
2013-12-27 15:44:04 +04:00
/* VIN */
static const struct resource vin_resources [ ] __initconst = {
/* VIN0 */
DEFINE_RES_MEM ( 0xe6ef0000 , 0x1000 ) ,
DEFINE_RES_IRQ ( gic_spi ( 188 ) ) ,
/* VIN1 */
DEFINE_RES_MEM ( 0xe6ef1000 , 0x1000 ) ,
DEFINE_RES_IRQ ( gic_spi ( 189 ) ) ,
} ;
static void __init lager_add_vin_device ( unsigned idx ,
struct rcar_vin_platform_data * pdata )
{
struct platform_device_info vin_info = {
. name = " r8a7790-vin " ,
. id = idx ,
. res = & vin_resources [ idx * 2 ] ,
. num_res = 2 ,
. dma_mask = DMA_BIT_MASK ( 32 ) ,
. data = pdata ,
. size_data = sizeof ( * pdata ) ,
} ;
BUG_ON ( idx > 1 ) ;
platform_device_register_full ( & vin_info ) ;
}
# define LAGER_CAMERA(idx, name, addr, pdata, flag) \
static struct i2c_board_info i2c_cam # # idx # # _device = { \
I2C_BOARD_INFO ( name , addr ) , \
} ; \
\
static struct rcar_vin_platform_data vin # # idx # # _pdata = { \
. flags = flag , \
} ; \
\
static struct soc_camera_link cam # # idx # # _link = { \
. bus_id = idx , \
. board_info = & i2c_cam # # idx # # _device , \
. i2c_adapter_id = 2 , \
. module_name = name , \
. priv = pdata , \
}
/* Camera 0 is not currently supported due to adv7612 support missing */
LAGER_CAMERA ( 1 , " adv7180 " , 0x20 , NULL , RCAR_VIN_BT656 ) ;
static void __init lager_add_camera1_device ( void )
{
2014-07-23 21:07:18 +04:00
platform_device_register_data ( NULL , " soc-camera-pdrv " , 1 ,
2013-12-27 15:44:04 +04:00
& cam1_link , sizeof ( cam1_link ) ) ;
lager_add_vin_device ( 1 , & vin1_pdata ) ;
}
2013-12-19 21:57:23 +04:00
/* SATA1 */
static const struct resource sata1_resources [ ] __initconst = {
DEFINE_RES_MEM ( 0xee500000 , 0x2000 ) ,
DEFINE_RES_IRQ ( gic_spi ( 106 ) ) ,
} ;
static const struct platform_device_info sata1_info __initconst = {
. name = " sata-r8a7790 " ,
. id = 1 ,
. res = sata1_resources ,
. num_res = ARRAY_SIZE ( sata1_resources ) ,
. dma_mask = DMA_BIT_MASK ( 32 ) ,
} ;
2014-01-25 02:28:47 +04:00
/* USBHS */
static const struct resource usbhs_resources [ ] __initconst = {
DEFINE_RES_MEM ( 0xe6590000 , 0x100 ) ,
DEFINE_RES_IRQ ( gic_spi ( 107 ) ) ,
} ;
struct usbhs_private {
struct renesas_usbhs_platform_info info ;
struct usb_phy * phy ;
} ;
# define usbhs_get_priv(pdev) \
container_of ( renesas_usbhs_get_info ( pdev ) , struct usbhs_private , info )
static int usbhs_power_ctrl ( struct platform_device * pdev ,
void __iomem * base , int enable )
{
struct usbhs_private * priv = usbhs_get_priv ( pdev ) ;
if ( ! priv - > phy )
return - ENODEV ;
if ( enable ) {
int retval = usb_phy_init ( priv - > phy ) ;
if ( ! retval )
retval = usb_phy_set_suspend ( priv - > phy , 0 ) ;
return retval ;
}
usb_phy_set_suspend ( priv - > phy , 1 ) ;
usb_phy_shutdown ( priv - > phy ) ;
return 0 ;
}
static int usbhs_hardware_init ( struct platform_device * pdev )
{
struct usbhs_private * priv = usbhs_get_priv ( pdev ) ;
struct usb_phy * phy ;
2014-01-30 03:10:29 +04:00
int ret ;
/* USB0 Function - use PWEN as GPIO input to detect DIP Switch SW5
* setting to avoid VBUS short circuit due to wrong cable .
* PWEN should be pulled up high if USB Function is selected by SW5
*/
gpio_request_one ( RCAR_GP_PIN ( 5 , 18 ) , GPIOF_IN , NULL ) ; /* USB0_PWEN */
if ( ! gpio_get_value ( RCAR_GP_PIN ( 5 , 18 ) ) ) {
pr_warn ( " Error: USB Function not selected - check SW5 + SW6 \n " ) ;
ret = - ENOTSUPP ;
goto error ;
}
2014-01-25 02:28:47 +04:00
phy = usb_get_phy_dev ( & pdev - > dev , 0 ) ;
2014-01-30 03:10:29 +04:00
if ( IS_ERR ( phy ) ) {
ret = PTR_ERR ( phy ) ;
goto error ;
}
2014-01-25 02:28:47 +04:00
priv - > phy = phy ;
return 0 ;
2014-01-30 03:10:29 +04:00
error :
gpio_free ( RCAR_GP_PIN ( 5 , 18 ) ) ;
return ret ;
2014-01-25 02:28:47 +04:00
}
static int usbhs_hardware_exit ( struct platform_device * pdev )
{
struct usbhs_private * priv = usbhs_get_priv ( pdev ) ;
if ( ! priv - > phy )
return 0 ;
usb_put_phy ( priv - > phy ) ;
priv - > phy = NULL ;
2014-01-30 03:10:29 +04:00
gpio_free ( RCAR_GP_PIN ( 5 , 18 ) ) ;
2014-01-25 02:28:47 +04:00
return 0 ;
}
static int usbhs_get_id ( struct platform_device * pdev )
{
return USBHS_GADGET ;
}
static u32 lager_usbhs_pipe_type [ ] = {
USB_ENDPOINT_XFER_CONTROL ,
USB_ENDPOINT_XFER_ISOC ,
USB_ENDPOINT_XFER_ISOC ,
USB_ENDPOINT_XFER_BULK ,
USB_ENDPOINT_XFER_BULK ,
USB_ENDPOINT_XFER_BULK ,
USB_ENDPOINT_XFER_INT ,
USB_ENDPOINT_XFER_INT ,
USB_ENDPOINT_XFER_INT ,
USB_ENDPOINT_XFER_BULK ,
USB_ENDPOINT_XFER_BULK ,
USB_ENDPOINT_XFER_BULK ,
USB_ENDPOINT_XFER_BULK ,
USB_ENDPOINT_XFER_BULK ,
USB_ENDPOINT_XFER_BULK ,
USB_ENDPOINT_XFER_BULK ,
} ;
static struct usbhs_private usbhs_priv __initdata = {
. info = {
. platform_callback = {
. power_ctrl = usbhs_power_ctrl ,
. hardware_init = usbhs_hardware_init ,
. hardware_exit = usbhs_hardware_exit ,
. get_id = usbhs_get_id ,
} ,
. driver_param = {
. buswait_bwait = 4 ,
. pipe_type = lager_usbhs_pipe_type ,
. pipe_size = ARRAY_SIZE ( lager_usbhs_pipe_type ) ,
} ,
}
} ;
static void __init lager_register_usbhs ( void )
{
usb_bind_phy ( " renesas_usbhs " , 0 , " usb_phy_rcar_gen2 " ) ;
2014-07-23 21:07:18 +04:00
platform_device_register_resndata ( NULL ,
2014-01-25 02:28:47 +04:00
" renesas_usbhs " , - 1 ,
usbhs_resources ,
ARRAY_SIZE ( usbhs_resources ) ,
& usbhs_priv . info ,
sizeof ( usbhs_priv . info ) ) ;
}
/* USBHS PHY */
static const struct rcar_gen2_phy_platform_data usbhs_phy_pdata __initconst = {
. chan0_pci = 0 , /* Channel 0 is USBHS */
. chan2_pci = 1 , /* Channel 2 is PCI USB */
} ;
static const struct resource usbhs_phy_resources [ ] __initconst = {
DEFINE_RES_MEM ( 0xe6590100 , 0x100 ) ,
} ;
2014-01-14 06:25:50 +04:00
/* I2C */
static struct i2c_board_info i2c2_devices [ ] = {
{
I2C_BOARD_INFO ( " ak4643 " , 0x12 ) ,
}
} ;
/* Sound */
static struct resource rsnd_resources [ ] __initdata = {
[ RSND_GEN2_SCU ] = DEFINE_RES_MEM ( 0xec500000 , 0x1000 ) ,
[ RSND_GEN2_ADG ] = DEFINE_RES_MEM ( 0xec5a0000 , 0x100 ) ,
[ RSND_GEN2_SSIU ] = DEFINE_RES_MEM ( 0xec540000 , 0x1000 ) ,
[ RSND_GEN2_SSI ] = DEFINE_RES_MEM ( 0xec541000 , 0x1280 ) ,
} ;
static struct rsnd_ssi_platform_info rsnd_ssi [ ] = {
2014-04-14 04:57:12 +04:00
RSND_SSI ( 0 , gic_spi ( 370 ) , 0 ) ,
RSND_SSI ( 0 , gic_spi ( 371 ) , RSND_SSI_CLK_PIN_SHARE ) ,
2014-01-14 06:25:50 +04:00
} ;
2014-04-14 04:57:12 +04:00
static struct rsnd_src_platform_info rsnd_src [ 2 ] = {
2014-01-14 06:25:50 +04:00
/* no member at this point */
} ;
2014-04-14 04:57:12 +04:00
static struct rsnd_dai_platform_info rsnd_dai = {
. playback = { . ssi = & rsnd_ssi [ 0 ] , } ,
. capture = { . ssi = & rsnd_ssi [ 1 ] , } ,
} ;
2014-01-14 06:25:50 +04:00
static struct rcar_snd_info rsnd_info = {
. flags = RSND_GEN2 ,
. ssi_info = rsnd_ssi ,
. ssi_info_nr = ARRAY_SIZE ( rsnd_ssi ) ,
2014-04-14 04:57:12 +04:00
. src_info = rsnd_src ,
. src_info_nr = ARRAY_SIZE ( rsnd_src ) ,
. dai_info = & rsnd_dai ,
. dai_info_nr = 1 ,
2014-01-14 06:25:50 +04:00
} ;
static struct asoc_simple_card_info rsnd_card_info = {
. name = " AK4643 " ,
. card = " SSI01-AK4643 " ,
. codec = " ak4642-codec.2-0012 " ,
. platform = " rcar_sound " ,
2014-04-14 04:59:34 +04:00
. daifmt = SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_CBM_CFM ,
2014-01-14 06:25:50 +04:00
. cpu_dai = {
. name = " rcar_sound " ,
} ,
. codec_dai = {
. name = " ak4642-hifi " ,
. sysclk = 11289600 ,
} ,
} ;
static void __init lager_add_rsnd_device ( void )
{
struct platform_device_info cardinfo = {
. name = " asoc-simple-card " ,
. id = - 1 ,
. data = & rsnd_card_info ,
. size_data = sizeof ( struct asoc_simple_card_info ) ,
. dma_mask = DMA_BIT_MASK ( 32 ) ,
} ;
i2c_register_board_info ( 2 , i2c2_devices ,
ARRAY_SIZE ( i2c2_devices ) ) ;
platform_device_register_resndata (
2014-07-23 21:07:18 +04:00
NULL , " rcar_sound " , - 1 ,
2014-01-14 06:25:50 +04:00
rsnd_resources , ARRAY_SIZE ( rsnd_resources ) ,
& rsnd_info , sizeof ( rsnd_info ) ) ;
platform_device_register_full ( & cardinfo ) ;
}
2014-02-13 08:29:24 +04:00
/* SDHI0 */
static struct sh_mobile_sdhi_info sdhi0_info __initdata = {
. tmio_caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ |
MMC_CAP_POWER_OFF_CARD ,
. tmio_flags = TMIO_MMC_HAS_IDLE_WAIT |
TMIO_MMC_WRPROTECT_DISABLE ,
} ;
static struct resource sdhi0_resources [ ] __initdata = {
DEFINE_RES_MEM ( 0xee100000 , 0x200 ) ,
DEFINE_RES_IRQ ( gic_spi ( 165 ) ) ,
} ;
/* SDHI2 */
static struct sh_mobile_sdhi_info sdhi2_info __initdata = {
. tmio_caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ |
MMC_CAP_POWER_OFF_CARD ,
. tmio_flags = TMIO_MMC_HAS_IDLE_WAIT |
TMIO_MMC_WRPROTECT_DISABLE ,
} ;
static struct resource sdhi2_resources [ ] __initdata = {
DEFINE_RES_MEM ( 0xee140000 , 0x100 ) ,
DEFINE_RES_IRQ ( gic_spi ( 167 ) ) ,
} ;
2014-02-14 07:29:48 +04:00
/* Internal PCI1 */
static const struct resource pci1_resources [ ] __initconst = {
DEFINE_RES_MEM ( 0xee0b0000 , 0x10000 ) , /* CFG */
DEFINE_RES_MEM ( 0xee0a0000 , 0x10000 ) , /* MEM */
DEFINE_RES_IRQ ( gic_spi ( 112 ) ) ,
} ;
static const struct platform_device_info pci1_info __initconst = {
. name = " pci-rcar-gen2 " ,
. id = 1 ,
. res = pci1_resources ,
. num_res = ARRAY_SIZE ( pci1_resources ) ,
. dma_mask = DMA_BIT_MASK ( 32 ) ,
} ;
static void __init lager_add_usb1_device ( void )
{
platform_device_register_full ( & pci1_info ) ;
}
/* Internal PCI2 */
static const struct resource pci2_resources [ ] __initconst = {
DEFINE_RES_MEM ( 0xee0d0000 , 0x10000 ) , /* CFG */
DEFINE_RES_MEM ( 0xee0c0000 , 0x10000 ) , /* MEM */
DEFINE_RES_IRQ ( gic_spi ( 113 ) ) ,
} ;
static const struct platform_device_info pci2_info __initconst = {
. name = " pci-rcar-gen2 " ,
. id = 2 ,
. res = pci2_resources ,
. num_res = ARRAY_SIZE ( pci2_resources ) ,
. dma_mask = DMA_BIT_MASK ( 32 ) ,
} ;
static void __init lager_add_usb2_device ( void )
{
platform_device_register_full ( & pci2_info ) ;
}
2013-04-08 13:36:22 +04:00
static const struct pinctrl_map lager_pinctrl_map [ ] = {
2013-04-16 14:39:11 +04: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 " ) ,
2014-01-14 06:25:50 +04:00
/* I2C2 */
PIN_MAP_MUX_GROUP_DEFAULT ( " i2c-rcar.2 " , " pfc-r8a7790 " ,
" i2c2 " , " i2c2 " ) ,
2014-02-10 14:47:28 +04:00
/* QSPI */
PIN_MAP_MUX_GROUP_DEFAULT ( " qspi.0 " , " pfc-r8a7790 " ,
" qspi_ctrl " , " qspi " ) ,
PIN_MAP_MUX_GROUP_DEFAULT ( " qspi.0 " , " pfc-r8a7790 " ,
" qspi_data4 " , " qspi " ) ,
2013-04-08 13:36:22 +04: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 " ) ,
2014-02-13 08:29:24 +04:00
/* SDHI0 */
PIN_MAP_MUX_GROUP_DEFAULT ( " sh_mobile_sdhi.0 " , " pfc-r8a7790 " ,
" sdhi0_data4 " , " sdhi0 " ) ,
PIN_MAP_MUX_GROUP_DEFAULT ( " sh_mobile_sdhi.0 " , " pfc-r8a7790 " ,
" sdhi0_ctrl " , " sdhi0 " ) ,
PIN_MAP_MUX_GROUP_DEFAULT ( " sh_mobile_sdhi.0 " , " pfc-r8a7790 " ,
" sdhi0_cd " , " sdhi0 " ) ,
/* SDHI2 */
PIN_MAP_MUX_GROUP_DEFAULT ( " sh_mobile_sdhi.2 " , " pfc-r8a7790 " ,
" sdhi2_data4 " , " sdhi2 " ) ,
PIN_MAP_MUX_GROUP_DEFAULT ( " sh_mobile_sdhi.2 " , " pfc-r8a7790 " ,
" sdhi2_ctrl " , " sdhi2 " ) ,
PIN_MAP_MUX_GROUP_DEFAULT ( " sh_mobile_sdhi.2 " , " pfc-r8a7790 " ,
" sdhi2_cd " , " sdhi2 " ) ,
2014-01-14 06:25:50 +04:00
/* SSI (CN17: sound) */
PIN_MAP_MUX_GROUP_DEFAULT ( " rcar_sound " , " pfc-r8a7790 " ,
" ssi0129_ctrl " , " ssi " ) ,
PIN_MAP_MUX_GROUP_DEFAULT ( " rcar_sound " , " pfc-r8a7790 " ,
" ssi0_data " , " ssi " ) ,
PIN_MAP_MUX_GROUP_DEFAULT ( " rcar_sound " , " pfc-r8a7790 " ,
" ssi1_data " , " ssi " ) ,
PIN_MAP_MUX_GROUP_DEFAULT ( " rcar_sound " , " pfc-r8a7790 " ,
" audio_clk_a " , " audio_clk " ) ,
2013-07-08 19:54:43 +04: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 11:50:10 +04: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-12-27 15:44:04 +04:00
/* VIN0 */
PIN_MAP_MUX_GROUP_DEFAULT ( " r8a7790-vin.0 " , " pfc-r8a7790 " ,
" vin0_data24 " , " vin0 " ) ,
PIN_MAP_MUX_GROUP_DEFAULT ( " r8a7790-vin.0 " , " pfc-r8a7790 " ,
" vin0_sync " , " vin0 " ) ,
PIN_MAP_MUX_GROUP_DEFAULT ( " r8a7790-vin.0 " , " pfc-r8a7790 " ,
" vin0_field " , " vin0 " ) ,
PIN_MAP_MUX_GROUP_DEFAULT ( " r8a7790-vin.0 " , " pfc-r8a7790 " ,
" vin0_clkenb " , " vin0 " ) ,
PIN_MAP_MUX_GROUP_DEFAULT ( " r8a7790-vin.0 " , " pfc-r8a7790 " ,
" vin0_clk " , " vin0 " ) ,
/* VIN1 */
PIN_MAP_MUX_GROUP_DEFAULT ( " r8a7790-vin.1 " , " pfc-r8a7790 " ,
" vin1_data8 " , " vin1 " ) ,
PIN_MAP_MUX_GROUP_DEFAULT ( " r8a7790-vin.1 " , " pfc-r8a7790 " ,
" vin1_clk " , " vin1 " ) ,
2014-01-25 02:28:47 +04:00
/* USB0 */
PIN_MAP_MUX_GROUP_DEFAULT ( " renesas_usbhs " , " pfc-r8a7790 " ,
2014-01-30 03:10:29 +04:00
" usb0_ovc_vbus " , " usb0 " ) ,
2014-02-14 07:29:48 +04:00
/* USB1 */
PIN_MAP_MUX_GROUP_DEFAULT ( " pci-rcar-gen2.1 " , " pfc-r8a7790 " ,
" usb1 " , " usb1 " ) ,
/* USB2 */
PIN_MAP_MUX_GROUP_DEFAULT ( " pci-rcar-gen2.2 " , " pfc-r8a7790 " ,
" usb2 " , " usb2 " ) ,
2013-04-08 13:36:22 +04:00
} ;
2013-03-29 12:49:37 +04:00
static void __init lager_add_standard_devices ( void )
{
2013-12-05 10:11:06 +04:00
int fixed_regulator_idx = 0 ;
int gpio_regulator_idx = 0 ;
2013-03-29 12:49:37 +04:00
r8a7790_clock_init ( ) ;
2013-04-08 13:36:22 +04:00
pinctrl_register_mappings ( lager_pinctrl_map ,
ARRAY_SIZE ( lager_pinctrl_map ) ) ;
r8a7790_pinmux_init ( ) ;
2013-03-29 12:49:37 +04:00
r8a7790_add_standard_devices ( ) ;
2014-07-23 21:07:18 +04:00
platform_device_register_data ( NULL , " leds-gpio " , - 1 ,
2013-04-23 06:37:05 +04:00
& lager_leds_pdata ,
sizeof ( lager_leds_pdata ) ) ;
2014-07-23 21:07:18 +04:00
platform_device_register_data ( NULL , " gpio-keys " , - 1 ,
2013-05-13 11:04:31 +04:00
& lager_keys_pdata ,
sizeof ( lager_keys_pdata ) ) ;
2013-12-05 10:11:06 +04:00
regulator_register_always_on ( fixed_regulator_idx + + ,
" fixed-3.3V " , fixed3v3_power_consumers ,
2013-07-08 19:54:43 +04:00
ARRAY_SIZE ( fixed3v3_power_consumers ) , 3300000 ) ;
2014-07-23 21:07:18 +04:00
platform_device_register_resndata ( NULL , " sh_mmcif " , 1 ,
2013-07-08 19:54:43 +04:00
mmcif1_resources , ARRAY_SIZE ( mmcif1_resources ) ,
& mmcif1_pdata , sizeof ( mmcif1_pdata ) ) ;
2013-08-06 11:50:10 +04:00
2014-02-15 05:30:20 +04:00
platform_device_register_full ( & ether_info ) ;
2013-04-16 14:39:11 +04:00
lager_add_du_device ( ) ;
2013-10-22 06:21:12 +04:00
2014-07-23 21:07:18 +04:00
platform_device_register_resndata ( NULL , " qspi " , 0 ,
2013-10-22 06:21:12 +04:00
qspi_resources ,
ARRAY_SIZE ( qspi_resources ) ,
& qspi_pdata , sizeof ( qspi_pdata ) ) ;
spi_register_board_info ( spi_info , ARRAY_SIZE ( spi_info ) ) ;
2013-12-05 10:11:06 +04:00
2014-07-23 21:07:18 +04:00
platform_device_register_data ( NULL , " reg-fixed-voltage " , fixed_regulator_idx + + ,
2013-12-05 10:11:06 +04:00
& vcc_sdhi0_info , sizeof ( struct fixed_voltage_config ) ) ;
2014-07-23 21:07:18 +04:00
platform_device_register_data ( NULL , " reg-fixed-voltage " , fixed_regulator_idx + + ,
2013-12-05 10:11:06 +04:00
& vcc_sdhi2_info , sizeof ( struct fixed_voltage_config ) ) ;
2014-07-23 21:07:18 +04:00
platform_device_register_data ( NULL , " gpio-regulator " , gpio_regulator_idx + + ,
2013-12-05 10:11:06 +04:00
& vccq_sdhi0_info , sizeof ( struct gpio_regulator_config ) ) ;
2014-07-23 21:07:18 +04:00
platform_device_register_data ( NULL , " gpio-regulator " , gpio_regulator_idx + + ,
2013-12-05 10:11:06 +04:00
& vccq_sdhi2_info , sizeof ( struct gpio_regulator_config ) ) ;
2013-12-27 15:44:04 +04:00
lager_add_camera1_device ( ) ;
2013-12-19 21:57:23 +04:00
platform_device_register_full ( & sata1_info ) ;
2014-01-25 02:28:47 +04:00
2014-07-23 21:07:18 +04:00
platform_device_register_resndata ( NULL , " usb_phy_rcar_gen2 " ,
2014-01-25 02:28:47 +04:00
- 1 , usbhs_phy_resources ,
ARRAY_SIZE ( usbhs_phy_resources ) ,
& usbhs_phy_pdata ,
sizeof ( usbhs_phy_pdata ) ) ;
lager_register_usbhs ( ) ;
2014-02-14 07:29:48 +04:00
lager_add_usb1_device ( ) ;
lager_add_usb2_device ( ) ;
2014-01-14 06:25:50 +04:00
lager_add_rsnd_device ( ) ;
2014-02-13 08:29:24 +04:00
2014-07-23 21:07:18 +04:00
platform_device_register_resndata ( NULL , " sh_mobile_sdhi " , 0 ,
2014-02-13 08:29:24 +04:00
sdhi0_resources , ARRAY_SIZE ( sdhi0_resources ) ,
& sdhi0_info , sizeof ( struct sh_mobile_sdhi_info ) ) ;
2014-07-23 21:07:18 +04:00
platform_device_register_resndata ( NULL , " sh_mobile_sdhi " , 2 ,
2014-02-13 08:29:24 +04:00
sdhi2_resources , ARRAY_SIZE ( sdhi2_resources ) ,
& sdhi2_info , sizeof ( struct sh_mobile_sdhi_info ) ) ;
2013-03-29 12:49:37 +04:00
}
2013-09-14 04:29:22 +04:00
/*
* Ether LEDs on the Lager board are named LINK and ACTIVE which corresponds
* to non - default 01 setting of the Micrel KSZ8041 PHY control register 1 bits
* 14 - 15. We have to set them back to 01 from the default 00 value each time
* the PHY is reset . It ' s also important because the PHY ' s LED0 signal is
* connected to SoC ' s ETH_LINK signal and in the PHY ' s default mode it will
* bounce on and off after each packet , which we apparently want to avoid .
*/
static int lager_ksz8041_fixup ( struct phy_device * phydev )
{
u16 phyctrl1 = phy_read ( phydev , 0x1e ) ;
phyctrl1 & = ~ 0xc000 ;
phyctrl1 | = 0x4000 ;
return phy_write ( phydev , 0x1e , phyctrl1 ) ;
}
static void __init lager_init ( void )
{
lager_add_standard_devices ( ) ;
2014-02-04 19:53:50 +04:00
irq_set_irq_type ( irq_pin ( 0 ) , IRQ_TYPE_LEVEL_LOW ) ;
2013-11-06 04:41:09 +04:00
if ( IS_ENABLED ( CONFIG_PHYLIB ) )
phy_register_fixup_for_id ( " r8a7790-ether-ff:01 " ,
lager_ksz8041_fixup ) ;
2013-09-14 04:29:22 +04:00
}
2013-08-08 02:43:00 +04:00
static const char * const lager_boards_compat_dt [ ] __initconst = {
2013-03-29 12:49:37 +04:00
" renesas,lager " ,
NULL ,
} ;
DT_MACHINE_START ( LAGER_DT , " lager " )
2013-08-29 03:22:07 +04:00
. smp = smp_ops ( r8a7790_smp_ops ) ,
2014-05-20 03:37:33 +04:00
. init_early = shmobile_init_delay ,
2013-09-12 04:32:49 +04:00
. init_time = rcar_gen2_timer_init ,
2013-09-14 04:29:22 +04:00
. init_machine = lager_init ,
2013-11-20 04:02:31 +04:00
. init_late = shmobile_init_late ,
2014-06-09 16:38:53 +04:00
. reserve = rcar_gen2_reserve ,
2013-03-29 12:49:37 +04:00
. dt_compat = lager_boards_compat_dt ,
MACHINE_END