diff options
Diffstat (limited to 'arch/arm/mach-shmobile/board-mackerel.c')
| -rw-r--r-- | arch/arm/mach-shmobile/board-mackerel.c | 253 | 
1 files changed, 105 insertions, 148 deletions
diff --git a/arch/arm/mach-shmobile/board-mackerel.c b/arch/arm/mach-shmobile/board-mackerel.c index 2fed62f6604..fa3407da682 100644 --- a/arch/arm/mach-shmobile/board-mackerel.c +++ b/arch/arm/mach-shmobile/board-mackerel.c @@ -40,6 +40,7 @@  #include <linux/mtd/partitions.h>  #include <linux/mtd/physmap.h>  #include <linux/mtd/sh_flctl.h> +#include <linux/pinctrl/machine.h>  #include <linux/pm_clock.h>  #include <linux/regulator/fixed.h>  #include <linux/regulator/machine.h> @@ -202,9 +203,7 @@   *   * it needs amixer settings for playing   * - * amixer set "Headphone" on - * amixer set "HPOUTL Mixer DACH" on - * amixer set "HPOUTR Mixer DACH" on + * amixer set "Headphone Enable" on   */  /* Fixed 3.3V and 1.8V regulators to be used by multiple devices */ @@ -365,7 +364,7 @@ static struct fb_videomode mackerel_lcdc_modes[] = {  static int mackerel_set_brightness(int brightness)  { -	gpio_set_value(GPIO_PORT31, brightness); +	gpio_set_value(31, brightness);  	return 0;  } @@ -502,18 +501,18 @@ static struct platform_device hdmi_lcdc_device = {  	},  }; -static struct asoc_simple_dai_init_info fsi2_hdmi_init_info = { -	.cpu_daifmt	= SND_SOC_DAIFMT_CBM_CFM, -}; -  static struct asoc_simple_card_info fsi2_hdmi_info = {  	.name		= "HDMI",  	.card		= "FSI2B-HDMI", -	.cpu_dai	= "fsib-dai",  	.codec		= "sh-mobile-hdmi",  	.platform	= "sh_fsi2", -	.codec_dai	= "sh_mobile_hdmi-hifi", -	.init		= &fsi2_hdmi_init_info, +	.cpu_dai = { +		.name	= "fsib-dai", +		.fmt	= SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_IB_NF, +	}, +	.codec_dai = { +		.name	= "sh_mobile_hdmi-hifi", +	},  };  static struct platform_device fsi_hdmi_device = { @@ -598,12 +597,14 @@ static int usbhs_get_vbus(struct platform_device *pdev)  	return usbhs_is_connected(usbhs_get_priv(pdev));  } -static void usbhs_phy_reset(struct platform_device *pdev) +static int usbhs_phy_reset(struct platform_device *pdev)  {  	struct usbhs_private *priv = usbhs_get_priv(pdev);  	/* init phy */  	__raw_writew(0x8a0a, priv->usbcrcaddr); + +	return 0;  }  static int usbhs0_get_id(struct platform_device *pdev) @@ -630,11 +631,13 @@ static int usbhs0_hardware_init(struct platform_device *pdev)  	return 0;  } -static void usbhs0_hardware_exit(struct platform_device *pdev) +static int usbhs0_hardware_exit(struct platform_device *pdev)  {  	struct usbhs_private *priv = usbhs_get_priv(pdev);  	cancel_delayed_work_sync(&priv->work); + +	return 0;  }  static struct usbhs_private usbhs0_private = { @@ -737,7 +740,7 @@ static int usbhs1_hardware_init(struct platform_device *pdev)  	return 0;  } -static void usbhs1_hardware_exit(struct platform_device *pdev) +static int usbhs1_hardware_exit(struct platform_device *pdev)  {  	struct usbhs_private *priv = usbhs_get_priv(pdev); @@ -745,6 +748,8 @@ static void usbhs1_hardware_exit(struct platform_device *pdev)  	__raw_writew(USB_PHY_MODE | USB_PHY_INT_CLR, priv->usbphyaddr);  	free_irq(IRQ8, pdev); + +	return 0;  }  static int usbhs1_get_id(struct platform_device *pdev) @@ -821,22 +826,22 @@ static struct platform_device usbhs1_device = {  static struct gpio_led mackerel_leds[] = {  	{  		.name		= "led0", -		.gpio		= GPIO_PORT0, +		.gpio		= 0,  		.default_state	= LEDS_GPIO_DEFSTATE_ON,  	},  	{  		.name		= "led1", -		.gpio		= GPIO_PORT1, +		.gpio		= 1,  		.default_state	= LEDS_GPIO_DEFSTATE_ON,  	},  	{  		.name		= "led2", -		.gpio		= GPIO_PORT2, +		.gpio		= 2,  		.default_state	= LEDS_GPIO_DEFSTATE_ON,  	},  	{  		.name		= "led3", -		.gpio		= GPIO_PORT159, +		.gpio		= 159,  		.default_state	= LEDS_GPIO_DEFSTATE_ON,  	}  }; @@ -858,16 +863,12 @@ static struct platform_device leds_device = {  #define IRQ_FSI evt2irq(0x1840)  static struct sh_fsi_platform_info fsi_info = {  	.port_a = { -		.flags = SH_FSI_BRS_INV,  		.tx_id = SHDMA_SLAVE_FSIA_TX,  		.rx_id = SHDMA_SLAVE_FSIA_RX,  	},  	.port_b = { -		.flags = SH_FSI_BRS_INV	| -			SH_FSI_BRM_INV	| -			SH_FSI_LRS_INV	| -			SH_FSI_CLK_CPG	| -			SH_FSI_FMT_SPDIF, +		.flags = SH_FSI_CLK_CPG	| +			 SH_FSI_FMT_SPDIF,  	}  }; @@ -896,21 +897,21 @@ static struct platform_device fsi_device = {  	},  }; -static struct asoc_simple_dai_init_info fsi2_ak4643_init_info = { -	.fmt		= SND_SOC_DAIFMT_LEFT_J, -	.codec_daifmt	= SND_SOC_DAIFMT_CBM_CFM, -	.cpu_daifmt	= SND_SOC_DAIFMT_CBS_CFS, -	.sysclk		= 11289600, -}; -  static struct asoc_simple_card_info fsi2_ak4643_info = {  	.name		= "AK4643",  	.card		= "FSI2A-AK4643", -	.cpu_dai	= "fsia-dai",  	.codec		= "ak4642-codec.0-0013",  	.platform	= "sh_fsi2", -	.codec_dai	= "ak4642-hifi", -	.init		= &fsi2_ak4643_init_info, +	.daifmt		= SND_SOC_DAIFMT_LEFT_J, +	.cpu_dai = { +		.name	= "fsia-dai", +		.fmt	= SND_SOC_DAIFMT_CBS_CFS, +	}, +	.codec_dai = { +		.name	= "ak4642-hifi", +		.fmt	= SND_SOC_DAIFMT_CBM_CFM, +		.sysclk	= 11289600, +	},  };  static struct platform_device fsi_ak4643_device = { @@ -968,40 +969,27 @@ static struct platform_device nand_flash_device = {  	},  }; -/* - * The card detect pin of the top SD/MMC slot (CN7) is active low and is - * connected to GPIO A22 of SH7372 (GPIO_PORT41). - */ -static int slot_cn7_get_cd(struct platform_device *pdev) -{ -	return !gpio_get_value(GPIO_PORT41); -} -  /* SDHI0 */  static struct sh_mobile_sdhi_info sdhi0_info = {  	.dma_slave_tx	= SHDMA_SLAVE_SDHI0_TX,  	.dma_slave_rx	= SHDMA_SLAVE_SDHI0_RX,  	.tmio_flags	= TMIO_MMC_USE_GPIO_CD,  	.tmio_caps	= MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ, -	.cd_gpio	= GPIO_PORT172, +	.cd_gpio	= 172,  };  static struct resource sdhi0_resources[] = { -	[0] = { +	{  		.name	= "SDHI0",  		.start	= 0xe6850000,  		.end	= 0xe68500ff,  		.flags	= IORESOURCE_MEM, -	}, -	[1] = { -		.start	= evt2irq(0x0e00) /* SDHI0_SDHI0I0 */, -		.flags	= IORESOURCE_IRQ, -	}, -	[2] = { +	}, { +		.name	= SH_MOBILE_SDHI_IRQ_SDCARD,  		.start	= evt2irq(0x0e20) /* SDHI0_SDHI0I1 */,  		.flags	= IORESOURCE_IRQ, -	}, -	[3] = { +	}, { +		.name	= SH_MOBILE_SDHI_IRQ_SDIO,  		.start	= evt2irq(0x0e40) /* SDHI0_SDHI0I2 */,  		.flags	= IORESOURCE_IRQ,  	}, @@ -1017,36 +1005,30 @@ static struct platform_device sdhi0_device = {  	},  }; -#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE) +#if !IS_ENABLED(CONFIG_MMC_SH_MMCIF)  /* SDHI1 */ + +/* GPIO 41 can trigger IRQ8, but it is used by USBHS1, we have to poll */  static struct sh_mobile_sdhi_info sdhi1_info = {  	.dma_slave_tx	= SHDMA_SLAVE_SDHI1_TX,  	.dma_slave_rx	= SHDMA_SLAVE_SDHI1_RX, -	.tmio_ocr_mask	= MMC_VDD_165_195, -	.tmio_flags	= TMIO_MMC_WRPROTECT_DISABLE, +	.tmio_flags	= TMIO_MMC_WRPROTECT_DISABLE | TMIO_MMC_USE_GPIO_CD,  	.tmio_caps	= MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ |  			  MMC_CAP_NEEDS_POLL, -	.get_cd		= slot_cn7_get_cd, +	.cd_gpio	= 41,  };  static struct resource sdhi1_resources[] = { -	[0] = { +	{  		.name	= "SDHI1",  		.start	= 0xe6860000,  		.end	= 0xe68600ff,  		.flags	= IORESOURCE_MEM, -	}, -	[1] = { -		.name	= SH_MOBILE_SDHI_IRQ_CARD_DETECT, -		.start	= evt2irq(0x0e80), /* SDHI1_SDHI1I0 */ -		.flags	= IORESOURCE_IRQ, -	}, -	[2] = { +	}, {  		.name	= SH_MOBILE_SDHI_IRQ_SDCARD,  		.start	= evt2irq(0x0ea0), /* SDHI1_SDHI1I1 */  		.flags	= IORESOURCE_IRQ, -	}, -	[3] = { +	}, {  		.name	= SH_MOBILE_SDHI_IRQ_SDIO,  		.start	= evt2irq(0x0ec0), /* SDHI1_SDHI1I2 */  		.flags	= IORESOURCE_IRQ, @@ -1064,43 +1046,32 @@ static struct platform_device sdhi1_device = {  };  #endif +/* SDHI2 */ +  /*   * The card detect pin of the top SD/MMC slot (CN23) is active low and is - * connected to GPIO SCIFB_SCK of SH7372 (GPIO_PORT162). + * connected to GPIO SCIFB_SCK of SH7372 (GPIO 162).   */ -static int slot_cn23_get_cd(struct platform_device *pdev) -{ -	return !gpio_get_value(GPIO_PORT162); -} - -/* SDHI2 */  static struct sh_mobile_sdhi_info sdhi2_info = {  	.dma_slave_tx	= SHDMA_SLAVE_SDHI2_TX,  	.dma_slave_rx	= SHDMA_SLAVE_SDHI2_RX, -	.tmio_flags	= TMIO_MMC_WRPROTECT_DISABLE, +	.tmio_flags	= TMIO_MMC_WRPROTECT_DISABLE | TMIO_MMC_USE_GPIO_CD,  	.tmio_caps	= MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ |  			  MMC_CAP_NEEDS_POLL, -	.get_cd		= slot_cn23_get_cd, +	.cd_gpio	= 162,  };  static struct resource sdhi2_resources[] = { -	[0] = { +	{  		.name	= "SDHI2",  		.start	= 0xe6870000,  		.end	= 0xe68700ff,  		.flags	= IORESOURCE_MEM, -	}, -	[1] = { -		.name	= SH_MOBILE_SDHI_IRQ_CARD_DETECT, -		.start	= evt2irq(0x1200), /* SDHI2_SDHI2I0 */ -		.flags	= IORESOURCE_IRQ, -	}, -	[2] = { +	}, {  		.name	= SH_MOBILE_SDHI_IRQ_SDCARD,  		.start	= evt2irq(0x1220), /* SDHI2_SDHI2I1 */  		.flags	= IORESOURCE_IRQ, -	}, -	[3] = { +	}, {  		.name	= SH_MOBILE_SDHI_IRQ_SDIO,  		.start	= evt2irq(0x1240), /* SDHI2_SDHI2I2 */  		.flags	= IORESOURCE_IRQ, @@ -1118,6 +1089,7 @@ static struct platform_device sdhi2_device = {  };  /* SH_MMCIF */ +#if IS_ENABLED(CONFIG_MMC_SH_MMCIF)  static struct resource sh_mmcif_resources[] = {  	[0] = {  		.name	= "MMCIF", @@ -1139,11 +1111,12 @@ static struct resource sh_mmcif_resources[] = {  static struct sh_mmcif_plat_data sh_mmcif_plat = {  	.sup_pclk	= 0, -	.ocr		= MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34,  	.caps		= MMC_CAP_4_BIT_DATA |  			  MMC_CAP_8_BIT_DATA |  			  MMC_CAP_NEEDS_POLL, -	.get_cd		= slot_cn7_get_cd, +	.use_cd_gpio	= true, +	/* card detect pin for SD/MMC slot (CN7) */ +	.cd_gpio	= 41,  	.slave_id_tx	= SHDMA_SLAVE_MMCIF_TX,  	.slave_id_rx	= SHDMA_SLAVE_MMCIF_RX,  }; @@ -1159,7 +1132,7 @@ static struct platform_device sh_mmcif_device = {  	.num_resources	= ARRAY_SIZE(sh_mmcif_resources),  	.resource	= sh_mmcif_resources,  }; - +#endif  static int mackerel_camera_add(struct soc_camera_device *icd);  static void mackerel_camera_del(struct soc_camera_device *icd); @@ -1266,11 +1239,12 @@ static struct platform_device *mackerel_devices[] __initdata = {  	&fsi_hdmi_device,  	&nand_flash_device,  	&sdhi0_device, -#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE) +#if !IS_ENABLED(CONFIG_MMC_SH_MMCIF)  	&sdhi1_device, +#else +	&sh_mmcif_device,  #endif  	&sdhi2_device, -	&sh_mmcif_device,  	&ceu_device,  	&mackerel_camera,  	&hdmi_device, @@ -1334,6 +1308,34 @@ static struct i2c_board_info i2c1_devices[] = {  	},  }; +static const struct pinctrl_map mackerel_pinctrl_map[] = { +	/* SDHI0 */ +	PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh7372", +				  "sdhi0_data4", "sdhi0"), +	PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh7372", +				  "sdhi0_ctrl", "sdhi0"), +	PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh7372", +				  "sdhi0_wp", "sdhi0"), +	/* SDHI1 */ +#if !IS_ENABLED(CONFIG_MMC_SH_MMCIF) +	PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-sh7372", +				  "sdhi1_data4", "sdhi1"), +	PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-sh7372", +				  "sdhi1_ctrl", "sdhi1"), +#else +	/* MMCIF */ +	PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.0", "pfc-sh7372", +				  "mmc0_data8_0", "mmc0"), +	PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.0", "pfc-sh7372", +				  "mmc0_ctrl_0", "mmc0"), +#endif +	/* SDHI2 */ +	PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.2", "pfc-sh7372", +				  "sdhi2_data4", "sdhi2"), +	PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.2", "pfc-sh7372", +				  "sdhi2_ctrl", "sdhi2"), +}; +  #define GPIO_PORT9CR	IOMEM(0xE6051009)  #define GPIO_PORT10CR	IOMEM(0xE605100A)  #define GPIO_PORT167CR	IOMEM(0xE60520A7) @@ -1350,10 +1352,11 @@ static void __init mackerel_init(void)  		{ "A3SP", &usbhs0_device, },  		{ "A3SP", &usbhs1_device, },  		{ "A3SP", &nand_flash_device, }, -		{ "A3SP", &sh_mmcif_device, },  		{ "A3SP", &sdhi0_device, }, -#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE) +#if !IS_ENABLED(CONFIG_MMC_SH_MMCIF)  		{ "A3SP", &sdhi1_device, }, +#else +		{ "A3SP", &sh_mmcif_device, },  #endif  		{ "A3SP", &sdhi2_device, },  		{ "A4R", &ceu_device, }, @@ -1370,6 +1373,8 @@ static void __init mackerel_init(void)  	/* External clock source */  	clk_set_rate(&sh7372_dv_clki_clk, 27000000); +	pinctrl_register_mappings(mackerel_pinctrl_map, +				  ARRAY_SIZE(mackerel_pinctrl_map));  	sh7372_pinmux_init();  	/* enable SCIFA0 */ @@ -1408,11 +1413,10 @@ static void __init mackerel_init(void)  	gpio_request(GPIO_FN_LCDDISP,  NULL);  	gpio_request(GPIO_FN_LCDDCK,   NULL); -	gpio_request(GPIO_PORT31, NULL); /* backlight */ -	gpio_direction_output(GPIO_PORT31, 0); /* off by default */ +	/* backlight, off by default */ +	gpio_request_one(31, GPIOF_OUT_INIT_LOW, NULL); -	gpio_request(GPIO_PORT151, NULL); /* LCDDON */ -	gpio_direction_output(GPIO_PORT151, 1); +	gpio_request_one(151, GPIOF_OUT_INIT_HIGH, NULL); /* LCDDON */  	/* USBHS0 */  	gpio_request(GPIO_FN_VBUS0_0, NULL); @@ -1428,11 +1432,10 @@ static void __init mackerel_init(void)  	gpio_request(GPIO_FN_FSIAILR,	NULL);  	gpio_request(GPIO_FN_FSIAISLD,	NULL);  	gpio_request(GPIO_FN_FSIAOSLD,	NULL); -	gpio_request(GPIO_PORT161,	NULL); -	gpio_direction_output(GPIO_PORT161, 0); /* slave */ +	gpio_request_one(161, GPIOF_OUT_INIT_LOW, NULL); /* slave */ -	gpio_request(GPIO_PORT9,  NULL); -	gpio_request(GPIO_PORT10, NULL); +	gpio_request(9,  NULL); +	gpio_request(10, NULL);  	gpio_direction_none(GPIO_PORT9CR);  /* FSIAOBT needs no direction */  	gpio_direction_none(GPIO_PORT10CR); /* FSIAOLR needs no direction */ @@ -1461,55 +1464,9 @@ static void __init mackerel_init(void)  	gpio_request(GPIO_FN_IRQ21,	NULL);  	irq_set_irq_type(IRQ21, IRQ_TYPE_LEVEL_HIGH); -	/* enable SDHI0 */ -	gpio_request(GPIO_FN_SDHIWP0, NULL); -	gpio_request(GPIO_FN_SDHICMD0, NULL); -	gpio_request(GPIO_FN_SDHICLK0, NULL); -	gpio_request(GPIO_FN_SDHID0_3, NULL); -	gpio_request(GPIO_FN_SDHID0_2, NULL); -	gpio_request(GPIO_FN_SDHID0_1, NULL); -	gpio_request(GPIO_FN_SDHID0_0, NULL); -  	/* SDHI0 PORT172 card-detect IRQ26 */  	gpio_request(GPIO_FN_IRQ26_172, NULL); -#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE) -	/* enable SDHI1 */ -	gpio_request(GPIO_FN_SDHICMD1, NULL); -	gpio_request(GPIO_FN_SDHICLK1, NULL); -	gpio_request(GPIO_FN_SDHID1_3, NULL); -	gpio_request(GPIO_FN_SDHID1_2, NULL); -	gpio_request(GPIO_FN_SDHID1_1, NULL); -	gpio_request(GPIO_FN_SDHID1_0, NULL); -#endif -	/* card detect pin for MMC slot (CN7) */ -	gpio_request(GPIO_PORT41, NULL); -	gpio_direction_input(GPIO_PORT41); - -	/* enable SDHI2 */ -	gpio_request(GPIO_FN_SDHICMD2, NULL); -	gpio_request(GPIO_FN_SDHICLK2, NULL); -	gpio_request(GPIO_FN_SDHID2_3, NULL); -	gpio_request(GPIO_FN_SDHID2_2, NULL); -	gpio_request(GPIO_FN_SDHID2_1, NULL); -	gpio_request(GPIO_FN_SDHID2_0, NULL); - -	/* card detect pin for microSD slot (CN23) */ -	gpio_request(GPIO_PORT162, NULL); -	gpio_direction_input(GPIO_PORT162); - -	/* MMCIF */ -	gpio_request(GPIO_FN_MMCD0_0, NULL); -	gpio_request(GPIO_FN_MMCD0_1, NULL); -	gpio_request(GPIO_FN_MMCD0_2, NULL); -	gpio_request(GPIO_FN_MMCD0_3, NULL); -	gpio_request(GPIO_FN_MMCD0_4, NULL); -	gpio_request(GPIO_FN_MMCD0_5, NULL); -	gpio_request(GPIO_FN_MMCD0_6, NULL); -	gpio_request(GPIO_FN_MMCD0_7, NULL); -	gpio_request(GPIO_FN_MMCCMD0, NULL); -	gpio_request(GPIO_FN_MMCCLK0, NULL); -  	/* FLCTL */  	gpio_request(GPIO_FN_D0_NAF0, NULL);  	gpio_request(GPIO_FN_D1_NAF1, NULL); @@ -1593,6 +1550,6 @@ DT_MACHINE_START(MACKEREL_DT, "mackerel")  	.handle_irq	= shmobile_handle_irq_intc,  	.init_machine	= mackerel_init,  	.init_late	= sh7372_pm_init_late, -	.timer		= &shmobile_timer, +	.init_time	= sh7372_earlytimer_init,  	.dt_compat  = mackerel_boards_compat_dt,  MACHINE_END  |