summaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-zynqmp/zynqmp-bbu.c
blob: d1197c01dc41e62f5c2e097013fa947b54a5fa8b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (C) 2020 Michael Tretter <m.tretter@pengutronix.de>
 */

#include <common.h>
#include <libfile.h>
#include <mach/zynqmp-bbu.h>

static int zynqmp_bbu_handler(struct bbu_handler *handler,
		struct bbu_data *data)
{
	int ret = 0;

	ret = bbu_confirm(data);
	if (ret)
		return ret;

	ret = copy_file(data->imagefile, data->devicefile, 1);
	if (ret < 0) {
		pr_err("update failed: %s", strerror(-ret));
		return ret;
	}

	return ret;
}

int zynqmp_bbu_register_handler(const char *name, char *devicefile,
		unsigned long flags)
{
	struct bbu_handler *handler;
	int ret = 0;

	if (!name || !devicefile)
		return -EINVAL;

	handler = xzalloc(sizeof(*handler));
	handler->name = name;
	handler->devicefile = devicefile;
	handler->flags = flags;
	handler->handler = zynqmp_bbu_handler;

	ret = bbu_register_handler(handler);
	if (ret)
		free(handler);

	return ret;
}