1 // SPDX-License-Identifier: GPL-2.0+
3 * common reset-controller functions for B&R boards
5 * Copyright (C) 2019 Hannes Schmelzer <oe5hpm@oevsv.at>
6 * B&R Industrial Automation GmbH - http://www.br-automation.com/ *
12 #include <dm/uclass.h>
13 #include <linux/delay.h>
14 #include "br_resetc.h"
16 /* I2C Address of controller */
17 #define RSTCTRL_ADDR_PSOC 0x75
18 #define RSTCTRL_ADDR_STM32 0x60
20 #define BMODE_DEFAULTAR 0
21 #define BMODE_SERVICE 2
26 #if CONFIG_IS_ENABLED(LCD) && !CONFIG_IS_ENABLED(DM_VIDEO)
28 #define LCD_SETCURSOR(x, y) lcd_position_cursor(x, y)
29 #define LCD_PUTS(x) lcd_puts(x)
31 #define LCD_SETCURSOR(x, y)
33 #endif /* CONFIG_LCD */
35 static const char *bootmodeascii[16] = {
36 "BOOT", "reserved", "reserved", "reserved",
37 "RUN", "reserved", "reserved", "reserved",
38 "reserved", "reserved", "reserved", "reserved",
39 "PME", "reserved", "reserved", "DIAG",
43 struct udevice *i2cdev;
47 static struct br_reset_t resetc;
49 __weak int board_boot_key(void)
54 __weak void board_boot_led(unsigned int on)
58 static int resetc_init(void)
60 struct udevice *i2cbus;
63 rc = uclass_get_device_by_seq(UCLASS_I2C, 0, &i2cbus);
65 printf("Cannot find I2C bus #0!\n");
70 rc = dm_i2c_probe(i2cbus,
71 RSTCTRL_ADDR_PSOC, 0, &resetc.i2cdev);
74 rc = dm_i2c_probe(i2cbus,
75 RSTCTRL_ADDR_STM32, 0, &resetc.i2cdev);
79 printf("Warning: cannot probe BuR resetcontroller!\n");
84 int br_resetc_regget(u8 reg, u8 *dst)
94 return dm_i2c_read(resetc.i2cdev, reg, dst, 1);
97 int br_resetc_regset(u8 reg, u8 val)
100 u16 regw = (val << 8) | val;
109 return dm_i2c_write(resetc.i2cdev, reg, (u8 *)®w, 2);
111 return dm_i2c_write(resetc.i2cdev, reg, (u8 *)®w, 1);
114 int br_resetc_bmode(void)
120 unsigned int bmode = 0;
128 rc = dm_i2c_read(resetc.i2cdev, RSTCTRL_ENHSTATUS, ®b, 1);
130 printf("WARN: cannot read ENHSTATUS from resetcontroller!\n");
134 rc = dm_i2c_read(resetc.i2cdev, RSTCTRL_SCRATCHREG0, &scr, 1);
136 printf("WARN: cannot read SCRATCHREG from resetcontroller!\n");
142 /* special bootmode from resetcontroller */
145 } else if (regb & 0x8) {
146 bmode = BMODE_DEFAULTAR;
147 } else if (board_boot_key() != 0) {
154 ("release KEY to enter SERVICE-mode. ");
158 ("release KEY to enter DIAGNOSE-mode. ");
162 ("release KEY to enter BOOT-mode. ");
167 if (board_boot_key() == 0)
176 bmode = BMODE_DEFAULTAR;
182 bmode = BMODE_SERVICE;
185 } else if ((regb & 0x1) || scr == 0xCC) {
195 LCD_PUTS("entering PME-Mode (netscript). ");
198 case BMODE_DEFAULTAR:
199 LCD_PUTS("entering BOOT-mode. ");
203 LCD_PUTS("entering DIAGNOSE-mode. ");
207 LCD_PUTS("entering SERVICE mode. ");
211 LCD_PUTS("loading OS... ");
219 rc = dm_i2c_write(resetc.i2cdev, RSTCTRL_SCRATCHREG0,
222 rc = dm_i2c_write(resetc.i2cdev, RSTCTRL_SCRATCHREG0,
226 printf("WARN: cannot write into resetcontroller!\n");
229 printf("Reset: PSOC controller\n");
231 printf("Reset: STM32 controller\n");
233 printf("Mode: %s\n", bootmodeascii[regw & 0x0F]);
234 env_set_ulong("b_mode", regw & 0x0F);