ARM: shmobile: Add SDHI devices for legacy Koelsch
Magnus Damm
maintainerPATCH 3/3 ARM: shmobile: Add SDHI devices for legacy Koelsch
From: Magnus Damm <[email protected]>
Add SDHI0, SDHI1 and SDHI2 as platform devices to the legacy Koelsch board code. Also include regulators that are needed to control VCCQ and VDD.
Signed-off-by Magnus Damm <[email protected]>
---
arch/arm/mach-shmobile/board-koelsch.c | 155 ++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+)
arch/arm/mach-shmobile/board-koelsch.c +155 -0
@@ -26,6 +26,9 @@#include <linux/irq.h> #include <linux/kernel.h> #include <linux/leds.h> +#include <linux/mfd/tmio.h> +#include <linux/mmc/host.h> +#include <linux/mmc/sh_mobile_sdhi.h> #include <linux/mtd/mtd.h> #include <linux/mtd/partitions.h> #include <linux/phy.h>
@@ -33,6 +36,10 @@#include <linux/platform_data/gpio-rcar.h> #include <linux/platform_data/rcar-du.h> #include <linux/platform_device.h> +#include <linux/regulator/driver.h> +#include <linux/regulator/fixed.h> +#include <linux/regulator/gpio-regulator.h> +#include <linux/regulator/machine.h> #include <linux/sh_eth.h> #include <linux/spi/flash.h> #include <linux/spi/rspi.h>
@@ -251,6 +258,103 @@ static void __init koelsch_add_i2c(unsig i2c_resources + res_idx, 2); } +#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 (7 ,17 ),RCAR_GP_PIN (2 ,12 )); +SDHI_REGULATOR (1 ,RCAR_GP_PIN (7 ,18 ),RCAR_GP_PIN (2 ,13 )); +SDHI_REGULATOR (2 ,RCAR_GP_PIN (7 ,19 ),RCAR_GP_PIN (2 ,26 )); + +/* 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_caps2 =MMC_CAP2_NO_MULTI_READ , + .tmio_flags =TMIO_MMC_HAS_IDLE_WAIT , +}; + +static struct resource sdhi0_resources[]__initdata = { +DEFINE_RES_MEM (0xee100000 ,0x200 ), +DEFINE_RES_IRQ (gic_spi (165 )), +}; + +/* SDHI1 */ +static struct sh_mobile_sdhi_info sdhi1_info__initdata = { + .tmio_caps =MMC_CAP_SD_HIGHSPEED |MMC_CAP_SDIO_IRQ | +MMC_CAP_POWER_OFF_CARD , + .tmio_caps2 =MMC_CAP2_NO_MULTI_READ , + .tmio_flags =TMIO_MMC_HAS_IDLE_WAIT , +}; + +static struct resource sdhi1_resources[]__initdata = { +DEFINE_RES_MEM (0xee140000 ,0x100 ), +DEFINE_RES_IRQ (gic_spi (167 )), +}; + +/* 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_caps2 =MMC_CAP2_NO_MULTI_READ , + .tmio_flags =TMIO_MMC_HAS_IDLE_WAIT | +TMIO_MMC_WRPROTECT_DISABLE , +}; + +static struct resource sdhi2_resources[]__initdata = { +DEFINE_RES_MEM (0xee160000 ,0x100 ), +DEFINE_RES_IRQ (gic_spi (168 )), +}; +static const struct pinctrl_map koelsch_pinctrl_map[] = {/* DU */ PIN_MAP_MUX_GROUP_DEFAULT("rcar-du-r8a7791", "pfc-r8a7791",
@@ -288,6 +392,31 @@ static const struct pinctrl_map koelsch_/* I2C4 */ PIN_MAP_MUX_GROUP_DEFAULT ("i2c-rcar_gen2.4" ,"pfc-r8a7791" ,"i2c4_c" ,"i2c4" ), +/* SDHI0 */ +PIN_MAP_MUX_GROUP_DEFAULT ("sh_mobile_sdhi.0" ,"pfc-r8a7791" , +"sdhi0_data4" ,"sdhi0" ), +PIN_MAP_MUX_GROUP_DEFAULT ("sh_mobile_sdhi.0" ,"pfc-r8a7791" , +"sdhi0_ctrl" ,"sdhi0" ), +PIN_MAP_MUX_GROUP_DEFAULT ("sh_mobile_sdhi.0" ,"pfc-r8a7791" , +"sdhi0_cd" ,"sdhi0" ), +PIN_MAP_MUX_GROUP_DEFAULT ("sh_mobile_sdhi.0" ,"pfc-r8a7791" , +"sdhi0_wp" ,"sdhi0" ), +/* SDHI2 */ +PIN_MAP_MUX_GROUP_DEFAULT ("sh_mobile_sdhi.1" ,"pfc-r8a7791" , +"sdhi1_data4" ,"sdhi1" ), +PIN_MAP_MUX_GROUP_DEFAULT ("sh_mobile_sdhi.1" ,"pfc-r8a7791" , +"sdhi1_ctrl" ,"sdhi1" ), +PIN_MAP_MUX_GROUP_DEFAULT ("sh_mobile_sdhi.1" ,"pfc-r8a7791" , +"sdhi1_cd" ,"sdhi1" ), +PIN_MAP_MUX_GROUP_DEFAULT ("sh_mobile_sdhi.1" ,"pfc-r8a7791" , +"sdhi1_wp" ,"sdhi1" ), +/* SDHI2 */ +PIN_MAP_MUX_GROUP_DEFAULT ("sh_mobile_sdhi.2" ,"pfc-r8a7791" , +"sdhi2_data4" ,"sdhi2" ), +PIN_MAP_MUX_GROUP_DEFAULT ("sh_mobile_sdhi.2" ,"pfc-r8a7791" , +"sdhi2_ctrl" ,"sdhi2" ), +PIN_MAP_MUX_GROUP_DEFAULT ("sh_mobile_sdhi.2" ,"pfc-r8a7791" , + "sdhi2_cd", "sdhi2"), };static void __init koelsch_add_standard_devices (void )
@@ -321,6 +450,32 @@ static void __init koelsch_add_standard_koelsch_add_i2c (2 );koelsch_add_i2c (4 );koelsch_add_i2c (5 ); + +platform_device_register_data (&platform_bus,"reg-fixed-voltage" ,0 , + &vcc_sdhi0_info,sizeof (struct fixed_voltage_config )); +platform_device_register_data (&platform_bus,"reg-fixed-voltage" ,1 , + &vcc_sdhi1_info,sizeof (struct fixed_voltage_config )); +platform_device_register_data (&platform_bus,"reg-fixed-voltage" ,2 , + &vcc_sdhi2_info,sizeof (struct fixed_voltage_config )); +platform_device_register_data (&platform_bus,"gpio-regulator" ,0 , + &vccq_sdhi0_info,sizeof (struct gpio_regulator_config )); +platform_device_register_data (&platform_bus,"gpio-regulator" ,1 , + &vccq_sdhi1_info,sizeof (struct gpio_regulator_config )); +platform_device_register_data (&platform_bus,"gpio-regulator" ,2 , + &vccq_sdhi2_info,sizeof (struct gpio_regulator_config )); + +platform_device_register_resndata (&platform_bus,"sh_mobile_sdhi" ,0 , + sdhi0_resources,ARRAY_SIZE (sdhi0_resources), + &sdhi0_info,sizeof (struct sh_mobile_sdhi_info )); + +platform_device_register_resndata (&platform_bus,"sh_mobile_sdhi" ,1 , + sdhi1_resources,ARRAY_SIZE (sdhi1_resources), + &sdhi1_info,sizeof (struct sh_mobile_sdhi_info )); + +platform_device_register_resndata (&platform_bus,"sh_mobile_sdhi" ,2 , + sdhi2_resources,ARRAY_SIZE (sdhi2_resources), + &sdhi2_info,sizeof (struct sh_mobile_sdhi_info )); + }/*