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);