/* SPDX-License-Identifier: GPL-2.0+ */
/*
 * Copyright (C) 2015 Reinhard Pfau <reinhard.pfau@gdsys.cc>
 */

#ifndef _MVEBU_EFUSE_H
#define _MVEBU_EFUSE_H

struct efuse_val {
	union {
		struct {
			u8 d[8];
		} bytes;
		struct {
			u16 d[4];
		} words;
		struct {
			u32 d[2];
		} dwords;
	};
	u32 lock;
};

#if defined(CONFIG_ARMADA_38X)

enum efuse_line {
	EFUSE_LINE_SECURE_BOOT = 24,
	EFUSE_LINE_PUBKEY_DIGEST_0 = 26,
	EFUSE_LINE_PUBKEY_DIGEST_1 = 27,
	EFUSE_LINE_PUBKEY_DIGEST_2 = 28,
	EFUSE_LINE_PUBKEY_DIGEST_3 = 29,
	EFUSE_LINE_PUBKEY_DIGEST_4 = 30,
	EFUSE_LINE_CSK_0_VALID = 31,
	EFUSE_LINE_CSK_1_VALID = 32,
	EFUSE_LINE_CSK_2_VALID = 33,
	EFUSE_LINE_CSK_3_VALID = 34,
	EFUSE_LINE_CSK_4_VALID = 35,
	EFUSE_LINE_CSK_5_VALID = 36,
	EFUSE_LINE_CSK_6_VALID = 37,
	EFUSE_LINE_CSK_7_VALID = 38,
	EFUSE_LINE_CSK_8_VALID = 39,
	EFUSE_LINE_CSK_9_VALID = 40,
	EFUSE_LINE_CSK_10_VALID = 41,
	EFUSE_LINE_CSK_11_VALID = 42,
	EFUSE_LINE_CSK_12_VALID = 43,
	EFUSE_LINE_CSK_13_VALID = 44,
	EFUSE_LINE_CSK_14_VALID = 45,
	EFUSE_LINE_CSK_15_VALID = 46,
	EFUSE_LINE_FLASH_ID = 47,
	EFUSE_LINE_BOX_ID = 48,

	EFUSE_LINE_MIN = 0,
	EFUSE_LINE_MAX = 63,

	EFUSE_LD0_LINE = 64,
	EFUSE_LD1_LINE = 65,
};

#define EFUSE_LD_WORDS 9

#endif

int mvebu_efuse_init_hw(void);

int mvebu_read_efuse(int nr, struct efuse_val *val);

int mvebu_write_efuse(int nr, struct efuse_val *val);

int mvebu_lock_efuse(int nr);

void mvebu_read_ld_efuse(int ld1, u32 *line);

int mvebu_prog_ld_efuse(int ld1, u32 word, u32 val);

#endif
