summaryrefslogtreecommitdiffstats
path: root/arch/arm
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/Kconfig2
-rw-r--r--arch/arm/boards/guf-santaro/board.c3
-rw-r--r--arch/arm/boards/netgear-rn2120/board.c2
-rw-r--r--arch/arm/boards/nxp-imx8mn-evk/lowlevel.c5
-rw-r--r--arch/arm/boards/rockchip-rk3568-evb/board.c7
-rw-r--r--arch/arm/boards/terasic-de0-nano-soc/board.c2
-rw-r--r--arch/arm/boards/terasic-sockit/board.c2
-rw-r--r--arch/arm/configs/rpi_defconfig2
-rw-r--r--arch/arm/configs/stm32mp_defconfig7
-rw-r--r--arch/arm/configs/zynq_defconfig1
-rw-r--r--arch/arm/configs/zynqmp_defconfig1
-rw-r--r--arch/arm/cpu/psci-client.c2
-rw-r--r--arch/arm/dts/rk3568-evb1-v10.dts22
-rw-r--r--arch/arm/dts/socfpga_cyclone5_de0_nano_soc.dts3
-rw-r--r--arch/arm/dts/socfpga_cyclone5_sockit.dts3
-rw-r--r--arch/arm/dts/vexpress-v2p-ca9.dts2
-rw-r--r--arch/arm/include/asm/barebox-arm-head.h2
-rw-r--r--arch/arm/mach-mvebu/kwb_bbu.c2
-rw-r--r--arch/arm/mach-rockchip/Kconfig8
-rw-r--r--arch/arm/mach-rockchip/Makefile1
-rw-r--r--arch/arm/mach-rockchip/atf.c53
-rw-r--r--arch/arm/mach-rockchip/bbu.c141
-rw-r--r--arch/arm/mach-rockchip/include/mach/bbu.h9
-rw-r--r--arch/arm/mach-rockchip/include/mach/rockchip.h2
-rw-r--r--arch/arm/mach-rockchip/rk3568.c16
-rw-r--r--arch/arm/mach-rockchip/rockchip.c15
26 files changed, 232 insertions, 83 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index c7ab166888..a8b7bdeaa6 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -248,6 +248,7 @@ config ARCH_ZYNQ
bool "Xilinx Zynq-based boards"
select HAS_DEBUG_LL
select PBL_IMAGE
+ select GPIOLIB
config ARCH_ZYNQMP
bool "Xilinx ZynqMP-based boards"
@@ -258,6 +259,7 @@ config ARCH_ZYNQMP
select COMMON_CLK
select COMMON_CLK_OF_PROVIDER
select CLKDEV_LOOKUP
+ select GPIOLIB
select OFDEVICE
select OFTREE
select RELOCATABLE
diff --git a/arch/arm/boards/guf-santaro/board.c b/arch/arm/boards/guf-santaro/board.c
index 34005ff7bf..cfc85af59e 100644
--- a/arch/arm/boards/guf-santaro/board.c
+++ b/arch/arm/boards/guf-santaro/board.c
@@ -22,12 +22,11 @@
static int i2c_device_present(struct i2c_adapter *adapter, int addr)
{
struct i2c_client client = {};
- u8 reg;
client.adapter = adapter;
client.addr = addr;
- return i2c_write_reg(&client, 0x00, &reg, 0) < 0 ? false : true;
+ return i2c_write_reg(&client, 0x00, NULL, 0) < 0 ? false : true;
}
#define TOUCH_RESET_GPIO IMX_GPIO_NR(1, 20)
diff --git a/arch/arm/boards/netgear-rn2120/board.c b/arch/arm/boards/netgear-rn2120/board.c
index caf106af50..d5756e0969 100644
--- a/arch/arm/boards/netgear-rn2120/board.c
+++ b/arch/arm/boards/netgear-rn2120/board.c
@@ -2,7 +2,7 @@
#include <init.h>
#include <of.h>
#include <gpio.h>
-#include <printk.h>
+#include <linux/printk.h>
#include <linux/kernel.h>
#include <asm/armlinux.h>
#include <generated/mach-types.h>
diff --git a/arch/arm/boards/nxp-imx8mn-evk/lowlevel.c b/arch/arm/boards/nxp-imx8mn-evk/lowlevel.c
index bac632aa43..de53213ebc 100644
--- a/arch/arm/boards/nxp-imx8mn-evk/lowlevel.c
+++ b/arch/arm/boards/nxp-imx8mn-evk/lowlevel.c
@@ -56,7 +56,7 @@ static void pmic_reg_write(void *i2c, int addr, int reg, uint8_t val)
ret = i2c_fsl_xfer(i2c, msgs, ARRAY_SIZE(msgs));
if (ret != 1)
- pr_err("Failed to write to pmic %d\n", ret);
+ pr_err("Failed to write to pmic@%x: %d\n", addr, ret);
}
static int power_init_board_pca9450(void *i2c, int addr)
@@ -66,7 +66,8 @@ static int power_init_board_pca9450(void *i2c, int addr)
{
.addr = addr,
.buf = buf,
- .flags = I2C_M_RD
+ .flags = I2C_M_RD,
+ .len = 1,
},
};
diff --git a/arch/arm/boards/rockchip-rk3568-evb/board.c b/arch/arm/boards/rockchip-rk3568-evb/board.c
index 9cd84d7fb9..09385bea29 100644
--- a/arch/arm/boards/rockchip-rk3568-evb/board.c
+++ b/arch/arm/boards/rockchip-rk3568-evb/board.c
@@ -10,6 +10,7 @@
#include <environment.h>
#include <globalvar.h>
#include <magicvar.h>
+#include <deep-probe.h>
static bool machine_is_rk3568_evb = false;
@@ -27,8 +28,8 @@ static int rk3568_evb_probe(struct device_d *dev)
else
of_device_enable_path("/chosen/environment-emmc");
- rk3568_bbu_mmc_register("emmc", BBU_HANDLER_FLAG_DEFAULT, "/dev/emmc.barebox");
- rk3568_bbu_mmc_register("sd", 0, "/dev/sd.barebox");
+ rk3568_bbu_mmc_register("emmc", BBU_HANDLER_FLAG_DEFAULT, "/dev/emmc");
+ rk3568_bbu_mmc_register("sd", 0, "/dev/sd");
return 0;
}
@@ -45,6 +46,8 @@ static struct driver_d rk3568_evb_board_driver = {
};
coredevice_platform_driver(rk3568_evb_board_driver);
+BAREBOX_DEEP_PROBE_ENABLE(rk3568_evb_of_match);
+
static int rk3568_evb_detect_hwid(void)
{
int ret;
diff --git a/arch/arm/boards/terasic-de0-nano-soc/board.c b/arch/arm/boards/terasic-de0-nano-soc/board.c
index 8e69319d17..c6036a41f9 100644
--- a/arch/arm/boards/terasic-de0-nano-soc/board.c
+++ b/arch/arm/boards/terasic-de0-nano-soc/board.c
@@ -24,7 +24,7 @@ static int phy_fixup(struct phy_device *dev)
static int socfpga_init(void)
{
- if (!of_machine_is_compatible("terasic,de0-nano-soc"))
+ if (!of_machine_is_compatible("terasic,de0-atlas"))
return 0;
if (IS_ENABLED(CONFIG_PHYLIB))
diff --git a/arch/arm/boards/terasic-sockit/board.c b/arch/arm/boards/terasic-sockit/board.c
index ec68315998..19e67ff933 100644
--- a/arch/arm/boards/terasic-sockit/board.c
+++ b/arch/arm/boards/terasic-sockit/board.c
@@ -25,7 +25,7 @@ static int phy_fixup(struct phy_device *dev)
static int socfpga_console_init(void)
{
- if (!of_machine_is_compatible("terasic,sockit"))
+ if (!of_machine_is_compatible("terasic,socfpga-cyclone5-sockit"))
return 0;
if (IS_ENABLED(CONFIG_PHYLIB))
diff --git a/arch/arm/configs/rpi_defconfig b/arch/arm/configs/rpi_defconfig
index f42b8819af..b823a9a3d0 100644
--- a/arch/arm/configs/rpi_defconfig
+++ b/arch/arm/configs/rpi_defconfig
@@ -96,6 +96,8 @@ CONFIG_WATCHDOG_BCM2835=y
CONFIG_GPIO_RASPBERRYPI_EXP=y
CONFIG_PINCTRL_BCM283X=y
CONFIG_REGULATOR=y
+CONFIG_GENERIC_PHY=y
+CONFIG_USB_NOP_XCEIV=y
CONFIG_FS_EXT4=y
CONFIG_FS_TFTP=y
CONFIG_FS_NFS=y
diff --git a/arch/arm/configs/stm32mp_defconfig b/arch/arm/configs/stm32mp_defconfig
index 49041b1f48..eb3c95b12c 100644
--- a/arch/arm/configs/stm32mp_defconfig
+++ b/arch/arm/configs/stm32mp_defconfig
@@ -82,6 +82,7 @@ CONFIG_CMD_FLASH=y
CONFIG_CMD_GPIO=y
CONFIG_CMD_LED=y
CONFIG_CMD_POWEROFF=y
+CONFIG_CMD_SPI=y
CONFIG_CMD_WD=y
CONFIG_CMD_BAREBOX_UPDATE=y
CONFIG_CMD_OF_DIFF=y
@@ -102,9 +103,12 @@ CONFIG_DRIVER_NET_DESIGNWARE_STM32=y
CONFIG_AT803X_PHY=y
CONFIG_MICREL_PHY=y
CONFIG_REALTEK_PHY=y
-# CONFIG_SPI is not set
+CONFIG_DRIVER_SPI_STM32=y
CONFIG_I2C=y
CONFIG_I2C_STM32=y
+CONFIG_MTD=y
+CONFIG_MTD_M25P80=y
+CONFIG_MTD_SST25L=y
CONFIG_USB_HOST=y
CONFIG_USB_DWC2_HOST=y
CONFIG_USB_DWC2_GADGET=y
@@ -126,6 +130,7 @@ CONFIG_LED_GPIO=y
CONFIG_LED_PWM=y
CONFIG_LED_GPIO_OF=y
CONFIG_LED_TRIGGERS=y
+CONFIG_EEPROM_AT25=y
CONFIG_EEPROM_AT24=y
CONFIG_KEYBOARD_GPIO=y
CONFIG_INPUT_SPECIALKEYS=y
diff --git a/arch/arm/configs/zynq_defconfig b/arch/arm/configs/zynq_defconfig
index a16c57d5ce..38662eeb5d 100644
--- a/arch/arm/configs/zynq_defconfig
+++ b/arch/arm/configs/zynq_defconfig
@@ -45,3 +45,4 @@ CONFIG_DRIVER_NET_MACB=y
# CONFIG_PINCTRL is not set
CONFIG_FS_TFTP=y
CONFIG_DIGEST=y
+CONFIG_GPIO_ZYNQ=y
diff --git a/arch/arm/configs/zynqmp_defconfig b/arch/arm/configs/zynqmp_defconfig
index 2cd8781332..8dd0f40b3d 100644
--- a/arch/arm/configs/zynqmp_defconfig
+++ b/arch/arm/configs/zynqmp_defconfig
@@ -64,3 +64,4 @@ CONFIG_FS_NFS=y
CONFIG_FS_FAT=y
CONFIG_FS_FAT_WRITE=y
CONFIG_DIGEST=y
+CONFIG_GPIO_ZYNQ=y
diff --git a/arch/arm/cpu/psci-client.c b/arch/arm/cpu/psci-client.c
index b5d0d37497..7d5b3768b5 100644
--- a/arch/arm/cpu/psci-client.c
+++ b/arch/arm/cpu/psci-client.c
@@ -15,7 +15,7 @@
static struct restart_handler restart;
-static void __noreturn psci_invoke_noreturn(int function)
+static void __noreturn psci_invoke_noreturn(ulong function)
{
int ret;
diff --git a/arch/arm/dts/rk3568-evb1-v10.dts b/arch/arm/dts/rk3568-evb1-v10.dts
index bd583015e8..6f1eebc619 100644
--- a/arch/arm/dts/rk3568-evb1-v10.dts
+++ b/arch/arm/dts/rk3568-evb1-v10.dts
@@ -472,17 +472,12 @@
partitions {
compatible = "fixed-partitions";
- #address-cells = <1>;
- #size-cells = <1>;
-
- partition@8000 {
- label = "barebox";
- reg = <0x8000 0x400000>;
- };
+ #address-cells = <2>;
+ #size-cells = <2>;
environment_emmc: partition@408000 {
label = "barebox-environment";
- reg = <0x408000 0x8000>;
+ reg = <0x0 0x408000 0x0 0x8000>;
};
};
};
@@ -503,17 +498,12 @@
partitions {
compatible = "fixed-partitions";
- #address-cells = <1>;
- #size-cells = <1>;
-
- partition@8000 {
- label = "barebox";
- reg = <0x8000 0x400000>;
- };
+ #address-cells = <2>;
+ #size-cells = <2>;
environment_sd: partition@408000 {
label = "barebox-environment";
- reg = <0x408000 0x8000>;
+ reg = <0x0 0x408000 0x0 0x8000>;
};
};
};
diff --git a/arch/arm/dts/socfpga_cyclone5_de0_nano_soc.dts b/arch/arm/dts/socfpga_cyclone5_de0_nano_soc.dts
index 427f150fb4..c737b091a7 100644
--- a/arch/arm/dts/socfpga_cyclone5_de0_nano_soc.dts
+++ b/arch/arm/dts/socfpga_cyclone5_de0_nano_soc.dts
@@ -19,9 +19,6 @@
#include "socfpga.dtsi"
/ {
- model = "Terasic DE0-Nano-SoC/Atlas-SoC Kit";
- compatible = "terasic,de0-nano-soc","altr,socfpga-cyclone5", "altr,socfpga";
-
chosen {
stdout-path = &uart0;
diff --git a/arch/arm/dts/socfpga_cyclone5_sockit.dts b/arch/arm/dts/socfpga_cyclone5_sockit.dts
index 23e07c964c..27d2087a33 100644
--- a/arch/arm/dts/socfpga_cyclone5_sockit.dts
+++ b/arch/arm/dts/socfpga_cyclone5_sockit.dts
@@ -19,9 +19,6 @@
#include "socfpga.dtsi"
/ {
- model = "Terasic SoCkit";
- compatible = "terasic,sockit", "altr,socfpga";
-
chosen {
stdout-path = &uart0;
diff --git a/arch/arm/dts/vexpress-v2p-ca9.dts b/arch/arm/dts/vexpress-v2p-ca9.dts
index 8be04b174b..a43628e7ce 100644
--- a/arch/arm/dts/vexpress-v2p-ca9.dts
+++ b/arch/arm/dts/vexpress-v2p-ca9.dts
@@ -69,7 +69,7 @@
};
};
-&{/bus@4000000/motherboard/flash@0,00000000} {
+&{/bus@40000000/motherboard-bus@40000000/flash@0,00000000} {
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
diff --git a/arch/arm/include/asm/barebox-arm-head.h b/arch/arm/include/asm/barebox-arm-head.h
index 8409a77d2e..187d12c9fc 100644
--- a/arch/arm/include/asm/barebox-arm-head.h
+++ b/arch/arm/include/asm/barebox-arm-head.h
@@ -44,6 +44,8 @@ static inline void __barebox_arm_head(void)
"1: b 1b\n"
#endif
#else
+ /* two instruction long function prologue */
+ /* only use if stack is initialized! */
"b 2f\n"
"nop\n"
"nop\n"
diff --git a/arch/arm/mach-mvebu/kwb_bbu.c b/arch/arm/mach-mvebu/kwb_bbu.c
index f79464fe53..3de575740c 100644
--- a/arch/arm/mach-mvebu/kwb_bbu.c
+++ b/arch/arm/mach-mvebu/kwb_bbu.c
@@ -1,6 +1,6 @@
#include <bbu.h>
#include <libfile.h>
-#include <printk.h>
+#include <linux/printk.h>
#include <mach/bbu.h>
diff --git a/arch/arm/mach-rockchip/Kconfig b/arch/arm/mach-rockchip/Kconfig
index 2786fadeaf..1ad7ccedf6 100644
--- a/arch/arm/mach-rockchip/Kconfig
+++ b/arch/arm/mach-rockchip/Kconfig
@@ -1,4 +1,3 @@
-
menu "Rockchip Features"
depends on ARCH_ROCKCHIP
@@ -51,10 +50,13 @@ config MACH_RK3568_EVB
help
Say Y here if you are using a RK3568 EVB
-endmenu
+comment "select board features:"
config ARCH_RK3568_OPTEE
- bool "Build OP-TEE binary into barebox"
+ bool "Build rk3568 OP-TEE binary into barebox"
+ depends on ARCH_RK3568
help
With this option enabled the RK3568 OP-TEE binary is compiled
into barebox and started along with the BL31 trusted firmware.
+
+endmenu
diff --git a/arch/arm/mach-rockchip/Makefile b/arch/arm/mach-rockchip/Makefile
index ebaa3a5450..66bcdba2eb 100644
--- a/arch/arm/mach-rockchip/Makefile
+++ b/arch/arm/mach-rockchip/Makefile
@@ -4,3 +4,4 @@ obj-$(CONFIG_ARCH_RK3188) += rk3188.o
obj-$(CONFIG_ARCH_RK3288) += rk3288.o
obj-pbl-$(CONFIG_ARCH_RK3568) += rk3568.o
obj-$(CONFIG_ARCH_RK3568) += bootm.o
+obj-$(CONFIG_BAREBOX_UPDATE) += bbu.o
diff --git a/arch/arm/mach-rockchip/atf.c b/arch/arm/mach-rockchip/atf.c
index 3c4c9d1c8a..de22784489 100644
--- a/arch/arm/mach-rockchip/atf.c
+++ b/arch/arm/mach-rockchip/atf.c
@@ -33,30 +33,35 @@ static unsigned long load_elf64_image_phdr(const void *elf)
return ehdr->e_entry;
}
-void rk3568_atf_load_bl31(void *fdt)
-{
- const void *bl31_elf, *optee;
- unsigned long bl31;
- size_t bl31_elf_size, optee_size;
- uintptr_t optee_load_address = 0;
-
- get_builtin_firmware(rk3568_bl31_bin, &bl31_elf, &bl31_elf_size);
-
- bl31 = load_elf64_image_phdr(bl31_elf);
-
- if (IS_ENABLED(CONFIG_ARCH_RK3568_OPTEE)) {
- optee_load_address = RK3568_OPTEE_LOAD_ADDRESS;
+#define rockchip_atf_load_bl31(SOC, atf_bin, tee_bin, fdt) do { \
+ const void *bl31_elf, *optee; \
+ unsigned long bl31; \
+ size_t bl31_elf_size, optee_size; \
+ uintptr_t optee_load_address = 0; \
+ \
+ get_builtin_firmware(atf_bin, &bl31_elf, &bl31_elf_size); \
+ \
+ bl31 = load_elf64_image_phdr(bl31_elf); \
+ \
+ if (IS_ENABLED(CONFIG_ARCH_##SOC##_OPTEE)) { \
+ optee_load_address = SOC##_OPTEE_LOAD_ADDRESS; \
+ \
+ get_builtin_firmware(tee_bin, &optee, &optee_size); \
+ \
+ memcpy((void *)optee_load_address, optee, optee_size); \
+ } \
+ \
+ /* Setup an initial stack for EL2 */ \
+ asm volatile("msr sp_el2, %0" : : \
+ "r" (SOC##_BAREBOX_LOAD_ADDRESS - 16) : \
+ "cc"); \
+ \
+ bl31_entry(bl31, optee_load_address, \
+ SOC##_BAREBOX_LOAD_ADDRESS, (uintptr_t)fdt); \
+} while (0) \
- get_builtin_firmware(rk3568_op_tee_bin, &optee, &optee_size);
- memcpy((void *)optee_load_address, optee, optee_size);
- }
-
- /* Setup an initial stack for EL2 */
- asm volatile("msr sp_el2, %0" : :
- "r" (RK3568_BAREBOX_LOAD_ADDRESS - 16) :
- "cc");
-
- bl31_entry(bl31, optee_load_address,
- RK3568_BAREBOX_LOAD_ADDRESS, (uintptr_t)fdt);
+void rk3568_atf_load_bl31(void *fdt)
+{
+ rockchip_atf_load_bl31(RK3568, rk3568_bl31_bin, rk3568_op_tee_bin, fdt);
}
diff --git a/arch/arm/mach-rockchip/bbu.c b/arch/arm/mach-rockchip/bbu.c
new file mode 100644
index 0000000000..71bbac27e8
--- /dev/null
+++ b/arch/arm/mach-rockchip/bbu.c
@@ -0,0 +1,141 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include <common.h>
+#include <malloc.h>
+#include <bbu.h>
+#include <filetype.h>
+#include <errno.h>
+#include <fs.h>
+#include <fcntl.h>
+#include <linux/sizes.h>
+#include <linux/stat.h>
+#include <ioctl.h>
+#include <environment.h>
+#include <mach/bbu.h>
+#include <libfile.h>
+#include <linux/bitfield.h>
+#include <mach/rk3568-regs.h>
+
+/* The MaskROM looks for images on these locations: */
+#define IMG_OFFSET_0 (0 * SZ_1K + SZ_32K)
+#define IMG_OFFSET_1 (512 * SZ_1K + SZ_32K)
+#define IMG_OFFSET_2 (1024 * SZ_1K + SZ_32K)
+#define IMG_OFFSET_3 (1536 * SZ_1K + SZ_32K)
+#define IMG_OFFSET_4 (2048 * SZ_1K + SZ_32K)
+
+#define RK3568_IRAM_ACTIVE_BOOT_SLOT GENMASK(12, 10)
+
+static int rk3568_get_active_slot(void)
+{
+ return FIELD_GET(RK3568_IRAM_ACTIVE_BOOT_SLOT,
+ readl(RK3568_IRAM_BASE + 0x14));
+}
+
+/*
+ * The strategy here is:
+ * The MaskROM iterates over the above five locations until it finds a valid
+ * boot image. The images are protected with sha sums, so any change to an
+ * image on disk is invalidating it. We first check if we have enough space to
+ * write two copies of barebox. To make it simple we only use IMG_OFFSET_0 and
+ * IMG_OFFSET_4 which leaves the maximum size for a single image. When there's
+ * not enough free space on the beginning of the disk we only write a single
+ * image. When we have enough space for two images we first write the inactive one
+ * (leaving the active one intact). Afterwards we write the active one which
+ * leaves the previously written inactive image as a fallback in case writing the
+ * first one gets interrupted.
+ */
+static int rk3568_bbu_mmc_handler(struct bbu_handler *handler,
+ struct bbu_data *data)
+{
+ enum filetype filetype;
+ int ret, fd, wr0, wr1;
+ loff_t space;
+ const char *cdevname;
+
+ filetype = file_detect_type(data->image, data->len);
+ if (filetype != filetype_rockchip_rkns_image) {
+ if (!bbu_force(data, "incorrect image type. Expected: %s, got %s",
+ file_type_to_string(filetype_rockchip_rkns_image),
+ file_type_to_string(filetype)))
+ return -EINVAL;
+ }
+
+ cdevname = devpath_to_name(data->devicefile);
+
+ device_detect_by_name(cdevname);
+
+ ret = bbu_confirm(data);
+ if (ret)
+ return ret;
+
+ space = cdev_unallocated_space(cdev_by_name(cdevname));
+
+ if (space < IMG_OFFSET_0 + data->len) {
+ pr_err("Unallocated space on %s is too small for one image\n",
+ data->devicefile);
+ return -ENOSPC;
+ }
+
+ fd = open(data->devicefile, O_WRONLY);
+ if (fd < 0)
+ return fd;
+
+ if (space >= IMG_OFFSET_4 + data->len) {
+ int slot = rk3568_get_active_slot();
+
+ pr_info("Unallocated space is enough for two copies, doing failsafe update\n");
+
+ if (slot == 0) {
+ wr0 = IMG_OFFSET_4;
+ wr1 = IMG_OFFSET_0;
+ } else {
+ wr0 = IMG_OFFSET_0;
+ wr1 = IMG_OFFSET_4;
+ }
+ } else {
+ wr0 = IMG_OFFSET_0;
+ wr1 = 0;
+ }
+
+ ret = pwrite_full(fd, data->image, data->len, wr0);
+ if (ret < 0) {
+ pr_err("writing to %s failed with %s\n", data->devicefile,
+ strerror(-ret));
+ goto err_close;
+ }
+
+ if (wr1) {
+ ret = pwrite_full(fd, data->image, data->len, wr1);
+ if (ret < 0) {
+ pr_err("writing to %s failed with %s\n", data->devicefile,
+ strerror(-ret));
+ goto err_close;
+ }
+ }
+
+ ret = 0;
+
+err_close:
+ close(fd);
+
+ return ret;
+}
+
+int rk3568_bbu_mmc_register(const char *name, unsigned long flags,
+ const char *devicefile)
+{
+ struct bbu_handler *handler;
+ int ret;
+
+ handler = xzalloc(sizeof(*handler));
+
+ handler->flags = flags;
+ handler->devicefile = devicefile;
+ handler->name = name;
+ handler->handler = rk3568_bbu_mmc_handler;
+
+ ret = bbu_register_handler(handler);
+ if (ret)
+ free(handler);
+
+ return ret;
+}
diff --git a/arch/arm/mach-rockchip/include/mach/bbu.h b/arch/arm/mach-rockchip/include/mach/bbu.h
index e61e0615e2..7fb08a0a9e 100644
--- a/arch/arm/mach-rockchip/include/mach/bbu.h
+++ b/arch/arm/mach-rockchip/include/mach/bbu.h
@@ -3,12 +3,15 @@
#include <bbu.h>
+#ifdef CONFIG_BAREBOX_UPDATE
+int rk3568_bbu_mmc_register(const char *name, unsigned long flags,
+ const char *devicefile);
+#else
static inline int rk3568_bbu_mmc_register(const char *name, unsigned long flags,
const char *devicefile)
{
- return bbu_register_std_file_update(name, flags,
- devicefile, filetype_rockchip_rkns_image);
-
+ return -ENOSYS;
}
+#endif
# endif /* __MACH_ROCKCHIP_BBU_H */
diff --git a/arch/arm/mach-rockchip/include/mach/rockchip.h b/arch/arm/mach-rockchip/include/mach/rockchip.h
index 722b73d6f8..269d113bc3 100644
--- a/arch/arm/mach-rockchip/include/mach/rockchip.h
+++ b/arch/arm/mach-rockchip/include/mach/rockchip.h
@@ -28,6 +28,6 @@ static inline int rk3568_init(void)
}
#endif
-int rk3568_lowlevel_init(void);
+void rk3568_lowlevel_init(void);
#endif /* __MACH_ROCKCHIP_H */
diff --git a/arch/arm/mach-rockchip/rk3568.c b/arch/arm/mach-rockchip/rk3568.c
index fcf3cb7053..234c6d22d1 100644
--- a/arch/arm/mach-rockchip/rk3568.c
+++ b/arch/arm/mach-rockchip/rk3568.c
@@ -90,7 +90,7 @@ static void qos_priority_init(void)
writel(0x303, EBC_PRIORITY_REG);
}
-int rk3568_lowlevel_init(void)
+void rk3568_lowlevel_init(void)
{
/*
* When perform idle operation, corresponding clock can
@@ -135,8 +135,6 @@ int rk3568_lowlevel_init(void)
writel(0x01ff01d1, USBPHY_U2_GRF_CON1);
qos_priority_init();
-
- return 0;
}
struct rk_bootsource {
@@ -145,12 +143,12 @@ struct rk_bootsource {
};
static struct rk_bootsource bootdev_map[] = {
- { .src = BOOTSOURCE_UNKNOWN, .instance = 0 },
- { .src = BOOTSOURCE_NAND, .instance = 0 },
- { .src = BOOTSOURCE_MMC, .instance = 0 },
- { .src = BOOTSOURCE_SPI_NOR, .instance = 0 },
- { .src = BOOTSOURCE_SPI_NAND, .instance = 0 },
- { .src = BOOTSOURCE_MMC, .instance = 1 },
+ [0x1] = { .src = BOOTSOURCE_NAND, .instance = 0 },
+ [0x2] = { .src = BOOTSOURCE_MMC, .instance = 0 },
+ [0x3] = { .src = BOOTSOURCE_SPI_NOR, .instance = 0 },
+ [0x4] = { .src = BOOTSOURCE_SPI_NAND, .instance = 0 },
+ [0x5] = { .src = BOOTSOURCE_MMC, .instance = 1 },
+ [0xa] = { .src = BOOTSOURCE_USB, .instance = 0 },
};
static enum bootsource rk3568_bootsource(void)
diff --git a/arch/arm/mach-rockchip/rockchip.c b/arch/arm/mach-rockchip/rockchip.c
index f0b2484c68..c185b0cc2b 100644
--- a/arch/arm/mach-rockchip/rockchip.c
+++ b/arch/arm/mach-rockchip/rockchip.c
@@ -6,14 +6,13 @@
static int rockchip_init(void)
{
if (of_machine_is_compatible("rockchip,rk3188"))
- rk3188_init();
- else if (of_machine_is_compatible("rockchip,rk3288"))
- rk3288_init();
- else if (of_machine_is_compatible("rockchip,rk3568"))
- rk3568_init();
- else
- pr_err("Unknown rockchip SoC\n");
+ return rk3188_init();
+ if (of_machine_is_compatible("rockchip,rk3288"))
+ return rk3288_init();
+ if (of_machine_is_compatible("rockchip,rk3568"))
+ return rk3568_init();
- return 0;
+ pr_err("Unknown rockchip SoC\n");
+ return -ENODEV;
}
postcore_initcall(rockchip_init);