diff --git a/arch/arm/mach-imx/imx-bbu-internal.c b/arch/arm/mach-imx/imx-bbu-internal.c index c7cd5b8ed..125415ec8 100644 --- a/arch/arm/mach-imx/imx-bbu-internal.c +++ b/arch/arm/mach-imx/imx-bbu-internal.c @@ -59,7 +59,16 @@ static int imx_bbu_write_device(struct imx_internal_bbu_handler *imx_handler, return fd; if (imx_handler->flags & IMX_INTERNAL_FLAG_ERASE) { - debug("%s: eraseing %s from 0 to 0x%08x\n", __func__, + debug("%s: unprotecting %s from 0 to 0x%08x\n", __func__, + data->devicefile, image_len); + ret = protect(fd, image_len, 0, 0); + if (ret && ret != -ENOSYS) { + printf("unprotecting %s failed with %s\n", data->devicefile, + strerror(-ret)); + goto err_close; + } + + debug("%s: erasing %s from 0 to 0x%08x\n", __func__, data->devicefile, image_len); ret = erase(fd, image_len, 0); if (ret) { @@ -92,6 +101,16 @@ static int imx_bbu_write_device(struct imx_internal_bbu_handler *imx_handler, if (ret < 0) goto err_close; + if (imx_handler->flags & IMX_INTERNAL_FLAG_ERASE) { + debug("%s: protecting %s from 0 to 0x%08x\n", __func__, + data->devicefile, image_len); + ret = protect(fd, image_len, 0, 1); + if (ret && ret != -ENOSYS) { + printf("protecting %s failed with %s\n", data->devicefile, + strerror(-ret)); + } + } + ret = 0; err_close: @@ -351,6 +370,19 @@ static int imx_bbu_internal_v2_update(struct bbu_handler *handler, struct bbu_da return ret; } +static int imx_bbu_external_update(struct bbu_handler *handler, struct bbu_data *data) +{ + struct imx_internal_bbu_handler *imx_handler = + container_of(handler, struct imx_internal_bbu_handler, handler); + int ret; + + ret = imx_bbu_check_prereq(data); + if (ret) + return ret; + + return imx_bbu_write_device(imx_handler, data, data->image, data->len); +} + static struct imx_internal_bbu_handler *__init_handler(const char *name, char *devicefile, unsigned long flags) { @@ -484,3 +516,15 @@ int imx6_bbu_internal_spi_i2c_register_handler(const char *name, char *devicefil return __register_handler(imx_handler); } + +int imx_bbu_external_nor_register_handler(const char *name, char *devicefile, + unsigned long flags) +{ + struct imx_internal_bbu_handler *imx_handler; + + imx_handler = __init_handler(name, devicefile, flags); + imx_handler->flags = IMX_INTERNAL_FLAG_ERASE; + imx_handler->handler.handler = imx_bbu_external_update; + + return __register_handler(imx_handler); +} diff --git a/arch/arm/mach-imx/include/mach/bbu.h b/arch/arm/mach-imx/include/mach/bbu.h index bf6c7dc62..74c334a07 100644 --- a/arch/arm/mach-imx/include/mach/bbu.h +++ b/arch/arm/mach-imx/include/mach/bbu.h @@ -29,6 +29,9 @@ int imx6_bbu_internal_spi_i2c_register_handler(const char *name, char *devicefil int imx6_bbu_nand_register_handler(const char *name, unsigned long flags); +int imx_bbu_external_nor_register_handler(const char *name, char *devicefile, + unsigned long flags); + #else static inline int imx51_bbu_internal_mmc_register_handler(const char *name, char *devicefile, @@ -71,6 +74,12 @@ static inline int imx6_bbu_nand_register_handler(const char *name, unsigned long { return -ENOSYS; } + +static inline int imx_bbu_external_nor_register_handler(const char *name, char *devicefile, + unsigned long flags) +{ + return -ENOSYS; +} #endif #if defined(CONFIG_BAREBOX_UPDATE_IMX_EXTERNAL_NAND)