toradex: configblock: move environment config to common
[u-boot.git] / board / toradex / common / common.c
1 /*
2  * Copyright (c) 2015 Toradex, Inc.
3  *
4  * SPDX-License-Identifier:     GPL-2.0+
5  */
6
7 #include "configblock.h"
8 #include <common.h>
9 #include <g_dnl.h>
10
11 static char trdx_serial_str[9];
12
13 __weak int checkboard_fallback(void)
14 {
15         return 0;
16 }
17
18 #ifdef CONFIG_REVISION_TAG
19 #ifdef CONFIG_TRDX_CFG_BLOCK
20 u32 get_board_rev(void)
21 {
22         /* Check validity */
23         if (!trdx_hw_tag.ver_major)
24                 return 0;
25
26         return ((trdx_hw_tag.ver_major & 0xff) << 8) |
27                 ((trdx_hw_tag.ver_minor & 0xf) << 4) |
28                 ((trdx_hw_tag.ver_assembly & 0xf) + 0xa);
29 }
30 #else
31 u32 get_board_rev(void)
32 {
33         return 0;
34 }
35 #endif /* CONFIG_TRDX_CFG_BLOCK */
36 #endif /* CONFIG_REVISION_TAG */
37
38 #ifdef CONFIG_SERIAL_TAG
39 #ifdef CONFIG_TRDX_CFG_BLOCK
40 void get_board_serial(struct tag_serialnr *serialnr)
41 {
42         int array[8];
43         unsigned int serial = trdx_serial;
44         int i;
45
46         serialnr->low = 0;
47         serialnr->high = 0;
48
49         /* Check validity */
50         if (serial) {
51                 /*
52                  * Convert to Linux serial number format (hexadecimal coded
53                  * decimal)
54                  */
55                 i = 7;
56                 while (serial) {
57                         array[i--] = serial % 10;
58                         serial /= 10;
59                 }
60                 while (i >= 0)
61                         array[i--] = 0;
62                 serial = array[0];
63                 for (i = 1; i < 8; i++) {
64                         serial *= 16;
65                         serial += array[i];
66                 }
67
68                 serialnr->low = serial;
69         }
70 }
71 #else
72 u32 get_board_rev(void)
73 {
74         return 0;
75 }
76 #endif /* CONFIG_TRDX_CFG_BLOCK */
77 #endif /* CONFIG_SERIAL_TAG */
78
79 int checkboard(void)
80 {
81 #ifdef CONFIG_TRDX_CFG_BLOCK
82         unsigned char ethaddr[6];
83
84         if (read_trdx_cfg_block()) {
85                 printf("Missing Toradex config block\n");
86                 checkboard_fallback();
87                 return 0;
88         }
89
90         /* board serial-number */
91         sprintf(trdx_serial_str, "%08u", trdx_serial);
92         setenv("serial#", trdx_serial_str);
93
94         /*
95          * Check if environment contains a valid MAC address,
96          * set the one from config block if not
97          */
98         if (!eth_getenv_enetaddr("ethaddr", ethaddr))
99                 eth_setenv_enetaddr("ethaddr", (u8 *)&trdx_eth_addr);
100
101 #ifdef CONFIG_TRDX_CFG_BLOCK_2ND_ETHADDR
102         if (!eth_getenv_enetaddr("eth1addr", ethaddr)) {
103                 /*
104                  * Secondary MAC address is allocated from block
105                  * 0x100000 higher then the first MAC address
106                  */
107                 memcpy(ethaddr, &trdx_eth_addr, 6);
108                 ethaddr[3] += 0x10;
109                 eth_setenv_enetaddr("eth1addr", ethaddr);
110         }
111 #endif
112
113         printf("Model: Toradex %s V%d.%d%c, Serial# %08u\n",
114                 toradex_modules[trdx_hw_tag.prodid],
115                 trdx_hw_tag.ver_major,
116                 trdx_hw_tag.ver_minor,
117                 (char)trdx_hw_tag.ver_assembly + 'A',
118                 trdx_serial);
119 #else
120         checkboard_fallback();
121 #endif
122         return 0;
123 }
124
125 #ifdef CONFIG_USBDOWNLOAD_GADGET
126 int g_dnl_bind_fixup(struct usb_device_descriptor *dev, const char *name)
127 {
128         unsigned short usb_pid = 0xffff;
129
130 #ifdef CONFIG_TRDX_CONFIGBLOCK
131         usb_pid = 0x4000 + trdx_hw_tag.prodid;
132 #endif
133         put_unaligned(usb_pid, &dev->idProduct);
134
135         return 0;
136 }
137 #endif /* CONFIG_USBDOWNLOAD_GADGET */