Newer
Older
minerva / Kernel / Arch / aarch64 / RPi / SDHostController.cpp
@minerva minerva on 13 Jul 1 KB Initial commit
/*
 * Copyright (c) 2023, the SerenityOS developers.
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */

#include <AK/Singleton.h>
#include <Kernel/Arch/aarch64/RPi/SDHostController.h>
#include <Kernel/Devices/Storage/StorageManagement.h>
#include <Kernel/Firmware/DeviceTree/DeviceTree.h>
#include <Kernel/Firmware/DeviceTree/Driver.h>
#include <Kernel/Firmware/DeviceTree/Management.h>

namespace Kernel::RPi {

SDHostController::SDHostController(Memory::TypedMapping<SD::HostControlRegisterMap volatile> registers)
    : m_registers(move(registers))
{
}

static constinit Array const compatibles_array = {
    "brcm,bcm2835-sdhci"sv,
};

DEVICETREE_DRIVER(BCM2835SDHCIController, compatibles_array);

// https://www.kernel.org/doc/Documentation/devicetree/bindings/mmc/brcm,iproc-sdhci.yaml
ErrorOr<void> BCM2835SDHCIController::probe(DeviceTree::Device const& device, StringView) const
{
    auto physical_address = TRY(device.get_resource(0)).paddr;

    auto registers = TRY(Memory::map_typed_writable<SD::HostControlRegisterMap volatile>(physical_address));
    auto sdhc = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) SDHostController(move(registers))));
    TRY(sdhc->initialize());

    TRY(StorageManagement::the().add_controller(*sdhc));

    return {};
}

}