diff options
author | Lucas Stach <dev@lynxeye.de> | 2015-03-03 20:46:20 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2015-03-04 11:34:08 +0100 |
commit | 4266bfcf4724496e19894ea7c85e40654ad5fecb (patch) | |
tree | 5696e03668ad9dba3dde6472b5eb7323b075d1e2 /arch/arm/mach-tegra | |
parent | 21294b0516e39c433f117d4263f4bb4c867700e3 (diff) | |
download | barebox-4266bfcf4724496e19894ea7c85e40654ad5fecb.tar.gz barebox-4266bfcf4724496e19894ea7c85e40654ad5fecb.tar.xz |
ARM: tegra: add eMMC barebox update handler
Signed-off-by: Lucas Stach <dev@lynxeye.de>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/arm/mach-tegra')
-rw-r--r-- | arch/arm/mach-tegra/Makefile | 1 | ||||
-rw-r--r-- | arch/arm/mach-tegra/include/mach/tegra-bbu.h | 28 | ||||
-rw-r--r-- | arch/arm/mach-tegra/tegra-bbu.c | 74 |
3 files changed, 103 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/Makefile b/arch/arm/mach-tegra/Makefile index e68156a772..7c4c1fd137 100644 --- a/arch/arm/mach-tegra/Makefile +++ b/arch/arm/mach-tegra/Makefile @@ -13,3 +13,4 @@ lwl-y += tegra_maincomplex_init.o obj-y += tegra20.o obj-y += tegra20-pmc.o obj-y += tegra20-timer.o +obj-$(CONFIG_BAREBOX_UPDATE) += tegra-bbu.o diff --git a/arch/arm/mach-tegra/include/mach/tegra-bbu.h b/arch/arm/mach-tegra/include/mach/tegra-bbu.h new file mode 100644 index 0000000000..32e2861ac6 --- /dev/null +++ b/arch/arm/mach-tegra/include/mach/tegra-bbu.h @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2015 Lucas Stach <l.stach@pengutronix.de> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <bbu.h> + +#ifdef CONFIG_BAREBOX_UPDATE +int tegra_bbu_register_emmc_handler(const char *name, char *devicefile, + unsigned long flags); +#else +static int tegra_bbu_register_emmc_handler(const char *name, char *devicefile, + unsigned long flags) +{ + return 0; +}; +#endif diff --git a/arch/arm/mach-tegra/tegra-bbu.c b/arch/arm/mach-tegra/tegra-bbu.c new file mode 100644 index 0000000000..089e6c736a --- /dev/null +++ b/arch/arm/mach-tegra/tegra-bbu.c @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2015 Lucas Stach <l.stach@pengutronix.de> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <common.h> +#include <fcntl.h> +#include <fs.h> +#include <mach/tegra-bbu.h> +#include <malloc.h> + +static int tegra_bbu_emmc_handler(struct bbu_handler *handler, + struct bbu_data *data) +{ + + int fd, ret; + + if (file_detect_type(data->image + 0x4000, data->len) != + filetype_arm_barebox && + !bbu_force(data, "Not an ARM barebox image")) + return -EINVAL; + + ret = bbu_confirm(data); + if (ret) + return ret; + + fd = open(data->devicefile, O_WRONLY); + if (fd < 0) + return fd; + + ret = write(fd, data->image, data->len); + if (ret < 0) { + pr_err("writing update to %s failed with %s\n", + data->devicefile, strerror(-ret)); + goto err_close; + } + + ret = 0; + +err_close: + close(fd); + + return ret; +} + +int tegra_bbu_register_emmc_handler(const char *name, char *devicefile, + unsigned long flags) +{ + struct bbu_handler *handler; + int ret = 0; + + handler = xzalloc(sizeof(*handler)); + handler->name = name; + handler->devicefile = devicefile; + handler->flags = flags; + handler->handler = tegra_bbu_emmc_handler; + + ret = bbu_register_handler(handler); + if (ret) + free(handler); + + return ret; +} |