Newer
Older
minerva / Kernel / Arch / aarch64 / RPi / AUXPeripherals.cpp
@minerva minerva on 13 Jul 1 KB Initial commit
/*
 * Copyright (c) 2024, Sönke Holz <sholz8530@gmail.com>
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */

#include <AK/Singleton.h>
#include <Kernel/Arch/aarch64/RPi/AUXPeripherals.h>
#include <Kernel/Arch/aarch64/RPi/MMIO.h>

namespace Kernel::RPi::AUX {

// bcm2711-peripherals.pdf "2.1.1. AUX registers"
struct AUXRegisters {
    struct {
        u32 mini_uart : 1;
        u32 spi1 : 1;
        u32 spi2 : 1;
        u32 : 29;
    } interrupt_pending;
    struct {
        u32 mini_uart : 1;
        u32 spi1 : 1;
        u32 spi2 : 1;
        u32 : 29;
    } enables;
};
static_assert(AssertSize<AUXRegisters, 8>());

struct AUX {
    AUX();

    Memory::TypedMapping<AUXRegisters volatile> registers;
};

AUX::AUX()
    : registers(MMIO::the().peripheral<AUXRegisters>(0x21'5000).release_value_but_fixme_should_propagate_errors())
{
}

static Singleton<AUX> s_the;

void set_peripheral_enabled(Peripheral peripheral, bool enabled)
{
    switch (peripheral) {
    case Peripheral::MiniUART:
        s_the->registers->enables.mini_uart = enabled;
        break;
    case Peripheral::SPI1:
        s_the->registers->enables.spi1 = enabled;
        break;
    case Peripheral::SPI2:
        s_the->registers->enables.spi2 = enabled;
        break;
    }
}

}