Merge branch 'master' of git://git.denx.de/u-boot-uniphier
diff --git a/arch/arm/dts/uniphier-ph1-sld3-ref.dts b/arch/arm/dts/uniphier-ph1-sld3-ref.dts
index 099df83..0863588 100644
--- a/arch/arm/dts/uniphier-ph1-sld3-ref.dts
+++ b/arch/arm/dts/uniphier-ph1-sld3-ref.dts
@@ -85,3 +85,11 @@
 &serial0 {
        u-boot,dm-pre-reloc;
 };
+
+&mio {
+       u-boot,dm-pre-reloc;
+};
+
+&emmc {
+       u-boot,dm-pre-reloc;
+};
diff --git a/arch/arm/dts/uniphier-ph1-sld3.dtsi b/arch/arm/dts/uniphier-ph1-sld3.dtsi
index c3adaf1..6a95541 100644
--- a/arch/arm/dts/uniphier-ph1-sld3.dtsi
+++ b/arch/arm/dts/uniphier-ph1-sld3.dtsi
@@ -61,6 +61,7 @@
 		#size-cells = <1>;
 		ranges;
 		interrupt-parent = <&intc>;
+		u-boot,dm-pre-reloc;
 
 		timer@20000200 {
 			compatible = "arm,cortex-a9-global-timer";
diff --git a/arch/arm/mach-uniphier/arm32/psci.c b/arch/arm/mach-uniphier/arm32/psci.c
index 633a3e0..e668265 100644
--- a/arch/arm/mach-uniphier/arm32/psci.c
+++ b/arch/arm/mach-uniphier/arm32/psci.c
@@ -151,3 +151,8 @@
 
 	return PSCI_RET_SUCCESS;
 }
+
+void __secure psci_system_reset(u32 function_id)
+{
+	reset_cpu(0);
+}
diff --git a/arch/arm/mach-uniphier/micro-support-card.c b/arch/arm/mach-uniphier/micro-support-card.c
index eeb515a..6987d1e 100644
--- a/arch/arm/mach-uniphier/micro-support-card.c
+++ b/arch/arm/mach-uniphier/micro-support-card.c
@@ -1,5 +1,7 @@
 /*
- * Copyright (C) 2012-2015 Masahiro Yamada <yamada.masahiro@socionext.com>
+ * Copyright (C) 2012-2015 Panasonic Corporation
+ * Copyright (C) 2015-2016 Socionext Inc.
+ *   Author: Masahiro Yamada <yamada.masahiro@socionext.com>
  *
  * SPDX-License-Identifier:	GPL-2.0+
  */
@@ -38,7 +40,12 @@
 	u32 revision;
 
 	revision = readl(MICRO_SUPPORT_CARD_REVISION);
-	printf("(CPLD version %d.%d)\n", revision >> 4, revision & 0xf);
+	revision &= 0xff;
+
+	/* revision 3.6.x card changed the revision format */
+	printf("(CPLD version %s%d.%d)\n", revision >> 4 == 6 ? "3." : "",
+	       revision >> 4, revision & 0xf);
+
 	return 0;
 }
 
diff --git a/arch/arm/mach-uniphier/reset.c b/arch/arm/mach-uniphier/reset.c
index b5825bc..43e27d1 100644
--- a/arch/arm/mach-uniphier/reset.c
+++ b/arch/arm/mach-uniphier/reset.c
@@ -1,15 +1,25 @@
 /*
- * Copyright (C) 2012-2015 Masahiro Yamada <yamada.masahiro@socionext.com>
+ * Copyright (C) 2012-2014 Panasonic Corporation
+ * Copyright (C) 2015-2016 Socionext Inc.
+ *   Author: Masahiro Yamada <yamada.masahiro@socionext.com>
  *
  * SPDX-License-Identifier:	GPL-2.0+
  */
 
 #include <common.h>
 #include <linux/io.h>
+#include <asm/secure.h>
 
 #include "sc-regs.h"
 
