reset: Add Raspberry Pi 4 firmware reset controller
Raspberry Pi 4's co-processor controls some of the board's HW initialization process, but it's up to Linux to trigger it when relevant. Introduce a reset controller capable of interfacing with RPi4's co-processor that models these firmware initialization routines as reset lines. Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de> Signed-off-by: Matthias Brugger <mbrugger@suse.com>
This commit is contained in:
		
							parent
							
								
									d774da08dc
								
							
						
					
					
						commit
						f676eb217b
					
				| 
						 | 
					@ -153,4 +153,15 @@ config RESET_SYSCON
 | 
				
			||||||
	depends on DM_RESET
 | 
						depends on DM_RESET
 | 
				
			||||||
	help
 | 
						help
 | 
				
			||||||
	  Support generic syscon mapped register reset devices.
 | 
						  Support generic syscon mapped register reset devices.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					config RESET_RASPBERRYPI
 | 
				
			||||||
 | 
						bool "Raspberry Pi 4 Firmware Reset Controller Driver"
 | 
				
			||||||
 | 
						depends on DM_RESET && ARCH_BCM283X
 | 
				
			||||||
 | 
						default USB_XHCI_PCI
 | 
				
			||||||
 | 
						help
 | 
				
			||||||
 | 
						  Raspberry Pi 4's co-processor controls some of the board's HW
 | 
				
			||||||
 | 
						  initialization process, but it's up to Linux to trigger it when
 | 
				
			||||||
 | 
						  relevant. This driver provides a reset controller capable of
 | 
				
			||||||
 | 
						  interfacing with RPi4's co-processor and model these firmware
 | 
				
			||||||
 | 
						  initialization routines as reset lines.
 | 
				
			||||||
endmenu
 | 
					endmenu
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,3 +24,4 @@ obj-$(CONFIG_RESET_SUNXI) += reset-sunxi.o
 | 
				
			||||||
obj-$(CONFIG_RESET_HISILICON) += reset-hisilicon.o
 | 
					obj-$(CONFIG_RESET_HISILICON) += reset-hisilicon.o
 | 
				
			||||||
obj-$(CONFIG_RESET_IMX7) += reset-imx7.o
 | 
					obj-$(CONFIG_RESET_IMX7) += reset-imx7.o
 | 
				
			||||||
obj-$(CONFIG_RESET_SYSCON) += reset-syscon.o
 | 
					obj-$(CONFIG_RESET_SYSCON) += reset-syscon.o
 | 
				
			||||||
 | 
					obj-$(CONFIG_RESET_RASPBERRYPI) += reset-raspberrypi.o
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,60 @@
 | 
				
			||||||
 | 
					// SPDX-License-Identifier: GPL-2.0
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Raspberry Pi 4 firmware reset driver
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Copyright (C) 2020 Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#include <common.h>
 | 
				
			||||||
 | 
					#include <dm.h>
 | 
				
			||||||
 | 
					#include <reset-uclass.h>
 | 
				
			||||||
 | 
					#include <asm/arch/msg.h>
 | 
				
			||||||
 | 
					#include <dt-bindings/reset/raspberrypi,firmware-reset.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int raspberrypi_reset_request(struct reset_ctl *reset_ctl)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (reset_ctl->id >= RASPBERRYPI_FIRMWARE_RESET_NUM_IDS)
 | 
				
			||||||
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int raspberrypi_reset_free(struct reset_ctl *reset_ctl)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int raspberrypi_reset_assert(struct reset_ctl *reset_ctl)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						switch (reset_ctl->id) {
 | 
				
			||||||
 | 
						case RASPBERRYPI_FIRMWARE_RESET_ID_USB:
 | 
				
			||||||
 | 
							bcm2711_notify_vl805_reset();
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int raspberrypi_reset_deassert(struct reset_ctl *reset_ctl)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct reset_ops raspberrypi_reset_ops = {
 | 
				
			||||||
 | 
						.request = raspberrypi_reset_request,
 | 
				
			||||||
 | 
						.rfree = raspberrypi_reset_free,
 | 
				
			||||||
 | 
						.rst_assert = raspberrypi_reset_assert,
 | 
				
			||||||
 | 
						.rst_deassert = raspberrypi_reset_deassert,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const struct udevice_id raspberrypi_reset_ids[] = {
 | 
				
			||||||
 | 
						{ .compatible = "raspberrypi,firmware-reset" },
 | 
				
			||||||
 | 
						{ }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					U_BOOT_DRIVER(raspberrypi_reset) = {
 | 
				
			||||||
 | 
						.name = "raspberrypi-reset",
 | 
				
			||||||
 | 
						.id = UCLASS_RESET,
 | 
				
			||||||
 | 
						.of_match = raspberrypi_reset_ids,
 | 
				
			||||||
 | 
						.ops = &raspberrypi_reset_ops,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,13 @@
 | 
				
			||||||
 | 
					/* SPDX-License-Identifier: GPL-2.0 */
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (c) 2020 Nicolas Saenz Julienne
 | 
				
			||||||
 | 
					 * Author: Nicolas Saenz Julienne <nsaenzjulienne@suse.com>
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef _DT_BINDINGS_RASPBERRYPI_FIRMWARE_RESET_H
 | 
				
			||||||
 | 
					#define _DT_BINDINGS_RASPBERRYPI_FIRMWARE_RESET_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define RASPBERRYPI_FIRMWARE_RESET_ID_USB	0
 | 
				
			||||||
 | 
					#define RASPBERRYPI_FIRMWARE_RESET_NUM_IDS	1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
		Loading…
	
		Reference in New Issue