Commit ff280bce authored by Olof Johansson's avatar Olof Johansson
Browse files

Merge tag 'renesas-boards2-for-v3.15' of...

Merge tag 'renesas-boards2-for-v3.15' of git://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas into next/boards

Merge "Second Round of Renesas ARM Based SoC Board Updates for v3.15" from
Simon Horman:

* r7s72100 (RZ/A1H) based Genmai board
  - Enable SH ethernet
  - Add RSPI support

* r8a7791 (R-Car M2) based Koelsch board
  - Add QSPI support
  - Add I2C support
  - Pass SH ethernet PHY IRQ

* r8a7790 (R-Car H2) based Lager board
  - Switch QSPI to named IRQs
  - Add sound support
  - Add USB0 cable detection workaround
  - Pass SH ethernet PHY IRQ

* r8a7779 (R-Car H1) based Marzen board
  - Revert conditional selection of SMSC_PHY

* r8a7778 (R-Car M1) based Bock-W board
  - Use wp-gpios instead of WP pin

* tag 'renesas-boards2-for-v3.15' of git://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas:
  ARM: shmobile: genmai: Enable r7s72100-ether
  ARM: shmobile: lager legacy: Switch QSPI to named IRQs
  ARM: shmobile: koelsch legacy: Add QSPI support
  ARM: shmobile: genmai legacy: Add RSPI support
  Revert "ARM: shmobile: marzen: Conditionally select SMSC_PHY"
  ARM: shmobile: lager: add sound support
  ARM: shmobile: Lager USB0 cable detection workaround
  ARM: shmobile: bockw: use wp-gpios instead of WP pin
  ARM: shmobile: koelsch: Add I2C support
  ARM: shmobile: Koelsch: pass Ether PHY IRQ
  ARM: shmobile: Lager: pass Ether PHY IRQ
parents 22a74909 03fec7de
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
/dts-v1/;
#include "r8a7778.dtsi"
#include <dt-bindings/interrupt-controller/irq.h>
#include <dt-bindings/gpio/gpio.h>

/ {
	model = "bockw";
@@ -84,7 +85,7 @@

	sdhi0_pins: sd0 {
		renesas,groups = "sdhi0_data4", "sdhi0_ctrl",
				  "sdhi0_cd", "sdhi0_wp";
				  "sdhi0_cd";
		renesas,function = "sdhi0";
	};

@@ -101,6 +102,7 @@
	vmmc-supply = <&fixedregulator3v3>;
	bus-width = <4>;
	status = "okay";
	wp-gpios = <&gpio3 18 GPIO_ACTIVE_HIGH>;
};

&hspi0 {
+1 −2
Original line number Diff line number Diff line
@@ -250,7 +250,6 @@ config MACH_MARZEN
	depends on ARCH_R8A7779
	select ARCH_REQUIRE_GPIOLIB
	select REGULATOR_FIXED_VOLTAGE if REGULATOR
	select SMSC_PHY if SMSC911X
	select USE_OF

config MACH_MARZEN_REFERENCE
@@ -258,7 +257,6 @@ config MACH_MARZEN_REFERENCE
	depends on ARCH_R8A7779
	select ARCH_REQUIRE_GPIOLIB
	select REGULATOR_FIXED_VOLTAGE if REGULATOR
	select SMSC_PHY if SMSC911X
	select USE_OF
	---help---
	   Use reference implementation of Marzen board support
@@ -272,6 +270,7 @@ config MACH_LAGER
	depends on ARCH_R8A7790
	select USE_OF
	select MICREL_PHY if SH_ETH
	select SND_SOC_AK4642 if SND_SIMPLE_CARD

config MACH_KOELSCH
	bool "Koelsch board"
+64 −0
Original line number Diff line number Diff line
@@ -20,15 +20,79 @@

#include <linux/kernel.h>
#include <linux/platform_device.h>
#include <linux/sh_eth.h>
#include <linux/spi/rspi.h>
#include <linux/spi/spi.h>
#include <mach/common.h>
#include <mach/irqs.h>
#include <mach/r7s72100.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>

/* Ether */
static const struct sh_eth_plat_data ether_pdata __initconst = {
	.phy			= 0x00, /* PD60610 */
	.edmac_endian		= EDMAC_LITTLE_ENDIAN,
	.phy_interface		= PHY_INTERFACE_MODE_MII,
	.no_ether_link		= 1
};

static const struct resource ether_resources[] __initconst = {
	DEFINE_RES_MEM(0xe8203000, 0x800),
	DEFINE_RES_MEM(0xe8204800, 0x200),
	DEFINE_RES_IRQ(gic_iid(359)),
};

/* RSPI */
#define RSPI_RESOURCE(idx, baseaddr, irq)				\
static const struct resource rspi##idx##_resources[] __initconst = {	\
	DEFINE_RES_MEM(baseaddr, 0x24),					\
	DEFINE_RES_IRQ_NAMED(irq, "error"),				\
	DEFINE_RES_IRQ_NAMED(irq + 1, "rx"),				\
	DEFINE_RES_IRQ_NAMED(irq + 2, "tx"),				\
}