-void reset_cpu(unsigned long ignored)
+/* If PSCI is enabled, this is used for SYSTEM_RESET function */
+#ifdef CONFIG_ARMV7_PSCI
+#define __SECURE	__secure
+#else
+#define __SECURE
+#endif
+
+void __SECURE reset_cpu(unsigned long ignored)
 {
 	u32 tmp;
 
diff --git a/configs/uniphier_ld11_defconfig b/configs/uniphier_ld11_defconfig
index 57b9c07..d593f1b 100644
--- a/configs/uniphier_ld11_defconfig
+++ b/configs/uniphier_ld11_defconfig
@@ -15,6 +15,7 @@
 CONFIG_CMD_GPIO=y
 CONFIG_CMD_TFTPPUT=y
 CONFIG_CMD_PING=y
+CONFIG_CMD_CACHE=y
 CONFIG_CMD_TIME=y
 # CONFIG_CMD_MISC is not set
 CONFIG_CMD_FAT=y
@@ -25,7 +26,6 @@
 CONFIG_I2C_EEPROM=y
 CONFIG_PINCTRL=y
 CONFIG_SPL_PINCTRL=y
-CONFIG_UNIPHIER_SERIAL=y
 CONFIG_USB=y
 CONFIG_DM_USB=y
 CONFIG_USB_EHCI_HCD=y
diff --git a/configs/uniphier_ld20_defconfig b/configs/uniphier_ld20_defconfig
index e6aa525..d6443fd 100644
--- a/configs/uniphier_ld20_defconfig
+++ b/configs/uniphier_ld20_defconfig
@@ -15,6 +15,7 @@
 CONFIG_CMD_GPIO=y
 CONFIG_CMD_TFTPPUT=y
 CONFIG_CMD_PING=y
+CONFIG_CMD_CACHE=y
 CONFIG_CMD_TIME=y
 # CONFIG_CMD_MISC is not set
 CONFIG_CMD_FAT=y
@@ -26,7 +27,6 @@
 CONFIG_MMC_UNIPHIER=y
 CONFIG_PINCTRL=y
 CONFIG_SPL_PINCTRL=y
-CONFIG_UNIPHIER_SERIAL=y
 CONFIG_USB=y
 CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_STORAGE=y
diff --git a/configs/uniphier_ld4_sld8_defconfig b/configs/uniphier_ld4_sld8_defconfig
index 47b577a..6c9f0f4 100644
--- a/configs/uniphier_ld4_sld8_defconfig
+++ b/configs/uniphier_ld4_sld8_defconfig
@@ -17,6 +17,7 @@
 CONFIG_CMD_GPIO=y
 CONFIG_CMD_TFTPPUT=y
 CONFIG_CMD_PING=y
+CONFIG_CMD_CACHE=y
 CONFIG_CMD_TIME=y
 # CONFIG_CMD_MISC is not set
 CONFIG_CMD_FAT=y
@@ -31,7 +32,6 @@
 CONFIG_SPL_NAND_DENALI=y
 CONFIG_PINCTRL=y
 CONFIG_SPL_PINCTRL=y
-CONFIG_UNIPHIER_SERIAL=y
 CONFIG_USB=y
 CONFIG_DM_USB=y
 CONFIG_USB_EHCI_HCD=y
diff --git a/configs/uniphier_pro4_defconfig b/configs/uniphier_pro4_defconfig
index e156ec5..d65da62 100644
--- a/configs/uniphier_pro4_defconfig
+++ b/configs/uniphier_pro4_defconfig
@@ -16,6 +16,7 @@
 CONFIG_CMD_GPIO=y
 CONFIG_CMD_TFTPPUT=y
 CONFIG_CMD_PING=y
+CONFIG_CMD_CACHE=y
 CONFIG_CMD_TIME=y
 # CONFIG_CMD_MISC is not set
 CONFIG_CMD_FAT=y
@@ -30,7 +31,6 @@
 CONFIG_SPL_NAND_DENALI=y
 CONFIG_PINCTRL=y
 CONFIG_SPL_PINCTRL=y
-CONFIG_UNIPHIER_SERIAL=y
 CONFIG_USB=y
 CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_STORAGE=y
diff --git a/configs/uniphier_pxs2_ld6b_defconfig b/configs/uniphier_pxs2_ld6b_defconfig
index f943516..e07a9ba 100644
--- a/configs/uniphier_pxs2_ld6b_defconfig
+++ b/configs/uniphier_pxs2_ld6b_defconfig
@@ -17,6 +17,7 @@
 CONFIG_CMD_GPIO=y
 CONFIG_CMD_TFTPPUT=y
 CONFIG_CMD_PING=y
+CONFIG_CMD_CACHE=y
 CONFIG_CMD_TIME=y
 # CONFIG_CMD_MISC is not set
 CONFIG_CMD_FAT=y
@@ -31,7 +32,6 @@
 CONFIG_SPL_NAND_DENALI=y
 CONFIG_PINCTRL=y
 CONFIG_SPL_PINCTRL=y
-CONFIG_UNIPHIER_SERIAL=y
 CONFIG_USB=y
 CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_STORAGE=y
diff --git a/configs/uniphier_sld3_defconfig b/configs/uniphier_sld3_defconfig
index 598cde2..6ce26bf 100644
--- a/configs/uniphier_sld3_defconfig
+++ b/configs/uniphier_sld3_defconfig
@@ -1,5 +1,6 @@
 CONFIG_ARM=y
 CONFIG_ARCH_UNIPHIER=y
+CONFIG_SYS_MALLOC_F_LEN=0x2000
 CONFIG_ARCH_UNIPHIER_SLD3=y
 CONFIG_MICRO_SUPPORT_CARD=y
 CONFIG_SYS_TEXT_BASE=0x84000000
@@ -16,6 +17,7 @@
 CONFIG_CMD_GPIO=y
 CONFIG_CMD_TFTPPUT=y
 CONFIG_CMD_PING=y
+CONFIG_CMD_CACHE=y
 CONFIG_CMD_TIME=y
 # CONFIG_CMD_MISC is not set
 CONFIG_CMD_FAT=y
@@ -28,7 +30,6 @@
 CONFIG_SYS_NAND_DENALI_64BIT=y
 CONFIG_NAND_DENALI_SPARE_AREA_SKIP_BYTES=8
 CONFIG_SPL_NAND_DENALI=y
-CONFIG_UNIPHIER_SERIAL=y
 CONFIG_USB=y
 CONFIG_DM_USB=y
 CONFIG_USB_EHCI_HCD=y
diff --git a/drivers/mmc/Kconfig b/drivers/mmc/Kconfig
index 3616dee..a71afa5 100644
--- a/drivers/mmc/Kconfig
+++ b/drivers/mmc/Kconfig
@@ -80,6 +80,7 @@
 config MMC_UNIPHIER
 	bool "UniPhier SD/MMC Host Controller support"
 	depends on ARCH_UNIPHIER
+	select DM_MMC_OPS
 	help
 	  This selects support for the SD/MMC Host Controller on UniPhier SoCs.
 
diff --git a/drivers/mmc/uniphier-sd.c b/drivers/mmc/uniphier-sd.c
index 2a48378..701b26f 100644
--- a/drivers/mmc/uniphier-sd.c
+++ b/drivers/mmc/uniphier-sd.c
@@ -122,7 +122,6 @@
 struct uniphier_sd_priv {
 	struct mmc_config cfg;
 	struct mmc *mmc;
-	struct udevice *dev;
 	void __iomem *regbase;
 	unsigned long mclk;
 	unsigned int version;
@@ -152,8 +151,9 @@
 		invalidate_dcache_range(addr, addr + size);
 }
 
-static int uniphier_sd_check_error(struct uniphier_sd_priv *priv)
+static int uniphier_sd_check_error(struct udevice *dev)
 {
+	struct uniphier_sd_priv *priv = dev_get_priv(dev);
 	u32 info2 = readl(priv->regbase + UNIPHIER_SD_INFO2);
 
 	if (info2 & UNIPHIER_SD_INFO2_ERR_RTO) {
@@ -166,38 +166,39 @@
 	}
 
 	if (info2 & UNIPHIER_SD_INFO2_ERR_TO) {
-		dev_err(priv->dev, "timeout error\n");
+		dev_err(dev, "timeout error\n");
 		return -ETIMEDOUT;
 	}
 
 	if (info2 & (UNIPHIER_SD_INFO2_ERR_END | UNIPHIER_SD_INFO2_ERR_CRC |
 		     UNIPHIER_SD_INFO2_ERR_IDX)) {
-		dev_err(priv->dev, "communication out of sync\n");
+		dev_err(dev, "communication out of sync\n");
 		return -EILSEQ;
 	}
 
 	if (info2 & (UNIPHIER_SD_INFO2_ERR_ILA | UNIPHIER_SD_INFO2_ERR_ILR |
 		     UNIPHIER_SD_INFO2_ERR_ILW)) {
-		dev_err(priv->dev, "illegal access\n");
+		dev_err(dev, "illegal access\n");
 		return -EIO;
 	}
 
 	return 0;
 }
 
-static int uniphier_sd_wait_for_irq(struct uniphier_sd_priv *priv,
-				    unsigned int reg, u32 flag)
+static int uniphier_sd_wait_for_irq(struct udevice *dev, unsigned int reg,
+				    u32 flag)
 {
+	struct uniphier_sd_priv *priv = dev_get_priv(dev);
 	long wait = 1000000;
 	int ret;
 
 	while (!(readl(priv->regbase + reg) & flag)) {
 		if (wait-- < 0) {
-			dev_err(priv->dev, "timeout\n");
+			dev_err(dev, "timeout\n");
 			return -ETIMEDOUT;
 		}
 
-		ret = uniphier_sd_check_error(priv);
+		ret = uniphier_sd_check_error(dev);
 		if (ret)
 			return ret;
 
@@ -207,14 +208,14 @@
 	return 0;
 }
 
-static int uniphier_sd_pio_read_one_block(struct mmc *mmc, u32 **pbuf,
+static int uniphier_sd_pio_read_one_block(struct udevice *dev, u32 **pbuf,
 					  uint blocksize)
 {
-	struct uniphier_sd_priv *priv = mmc->priv;
+	struct uniphier_sd_priv *priv = dev_get_priv(dev);
 	int i, ret;
 
 	/* wait until the buffer is filled with data */
-	ret = uniphier_sd_wait_for_irq(priv, UNIPHIER_SD_INFO2,
+	ret = uniphier_sd_wait_for_irq(dev, UNIPHIER_SD_INFO2,
 				       UNIPHIER_SD_INFO2_BRE);
 	if (ret)
 		return ret;
@@ -237,14 +238,14 @@
 	return 0;
 }
 
-static int uniphier_sd_pio_write_one_block(struct mmc *mmc, const u32 **pbuf,
-					   uint blocksize)
+static int uniphier_sd_pio_write_one_block(struct udevice *dev,
+					   const u32 **pbuf, uint blocksize)
 {
-	struct uniphier_sd_priv *priv = mmc->priv;
+	struct uniphier_sd_priv *priv = dev_get_priv(dev);
 	int i, ret;
 
 	/* wait until the buffer becomes empty */
-	ret = uniphier_sd_wait_for_irq(priv, UNIPHIER_SD_INFO2,
+	ret = uniphier_sd_wait_for_irq(dev, UNIPHIER_SD_INFO2,
 				       UNIPHIER_SD_INFO2_BWE);
 	if (ret)
 		return ret;
@@ -263,7 +264,7 @@
 	return 0;
 }
 
-static int uniphier_sd_pio_xfer(struct mmc *mmc, struct mmc_data *data)
+static int uniphier_sd_pio_xfer(struct udevice *dev, struct mmc_data *data)
 {
 	u32 *dest = (u32 *)data->dest;
 	const u32 *src = (const u32 *)data->src;
@@ -271,10 +272,10 @@
 
 	for (i = 0; i < data->blocks; i++) {
 		if (data->flags & MMC_DATA_READ)
-			ret = uniphier_sd_pio_read_one_block(mmc, &dest,
+			ret = uniphier_sd_pio_read_one_block(dev, &dest,
 							     data->blocksize);
 		else
-			ret = uniphier_sd_pio_write_one_block(mmc, &src,
+			ret = uniphier_sd_pio_write_one_block(dev, &src,
 							      data->blocksize);
 		if (ret)
 			return ret;
@@ -306,14 +307,15 @@
 	writel(UNIPHIER_SD_DMA_CTL_START, priv->regbase + UNIPHIER_SD_DMA_CTL);
 }
 
-static int uniphier_sd_dma_wait_for_irq(struct uniphier_sd_priv *priv, u32 flag,
+static int uniphier_sd_dma_wait_for_irq(struct udevice *dev, u32 flag,
 					unsigned int blocks)
 {
+	struct uniphier_sd_priv *priv = dev_get_priv(dev);
 	long wait = 1000000 + 10 * blocks;
 
 	while (!(readl(priv->regbase + UNIPHIER_SD_DMA_INFO1) & flag)) {
 		if (wait-- < 0) {
-			dev_err(priv->dev, "timeout during DMA\n");
+			dev_err(dev, "timeout during DMA\n");
 			return -ETIMEDOUT;
 		}
 
@@ -321,16 +323,16 @@
 	}
 
 	if (readl(priv->regbase + UNIPHIER_SD_DMA_INFO2)) {
-		dev_err(priv->dev, "error during DMA\n");
+		dev_err(dev, "error during DMA\n");
 		return -EIO;
 	}
 
 	return 0;
 }
 
-static int uniphier_sd_dma_xfer(struct mmc *mmc, struct mmc_data *data)
+static int uniphier_sd_dma_xfer(struct udevice *dev, struct mmc_data *data)
 {
-	struct uniphier_sd_priv *priv = mmc->priv;
+	struct uniphier_sd_priv *priv = dev_get_priv(dev);
 	size_t len = data->blocks * data->blocksize;
 	void *buf;
 	enum dma_data_direction dir;
@@ -358,7 +360,7 @@
 
 	uniphier_sd_dma_start(priv, dma_addr);
 
-	ret = uniphier_sd_dma_wait_for_irq(priv, poll_flag, data->blocks);
+	ret = uniphier_sd_dma_wait_for_irq(dev, poll_flag, data->blocks);
 
 	__dma_unmap_single(dma_addr, len, dir);
 
@@ -384,15 +386,15 @@
 	return true;
 }
 
-static int uniphier_sd_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
+static int uniphier_sd_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
 				struct mmc_data *data)
 {
-	struct uniphier_sd_priv *priv = mmc->priv;
+	struct uniphier_sd_priv *priv = dev_get_priv(dev);
 	int ret;
 	u32 tmp;
 
 	if (readl(priv->regbase + UNIPHIER_SD_INFO2) & UNIPHIER_SD_INFO2_CBSY) {
-		dev_err(priv->dev, "command busy\n");
+		dev_err(dev, "command busy\n");
 		return -EBUSY;
 	}
 
@@ -446,15 +448,15 @@
 		tmp |= UNIPHIER_SD_CMD_RSP_R3;
 		break;
 	default:
-		dev_err(priv->dev, "unknown response type\n");
+		dev_err(dev, "unknown response type\n");
 		return -EINVAL;
 	}
 
-	dev_dbg(priv->dev, "sending CMD%d (SD_CMD=%08x, SD_ARG=%08x)\n",
+	dev_dbg(dev, "sending CMD%d (SD_CMD=%08x, SD_ARG=%08x)\n",
 		cmd->cmdidx, tmp, cmd->cmdarg);
 	writel(tmp, priv->regbase + UNIPHIER_SD_CMD);
 
-	ret = uniphier_sd_wait_for_irq(priv, UNIPHIER_SD_INFO1,
+	ret = uniphier_sd_wait_for_irq(dev, UNIPHIER_SD_INFO1,
 				       UNIPHIER_SD_INFO1_RSP);
 	if (ret)
 		return ret;
@@ -481,11 +483,11 @@
 		/* use DMA if the HW supports it and the buffer is aligned */
 		if (priv->caps & UNIPHIER_SD_CAP_DMA_INTERNAL &&
 		    uniphier_sd_addr_is_dmaable((long)data->src))
-			ret = uniphier_sd_dma_xfer(mmc, data);
+			ret = uniphier_sd_dma_xfer(dev, data);
 		else
-			ret = uniphier_sd_pio_xfer(mmc, data);
+			ret = uniphier_sd_pio_xfer(dev, data);
 
-		ret = uniphier_sd_wait_for_irq(priv, UNIPHIER_SD_INFO1,
+		ret = uniphier_sd_wait_for_irq(dev, UNIPHIER_SD_INFO1,
 					       UNIPHIER_SD_INFO1_CMP);
 		if (ret)
 			return ret;
@@ -494,8 +496,8 @@
 	return ret;
 }
 
-static void uniphier_sd_set_bus_width(struct uniphier_sd_priv *priv,
-				      struct mmc *mmc)
+static int uniphier_sd_set_bus_width(struct uniphier_sd_priv *priv,
+				     struct mmc *mmc)
 {
 	u32 val, tmp;
 
@@ -510,14 +512,15 @@
 		val = UNIPHIER_SD_OPTION_WIDTH_8;
 		break;
 	default:
-		BUG();
-		break;
+		return -EINVAL;
 	}
 
 	tmp = readl(priv->regbase + UNIPHIER_SD_OPTION);
 	tmp &= ~UNIPHIER_SD_OPTION_WIDTH_MASK;
 	tmp |= val;
 	writel(tmp, priv->regbase + UNIPHIER_SD_OPTION);
+
+	return 0;
 }
 
 static void uniphier_sd_set_ddr_mode(struct uniphier_sd_priv *priv,
@@ -568,6 +571,9 @@
 		val = UNIPHIER_SD_CLKCTL_DIV1024;
 
 	tmp = readl(priv->regbase + UNIPHIER_SD_CLKCTL);
+	if (tmp & UNIPHIER_SD_CLKCTL_SCLKEN &&
+	    (tmp & UNIPHIER_SD_CLKCTL_DIV_MASK) == val)
+		return;
 
 	/* stop the clock before changing its rate to avoid a glitch signal */
 	tmp &= ~UNIPHIER_SD_CLKCTL_SCLKEN;
@@ -579,25 +585,47 @@
 
 	tmp |= UNIPHIER_SD_CLKCTL_SCLKEN;
 	writel(tmp, priv->regbase + UNIPHIER_SD_CLKCTL);
+
+	udelay(1000);
 }
 
-static void uniphier_sd_set_ios(struct mmc *mmc)
+static int uniphier_sd_set_ios(struct udevice *dev)
 {
-	struct uniphier_sd_priv *priv = mmc->priv;
+	struct uniphier_sd_priv *priv = dev_get_priv(dev);
+	struct mmc *mmc = mmc_get_mmc_dev(dev);
+	int ret;
 
-	dev_dbg(priv->dev, "clock %uHz, DDRmode %d, width %u\n",
+	dev_dbg(dev, "clock %uHz, DDRmode %d, width %u\n",
 		mmc->clock, mmc->ddr_mode, mmc->bus_width);
 
-	uniphier_sd_set_bus_width(priv, mmc);
+	ret = uniphier_sd_set_bus_width(priv, mmc);
+	if (ret)
+		return ret;
 	uniphier_sd_set_ddr_mode(priv, mmc);
 	uniphier_sd_set_clk_rate(priv, mmc);
 
-	udelay(1000);
+	return 0;
+}
+
+static int uniphier_sd_get_cd(struct udevice *dev)
+{
+	struct uniphier_sd_priv *priv = dev_get_priv(dev);
+
+	if (priv->caps & UNIPHIER_SD_CAP_NONREMOVABLE)
+		return 1;
+
+	return !!(readl(priv->regbase + UNIPHIER_SD_INFO1) &
+		  UNIPHIER_SD_INFO1_CD);
 }
 
-static int uniphier_sd_init(struct mmc *mmc)
+static const struct dm_mmc_ops uniphier_sd_ops = {
+	.send_cmd = uniphier_sd_send_cmd,
+	.set_ios = uniphier_sd_set_ios,
+	.get_cd = uniphier_sd_get_cd,
+};
+
+static void uniphier_sd_host_init(struct uniphier_sd_priv *priv)
 {
-	struct uniphier_sd_priv *priv = mmc->priv;
 	u32 tmp;
 
 	/* soft reset of the host */
@@ -624,29 +652,9 @@
 		tmp |= UNIPHIER_SD_DMA_MODE_ADDR_INC;
 		writel(tmp, priv->regbase + UNIPHIER_SD_DMA_MODE);
 	}
-
-	return 0;
-}
-
-static int uniphier_sd_getcd(struct mmc *mmc)
-{
-	struct uniphier_sd_priv *priv = mmc->priv;
-
-	if (priv->caps & UNIPHIER_SD_CAP_NONREMOVABLE)
-		return 1;
-
-	return !!(readl(priv->regbase + UNIPHIER_SD_INFO1) &
-		  UNIPHIER_SD_INFO1_CD);
 }
 
-static const struct mmc_ops uniphier_sd_ops = {
-	.send_cmd = uniphier_sd_send_cmd,
-	.set_ios = uniphier_sd_set_ios,
-	.init = uniphier_sd_init,
-	.getcd = uniphier_sd_getcd,
-};
-
-int uniphier_sd_probe(struct udevice *dev)
+static int uniphier_sd_probe(struct udevice *dev)
 {
 	struct uniphier_sd_priv *priv = dev_get_priv(dev);
 	struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
@@ -654,8 +662,6 @@
 	struct clk clk;
 	int ret;
 
-	priv->dev = dev;
-
 	base = dev_get_addr(dev);
 	if (base == FDT_ADDR_T_NONE)
 		return -EINVAL;
@@ -686,7 +692,6 @@
 	}
 
 	priv->cfg.name = dev->name;
-	priv->cfg.ops = &uniphier_sd_ops;
 	priv->cfg.host_caps = MMC_MODE_HS_52MHz | MMC_MODE_HS;
 
 	switch (fdtdec_get_int(gd->fdt_blob, dev->of_offset, "bus-width", 1)) {
@@ -715,6 +720,8 @@
 		priv->caps |= UNIPHIER_SD_CAP_DIV1024;
 	}
 
+	uniphier_sd_host_init(priv);
+
 	priv->cfg.voltages = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34;
 	priv->cfg.f_min = priv->mclk /
 			(priv->caps & UNIPHIER_SD_CAP_DIV1024 ? 1024 : 512);
@@ -731,7 +738,7 @@
 	return 0;
 }
 
-int uniphier_sd_remove(struct udevice *dev)
+static int uniphier_sd_remove(struct udevice *dev)
 {
 	struct uniphier_sd_priv *priv = dev_get_priv(dev);
 
@@ -752,4 +759,5 @@
 	.probe = uniphier_sd_probe,
 	.remove = uniphier_sd_remove,
 	.priv_auto_alloc_size = sizeof(struct uniphier_sd_priv),
+	.ops = &uniphier_sd_ops,
 };
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
index 9ff7234..ab5df70 100644
--- a/drivers/serial/Kconfig
+++ b/drivers/serial/Kconfig
@@ -344,6 +344,7 @@
 config UNIPHIER_SERIAL
 	bool "Support for UniPhier on-chip UART"
 	depends on ARCH_UNIPHIER
+	default y
 	help
 	  If you have a UniPhier based board and want to use the on-chip
 	  serial ports, say Y to this option. If unsure, say N.
diff --git a/include/configs/uniphier.h b/include/configs/uniphier.h
index f41a0b1..55ba99c 100644
--- a/include/configs/uniphier.h
+++ b/include/configs/uniphier.h
@@ -12,6 +12,7 @@
 #define __CONFIG_UNIPHIER_COMMON_H__
 
 #define CONFIG_ARMV7_PSCI
+#define CONFIG_ARMV7_PSCI_1_0
 #define CONFIG_ARMV7_PSCI_NR_CPUS   4
 
 #define CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS  10