mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 23:24:38 +00:00
Merge branch 'master' of git://git.denx.de/u-boot-mmc
This commit is contained in:
commit
1fdafb2e3d
67 changed files with 1520 additions and 1045 deletions
|
@ -728,7 +728,6 @@ config ARCH_ZYNQ
|
||||||
select DM_GPIO
|
select DM_GPIO
|
||||||
select SPL_DM if SPL
|
select SPL_DM if SPL
|
||||||
select DM_MMC
|
select DM_MMC
|
||||||
select DM_MMC_OPS
|
|
||||||
select DM_SPI
|
select DM_SPI
|
||||||
select DM_SERIAL
|
select DM_SERIAL
|
||||||
select DM_SPI_FLASH
|
select DM_SPI_FLASH
|
||||||
|
@ -1076,7 +1075,6 @@ config ARCH_ROCKCHIP
|
||||||
select DM_GPIO
|
select DM_GPIO
|
||||||
select DM_I2C
|
select DM_I2C
|
||||||
select DM_MMC
|
select DM_MMC
|
||||||
select DM_MMC_OPS
|
|
||||||
select DM_SERIAL
|
select DM_SERIAL
|
||||||
select DM_SPI
|
select DM_SPI
|
||||||
select DM_SPI_FLASH
|
select DM_SPI_FLASH
|
||||||
|
|
|
@ -359,6 +359,7 @@ dtb-$(CONFIG_MX6) += imx6ull-14x14-evk.dtb \
|
||||||
imx6sll-evk.dtb \
|
imx6sll-evk.dtb \
|
||||||
imx6dl-icore.dtb \
|
imx6dl-icore.dtb \
|
||||||
imx6dl-icore-rqs.dtb \
|
imx6dl-icore-rqs.dtb \
|
||||||
|
imx6q-cm-fx6.dtb \
|
||||||
imx6q-icore.dtb \
|
imx6q-icore.dtb \
|
||||||
imx6q-icore-rqs.dtb \
|
imx6q-icore-rqs.dtb \
|
||||||
imx6q-logicpd.dtb \
|
imx6q-logicpd.dtb \
|
||||||
|
|
115
arch/arm/dts/imx6q-cm-fx6.dts
Normal file
115
arch/arm/dts/imx6q-cm-fx6.dts
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2013 CompuLab Ltd.
|
||||||
|
*
|
||||||
|
* Author: Valentin Raevsky <valentin@compulab.co.il>
|
||||||
|
*
|
||||||
|
* The code contained herein is licensed under the GNU General Public
|
||||||
|
* License. You may obtain a copy of the GNU General Public License
|
||||||
|
* Version 2 or later at the following locations:
|
||||||
|
*
|
||||||
|
* http://www.opensource.org/licenses/gpl-license.html
|
||||||
|
* http://www.gnu.org/copyleft/gpl.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
/dts-v1/;
|
||||||
|
#include "imx6q.dtsi"
|
||||||
|
|
||||||
|
/ {
|
||||||
|
model = "CompuLab CM-FX6";
|
||||||
|
compatible = "compulab,cm-fx6", "fsl,imx6q";
|
||||||
|
|
||||||
|
memory {
|
||||||
|
reg = <0x10000000 0x80000000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
leds {
|
||||||
|
compatible = "gpio-leds";
|
||||||
|
|
||||||
|
heartbeat-led {
|
||||||
|
label = "Heartbeat";
|
||||||
|
gpios = <&gpio2 31 0>;
|
||||||
|
linux,default-trigger = "heartbeat";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&fec {
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&pinctrl_enet>;
|
||||||
|
phy-mode = "rgmii";
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&gpmi {
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&pinctrl_gpmi_nand>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&iomuxc {
|
||||||
|
imx6q-cm-fx6 {
|
||||||
|
pinctrl_enet: enetgrp {
|
||||||
|
fsl,pins = <
|
||||||
|
MX6QDL_PAD_RGMII_RXC__RGMII_RXC 0x1b0b0
|
||||||
|
MX6QDL_PAD_RGMII_RD0__RGMII_RD0 0x1b0b0
|
||||||
|
MX6QDL_PAD_RGMII_RD1__RGMII_RD1 0x1b0b0
|
||||||
|
MX6QDL_PAD_RGMII_RD2__RGMII_RD2 0x1b0b0
|
||||||
|
MX6QDL_PAD_RGMII_RD3__RGMII_RD3 0x1b0b0
|
||||||
|
MX6QDL_PAD_RGMII_RX_CTL__RGMII_RX_CTL 0x1b0b0
|
||||||
|
MX6QDL_PAD_RGMII_TXC__RGMII_TXC 0x1b0b0
|
||||||
|
MX6QDL_PAD_RGMII_TD0__RGMII_TD0 0x1b0b0
|
||||||
|
MX6QDL_PAD_RGMII_TD1__RGMII_TD1 0x1b0b0
|
||||||
|
MX6QDL_PAD_RGMII_TD2__RGMII_TD2 0x1b0b0
|
||||||
|
MX6QDL_PAD_RGMII_TD3__RGMII_TD3 0x1b0b0
|
||||||
|
MX6QDL_PAD_RGMII_TX_CTL__RGMII_TX_CTL 0x1b0b0
|
||||||
|
MX6QDL_PAD_ENET_REF_CLK__ENET_TX_CLK 0x1b0b0
|
||||||
|
MX6QDL_PAD_ENET_MDIO__ENET_MDIO 0x1b0b0
|
||||||
|
MX6QDL_PAD_ENET_MDC__ENET_MDC 0x1b0b0
|
||||||
|
MX6QDL_PAD_GPIO_16__ENET_REF_CLK 0x4001b0a8
|
||||||
|
>;
|
||||||
|
};
|
||||||
|
|
||||||
|
pinctrl_gpmi_nand: gpminandgrp {
|
||||||
|
fsl,pins = <
|
||||||
|
MX6QDL_PAD_NANDF_CLE__NAND_CLE 0xb0b1
|
||||||
|
MX6QDL_PAD_NANDF_ALE__NAND_ALE 0xb0b1
|
||||||
|
MX6QDL_PAD_NANDF_WP_B__NAND_WP_B 0xb0b1
|
||||||
|
MX6QDL_PAD_NANDF_RB0__NAND_READY_B 0xb000
|
||||||
|
MX6QDL_PAD_NANDF_CS0__NAND_CE0_B 0xb0b1
|
||||||
|
MX6QDL_PAD_NANDF_CS1__NAND_CE1_B 0xb0b1
|
||||||
|
MX6QDL_PAD_SD4_CMD__NAND_RE_B 0xb0b1
|
||||||
|
MX6QDL_PAD_SD4_CLK__NAND_WE_B 0xb0b1
|
||||||
|
MX6QDL_PAD_NANDF_D0__NAND_DATA00 0xb0b1
|
||||||
|
MX6QDL_PAD_NANDF_D1__NAND_DATA01 0xb0b1
|
||||||
|
MX6QDL_PAD_NANDF_D2__NAND_DATA02 0xb0b1
|
||||||
|
MX6QDL_PAD_NANDF_D3__NAND_DATA03 0xb0b1
|
||||||
|
MX6QDL_PAD_NANDF_D4__NAND_DATA04 0xb0b1
|
||||||
|
MX6QDL_PAD_NANDF_D5__NAND_DATA05 0xb0b1
|
||||||
|
MX6QDL_PAD_NANDF_D6__NAND_DATA06 0xb0b1
|
||||||
|
MX6QDL_PAD_NANDF_D7__NAND_DATA07 0xb0b1
|
||||||
|
MX6QDL_PAD_SD4_DAT0__NAND_DQS 0x00b1
|
||||||
|
>;
|
||||||
|
};
|
||||||
|
|
||||||
|
pinctrl_uart4: uart4grp {
|
||||||
|
fsl,pins = <
|
||||||
|
MX6QDL_PAD_KEY_COL0__UART4_TX_DATA 0x1b0b1
|
||||||
|
MX6QDL_PAD_KEY_ROW0__UART4_RX_DATA 0x1b0b1
|
||||||
|
>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&uart4 {
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&pinctrl_uart4>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&sata {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&usdhc3 {
|
||||||
|
status = "okay";
|
||||||
|
};
|
|
@ -279,7 +279,7 @@ void arch_preboot_os(void)
|
||||||
imx_pcie_remove();
|
imx_pcie_remove();
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_SATA)
|
#if defined(CONFIG_SATA)
|
||||||
sata_stop();
|
sata_remove(0);
|
||||||
#if defined(CONFIG_MX6)
|
#if defined(CONFIG_MX6)
|
||||||
disable_sata_clock();
|
disable_sata_clock();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -49,11 +49,6 @@
|
||||||
|
|
||||||
/* SDHI CMD VALUE */
|
/* SDHI CMD VALUE */
|
||||||
#define CMD_MASK 0x0000ffff
|
#define CMD_MASK 0x0000ffff
|
||||||
#define SDHI_APP 0x0040
|
|
||||||
#define SDHI_MMC_SEND_OP_COND 0x0701
|
|
||||||
#define SDHI_SD_APP_SEND_SCR 0x0073
|
|
||||||
#define SDHI_SD_SWITCH 0x1C06
|
|
||||||
#define SDHI_MMC_SEND_EXT_CSD 0x1C08
|
|
||||||
|
|
||||||
/* SDHI_PORTSEL */
|
/* SDHI_PORTSEL */
|
||||||
#define USE_1PORT (1 << 8) /* 1 port */
|
#define USE_1PORT (1 << 8) /* 1 port */
|
||||||
|
|
|
@ -9,7 +9,9 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
|
#include <ahci.h>
|
||||||
#include <dm.h>
|
#include <dm.h>
|
||||||
|
#include <dwc_ahsata.h>
|
||||||
#include <fsl_esdhc.h>
|
#include <fsl_esdhc.h>
|
||||||
#include <miiphy.h>
|
#include <miiphy.h>
|
||||||
#include <mtd_node.h>
|
#include <mtd_node.h>
|
||||||
|
@ -29,6 +31,7 @@
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/gpio.h>
|
#include <asm/gpio.h>
|
||||||
#include <dm/platform_data/serial_mxc.h>
|
#include <dm/platform_data/serial_mxc.h>
|
||||||
|
#include <dm/device-internal.h>
|
||||||
#include <jffs2/load_kernel.h>
|
#include <jffs2/load_kernel.h>
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "../common/eeprom.h"
|
#include "../common/eeprom.h"
|
||||||
|
@ -206,6 +209,8 @@ static int cm_fx6_setup_issd(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
#define CM_FX6_SATA_INIT_RETRIES 10
|
#define CM_FX6_SATA_INIT_RETRIES 10
|
||||||
|
|
||||||
|
# if !CONFIG_IS_ENABLED(AHCI)
|
||||||
int sata_initialize(void)
|
int sata_initialize(void)
|
||||||
{
|
{
|
||||||
int err, i;
|
int err, i;
|
||||||
|
@ -246,6 +251,7 @@ int sata_stop(void)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
# endif
|
||||||
#else
|
#else
|
||||||
static int cm_fx6_setup_issd(void) { return 0; }
|
static int cm_fx6_setup_issd(void) { return 0; }
|
||||||
#endif
|
#endif
|
||||||
|
@ -672,6 +678,17 @@ int board_init(void)
|
||||||
|
|
||||||
cm_fx6_setup_display();
|
cm_fx6_setup_display();
|
||||||
|
|
||||||
|
/* This should be done in the MMC driver when MX6 has a clock driver */
|
||||||
|
#ifdef CONFIG_FSL_ESDHC
|
||||||
|
if (IS_ENABLED(CONFIG_BLK)) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
cm_fx6_set_usdhc_iomux();
|
||||||
|
for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++)
|
||||||
|
enable_usdhc_clk(1, i);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -757,3 +774,66 @@ U_BOOT_DEVICE(cm_fx6_serial) = {
|
||||||
.name = "serial_mxc",
|
.name = "serial_mxc",
|
||||||
.platdata = &cm_fx6_mxc_serial_plat,
|
.platdata = &cm_fx6_mxc_serial_plat,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if CONFIG_IS_ENABLED(AHCI)
|
||||||
|
static int sata_imx_probe(struct udevice *dev)
|
||||||
|
{
|
||||||
|
int i, err;
|
||||||
|
|
||||||
|
/* Make sure this gpio has logical 0 value */
|
||||||
|
gpio_direction_output(CM_FX6_SATA_PWLOSS_INT, 0);
|
||||||
|
udelay(100);
|
||||||
|
cm_fx6_sata_power(1);
|
||||||
|
|
||||||
|
for (i = 0; i < CM_FX6_SATA_INIT_RETRIES; i++) {
|
||||||
|
err = setup_sata();
|
||||||
|
if (err) {
|
||||||
|
printf("SATA setup failed: %d\n", err);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
udelay(100);
|
||||||
|
|
||||||
|
err = dwc_ahsata_probe(dev);
|
||||||
|
if (!err)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* There is no device on the SATA port */
|
||||||
|
if (sata_dm_port_status(0, 0) == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* There's a device, but link not established. Retry */
|
||||||
|
device_remove(dev, DM_REMOVE_NORMAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int sata_imx_remove(struct udevice *dev)
|
||||||
|
{
|
||||||
|
cm_fx6_sata_power(0);
|
||||||
|
mdelay(250);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ahci_ops sata_imx_ops = {
|
||||||
|
.port_status = dwc_ahsata_port_status,
|
||||||
|
.reset = dwc_ahsata_bus_reset,
|
||||||
|
.scan = dwc_ahsata_scan,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct udevice_id sata_imx_ids[] = {
|
||||||
|
{ .compatible = "fsl,imx6q-ahci" },
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
U_BOOT_DRIVER(sata_imx) = {
|
||||||
|
.name = "dwc_ahci",
|
||||||
|
.id = UCLASS_AHCI,
|
||||||
|
.of_match = sata_imx_ids,
|
||||||
|
.ops = &sata_imx_ops,
|
||||||
|
.probe = sata_imx_probe,
|
||||||
|
.remove = sata_imx_remove, /* reset bus to stop it */
|
||||||
|
};
|
||||||
|
#endif /* AHCI */
|
||||||
|
|
|
@ -15,6 +15,7 @@ obj-y += version.o
|
||||||
# command
|
# command
|
||||||
obj-$(CONFIG_CMD_AES) += aes.o
|
obj-$(CONFIG_CMD_AES) += aes.o
|
||||||
obj-$(CONFIG_CMD_ARMFLASH) += armflash.o
|
obj-$(CONFIG_CMD_ARMFLASH) += armflash.o
|
||||||
|
obj-y += blk_common.o
|
||||||
obj-$(CONFIG_SOURCE) += source.o
|
obj-$(CONFIG_SOURCE) += source.o
|
||||||
obj-$(CONFIG_CMD_SOURCE) += source.o
|
obj-$(CONFIG_CMD_SOURCE) += source.o
|
||||||
obj-$(CONFIG_CMD_BDI) += bdinfo.o
|
obj-$(CONFIG_CMD_BDI) += bdinfo.o
|
||||||
|
|
104
cmd/blk_common.c
Normal file
104
cmd/blk_common.c
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
/*
|
||||||
|
* Handling of common block commands
|
||||||
|
*
|
||||||
|
* Copyright (c) 2017 Google, Inc
|
||||||
|
*
|
||||||
|
* (C) Copyright 2000-2011
|
||||||
|
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
#include <blk.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_BLOCK_DEVICE
|
||||||
|
int blk_common_cmd(int argc, char * const argv[], enum if_type if_type,
|
||||||
|
int *cur_devnump)
|
||||||
|
{
|
||||||
|
const char *if_name = blk_get_if_type_name(if_type);
|
||||||
|
|
||||||
|
switch (argc) {
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
|
return CMD_RET_USAGE;
|
||||||
|
case 2:
|
||||||
|
if (strncmp(argv[1], "inf", 3) == 0) {
|
||||||
|
blk_list_devices(if_type);
|
||||||
|
return 0;
|
||||||
|
} else if (strncmp(argv[1], "dev", 3) == 0) {
|
||||||
|
if (blk_print_device_num(if_type, *cur_devnump)) {
|
||||||
|
printf("\nno %s devices available\n", if_name);
|
||||||
|
return CMD_RET_FAILURE;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
} else if (strncmp(argv[1], "part", 4) == 0) {
|
||||||
|
if (blk_list_part(if_type))
|
||||||
|
printf("\nno %s devices available\n", if_name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return CMD_RET_USAGE;
|
||||||
|
case 3:
|
||||||
|
if (strncmp(argv[1], "dev", 3) == 0) {
|
||||||
|
int dev = (int)simple_strtoul(argv[2], NULL, 10);
|
||||||
|
|
||||||
|
if (!blk_show_device(if_type, dev)) {
|
||||||
|
*cur_devnump = dev;
|
||||||
|
printf("... is now current device\n");
|
||||||
|
} else {
|
||||||
|
return CMD_RET_FAILURE;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
} else if (strncmp(argv[1], "part", 4) == 0) {
|
||||||
|
int dev = (int)simple_strtoul(argv[2], NULL, 10);
|
||||||
|
|
||||||
|
if (blk_print_part_devnum(if_type, dev)) {
|
||||||
|
printf("\n%s device %d not available\n",
|
||||||
|
if_name, dev);
|
||||||
|
return CMD_RET_FAILURE;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return CMD_RET_USAGE;
|
||||||
|
|
||||||
|
default: /* at least 4 args */
|
||||||
|
if (strcmp(argv[1], "read") == 0) {
|
||||||
|
ulong addr = simple_strtoul(argv[2], NULL, 16);
|
||||||
|
lbaint_t blk = simple_strtoul(argv[3], NULL, 16);
|
||||||
|
ulong cnt = simple_strtoul(argv[4], NULL, 16);
|
||||||
|
ulong n;
|
||||||
|
|
||||||
|
printf("\n%s read: device %d block # %lld, count %ld ... ",
|
||||||
|
if_name, *cur_devnump, (unsigned long long)blk,
|
||||||
|
cnt);
|
||||||
|
|
||||||
|
n = blk_read_devnum(if_type, *cur_devnump, blk, cnt,
|
||||||
|
(ulong *)addr);
|
||||||
|
|
||||||
|
printf("%ld blocks read: %s\n", n,
|
||||||
|
n == cnt ? "OK" : "ERROR");
|
||||||
|
return n == cnt ? 0 : 1;
|
||||||
|
} else if (strcmp(argv[1], "write") == 0) {
|
||||||
|
ulong addr = simple_strtoul(argv[2], NULL, 16);
|
||||||
|
lbaint_t blk = simple_strtoul(argv[3], NULL, 16);
|
||||||
|
ulong cnt = simple_strtoul(argv[4], NULL, 16);
|
||||||
|
ulong n;
|
||||||
|
|
||||||
|
printf("\n%s write: device %d block # %lld, count %ld ... ",
|
||||||
|
if_name, *cur_devnump, (unsigned long long)blk,
|
||||||
|
cnt);
|
||||||
|
|
||||||
|
n = blk_write_devnum(if_type, *cur_devnump, blk, cnt,
|
||||||
|
(ulong *)addr);
|
||||||
|
|
||||||
|
printf("%ld blocks written: %s\n", n,
|
||||||
|
n == cnt ? "OK" : "ERROR");
|
||||||
|
return n == cnt ? 0 : 1;
|
||||||
|
} else {
|
||||||
|
return CMD_RET_USAGE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
107
cmd/ide.c
107
cmd/ide.c
|
@ -34,116 +34,15 @@ static int curr_device = -1;
|
||||||
|
|
||||||
int do_ide(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
|
int do_ide(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
|
||||||
{
|
{
|
||||||
int rcode = 0;
|
if (argc == 2) {
|
||||||
|
|
||||||
switch (argc) {
|
|
||||||
case 0:
|
|
||||||
case 1:
|
|
||||||
return CMD_RET_USAGE;
|
|
||||||
case 2:
|
|
||||||
if (strncmp(argv[1], "res", 3) == 0) {
|
if (strncmp(argv[1], "res", 3) == 0) {
|
||||||
puts("\nReset IDE: ");
|
puts("\nReset IDE: ");
|
||||||
ide_init();
|
ide_init();
|
||||||
return 0;
|
return 0;
|
||||||
} else if (strncmp(argv[1], "inf", 3) == 0) {
|
|
||||||
blk_list_devices(IF_TYPE_IDE);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
} else if (strncmp(argv[1], "dev", 3) == 0) {
|
|
||||||
if (blk_print_device_num(IF_TYPE_IDE, curr_device)) {
|
|
||||||
printf("\nno IDE devices available\n");
|
|
||||||
return CMD_RET_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
} else if (strncmp(argv[1], "part", 4) == 0) {
|
|
||||||
if (blk_list_part(IF_TYPE_IDE))
|
|
||||||
printf("\nno IDE devices available\n");
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
return CMD_RET_USAGE;
|
|
||||||
case 3:
|
|
||||||
if (strncmp(argv[1], "dev", 3) == 0) {
|
|
||||||
int dev = (int)simple_strtoul(argv[2], NULL, 10);
|
|
||||||
|
|
||||||
if (!blk_show_device(IF_TYPE_IDE, dev)) {
|
|
||||||
curr_device = dev;
|
|
||||||
printf("... is now current device\n");
|
|
||||||
} else {
|
|
||||||
return CMD_RET_FAILURE;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
} else if (strncmp(argv[1], "part", 4) == 0) {
|
|
||||||
int dev = (int)simple_strtoul(argv[2], NULL, 10);
|
|
||||||
|
|
||||||
if (blk_print_part_devnum(IF_TYPE_IDE, dev)) {
|
|
||||||
printf("\nIDE device %d not available\n", dev);
|
|
||||||
return CMD_RET_FAILURE;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return CMD_RET_USAGE;
|
|
||||||
default:
|
|
||||||
/* at least 4 args */
|
|
||||||
|
|
||||||
if (strcmp(argv[1], "read") == 0) {
|
|
||||||
ulong addr = simple_strtoul(argv[2], NULL, 16);
|
|
||||||
ulong cnt = simple_strtoul(argv[4], NULL, 16);
|
|
||||||
ulong n;
|
|
||||||
|
|
||||||
#ifdef CONFIG_SYS_64BIT_LBA
|
|
||||||
lbaint_t blk = simple_strtoull(argv[3], NULL, 16);
|
|
||||||
|
|
||||||
printf("\nIDE read: device %d block # %lld, count %ld...",
|
|
||||||
curr_device, blk, cnt);
|
|
||||||
#else
|
|
||||||
lbaint_t blk = simple_strtoul(argv[3], NULL, 16);
|
|
||||||
|
|
||||||
printf("\nIDE read: device %d block # %ld, count %ld...",
|
|
||||||
curr_device, blk, cnt);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
n = blk_read_devnum(IF_TYPE_IDE, curr_device, blk, cnt,
|
|
||||||
(ulong *)addr);
|
|
||||||
|
|
||||||
printf("%ld blocks read: %s\n",
|
|
||||||
n, (n == cnt) ? "OK" : "ERROR");
|
|
||||||
if (n == cnt)
|
|
||||||
return 0;
|
|
||||||
else
|
|
||||||
return 1;
|
|
||||||
} else if (strcmp(argv[1], "write") == 0) {
|
|
||||||
ulong addr = simple_strtoul(argv[2], NULL, 16);
|
|
||||||
ulong cnt = simple_strtoul(argv[4], NULL, 16);
|
|
||||||
ulong n;
|
|
||||||
|
|
||||||
#ifdef CONFIG_SYS_64BIT_LBA
|
|
||||||
lbaint_t blk = simple_strtoull(argv[3], NULL, 16);
|
|
||||||
|
|
||||||
printf("\nIDE write: device %d block # %lld, count %ld...",
|
|
||||||
curr_device, blk, cnt);
|
|
||||||
#else
|
|
||||||
lbaint_t blk = simple_strtoul(argv[3], NULL, 16);
|
|
||||||
|
|
||||||
printf("\nIDE write: device %d block # %ld, count %ld...",
|
|
||||||
curr_device, blk, cnt);
|
|
||||||
#endif
|
|
||||||
n = blk_write_devnum(IF_TYPE_IDE, curr_device, blk, cnt,
|
|
||||||
(ulong *)addr);
|
|
||||||
|
|
||||||
printf("%ld blocks written: %s\n", n,
|
|
||||||
n == cnt ? "OK" : "ERROR");
|
|
||||||
if (n == cnt)
|
|
||||||
return 0;
|
|
||||||
else
|
|
||||||
return 1;
|
|
||||||
} else {
|
|
||||||
return CMD_RET_USAGE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return rcode;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return blk_common_cmd(argc, argv, IF_TYPE_IDE, &curr_device);
|
||||||
}
|
}
|
||||||
|
|
||||||
int do_diskboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
|
int do_diskboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
|
||||||
|
|
38
cmd/mmc.c
38
cmd/mmc.c
|
@ -643,6 +643,28 @@ static int do_mmc_boot_resize(cmd_tbl_t *cmdtp, int flag,
|
||||||
printf("EMMC RPMB partition Size %d MB\n", rpmbsize);
|
printf("EMMC RPMB partition Size %d MB\n", rpmbsize);
|
||||||
return CMD_RET_SUCCESS;
|
return CMD_RET_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int mmc_partconf_print(struct mmc *mmc)
|
||||||
|
{
|
||||||
|
u8 ack, access, part;
|
||||||
|
|
||||||
|
if (mmc->part_config == MMCPART_NOAVAILABLE) {
|
||||||
|
printf("No part_config info for ver. 0x%x\n", mmc->version);
|
||||||
|
return CMD_RET_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
access = EXT_CSD_EXTRACT_PARTITION_ACCESS(mmc->part_config);
|
||||||
|
ack = EXT_CSD_EXTRACT_BOOT_ACK(mmc->part_config);
|
||||||
|
part = EXT_CSD_EXTRACT_BOOT_PART(mmc->part_config);
|
||||||
|
|
||||||
|
printf("EXT_CSD[179], PARTITION_CONFIG:\n"
|
||||||
|
"BOOT_ACK: 0x%x\n"
|
||||||
|
"BOOT_PARTITION_ENABLE: 0x%x\n"
|
||||||
|
"PARTITION_ACCESS: 0x%x\n", ack, part, access);
|
||||||
|
|
||||||
|
return CMD_RET_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static int do_mmc_partconf(cmd_tbl_t *cmdtp, int flag,
|
static int do_mmc_partconf(cmd_tbl_t *cmdtp, int flag,
|
||||||
int argc, char * const argv[])
|
int argc, char * const argv[])
|
||||||
{
|
{
|
||||||
|
@ -650,13 +672,10 @@ static int do_mmc_partconf(cmd_tbl_t *cmdtp, int flag,
|
||||||
struct mmc *mmc;
|
struct mmc *mmc;
|
||||||
u8 ack, part_num, access;
|
u8 ack, part_num, access;
|
||||||
|
|
||||||
if (argc != 5)
|
if (argc != 2 && argc != 5)
|
||||||
return CMD_RET_USAGE;
|
return CMD_RET_USAGE;
|
||||||
|
|
||||||
dev = simple_strtoul(argv[1], NULL, 10);
|
dev = simple_strtoul(argv[1], NULL, 10);
|
||||||
ack = simple_strtoul(argv[2], NULL, 10);
|
|
||||||
part_num = simple_strtoul(argv[3], NULL, 10);
|
|
||||||
access = simple_strtoul(argv[4], NULL, 10);
|
|
||||||
|
|
||||||
mmc = init_mmc_device(dev, false);
|
mmc = init_mmc_device(dev, false);
|
||||||
if (!mmc)
|
if (!mmc)
|
||||||
|
@ -667,6 +686,13 @@ static int do_mmc_partconf(cmd_tbl_t *cmdtp, int flag,
|
||||||
return CMD_RET_FAILURE;
|
return CMD_RET_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (argc == 2)
|
||||||
|
return mmc_partconf_print(mmc);
|
||||||
|
|
||||||
|
ack = simple_strtoul(argv[2], NULL, 10);
|
||||||
|
part_num = simple_strtoul(argv[3], NULL, 10);
|
||||||
|
access = simple_strtoul(argv[4], NULL, 10);
|
||||||
|
|
||||||
/* acknowledge to be sent during boot operation */
|
/* acknowledge to be sent during boot operation */
|
||||||
return mmc_set_part_conf(mmc, ack, part_num, access);
|
return mmc_set_part_conf(mmc, ack, part_num, access);
|
||||||
}
|
}
|
||||||
|
@ -832,8 +858,8 @@ U_BOOT_CMD(
|
||||||
" - Set the BOOT_BUS_WIDTH field of the specified device\n"
|
" - Set the BOOT_BUS_WIDTH field of the specified device\n"
|
||||||
"mmc bootpart-resize <dev> <boot part size MB> <RPMB part size MB>\n"
|
"mmc bootpart-resize <dev> <boot part size MB> <RPMB part size MB>\n"
|
||||||
" - Change sizes of boot and RPMB partitions of specified device\n"
|
" - Change sizes of boot and RPMB partitions of specified device\n"
|
||||||
"mmc partconf dev boot_ack boot_partition partition_access\n"
|
"mmc partconf dev [boot_ack boot_partition partition_access]\n"
|
||||||
" - Change the bits of the PARTITION_CONFIG field of the specified device\n"
|
" - Show or change the bits of the PARTITION_CONFIG field of the specified device\n"
|
||||||
"mmc rst-function dev value\n"
|
"mmc rst-function dev value\n"
|
||||||
" - Change the RST_n_FUNCTION field of the specified device\n"
|
" - Change the RST_n_FUNCTION field of the specified device\n"
|
||||||
" WARNING: This is a write-once field and 0 / 1 / 2 are the only valid values.\n"
|
" WARNING: This is a write-once field and 0 / 1 / 2 are the only valid values.\n"
|
||||||
|
|
178
cmd/sata.c
178
cmd/sata.c
|
@ -11,124 +11,116 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
|
#include <ahci.h>
|
||||||
|
#include <dm.h>
|
||||||
#include <command.h>
|
#include <command.h>
|
||||||
#include <part.h>
|
#include <part.h>
|
||||||
#include <sata.h>
|
#include <sata.h>
|
||||||
|
#include <dm/device-internal.h>
|
||||||
|
#include <dm/uclass-internal.h>
|
||||||
|
|
||||||
static int sata_curr_device = -1;
|
static int sata_curr_device = -1;
|
||||||
|
|
||||||
|
int sata_remove(int devnum)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_AHCI
|
||||||
|
struct udevice *dev;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = uclass_find_device(UCLASS_AHCI, devnum, &dev);
|
||||||
|
if (!rc && !dev)
|
||||||
|
rc = uclass_find_first_device(UCLASS_AHCI, &dev);
|
||||||
|
if (rc || !dev) {
|
||||||
|
printf("Cannot find SATA device %d (err=%d)\n", devnum, rc);
|
||||||
|
return CMD_RET_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = device_remove(dev, DM_REMOVE_NORMAL);
|
||||||
|
if (rc) {
|
||||||
|
printf("Cannot remove SATA device '%s' (err=%d)\n", dev->name,
|
||||||
|
rc);
|
||||||
|
return CMD_RET_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
#else
|
||||||
|
return sata_stop();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
int sata_probe(int devnum)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_AHCI
|
||||||
|
struct udevice *dev;
|
||||||
|
struct udevice *blk;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = uclass_get_device(UCLASS_AHCI, devnum, &dev);
|
||||||
|
if (rc)
|
||||||
|
rc = uclass_find_first_device(UCLASS_AHCI, &dev);
|
||||||
|
if (rc) {
|
||||||
|
printf("Cannot probe SATA device %d (err=%d)\n", devnum, rc);
|
||||||
|
return CMD_RET_FAILURE;
|
||||||
|
}
|
||||||
|
rc = sata_scan(dev);
|
||||||
|
if (rc) {
|
||||||
|
printf("Cannot scan SATA device %d (err=%d)\n", devnum, rc);
|
||||||
|
return CMD_RET_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = blk_get_from_parent(dev, &blk);
|
||||||
|
if (!rc) {
|
||||||
|
struct blk_desc *desc = dev_get_uclass_platdata(blk);
|
||||||
|
|
||||||
|
if (desc->lba > 0 && desc->blksz > 0)
|
||||||
|
part_init(desc);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
#else
|
||||||
|
return sata_initialize() < 0 ? CMD_RET_FAILURE : CMD_RET_SUCCESS;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static int do_sata(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
static int do_sata(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
if (argc == 2 && strcmp(argv[1], "stop") == 0)
|
if (argc >= 2) {
|
||||||
return sata_stop();
|
int devnum = 0;
|
||||||
|
|
||||||
if (argc == 2 && strcmp(argv[1], "init") == 0) {
|
if (argc == 3)
|
||||||
if (sata_curr_device != -1)
|
devnum = (int)simple_strtoul(argv[2], NULL, 10);
|
||||||
sata_stop();
|
if (!strcmp(argv[1], "stop"))
|
||||||
|
return sata_remove(devnum);
|
||||||
|
|
||||||
return (sata_initialize() < 0) ?
|
if (!strcmp(argv[1], "init")) {
|
||||||
CMD_RET_FAILURE : CMD_RET_SUCCESS;
|
if (sata_curr_device != -1) {
|
||||||
|
rc = sata_remove(devnum);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sata_probe(devnum);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If the user has not yet run `sata init`, do it now */
|
/* If the user has not yet run `sata init`, do it now */
|
||||||
if (sata_curr_device == -1) {
|
if (sata_curr_device == -1) {
|
||||||
rc = sata_initialize();
|
rc = sata_probe(0);
|
||||||
if (rc == -1)
|
if (rc < 0)
|
||||||
return CMD_RET_FAILURE;
|
return CMD_RET_FAILURE;
|
||||||
sata_curr_device = rc;
|
sata_curr_device = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (argc) {
|
return blk_common_cmd(argc, argv, IF_TYPE_SATA, &sata_curr_device);
|
||||||
case 0:
|
|
||||||
case 1:
|
|
||||||
return CMD_RET_USAGE;
|
|
||||||
case 2:
|
|
||||||
if (strncmp(argv[1], "inf", 3) == 0) {
|
|
||||||
blk_list_devices(IF_TYPE_SATA);
|
|
||||||
return 0;
|
|
||||||
} else if (strncmp(argv[1], "dev", 3) == 0) {
|
|
||||||
if (blk_print_device_num(IF_TYPE_SATA,
|
|
||||||
sata_curr_device)) {
|
|
||||||
printf("\nno SATA devices available\n");
|
|
||||||
return CMD_RET_FAILURE;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
} else if (strncmp(argv[1], "part", 4) == 0) {
|
|
||||||
if (blk_list_part(IF_TYPE_SATA))
|
|
||||||
puts("\nno SATA devices available\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return CMD_RET_USAGE;
|
|
||||||
case 3:
|
|
||||||
if (strncmp(argv[1], "dev", 3) == 0) {
|
|
||||||
int dev = (int)simple_strtoul(argv[2], NULL, 10);
|
|
||||||
|
|
||||||
if (!blk_show_device(IF_TYPE_SATA, dev)) {
|
|
||||||
sata_curr_device = dev;
|
|
||||||
printf("... is now current device\n");
|
|
||||||
} else {
|
|
||||||
return CMD_RET_FAILURE;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
} else if (strncmp(argv[1], "part", 4) == 0) {
|
|
||||||
int dev = (int)simple_strtoul(argv[2], NULL, 10);
|
|
||||||
|
|
||||||
if (blk_print_part_devnum(IF_TYPE_SATA, dev)) {
|
|
||||||
printf("\nSATA device %d not available\n",
|
|
||||||
dev);
|
|
||||||
return CMD_RET_FAILURE;
|
|
||||||
}
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
return CMD_RET_USAGE;
|
|
||||||
|
|
||||||
default: /* at least 4 args */
|
|
||||||
if (strcmp(argv[1], "read") == 0) {
|
|
||||||
ulong addr = simple_strtoul(argv[2], NULL, 16);
|
|
||||||
ulong cnt = simple_strtoul(argv[4], NULL, 16);
|
|
||||||
ulong n;
|
|
||||||
lbaint_t blk = simple_strtoul(argv[3], NULL, 16);
|
|
||||||
|
|
||||||
printf("\nSATA read: device %d block # %ld, count %ld ... ",
|
|
||||||
sata_curr_device, blk, cnt);
|
|
||||||
|
|
||||||
n = blk_read_devnum(IF_TYPE_SATA, sata_curr_device, blk,
|
|
||||||
cnt, (ulong *)addr);
|
|
||||||
|
|
||||||
printf("%ld blocks read: %s\n",
|
|
||||||
n, (n==cnt) ? "OK" : "ERROR");
|
|
||||||
return (n == cnt) ? 0 : 1;
|
|
||||||
} else if (strcmp(argv[1], "write") == 0) {
|
|
||||||
ulong addr = simple_strtoul(argv[2], NULL, 16);
|
|
||||||
ulong cnt = simple_strtoul(argv[4], NULL, 16);
|
|
||||||
ulong n;
|
|
||||||
|
|
||||||
lbaint_t blk = simple_strtoul(argv[3], NULL, 16);
|
|
||||||
|
|
||||||
printf("\nSATA write: device %d block # %ld, count %ld ... ",
|
|
||||||
sata_curr_device, blk, cnt);
|
|
||||||
|
|
||||||
n = blk_write_devnum(IF_TYPE_SATA, sata_curr_device,
|
|
||||||
blk, cnt, (ulong *)addr);
|
|
||||||
|
|
||||||
printf("%ld blocks written: %s\n",
|
|
||||||
n, (n == cnt) ? "OK" : "ERROR");
|
|
||||||
return (n == cnt) ? 0 : 1;
|
|
||||||
} else {
|
|
||||||
return CMD_RET_USAGE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
U_BOOT_CMD(
|
U_BOOT_CMD(
|
||||||
sata, 5, 1, do_sata,
|
sata, 5, 1, do_sata,
|
||||||
"SATA sub system",
|
"SATA sub system",
|
||||||
"init - init SATA sub system\n"
|
"init - init SATA sub system\n"
|
||||||
"sata stop - disable SATA sub system\n"
|
"sata stop [dev] - disable SATA sub system or device\n"
|
||||||
"sata info - show available SATA devices\n"
|
"sata info - show available SATA devices\n"
|
||||||
"sata device [dev] - show or set current device\n"
|
"sata device [dev] - show or set current device\n"
|
||||||
"sata part [dev] - print partition table\n"
|
"sata part [dev] - print partition table\n"
|
||||||
|
|
79
cmd/scsi.c
79
cmd/scsi.c
|
@ -29,11 +29,7 @@ static int do_scsi(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
switch (argc) {
|
if (argc == 2) {
|
||||||
case 0:
|
|
||||||
case 1:
|
|
||||||
return CMD_RET_USAGE;
|
|
||||||
case 2:
|
|
||||||
if (strncmp(argv[1], "res", 3) == 0) {
|
if (strncmp(argv[1], "res", 3) == 0) {
|
||||||
printf("\nReset SCSI\n");
|
printf("\nReset SCSI\n");
|
||||||
#ifndef CONFIG_DM_SCSI
|
#ifndef CONFIG_DM_SCSI
|
||||||
|
@ -44,84 +40,15 @@ static int do_scsi(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
|
||||||
return CMD_RET_FAILURE;
|
return CMD_RET_FAILURE;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
if (strncmp(argv[1], "inf", 3) == 0) {
|
|
||||||
blk_list_devices(IF_TYPE_SCSI);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (strncmp(argv[1], "dev", 3) == 0) {
|
|
||||||
if (blk_print_device_num(IF_TYPE_SCSI, scsi_curr_dev)) {
|
|
||||||
printf("\nno SCSI devices available\n");
|
|
||||||
return CMD_RET_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (strncmp(argv[1], "scan", 4) == 0) {
|
if (strncmp(argv[1], "scan", 4) == 0) {
|
||||||
ret = scsi_scan(true);
|
ret = scsi_scan(true);
|
||||||
if (ret)
|
if (ret)
|
||||||
return CMD_RET_FAILURE;
|
return CMD_RET_FAILURE;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
if (strncmp(argv[1], "part", 4) == 0) {
|
}
|
||||||
if (blk_list_part(IF_TYPE_SCSI))
|
|
||||||
printf("\nno SCSI devices available\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return CMD_RET_USAGE;
|
|
||||||
case 3:
|
|
||||||
if (strncmp(argv[1], "dev", 3) == 0) {
|
|
||||||
int dev = (int)simple_strtoul(argv[2], NULL, 10);
|
|
||||||
|
|
||||||
if (!blk_show_device(IF_TYPE_SCSI, dev)) {
|
return blk_common_cmd(argc, argv, IF_TYPE_SCSI, &scsi_curr_dev);
|
||||||
scsi_curr_dev = dev;
|
|
||||||
printf("... is now current device\n");
|
|
||||||
} else {
|
|
||||||
return CMD_RET_FAILURE;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (strncmp(argv[1], "part", 4) == 0) {
|
|
||||||
int dev = (int)simple_strtoul(argv[2], NULL, 10);
|
|
||||||
|
|
||||||
if (blk_print_part_devnum(IF_TYPE_SCSI, dev)) {
|
|
||||||
printf("\nSCSI device %d not available\n",
|
|
||||||
dev);
|
|
||||||
return CMD_RET_FAILURE;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return CMD_RET_USAGE;
|
|
||||||
default:
|
|
||||||
/* at least 4 args */
|
|
||||||
if (strcmp(argv[1], "read") == 0) {
|
|
||||||
ulong addr = simple_strtoul(argv[2], NULL, 16);
|
|
||||||
ulong blk = simple_strtoul(argv[3], NULL, 16);
|
|
||||||
ulong cnt = simple_strtoul(argv[4], NULL, 16);
|
|
||||||
ulong n;
|
|
||||||
|
|
||||||
printf("\nSCSI read: device %d block # %ld, count %ld ... ",
|
|
||||||
scsi_curr_dev, blk, cnt);
|
|
||||||
n = blk_read_devnum(IF_TYPE_SCSI, scsi_curr_dev, blk,
|
|
||||||
cnt, (ulong *)addr);
|
|
||||||
printf("%ld blocks read: %s\n", n,
|
|
||||||
n == cnt ? "OK" : "ERROR");
|
|
||||||
return 0;
|
|
||||||
} else if (strcmp(argv[1], "write") == 0) {
|
|
||||||
ulong addr = simple_strtoul(argv[2], NULL, 16);
|
|
||||||
ulong blk = simple_strtoul(argv[3], NULL, 16);
|
|
||||||
ulong cnt = simple_strtoul(argv[4], NULL, 16);
|
|
||||||
ulong n;
|
|
||||||
|
|
||||||
printf("\nSCSI write: device %d block # %ld, count %ld ... ",
|
|
||||||
scsi_curr_dev, blk, cnt);
|
|
||||||
n = blk_write_devnum(IF_TYPE_SCSI, scsi_curr_dev, blk,
|
|
||||||
cnt, (ulong *)addr);
|
|
||||||
printf("%ld blocks written: %s\n", n,
|
|
||||||
n == cnt ? "OK" : "ERROR");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
} /* switch */
|
|
||||||
return CMD_RET_USAGE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
U_BOOT_CMD(
|
U_BOOT_CMD(
|
||||||
|
|
111
cmd/usb.c
111
cmd/usb.c
|
@ -621,9 +621,6 @@ static int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||||
struct usb_device *udev = NULL;
|
struct usb_device *udev = NULL;
|
||||||
int i;
|
int i;
|
||||||
extern char usb_started;
|
extern char usb_started;
|
||||||
#ifdef CONFIG_USB_STORAGE
|
|
||||||
struct blk_desc *stor_dev;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (argc < 2)
|
if (argc < 2)
|
||||||
return CMD_RET_USAGE;
|
return CMD_RET_USAGE;
|
||||||
|
@ -712,112 +709,10 @@ static int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||||
if (strncmp(argv[1], "stor", 4) == 0)
|
if (strncmp(argv[1], "stor", 4) == 0)
|
||||||
return usb_stor_info();
|
return usb_stor_info();
|
||||||
|
|
||||||
if (strncmp(argv[1], "part", 4) == 0) {
|
return blk_common_cmd(argc, argv, IF_TYPE_USB, &usb_stor_curr_dev);
|
||||||
int devno, ok = 0;
|
#else
|
||||||
if (argc == 2) {
|
|
||||||
for (devno = 0; ; ++devno) {
|
|
||||||
stor_dev = blk_get_devnum_by_type(IF_TYPE_USB,
|
|
||||||
devno);
|
|
||||||
if (stor_dev == NULL)
|
|
||||||
break;
|
|
||||||
if (stor_dev->type != DEV_TYPE_UNKNOWN) {
|
|
||||||
ok++;
|
|
||||||
if (devno)
|
|
||||||
printf("\n");
|
|
||||||
debug("print_part of %x\n", devno);
|
|
||||||
part_print(stor_dev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
devno = simple_strtoul(argv[2], NULL, 16);
|
|
||||||
stor_dev = blk_get_devnum_by_type(IF_TYPE_USB, devno);
|
|
||||||
if (stor_dev != NULL &&
|
|
||||||
stor_dev->type != DEV_TYPE_UNKNOWN) {
|
|
||||||
ok++;
|
|
||||||
debug("print_part of %x\n", devno);
|
|
||||||
part_print(stor_dev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!ok) {
|
|
||||||
printf("\nno USB devices available\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (strcmp(argv[1], "read") == 0) {
|
|
||||||
if (usb_stor_curr_dev < 0) {
|
|
||||||
printf("no current device selected\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if (argc == 5) {
|
|
||||||
unsigned long addr = simple_strtoul(argv[2], NULL, 16);
|
|
||||||
unsigned long blk = simple_strtoul(argv[3], NULL, 16);
|
|
||||||
unsigned long cnt = simple_strtoul(argv[4], NULL, 16);
|
|
||||||
unsigned long n;
|
|
||||||
printf("\nUSB read: device %d block # %ld, count %ld"
|
|
||||||
" ... ", usb_stor_curr_dev, blk, cnt);
|
|
||||||
stor_dev = blk_get_devnum_by_type(IF_TYPE_USB,
|
|
||||||
usb_stor_curr_dev);
|
|
||||||
n = blk_dread(stor_dev, blk, cnt, (ulong *)addr);
|
|
||||||
printf("%ld blocks read: %s\n", n,
|
|
||||||
(n == cnt) ? "OK" : "ERROR");
|
|
||||||
if (n == cnt)
|
|
||||||
return 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (strcmp(argv[1], "write") == 0) {
|
|
||||||
if (usb_stor_curr_dev < 0) {
|
|
||||||
printf("no current device selected\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if (argc == 5) {
|
|
||||||
unsigned long addr = simple_strtoul(argv[2], NULL, 16);
|
|
||||||
unsigned long blk = simple_strtoul(argv[3], NULL, 16);
|
|
||||||
unsigned long cnt = simple_strtoul(argv[4], NULL, 16);
|
|
||||||
unsigned long n;
|
|
||||||
printf("\nUSB write: device %d block # %ld, count %ld"
|
|
||||||
" ... ", usb_stor_curr_dev, blk, cnt);
|
|
||||||
stor_dev = blk_get_devnum_by_type(IF_TYPE_USB,
|
|
||||||
usb_stor_curr_dev);
|
|
||||||
n = blk_dwrite(stor_dev, blk, cnt, (ulong *)addr);
|
|
||||||
printf("%ld blocks write: %s\n", n,
|
|
||||||
(n == cnt) ? "OK" : "ERROR");
|
|
||||||
if (n == cnt)
|
|
||||||
return 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (strncmp(argv[1], "dev", 3) == 0) {
|
|
||||||
if (argc == 3) {
|
|
||||||
int dev = (int)simple_strtoul(argv[2], NULL, 10);
|
|
||||||
printf("\nUSB device %d: ", dev);
|
|
||||||
stor_dev = blk_get_devnum_by_type(IF_TYPE_USB, dev);
|
|
||||||
if ((stor_dev == NULL) ||
|
|
||||||
(stor_dev->if_type == IF_TYPE_UNKNOWN)) {
|
|
||||||
printf("unknown device\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
printf("\n Device %d: ", dev);
|
|
||||||
dev_print(stor_dev);
|
|
||||||
if (stor_dev->type == DEV_TYPE_UNKNOWN)
|
|
||||||
return 1;
|
|
||||||
usb_stor_curr_dev = dev;
|
|
||||||
printf("... is now current device\n");
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
printf("\nUSB device %d: ", usb_stor_curr_dev);
|
|
||||||
stor_dev = blk_get_devnum_by_type(IF_TYPE_USB,
|
|
||||||
usb_stor_curr_dev);
|
|
||||||
dev_print(stor_dev);
|
|
||||||
if (stor_dev->type == DEV_TYPE_UNKNOWN)
|
|
||||||
return 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_USB_STORAGE */
|
|
||||||
return CMD_RET_USAGE;
|
return CMD_RET_USAGE;
|
||||||
|
#endif /* CONFIG_USB_STORAGE */
|
||||||
}
|
}
|
||||||
|
|
||||||
U_BOOT_CMD(
|
U_BOOT_CMD(
|
||||||
|
|
|
@ -166,7 +166,7 @@ static inline int splash_init_usb(void)
|
||||||
#ifdef CONFIG_SATA
|
#ifdef CONFIG_SATA
|
||||||
static int splash_init_sata(void)
|
static int splash_init_sata(void)
|
||||||
{
|
{
|
||||||
return sata_initialize();
|
return sata_probe(0);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static inline int splash_init_sata(void)
|
static inline int splash_init_sata(void)
|
||||||
|
|
|
@ -11,6 +11,8 @@ CONFIG_SPL_SPI_SUPPORT=y
|
||||||
CONFIG_SPL_WATCHDOG_SUPPORT=y
|
CONFIG_SPL_WATCHDOG_SUPPORT=y
|
||||||
CONFIG_VIDEO=y
|
CONFIG_VIDEO=y
|
||||||
# CONFIG_CMD_BMODE is not set
|
# CONFIG_CMD_BMODE is not set
|
||||||
|
CONFIG_DEFAULT_DEVICE_TREE="imx6q-cm-fx6"
|
||||||
|
CONFIG_AHCI=y
|
||||||
CONFIG_OF_BOARD_SETUP=y
|
CONFIG_OF_BOARD_SETUP=y
|
||||||
CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=arch/arm/mach-imx/spl_sd.cfg,MX6QDL"
|
CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=arch/arm/mach-imx/spl_sd.cfg,MX6QDL"
|
||||||
CONFIG_ENV_IS_IN_SPI_FLASH=y
|
CONFIG_ENV_IS_IN_SPI_FLASH=y
|
||||||
|
@ -49,6 +51,8 @@ CONFIG_CMD_EXT4_WRITE=y
|
||||||
CONFIG_CMD_FAT=y
|
CONFIG_CMD_FAT=y
|
||||||
CONFIG_CMD_FS_GENERIC=y
|
CONFIG_CMD_FS_GENERIC=y
|
||||||
CONFIG_CMD_MTDPARTS=y
|
CONFIG_CMD_MTDPARTS=y
|
||||||
|
CONFIG_OF_CONTROL=y
|
||||||
|
CONFIG_DM_MMC=y
|
||||||
CONFIG_SPI_FLASH=y
|
CONFIG_SPI_FLASH=y
|
||||||
CONFIG_SPI_FLASH_ATMEL=y
|
CONFIG_SPI_FLASH_ATMEL=y
|
||||||
CONFIG_SPI_FLASH_EON=y
|
CONFIG_SPI_FLASH_EON=y
|
||||||
|
@ -59,9 +63,11 @@ CONFIG_SPI_FLASH_STMICRO=y
|
||||||
CONFIG_SPI_FLASH_SST=y
|
CONFIG_SPI_FLASH_SST=y
|
||||||
CONFIG_SPI_FLASH_WINBOND=y
|
CONFIG_SPI_FLASH_WINBOND=y
|
||||||
CONFIG_PHYLIB=y
|
CONFIG_PHYLIB=y
|
||||||
|
CONFIG_DM_PMIC=y
|
||||||
|
CONFIG_DM_REGULATOR=y
|
||||||
CONFIG_USB=y
|
CONFIG_USB=y
|
||||||
|
CONFIG_DM_USB=y
|
||||||
CONFIG_USB_STORAGE=y
|
CONFIG_USB_STORAGE=y
|
||||||
CONFIG_USB_KEYBOARD=y
|
CONFIG_USB_KEYBOARD=y
|
||||||
CONFIG_SYS_USB_EVENT_POLL_VIA_INT_QUEUE=y
|
CONFIG_SYS_USB_EVENT_POLL_VIA_INT_QUEUE=y
|
||||||
CONFIG_OF_LIBFDT=y
|
|
||||||
CONFIG_FDT_FIXUP_PARTITIONS=y
|
CONFIG_FDT_FIXUP_PARTITIONS=y
|
||||||
|
|
|
@ -31,7 +31,6 @@ CONFIG_CMD_FS_GENERIC=y
|
||||||
CONFIG_CMD_MTDPARTS=y
|
CONFIG_CMD_MTDPARTS=y
|
||||||
# CONFIG_BLK is not set
|
# CONFIG_BLK is not set
|
||||||
CONFIG_SYS_I2C_MXC=y
|
CONFIG_SYS_I2C_MXC=y
|
||||||
# CONFIG_DM_MMC_OPS is not set
|
|
||||||
CONFIG_NAND=y
|
CONFIG_NAND=y
|
||||||
CONFIG_NAND_MXS=y
|
CONFIG_NAND_MXS=y
|
||||||
CONFIG_PHYLIB=y
|
CONFIG_PHYLIB=y
|
||||||
|
|
|
@ -38,7 +38,6 @@ CONFIG_CMD_FS_GENERIC=y
|
||||||
CONFIG_OF_LIST="imx6q-icore imx6dl-icore"
|
CONFIG_OF_LIST="imx6q-icore imx6dl-icore"
|
||||||
# CONFIG_BLK is not set
|
# CONFIG_BLK is not set
|
||||||
CONFIG_SYS_I2C_MXC=y
|
CONFIG_SYS_I2C_MXC=y
|
||||||
# CONFIG_DM_MMC_OPS is not set
|
|
||||||
CONFIG_PHYLIB=y
|
CONFIG_PHYLIB=y
|
||||||
CONFIG_PHY_SMSC=y
|
CONFIG_PHY_SMSC=y
|
||||||
CONFIG_FEC_MXC=y
|
CONFIG_FEC_MXC=y
|
||||||
|
|
|
@ -36,7 +36,6 @@ CONFIG_CMD_FS_GENERIC=y
|
||||||
CONFIG_OF_LIST="imx6q-icore-rqs imx6dl-icore-rqs"
|
CONFIG_OF_LIST="imx6q-icore-rqs imx6dl-icore-rqs"
|
||||||
# CONFIG_BLK is not set
|
# CONFIG_BLK is not set
|
||||||
CONFIG_SYS_I2C_MXC=y
|
CONFIG_SYS_I2C_MXC=y
|
||||||
# CONFIG_DM_MMC_OPS is not set
|
|
||||||
CONFIG_PHYLIB=y
|
CONFIG_PHYLIB=y
|
||||||
CONFIG_PHY_MICREL=y
|
CONFIG_PHY_MICREL=y
|
||||||
CONFIG_FEC_MXC=y
|
CONFIG_FEC_MXC=y
|
||||||
|
|
|
@ -35,7 +35,6 @@ CONFIG_CMD_FAT=y
|
||||||
CONFIG_CMD_FS_GENERIC=y
|
CONFIG_CMD_FS_GENERIC=y
|
||||||
# CONFIG_BLK is not set
|
# CONFIG_BLK is not set
|
||||||
CONFIG_SYS_I2C_MXC=y
|
CONFIG_SYS_I2C_MXC=y
|
||||||
# CONFIG_DM_MMC_OPS is not set
|
|
||||||
CONFIG_PHYLIB=y
|
CONFIG_PHYLIB=y
|
||||||
CONFIG_PHY_SMSC=y
|
CONFIG_PHY_SMSC=y
|
||||||
CONFIG_FEC_MXC=y
|
CONFIG_FEC_MXC=y
|
||||||
|
|
|
@ -34,7 +34,6 @@ CONFIG_CMD_FS_GENERIC=y
|
||||||
CONFIG_CMD_UBI=y
|
CONFIG_CMD_UBI=y
|
||||||
# CONFIG_BLK is not set
|
# CONFIG_BLK is not set
|
||||||
CONFIG_SYS_I2C_MXC=y
|
CONFIG_SYS_I2C_MXC=y
|
||||||
# CONFIG_DM_MMC_OPS is not set
|
|
||||||
CONFIG_NAND=y
|
CONFIG_NAND=y
|
||||||
CONFIG_NAND_MXS=y
|
CONFIG_NAND_MXS=y
|
||||||
CONFIG_PHYLIB=y
|
CONFIG_PHYLIB=y
|
||||||
|
|
|
@ -33,7 +33,6 @@ CONFIG_CMD_EXT4_WRITE=y
|
||||||
CONFIG_CMD_FAT=y
|
CONFIG_CMD_FAT=y
|
||||||
CONFIG_CMD_FS_GENERIC=y
|
CONFIG_CMD_FS_GENERIC=y
|
||||||
# CONFIG_BLK is not set
|
# CONFIG_BLK is not set
|
||||||
# CONFIG_DM_MMC_OPS is not set
|
|
||||||
CONFIG_PHYLIB=y
|
CONFIG_PHYLIB=y
|
||||||
CONFIG_PHY_SMSC=y
|
CONFIG_PHY_SMSC=y
|
||||||
CONFIG_FEC_MXC=y
|
CONFIG_FEC_MXC=y
|
||||||
|
|
|
@ -35,7 +35,6 @@ CONFIG_CMD_FAT=y
|
||||||
CONFIG_CMD_FS_GENERIC=y
|
CONFIG_CMD_FS_GENERIC=y
|
||||||
# CONFIG_BLK is not set
|
# CONFIG_BLK is not set
|
||||||
CONFIG_SYS_I2C_MXC=y
|
CONFIG_SYS_I2C_MXC=y
|
||||||
# CONFIG_DM_MMC_OPS is not set
|
|
||||||
CONFIG_PHYLIB=y
|
CONFIG_PHYLIB=y
|
||||||
CONFIG_PHY_SMSC=y
|
CONFIG_PHY_SMSC=y
|
||||||
CONFIG_FEC_MXC=y
|
CONFIG_FEC_MXC=y
|
||||||
|
|
|
@ -34,7 +34,6 @@ CONFIG_CMD_FS_GENERIC=y
|
||||||
CONFIG_CMD_UBI=y
|
CONFIG_CMD_UBI=y
|
||||||
# CONFIG_BLK is not set
|
# CONFIG_BLK is not set
|
||||||
CONFIG_SYS_I2C_MXC=y
|
CONFIG_SYS_I2C_MXC=y
|
||||||
# CONFIG_DM_MMC_OPS is not set
|
|
||||||
CONFIG_NAND=y
|
CONFIG_NAND=y
|
||||||
CONFIG_NAND_MXS=y
|
CONFIG_NAND_MXS=y
|
||||||
CONFIG_PHYLIB=y
|
CONFIG_PHYLIB=y
|
||||||
|
|
|
@ -36,7 +36,6 @@ CONFIG_NET_RANDOM_ETHADDR=y
|
||||||
CONFIG_DM=y
|
CONFIG_DM=y
|
||||||
# CONFIG_BLK is not set
|
# CONFIG_BLK is not set
|
||||||
CONFIG_DM_MMC=y
|
CONFIG_DM_MMC=y
|
||||||
# CONFIG_DM_MMC_OPS is not set
|
|
||||||
CONFIG_DM_SPI_FLASH=y
|
CONFIG_DM_SPI_FLASH=y
|
||||||
CONFIG_SPI_FLASH=y
|
CONFIG_SPI_FLASH=y
|
||||||
CONFIG_NETDEVICES=y
|
CONFIG_NETDEVICES=y
|
||||||
|
|
|
@ -34,7 +34,6 @@ CONFIG_NET_RANDOM_ETHADDR=y
|
||||||
CONFIG_DM=y
|
CONFIG_DM=y
|
||||||
# CONFIG_BLK is not set
|
# CONFIG_BLK is not set
|
||||||
CONFIG_DM_MMC=y
|
CONFIG_DM_MMC=y
|
||||||
# CONFIG_DM_MMC_OPS is not set
|
|
||||||
CONFIG_DM_SPI_FLASH=y
|
CONFIG_DM_SPI_FLASH=y
|
||||||
CONFIG_SPI_FLASH=y
|
CONFIG_SPI_FLASH=y
|
||||||
CONFIG_NETDEVICES=y
|
CONFIG_NETDEVICES=y
|
||||||
|
|
|
@ -32,7 +32,6 @@ CONFIG_DM=y
|
||||||
CONFIG_DM_GPIO=y
|
CONFIG_DM_GPIO=y
|
||||||
CONFIG_DM_I2C=y
|
CONFIG_DM_I2C=y
|
||||||
CONFIG_DM_MMC=y
|
CONFIG_DM_MMC=y
|
||||||
# CONFIG_DM_MMC_OPS is not set
|
|
||||||
CONFIG_SPI_FLASH=y
|
CONFIG_SPI_FLASH=y
|
||||||
CONFIG_SPI_FLASH_STMICRO=y
|
CONFIG_SPI_FLASH_STMICRO=y
|
||||||
CONFIG_PHYLIB=y
|
CONFIG_PHYLIB=y
|
||||||
|
|
|
@ -33,7 +33,6 @@ CONFIG_DM=y
|
||||||
CONFIG_DM_GPIO=y
|
CONFIG_DM_GPIO=y
|
||||||
CONFIG_DM_I2C=y
|
CONFIG_DM_I2C=y
|
||||||
CONFIG_DM_MMC=y
|
CONFIG_DM_MMC=y
|
||||||
# CONFIG_DM_MMC_OPS is not set
|
|
||||||
CONFIG_SPI_FLASH=y
|
CONFIG_SPI_FLASH=y
|
||||||
CONFIG_SPI_FLASH_STMICRO=y
|
CONFIG_SPI_FLASH_STMICRO=y
|
||||||
CONFIG_PHYLIB=y
|
CONFIG_PHYLIB=y
|
||||||
|
|
|
@ -29,7 +29,6 @@ CONFIG_OF_CONTROL=y
|
||||||
CONFIG_DM_GPIO=y
|
CONFIG_DM_GPIO=y
|
||||||
CONFIG_DM_I2C=y
|
CONFIG_DM_I2C=y
|
||||||
CONFIG_DM_MMC=y
|
CONFIG_DM_MMC=y
|
||||||
# CONFIG_DM_MMC_OPS is not set
|
|
||||||
CONFIG_PINCTRL=y
|
CONFIG_PINCTRL=y
|
||||||
CONFIG_PINCTRL_IMX6=y
|
CONFIG_PINCTRL_IMX6=y
|
||||||
CONFIG_DM_PMIC=y
|
CONFIG_DM_PMIC=y
|
||||||
|
|
|
@ -30,7 +30,6 @@ CONFIG_OF_CONTROL=y
|
||||||
CONFIG_DM_GPIO=y
|
CONFIG_DM_GPIO=y
|
||||||
CONFIG_DM_I2C=y
|
CONFIG_DM_I2C=y
|
||||||
CONFIG_DM_MMC=y
|
CONFIG_DM_MMC=y
|
||||||
# CONFIG_DM_MMC_OPS is not set
|
|
||||||
CONFIG_PINCTRL=y
|
CONFIG_PINCTRL=y
|
||||||
CONFIG_PINCTRL_IMX6=y
|
CONFIG_PINCTRL_IMX6=y
|
||||||
CONFIG_DM_PMIC=y
|
CONFIG_DM_PMIC=y
|
||||||
|
|
|
@ -34,7 +34,6 @@ CONFIG_DM_GPIO=y
|
||||||
CONFIG_DM_PCA953X=y
|
CONFIG_DM_PCA953X=y
|
||||||
CONFIG_DM_I2C=y
|
CONFIG_DM_I2C=y
|
||||||
CONFIG_DM_MMC=y
|
CONFIG_DM_MMC=y
|
||||||
# CONFIG_DM_MMC_OPS is not set
|
|
||||||
CONFIG_SPI_FLASH=y
|
CONFIG_SPI_FLASH=y
|
||||||
CONFIG_SPI_FLASH_BAR=y
|
CONFIG_SPI_FLASH_BAR=y
|
||||||
CONFIG_SPI_FLASH_STMICRO=y
|
CONFIG_SPI_FLASH_STMICRO=y
|
||||||
|
|
|
@ -27,7 +27,6 @@ CONFIG_DM_GPIO=y
|
||||||
CONFIG_DM_74X164=y
|
CONFIG_DM_74X164=y
|
||||||
CONFIG_DM_I2C=y
|
CONFIG_DM_I2C=y
|
||||||
CONFIG_DM_MMC=y
|
CONFIG_DM_MMC=y
|
||||||
# CONFIG_DM_MMC_OPS is not set
|
|
||||||
CONFIG_PINCTRL=y
|
CONFIG_PINCTRL=y
|
||||||
CONFIG_PINCTRL_IMX6=y
|
CONFIG_PINCTRL_IMX6=y
|
||||||
CONFIG_DM_REGULATOR=y
|
CONFIG_DM_REGULATOR=y
|
||||||
|
|
|
@ -28,7 +28,6 @@ CONFIG_DM_GPIO=y
|
||||||
CONFIG_DM_74X164=y
|
CONFIG_DM_74X164=y
|
||||||
CONFIG_DM_I2C=y
|
CONFIG_DM_I2C=y
|
||||||
CONFIG_DM_MMC=y
|
CONFIG_DM_MMC=y
|
||||||
# CONFIG_DM_MMC_OPS is not set
|
|
||||||
CONFIG_PINCTRL=y
|
CONFIG_PINCTRL=y
|
||||||
CONFIG_PINCTRL_IMX6=y
|
CONFIG_PINCTRL_IMX6=y
|
||||||
CONFIG_DM_REGULATOR=y
|
CONFIG_DM_REGULATOR=y
|
||||||
|
|
|
@ -45,7 +45,6 @@ CONFIG_DM_GPIO=y
|
||||||
CONFIG_DM_74X164=y
|
CONFIG_DM_74X164=y
|
||||||
CONFIG_DM_I2C=y
|
CONFIG_DM_I2C=y
|
||||||
CONFIG_DM_MMC=y
|
CONFIG_DM_MMC=y
|
||||||
# CONFIG_DM_MMC_OPS is not set
|
|
||||||
CONFIG_SPI_FLASH=y
|
CONFIG_SPI_FLASH=y
|
||||||
CONFIG_SPI_FLASH_EON=y
|
CONFIG_SPI_FLASH_EON=y
|
||||||
CONFIG_PHYLIB=y
|
CONFIG_PHYLIB=y
|
||||||
|
|
|
@ -47,7 +47,6 @@ CONFIG_DM_GPIO=y
|
||||||
CONFIG_DM_74X164=y
|
CONFIG_DM_74X164=y
|
||||||
CONFIG_DM_I2C=y
|
CONFIG_DM_I2C=y
|
||||||
CONFIG_DM_MMC=y
|
CONFIG_DM_MMC=y
|
||||||
# CONFIG_DM_MMC_OPS is not set
|
|
||||||
CONFIG_SPI_FLASH=y
|
CONFIG_SPI_FLASH=y
|
||||||
CONFIG_SPI_FLASH_EON=y
|
CONFIG_SPI_FLASH_EON=y
|
||||||
CONFIG_PHYLIB=y
|
CONFIG_PHYLIB=y
|
||||||
|
|
|
@ -16,7 +16,6 @@ CONFIG_DM_GPIO=y
|
||||||
CONFIG_IMX_RGPIO2P=y
|
CONFIG_IMX_RGPIO2P=y
|
||||||
CONFIG_DM_I2C=y
|
CONFIG_DM_I2C=y
|
||||||
CONFIG_DM_MMC=y
|
CONFIG_DM_MMC=y
|
||||||
# CONFIG_DM_MMC_OPS is not set
|
|
||||||
CONFIG_PINCTRL=y
|
CONFIG_PINCTRL=y
|
||||||
CONFIG_PINCTRL_IMX7ULP=y
|
CONFIG_PINCTRL_IMX7ULP=y
|
||||||
CONFIG_DM_REGULATOR=y
|
CONFIG_DM_REGULATOR=y
|
||||||
|
|
|
@ -16,7 +16,6 @@ CONFIG_DM_GPIO=y
|
||||||
CONFIG_IMX_RGPIO2P=y
|
CONFIG_IMX_RGPIO2P=y
|
||||||
CONFIG_DM_I2C=y
|
CONFIG_DM_I2C=y
|
||||||
CONFIG_DM_MMC=y
|
CONFIG_DM_MMC=y
|
||||||
# CONFIG_DM_MMC_OPS is not set
|
|
||||||
CONFIG_PINCTRL=y
|
CONFIG_PINCTRL=y
|
||||||
CONFIG_PINCTRL_IMX7ULP=y
|
CONFIG_PINCTRL_IMX7ULP=y
|
||||||
CONFIG_DM_REGULATOR=y
|
CONFIG_DM_REGULATOR=y
|
||||||
|
|
|
@ -62,7 +62,6 @@ CONFIG_SYSCON=y
|
||||||
CONFIG_DM_I2C=y
|
CONFIG_DM_I2C=y
|
||||||
CONFIG_SYS_I2C_MXC=y
|
CONFIG_SYS_I2C_MXC=y
|
||||||
CONFIG_PWRSEQ=y
|
CONFIG_PWRSEQ=y
|
||||||
# CONFIG_DM_MMC_OPS is not set
|
|
||||||
CONFIG_PHYLIB=y
|
CONFIG_PHYLIB=y
|
||||||
CONFIG_PHY_MICREL=y
|
CONFIG_PHY_MICREL=y
|
||||||
CONFIG_NETDEVICES=y
|
CONFIG_NETDEVICES=y
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -5,8 +5,8 @@
|
||||||
* SPDX-License-Identifier: GPL-2.0+
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __FSL_SATA_H__
|
#ifndef __DWC_AHSATA_PRIV_H__
|
||||||
#define __FSL_SATA_H__
|
#define __DWC_AHSATA_PRIV_H__
|
||||||
|
|
||||||
#define DWC_AHSATA_MAX_CMD_SLOTS 32
|
#define DWC_AHSATA_MAX_CMD_SLOTS 32
|
||||||
|
|
||||||
|
@ -317,4 +317,4 @@
|
||||||
#define READ_CMD 0
|
#define READ_CMD 0
|
||||||
#define WRITE_CMD 1
|
#define WRITE_CMD 1
|
||||||
|
|
||||||
#endif /* __FSL_SATA_H__ */
|
#endif /* __DWC_AHSATA_H__ */
|
|
@ -11,17 +11,52 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
|
#include <ahci.h>
|
||||||
#include <dm.h>
|
#include <dm.h>
|
||||||
#include <sata.h>
|
#include <sata.h>
|
||||||
|
|
||||||
|
#ifndef CONFIG_AHCI
|
||||||
struct blk_desc sata_dev_desc[CONFIG_SYS_SATA_MAX_DEVICE];
|
struct blk_desc sata_dev_desc[CONFIG_SYS_SATA_MAX_DEVICE];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int sata_reset(struct udevice *dev)
|
||||||
|
{
|
||||||
|
struct ahci_ops *ops = ahci_get_ops(dev);
|
||||||
|
|
||||||
|
if (!ops->reset)
|
||||||
|
return -ENOSYS;
|
||||||
|
|
||||||
|
return ops->reset(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
int sata_dm_port_status(struct udevice *dev, int port)
|
||||||
|
{
|
||||||
|
struct ahci_ops *ops = ahci_get_ops(dev);
|
||||||
|
|
||||||
|
if (!ops->port_status)
|
||||||
|
return -ENOSYS;
|
||||||
|
|
||||||
|
return ops->port_status(dev, port);
|
||||||
|
}
|
||||||
|
|
||||||
|
int sata_scan(struct udevice *dev)
|
||||||
|
{
|
||||||
|
struct ahci_ops *ops = ahci_get_ops(dev);
|
||||||
|
|
||||||
|
if (!ops->scan)
|
||||||
|
return -ENOSYS;
|
||||||
|
|
||||||
|
return ops->scan(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef CONFIG_AHCI
|
||||||
#ifdef CONFIG_PARTITIONS
|
#ifdef CONFIG_PARTITIONS
|
||||||
struct blk_desc *sata_get_dev(int dev)
|
struct blk_desc *sata_get_dev(int dev)
|
||||||
{
|
{
|
||||||
return (dev < CONFIG_SYS_SATA_MAX_DEVICE) ? &sata_dev_desc[dev] : NULL;
|
return (dev < CONFIG_SYS_SATA_MAX_DEVICE) ? &sata_dev_desc[dev] : NULL;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_BLK
|
#ifdef CONFIG_BLK
|
||||||
static unsigned long sata_bread(struct udevice *dev, lbaint_t start,
|
static unsigned long sata_bread(struct udevice *dev, lbaint_t start,
|
||||||
|
@ -49,6 +84,7 @@ static unsigned long sata_bwrite(struct blk_desc *block_dev, lbaint_t start,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONFIG_AHCI
|
||||||
int __sata_initialize(void)
|
int __sata_initialize(void)
|
||||||
{
|
{
|
||||||
int rc, ret = -1;
|
int rc, ret = -1;
|
||||||
|
@ -95,6 +131,7 @@ __weak int __sata_stop(void)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
int sata_stop(void) __attribute__((weak, alias("__sata_stop")));
|
int sata_stop(void) __attribute__((weak, alias("__sata_stop")));
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_BLK
|
#ifdef CONFIG_BLK
|
||||||
static const struct blk_ops sata_blk_ops = {
|
static const struct blk_ops sata_blk_ops = {
|
||||||
|
|
|
@ -57,6 +57,11 @@ static enum uclass_id if_type_to_uclass_id(enum if_type if_type)
|
||||||
return if_type_uclass_id[if_type];
|
return if_type_uclass_id[if_type];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *blk_get_if_type_name(enum if_type if_type)
|
||||||
|
{
|
||||||
|
return if_typename_str[if_type];
|
||||||
|
}
|
||||||
|
|
||||||
struct blk_desc *blk_get_devnum_by_type(enum if_type if_type, int devnum)
|
struct blk_desc *blk_get_devnum_by_type(enum if_type if_type, int devnum)
|
||||||
{
|
{
|
||||||
struct blk_desc *desc;
|
struct blk_desc *desc;
|
||||||
|
@ -591,7 +596,7 @@ int blk_create_devicef(struct udevice *parent, const char *drv_name,
|
||||||
}
|
}
|
||||||
device_set_name_alloced(*devp);
|
device_set_name_alloced(*devp);
|
||||||
|
|
||||||
return ret;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int blk_unbind_all(int if_type)
|
int blk_unbind_all(int if_type)
|
||||||
|
|
|
@ -38,6 +38,13 @@ static struct blk_driver *blk_driver_lookup_typename(const char *if_typename)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *blk_get_if_type_name(enum if_type if_type)
|
||||||
|
{
|
||||||
|
struct blk_driver *drv = blk_driver_lookup_type(if_type);
|
||||||
|
|
||||||
|
return drv ? drv->if_typename : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get_desc() - Get the block device descriptor for the given device number
|
* get_desc() - Get the block device descriptor for the given device number
|
||||||
*
|
*
|
||||||
|
|
|
@ -104,5 +104,8 @@ static const struct udevice_id generic_syscon_ids[] = {
|
||||||
U_BOOT_DRIVER(generic_syscon) = {
|
U_BOOT_DRIVER(generic_syscon) = {
|
||||||
.name = "syscon",
|
.name = "syscon",
|
||||||
.id = UCLASS_SYSCON,
|
.id = UCLASS_SYSCON,
|
||||||
|
#if !CONFIG_IS_ENABLED(OF_PLATDATA)
|
||||||
|
.bind = dm_scan_fdt_dev,
|
||||||
|
#endif
|
||||||
.of_match = generic_syscon_ids,
|
.of_match = generic_syscon_ids,
|
||||||
};
|
};
|
||||||
|
|
|
@ -20,16 +20,6 @@ config DM_MMC
|
||||||
appear as block devices in U-Boot and can support filesystems such
|
appear as block devices in U-Boot and can support filesystems such
|
||||||
as EXT4 and FAT.
|
as EXT4 and FAT.
|
||||||
|
|
||||||
config DM_MMC_OPS
|
|
||||||
bool "Support MMC controller operations using Driver Model"
|
|
||||||
depends on DM_MMC
|
|
||||||
default y if DM_MMC
|
|
||||||
help
|
|
||||||
Driver model provides a means of supporting device operations. This
|
|
||||||
option moves MMC operations under the control of driver model. The
|
|
||||||
option will be removed as soon as all DM_MMC drivers use it, as it
|
|
||||||
will the only supported behaviour.
|
|
||||||
|
|
||||||
config SPL_DM_MMC
|
config SPL_DM_MMC
|
||||||
bool "Enable MMC controllers using Driver Model in SPL"
|
bool "Enable MMC controllers using Driver Model in SPL"
|
||||||
depends on SPL_DM && DM_MMC
|
depends on SPL_DM && DM_MMC
|
||||||
|
@ -41,16 +31,6 @@ config SPL_DM_MMC
|
||||||
appear as block devices in U-Boot and can support filesystems such
|
appear as block devices in U-Boot and can support filesystems such
|
||||||
as EXT4 and FAT.
|
as EXT4 and FAT.
|
||||||
|
|
||||||
config SPL_DM_MMC_OPS
|
|
||||||
bool "Support MMC controller operations using Driver Model in SPL"
|
|
||||||
depends on SPL_DM && DM_MMC_OPS
|
|
||||||
default y
|
|
||||||
help
|
|
||||||
Driver model provides a means of supporting device operations. This
|
|
||||||
option moves MMC operations under the control of driver model. The
|
|
||||||
option will be removed as soon as all DM_MMC drivers use it, as it
|
|
||||||
will the only supported behaviour.
|
|
||||||
|
|
||||||
if MMC
|
if MMC
|
||||||
|
|
||||||
config SPL_MMC_TINY
|
config SPL_MMC_TINY
|
||||||
|
@ -124,7 +104,7 @@ config MMC_DW_SOCFPGA
|
||||||
|
|
||||||
config MMC_MESON_GX
|
config MMC_MESON_GX
|
||||||
bool "Meson GX EMMC controller support"
|
bool "Meson GX EMMC controller support"
|
||||||
depends on DM_MMC && BLK && DM_MMC_OPS && ARCH_MESON
|
depends on DM_MMC && BLK && ARCH_MESON
|
||||||
help
|
help
|
||||||
Support for EMMC host controller on Meson GX ARM SoCs platform (S905)
|
Support for EMMC host controller on Meson GX ARM SoCs platform (S905)
|
||||||
|
|
||||||
|
@ -155,7 +135,7 @@ config MMC_PCI
|
||||||
|
|
||||||
config MMC_OMAP_HS
|
config MMC_OMAP_HS
|
||||||
bool "TI OMAP High Speed Multimedia Card Interface support"
|
bool "TI OMAP High Speed Multimedia Card Interface support"
|
||||||
select DM_MMC_OPS if DM_MMC
|
select DM_REGULATOR_PBIAS if DM_MMC && DM_REGULATOR
|
||||||
help
|
help
|
||||||
This selects the TI OMAP High Speed Multimedia card Interface.
|
This selects the TI OMAP High Speed Multimedia card Interface.
|
||||||
If you have an omap2plus board with a Multimedia Card slot,
|
If you have an omap2plus board with a Multimedia Card slot,
|
||||||
|
@ -184,7 +164,7 @@ config SH_SDHI
|
||||||
config MMC_UNIPHIER
|
config MMC_UNIPHIER
|
||||||
bool "UniPhier SD/MMC Host Controller support"
|
bool "UniPhier SD/MMC Host Controller support"
|
||||||
depends on ARCH_UNIPHIER
|
depends on ARCH_UNIPHIER
|
||||||
depends on BLK && DM_MMC_OPS
|
depends on BLK && DM_MMC
|
||||||
depends on OF_CONTROL
|
depends on OF_CONTROL
|
||||||
help
|
help
|
||||||
This selects support for the SD/MMC Host Controller on UniPhier SoCs.
|
This selects support for the SD/MMC Host Controller on UniPhier SoCs.
|
||||||
|
@ -192,7 +172,7 @@ config MMC_UNIPHIER
|
||||||
config MMC_SANDBOX
|
config MMC_SANDBOX
|
||||||
bool "Sandbox MMC support"
|
bool "Sandbox MMC support"
|
||||||
depends on SANDBOX
|
depends on SANDBOX
|
||||||
depends on BLK && DM_MMC_OPS && OF_CONTROL
|
depends on BLK && DM_MMC && OF_CONTROL
|
||||||
help
|
help
|
||||||
This select a dummy sandbox MMC driver. At present this does nothing
|
This select a dummy sandbox MMC driver. At present this does nothing
|
||||||
other than allow sandbox to be build with MMC support. This
|
other than allow sandbox to be build with MMC support. This
|
||||||
|
@ -227,7 +207,7 @@ config MMC_SDHCI_SDMA
|
||||||
config MMC_SDHCI_ATMEL
|
config MMC_SDHCI_ATMEL
|
||||||
bool "Atmel SDHCI controller support"
|
bool "Atmel SDHCI controller support"
|
||||||
depends on ARCH_AT91
|
depends on ARCH_AT91
|
||||||
depends on DM_MMC && BLK && DM_MMC_OPS && ARCH_AT91
|
depends on DM_MMC && BLK && ARCH_AT91
|
||||||
depends on MMC_SDHCI
|
depends on MMC_SDHCI
|
||||||
help
|
help
|
||||||
This enables support for the Atmel SDHCI controller, which supports
|
This enables support for the Atmel SDHCI controller, which supports
|
||||||
|
@ -251,7 +231,7 @@ config MMC_SDHCI_BCM2835
|
||||||
|
|
||||||
config MMC_SDHCI_CADENCE
|
config MMC_SDHCI_CADENCE
|
||||||
bool "SDHCI support for the Cadence SD/SDIO/eMMC controller"
|
bool "SDHCI support for the Cadence SD/SDIO/eMMC controller"
|
||||||
depends on BLK && DM_MMC_OPS
|
depends on BLK && DM_MMC
|
||||||
depends on MMC_SDHCI
|
depends on MMC_SDHCI
|
||||||
depends on OF_CONTROL
|
depends on OF_CONTROL
|
||||||
help
|
help
|
||||||
|
@ -273,7 +253,7 @@ config MMC_SDHCI_KONA
|
||||||
|
|
||||||
config MMC_SDHCI_MSM
|
config MMC_SDHCI_MSM
|
||||||
bool "Qualcomm SDHCI controller"
|
bool "Qualcomm SDHCI controller"
|
||||||
depends on BLK && DM_MMC_OPS
|
depends on BLK && DM_MMC
|
||||||
depends on MMC_SDHCI
|
depends on MMC_SDHCI
|
||||||
help
|
help
|
||||||
Enables support for SDHCI 2.0 controller present on some Qualcomm
|
Enables support for SDHCI 2.0 controller present on some Qualcomm
|
||||||
|
@ -303,7 +283,7 @@ config MMC_SDHCI_PIC32
|
||||||
config MMC_SDHCI_ROCKCHIP
|
config MMC_SDHCI_ROCKCHIP
|
||||||
bool "Arasan SDHCI controller for Rockchip support"
|
bool "Arasan SDHCI controller for Rockchip support"
|
||||||
depends on ARCH_ROCKCHIP
|
depends on ARCH_ROCKCHIP
|
||||||
depends on DM_MMC && BLK && DM_MMC_OPS
|
depends on DM_MMC && BLK
|
||||||
depends on MMC_SDHCI
|
depends on MMC_SDHCI
|
||||||
help
|
help
|
||||||
Support for Arasan SDHCI host controller on Rockchip ARM SoCs platform
|
Support for Arasan SDHCI host controller on Rockchip ARM SoCs platform
|
||||||
|
@ -376,7 +356,7 @@ config MMC_SDHCI_TEGRA
|
||||||
config MMC_SDHCI_ZYNQ
|
config MMC_SDHCI_ZYNQ
|
||||||
bool "Arasan SDHCI controller support"
|
bool "Arasan SDHCI controller support"
|
||||||
depends on ARCH_ZYNQ || ARCH_ZYNQMP
|
depends on ARCH_ZYNQ || ARCH_ZYNQMP
|
||||||
depends on DM_MMC && OF_CONTROL && BLK && DM_MMC_OPS
|
depends on DM_MMC && OF_CONTROL && BLK
|
||||||
depends on MMC_SDHCI
|
depends on MMC_SDHCI
|
||||||
help
|
help
|
||||||
Support for Arasan SDHCI host controller on Zynq/ZynqMP ARM SoCs platform
|
Support for Arasan SDHCI host controller on Zynq/ZynqMP ARM SoCs platform
|
||||||
|
@ -391,7 +371,7 @@ config MMC_SUNXI
|
||||||
|
|
||||||
config GENERIC_ATMEL_MCI
|
config GENERIC_ATMEL_MCI
|
||||||
bool "Atmel Multimedia Card Interface support"
|
bool "Atmel Multimedia Card Interface support"
|
||||||
depends on DM_MMC && BLK && DM_MMC_OPS && ARCH_AT91
|
depends on DM_MMC && BLK && ARCH_AT91
|
||||||
help
|
help
|
||||||
This enables support for Atmel High Speed Multimedia Card Interface
|
This enables support for Atmel High Speed Multimedia Card Interface
|
||||||
(HSMCI), which supports the MultiMedia Card (MMC) Specification V4.3,
|
(HSMCI), which supports the MultiMedia Card (MMC) Specification V4.3,
|
||||||
|
|
|
@ -184,7 +184,7 @@ static int dwmci_set_transfer_mode(struct dwmci_host *host,
|
||||||
return mode;
|
return mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_DM_MMC_OPS
|
#ifdef CONFIG_DM_MMC
|
||||||
static int dwmci_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
|
static int dwmci_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
|
||||||
struct mmc_data *data)
|
struct mmc_data *data)
|
||||||
{
|
{
|
||||||
|
@ -383,7 +383,7 @@ static int dwmci_setup_bus(struct dwmci_host *host, u32 freq)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_DM_MMC_OPS
|
#ifdef CONFIG_DM_MMC
|
||||||
static int dwmci_set_ios(struct udevice *dev)
|
static int dwmci_set_ios(struct udevice *dev)
|
||||||
{
|
{
|
||||||
struct mmc *mmc = mmc_get_mmc_dev(dev);
|
struct mmc *mmc = mmc_get_mmc_dev(dev);
|
||||||
|
@ -466,7 +466,7 @@ static int dwmci_init(struct mmc *mmc)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_DM_MMC_OPS
|
#ifdef CONFIG_DM_MMC
|
||||||
int dwmci_probe(struct udevice *dev)
|
int dwmci_probe(struct udevice *dev)
|
||||||
{
|
{
|
||||||
struct mmc *mmc = mmc_get_mmc_dev(dev);
|
struct mmc *mmc = mmc_get_mmc_dev(dev);
|
||||||
|
@ -491,7 +491,7 @@ void dwmci_setup_cfg(struct mmc_config *cfg, struct dwmci_host *host,
|
||||||
u32 max_clk, u32 min_clk)
|
u32 max_clk, u32 min_clk)
|
||||||
{
|
{
|
||||||
cfg->name = host->name;
|
cfg->name = host->name;
|
||||||
#ifndef CONFIG_DM_MMC_OPS
|
#ifndef CONFIG_DM_MMC
|
||||||
cfg->ops = &dwmci_ops;
|
cfg->ops = &dwmci_ops;
|
||||||
#endif
|
#endif
|
||||||
cfg->f_min = min_clk;
|
cfg->f_min = min_clk;
|
||||||
|
|
|
@ -81,6 +81,11 @@ struct fsl_esdhc {
|
||||||
uint scr; /* eSDHC control register */
|
uint scr; /* eSDHC control register */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct fsl_esdhc_plat {
|
||||||
|
struct mmc_config cfg;
|
||||||
|
struct mmc mmc;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct fsl_esdhc_priv
|
* struct fsl_esdhc_priv
|
||||||
*
|
*
|
||||||
|
@ -101,8 +106,9 @@ struct fsl_esdhc_priv {
|
||||||
struct fsl_esdhc *esdhc_regs;
|
struct fsl_esdhc *esdhc_regs;
|
||||||
unsigned int sdhc_clk;
|
unsigned int sdhc_clk;
|
||||||
unsigned int bus_width;
|
unsigned int bus_width;
|
||||||
struct mmc_config cfg;
|
#if !CONFIG_IS_ENABLED(BLK)
|
||||||
struct mmc *mmc;
|
struct mmc *mmc;
|
||||||
|
#endif
|
||||||
struct udevice *dev;
|
struct udevice *dev;
|
||||||
int non_removable;
|
int non_removable;
|
||||||
int wp_enable;
|
int wp_enable;
|
||||||
|
@ -156,10 +162,9 @@ static uint esdhc_xfertyp(struct mmc_cmd *cmd, struct mmc_data *data)
|
||||||
/*
|
/*
|
||||||
* PIO Read/Write Mode reduce the performace as DMA is not used in this mode.
|
* PIO Read/Write Mode reduce the performace as DMA is not used in this mode.
|
||||||
*/
|
*/
|
||||||
static void
|
static void esdhc_pio_read_write(struct fsl_esdhc_priv *priv,
|
||||||
esdhc_pio_read_write(struct mmc *mmc, struct mmc_data *data)
|
struct mmc_data *data)
|
||||||
{
|
{
|
||||||
struct fsl_esdhc_priv *priv = mmc->priv;
|
|
||||||
struct fsl_esdhc *regs = priv->esdhc_regs;
|
struct fsl_esdhc *regs = priv->esdhc_regs;
|
||||||
uint blocks;
|
uint blocks;
|
||||||
char *buffer;
|
char *buffer;
|
||||||
|
@ -218,10 +223,10 @@ esdhc_pio_read_write(struct mmc *mmc, struct mmc_data *data)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int esdhc_setup_data(struct mmc *mmc, struct mmc_data *data)
|
static int esdhc_setup_data(struct fsl_esdhc_priv *priv, struct mmc *mmc,
|
||||||
|
struct mmc_data *data)
|
||||||
{
|
{
|
||||||
int timeout;
|
int timeout;
|
||||||
struct fsl_esdhc_priv *priv = mmc->priv;
|
|
||||||
struct fsl_esdhc *regs = priv->esdhc_regs;
|
struct fsl_esdhc *regs = priv->esdhc_regs;
|
||||||
#if defined(CONFIG_FSL_LAYERSCAPE) || defined(CONFIG_S32V234)
|
#if defined(CONFIG_FSL_LAYERSCAPE) || defined(CONFIG_S32V234)
|
||||||
dma_addr_t addr;
|
dma_addr_t addr;
|
||||||
|
@ -349,13 +354,12 @@ static void check_and_invalidate_dcache_range
|
||||||
* Sends a command out on the bus. Takes the mmc pointer,
|
* Sends a command out on the bus. Takes the mmc pointer,
|
||||||
* a command pointer, and an optional data pointer.
|
* a command pointer, and an optional data pointer.
|
||||||
*/
|
*/
|
||||||
static int
|
static int esdhc_send_cmd_common(struct fsl_esdhc_priv *priv, struct mmc *mmc,
|
||||||
esdhc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
|
struct mmc_cmd *cmd, struct mmc_data *data)
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
uint xfertyp;
|
uint xfertyp;
|
||||||
uint irqstat;
|
uint irqstat;
|
||||||
struct fsl_esdhc_priv *priv = mmc->priv;
|
|
||||||
struct fsl_esdhc *regs = priv->esdhc_regs;
|
struct fsl_esdhc *regs = priv->esdhc_regs;
|
||||||
|
|
||||||
#ifdef CONFIG_SYS_FSL_ERRATUM_ESDHC111
|
#ifdef CONFIG_SYS_FSL_ERRATUM_ESDHC111
|
||||||
|
@ -384,7 +388,7 @@ esdhc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
|
||||||
|
|
||||||
/* Set up for a data transfer if we have one */
|
/* Set up for a data transfer if we have one */
|
||||||
if (data) {
|
if (data) {
|
||||||
err = esdhc_setup_data(mmc, data);
|
err = esdhc_setup_data(priv, mmc, data);
|
||||||
if(err)
|
if(err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
@ -470,7 +474,7 @@ esdhc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
|
||||||
/* Wait until all of the blocks are transferred */
|
/* Wait until all of the blocks are transferred */
|
||||||
if (data) {
|
if (data) {
|
||||||
#ifdef CONFIG_SYS_FSL_ESDHC_USE_PIO
|
#ifdef CONFIG_SYS_FSL_ESDHC_USE_PIO
|
||||||
esdhc_pio_read_write(mmc, data);
|
esdhc_pio_read_write(priv, data);
|
||||||
#else
|
#else
|
||||||
do {
|
do {
|
||||||
irqstat = esdhc_read32(®s->irqstat);
|
irqstat = esdhc_read32(®s->irqstat);
|
||||||
|
@ -522,7 +526,7 @@ out:
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_sysctl(struct mmc *mmc, uint clock)
|
static void set_sysctl(struct fsl_esdhc_priv *priv, struct mmc *mmc, uint clock)
|
||||||
{
|
{
|
||||||
int div = 1;
|
int div = 1;
|
||||||
#ifdef ARCH_MXC
|
#ifdef ARCH_MXC
|
||||||
|
@ -531,7 +535,6 @@ static void set_sysctl(struct mmc *mmc, uint clock)
|
||||||
int pre_div = 2;
|
int pre_div = 2;
|
||||||
#endif
|
#endif
|
||||||
int ddr_pre_div = mmc->ddr_mode ? 2 : 1;
|
int ddr_pre_div = mmc->ddr_mode ? 2 : 1;
|
||||||
struct fsl_esdhc_priv *priv = mmc->priv;
|
|
||||||
struct fsl_esdhc *regs = priv->esdhc_regs;
|
struct fsl_esdhc *regs = priv->esdhc_regs;
|
||||||
int sdhc_clk = priv->sdhc_clk;
|
int sdhc_clk = priv->sdhc_clk;
|
||||||
uint clk;
|
uint clk;
|
||||||
|
@ -569,9 +572,8 @@ static void set_sysctl(struct mmc *mmc, uint clock)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
|
#ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
|
||||||
static void esdhc_clock_control(struct mmc *mmc, bool enable)
|
static void esdhc_clock_control(struct fsl_esdhc_priv *priv, bool enable)
|
||||||
{
|
{
|
||||||
struct fsl_esdhc_priv *priv = mmc->priv;
|
|
||||||
struct fsl_esdhc *regs = priv->esdhc_regs;
|
struct fsl_esdhc *regs = priv->esdhc_regs;
|
||||||
u32 value;
|
u32 value;
|
||||||
u32 time_out;
|
u32 time_out;
|
||||||
|
@ -598,19 +600,18 @@ static void esdhc_clock_control(struct mmc *mmc, bool enable)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int esdhc_set_ios(struct mmc *mmc)
|
static int esdhc_set_ios_common(struct fsl_esdhc_priv *priv, struct mmc *mmc)
|
||||||
{
|
{
|
||||||
struct fsl_esdhc_priv *priv = mmc->priv;
|
|
||||||
struct fsl_esdhc *regs = priv->esdhc_regs;
|
struct fsl_esdhc *regs = priv->esdhc_regs;
|
||||||
|
|
||||||
#ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
|
#ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
|
||||||
/* Select to use peripheral clock */
|
/* Select to use peripheral clock */
|
||||||
esdhc_clock_control(mmc, false);
|
esdhc_clock_control(priv, false);
|
||||||
esdhc_setbits32(®s->scr, ESDHCCTL_PCS);
|
esdhc_setbits32(®s->scr, ESDHCCTL_PCS);
|
||||||
esdhc_clock_control(mmc, true);
|
esdhc_clock_control(priv, true);
|
||||||
#endif
|
#endif
|
||||||
/* Set the clock speed */
|
/* Set the clock speed */
|
||||||
set_sysctl(mmc, mmc->clock);
|
set_sysctl(priv, mmc, mmc->clock);
|
||||||
|
|
||||||
/* Set the bus width */
|
/* Set the bus width */
|
||||||
esdhc_clrbits32(®s->proctl, PROCTL_DTW_4 | PROCTL_DTW_8);
|
esdhc_clrbits32(®s->proctl, PROCTL_DTW_4 | PROCTL_DTW_8);
|
||||||
|
@ -623,18 +624,20 @@ static int esdhc_set_ios(struct mmc *mmc)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int esdhc_init(struct mmc *mmc)
|
static int esdhc_init_common(struct fsl_esdhc_priv *priv, struct mmc *mmc)
|
||||||
{
|
{
|
||||||
struct fsl_esdhc_priv *priv = mmc->priv;
|
|
||||||
struct fsl_esdhc *regs = priv->esdhc_regs;
|
struct fsl_esdhc *regs = priv->esdhc_regs;
|
||||||
int timeout = 1000;
|
ulong start;
|
||||||
|
|
||||||
/* Reset the entire host controller */
|
/* Reset the entire host controller */
|
||||||
esdhc_setbits32(®s->sysctl, SYSCTL_RSTA);
|
esdhc_setbits32(®s->sysctl, SYSCTL_RSTA);
|
||||||
|
|
||||||
/* Wait until the controller is available */
|
/* Wait until the controller is available */
|
||||||
while ((esdhc_read32(®s->sysctl) & SYSCTL_RSTA) && --timeout)
|
start = get_timer(0);
|
||||||
udelay(1000);
|
while ((esdhc_read32(®s->sysctl) & SYSCTL_RSTA)) {
|
||||||
|
if (get_timer(start) > 1000)
|
||||||
|
return -ETIMEDOUT;
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_FSL_USDHC)
|
#if defined(CONFIG_FSL_USDHC)
|
||||||
/* RSTA doesn't reset MMC_BOOT register, so manually reset it */
|
/* RSTA doesn't reset MMC_BOOT register, so manually reset it */
|
||||||
|
@ -679,9 +682,8 @@ static int esdhc_init(struct mmc *mmc)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int esdhc_getcd(struct mmc *mmc)
|
static int esdhc_getcd_common(struct fsl_esdhc_priv *priv)
|
||||||
{
|
{
|
||||||
struct fsl_esdhc_priv *priv = mmc->priv;
|
|
||||||
struct fsl_esdhc *regs = priv->esdhc_regs;
|
struct fsl_esdhc *regs = priv->esdhc_regs;
|
||||||
int timeout = 1000;
|
int timeout = 1000;
|
||||||
|
|
||||||
|
@ -690,7 +692,7 @@ static int esdhc_getcd(struct mmc *mmc)
|
||||||
return 1;
|
return 1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_DM_MMC
|
#if CONFIG_IS_ENABLED(DM_MMC)
|
||||||
if (priv->non_removable)
|
if (priv->non_removable)
|
||||||
return 1;
|
return 1;
|
||||||
#ifdef CONFIG_DM_GPIO
|
#ifdef CONFIG_DM_GPIO
|
||||||
|
@ -705,32 +707,70 @@ static int esdhc_getcd(struct mmc *mmc)
|
||||||
return timeout > 0;
|
return timeout > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void esdhc_reset(struct fsl_esdhc *regs)
|
static int esdhc_reset(struct fsl_esdhc *regs)
|
||||||
{
|
{
|
||||||
unsigned long timeout = 100; /* wait max 100 ms */
|
ulong start;
|
||||||
|
|
||||||
/* reset the controller */
|
/* reset the controller */
|
||||||
esdhc_setbits32(®s->sysctl, SYSCTL_RSTA);
|
esdhc_setbits32(®s->sysctl, SYSCTL_RSTA);
|
||||||
|
|
||||||
/* hardware clears the bit when it is done */
|
/* hardware clears the bit when it is done */
|
||||||
while ((esdhc_read32(®s->sysctl) & SYSCTL_RSTA) && --timeout)
|
start = get_timer(0);
|
||||||
udelay(1000);
|
while ((esdhc_read32(®s->sysctl) & SYSCTL_RSTA)) {
|
||||||
if (!timeout)
|
if (get_timer(start) > 100) {
|
||||||
printf("MMC/SD: Reset never completed.\n");
|
printf("MMC/SD: Reset never completed.\n");
|
||||||
|
return -ETIMEDOUT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if !CONFIG_IS_ENABLED(DM_MMC)
|
||||||
|
static int esdhc_getcd(struct mmc *mmc)
|
||||||
|
{
|
||||||
|
struct fsl_esdhc_priv *priv = mmc->priv;
|
||||||
|
|
||||||
|
return esdhc_getcd_common(priv);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int esdhc_init(struct mmc *mmc)
|
||||||
|
{
|
||||||
|
struct fsl_esdhc_priv *priv = mmc->priv;
|
||||||
|
|
||||||
|
return esdhc_init_common(priv, mmc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int esdhc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
|
||||||
|
struct mmc_data *data)
|
||||||
|
{
|
||||||
|
struct fsl_esdhc_priv *priv = mmc->priv;
|
||||||
|
|
||||||
|
return esdhc_send_cmd_common(priv, mmc, cmd, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int esdhc_set_ios(struct mmc *mmc)
|
||||||
|
{
|
||||||
|
struct fsl_esdhc_priv *priv = mmc->priv;
|
||||||
|
|
||||||
|
return esdhc_set_ios_common(priv, mmc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct mmc_ops esdhc_ops = {
|
static const struct mmc_ops esdhc_ops = {
|
||||||
|
.getcd = esdhc_getcd,
|
||||||
|
.init = esdhc_init,
|
||||||
.send_cmd = esdhc_send_cmd,
|
.send_cmd = esdhc_send_cmd,
|
||||||
.set_ios = esdhc_set_ios,
|
.set_ios = esdhc_set_ios,
|
||||||
.init = esdhc_init,
|
|
||||||
.getcd = esdhc_getcd,
|
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
static int fsl_esdhc_init(struct fsl_esdhc_priv *priv)
|
static int fsl_esdhc_init(struct fsl_esdhc_priv *priv,
|
||||||
|
struct fsl_esdhc_plat *plat)
|
||||||
{
|
{
|
||||||
|
struct mmc_config *cfg;
|
||||||
struct fsl_esdhc *regs;
|
struct fsl_esdhc *regs;
|
||||||
struct mmc *mmc;
|
|
||||||
u32 caps, voltage_caps;
|
u32 caps, voltage_caps;
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (!priv)
|
if (!priv)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -738,7 +778,9 @@ static int fsl_esdhc_init(struct fsl_esdhc_priv *priv)
|
||||||
regs = priv->esdhc_regs;
|
regs = priv->esdhc_regs;
|
||||||
|
|
||||||
/* First reset the eSDHC controller */
|
/* First reset the eSDHC controller */
|
||||||
esdhc_reset(regs);
|
ret = esdhc_reset(regs);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
#ifndef CONFIG_FSL_USDHC
|
#ifndef CONFIG_FSL_USDHC
|
||||||
esdhc_setbits32(®s->sysctl, SYSCTL_PEREN | SYSCTL_HCKEN
|
esdhc_setbits32(®s->sysctl, SYSCTL_PEREN | SYSCTL_HCKEN
|
||||||
|
@ -752,7 +794,10 @@ static int fsl_esdhc_init(struct fsl_esdhc_priv *priv)
|
||||||
esdhc_setbits32(®s->vendorspec, ESDHC_VENDORSPEC_VSELECT);
|
esdhc_setbits32(®s->vendorspec, ESDHC_VENDORSPEC_VSELECT);
|
||||||
|
|
||||||
writel(SDHCI_IRQ_EN_BITS, ®s->irqstaten);
|
writel(SDHCI_IRQ_EN_BITS, ®s->irqstaten);
|
||||||
memset(&priv->cfg, 0, sizeof(priv->cfg));
|
cfg = &plat->cfg;
|
||||||
|
#ifndef CONFIG_DM_MMC
|
||||||
|
memset(cfg, '\0', sizeof(*cfg));
|
||||||
|
#endif
|
||||||
|
|
||||||
voltage_caps = 0;
|
voltage_caps = 0;
|
||||||
caps = esdhc_read32(®s->hostcapblt);
|
caps = esdhc_read32(®s->hostcapblt);
|
||||||
|
@ -774,58 +819,54 @@ static int fsl_esdhc_init(struct fsl_esdhc_priv *priv)
|
||||||
if (caps & ESDHC_HOSTCAPBLT_VS33)
|
if (caps & ESDHC_HOSTCAPBLT_VS33)
|
||||||
voltage_caps |= MMC_VDD_32_33 | MMC_VDD_33_34;
|
voltage_caps |= MMC_VDD_32_33 | MMC_VDD_33_34;
|
||||||
|
|
||||||
priv->cfg.name = "FSL_SDHC";
|
cfg->name = "FSL_SDHC";
|
||||||
priv->cfg.ops = &esdhc_ops;
|
#if !CONFIG_IS_ENABLED(DM_MMC)
|
||||||
#ifdef CONFIG_SYS_SD_VOLTAGE
|
cfg->ops = &esdhc_ops;
|
||||||
priv->cfg.voltages = CONFIG_SYS_SD_VOLTAGE;
|
|
||||||
#else
|
|
||||||
priv->cfg.voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
|
|
||||||
#endif
|
#endif
|
||||||
if ((priv->cfg.voltages & voltage_caps) == 0) {
|
#ifdef CONFIG_SYS_SD_VOLTAGE
|
||||||
|
cfg->voltages = CONFIG_SYS_SD_VOLTAGE;
|
||||||
|
#else
|
||||||
|
cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
|
||||||
|
#endif
|
||||||
|
if ((cfg->voltages & voltage_caps) == 0) {
|
||||||
printf("voltage not supported by controller\n");
|
printf("voltage not supported by controller\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (priv->bus_width == 8)
|
if (priv->bus_width == 8)
|
||||||
priv->cfg.host_caps = MMC_MODE_4BIT | MMC_MODE_8BIT;
|
cfg->host_caps = MMC_MODE_4BIT | MMC_MODE_8BIT;
|
||||||
else if (priv->bus_width == 4)
|
else if (priv->bus_width == 4)
|
||||||
priv->cfg.host_caps = MMC_MODE_4BIT;
|
cfg->host_caps = MMC_MODE_4BIT;
|
||||||
|
|
||||||
priv->cfg.host_caps = MMC_MODE_4BIT | MMC_MODE_8BIT;
|
cfg->host_caps = MMC_MODE_4BIT | MMC_MODE_8BIT;
|
||||||
#ifdef CONFIG_SYS_FSL_ESDHC_HAS_DDR_MODE
|
#ifdef CONFIG_SYS_FSL_ESDHC_HAS_DDR_MODE
|
||||||
priv->cfg.host_caps |= MMC_MODE_DDR_52MHz;
|
cfg->host_caps |= MMC_MODE_DDR_52MHz;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (priv->bus_width > 0) {
|
if (priv->bus_width > 0) {
|
||||||
if (priv->bus_width < 8)
|
if (priv->bus_width < 8)
|
||||||
priv->cfg.host_caps &= ~MMC_MODE_8BIT;
|
cfg->host_caps &= ~MMC_MODE_8BIT;
|
||||||
if (priv->bus_width < 4)
|
if (priv->bus_width < 4)
|
||||||
priv->cfg.host_caps &= ~MMC_MODE_4BIT;
|
cfg->host_caps &= ~MMC_MODE_4BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (caps & ESDHC_HOSTCAPBLT_HSS)
|
if (caps & ESDHC_HOSTCAPBLT_HSS)
|
||||||
priv->cfg.host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
|
cfg->host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
|
||||||
|
|
||||||
#ifdef CONFIG_ESDHC_DETECT_8_BIT_QUIRK
|
#ifdef CONFIG_ESDHC_DETECT_8_BIT_QUIRK
|
||||||
if (CONFIG_ESDHC_DETECT_8_BIT_QUIRK)
|
if (CONFIG_ESDHC_DETECT_8_BIT_QUIRK)
|
||||||
priv->cfg.host_caps &= ~MMC_MODE_8BIT;
|
cfg->host_caps &= ~MMC_MODE_8BIT;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
priv->cfg.f_min = 400000;
|
cfg->f_min = 400000;
|
||||||
priv->cfg.f_max = min(priv->sdhc_clk, (u32)52000000);
|
cfg->f_max = min(priv->sdhc_clk, (u32)52000000);
|
||||||
|
|
||||||
priv->cfg.b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
|
cfg->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
|
||||||
|
|
||||||
mmc = mmc_create(&priv->cfg, priv);
|
|
||||||
if (mmc == NULL)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
priv->mmc = mmc;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_DM_MMC
|
#if !CONFIG_IS_ENABLED(DM_MMC)
|
||||||
static int fsl_esdhc_cfg_to_priv(struct fsl_esdhc_cfg *cfg,
|
static int fsl_esdhc_cfg_to_priv(struct fsl_esdhc_cfg *cfg,
|
||||||
struct fsl_esdhc_priv *priv)
|
struct fsl_esdhc_priv *priv)
|
||||||
{
|
{
|
||||||
|
@ -843,7 +884,9 @@ static int fsl_esdhc_cfg_to_priv(struct fsl_esdhc_cfg *cfg,
|
||||||
|
|
||||||
int fsl_esdhc_initialize(bd_t *bis, struct fsl_esdhc_cfg *cfg)
|
int fsl_esdhc_initialize(bd_t *bis, struct fsl_esdhc_cfg *cfg)
|
||||||
{
|
{
|
||||||
|
struct fsl_esdhc_plat *plat;
|
||||||
struct fsl_esdhc_priv *priv;
|
struct fsl_esdhc_priv *priv;
|
||||||
|
struct mmc *mmc;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!cfg)
|
if (!cfg)
|
||||||
|
@ -852,21 +895,34 @@ int fsl_esdhc_initialize(bd_t *bis, struct fsl_esdhc_cfg *cfg)
|
||||||
priv = calloc(sizeof(struct fsl_esdhc_priv), 1);
|
priv = calloc(sizeof(struct fsl_esdhc_priv), 1);
|
||||||
if (!priv)
|
if (!priv)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
plat = calloc(sizeof(struct fsl_esdhc_plat), 1);
|
||||||
|
if (!plat) {
|
||||||
|
free(priv);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
ret = fsl_esdhc_cfg_to_priv(cfg, priv);
|
ret = fsl_esdhc_cfg_to_priv(cfg, priv);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
debug("%s xlate failure\n", __func__);
|
debug("%s xlate failure\n", __func__);
|
||||||
|
free(plat);
|
||||||
free(priv);
|
free(priv);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = fsl_esdhc_init(priv);
|
ret = fsl_esdhc_init(priv, plat);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
debug("%s init failure\n", __func__);
|
debug("%s init failure\n", __func__);
|
||||||
|
free(plat);
|
||||||
free(priv);
|
free(priv);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mmc = mmc_create(&plat->cfg, priv);
|
||||||
|
if (!mmc)
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
|
priv->mmc = mmc;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -954,7 +1010,7 @@ void fdt_fixup_esdhc(void *blob, bd_t *bd)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_DM_MMC
|
#if CONFIG_IS_ENABLED(DM_MMC)
|
||||||
#include <asm/arch/clock.h>
|
#include <asm/arch/clock.h>
|
||||||
__weak void init_clk_usdhc(u32 index)
|
__weak void init_clk_usdhc(u32 index)
|
||||||
{
|
{
|
||||||
|
@ -963,24 +1019,24 @@ __weak void init_clk_usdhc(u32 index)
|
||||||
static int fsl_esdhc_probe(struct udevice *dev)
|
static int fsl_esdhc_probe(struct udevice *dev)
|
||||||
{
|
{
|
||||||
struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
|
struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
|
||||||
|
struct fsl_esdhc_plat *plat = dev_get_platdata(dev);
|
||||||
struct fsl_esdhc_priv *priv = dev_get_priv(dev);
|
struct fsl_esdhc_priv *priv = dev_get_priv(dev);
|
||||||
const void *fdt = gd->fdt_blob;
|
|
||||||
int node = dev_of_offset(dev);
|
|
||||||
#ifdef CONFIG_DM_REGULATOR
|
#ifdef CONFIG_DM_REGULATOR
|
||||||
struct udevice *vqmmc_dev;
|
struct udevice *vqmmc_dev;
|
||||||
#endif
|
#endif
|
||||||
fdt_addr_t addr;
|
fdt_addr_t addr;
|
||||||
unsigned int val;
|
unsigned int val;
|
||||||
|
struct mmc *mmc;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
addr = devfdt_get_addr(dev);
|
addr = dev_read_addr(dev);
|
||||||
if (addr == FDT_ADDR_T_NONE)
|
if (addr == FDT_ADDR_T_NONE)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
priv->esdhc_regs = (struct fsl_esdhc *)addr;
|
priv->esdhc_regs = (struct fsl_esdhc *)addr;
|
||||||
priv->dev = dev;
|
priv->dev = dev;
|
||||||
|
|
||||||
val = fdtdec_get_int(fdt, node, "bus-width", -1);
|
val = dev_read_u32_default(dev, "bus-width", -1);
|
||||||
if (val == 8)
|
if (val == 8)
|
||||||
priv->bus_width = 8;
|
priv->bus_width = 8;
|
||||||
else if (val == 4)
|
else if (val == 4)
|
||||||
|
@ -988,21 +1044,21 @@ static int fsl_esdhc_probe(struct udevice *dev)
|
||||||
else
|
else
|
||||||
priv->bus_width = 1;
|
priv->bus_width = 1;
|
||||||
|
|
||||||
if (fdt_get_property(fdt, node, "non-removable", NULL)) {
|
if (dev_read_bool(dev, "non-removable")) {
|
||||||
priv->non_removable = 1;
|
priv->non_removable = 1;
|
||||||
} else {
|
} else {
|
||||||
priv->non_removable = 0;
|
priv->non_removable = 0;
|
||||||
#ifdef CONFIG_DM_GPIO
|
#ifdef CONFIG_DM_GPIO
|
||||||
gpio_request_by_name_nodev(offset_to_ofnode(node), "cd-gpios",
|
gpio_request_by_name(dev, "cd-gpios", 0, &priv->cd_gpio,
|
||||||
0, &priv->cd_gpio, GPIOD_IS_IN);
|
GPIOD_IS_IN);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
priv->wp_enable = 1;
|
priv->wp_enable = 1;
|
||||||
|
|
||||||
#ifdef CONFIG_DM_GPIO
|
#ifdef CONFIG_DM_GPIO
|
||||||
ret = gpio_request_by_name_nodev(offset_to_ofnode(node), "wp-gpios", 0,
|
ret = gpio_request_by_name(dev, "wp-gpios", 0, &priv->wp_gpio,
|
||||||
&priv->wp_gpio, GPIOD_IS_IN);
|
GPIOD_IS_IN);
|
||||||
if (ret)
|
if (ret)
|
||||||
priv->wp_enable = 0;
|
priv->wp_enable = 0;
|
||||||
#endif
|
#endif
|
||||||
|
@ -1057,18 +1113,53 @@ static int fsl_esdhc_probe(struct udevice *dev)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = fsl_esdhc_init(priv);
|
ret = fsl_esdhc_init(priv, plat);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(dev, "fsl_esdhc_init failure\n");
|
dev_err(dev, "fsl_esdhc_init failure\n");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
upriv->mmc = priv->mmc;
|
mmc = &plat->mmc;
|
||||||
priv->mmc->dev = dev;
|
mmc->cfg = &plat->cfg;
|
||||||
|
mmc->dev = dev;
|
||||||
|
upriv->mmc = mmc;
|
||||||
|
|
||||||
return 0;
|
return esdhc_init_common(priv, mmc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if CONFIG_IS_ENABLED(DM_MMC)
|
||||||
|
static int fsl_esdhc_get_cd(struct udevice *dev)
|
||||||
|
{
|
||||||
|
struct fsl_esdhc_priv *priv = dev_get_priv(dev);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
return esdhc_getcd_common(priv);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int fsl_esdhc_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
|
||||||
|
struct mmc_data *data)
|
||||||
|
{
|
||||||
|
struct fsl_esdhc_plat *plat = dev_get_platdata(dev);
|
||||||
|
struct fsl_esdhc_priv *priv = dev_get_priv(dev);
|
||||||
|
|
||||||
|
return esdhc_send_cmd_common(priv, &plat->mmc, cmd, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int fsl_esdhc_set_ios(struct udevice *dev)
|
||||||
|
{
|
||||||
|
struct fsl_esdhc_plat *plat = dev_get_platdata(dev);
|
||||||
|
struct fsl_esdhc_priv *priv = dev_get_priv(dev);
|
||||||
|
|
||||||
|
return esdhc_set_ios_common(priv, &plat->mmc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct dm_mmc_ops fsl_esdhc_ops = {
|
||||||
|
.get_cd = fsl_esdhc_get_cd,
|
||||||
|
.send_cmd = fsl_esdhc_send_cmd,
|
||||||
|
.set_ios = fsl_esdhc_set_ios,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
static const struct udevice_id fsl_esdhc_ids[] = {
|
static const struct udevice_id fsl_esdhc_ids[] = {
|
||||||
{ .compatible = "fsl,imx6ul-usdhc", },
|
{ .compatible = "fsl,imx6ul-usdhc", },
|
||||||
{ .compatible = "fsl,imx6sx-usdhc", },
|
{ .compatible = "fsl,imx6sx-usdhc", },
|
||||||
|
@ -1080,11 +1171,25 @@ static const struct udevice_id fsl_esdhc_ids[] = {
|
||||||
{ /* sentinel */ }
|
{ /* sentinel */ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if CONFIG_IS_ENABLED(BLK)
|
||||||
|
static int fsl_esdhc_bind(struct udevice *dev)
|
||||||
|
{
|
||||||
|
struct fsl_esdhc_plat *plat = dev_get_platdata(dev);
|
||||||
|
|
||||||
|
return mmc_bind(dev, &plat->mmc, &plat->cfg);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
U_BOOT_DRIVER(fsl_esdhc) = {
|
U_BOOT_DRIVER(fsl_esdhc) = {
|
||||||
.name = "fsl-esdhc-mmc",
|
.name = "fsl-esdhc-mmc",
|
||||||
.id = UCLASS_MMC,
|
.id = UCLASS_MMC,
|
||||||
.of_match = fsl_esdhc_ids,
|
.of_match = fsl_esdhc_ids,
|
||||||
|
.ops = &fsl_esdhc_ops,
|
||||||
|
#if CONFIG_IS_ENABLED(BLK)
|
||||||
|
.bind = fsl_esdhc_bind,
|
||||||
|
#endif
|
||||||
.probe = fsl_esdhc_probe,
|
.probe = fsl_esdhc_probe,
|
||||||
|
.platdata_auto_alloc_size = sizeof(struct fsl_esdhc_plat),
|
||||||
.priv_auto_alloc_size = sizeof(struct fsl_esdhc_priv),
|
.priv_auto_alloc_size = sizeof(struct fsl_esdhc_priv),
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -36,13 +36,22 @@ DECLARE_GLOBAL_DATA_PTR;
|
||||||
# define MCI_BUS 0
|
# define MCI_BUS 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct atmel_mci_priv {
|
#ifdef CONFIG_DM_MMC
|
||||||
|
struct atmel_mci_plat {
|
||||||
|
struct mmc mmc;
|
||||||
struct mmc_config cfg;
|
struct mmc_config cfg;
|
||||||
struct atmel_mci *mci;
|
struct atmel_mci *mci;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct atmel_mci_priv {
|
||||||
|
#ifndef CONFIG_DM_MMC
|
||||||
|
struct mmc_config cfg;
|
||||||
|
struct atmel_mci *mci;
|
||||||
|
#endif
|
||||||
unsigned int initialized:1;
|
unsigned int initialized:1;
|
||||||
unsigned int curr_clk;
|
unsigned int curr_clk;
|
||||||
#ifdef CONFIG_DM_MMC
|
#ifdef CONFIG_DM_MMC
|
||||||
struct mmc mmc;
|
|
||||||
ulong bus_clk_rate;
|
ulong bus_clk_rate;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
@ -67,18 +76,21 @@ static void dump_cmd(u32 cmdr, u32 arg, u32 status, const char* msg)
|
||||||
|
|
||||||
/* Setup for MCI Clock and Block Size */
|
/* Setup for MCI Clock and Block Size */
|
||||||
#ifdef CONFIG_DM_MMC
|
#ifdef CONFIG_DM_MMC
|
||||||
static void mci_set_mode(struct atmel_mci_priv *priv, u32 hz, u32 blklen)
|
static void mci_set_mode(struct udevice *dev, u32 hz, u32 blklen)
|
||||||
{
|
{
|
||||||
struct mmc *mmc = &priv->mmc;
|
struct atmel_mci_plat *plat = dev_get_platdata(dev);
|
||||||
|
struct atmel_mci_priv *priv = dev_get_priv(dev);
|
||||||
|
struct mmc *mmc = &plat->mmc;
|
||||||
u32 bus_hz = priv->bus_clk_rate;
|
u32 bus_hz = priv->bus_clk_rate;
|
||||||
|
atmel_mci_t *mci = plat->mci;
|
||||||
#else
|
#else
|
||||||
static void mci_set_mode(struct mmc *mmc, u32 hz, u32 blklen)
|
static void mci_set_mode(struct mmc *mmc, u32 hz, u32 blklen)
|
||||||
{
|
{
|
||||||
struct atmel_mci_priv *priv = mmc->priv;
|
struct atmel_mci_priv *priv = mmc->priv;
|
||||||
u32 bus_hz = get_mci_clk_rate();
|
u32 bus_hz = get_mci_clk_rate();
|
||||||
|
atmel_mci_t *mci = priv->mci;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
atmel_mci_t *mci = priv->mci;
|
|
||||||
u32 clkdiv = 255;
|
u32 clkdiv = 255;
|
||||||
unsigned int version = atmel_mci_get_version(mci);
|
unsigned int version = atmel_mci_get_version(mci);
|
||||||
u32 clkodd = 0;
|
u32 clkodd = 0;
|
||||||
|
@ -222,15 +234,17 @@ io_fail:
|
||||||
static int atmel_mci_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
|
static int atmel_mci_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
|
||||||
struct mmc_data *data)
|
struct mmc_data *data)
|
||||||
{
|
{
|
||||||
|
struct atmel_mci_plat *plat = dev_get_platdata(dev);
|
||||||
struct atmel_mci_priv *priv = dev_get_priv(dev);
|
struct atmel_mci_priv *priv = dev_get_priv(dev);
|
||||||
struct mmc *mmc = mmc_get_mmc_dev(dev);
|
struct mmc *mmc = mmc_get_mmc_dev(dev);
|
||||||
|
atmel_mci_t *mci = plat->mci;
|
||||||
#else
|
#else
|
||||||
static int
|
static int
|
||||||
mci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
|
mci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
|
||||||
{
|
{
|
||||||
struct atmel_mci_priv *priv = mmc->priv;
|
struct atmel_mci_priv *priv = mmc->priv;
|
||||||
#endif
|
|
||||||
atmel_mci_t *mci = priv->mci;
|
atmel_mci_t *mci = priv->mci;
|
||||||
|
#endif
|
||||||
u32 cmdr;
|
u32 cmdr;
|
||||||
u32 error_flags = 0;
|
u32 error_flags = 0;
|
||||||
u32 status;
|
u32 status;
|
||||||
|
@ -362,22 +376,23 @@ mci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
|
||||||
#ifdef CONFIG_DM_MMC
|
#ifdef CONFIG_DM_MMC
|
||||||
static int atmel_mci_set_ios(struct udevice *dev)
|
static int atmel_mci_set_ios(struct udevice *dev)
|
||||||
{
|
{
|
||||||
struct atmel_mci_priv *priv = dev_get_priv(dev);
|
struct atmel_mci_plat *plat = dev_get_platdata(dev);
|
||||||
struct mmc *mmc = mmc_get_mmc_dev(dev);
|
struct mmc *mmc = mmc_get_mmc_dev(dev);
|
||||||
|
atmel_mci_t *mci = plat->mci;
|
||||||
#else
|
#else
|
||||||
/* Entered into mmc structure during driver init */
|
/* Entered into mmc structure during driver init */
|
||||||
static int mci_set_ios(struct mmc *mmc)
|
static int mci_set_ios(struct mmc *mmc)
|
||||||
{
|
{
|
||||||
struct atmel_mci_priv *priv = mmc->priv;
|
struct atmel_mci_priv *priv = mmc->priv;
|
||||||
#endif
|
|
||||||
atmel_mci_t *mci = priv->mci;
|
atmel_mci_t *mci = priv->mci;
|
||||||
|
#endif
|
||||||
int bus_width = mmc->bus_width;
|
int bus_width = mmc->bus_width;
|
||||||
unsigned int version = atmel_mci_get_version(mci);
|
unsigned int version = atmel_mci_get_version(mci);
|
||||||
int busw;
|
int busw;
|
||||||
|
|
||||||
/* Set the clock speed */
|
/* Set the clock speed */
|
||||||
#ifdef CONFIG_DM_MMC
|
#ifdef CONFIG_DM_MMC
|
||||||
mci_set_mode(priv, mmc->clock, MMC_DEFAULT_BLKLEN);
|
mci_set_mode(dev, mmc->clock, MMC_DEFAULT_BLKLEN);
|
||||||
#else
|
#else
|
||||||
mci_set_mode(mmc, mmc->clock, MMC_DEFAULT_BLKLEN);
|
mci_set_mode(mmc, mmc->clock, MMC_DEFAULT_BLKLEN);
|
||||||
#endif
|
#endif
|
||||||
|
@ -410,15 +425,17 @@ static int mci_set_ios(struct mmc *mmc)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_DM_MMC
|
#ifdef CONFIG_DM_MMC
|
||||||
static int atmel_mci_hw_init(struct atmel_mci_priv *priv)
|
static int atmel_mci_hw_init(struct udevice *dev)
|
||||||
{
|
{
|
||||||
|
struct atmel_mci_plat *plat = dev_get_platdata(dev);
|
||||||
|
atmel_mci_t *mci = plat->mci;
|
||||||
#else
|
#else
|
||||||
/* Entered into mmc structure during driver init */
|
/* Entered into mmc structure during driver init */
|
||||||
static int mci_init(struct mmc *mmc)
|
static int mci_init(struct mmc *mmc)
|
||||||
{
|
{
|
||||||
struct atmel_mci_priv *priv = mmc->priv;
|
struct atmel_mci_priv *priv = mmc->priv;
|
||||||
#endif
|
|
||||||
atmel_mci_t *mci = priv->mci;
|
atmel_mci_t *mci = priv->mci;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Initialize controller */
|
/* Initialize controller */
|
||||||
writel(MMCI_BIT(SWRST), &mci->cr); /* soft reset */
|
writel(MMCI_BIT(SWRST), &mci->cr); /* soft reset */
|
||||||
|
@ -433,7 +450,7 @@ static int mci_init(struct mmc *mmc)
|
||||||
|
|
||||||
/* Set default clocks and blocklen */
|
/* Set default clocks and blocklen */
|
||||||
#ifdef CONFIG_DM_MMC
|
#ifdef CONFIG_DM_MMC
|
||||||
mci_set_mode(priv, CONFIG_SYS_MMC_CLK_OD, MMC_DEFAULT_BLKLEN);
|
mci_set_mode(dev, CONFIG_SYS_MMC_CLK_OD, MMC_DEFAULT_BLKLEN);
|
||||||
#else
|
#else
|
||||||
mci_set_mode(mmc, CONFIG_SYS_MMC_CLK_OD, MMC_DEFAULT_BLKLEN);
|
mci_set_mode(mmc, CONFIG_SYS_MMC_CLK_OD, MMC_DEFAULT_BLKLEN);
|
||||||
#endif
|
#endif
|
||||||
|
@ -509,12 +526,14 @@ static const struct dm_mmc_ops atmel_mci_mmc_ops = {
|
||||||
.set_ios = atmel_mci_set_ios,
|
.set_ios = atmel_mci_set_ios,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void atmel_mci_setup_cfg(struct atmel_mci_priv *priv)
|
static void atmel_mci_setup_cfg(struct udevice *dev)
|
||||||
{
|
{
|
||||||
|
struct atmel_mci_plat *plat = dev_get_platdata(dev);
|
||||||
|
struct atmel_mci_priv *priv = dev_get_priv(dev);
|
||||||
struct mmc_config *cfg;
|
struct mmc_config *cfg;
|
||||||
u32 version;
|
u32 version;
|
||||||
|
|
||||||
cfg = &priv->cfg;
|
cfg = &plat->cfg;
|
||||||
cfg->name = "Atmel mci";
|
cfg->name = "Atmel mci";
|
||||||
cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
|
cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
|
||||||
|
|
||||||
|
@ -522,7 +541,7 @@ static void atmel_mci_setup_cfg(struct atmel_mci_priv *priv)
|
||||||
* If the version is above 3.0, the capabilities of the 8-bit
|
* If the version is above 3.0, the capabilities of the 8-bit
|
||||||
* bus width and high speed are supported.
|
* bus width and high speed are supported.
|
||||||
*/
|
*/
|
||||||
version = atmel_mci_get_version(priv->mci);
|
version = atmel_mci_get_version(plat->mci);
|
||||||
if ((version & 0xf00) >= 0x300) {
|
if ((version & 0xf00) >= 0x300) {
|
||||||
cfg->host_caps = MMC_MODE_8BIT |
|
cfg->host_caps = MMC_MODE_8BIT |
|
||||||
MMC_MODE_HS | MMC_MODE_HS_52MHz;
|
MMC_MODE_HS | MMC_MODE_HS_52MHz;
|
||||||
|
@ -568,7 +587,7 @@ failed:
|
||||||
static int atmel_mci_probe(struct udevice *dev)
|
static int atmel_mci_probe(struct udevice *dev)
|
||||||
{
|
{
|
||||||
struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
|
struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
|
||||||
struct atmel_mci_priv *priv = dev_get_priv(dev);
|
struct atmel_mci_plat *plat = dev_get_platdata(dev);
|
||||||
struct mmc *mmc;
|
struct mmc *mmc;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -576,25 +595,25 @@ static int atmel_mci_probe(struct udevice *dev)
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
priv->mci = (struct atmel_mci *)devfdt_get_addr_ptr(dev);
|
plat->mci = (struct atmel_mci *)devfdt_get_addr_ptr(dev);
|
||||||
|
|
||||||
atmel_mci_setup_cfg(priv);
|
atmel_mci_setup_cfg(dev);
|
||||||
|
|
||||||
mmc = &priv->mmc;
|
mmc = &plat->mmc;
|
||||||
mmc->cfg = &priv->cfg;
|
mmc->cfg = &plat->cfg;
|
||||||
mmc->dev = dev;
|
mmc->dev = dev;
|
||||||
upriv->mmc = mmc;
|
upriv->mmc = mmc;
|
||||||
|
|
||||||
atmel_mci_hw_init(priv);
|
atmel_mci_hw_init(dev);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int atmel_mci_bind(struct udevice *dev)
|
static int atmel_mci_bind(struct udevice *dev)
|
||||||
{
|
{
|
||||||
struct atmel_mci_priv *priv = dev_get_priv(dev);
|
struct atmel_mci_plat *plat = dev_get_platdata(dev);
|
||||||
|
|
||||||
return mmc_bind(dev, &priv->mmc, &priv->cfg);
|
return mmc_bind(dev, &plat->mmc, &plat->cfg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct udevice_id atmel_mci_ids[] = {
|
static const struct udevice_id atmel_mci_ids[] = {
|
||||||
|
@ -608,6 +627,7 @@ U_BOOT_DRIVER(atmel_mci) = {
|
||||||
.of_match = atmel_mci_ids,
|
.of_match = atmel_mci_ids,
|
||||||
.bind = atmel_mci_bind,
|
.bind = atmel_mci_bind,
|
||||||
.probe = atmel_mci_probe,
|
.probe = atmel_mci_probe,
|
||||||
|
.platdata_auto_alloc_size = sizeof(struct atmel_mci_plat),
|
||||||
.priv_auto_alloc_size = sizeof(struct atmel_mci_priv),
|
.priv_auto_alloc_size = sizeof(struct atmel_mci_priv),
|
||||||
.ops = &atmel_mci_mmc_ops,
|
.ops = &atmel_mci_mmc_ops,
|
||||||
};
|
};
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
#if CONFIG_IS_ENABLED(DM_MMC_OPS)
|
|
||||||
int dm_mmc_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
|
int dm_mmc_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
|
||||||
struct mmc_data *data)
|
struct mmc_data *data)
|
||||||
{
|
{
|
||||||
|
@ -79,7 +78,6 @@ int mmc_getcd(struct mmc *mmc)
|
||||||
{
|
{
|
||||||
return dm_mmc_get_cd(mmc->dev);
|
return dm_mmc_get_cd(mmc->dev);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
struct mmc *mmc_get_mmc_dev(struct udevice *dev)
|
struct mmc *mmc_get_mmc_dev(struct udevice *dev)
|
||||||
{
|
{
|
||||||
|
@ -198,10 +196,8 @@ int mmc_bind(struct udevice *dev, struct mmc *mmc, const struct mmc_config *cfg)
|
||||||
struct udevice *bdev;
|
struct udevice *bdev;
|
||||||
int ret, devnum = -1;
|
int ret, devnum = -1;
|
||||||
|
|
||||||
#if CONFIG_IS_ENABLED(DM_MMC_OPS)
|
|
||||||
if (!mmc_get_ops(dev))
|
if (!mmc_get_ops(dev))
|
||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
#endif
|
|
||||||
#ifndef CONFIG_SPL_BUILD
|
#ifndef CONFIG_SPL_BUILD
|
||||||
/* Use the fixed index with aliase node's index */
|
/* Use the fixed index with aliase node's index */
|
||||||
ret = dev_read_alias_seq(dev, &devnum);
|
ret = dev_read_alias_seq(dev, &devnum);
|
||||||
|
|
|
@ -53,7 +53,7 @@ struct blk_desc *mmc_get_blk_desc(struct mmc *mmc)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !CONFIG_IS_ENABLED(DM_MMC_OPS)
|
#if !CONFIG_IS_ENABLED(DM_MMC)
|
||||||
__weak int board_mmc_getwp(struct mmc *mmc)
|
__weak int board_mmc_getwp(struct mmc *mmc)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -149,7 +149,7 @@ void mmc_trace_state(struct mmc *mmc, struct mmc_cmd *cmd)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !CONFIG_IS_ENABLED(DM_MMC_OPS)
|
#if !CONFIG_IS_ENABLED(DM_MMC)
|
||||||
int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
|
int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -839,7 +839,7 @@ int mmc_hwpart_config(struct mmc *mmc,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !CONFIG_IS_ENABLED(DM_MMC_OPS)
|
#if !CONFIG_IS_ENABLED(DM_MMC)
|
||||||
int mmc_getcd(struct mmc *mmc)
|
int mmc_getcd(struct mmc *mmc)
|
||||||
{
|
{
|
||||||
int cd;
|
int cd;
|
||||||
|
@ -1075,7 +1075,7 @@ static const u8 multipliers[] = {
|
||||||
80,
|
80,
|
||||||
};
|
};
|
||||||
|
|
||||||
#if !CONFIG_IS_ENABLED(DM_MMC_OPS)
|
#if !CONFIG_IS_ENABLED(DM_MMC)
|
||||||
static void mmc_set_ios(struct mmc *mmc)
|
static void mmc_set_ios(struct mmc *mmc)
|
||||||
{
|
{
|
||||||
if (mmc->cfg->ops->set_ios)
|
if (mmc->cfg->ops->set_ios)
|
||||||
|
@ -1652,7 +1652,7 @@ int mmc_start_init(struct mmc *mmc)
|
||||||
|
|
||||||
/* we pretend there's no card when init is NULL */
|
/* we pretend there's no card when init is NULL */
|
||||||
no_card = mmc_getcd(mmc) == 0;
|
no_card = mmc_getcd(mmc) == 0;
|
||||||
#if !CONFIG_IS_ENABLED(DM_MMC_OPS)
|
#if !CONFIG_IS_ENABLED(DM_MMC)
|
||||||
no_card = no_card || (mmc->cfg->ops->init == NULL);
|
no_card = no_card || (mmc->cfg->ops->init == NULL);
|
||||||
#endif
|
#endif
|
||||||
if (no_card) {
|
if (no_card) {
|
||||||
|
@ -1673,7 +1673,7 @@ int mmc_start_init(struct mmc *mmc)
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
#if CONFIG_IS_ENABLED(DM_MMC_OPS)
|
#if CONFIG_IS_ENABLED(DM_MMC)
|
||||||
/* The device has already been probed ready for use */
|
/* The device has already been probed ready for use */
|
||||||
#else
|
#else
|
||||||
/* made sure it's not NULL earlier */
|
/* made sure it's not NULL earlier */
|
||||||
|
|
|
@ -100,10 +100,19 @@ int mmc_set_boot_bus_width(struct mmc *mmc, u8 width, u8 reset, u8 mode)
|
||||||
*/
|
*/
|
||||||
int mmc_set_part_conf(struct mmc *mmc, u8 ack, u8 part_num, u8 access)
|
int mmc_set_part_conf(struct mmc *mmc, u8 ack, u8 part_num, u8 access)
|
||||||
{
|
{
|
||||||
return mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
|
int ret;
|
||||||
EXT_CSD_BOOT_ACK(ack) |
|
u8 part_conf;
|
||||||
EXT_CSD_BOOT_PART_NUM(part_num) |
|
|
||||||
EXT_CSD_PARTITION_ACCESS(access));
|
part_conf = EXT_CSD_BOOT_ACK(ack) |
|
||||||
|
EXT_CSD_BOOT_PART_NUM(part_num) |
|
||||||
|
EXT_CSD_PARTITION_ACCESS(access);
|
||||||
|
|
||||||
|
ret = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
|
||||||
|
part_conf);
|
||||||
|
if (!ret)
|
||||||
|
mmc->part_config = part_conf;
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -150,7 +150,7 @@ struct mmc *mmc_create(const struct mmc_config *cfg, void *priv)
|
||||||
cfg->f_max == 0 || cfg->b_max == 0)
|
cfg->f_max == 0 || cfg->b_max == 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
#if !CONFIG_IS_ENABLED(DM_MMC_OPS)
|
#if !CONFIG_IS_ENABLED(DM_MMC)
|
||||||
if (cfg->ops == NULL || cfg->ops->send_cmd == NULL)
|
if (cfg->ops == NULL || cfg->ops->send_cmd == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -64,12 +64,7 @@ U_BOOT_DRIVER(pci_mmc) = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct pci_device_id mmc_supported[] = {
|
static struct pci_device_id mmc_supported[] = {
|
||||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BYT_SDIO) },
|
{ PCI_DEVICE_CLASS(PCI_CLASS_SYSTEM_SDHCI << 8, 0xffff00) },
|
||||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BYT_SD) },
|
|
||||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BYT_EMMC2) },
|
|
||||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_QRK_SDIO) },
|
|
||||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_TCF_SDIO_0) },
|
|
||||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_TCF_SDIO_1) },
|
|
||||||
{},
|
{},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -134,7 +134,7 @@ static int sdhci_transfer_data(struct sdhci_host *host, struct mmc_data *data,
|
||||||
#define SDHCI_CMD_DEFAULT_TIMEOUT 100
|
#define SDHCI_CMD_DEFAULT_TIMEOUT 100
|
||||||
#define SDHCI_READ_STATUS_TIMEOUT 1000
|
#define SDHCI_READ_STATUS_TIMEOUT 1000
|
||||||
|
|
||||||
#ifdef CONFIG_DM_MMC_OPS
|
#ifdef CONFIG_DM_MMC
|
||||||
static int sdhci_send_command(struct udevice *dev, struct mmc_cmd *cmd,
|
static int sdhci_send_command(struct udevice *dev, struct mmc_cmd *cmd,
|
||||||
struct mmc_data *data)
|
struct mmc_data *data)
|
||||||
{
|
{
|
||||||
|
@ -422,7 +422,7 @@ static void sdhci_set_power(struct sdhci_host *host, unsigned short power)
|
||||||
sdhci_writeb(host, pwr, SDHCI_POWER_CONTROL);
|
sdhci_writeb(host, pwr, SDHCI_POWER_CONTROL);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_DM_MMC_OPS
|
#ifdef CONFIG_DM_MMC
|
||||||
static int sdhci_set_ios(struct udevice *dev)
|
static int sdhci_set_ios(struct udevice *dev)
|
||||||
{
|
{
|
||||||
struct mmc *mmc = mmc_get_mmc_dev(dev);
|
struct mmc *mmc = mmc_get_mmc_dev(dev);
|
||||||
|
@ -502,7 +502,7 @@ static int sdhci_init(struct mmc *mmc)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_DM_MMC_OPS
|
#ifdef CONFIG_DM_MMC
|
||||||
int sdhci_probe(struct udevice *dev)
|
int sdhci_probe(struct udevice *dev)
|
||||||
{
|
{
|
||||||
struct mmc *mmc = mmc_get_mmc_dev(dev);
|
struct mmc *mmc = mmc_get_mmc_dev(dev);
|
||||||
|
@ -543,7 +543,7 @@ int sdhci_setup_cfg(struct mmc_config *cfg, struct sdhci_host *host,
|
||||||
host->version = sdhci_readw(host, SDHCI_HOST_VERSION);
|
host->version = sdhci_readw(host, SDHCI_HOST_VERSION);
|
||||||
|
|
||||||
cfg->name = host->name;
|
cfg->name = host->name;
|
||||||
#ifndef CONFIG_DM_MMC_OPS
|
#ifndef CONFIG_DM_MMC
|
||||||
cfg->ops = &sdhci_ops;
|
cfg->ops = &sdhci_ops;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -13,21 +13,26 @@
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <mmc.h>
|
#include <mmc.h>
|
||||||
|
#include <dm.h>
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <asm/io.h>
|
#include <linux/compat.h>
|
||||||
|
#include <linux/io.h>
|
||||||
|
#include <linux/sizes.h>
|
||||||
#include <asm/arch/rmobile.h>
|
#include <asm/arch/rmobile.h>
|
||||||
#include <asm/arch/sh_sdhi.h>
|
#include <asm/arch/sh_sdhi.h>
|
||||||
|
#include <clk.h>
|
||||||
|
|
||||||
#define DRIVER_NAME "sh-sdhi"
|
#define DRIVER_NAME "sh-sdhi"
|
||||||
|
|
||||||
struct sh_sdhi_host {
|
struct sh_sdhi_host {
|
||||||
unsigned long addr;
|
void __iomem *addr;
|
||||||
int ch;
|
int ch;
|
||||||
int bus_shift;
|
int bus_shift;
|
||||||
unsigned long quirks;
|
unsigned long quirks;
|
||||||
unsigned char wait_int;
|
unsigned char wait_int;
|
||||||
unsigned char sd_error;
|
unsigned char sd_error;
|
||||||
unsigned char detect_waiting;
|
unsigned char detect_waiting;
|
||||||
|
unsigned char app_cmd;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline void sh_sdhi_writeq(struct sh_sdhi_host *host, int reg, u64 val)
|
static inline void sh_sdhi_writeq(struct sh_sdhi_host *host, int reg, u64 val)
|
||||||
|
@ -50,11 +55,6 @@ static inline u16 sh_sdhi_readw(struct sh_sdhi_host *host, int reg)
|
||||||
return readw(host->addr + (reg << host->bus_shift));
|
return readw(host->addr + (reg << host->bus_shift));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *mmc_priv(struct mmc *mmc)
|
|
||||||
{
|
|
||||||
return (void *)mmc->priv;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void sh_sdhi_detect(struct sh_sdhi_host *host)
|
static void sh_sdhi_detect(struct sh_sdhi_host *host)
|
||||||
{
|
{
|
||||||
sh_sdhi_writew(host, SDHI_OPTION,
|
sh_sdhi_writew(host, SDHI_OPTION,
|
||||||
|
@ -477,65 +477,64 @@ static void sh_sdhi_get_response(struct sh_sdhi_host *host, struct mmc_cmd *cmd)
|
||||||
static unsigned short sh_sdhi_set_cmd(struct sh_sdhi_host *host,
|
static unsigned short sh_sdhi_set_cmd(struct sh_sdhi_host *host,
|
||||||
struct mmc_data *data, unsigned short opc)
|
struct mmc_data *data, unsigned short opc)
|
||||||
{
|
{
|
||||||
switch (opc) {
|
if (host->app_cmd) {
|
||||||
case SD_CMD_APP_SEND_OP_COND:
|
|
||||||
case SD_CMD_APP_SEND_SCR:
|
|
||||||
opc |= SDHI_APP;
|
|
||||||
break;
|
|
||||||
case SD_CMD_APP_SET_BUS_WIDTH:
|
|
||||||
/* SD_APP_SET_BUS_WIDTH*/
|
|
||||||
if (!data)
|
if (!data)
|
||||||
opc |= SDHI_APP;
|
host->app_cmd = 0;
|
||||||
else /* SD_SWITCH */
|
return opc | BIT(6);
|
||||||
opc = SDHI_SD_SWITCH;
|
}
|
||||||
break;
|
|
||||||
case MMC_CMD_SEND_OP_COND:
|
switch (opc) {
|
||||||
opc = SDHI_MMC_SEND_OP_COND;
|
case MMC_CMD_SWITCH:
|
||||||
break;
|
return opc | (data ? 0x1c00 : 0x40);
|
||||||
case MMC_CMD_SEND_EXT_CSD:
|
case MMC_CMD_SEND_EXT_CSD:
|
||||||
if (data)
|
return opc | (data ? 0x1c00 : 0);
|
||||||
opc = SDHI_MMC_SEND_EXT_CSD;
|
case MMC_CMD_SEND_OP_COND:
|
||||||
break;
|
return opc | 0x0700;
|
||||||
default:
|
case MMC_CMD_APP_CMD:
|
||||||
break;
|
host->app_cmd = 1;
|
||||||
|
default:
|
||||||
|
return opc;
|
||||||
}
|
}
|
||||||
return opc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned short sh_sdhi_data_trans(struct sh_sdhi_host *host,
|
static unsigned short sh_sdhi_data_trans(struct sh_sdhi_host *host,
|
||||||
struct mmc_data *data, unsigned short opc)
|
struct mmc_data *data, unsigned short opc)
|
||||||
{
|
{
|
||||||
unsigned short ret;
|
if (host->app_cmd) {
|
||||||
|
host->app_cmd = 0;
|
||||||
switch (opc) {
|
switch (opc) {
|
||||||
case MMC_CMD_READ_MULTIPLE_BLOCK:
|
case SD_CMD_APP_SEND_SCR:
|
||||||
ret = sh_sdhi_multi_read(host, data);
|
case SD_CMD_APP_SD_STATUS:
|
||||||
break;
|
return sh_sdhi_single_read(host, data);
|
||||||
case MMC_CMD_WRITE_MULTIPLE_BLOCK:
|
default:
|
||||||
ret = sh_sdhi_multi_write(host, data);
|
printf(DRIVER_NAME": SD: NOT SUPPORT APP CMD = d'%04d\n",
|
||||||
break;
|
opc);
|
||||||
case MMC_CMD_WRITE_SINGLE_BLOCK:
|
return -EINVAL;
|
||||||
ret = sh_sdhi_single_write(host, data);
|
}
|
||||||
break;
|
} else {
|
||||||
case MMC_CMD_READ_SINGLE_BLOCK:
|
switch (opc) {
|
||||||
case SDHI_SD_APP_SEND_SCR:
|
case MMC_CMD_WRITE_MULTIPLE_BLOCK:
|
||||||
case SDHI_SD_SWITCH: /* SD_SWITCH */
|
return sh_sdhi_multi_write(host, data);
|
||||||
case SDHI_MMC_SEND_EXT_CSD:
|
case MMC_CMD_READ_MULTIPLE_BLOCK:
|
||||||
ret = sh_sdhi_single_read(host, data);
|
return sh_sdhi_multi_read(host, data);
|
||||||
break;
|
case MMC_CMD_WRITE_SINGLE_BLOCK:
|
||||||
default:
|
return sh_sdhi_single_write(host, data);
|
||||||
printf(DRIVER_NAME": SD: NOT SUPPORT CMD = d'%04d\n", opc);
|
case MMC_CMD_READ_SINGLE_BLOCK:
|
||||||
ret = -EINVAL;
|
case MMC_CMD_SWITCH:
|
||||||
break;
|
case MMC_CMD_SEND_EXT_CSD:;
|
||||||
|
return sh_sdhi_single_read(host, data);
|
||||||
|
default:
|
||||||
|
printf(DRIVER_NAME": SD: NOT SUPPORT CMD = d'%04d\n", opc);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sh_sdhi_start_cmd(struct sh_sdhi_host *host,
|
static int sh_sdhi_start_cmd(struct sh_sdhi_host *host,
|
||||||
struct mmc_data *data, struct mmc_cmd *cmd)
|
struct mmc_data *data, struct mmc_cmd *cmd)
|
||||||
{
|
{
|
||||||
long time;
|
long time;
|
||||||
unsigned short opc = cmd->cmdidx;
|
unsigned short shcmd, opc = cmd->cmdidx;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
unsigned long timeout;
|
unsigned long timeout;
|
||||||
|
|
||||||
|
@ -563,7 +562,8 @@ static int sh_sdhi_start_cmd(struct sh_sdhi_host *host,
|
||||||
}
|
}
|
||||||
sh_sdhi_writew(host, SDHI_SIZE, data->blocksize);
|
sh_sdhi_writew(host, SDHI_SIZE, data->blocksize);
|
||||||
}
|
}
|
||||||
opc = sh_sdhi_set_cmd(host, data, opc);
|
|
||||||
|
shcmd = sh_sdhi_set_cmd(host, data, opc);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* U-Boot cannot use interrupt.
|
* U-Boot cannot use interrupt.
|
||||||
|
@ -594,11 +594,12 @@ static int sh_sdhi_start_cmd(struct sh_sdhi_host *host,
|
||||||
INFO2M_RESP_TIMEOUT | INFO2M_ILA) &
|
INFO2M_RESP_TIMEOUT | INFO2M_ILA) &
|
||||||
sh_sdhi_readw(host, SDHI_INFO2_MASK));
|
sh_sdhi_readw(host, SDHI_INFO2_MASK));
|
||||||
|
|
||||||
sh_sdhi_writew(host, SDHI_CMD, (unsigned short)(opc & CMD_MASK));
|
sh_sdhi_writew(host, SDHI_CMD, (unsigned short)(shcmd & CMD_MASK));
|
||||||
|
|
||||||
time = sh_sdhi_wait_interrupt_flag(host);
|
time = sh_sdhi_wait_interrupt_flag(host);
|
||||||
if (!time)
|
if (!time) {
|
||||||
|
host->app_cmd = 0;
|
||||||
return sh_sdhi_error_manage(host);
|
return sh_sdhi_error_manage(host);
|
||||||
|
}
|
||||||
|
|
||||||
if (host->sd_error) {
|
if (host->sd_error) {
|
||||||
switch (cmd->cmdidx) {
|
switch (cmd->cmdidx) {
|
||||||
|
@ -616,15 +617,20 @@ static int sh_sdhi_start_cmd(struct sh_sdhi_host *host,
|
||||||
}
|
}
|
||||||
host->sd_error = 0;
|
host->sd_error = 0;
|
||||||
host->wait_int = 0;
|
host->wait_int = 0;
|
||||||
|
host->app_cmd = 0;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
if (sh_sdhi_readw(host, SDHI_INFO1) & INFO1_RESP_END)
|
|
||||||
|
if (sh_sdhi_readw(host, SDHI_INFO1) & INFO1_RESP_END) {
|
||||||
|
host->app_cmd = 0;
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
if (host->wait_int) {
|
if (host->wait_int) {
|
||||||
sh_sdhi_get_response(host, cmd);
|
sh_sdhi_get_response(host, cmd);
|
||||||
host->wait_int = 0;
|
host->wait_int = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data)
|
if (data)
|
||||||
ret = sh_sdhi_data_trans(host, data, opc);
|
ret = sh_sdhi_data_trans(host, data, opc);
|
||||||
|
|
||||||
|
@ -634,23 +640,17 @@ static int sh_sdhi_start_cmd(struct sh_sdhi_host *host,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sh_sdhi_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
|
static int sh_sdhi_send_cmd_common(struct sh_sdhi_host *host,
|
||||||
struct mmc_data *data)
|
struct mmc_cmd *cmd, struct mmc_data *data)
|
||||||
{
|
{
|
||||||
struct sh_sdhi_host *host = mmc_priv(mmc);
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
host->sd_error = 0;
|
host->sd_error = 0;
|
||||||
|
|
||||||
ret = sh_sdhi_start_cmd(host, data, cmd);
|
return sh_sdhi_start_cmd(host, data, cmd);
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sh_sdhi_set_ios(struct mmc *mmc)
|
static int sh_sdhi_set_ios_common(struct sh_sdhi_host *host, struct mmc *mmc)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct sh_sdhi_host *host = mmc_priv(mmc);
|
|
||||||
|
|
||||||
ret = sh_sdhi_clock_control(host, mmc->clock);
|
ret = sh_sdhi_clock_control(host, mmc->clock);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -674,9 +674,8 @@ static int sh_sdhi_set_ios(struct mmc *mmc)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sh_sdhi_initialize(struct mmc *mmc)
|
static int sh_sdhi_initialize_common(struct sh_sdhi_host *host)
|
||||||
{
|
{
|
||||||
struct sh_sdhi_host *host = mmc_priv(mmc);
|
|
||||||
int ret = sh_sdhi_sync_reset(host);
|
int ret = sh_sdhi_sync_reset(host);
|
||||||
|
|
||||||
sh_sdhi_writew(host, SDHI_PORTSEL, USE_1PORT);
|
sh_sdhi_writew(host, SDHI_PORTSEL, USE_1PORT);
|
||||||
|
@ -692,6 +691,34 @@ static int sh_sdhi_initialize(struct mmc *mmc)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef CONFIG_DM_MMC
|
||||||
|
static void *mmc_priv(struct mmc *mmc)
|
||||||
|
{
|
||||||
|
return (void *)mmc->priv;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int sh_sdhi_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
|
||||||
|
struct mmc_data *data)
|
||||||
|
{
|
||||||
|
struct sh_sdhi_host *host = mmc_priv(mmc);
|
||||||
|
|
||||||
|
return sh_sdhi_send_cmd_common(host, cmd, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int sh_sdhi_set_ios(struct mmc *mmc)
|
||||||
|
{
|
||||||
|
struct sh_sdhi_host *host = mmc_priv(mmc);
|
||||||
|
|
||||||
|
return sh_sdhi_set_ios_common(host, mmc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int sh_sdhi_initialize(struct mmc *mmc)
|
||||||
|
{
|
||||||
|
struct sh_sdhi_host *host = mmc_priv(mmc);
|
||||||
|
|
||||||
|
return sh_sdhi_initialize_common(host);
|
||||||
|
}
|
||||||
|
|
||||||
static const struct mmc_ops sh_sdhi_ops = {
|
static const struct mmc_ops sh_sdhi_ops = {
|
||||||
.send_cmd = sh_sdhi_send_cmd,
|
.send_cmd = sh_sdhi_send_cmd,
|
||||||
.set_ios = sh_sdhi_set_ios,
|
.set_ios = sh_sdhi_set_ios,
|
||||||
|
@ -743,7 +770,7 @@ int sh_sdhi_init(unsigned long addr, int ch, unsigned long quirks)
|
||||||
}
|
}
|
||||||
|
|
||||||
host->ch = ch;
|
host->ch = ch;
|
||||||
host->addr = addr;
|
host->addr = (void __iomem *)addr;
|
||||||
host->quirks = quirks;
|
host->quirks = quirks;
|
||||||
|
|
||||||
if (host->quirks & SH_SDHI_QUIRK_64BIT_BUF)
|
if (host->quirks & SH_SDHI_QUIRK_64BIT_BUF)
|
||||||
|
@ -757,3 +784,123 @@ error:
|
||||||
free(host);
|
free(host);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
struct sh_sdhi_plat {
|
||||||
|
struct mmc_config cfg;
|
||||||
|
struct mmc mmc;
|
||||||
|
};
|
||||||
|
|
||||||
|
int sh_sdhi_dm_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
|
||||||
|
struct mmc_data *data)
|
||||||
|
{
|
||||||
|
struct sh_sdhi_host *host = dev_get_priv(dev);
|
||||||
|
|
||||||
|
return sh_sdhi_send_cmd_common(host, cmd, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
int sh_sdhi_dm_set_ios(struct udevice *dev)
|
||||||
|
{
|
||||||
|
struct sh_sdhi_host *host = dev_get_priv(dev);
|
||||||
|
struct mmc *mmc = mmc_get_mmc_dev(dev);
|
||||||
|
|
||||||
|
return sh_sdhi_set_ios_common(host, mmc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct dm_mmc_ops sh_sdhi_dm_ops = {
|
||||||
|
.send_cmd = sh_sdhi_dm_send_cmd,
|
||||||
|
.set_ios = sh_sdhi_dm_set_ios,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int sh_sdhi_dm_bind(struct udevice *dev)
|
||||||
|
{
|
||||||
|
struct sh_sdhi_plat *plat = dev_get_platdata(dev);
|
||||||
|
|
||||||
|
return mmc_bind(dev, &plat->mmc, &plat->cfg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int sh_sdhi_dm_probe(struct udevice *dev)
|
||||||
|
{
|
||||||
|
struct sh_sdhi_plat *plat = dev_get_platdata(dev);
|
||||||
|
struct sh_sdhi_host *host = dev_get_priv(dev);
|
||||||
|
struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
|
||||||
|
struct clk sh_sdhi_clk;
|
||||||
|
const u32 quirks = dev_get_driver_data(dev);
|
||||||
|
fdt_addr_t base;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
base = devfdt_get_addr(dev);
|
||||||
|
if (base == FDT_ADDR_T_NONE)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
host->addr = devm_ioremap(dev, base, SZ_2K);
|
||||||
|
if (!host->addr)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
ret = clk_get_by_index(dev, 0, &sh_sdhi_clk);
|
||||||
|
if (ret) {
|
||||||
|
debug("failed to get clock, ret=%d\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = clk_enable(&sh_sdhi_clk);
|
||||||
|
if (ret) {
|
||||||
|
debug("failed to enable clock, ret=%d\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
host->quirks = quirks;
|
||||||
|
|
||||||
|
if (host->quirks & SH_SDHI_QUIRK_64BIT_BUF)
|
||||||
|
host->bus_shift = 2;
|
||||||
|
else if (host->quirks & SH_SDHI_QUIRK_16BIT_BUF)
|
||||||
|
host->bus_shift = 1;
|
||||||
|
|
||||||
|
plat->cfg.name = dev->name;
|
||||||
|
plat->cfg.host_caps = MMC_MODE_HS_52MHz | MMC_MODE_HS;
|
||||||
|
|
||||||
|
switch (fdtdec_get_int(gd->fdt_blob, dev_of_offset(dev), "bus-width",
|
||||||
|
1)) {
|
||||||
|
case 8:
|
||||||
|
plat->cfg.host_caps |= MMC_MODE_8BIT;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
plat->cfg.host_caps |= MMC_MODE_4BIT;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
dev_err(dev, "Invalid \"bus-width\" value\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
sh_sdhi_initialize_common(host);
|
||||||
|
|
||||||
|
plat->cfg.voltages = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34;
|
||||||
|
plat->cfg.f_min = CLKDEV_INIT;
|
||||||
|
plat->cfg.f_max = CLKDEV_HS_DATA;
|
||||||
|
plat->cfg.b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
|
||||||
|
|
||||||
|
upriv->mmc = &plat->mmc;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct udevice_id sh_sdhi_sd_match[] = {
|
||||||
|
{ .compatible = "renesas,sdhi-r8a7795", .data = SH_SDHI_QUIRK_64BIT_BUF },
|
||||||
|
{ .compatible = "renesas,sdhi-r8a7796", .data = SH_SDHI_QUIRK_64BIT_BUF },
|
||||||
|
{ /* sentinel */ }
|
||||||
|
};
|
||||||
|
|
||||||
|
U_BOOT_DRIVER(sh_sdhi_mmc) = {
|
||||||
|
.name = "sh-sdhi-mmc",
|
||||||
|
.id = UCLASS_MMC,
|
||||||
|
.of_match = sh_sdhi_sd_match,
|
||||||
|
.bind = sh_sdhi_dm_bind,
|
||||||
|
.probe = sh_sdhi_dm_probe,
|
||||||
|
.priv_auto_alloc_size = sizeof(struct sh_sdhi_host),
|
||||||
|
.platdata_auto_alloc_size = sizeof(struct sh_sdhi_plat),
|
||||||
|
.ops = &sh_sdhi_dm_ops,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
|
@ -470,13 +470,13 @@ static int uniphier_sd_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
|
||||||
u32 rsp_71_40 = readl(priv->regbase + UNIPHIER_SD_RSP32);
|
u32 rsp_71_40 = readl(priv->regbase + UNIPHIER_SD_RSP32);
|
||||||
u32 rsp_39_8 = readl(priv->regbase + UNIPHIER_SD_RSP10);
|
u32 rsp_39_8 = readl(priv->regbase + UNIPHIER_SD_RSP10);
|
||||||
|
|
||||||
cmd->response[0] = (rsp_127_104 & 0xffffff) << 8 |
|
cmd->response[0] = ((rsp_127_104 & 0x00ffffff) << 8) |
|
||||||
(rsp_103_72 & 0xff);
|
((rsp_103_72 & 0xff000000) >> 24);
|
||||||
cmd->response[1] = (rsp_103_72 & 0xffffff) << 8 |
|
cmd->response[1] = ((rsp_103_72 & 0x00ffffff) << 8) |
|
||||||
(rsp_71_40 & 0xff);
|
((rsp_71_40 & 0xff000000) >> 24);
|
||||||
cmd->response[2] = (rsp_71_40 & 0xffffff) << 8 |
|
cmd->response[2] = ((rsp_71_40 & 0x00ffffff) << 8) |
|
||||||
(rsp_39_8 & 0xff);
|
((rsp_39_8 & 0xff000000) >> 24);
|
||||||
cmd->response[3] = (rsp_39_8 & 0xffffff) << 8;
|
cmd->response[3] = (rsp_39_8 & 0xffffff) << 8;
|
||||||
} else {
|
} else {
|
||||||
/* bit 39-8 */
|
/* bit 39-8 */
|
||||||
cmd->response[0] = readl(priv->regbase + UNIPHIER_SD_RSP10);
|
cmd->response[0] = readl(priv->regbase + UNIPHIER_SD_RSP10);
|
||||||
|
|
|
@ -176,6 +176,60 @@ struct ahci_uc_priv {
|
||||||
u32 link_port_map; /*linkup port map*/
|
u32 link_port_map; /*linkup port map*/
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ahci_ops {
|
||||||
|
/**
|
||||||
|
* reset() - reset the controller
|
||||||
|
*
|
||||||
|
* @dev: Controller to reset
|
||||||
|
* @return 0 if OK, -ve on error
|
||||||
|
*/
|
||||||
|
int (*reset)(struct udevice *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* port_status() - get the status of a SATA port
|
||||||
|
*
|
||||||
|
* @dev: Controller to reset
|
||||||
|
* @port: Port number to check (0 for first)
|
||||||
|
* @return 0 if detected, -ENXIO if nothing on port, other -ve on error
|
||||||
|
*/
|
||||||
|
int (*port_status)(struct udevice *dev, int port);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* scan() - scan SATA ports
|
||||||
|
*
|
||||||
|
* @dev: Controller to scan
|
||||||
|
* @return 0 if OK, -ve on error
|
||||||
|
*/
|
||||||
|
int (*scan)(struct udevice *dev);
|
||||||
|
};
|
||||||
|
|
||||||
|
#define ahci_get_ops(dev) ((struct ahci_ops *)(dev)->driver->ops)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sata_reset() - reset the controller
|
||||||
|
*
|
||||||
|
* @dev: Controller to reset
|
||||||
|
* @return 0 if OK, -ve on error
|
||||||
|
*/
|
||||||
|
int sata_reset(struct udevice *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sata_port_status() - get the status of a SATA port
|
||||||
|
*
|
||||||
|
* @dev: Controller to reset
|
||||||
|
* @port: Port number to check (0 for first)
|
||||||
|
* @return 0 if detected, -ENXIO if nothin on port, other -ve on error
|
||||||
|
*/
|
||||||
|
int sata_dm_port_status(struct udevice *dev, int port);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sata_scan() - scan SATA ports
|
||||||
|
*
|
||||||
|
* @dev: Controller to scan
|
||||||
|
* @return 0 if OK, -ve on error
|
||||||
|
*/
|
||||||
|
int sata_scan(struct udevice *dev);
|
||||||
|
|
||||||
int ahci_init(void __iomem *base);
|
int ahci_init(void __iomem *base);
|
||||||
int ahci_reset(void __iomem *base);
|
int ahci_reset(void __iomem *base);
|
||||||
|
|
||||||
|
|
|
@ -624,4 +624,24 @@ ulong blk_write_devnum(enum if_type if_type, int devnum, lbaint_t start,
|
||||||
*/
|
*/
|
||||||
int blk_select_hwpart_devnum(enum if_type if_type, int devnum, int hwpart);
|
int blk_select_hwpart_devnum(enum if_type if_type, int devnum, int hwpart);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* blk_get_if_type_name() - Get the name of an interface type
|
||||||
|
*
|
||||||
|
* @if_type: Interface type to check
|
||||||
|
* @return name of interface, or NULL if none
|
||||||
|
*/
|
||||||
|
const char *blk_get_if_type_name(enum if_type if_type);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* blk_common_cmd() - handle common commands with block devices
|
||||||
|
*
|
||||||
|
* @args: Number of arguments to the command (argv[0] is the command itself)
|
||||||
|
* @argv: Command arguments
|
||||||
|
* @if_type: Interface type
|
||||||
|
* @cur_devnump: Current device number for this interface type
|
||||||
|
* @return 0 if OK, CMD_RET_ERROR on error
|
||||||
|
*/
|
||||||
|
int blk_common_cmd(int argc, char * const argv[], enum if_type if_type,
|
||||||
|
int *cur_devnump);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -282,7 +282,6 @@
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_SPL_BUILD
|
#ifdef CONFIG_SPL_BUILD
|
||||||
#undef CONFIG_DM_MMC
|
#undef CONFIG_DM_MMC
|
||||||
#undef CONFIG_DM_MMC_OPS
|
|
||||||
#undef CONFIG_TIMER
|
#undef CONFIG_TIMER
|
||||||
#undef CONFIG_DM_USB
|
#undef CONFIG_DM_USB
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -256,7 +256,6 @@
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_SPL_BUILD
|
#ifdef CONFIG_SPL_BUILD
|
||||||
#undef CONFIG_DM_MMC
|
#undef CONFIG_DM_MMC
|
||||||
#undef CONFIG_DM_MMC_OPS
|
|
||||||
#undef CONFIG_TIMER
|
#undef CONFIG_TIMER
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -183,7 +183,6 @@
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_SPL_BUILD
|
#ifdef CONFIG_SPL_BUILD
|
||||||
#undef CONFIG_DM_MMC
|
#undef CONFIG_DM_MMC
|
||||||
#undef CONFIG_DM_MMC_OPS
|
|
||||||
#undef CONFIG_TIMER
|
#undef CONFIG_TIMER
|
||||||
#undef CONFIG_DM_USB
|
#undef CONFIG_DM_USB
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -23,7 +23,6 @@
|
||||||
* DM support in SPL
|
* DM support in SPL
|
||||||
*/
|
*/
|
||||||
#undef CONFIG_DM_MMC
|
#undef CONFIG_DM_MMC
|
||||||
#undef CONFIG_DM_MMC_OPS
|
|
||||||
#undef OMAP_HSMMC_USE_GPIO
|
#undef OMAP_HSMMC_USE_GPIO
|
||||||
|
|
||||||
/* select serial console configuration for SPL */
|
/* select serial console configuration for SPL */
|
||||||
|
|
|
@ -98,7 +98,7 @@ int device_probe(struct udevice *dev);
|
||||||
* children are deactivated first.
|
* children are deactivated first.
|
||||||
*
|
*
|
||||||
* @dev: Pointer to device to remove
|
* @dev: Pointer to device to remove
|
||||||
* @flags: Flags for selective device removal
|
* @flags: Flags for selective device removal (DM_REMOVE_...)
|
||||||
* @return 0 if OK, -ve on error (an error here is normally a very bad thing)
|
* @return 0 if OK, -ve on error (an error here is normally a very bad thing)
|
||||||
*/
|
*/
|
||||||
#if CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)
|
#if CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)
|
||||||
|
|
16
include/dwc_ahsata.h
Normal file
16
include/dwc_ahsata.h
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Google, Inc
|
||||||
|
* Written by Simon Glass <sjg@chromium.org>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __DWC_AHSATA_H__
|
||||||
|
#define __DWC_AHSATA_H__
|
||||||
|
|
||||||
|
int dwc_ahsata_bus_reset(struct udevice *dev);
|
||||||
|
int dwc_ahsata_probe(struct udevice *dev);
|
||||||
|
int dwc_ahsata_scan(struct udevice *dev);
|
||||||
|
int dwc_ahsata_port_status(struct udevice *dev, int port);
|
||||||
|
|
||||||
|
#endif
|
|
@ -291,7 +291,7 @@ int dwmci_bind(struct udevice *dev, struct mmc *mmc, struct mmc_config *cfg);
|
||||||
int add_dwmci(struct dwmci_host *host, u32 max_clk, u32 min_clk);
|
int add_dwmci(struct dwmci_host *host, u32 max_clk, u32 min_clk);
|
||||||
#endif /* !CONFIG_BLK */
|
#endif /* !CONFIG_BLK */
|
||||||
|
|
||||||
#ifdef CONFIG_DM_MMC_OPS
|
#ifdef CONFIG_DM_MMC
|
||||||
/* Export the operations to drivers */
|
/* Export the operations to drivers */
|
||||||
int dwmci_probe(struct udevice *dev);
|
int dwmci_probe(struct udevice *dev);
|
||||||
extern const struct dm_mmc_ops dm_dwmci_ops;
|
extern const struct dm_mmc_ops dm_dwmci_ops;
|
||||||
|
|
|
@ -221,6 +221,10 @@
|
||||||
#define EXT_CSD_BOOT_PART_NUM(x) (x << 3)
|
#define EXT_CSD_BOOT_PART_NUM(x) (x << 3)
|
||||||
#define EXT_CSD_PARTITION_ACCESS(x) (x << 0)
|
#define EXT_CSD_PARTITION_ACCESS(x) (x << 0)
|
||||||
|
|
||||||
|
#define EXT_CSD_EXTRACT_BOOT_ACK(x) (((x) >> 6) & 0x1)
|
||||||
|
#define EXT_CSD_EXTRACT_BOOT_PART(x) (((x) >> 3) & 0x7)
|
||||||
|
#define EXT_CSD_EXTRACT_PARTITION_ACCESS(x) ((x) & 0x7)
|
||||||
|
|
||||||
#define EXT_CSD_BOOT_BUS_WIDTH_MODE(x) (x << 3)
|
#define EXT_CSD_BOOT_BUS_WIDTH_MODE(x) (x << 3)
|
||||||
#define EXT_CSD_BOOT_BUS_WIDTH_RESET(x) (x << 2)
|
#define EXT_CSD_BOOT_BUS_WIDTH_RESET(x) (x << 2)
|
||||||
#define EXT_CSD_BOOT_BUS_WIDTH_WIDTH(x) (x)
|
#define EXT_CSD_BOOT_BUS_WIDTH_WIDTH(x) (x)
|
||||||
|
@ -321,7 +325,7 @@ struct mmc_data {
|
||||||
/* forward decl. */
|
/* forward decl. */
|
||||||
struct mmc;
|
struct mmc;
|
||||||
|
|
||||||
#if CONFIG_IS_ENABLED(DM_MMC_OPS)
|
#if CONFIG_IS_ENABLED(DM_MMC)
|
||||||
struct dm_mmc_ops {
|
struct dm_mmc_ops {
|
||||||
/**
|
/**
|
||||||
* send_cmd() - Send a command to the MMC device
|
* send_cmd() - Send a command to the MMC device
|
||||||
|
@ -385,7 +389,7 @@ struct mmc_ops {
|
||||||
|
|
||||||
struct mmc_config {
|
struct mmc_config {
|
||||||
const char *name;
|
const char *name;
|
||||||
#if !CONFIG_IS_ENABLED(DM_MMC_OPS)
|
#if !CONFIG_IS_ENABLED(DM_MMC)
|
||||||
const struct mmc_ops *ops;
|
const struct mmc_ops *ops;
|
||||||
#endif
|
#endif
|
||||||
uint host_caps;
|
uint host_caps;
|
||||||
|
@ -519,7 +523,7 @@ int mmc_switch_part(struct mmc *mmc, unsigned int part_num);
|
||||||
int mmc_hwpart_config(struct mmc *mmc, const struct mmc_hwpart_conf *conf,
|
int mmc_hwpart_config(struct mmc *mmc, const struct mmc_hwpart_conf *conf,
|
||||||
enum mmc_hwpart_conf_mode mode);
|
enum mmc_hwpart_conf_mode mode);
|
||||||
|
|
||||||
#if !CONFIG_IS_ENABLED(DM_MMC_OPS)
|
#if !CONFIG_IS_ENABLED(DM_MMC)
|
||||||
int mmc_getcd(struct mmc *mmc);
|
int mmc_getcd(struct mmc *mmc);
|
||||||
int board_mmc_getcd(struct mmc *mmc);
|
int board_mmc_getcd(struct mmc *mmc);
|
||||||
int mmc_getwp(struct mmc *mmc);
|
int mmc_getwp(struct mmc *mmc);
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#define __SATA_H__
|
#define __SATA_H__
|
||||||
#include <part.h>
|
#include <part.h>
|
||||||
|
|
||||||
#if !defined(CONFIG_DM_SCSI)
|
#if !defined(CONFIG_DM_SCSI) && !defined(CONFIG_AHCI)
|
||||||
int init_sata(int dev);
|
int init_sata(int dev);
|
||||||
int reset_sata(int dev);
|
int reset_sata(int dev);
|
||||||
int scan_sata(int dev);
|
int scan_sata(int dev);
|
||||||
|
@ -18,4 +18,7 @@ int sata_port_status(int dev, int port);
|
||||||
extern struct blk_desc sata_dev_desc[];
|
extern struct blk_desc sata_dev_desc[];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int sata_probe(int devnum);
|
||||||
|
int sata_remove(int devnum);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -410,7 +410,7 @@ int sdhci_bind(struct udevice *dev, struct mmc *mmc, struct mmc_config *cfg);
|
||||||
int add_sdhci(struct sdhci_host *host, u32 f_max, u32 f_min);
|
int add_sdhci(struct sdhci_host *host, u32 f_max, u32 f_min);
|
||||||
#endif /* !CONFIG_BLK */
|
#endif /* !CONFIG_BLK */
|
||||||
|
|
||||||
#ifdef CONFIG_DM_MMC_OPS
|
#ifdef CONFIG_DM_MMC
|
||||||
/* Export the operations to drivers */
|
/* Export the operations to drivers */
|
||||||
int sdhci_probe(struct udevice *dev);
|
int sdhci_probe(struct udevice *dev);
|
||||||
extern const struct dm_mmc_ops sdhci_ops;
|
extern const struct dm_mmc_ops sdhci_ops;
|
||||||
|
|
Loading…
Reference in a new issue