]>
git.ipfire.org Git - thirdparty/u-boot.git/blob - board/CZ.NIC/turris_atsha_otp.c
1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2017 Marek BehĂșn <kabel@kernel.org>
4 * Copyright (C) 2016 Tomas Hlavacek <tomas.hlavacek@nic.cz>
10 #include <dm/uclass.h>
11 #include <atsha204a-i2c.h>
13 #include "turris_atsha_otp.h"
15 #define TURRIS_ATSHA_OTP_VERSION 0
16 #define TURRIS_ATSHA_OTP_SERIAL 1
17 #define TURRIS_ATSHA_OTP_MAC0 3
18 #define TURRIS_ATSHA_OTP_MAC1 4
20 extern U_BOOT_DRIVER(atsha204
);
22 static struct udevice
*get_atsha204a_dev(void)
24 /* Cannot be static because BSS does not have to be ready at this early stage */
27 if (uclass_get_device_by_driver(UCLASS_MISC
, DM_DRIVER_GET(atsha204
), &dev
)) {
28 puts("Cannot find ATSHA204A on I2C bus!\n");
35 static void increment_mac(u8
*mac
)
39 for (i
= 5; i
>= 3; i
--) {
46 static void set_mac_if_invalid(int i
, u8
*mac
)
50 if (is_valid_ethaddr(mac
) &&
51 !eth_env_get_enetaddr_by_index("eth", i
, oldmac
))
52 eth_env_set_enetaddr_by_index("eth", i
, mac
);
55 int turris_atsha_otp_init_mac_addresses(int first_idx
)
57 struct udevice
*dev
= get_atsha204a_dev();
58 u8 mac0
[4], mac1
[4], mac
[6];
64 ret
= atsha204a_wakeup(dev
);
68 ret
= atsha204a_read(dev
, ATSHA204A_ZONE_OTP
, false,
69 TURRIS_ATSHA_OTP_MAC0
, mac0
);
73 ret
= atsha204a_read(dev
, ATSHA204A_ZONE_OTP
, false,
74 TURRIS_ATSHA_OTP_MAC1
, mac1
);
87 set_mac_if_invalid((first_idx
+ 0) % 3, mac
);
89 set_mac_if_invalid((first_idx
+ 1) % 3, mac
);
91 set_mac_if_invalid((first_idx
+ 2) % 3, mac
);
96 int turris_atsha_otp_get_serial_number(u32
*version_num
, u32
*serial_num
)
98 struct udevice
*dev
= get_atsha204a_dev();
104 ret
= atsha204a_wakeup(dev
);
108 ret
= atsha204a_read(dev
, ATSHA204A_ZONE_OTP
, false,
109 TURRIS_ATSHA_OTP_VERSION
,
114 ret
= atsha204a_read(dev
, ATSHA204A_ZONE_OTP
, false,
115 TURRIS_ATSHA_OTP_SERIAL
,
120 atsha204a_sleep(dev
);