ODROIDC: mmc: Support UHS-1 micro sdcard

Since MESON8B has single SDHC and SDIO block, 'meson8b_odroidc.dtd' is to boot by sdcard
and 'meson8b_odroidc_emmc.dtd' by eMMC.

Change-Id: I5550197122c023d50665a3bcfc740567b99420f4
This commit is contained in:
ckkim
2014-10-21 15:56:05 +09:00
committed by Dongjin Kim
parent e3fcce2faf
commit 02b9c85af2
6 changed files with 1649 additions and 204 deletions

View File

@@ -366,51 +366,6 @@ void root_func(){
dev_name = "uart_3";
};
/// ***************************************************************************************
/// - Bluetooth
//$$ MODULE="Bluetooth"
//$$ DEVICE="bt-dev"
//$$ L2 PROP_STR = "status"
//$$ L2 PROP_STR = "gpio_reset"
bt-dev{
compatible = "amlogic,bt-dev";
dev_name = "bt-dev";
status = "ok";
gpio_reset = "GPIOX_20";
};
/// ***************************************************************************************
/// - WiFi
//$$ MODULE="WiFi"
//$$ DEVICE="aml_broadcm_wifi"
//$$ L2 PROP_STR = "status"
//$$ L2 PROP_STR = "interrupt_pin"
//$$ L2 PROP_U32 = "irq_num"
//$$ L2 PROP_STR = "irq_trigger_type"
//$$ L2 PROP_STR = "power_on_pin"
//$$ L2 PROP_STR = "clock_32k_pin"
wifi{
compatible = "amlogic,aml_broadcm_wifi";
dev_name = "aml_broadcm_wifi";
status = "okay";
interrupt_pin = "GPIOX_21";
irq_num = <4>;
irq_trigger_type = "GPIO_IRQ_HIGH";
power_on_pin = "GPIOAO_6";
power_on_pin2 = "GPIOX_11";
clock_32k_pin = "GPIOX_10";
};
//$$ DEVICE="wifi_power"
//$$ L2 PROP_STR = "status"
//$$ L2 PROP_STR = "power_gpio"
wifi_power{
compatible = "amlogic,wifi_power";
dev_name = "wifi_power";
status = "okay";
power_gpio = "GPIOAO_6";
power_gpio2 = "GPIOX_11";
};
/// ***************************************************************************************
/// - MMC
//$$ MODULE="MMC"
@@ -439,42 +394,6 @@ void root_func(){
pinctrl-5 = <&sdio_all_pins>;
pinctrl-6 = <&sd_1bit_pins>;
//$$ DEVICE="sd"
//$$ L2 PROP_STR = "status"
//$$ L3 PROP_U32 = "port"
//$$ L2 PROP_STR = "pinname"
//$$ L3 PROP_U32 = "ocr_avail"
//$$ L2 PROP_STR 3 = "caps"
//$$ L3 PROP_U32 = "f_min"
//$$ L3 PROP_U32 = "f_max"
//$$ L3 PROP_U32 = "f_max_w"
//$$ L3 PROP_U32 = "max_req_size"
//$$ L2 PROP_STR = "gpio_dat3"
//$$ L2 PROP_STR = "jtag_pin"
//$$ L2 PROP_STR = "gpio_cd"
//$$ L2 PROP_STR = "gpio_ro"
//$$ L2 PROP_U32 = "irq_in"
//$$ L2 PROP_U32 = "irq_out"
//$$ L2 PROP_U32 = "card_type"
sd{
status = "okay";
port = <1>; /**0:sdio_a, 1:sdio_b, 2:sdio_c, 3:sdhc_a, 4:sdhc_b, 5:sdhc_c */
pinname = "sd";
ocr_avail = <0x200000>; /**VDD voltage 3.3 ~ 3.4 */
caps = "MMC_CAP_4_BIT_DATA","MMC_CAP_MMC_HIGHSPEED","MMC_CAP_SD_HIGHSPEED";
f_min = <300000>;
f_max = <50000000>;
f_max_w = <50000000>;
max_req_size = <0x20000>; /**128KB*/
gpio_dat3 = "CARD_4";
jtag_pin = "CARD_0";
gpio_cd = "CARD_6";
gpio_ro = "GPIODV_25";
irq_in = <3>;
irq_out = <5>;
card_type = <5>; /* 0:unknown, 1:mmc card(include eMMC), 2:sd card(include tSD), 3:sdio device(ie:sdio-wifi), 4:SD combo (IO+mem) card, 5:NON sdio device(means sd/mmc card), other:reserved */
};
//$$ DEVICE="emmc"
//$$ L2 PROP_STR = "status"
//$$ L3 PROP_U32 = "port"
@@ -487,34 +406,23 @@ void root_func(){
//$$ L3 PROP_U32 = "max_req_size"
//$$ L2 PROP_STR = "gpio_dat3"
//$$ L2 PROP_U32 = "card_type"
// emmc{
// status = "ok";
// port = <2>; /**0:sdio_a, 1:sdio_b, 2:sdio_c, 3:sdhc_a, 4:sdhc_b, 5:sdhc_c */
// pinname = "emmc";
// ocr_avail = <0x200000>; /**VDD voltage 3.3 ~ 3.4 */
// caps = "MMC_CAP_4_BIT_DATA","MMC_CAP_MMC_HIGHSPEED","MMC_CAP_SD_HIGHSPEED", "MMC_CAP_NONREMOVABLE","MMC_CAP_ERASE", "MMC_CAP_HW_RESET"; // MMC_CAP_NEEDS_POLL -- for detect, MMC_CAP_NONREMOVABLE -- for eMMC/TSD
// f_min = <300000>;
// f_max = <50000000>;
// f_max_w = <50000000>;
// max_req_size = <0x20000>; /**128KB*/
// gpio_dat3 = "BOOT_3";
// card_type = <1>; /* 0:unknown, 1:mmc card(include eMMC), 2:sd card(include tSD), 3:sdio device(ie:sdio-wifi), 4:SD combo (IO+mem) card, 5:NON sdio device(means sd/mmc card), other:reserved */
// };
//sdio{
// status = "ok";
// port = <0>; /*0:sdio_a, 1:sdio_b, 2:sdio_c, 3:sdhc_a, 4:sdhc_b, 5:sdhc_c */
// pinname = "sdio";
// ocr_avail = <0x200000>; /*VDD voltage 3.3 ~ 3.4 */
// caps = "MMC_CAP_4_BIT_DATA","MMC_CAP_MMC_HIGHSPEED","MMC_CAP_SD_HIGHSPEED", "MMC_CAP_NONREMOVABLE";
// f_min = <300000>;
// f_max = <50000000>;
// max_req_size = <0x20000>; /**128KB*/
// card_type = <3>; /* 0:unknown, 1:mmc card(include eMMC), 2:sd card(include tSD), 3:sdio device(ie:sdio-wifi), 4:SD combo (IO+mem) card, 5:NON sdio device(means sd/mmc card), other:reserved */
// };
emmc{
status = "ok";
port = <2>; /**0:sdio_a, 1:sdio_b, 2:sdio_c, 3:sdhc_a, 4:sdhc_b, 5:sdhc_c */
pinname = "emmc";
ocr_avail = <0x200000>; /**VDD voltage 3.3 ~ 3.4 */
caps = "MMC_CAP_4_BIT_DATA","MMC_CAP_MMC_HIGHSPEED","MMC_CAP_SD_HIGHSPEED", "MMC_CAP_NONREMOVABLE","MMC_CAP_ERASE", "MMC_CAP_HW_RESET"; // MMC_CAP_NEEDS_POLL -- for detect, MMC_CAP_NONREMOVABLE -- for eMMC/TSD
f_min = <300000>;
f_max = <50000000>;
f_max_w = <50000000>;
max_req_size = <0x20000>; /**128KB*/
gpio_dat3 = "BOOT_3";
card_type = <1>; /* 0:unknown, 1:mmc card(include eMMC), 2:sd card(include tSD), 3:sdio device(ie:sdio-wifi), 4:SD combo (IO+mem) card, 5:NON sdio device(means sd/mmc card), other:reserved */
};
};
/// ***************************************************************************************
/// - MMC
/// - MMC
//$$ MODULE="MMC"
//$$ DEVICE="aml_sdhc"
//$$ L2 PROP_STR = "status"
@@ -526,7 +434,7 @@ void root_func(){
//$$ L2 PROP_CHOICE "sdhc_pin_3_match" = "pinctrl-3"
//$$ L2 PROP_CHOICE "sdhc_pin_4_match" = "pinctrl-4"
//$$ L2 PROP_CHOICE "sdjc_pin_5_match" = "pinctrl-5"
// L2 PROP_CHOICE "sdhc_pin_6_match" = "pinctrl-6"
//$$ L2 PROP_CHOICE "sdhc_pin_6_match" = "pinctrl-6"
sdhc{
compatible = "amlogic,aml_sdhc";
dev_name = "aml_sdhc.0";
@@ -555,73 +463,27 @@ void root_func(){
//$$ L2 PROP_STR = "jtag_pin"
//$$ L2 PROP_STR = "gpio_cd"
//$$ L2 PROP_STR = "gpio_ro"
//$$ L2 PROP_STR = "gpio_volsw"
//$$ L2 PROP_U32 = "irq_in"
//$$ L2 PROP_U32 = "irq_out"
//$$ L2 PROP_U32 = "card_type"
// sd{
// status = "okay";
// port = <4>; /**0:sdhc_a, 1:sdio_b, 2:sdio_c, 3:sdhc_a, 4:sdhc_b, 5:sdhc_c */
// pinname = "sd";
// ocr_avail = <0x00200080>; // 3.3:0x200000, 1.8+3.3:0x00200080
// caps = "MMC_CAP_4_BIT_DATA","MMC_CAP_MMC_HIGHSPEED","MMC_CAP_SD_HIGHSPEED","MMC_CAP_UHS_SDR12","MMC_CAP_UHS_SDR25","MMC_CAP_UHS_SDR50","MMC_CAP_UHS_SDR104";
// f_min = <300000>;
// f_max = <100000000>;
// max_req_size = <0x20000>; /**128KB*/
// gpio_dat3 = "CARD_4";
// //jtag_pin = "CARD_0";
// gpio_cd = "CARD_6";
// //gpio_ro = "GPIOZ_0";
// irq_in = <3>;
// irq_out = <5>;
// card_type = <5>; /* 0:unknown, 1:mmc card(include eMMC), 2:sd card(include tSD), 3:sdio device(ie:sdio-wifi), 4:SD combo (IO+mem) card, 5:NON sdio device(means sd/mmc card), other:reserved */
// };
//$$ DEVICE="emmc"
//$$ L2 PROP_STR = "status"
//$$ L3 PROP_U32 = "port"
//$$ L2 PROP_STR = "pinname"
//$$ L3 PROP_U32 = "ocr_avail"
//$$ L2 PROP_STR 4 = "caps"
//$$ L3 PROP_U32 = "f_min"
//$$ L3 PROP_U32 = "f_max"
//$$ L3 PROP_U32 = "f_max_w"
//$$ L3 PROP_U32 = "max_req_size"
//$$ L2 PROP_STR = "gpio_dat3"
//$$ L2 PROP_U32 = "card_type"
emmc{
status = "okay";
port = <5>; /**0:sdio_a, 1:sdio_b, 2:sdio_c, 3:sdhc_a, 4:sdhc_b, 5:sdhc_c */
pinname = "emmc";
ocr_avail = <0x200000>; /**VDD voltage 3.3 ~ 3.4 */
caps = "MMC_CAP_8_BIT_DATA","MMC_CAP_MMC_HIGHSPEED","MMC_CAP_SD_HIGHSPEED", "MMC_CAP_NONREMOVABLE","MMC_CAP_ERASE", "MMC_CAP_HW_RESET"; // MMC_CAP_NEEDS_POLL -- for detect, MMC_CAP_NONREMOVABLE -- for eMMC/TSD
caps2 = "MMC_CAP2_HS200_1_8V_SDR";
f_min = <300000>;
f_max = <150000000>;
max_req_size = <0x20000>; /**128KB*/
gpio_dat3 = "BOOT_3";
card_type = <1>; /* 0:unknown, 1:mmc card(include eMMC), 2:sd card(include tSD), 3:sdio device(ie:sdio-wifi), 4:SD combo (IO+mem) card, 5:NON sdio device(means sd/mmc card), other:reserved */
};
//$$ DEVICE="sdio"
//$$ L2 PROP_STR = "status"
//$$ L3 PROP_U32 = "port"
//$$ L2 PROP_STR = "pinname"
//$$ L3 PROP_U32 = "ocr_avail"
//$$ L2 PROP_STR 4 = "caps"
//$$ L3 PROP_U32 = "f_min"
//$$ L3 PROP_U32 = "f_max"
//$$ L3 PROP_U32 = "max_req_size"
//$$ L2 PROP_U32 = "card_type"
sdio{
sd{
status = "okay";
port = <3>; /**0:sdio_a, 1:sdio_b, 2:sdio_c, 3:sdhc_a, 4:sdhc_b, 5:sdhc_c */
pinname = "sdio";
port = <4>; /**0:sdhc_a, 1:sdio_b, 2:sdio_c, 3:sdhc_a, 4:sdhc_b, 5:sdhc_c */
pinname = "sd";
ocr_avail = <0x00200080>; // 3.3:0x200000, 1.8+3.3:0x00200080
caps = "MMC_CAP_4_BIT_DATA","MMC_CAP_MMC_HIGHSPEED","MMC_CAP_SD_HIGHSPEED", "MMC_CAP_NONREMOVABLE", "MMC_CAP_UHS_SDR12","MMC_CAP_UHS_SDR25","MMC_CAP_UHS_SDR50","MMC_CAP_UHS_SDR104","MMC_PM_KEEP_POWER";
caps = "MMC_CAP_4_BIT_DATA","MMC_CAP_MMC_HIGHSPEED","MMC_CAP_SD_HIGHSPEED","MMC_CAP_UHS_SDR12","MMC_CAP_UHS_SDR25","MMC_CAP_UHS_SDR50","MMC_CAP_UHS_SDR104";
f_min = <300000>;
f_max = <200000000>;
f_max = <100000000>;
max_req_size = <0x20000>; /**128KB*/
card_type = <3>; /* 0:unknown, 1:mmc card(include eMMC), 2:sd card(include tSD), 3:sdio device(ie:sdio-wifi), 4:SD combo (IO+mem) card, 5:NON sdio device(means sd/mmc card), other:reserved */
gpio_dat3 = "CARD_4";
//jtag_pin = "CARD_0";
gpio_cd = "CARD_6";
//gpio_ro = "GPIOZ_0";
gpio_volsw = "GPIOAO_3";
irq_in = <3>;
irq_out = <5>;
card_type = <5>; /* 0:unknown, 1:mmc card(include eMMC), 2:sd card(include tSD), 3:sdio device(ie:sdio-wifi), 4:SD combo (IO+mem) card, 5:NON sdio device(means sd/mmc card), other:reserved */
};
};
@@ -911,30 +773,6 @@ void root_func(){
};
};
/// ***************************************************************************************
/// - Input
//$$ MODULE="Input"
//$$ DEVICE="gpio_keypad"
//$$ L2 PROP_STR = "status"
//$$ L2 PROP_U32 = "scan_period"
//$$ L2 PROP_U32 = "key_num"
//$$ L2 PROP_STR = "key_name"
//$$ L2 PROP_U32 = "key_code"
//$$ L2 PROP_STR = "key_pin"
//$$ L2 PROP_U32 = "irq_keyup"
//$$ L2 PROP_U32 = "irq_keydown"
gpio_keypad{
compatible = "amlogic,gpio_keypad";
status = "okay";
scan_period = <20>;
key_num = <1>;
key_name = "power";
gpio_high_z;
key_code = <116>;
key_pin = "GPIOAO_3";
irq_keyup = <6>;
irq_keydown = <7>;
};
//$$ DEVICE="saradc"
//$$ L2 PROP_STR = "status"
saradc{

File diff suppressed because it is too large Load Diff

View File

@@ -1069,7 +1069,7 @@ CONFIG_LIGHT_EPL6814=y
CONFIG_LIGHT_ISL29023=y
CONFIG_LIGHT_STK220X=y
CONFIG_LIGHT_LTR558=y
CONFIG_AML_GPIO_KEY=y
# CONFIG_AML_GPIO_KEY is not set
CONFIG_GPIO_AMLOGIC=y
CONFIG_PINCTRL_AMLOGIC=y
@@ -1166,26 +1166,18 @@ CONFIG_AML_KSZ8091=y
CONFIG_AML_RTL8211F=y
CONFIG_AM_ETHERNET_DEBUG_LEVEL=1
CONFIG_AM_WIFI=y
CONFIG_AM_WIFI_SD_MMC=y
# CONFIG_AM_WIFI_SD_MMC is not set
# CONFIG_DHD_USE_STATIC_BUF is not set
CONFIG_AM_WIFI_USB=y
CONFIG_SDIO_DHD_CDC_WIFI_40181_MODULE=m
CONFIG_BCMDHD_FW_PATH="/system/etc/wifi/fw_bcmdhd.bin"
CONFIG_BCMDHD_NVRAM_PATH="/system/etc/wifi/nvram.txt"
CONFIG_BCMDHD_CONFIG_PATH="/system/etc/wifi/config.txt"
# CONFIG_BCMDHD_POWER_OFF_IN_SUSPEND is not set
CONFIG_BCMDHD_OOB=y
# CONFIG_SDIO_HARD_IRQ is not set
# CONFIG_BCMDHD is not set
CONFIG_RTL8188EU=m
CONFIG_RTL8188EU_MP=m
# CONFIG_RTL8192CU is not set
# CONFIG_RTL8192DU is not set
# CONFIG_RTL8192EU is not set
CONFIG_RTL8189ES=m
# CONFIG_RTL8189ES is not set
# CONFIG_RTL8723AS is not set
CONFIG_RTL8723BS=m
# CONFIG_WLAN_SDIO is not set
# CONFIG_RTL8723BS is not set
# CONFIG_RTL8723AU is not set
# CONFIG_RTL8821AU is not set
# CONFIG_RTL8812AU is not set

View File

@@ -94,6 +94,9 @@ struct amlsd_platform {
unsigned int gpio_dat3;
unsigned int jtag_pin;
#if defined(CONFIG_MACH_MESON8B_ODROIDC)
unsigned int gpio_volsw;
#endif
int is_sduart;
bool is_in;
bool is_tuned; /* if card has been tuning */

46
drivers/amlogic/mmc/amlsd.c Executable file → Normal file
View File

@@ -720,6 +720,16 @@ int of_amlsd_init(struct amlsd_platform* pdata)
CHECK_RET(ret);
}
}
#if defined(CONFIG_MACH_MESON8B_ODROIDC)
if(pdata->gpio_volsw) {
ret = amlogic_gpio_request_one(pdata->gpio_volsw, GPIOF_OUT_INIT_LOW, MODULE_NAME);
CHECK_RET(ret);
if (ret == 0) {
ret = amlogic_gpio_direction_output(pdata->gpio_volsw, 0, MODULE_NAME); // output low default 3.3V
CHECK_RET(ret);
}
}
#endif
// if(pdata->port == MESON_SDIO_PORT_A)
// wifi_setup_dt();
@@ -1256,6 +1266,40 @@ int aml_check_unsupport_cmd(struct mmc_host* mmc, struct mmc_request* mrq)
int aml_sd_voltage_switch (struct amlsd_platform* pdata, char signal_voltage)
{
#if defined(CONFIG_MACH_MESON8B_ODROIDC)
char *str;
int delay_ms = 0;
int volsw = 0;
int ret=0;
switch (signal_voltage) {
case MMC_SIGNAL_VOLTAGE_180:
delay_ms = 10;
volsw = 1;
str = "1.80 V";
if (!mmc_host_uhs(pdata->mmc)) {
sdhc_err("switch to 1.8V for a non-uhs device.\n");
}
break;
case MMC_SIGNAL_VOLTAGE_330:
delay_ms = 20;
volsw = 0;
str = "3.30 V";
break;
default:
str = "invalid";
break;
}
if(pdata->gpio_volsw) {
ret = amlogic_set_value(pdata->gpio_volsw, volsw, MODULE_NAME);
CHECK_RET(ret);
printk("%s[%d] : Switched to voltage -> %s\n",__func__,__LINE__,str);
}
pdata->signal_voltage = signal_voltage;
mdelay(delay_ms); // wait for voltage to be stable
#else
#if ((defined CONFIG_ARCH_MESON8))
#ifdef CONFIG_AMLOGIC_BOARD_HAS_PMU
int vol = LDO4DAC_REG_3_3_V;
@@ -1307,7 +1351,7 @@ int aml_sd_voltage_switch (struct amlsd_platform* pdata, char signal_voltage)
}
#endif
#endif
#endif
return 0;
}

View File

@@ -181,6 +181,7 @@ int amlsd_get_platform_data(struct platform_device* pdev,
SD_PARSE_GPIO_NUM_PROP(child, "jtag_pin", str, pdata->jtag_pin);
SD_PARSE_U32_PROP(child, "card_type", prop, pdata->card_type);
SD_PARSE_GPIO_NUM_PROP(child, "gpio_dat3", str, pdata->gpio_dat3);
SD_PARSE_GPIO_NUM_PROP(child, "gpio_volsw", str, pdata->gpio_volsw);
pdata->port_init = of_amlsd_init;
pdata->pwr_pre = of_amlsd_pwr_prepare;