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:
Nicolas Saenz Julienne 2020-06-29 18:37:23 +02:00 committed by Matthias Brugger
parent d774da08dc
commit f676eb217b
4 changed files with 85 additions and 0 deletions

View file

@ -153,4 +153,15 @@ config RESET_SYSCON
depends on DM_RESET
help
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

View file

@ -24,3 +24,4 @@ obj-$(CONFIG_RESET_SUNXI) += reset-sunxi.o
obj-$(CONFIG_RESET_HISILICON) += reset-hisilicon.o
obj-$(CONFIG_RESET_IMX7) += reset-imx7.o
obj-$(CONFIG_RESET_SYSCON) += reset-syscon.o
obj-$(CONFIG_RESET_RASPBERRYPI) += reset-raspberrypi.o

View file

@ -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,
};

View file

@ -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