diff options
Diffstat (limited to 'configs/platform-v7a/patches/barebox-2022.04.0/0002-clk-add-BCM2835-auxiliary-peripheral-clock-driver.patch')
-rw-r--r-- | configs/platform-v7a/patches/barebox-2022.04.0/0002-clk-add-BCM2835-auxiliary-peripheral-clock-driver.patch | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/configs/platform-v7a/patches/barebox-2022.04.0/0002-clk-add-BCM2835-auxiliary-peripheral-clock-driver.patch b/configs/platform-v7a/patches/barebox-2022.04.0/0002-clk-add-BCM2835-auxiliary-peripheral-clock-driver.patch new file mode 100644 index 0000000..3f6be20 --- /dev/null +++ b/configs/platform-v7a/patches/barebox-2022.04.0/0002-clk-add-BCM2835-auxiliary-peripheral-clock-driver.patch @@ -0,0 +1,119 @@ +From 36f37ded70ed0256f56fb095e7a5854394c30b9e Mon Sep 17 00:00:00 2001 +From: Ahmad Fatoum <a.fatoum@pengutronix.de> +Date: Fri, 22 Apr 2022 15:56:19 +0200 +Subject: [PATCH 2/5] clk: add BCM2835 auxiliary peripheral clock driver + +Commit f6ce1103fdc4 ("ARM: rpi: move clk support to a separate driver") +replaced board code setting up clocks with clkdev_add_physbase() with a +proper cprman driver that registers fixed clocks and can be referenced +from device tree. + +It was not fully equivalent though, because the mini UART's clock was no +longer registered as that is provided by a different clock controller. + +Import the Linux v5.17 bcm2835-aux-clk driver to fix console usage on +Raspberry Pi 3b. + +Fixes: f6ce1103fdc4 ("ARM: rpi: move clk support to a separate driver") +Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> +--- + drivers/clk/Makefile | 1 + + drivers/clk/bcm/Makefile | 2 + + drivers/clk/bcm/clk-bcm2835-aux.c | 66 +++++++++++++++++++++++++++++++ + 3 files changed, 69 insertions(+) + create mode 100644 drivers/clk/bcm/Makefile + create mode 100644 drivers/clk/bcm/clk-bcm2835-aux.c + +diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile +index ee503c1edb5f..baf452de9873 100644 +--- a/drivers/clk/Makefile ++++ b/drivers/clk/Makefile +@@ -26,4 +26,5 @@ obj-$(CONFIG_CLK_SIFIVE) += sifive/ + obj-$(CONFIG_SOC_STARFIVE) += starfive/ + obj-$(CONFIG_COMMON_CLK_STM32F) += clk-stm32f4.o + obj-$(CONFIG_MACH_RPI_COMMON) += clk-rpi.o ++obj-y += bcm/ + obj-$(CONFIG_COMMON_CLK_SCMI) += clk-scmi.o +diff --git a/drivers/clk/bcm/Makefile b/drivers/clk/bcm/Makefile +new file mode 100644 +index 000000000000..1539e9f592a8 +--- /dev/null ++++ b/drivers/clk/bcm/Makefile +@@ -0,0 +1,2 @@ ++# SPDX-License-Identifier: GPL-2.0-only ++obj-$(CONFIG_ARCH_BCM283X) += clk-bcm2835-aux.o +diff --git a/drivers/clk/bcm/clk-bcm2835-aux.c b/drivers/clk/bcm/clk-bcm2835-aux.c +new file mode 100644 +index 000000000000..385cfd5d3f06 +--- /dev/null ++++ b/drivers/clk/bcm/clk-bcm2835-aux.c +@@ -0,0 +1,66 @@ ++// SPDX-License-Identifier: GPL-2.0+ ++/* ++ * Copyright (C) 2015 Broadcom ++ */ ++ ++#include <linux/clk.h> ++#include <io.h> ++#include <of_address.h> ++#include <driver.h> ++#include <init.h> ++#include <dt-bindings/clock/bcm2835-aux.h> ++ ++#define BCM2835_AUXIRQ 0x00 ++#define BCM2835_AUXENB 0x04 ++ ++static int bcm2835_aux_clk_probe(struct device_d *dev) ++{ ++ struct clk_hw_onecell_data *onecell; ++ const char *parent; ++ struct clk *parent_clk; ++ void __iomem *reg, *gate; ++ ++ parent_clk = clk_get(dev, NULL); ++ if (IS_ERR(parent_clk)) ++ return PTR_ERR(parent_clk); ++ parent = __clk_get_name(parent_clk); ++ ++ reg = of_iomap(dev->device_node, 0); ++ if (!reg) ++ return -ENOMEM; ++ ++ onecell = kmalloc(struct_size(onecell, hws, BCM2835_AUX_CLOCK_COUNT), ++ GFP_KERNEL); ++ if (!onecell) ++ return -ENOMEM; ++ onecell->num = BCM2835_AUX_CLOCK_COUNT; ++ ++ gate = reg + BCM2835_AUXENB; ++ onecell->hws[BCM2835_AUX_CLOCK_UART] = ++ clk_hw_register_gate(dev, "aux_uart", parent, 0, gate, 0, 0, NULL); ++ ++ onecell->hws[BCM2835_AUX_CLOCK_SPI1] = ++ clk_hw_register_gate(dev, "aux_spi1", parent, 0, gate, 1, 0, NULL); ++ ++ onecell->hws[BCM2835_AUX_CLOCK_SPI2] = ++ clk_hw_register_gate(dev, "aux_spi2", parent, 0, gate, 2, 0, NULL); ++ ++ return of_clk_add_hw_provider(dev->device_node, of_clk_hw_onecell_get, ++ onecell); ++} ++ ++static const struct of_device_id bcm2835_aux_clk_of_match[] = { ++ { .compatible = "brcm,bcm2835-aux", }, ++ {}, ++}; ++ ++static struct driver_d bcm2835_aux_clk_driver = { ++ .name = "bcm2835-aux-clk", ++ .of_compatible = bcm2835_aux_clk_of_match, ++ .probe = bcm2835_aux_clk_probe, ++}; ++core_platform_driver(bcm2835_aux_clk_driver); ++ ++MODULE_AUTHOR("Eric Anholt <eric@anholt.net>"); ++MODULE_DESCRIPTION("BCM2835 auxiliary peripheral clock driver"); ++MODULE_LICENSE("GPL"); +-- +2.30.2 + |