RSPI_RESOURCE(0, 0xe800c800, gic_iid(270));
RSPI_RESOURCE(1, 0xe800d000, gic_iid(273));
RSPI_RESOURCE(2, 0xe800d800, gic_iid(276));
RSPI_RESOURCE(3, 0xe800e000, gic_iid(279));
RSPI_RESOURCE(4, 0xe800e800, gic_iid(282));

static const struct rspi_plat_data rspi_pdata __initconst = {
	.num_chipselect	= 1,
};

#define r7s72100_register_rspi(idx)					   \
	platform_device_register_resndata(&platform_bus, "rspi-rz", idx,   \
					rspi##idx##_resources,		   \
					ARRAY_SIZE(rspi##idx##_resources), \
					&rspi_pdata, sizeof(rspi_pdata))

static const struct spi_board_info spi_info[] __initconst = {
	{
		.modalias               = "wm8978",
		.max_speed_hz           = 5000000,
		.bus_num                = 4,
		.chip_select            = 0,
	},
};

static void __init genmai_add_standard_devices(void)
{
	r7s72100_clock_init();
	r7s72100_add_dt_devices();

	platform_device_register_resndata(&platform_bus, "r7s72100-ether", -1,
					  ether_resources,
					  ARRAY_SIZE(ether_resources),
					  &ether_pdata, sizeof(ether_pdata));

	r7s72100_register_rspi(0);
	r7s72100_register_rspi(1);
	r7s72100_register_rspi(2);
	r7s72100_register_rspi(3);
	r7s72100_register_rspi(4);
	spi_register_board_info(spi_info, ARRAY_SIZE(spi_info));
}

static const char * const genmai_boards_compat_dt[] __initconst = {
+114 −0
Original line number Diff line number Diff line
@@ -23,14 +23,20 @@
#include <linux/gpio.h>
#include <linux/gpio_keys.h>
#include <linux/input.h>
#include <linux/irq.h>
#include <linux/kernel.h>
#include <linux/leds.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
#include <linux/phy.h>
#include <linux/pinctrl/machine.h>
#include <linux/platform_data/gpio-rcar.h>
#include <linux/platform_data/rcar-du.h>
#include <linux/platform_device.h>
#include <linux/sh_eth.h>
#include <linux/spi/flash.h>
#include <linux/spi/rspi.h>
#include <linux/spi/spi.h>
#include <mach/common.h>
#include <mach/irqs.h>
#include <mach/r8a7791.h>
@@ -92,6 +98,7 @@ static void __init koelsch_add_du_device(void)
/* Ether */
static const struct sh_eth_plat_data ether_pdata __initconst = {
	.phy			= 0x1,
	.phy_irq		= irq_pin(0),
	.edmac_endian		= EDMAC_LITTLE_ENDIAN,
	.phy_interface		= PHY_INTERFACE_MODE_RMII,
	.ether_link_active_low	= 1,
@@ -148,6 +155,55 @@ static const struct gpio_keys_platform_data koelsch_keys_pdata __initconst = {
	.nbuttons	= ARRAY_SIZE(gpio_buttons),
};

/* QSPI */
static const struct resource qspi_resources[] __initconst = {
	DEFINE_RES_MEM(0xe6b10000, 0x1000),
	DEFINE_RES_IRQ_NAMED(gic_spi(184), "mux"),
};

static const struct rspi_plat_data qspi_pdata __initconst = {
	.num_chipselect = 1,
};

/* SPI Flash memory (Spansion S25FL512SAGMFIG11 64 MiB) */
static struct mtd_partition spi_flash_part[] = {
	{
		.name		= "loader",
		.offset		= 0x00000000,
		.size		= 512 * 1024,
		.mask_flags	= MTD_WRITEABLE,
	},
	{
		.name		= "bootenv",
		.offset		= MTDPART_OFS_APPEND,
		.size		= 512 * 1024,
		.mask_flags	= MTD_WRITEABLE,
	},
	{
		.name		= "data",
		.offset		= MTDPART_OFS_APPEND,
		.size		= MTDPART_SIZ_FULL,
	},
};

static const struct flash_platform_data spi_flash_data = {
	.name		= "m25p80",
	.parts		= spi_flash_part,
	.nr_parts	= ARRAY_SIZE(spi_flash_part),
	.type		= "s25fl512s",
};

static const struct spi_board_info spi_info[] __initconst = {
	{
		.modalias	= "m25p80",
		.platform_data	= &spi_flash_data,
		.mode		= SPI_MODE_0,
		.max_speed_hz	= 30000000,
		.bus_num	= 0,
		.chip_select	= 0,
	},
};

/* SATA0 */
static const struct resource sata0_resources[] __initconst = {
	DEFINE_RES_MEM(0xee300000, 0x2000),
@@ -163,6 +219,38 @@ static const struct platform_device_info sata0_info __initconst = {
	.dma_mask	= DMA_BIT_MASK(32),
};

/* I2C */
static const struct resource i2c_resources[] __initconst = {
	/* I2C0 */
	DEFINE_RES_MEM(0xE6508000, 0x40),
	DEFINE_RES_IRQ(gic_spi(287)),
	/* I2C1 */
	DEFINE_RES_MEM(0xE6518000, 0x40),
	DEFINE_RES_IRQ(gic_spi(288)),
	/* I2C2 */
	DEFINE_RES_MEM(0xE6530000, 0x40),
	DEFINE_RES_IRQ(gic_spi(286)),
	/* I2C3 */
	DEFINE_RES_MEM(0xE6540000, 0x40),
	DEFINE_RES_IRQ(gic_spi(290)),
	/* I2C4 */
	DEFINE_RES_MEM(0xE6520000, 0x40),
	DEFINE_RES_IRQ(gic_spi(19)),
	/* I2C5 */
	DEFINE_RES_MEM(0xE6528000, 0x40),
	DEFINE_RES_IRQ(gic_spi(20)),
};

static void __init koelsch_add_i2c(unsigned idx)
{
	unsigned res_idx = idx * 2;

	BUG_ON(res_idx >= ARRAY_SIZE(i2c_resources));

	platform_device_register_simple("i2c-rcar_gen2", idx,
					i2c_resources + res_idx, 2);
}

static const struct pinctrl_map koelsch_pinctrl_map[] = {
	/* DU */
	PIN_MAP_MUX_GROUP_DEFAULT("rcar-du-r8a7791", "pfc-r8a7791",
@@ -180,12 +268,26 @@ static const struct pinctrl_map koelsch_pinctrl_map[] = {
				  "eth_rmii", "eth"),
	PIN_MAP_MUX_GROUP_DEFAULT("r8a7791-ether", "pfc-r8a7791",
				  "intc_irq0", "intc"),
	/* QSPI */
	PIN_MAP_MUX_GROUP_DEFAULT("qspi.0", "pfc-r8a7791",
				  "qspi_ctrl", "qspi"),
	PIN_MAP_MUX_GROUP_DEFAULT("qspi.0", "pfc-r8a7791",
				  "qspi_data4", "qspi"),
	/* SCIF0 (CN19: DEBUG SERIAL0) */
	PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.6", "pfc-r8a7791",
				  "scif0_data_d", "scif0"),
	/* SCIF1 (CN20: DEBUG SERIAL1) */
	PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.7", "pfc-r8a7791",
				  "scif1_data_d", "scif1"),
	/* I2C1 */
	PIN_MAP_MUX_GROUP_DEFAULT("i2c-rcar_gen2.1", "pfc-r8a7791",
				  "i2c1_e", "i2c1"),
	/* I2C2 */
	PIN_MAP_MUX_GROUP_DEFAULT("i2c-rcar_gen2.2", "pfc-r8a7791",
				  "i2c2", "i2c2"),
	/* I2C4 */
	PIN_MAP_MUX_GROUP_DEFAULT("i2c-rcar_gen2.4", "pfc-r8a7791",
				  "i2c4_c", "i2c4"),
};

static void __init koelsch_add_standard_devices(void)
@@ -205,10 +307,20 @@ static void __init koelsch_add_standard_devices(void)
	platform_device_register_data(&platform_bus, "gpio-keys", -1,
				      &koelsch_keys_pdata,
				      sizeof(koelsch_keys_pdata));
	platform_device_register_resndata(&platform_bus, "qspi", 0,
					  qspi_resources,
					  ARRAY_SIZE(qspi_resources),
					  &qspi_pdata, sizeof(qspi_pdata));
	spi_register_board_info(spi_info, ARRAY_SIZE(spi_info));

	koelsch_add_du_device();

	platform_device_register_full(&sata0_info);

	koelsch_add_i2c(1);
	koelsch_add_i2c(2);
	koelsch_add_i2c(4);
	koelsch_add_i2c(5);
}

/*
@@ -232,6 +344,8 @@ static void __init koelsch_init(void)
{
	koelsch_add_standard_devices();

	irq_set_irq_type(irq_pin(0), IRQ_TYPE_LEVEL_LOW);

	if (IS_ENABLED(CONFIG_PHYLIB))
		phy_register_fixup_for_id("r8a7791-ether-ff:01",
					  koelsch_ksz8041_fixup);
+127 −4
Original line number Diff line number Diff line
@@ -20,8 +20,10 @@

#include <linux/gpio.h>
#include <linux/gpio_keys.h>
#include <linux/i2c.h>
#include <linux/input.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/kernel.h>
#include <linux/leds.h>
#include <linux/mmc/host.h>
@@ -51,6 +53,20 @@
#include <linux/spi/flash.h>
#include <linux/spi/rspi.h>
#include <linux/spi/spi.h>
#include <sound/rcar_snd.h>
#include <sound/simple_card.h>

/*
 * SSI-AK4643
 *
 * SW1: 1: AK4643
 *      2: CN22
 *      3: ADV7511
 *
 * this command is required when playback.
 *
 * # amixer set "LINEOUT Mixer DACL" on
 */

/* DU */
static struct rcar_du_encoder_data lager_du_encoders[] = {
@@ -233,6 +249,7 @@ static const struct resource mmcif1_resources[] __initconst = {
/* Ether */
static const struct sh_eth_plat_data ether_pdata __initconst = {
	.phy			= 0x1,
	.phy_irq		= irq_pin(0),
	.edmac_endian		= EDMAC_LITTLE_ENDIAN,
	.phy_interface		= PHY_INTERFACE_MODE_RMII,
	.ether_link_active_low	= 1,
@@ -293,7 +310,7 @@ static const struct spi_board_info spi_info[] __initconst = {
/* QSPI resource */
static const struct resource qspi_resources[] __initconst = {
	DEFINE_RES_MEM(0xe6b10000, 0x1000),
	DEFINE_RES_IRQ(gic_spi(184)),
	DEFINE_RES_IRQ_NAMED(gic_spi(184), "mux"),
};

/* VIN */
@@ -406,13 +423,30 @@ static int usbhs_hardware_init(struct platform_device *pdev)
{
	struct usbhs_private *priv = usbhs_get_priv(pdev);
	struct usb_phy *phy;
	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;
	}

	phy = usb_get_phy_dev(&pdev->dev, 0);
	if (IS_ERR(phy))
		return PTR_ERR(phy);
	if (IS_ERR(phy)) {
		ret = PTR_ERR(phy);
		goto error;
	}

	priv->phy = phy;
	return 0;
 error:
	gpio_free(RCAR_GP_PIN(5, 18));
	return ret;
}

static int usbhs_hardware_exit(struct platform_device *pdev)
@@ -424,6 +458,8 @@ static int usbhs_hardware_exit(struct platform_device *pdev)

	usb_put_phy(priv->phy);
	priv->phy = NULL;

	gpio_free(RCAR_GP_PIN(5, 18));
	return 0;
}

@@ -488,6 +524,77 @@ static const struct resource usbhs_phy_resources[] __initconst = {
	DEFINE_RES_MEM(0xe6590100, 0x100),
};

/* 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[] = {
	RSND_SSI_SET(0, 0, gic_spi(370), RSND_SSI_PLAY),
	RSND_SSI_SET(0, 0, gic_spi(371), RSND_SSI_CLK_PIN_SHARE),
};

static struct rsnd_scu_platform_info rsnd_scu[2] = {
	/* no member at this point */
};

static struct rcar_snd_info rsnd_info = {
	.flags		= RSND_GEN2,
	.ssi_info	= rsnd_ssi,
	.ssi_info_nr	= ARRAY_SIZE(rsnd_ssi),
	.scu_info	= rsnd_scu,
	.scu_info_nr	= ARRAY_SIZE(rsnd_scu),
};

static struct asoc_simple_card_info rsnd_card_info = {
	.name		= "AK4643",
	.card		= "SSI01-AK4643",
	.codec		= "ak4642-codec.2-0012",
	.platform	= "rcar_sound",
	.daifmt		= SND_SOC_DAIFMT_LEFT_J,
	.cpu_dai = {
		.name	= "rcar_sound",
		.fmt	= SND_SOC_DAIFMT_CBS_CFS,
	},
	.codec_dai = {
		.name	= "ak4642-hifi",
		.fmt	= SND_SOC_DAIFMT_CBM_CFM,
		.sysclk	= 11289600,
	},
};

static void __init lager_add_rsnd_device(void)
{
	struct platform_device_info cardinfo = {
		.parent         = &platform_bus,
		.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(
		&platform_bus, "rcar_sound", -1,
		rsnd_resources, ARRAY_SIZE(rsnd_resources),
		&rsnd_info, sizeof(rsnd_info));

	platform_device_register_full(&cardinfo);
}

static const struct pinctrl_map lager_pinctrl_map[] = {
	/* DU (CN10: ARGB0, CN13: LVDS) */
	PIN_MAP_MUX_GROUP_DEFAULT("rcar-du-r8a7790", "pfc-r8a7790",
@@ -496,12 +603,24 @@ static const struct pinctrl_map lager_pinctrl_map[] = {
				  "du_sync_1", "du"),
	PIN_MAP_MUX_GROUP_DEFAULT("rcar-du-r8a7790", "pfc-r8a7790",
				  "du_clk_out_0", "du"),
	/* I2C2 */
	PIN_MAP_MUX_GROUP_DEFAULT("i2c-rcar.2", "pfc-r8a7790",
				  "i2c2", "i2c2"),
	/* 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"),
	/* 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"),
	/* MMCIF1 */
	PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.1", "pfc-r8a7790",
				  "mmc1_data8", "mmc1"),
@@ -534,7 +653,7 @@ static const struct pinctrl_map lager_pinctrl_map[] = {
				  "vin1_clk", "vin1"),
	/* USB0 */
	PIN_MAP_MUX_GROUP_DEFAULT("renesas_usbhs", "pfc-r8a7790",
				  "usb0", "usb0"),
				  "usb0_ovc_vbus", "usb0"),
};

static void __init lager_add_standard_devices(void)
@@ -595,6 +714,8 @@ static void __init lager_add_standard_devices(void)
					  &usbhs_phy_pdata,
					  sizeof(usbhs_phy_pdata));
	lager_register_usbhs();

	lager_add_rsnd_device();
}

/*
@@ -618,6 +739,8 @@ static void __init lager_init(void)
{
	lager_add_standard_devices();

	irq_set_irq_type(irq_pin(0), IRQ_TYPE_LEVEL_LOW);

	if (IS_ENABLED(CONFIG_PHYLIB))
		phy_register_fixup_for_id("r8a7790-ether-ff:01",
					  lager_ksz8041_fixup);