| // SPDX-License-Identifier: GPL-2.0 |
| /* |
| * Copyright (C) 2023 SiFive |
| */ |
| |
| #include <cache.h> |
| #include <dm.h> |
| #include <malloc.h> |
| #include <asm/io.h> |
| #include <dm/device.h> |
| #include <dm/device-internal.h> |
| |
| #define SIFIVE_PL2CHICKENBIT_OFFSET 0x1000 |
| #define SIFIVE_PL2CHICKENBIT_REGIONCLOCKDISABLE_MASK BIT(3) |
| |
| static int sifive_pl2_probe(struct udevice *dev) |
| { |
| fdt_addr_t base; |
| u32 val; |
| |
| base = dev_read_addr(dev); |
| if (base == FDT_ADDR_T_NONE) |
| return -EINVAL; |
| |
| /* Enable regionClockDisable bit */ |
| val = readl((void __iomem *)(base + SIFIVE_PL2CHICKENBIT_OFFSET)); |
| writel(val & ~SIFIVE_PL2CHICKENBIT_REGIONCLOCKDISABLE_MASK, |
| (void __iomem *)(base + SIFIVE_PL2CHICKENBIT_OFFSET)); |
| |
| return 0; |
| } |
| |
| static const struct udevice_id sifive_pl2_ids[] = { |
| { .compatible = "sifive,pl2cache0" }, |
| { .compatible = "sifive,pl2cache1" }, |
| {} |
| }; |
| |
| U_BOOT_DRIVER(sifive_pl2) = { |
| .name = "sifive_pl2", |
| .id = UCLASS_CACHE, |
| .of_match = sifive_pl2_ids, |
| .probe = sifive_pl2_probe, |
| }; |