aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/clk
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/clk')
-rw-r--r--drivers/clk/Kconfig14
-rw-r--r--drivers/clk/Makefile3
-rw-r--r--drivers/clk/bcm/clk-bcm2835.c210
-rw-r--r--drivers/clk/clk-hifiberry-dachd.c331
-rw-r--r--drivers/clk/clk-hifiberry-dacpro.c180
-rw-r--r--drivers/clk/clk-rp1-sdio.c599
-rw-r--r--drivers/clk/clk-rp1.c1697
7 files changed, 2002 insertions, 1032 deletions
diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig
index 3a1611008e48..cc95f10ed01b 100644
--- a/drivers/clk/Kconfig
+++ b/drivers/clk/Kconfig
@@ -89,13 +89,19 @@ config COMMON_CLK_RK808
config COMMON_CLK_RP1
tristate "Raspberry Pi RP1-based clock support"
- depends on MISC_RP1 || COMPILE_TEST
+ depends on MISC_RP1 || MFD_RP1 || COMPILE_TEST
default MISC_RP1
help
Enable common clock framework support for Raspberry Pi RP1.
This multi-function device has 3 main PLLs and several clock
generators to drive the internal sub-peripherals.
+config COMMON_CLK_RP1_SDIO
+ tristate "Clock driver for the RP1 SDIO interfaces"
+ depends on MFD_RP1
+ help
+ SDIO clock driver for the RP1 support chip
+
config COMMON_CLK_HI655X
tristate "Clock driver for Hi655x" if EXPERT
depends on (MFD_HI655X_PMIC || COMPILE_TEST)
@@ -106,6 +112,12 @@ config COMMON_CLK_HI655X
multi-function device has one fixed-rate oscillator, clocked
at 32KHz.
+config COMMON_CLK_HIFIBERRY_DACPLUSHD
+ tristate
+
+config COMMON_CLK_HIFIBERRY_DACPRO
+ tristate
+
config COMMON_CLK_SCMI
tristate "Clock driver controlled via SCMI interface"
depends on ARM_SCMI_PROTOCOL || COMPILE_TEST
diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile
index b74a1767ca27..2c81320a0ad0 100644
--- a/drivers/clk/Makefile
+++ b/drivers/clk/Makefile
@@ -72,6 +72,8 @@ obj-$(CONFIG_COMMON_CLK_LAN966X) += clk-lan966x.o
obj-$(CONFIG_COMMON_CLK_LOCHNAGAR) += clk-lochnagar.o
obj-$(CONFIG_MACH_LOONGSON32) += clk-loongson1.o
obj-$(CONFIG_COMMON_CLK_LOONGSON2) += clk-loongson2.o
+obj-$(CONFIG_COMMON_CLK_HIFIBERRY_DACPRO) += clk-hifiberry-dacpro.o
+obj-$(CONFIG_COMMON_CLK_HIFIBERRY_DACPLUSHD) += clk-hifiberry-dachd.o
obj-$(CONFIG_COMMON_CLK_MAX77686) += clk-max77686.o
obj-$(CONFIG_COMMON_CLK_MAX9485) += clk-max9485.o
obj-$(CONFIG_ARCH_MILBEAUT_M10V) += clk-milbeaut.o
@@ -86,6 +88,7 @@ obj-$(CONFIG_COMMON_CLK_PWM) += clk-pwm.o
obj-$(CONFIG_CLK_QORIQ) += clk-qoriq.o
obj-$(CONFIG_COMMON_CLK_RK808) += clk-rk808.o
obj-$(CONFIG_COMMON_CLK_RP1) += clk-rp1.o
+obj-$(CONFIG_COMMON_CLK_RP1_SDIO) += clk-rp1-sdio.o
obj-$(CONFIG_COMMON_CLK_RPMI) += clk-rpmi.o
obj-$(CONFIG_COMMON_CLK_HI655X) += clk-hi655x.o
obj-$(CONFIG_COMMON_CLK_S2MPS11) += clk-s2mps11.o
diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c
index 02215ea79403..9ba61a9d9890 100644
--- a/drivers/clk/bcm/clk-bcm2835.c
+++ b/drivers/clk/bcm/clk-bcm2835.c
@@ -36,6 +36,7 @@
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <dt-bindings/clock/bcm2835.h>
+#include <soc/bcm2835/raspberrypi-firmware.h>
#define CM_PASSWORD 0x5a000000
@@ -106,6 +107,7 @@
#define CM_UARTDIV 0x0f4
#define CM_VECCTL 0x0f8
#define CM_VECDIV 0x0fc
+#define CM_DSI0HSCK 0x120
#define CM_PULSECTL 0x190
#define CM_PULSEDIV 0x194
#define CM_SDCCTL 0x1a8
@@ -296,6 +298,8 @@
#define SOC_BCM2711 BIT(1)
#define SOC_ALL (SOC_BCM2835 | SOC_BCM2711)
+#define VCMSG_ID_CORE_CLOCK 4
+
/*
* Names of clocks used within the driver that need to be replaced
* with an external parent's name. This array is in the order that
@@ -314,6 +318,7 @@ static const char *const cprman_parent_names[] = {
struct bcm2835_cprman {
struct device *dev;
void __iomem *regs;
+ struct rpi_firmware *fw;
spinlock_t regs_lock; /* spinlock for all clocks */
unsigned int soc;
@@ -648,15 +653,17 @@ static int bcm2835_pll_on(struct clk_hw *hw)
spin_unlock(&cprman->regs_lock);
/* Wait for the PLL to lock. */
- timeout = ktime_add_ns(ktime_get(), LOCK_TIMEOUT_NS);
- while (!(cprman_read(cprman, CM_LOCK) & data->lock_mask)) {
- if (ktime_after(ktime_get(), timeout)) {
- dev_err(cprman->dev, "%s: couldn't lock PLL\n",
- clk_hw_get_name(hw));
- return -ETIMEDOUT;
- }
+ if (strcmp(data->name, "pllh")) {
+ timeout = ktime_add_ns(ktime_get(), LOCK_TIMEOUT_NS);
+ while (!(cprman_read(cprman, CM_LOCK) & data->lock_mask)) {
+ if (ktime_after(ktime_get(), timeout)) {
+ dev_err(cprman->dev, "%s: couldn't lock PLL\n",
+ clk_hw_get_name(hw));
+ return -ETIMEDOUT;
+ }
- cpu_relax();
+ cpu_relax();
+ }
}
cprman_write(cprman, data->a2w_ctrl_reg,
@@ -1044,6 +1051,30 @@ static unsigned long bcm2835_clock_get_rate(struct clk_hw *hw,
return rate;
}
+static unsigned long bcm2835_clock_get_rate_vpu(struct clk_hw *hw,
+ unsigned long parent_rate)
+{
+ struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw);
+ struct bcm2835_cprman *cprman = clock->cprman;
+
+ if (cprman->fw) {
+ struct {
+ u32 id;
+ u32 val;
+ } packet;
+
+ packet.id = VCMSG_ID_CORE_CLOCK;
+ packet.val = 0;
+
+ if (!rpi_firmware_property(cprman->fw,
+ RPI_FIRMWARE_GET_MAX_CLOCK_RATE,
+ &packet, sizeof(packet)))
+ return packet.val;
+ }
+
+ return bcm2835_clock_get_rate(hw, parent_rate);
+}
+
static void bcm2835_clock_wait_busy(struct bcm2835_clock *clock)
{
struct bcm2835_cprman *cprman = clock->cprman;
@@ -1102,8 +1133,10 @@ static int bcm2835_clock_on(struct clk_hw *hw)
return 0;
}
-static int bcm2835_clock_set_rate(struct clk_hw *hw,
- unsigned long rate, unsigned long parent_rate)
+static int bcm2835_clock_set_rate_and_parent(struct clk_hw *hw,
+ unsigned long rate,
+ unsigned long parent_rate,
+ u8 parent)
{
struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw);
struct bcm2835_cprman *cprman = clock->cprman;
@@ -1113,15 +1146,24 @@ static int bcm2835_clock_set_rate(struct clk_hw *hw,
spin_lock(&cprman->regs_lock);
- /*
- * Setting up frac support
- *
- * In principle it is recommended to stop/start the clock first,
- * but as we set CLK_SET_RATE_GATE during registration of the
- * clock this requirement should be take care of by the
- * clk-framework.
+ ctl = cprman_read(cprman, data->ctl_reg);
+
+ /* If the clock is running, we have to pause clock generation while
+ * updating the control and div regs. This is glitchless (no clock
+ * signals generated faster than the rate) but each reg access is two
+ * OSC cycles so the clock will slow down for a moment.
*/
- ctl = cprman_read(cprman, data->ctl_reg) & ~CM_FRAC;
+ if (ctl & CM_ENABLE) {
+ cprman_write(cprman, data->ctl_reg, ctl & ~CM_ENABLE);
+ bcm2835_clock_wait_busy(clock);
+ }
+
+ if (parent != 0xff) {
+ ctl &= ~(CM_SRC_MASK << CM_SRC_SHIFT);
+ ctl |= parent << CM_SRC_SHIFT;
+ }
+
+ ctl &= ~CM_FRAC;
ctl |= (div & CM_DIV_FRAC_MASK) ? CM_FRAC : 0;
cprman_write(cprman, data->ctl_reg, ctl);
@@ -1132,6 +1174,12 @@ static int bcm2835_clock_set_rate(struct clk_hw *hw,
return 0;
}
+static int bcm2835_clock_set_rate(struct clk_hw *hw,
+ unsigned long rate, unsigned long parent_rate)
+{
+ return bcm2835_clock_set_rate_and_parent(hw, rate, parent_rate, 0xff);
+}
+
static bool
bcm2835_clk_is_pllc(struct clk_hw *hw)
{
@@ -1315,6 +1363,7 @@ static const struct clk_ops bcm2835_clock_clk_ops = {
.unprepare = bcm2835_clock_off,
.recalc_rate = bcm2835_clock_get_rate,
.set_rate = bcm2835_clock_set_rate,
+ .set_rate_and_parent = bcm2835_clock_set_rate_and_parent,
.determine_rate = bcm2835_clock_determine_rate,
.set_parent = bcm2835_clock_set_parent,
.get_parent = bcm2835_clock_get_parent,
@@ -1332,7 +1381,7 @@ static int bcm2835_vpu_clock_is_on(struct clk_hw *hw)
*/
static const struct clk_ops bcm2835_vpu_clock_clk_ops = {
.is_prepared = bcm2835_vpu_clock_is_on,
- .recalc_rate = bcm2835_clock_get_rate,
+ .recalc_rate = bcm2835_clock_get_rate_vpu,
.set_rate = bcm2835_clock_set_rate,
.determine_rate = bcm2835_clock_determine_rate,
.set_parent = bcm2835_clock_set_parent,
@@ -1340,6 +1389,8 @@ static const struct clk_ops bcm2835_vpu_clock_clk_ops = {
.debug_init = bcm2835_clock_debug_init,
};
+static bool bcm2835_clk_is_claimed(const char *name);
+
static struct clk_hw *bcm2835_register_pll(struct bcm2835_cprman *cprman,
const void *data)
{
@@ -1357,6 +1408,9 @@ static struct clk_hw *bcm2835_register_pll(struct bcm2835_cprman *cprman,
init.ops = &bcm2835_pll_clk_ops;
init.flags = pll_data->flags | CLK_IGNORE_UNUSED;
+ if (!bcm2835_clk_is_claimed(pll_data->name))
+ init.flags |= CLK_IS_CRITICAL;
+
pll = kzalloc(sizeof(*pll), GFP_KERNEL);
if (!pll)
return NULL;
@@ -1412,6 +1466,13 @@ bcm2835_register_pll_divider(struct bcm2835_cprman *cprman,
divider->div.hw.init = &init;
divider->div.table = NULL;
+ if (!(cprman_read(cprman, divider_data->cm_reg) & divider_data->hold_mask)) {
+ if (!bcm2835_clk_is_claimed(divider_data->source_pll))
+ init.flags |= CLK_IS_CRITICAL;
+ if (!bcm2835_clk_is_claimed(divider_data->name))
+ divider->div.flags |= CLK_IS_CRITICAL;
+ }
+
divider->cprman = cprman;
divider->data = divider_data;
@@ -1466,6 +1527,15 @@ static struct clk_hw *bcm2835_register_clock(struct bcm2835_cprman *cprman,
init.flags = clock_data->flags | CLK_IGNORE_UNUSED;
/*
+ * Some GPIO clocks for ethernet/wifi PLLs are marked as
+ * critical (since some platforms use them), but if the
+ * firmware didn't have them turned on then they clearly
+ * aren't actually critical.
+ */
+ if ((cprman_read(cprman, clock_data->ctl_reg) & CM_ENABLE) == 0)
+ init.flags &= ~CLK_IS_CRITICAL;
+
+ /*
* Pass the CLK_SET_RATE_PARENT flag if we are allowed to propagate
* rate changes on at least of the parents.
*/
@@ -1476,7 +1546,6 @@ static struct clk_hw *bcm2835_register_clock(struct bcm2835_cprman *cprman,
init.ops = &bcm2835_vpu_clock_clk_ops;
} else {
init.ops = &bcm2835_clock_clk_ops;
- init.flags |= CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE;
/* If the clock wasn't actually enabled at boot, it's not
* critical.
@@ -1701,16 +1770,12 @@ static const struct bcm2835_clk_desc clk_desc_array[] = {
.hold_mask = CM_PLLA_HOLDCORE,
.fixed_divider = 1,
.flags = CLK_SET_RATE_PARENT),
- [BCM2835_PLLA_PER] = REGISTER_PLL_DIV(
- SOC_ALL,
- .name = "plla_per",
- .source_pll = "plla",
- .cm_reg = CM_PLLA,
- .a2w_reg = A2W_PLLA_PER,
- .load_mask = CM_PLLA_LOADPER,
- .hold_mask = CM_PLLA_HOLDPER,
- .fixed_divider = 1,
- .flags = CLK_SET_RATE_PARENT),
+
+ /*
+ * PLLA_PER is used for gpu clocks. Controlled by firmware, see
+ * clk-raspberrypi.c.
+ */
+
[BCM2835_PLLA_DSI0] = REGISTER_PLL_DIV(
SOC_ALL,
.name = "plla_dsi0",
@@ -2011,14 +2076,12 @@ static const struct bcm2835_clk_desc clk_desc_array[] = {
.int_bits = 6,
.frac_bits = 0,
.tcnt_mux = 3),
- [BCM2835_CLOCK_V3D] = REGISTER_VPU_CLK(
- SOC_ALL,
- .name = "v3d",
- .ctl_reg = CM_V3DCTL,
- .div_reg = CM_V3DDIV,
- .int_bits = 4,
- .frac_bits = 8,
- .tcnt_mux = 4),
+
+ /*
+ * CLOCK_V3D is used for v3d clock. Controlled by firmware, see
+ * clk-raspberrypi.c.
+ */
+
/*
* VPU clock. This doesn't have an enable bit, since it drives
* the bus for everything else, and is special so it doesn't need
@@ -2181,21 +2244,6 @@ static const struct bcm2835_clk_desc clk_desc_array[] = {
.tcnt_mux = 28,
.round_up = true),
- /* TV encoder clock. Only operating frequency is 108Mhz. */
- [BCM2835_CLOCK_VEC] = REGISTER_PER_CLK(
- SOC_ALL,
- .name = "vec",
- .ctl_reg = CM_VECCTL,
- .div_reg = CM_VECDIV,
- .int_bits = 4,
- .frac_bits = 0,
- /*
- * Allow rate change propagation only on PLLH_AUX which is
- * assigned index 7 in the parent array.
- */
- .set_rate_parent = BIT(7),
- .tcnt_mux = 29),
-
/* dsi clocks */
[BCM2835_CLOCK_DSI0E] = REGISTER_PER_CLK(
SOC_ALL,
@@ -2245,6 +2293,8 @@ static const struct bcm2835_clk_desc clk_desc_array[] = {
.ctl_reg = CM_PERIICTL),
};
+static bool bcm2835_clk_claimed[ARRAY_SIZE(clk_desc_array)];
+
/*
* Permanently take a reference on the parent of the SDRAM clock.
*
@@ -2264,6 +2314,21 @@ static int bcm2835_mark_sdc_parent_critical(struct clk *sdc)
return clk_prepare_enable(parent);
}
+static bool bcm2835_clk_is_claimed(const char *name)
+{
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(clk_desc_array); i++) {
+ if (clk_desc_array[i].data) {
+ const char *clk_name = *(const char **)(clk_desc_array[i].data);
+ if (!strcmp(name, clk_name))
+ return bcm2835_clk_claimed[i];
+ }
+ }
+
+ return false;
+}
+
static int bcm2835_clk_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
@@ -2272,7 +2337,9 @@ static int bcm2835_clk_probe(struct platform_device *pdev)
const struct bcm2835_clk_desc *desc;
const size_t asize = ARRAY_SIZE(clk_desc_array);
const struct cprman_plat_data *pdata;
+ struct device_node *fw_node;
size_t i;
+ u32 clk_id;
int ret;
pdata = of_device_get_match_data(&pdev->dev);
@@ -2291,6 +2358,24 @@ static int bcm2835_clk_probe(struct platform_device *pdev)
if (IS_ERR(cprman->regs))
return PTR_ERR(cprman->regs);
+ /* Mux DSI0 clock to PLLD */
+ cprman_write(cprman, CM_DSI0HSCK, 1);
+
+ fw_node = of_parse_phandle(dev->of_node, "firmware", 0);
+ if (fw_node) {
+ struct rpi_firmware *fw = rpi_firmware_get(fw_node);
+ if (!fw)
+ return -EPROBE_DEFER;
+ cprman->fw = fw;
+ }
+
+ memset(bcm2835_clk_claimed, 0, sizeof(bcm2835_clk_claimed));
+ for (i = 0;
+ !of_property_read_u32_index(pdev->dev.of_node, "claim-clocks",
+ i, &clk_id);
+ i++)
+ bcm2835_clk_claimed[clk_id]= true;
+
memcpy(cprman->real_parent_names, cprman_parent_names,
sizeof(cprman_parent_names));
of_clk_parent_fill(dev->of_node, cprman->real_parent_names,
@@ -2324,8 +2409,15 @@ static int bcm2835_clk_probe(struct platform_device *pdev)
if (ret)
return ret;
- return of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get,
+ ret = of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get,
&cprman->onecell);
+ if (ret)
+ return ret;
+
+ /* note that we have registered all the clocks */
+ dev_dbg(dev, "registered %zd clocks\n", asize);
+
+ return 0;
}
static const struct cprman_plat_data cprman_bcm2835_plat_data = {
@@ -2351,7 +2443,15 @@ static struct platform_driver bcm2835_clk_driver = {
.probe = bcm2835_clk_probe,
};
-builtin_platform_driver(bcm2835_clk_driver);
+static int __init __bcm2835_clk_driver_init(void)
+{
+ return platform_driver_register(&bcm2835_clk_driver);
+}
+#ifdef CONFIG_IMA
+subsys_initcall(__bcm2835_clk_driver_init);
+#else
+postcore_initcall(__bcm2835_clk_driver_init);
+#endif
MODULE_AUTHOR("Eric Anholt <[email protected]>");
MODULE_DESCRIPTION("BCM2835 clock driver");
diff --git a/drivers/clk/clk-hifiberry-dachd.c b/drivers/clk/clk-hifiberry-dachd.c
new file mode 100644
index 000000000000..5280b5100559
--- /dev/null
+++ b/drivers/clk/clk-hifiberry-dachd.c
@@ -0,0 +1,331 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Clock Driver for HiFiBerry DAC+ HD
+ *
+ * Author: Joerg Schambacher, i2Audio GmbH for HiFiBerry
+ * Copyright 2020
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/clk.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/slab.h>
+#include <linux/platform_device.h>
+#include <linux/i2c.h>
+#include <linux/regmap.h>
+
+#define NO_PLL_RESET 0
+#define PLL_RESET 1
+#define HIFIBERRY_PLL_MAX_REGISTER 256
+#define DEFAULT_RATE 44100
+
+static struct reg_default hifiberry_pll_reg_defaults[] = {
+ {0x02, 0x53}, {0x03, 0x00}, {0x07, 0x20}, {0x0F, 0x00},
+ {0x10, 0x0D}, {0x11, 0x1D}, {0x12, 0x0D}, {0x13, 0x8C},
+ {0x14, 0x8C}, {0x15, 0x8C}, {0x16, 0x8C}, {0x17, 0x8C},
+ {0x18, 0x2A}, {0x1C, 0x00}, {0x1D, 0x0F}, {0x1F, 0x00},
+ {0x2A, 0x00}, {0x2C, 0x00}, {0x2F, 0x00}, {0x30, 0x00},
+ {0x31, 0x00}, {0x32, 0x00}, {0x34, 0x00}, {0x37, 0x00},
+ {0x38, 0x00}, {0x39, 0x00}, {0x3A, 0x00}, {0x3B, 0x01},
+ {0x3E, 0x00}, {0x3F, 0x00}, {0x40, 0x00}, {0x41, 0x00},
+ {0x5A, 0x00}, {0x5B, 0x00}, {0x95, 0x00}, {0x96, 0x00},
+ {0x97, 0x00}, {0x98, 0x00}, {0x99, 0x00}, {0x9A, 0x00},
+ {0x9B, 0x00}, {0xA2, 0x00}, {0xA3, 0x00}, {0xA4, 0x00},
+ {0xB7, 0x92},
+ {0x1A, 0x3D}, {0x1B, 0x09}, {0x1E, 0xF3}, {0x20, 0x13},
+ {0x21, 0x75}, {0x2B, 0x04}, {0x2D, 0x11}, {0x2E, 0xE0},
+ {0x3D, 0x7A},
+ {0x35, 0x9D}, {0x36, 0x00}, {0x3C, 0x42},
+ { 177, 0xAC},
+};
+static struct reg_default common_pll_regs[HIFIBERRY_PLL_MAX_REGISTER];
+static int num_common_pll_regs;
+static struct reg_default dedicated_192k_pll_regs[HIFIBERRY_PLL_MAX_REGISTER];
+static int num_dedicated_192k_pll_regs;
+static struct reg_default dedicated_96k_pll_regs[HIFIBERRY_PLL_MAX_REGISTER];
+static int num_dedicated_96k_pll_regs;
+static struct reg_default dedicated_48k_pll_regs[HIFIBERRY_PLL_MAX_REGISTER];
+static int num_dedicated_48k_pll_regs;
+static struct reg_default dedicated_176k4_pll_regs[HIFIBERRY_PLL_MAX_REGISTER];
+static int num_dedicated_176k4_pll_regs;
+static struct reg_default dedicated_88k2_pll_regs[HIFIBERRY_PLL_MAX_REGISTER];
+static int num_dedicated_88k2_pll_regs;
+static struct reg_default dedicated_44k1_pll_regs[HIFIBERRY_PLL_MAX_REGISTER];
+static int num_dedicated_44k1_pll_regs;
+
+/**
+ * struct clk_hifiberry_drvdata - Common struct to the HiFiBerry DAC HD Clk
+ * @hw: clk_hw for the common clk framework
+ */
+struct clk_hifiberry_drvdata {
+ struct regmap *regmap;
+ struct clk *clk;
+ struct clk_hw hw;
+ unsigned long rate;
+};
+
+#define to_hifiberry_clk(_hw) \
+ container_of(_hw, struct clk_hifiberry_drvdata, hw)
+
+static int clk_hifiberry_dachd_write_pll_regs(struct regmap *regmap,
+ struct reg_default *regs,
+ int num, int do_pll_reset)
+{
+ int i;
+ int ret = 0;
+ char pll_soft_reset[] = { 177, 0xAC, };
+
+ for (i = 0; i < num; i++) {
+ ret |= regmap_write(regmap, regs[i].reg, regs[i].def);
+ if (ret)
+ return ret;
+ }
+ if (do_pll_reset) {
+ ret |= regmap_write(regmap, pll_soft_reset[0],
+ pll_soft_reset[1]);
+ mdelay(10);
+ }
+ return ret;
+}
+
+static unsigned long clk_hifiberry_dachd_recalc_rate(struct clk_hw *hw,
+ unsigned long parent_rate)
+{
+ return to_hifiberry_clk(hw)->rate;
+}
+
+static long clk_hifiberry_dachd_round_rate(struct clk_hw *hw,
+ unsigned long rate, unsigned long *parent_rate)
+{
+ return rate;
+}
+
+static int clk_hifiberry_dachd_set_rate(struct clk_hw *hw,
+ unsigned long rate, unsigned long parent_rate)
+{
+ int ret;
+ struct clk_hifiberry_drvdata *drvdata = to_hifiberry_clk(hw);
+
+ switch (rate) {
+ case 44100:
+ ret = clk_hifiberry_dachd_write_pll_regs(drvdata->regmap,
+ dedicated_44k1_pll_regs, num_dedicated_44k1_pll_regs,
+ PLL_RESET);
+ break;
+ case 88200:
+ ret = clk_hifiberry_dachd_write_pll_regs(drvdata->regmap,
+ dedicated_88k2_pll_regs, num_dedicated_88k2_pll_regs,
+ PLL_RESET);
+ break;
+ case 176400:
+ ret = clk_hifiberry_dachd_write_pll_regs(drvdata->regmap,
+ dedicated_176k4_pll_regs, num_dedicated_176k4_pll_regs,
+ PLL_RESET);
+ break;
+ case 48000:
+ ret = clk_hifiberry_dachd_write_pll_regs(drvdata->regmap,
+ dedicated_48k_pll_regs, num_dedicated_48k_pll_regs,
+ PLL_RESET);
+ break;
+ case 96000:
+ ret = clk_hifiberry_dachd_write_pll_regs(drvdata->regmap,
+ dedicated_96k_pll_regs, num_dedicated_96k_pll_regs,
+ PLL_RESET);
+ break;
+ case 192000:
+ ret = clk_hifiberry_dachd_write_pll_regs(drvdata->regmap,
+ dedicated_192k_pll_regs, num_dedicated_192k_pll_regs,
+ PLL_RESET);
+ break;
+ default:
+ ret = -EINVAL;
+ break;
+ }
+ to_hifiberry_clk(hw)->rate = rate;
+
+ return ret;
+}
+
+const struct clk_ops clk_hifiberry_dachd_rate_ops = {
+ .recalc_rate = clk_hifiberry_dachd_recalc_rate,
+ .round_rate = clk_hifiberry_dachd_round_rate,
+ .set_rate = clk_hifiberry_dachd_set_rate,
+};
+
+static int clk_hifiberry_get_prop_values(struct device *dev,
+ char *prop_name,
+ struct reg_default *regs)
+{
+ int ret;
+ int i;
+ u8 tmp[2 * HIFIBERRY_PLL_MAX_REGISTER];
+
+ ret = of_property_read_variable_u8_array(dev->of_node, prop_name,
+ tmp, 0, 2 * HIFIBERRY_PLL_MAX_REGISTER);
+ if (ret < 0)
+ return ret;
+ if (ret & 1) {
+ dev_err(dev,
+ "%s <%s> -> #%i odd number of bytes for reg/val pairs!",
+ __func__,
+ prop_name,
+ ret);
+ return -EINVAL;
+ }
+ ret /= 2;
+ for (i = 0; i < ret; i++) {
+ regs[i].reg = (u32)tmp[2 * i];
+ regs[i].def = (u32)tmp[2 * i + 1];
+ }
+ return ret;
+}
+
+
+static int clk_hifiberry_dachd_dt_parse(struct device *dev)
+{
+ num_common_pll_regs = clk_hifiberry_get_prop_values(dev,
+ "common_pll_regs", common_pll_regs);
+ num_dedicated_44k1_pll_regs = clk_hifiberry_get_prop_values(dev,
+ "44k1_pll_regs", dedicated_44k1_pll_regs);
+ num_dedicated_88k2_pll_regs = clk_hifiberry_get_prop_values(dev,
+ "88k2_pll_regs", dedicated_88k2_pll_regs);
+ num_dedicated_176k4_pll_regs = clk_hifiberry_get_prop_values(dev,
+ "176k4_pll_regs", dedicated_176k4_pll_regs);
+ num_dedicated_48k_pll_regs = clk_hifiberry_get_prop_values(dev,
+ "48k_pll_regs", dedicated_48k_pll_regs);
+ num_dedicated_96k_pll_regs = clk_hifiberry_get_prop_values(dev,
+ "96k_pll_regs", dedicated_96k_pll_regs);
+ num_dedicated_192k_pll_regs = clk_hifiberry_get_prop_values(dev,
+ "192k_pll_regs", dedicated_192k_pll_regs);
+ return 0;
+}
+
+
+static int clk_hifiberry_dachd_remove(struct device *dev)
+{
+ of_clk_del_provider(dev->of_node);
+ return 0;
+}
+
+const struct regmap_config hifiberry_pll_regmap = {
+ .reg_bits = 8,
+ .val_bits = 8,
+ .max_register = HIFIBERRY_PLL_MAX_REGISTER,
+ .reg_defaults = hifiberry_pll_reg_defaults,
+ .num_reg_defaults = ARRAY_SIZE(hifiberry_pll_reg_defaults),
+ .cache_type = REGCACHE_RBTREE,
+};
+EXPORT_SYMBOL_GPL(hifiberry_pll_regmap);
+
+
+static int clk_hifiberry_dachd_i2c_probe(struct i2c_client *i2c)
+{
+ struct clk_hifiberry_drvdata *hdclk;
+ int ret = 0;
+ struct clk_init_data init;
+ struct device *dev = &i2c->dev;
+ struct device_node *dev_node = dev->of_node;
+ struct regmap_config config = hifiberry_pll_regmap;
+
+ hdclk = devm_kzalloc(&i2c->dev,
+ sizeof(struct clk_hifiberry_drvdata), GFP_KERNEL);
+ if (!hdclk)
+ return -ENOMEM;
+
+ i2c_set_clientdata(i2c, hdclk);
+
+ hdclk->regmap = devm_regmap_init_i2c(i2c, &config);
+
+ if (IS_ERR(hdclk->regmap))
+ return PTR_ERR(hdclk->regmap);
+
+ /* start PLL to allow detection of DAC */
+ ret = clk_hifiberry_dachd_write_pll_regs(hdclk->regmap,
+ hifiberry_pll_reg_defaults,
+ ARRAY_SIZE(hifiberry_pll_reg_defaults),
+ PLL_RESET);
+ if (ret)
+ return ret;
+
+ clk_hifiberry_dachd_dt_parse(dev);
+
+ /* restart PLL with configs from DTB */
+ ret = clk_hifiberry_dachd_write_pll_regs(hdclk->regmap, common_pll_regs,
+ num_common_pll_regs, PLL_RESET);
+ if (ret)
+ return ret;
+
+ init.name = "clk-hifiberry-dachd";
+ init.ops = &clk_hifiberry_dachd_rate_ops;
+ init.flags = 0;
+ init.parent_names = NULL;
+ init.num_parents = 0;
+
+ hdclk->hw.init = &init;
+
+ hdclk->clk = devm_clk_register(dev, &hdclk->hw);
+ if (IS_ERR(hdclk->clk)) {
+ dev_err(dev, "unable to register %s\n", init.name);
+ return PTR_ERR(hdclk->clk);
+ }
+
+ ret = of_clk_add_provider(dev_node, of_clk_src_simple_get, hdclk->clk);
+ if (ret != 0) {
+ dev_err(dev, "Cannot of_clk_add_provider");
+ return ret;
+ }
+
+ ret = clk_set_rate(hdclk->hw.clk, DEFAULT_RATE);
+ if (ret != 0) {
+ dev_err(dev, "Cannot set rate : %d\n", ret);
+ return -EINVAL;
+ }
+
+ return ret;
+}
+
+static void clk_hifiberry_dachd_i2c_remove(struct i2c_client *i2c)
+{
+ clk_hifiberry_dachd_remove(&i2c->dev);
+}
+
+static const struct i2c_device_id clk_hifiberry_dachd_i2c_id[] = {
+ { "dachd-clk", },
+ { }
+};
+MODULE_DEVICE_TABLE(i2c, clk_hifiberry_dachd_i2c_id);
+
+static const struct of_device_id clk_hifiberry_dachd_of_match[] = {
+ { .compatible = "hifiberry,dachd-clk", },
+ { }
+};
+MODULE_DEVICE_TABLE(of, clk_hifiberry_dachd_of_match);
+
+static struct i2c_driver clk_hifiberry_dachd_i2c_driver = {
+ .probe = clk_hifiberry_dachd_i2c_probe,
+ .remove = clk_hifiberry_dachd_i2c_remove,
+ .id_table = clk_hifiberry_dachd_i2c_id,
+ .driver = {
+ .name = "dachd-clk",
+ .of_match_table = of_match_ptr(clk_hifiberry_dachd_of_match),
+ },
+};
+
+module_i2c_driver(clk_hifiberry_dachd_i2c_driver);
+
+
+MODULE_DESCRIPTION("HiFiBerry DAC+ HD clock driver");
+MODULE_AUTHOR("Joerg Schambacher <[email protected]>");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:clk-hifiberry-dachd");
diff --git a/drivers/clk/clk-hifiberry-dacpro.c b/drivers/clk/clk-hifiberry-dacpro.c
new file mode 100644
index 000000000000..0cbc0349f9f6
--- /dev/null
+++ b/drivers/clk/clk-hifiberry-dacpro.c
@@ -0,0 +1,180 @@
+/*
+ * Clock Driver for HiFiBerry DAC Pro
+ *
+ * Author: Stuart MacLean
+ * Copyright 2015
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/clkdev.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/slab.h>
+#include <linux/platform_device.h>
+
+struct ext_clk_rates {
+ /* Clock rate of CLK44EN attached to GPIO6 pin */
+ unsigned long clk_44en;
+ /* Clock rate of CLK48EN attached to GPIO3 pin */
+ unsigned long clk_48en;
+};
+
+/**
+ * struct hifiberry_dacpro_clk - Common struct to the HiFiBerry DAC Pro
+ * @hw: clk_hw for the common clk framework
+ * @mode: 0 => CLK44EN, 1 => CLK48EN
+ */
+struct clk_hifiberry_hw {
+ struct clk_hw hw;
+ uint8_t mode;
+ struct ext_clk_rates clk_rates;
+};
+
+#define to_hifiberry_clk(_hw) container_of(_hw, struct clk_hifiberry_hw, hw)
+
+static const struct ext_clk_rates hifiberry_dacpro_clks = {
+ .clk_44en = 22579200UL,
+ .clk_48en = 24576000UL,
+};
+
+static const struct ext_clk_rates allo_dac_clks = {
+ .clk_44en = 45158400UL,
+ .clk_48en = 49152000UL,
+};
+
+static const struct of_device_id clk_hifiberry_dacpro_dt_ids[] = {
+ { .compatible = "hifiberry,dacpro-clk", &hifiberry_dacpro_clks },
+ { .compatible = "allo,dac-clk", &allo_dac_clks },
+ { }
+};
+MODULE_DEVICE_TABLE(of, clk_hifiberry_dacpro_dt_ids);
+
+static unsigned long clk_hifiberry_dacpro_recalc_rate(struct clk_hw *hw,
+ unsigned long parent_rate)
+{
+ struct clk_hifiberry_hw *clk = to_hifiberry_clk(hw);
+ return (clk->mode == 0) ? clk->clk_rates.clk_44en :
+ clk->clk_rates.clk_48en;
+}
+
+static long clk_hifiberry_dacpro_round_rate(struct clk_hw *hw,
+ unsigned long rate, unsigned long *parent_rate)
+{
+ struct clk_hifiberry_hw *clk = to_hifiberry_clk(hw);
+ long actual_rate;
+
+ if (rate <= clk->clk_rates.clk_44en) {
+ actual_rate = (long)clk->clk_rates.clk_44en;
+ } else if (rate >= clk->clk_rates.clk_48en) {
+ actual_rate = (long)clk->clk_rates.clk_48en;
+ } else {
+ long diff44Rate = (long)(rate - clk->clk_rates.clk_44en);
+ long diff48Rate = (long)(clk->clk_rates.clk_48en - rate);
+
+ if (diff44Rate < diff48Rate)
+ actual_rate = (long)clk->clk_rates.clk_44en;
+ else
+ actual_rate = (long)clk->clk_rates.clk_48en;
+ }
+ return actual_rate;
+}
+
+
+static int clk_hifiberry_dacpro_set_rate(struct clk_hw *hw,
+ unsigned long rate, unsigned long parent_rate)
+{
+ struct clk_hifiberry_hw *clk = to_hifiberry_clk(hw);
+ unsigned long actual_rate;
+
+ actual_rate = (unsigned long)clk_hifiberry_dacpro_round_rate(hw, rate,
+ &parent_rate);
+ clk->mode = (actual_rate == clk->clk_rates.clk_44en) ? 0 : 1;
+ return 0;
+}
+
+
+const struct clk_ops clk_hifiberry_dacpro_rate_ops = {
+ .recalc_rate = clk_hifiberry_dacpro_recalc_rate,
+ .round_rate = clk_hifiberry_dacpro_round_rate,
+ .set_rate = clk_hifiberry_dacpro_set_rate,
+};
+
+static int clk_hifiberry_dacpro_probe(struct platform_device *pdev)
+{
+ const struct of_device_id *of_id;
+ struct clk_hifiberry_hw *proclk;
+ struct clk *clk;
+ struct device *dev;
+ struct clk_init_data init;
+ int ret;
+
+ dev = &pdev->dev;
+ of_id = of_match_node(clk_hifiberry_dacpro_dt_ids, dev->of_node);
+ if (!of_id)
+ return -EINVAL;
+
+ proclk = kzalloc(sizeof(struct clk_hifiberry_hw), GFP_KERNEL);
+ if (!proclk)
+ return -ENOMEM;
+
+ init.name = "clk-hifiberry-dacpro";
+ init.ops = &clk_hifiberry_dacpro_rate_ops;
+ init.flags = 0;
+ init.parent_names = NULL;
+ init.num_parents = 0;
+
+ proclk->mode = 0;
+ proclk->hw.init = &init;
+ memcpy(&proclk->clk_rates, of_id->data, sizeof(proclk->clk_rates));
+
+ clk = devm_clk_register(dev, &proclk->hw);
+ if (!IS_ERR(clk)) {
+ ret = of_clk_add_provider(dev->of_node, of_clk_src_simple_get,
+ clk);
+ } else {
+ dev_err(dev, "Fail to register clock driver\n");
+ kfree(proclk);
+ ret = PTR_ERR(clk);
+ }
+ return ret;
+}
+
+static void clk_hifiberry_dacpro_remove(struct platform_device *pdev)
+{
+ of_clk_del_provider(pdev->dev.of_node);
+}
+
+static struct platform_driver clk_hifiberry_dacpro_driver = {
+ .probe = clk_hifiberry_dacpro_probe,
+ .remove = clk_hifiberry_dacpro_remove,
+ .driver = {
+ .name = "clk-hifiberry-dacpro",
+ .of_match_table = clk_hifiberry_dacpro_dt_ids,
+ },
+};
+
+static int __init clk_hifiberry_dacpro_init(void)
+{
+ return platform_driver_register(&clk_hifiberry_dacpro_driver);
+}
+core_initcall(clk_hifiberry_dacpro_init);
+
+static void __exit clk_hifiberry_dacpro_exit(void)
+{
+ platform_driver_unregister(&clk_hifiberry_dacpro_driver);
+}
+module_exit(clk_hifiberry_dacpro_exit);
+
+MODULE_DESCRIPTION("HiFiBerry DAC Pro clock driver");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:clk-hifiberry-dacpro");
diff --git a/drivers/clk/clk-rp1-sdio.c b/drivers/clk/clk-rp1-sdio.c
new file mode 100644
index 000000000000..c459bab0575c
--- /dev/null
+++ b/drivers/clk/clk-rp1-sdio.c
@@ -0,0 +1,599 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * SDIO clock driver for RP1
+ *
+ * Copyright (C) 2023 Raspberry Pi Ltd.
+ */
+
+#include <linux/io.h>
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+
+// Register : MODE
+#define MODE 0x00000000
+#define MODE_BITS 0x70030000
+#define MODE_RESET 0x00000000
+// Field : MODE_STEPS_PER_CYCLE
+#define MODE_STEPS_PER_CYCLE_RESET 0x0
+#define MODE_STEPS_PER_CYCLE_BITS 0x70000000
+#define MODE_STEPS_PER_CYCLE_MSB 30
+#define MODE_STEPS_PER_CYCLE_LSB 28
+#define MODE_STEPS_PER_CYCLE_VALUE_STEPS_20 0x0
+#define MODE_STEPS_PER_CYCLE_VALUE_STEPS_10 0x1
+#define MODE_STEPS_PER_CYCLE_VALUE_STEPS_16 0x2
+#define MODE_STEPS_PER_CYCLE_VALUE_STEPS_8 0x3
+#define MODE_STEPS_PER_CYCLE_VALUE_STEPS_12 0x4
+#define MODE_STEPS_PER_CYCLE_VALUE_STEPS_6 0x5
+#define MODE_STEPS_PER_CYCLE_VALUE_STEPS_5 0x6
+#define MODE_STEPS_PER_CYCLE_VALUE_STEPS_4 0x7
+// Field : MODE_SRC_SEL
+#define MODE_SRC_SEL_RESET 0x0
+#define MODE_SRC_SEL_BITS 0x00030000
+#define MODE_SRC_SEL_MSB 17
+#define MODE_SRC_SEL_LSB 16
+#define MODE_SRC_SEL_VALUE_STOP 0x0
+#define MODE_SRC_SEL_VALUE_CLK_ALT_SRC 0x1
+#define MODE_SRC_SEL_VALUE_PLL_SYS_VCO 0x2
+#define MODE_SRC_SEL_VALUE_PLL_SYS_VCO_AGAIN 0x3
+// Register : FROMIP
+#define FROMIP 0x00000004
+#define FROMIP_BITS 0x0f9713ff
+#define FROMIP_RESET 0x00000000
+// Field : FROMIP_TUNING_CCLK_SEL
+#define FROMIP_TUNING_CCLK_SEL_RESET 0x0
+#define FROMIP_TUNING_CCLK_SEL_BITS 0x0f000000
+#define FROMIP_TUNING_CCLK_SEL_MSB 27
+#define FROMIP_TUNING_CCLK_SEL_LSB 24
+// Field : FROMIP_TUNING_CCLK_UPDATE
+#define FROMIP_TUNING_CCLK_UPDATE_RESET 0x0
+#define FROMIP_TUNING_CCLK_UPDATE_BITS 0x00800000
+#define FROMIP_TUNING_CCLK_UPDATE_MSB 23
+#define FROMIP_TUNING_CCLK_UPDATE_LSB 23
+// Field : FROMIP_SAMPLE_CCLK_SEL
+#define FROMIP_SAMPLE_CCLK_SEL_RESET 0x0
+#define FROMIP_SAMPLE_CCLK_SEL_BITS 0x00100000
+#define FROMIP_SAMPLE_CCLK_SEL_MSB 20
+#define FROMIP_SAMPLE_CCLK_SEL_LSB 20
+// Field : FROMIP_CLK2CARD_ON
+#define FROMIP_CLK2CARD_ON_RESET 0x0
+#define FROMIP_CLK2CARD_ON_BITS 0x00040000
+#define FROMIP_CLK2CARD_ON_MSB 18
+#define FROMIP_CLK2CARD_ON_LSB 18
+// Field : FROMIP_CARD_CLK_STABLE
+#define FROMIP_CARD_CLK_STABLE_RESET 0x0
+#define FROMIP_CARD_CLK_STABLE_BITS 0x00020000
+#define FROMIP_CARD_CLK_STABLE_MSB 17
+#define FROMIP_CARD_CLK_STABLE_LSB 17
+// Field : FROMIP_CARD_CLK_EN
+#define FROMIP_CARD_CLK_EN_RESET 0x0
+#define FROMIP_CARD_CLK_EN_BITS 0x00010000
+#define FROMIP_CARD_CLK_EN_MSB 16
+#define FROMIP_CARD_CLK_EN_LSB 16
+// Field : FROMIP_CLK_GEN_SEL
+#define FROMIP_CLK_GEN_SEL_RESET 0x0
+#define FROMIP_CLK_GEN_SEL_BITS 0x00001000
+#define FROMIP_CLK_GEN_SEL_MSB 12
+#define FROMIP_CLK_GEN_SEL_LSB 12
+// Field : FROMIP_FREQ_SEL
+#define FROMIP_FREQ_SEL_RESET 0x000
+#define FROMIP_FREQ_SEL_BITS 0x000003ff
+#define FROMIP_FREQ_SEL_MSB 9
+#define FROMIP_FREQ_SEL_LSB 0
+// Register : LOCAL
+#define LOCAL 0x00000008
+#define LOCAL_BITS 0x1f9713ff
+#define LOCAL_RESET 0x00000000
+// Field : LOCAL_TUNING_CCLK_SEL
+#define LOCAL_TUNING_CCLK_SEL_RESET 0x00
+#define LOCAL_TUNING_CCLK_SEL_BITS 0x1f000000
+#define LOCAL_TUNING_CCLK_SEL_MSB 28
+#define LOCAL_TUNING_CCLK_SEL_LSB 24
+// Field : LOCAL_TUNING_CCLK_UPDATE
+#define LOCAL_TUNING_CCLK_UPDATE_RESET 0x0
+#define LOCAL_TUNING_CCLK_UPDATE_BITS 0x00800000
+#define LOCAL_TUNING_CCLK_UPDATE_MSB 23
+#define LOCAL_TUNING_CCLK_UPDATE_LSB 23
+// Field : LOCAL_SAMPLE_CCLK_SEL
+#define LOCAL_SAMPLE_CCLK_SEL_RESET 0x0
+#define LOCAL_SAMPLE_CCLK_SEL_BITS 0x00100000
+#define LOCAL_SAMPLE_CCLK_SEL_MSB 20
+#define LOCAL_SAMPLE_CCLK_SEL_LSB 20
+// Field : LOCAL_CLK2CARD_ON
+#define LOCAL_CLK2CARD_ON_RESET 0x0
+#define LOCAL_CLK2CARD_ON_BITS 0x00040000
+#define LOCAL_CLK2CARD_ON_MSB 18
+#define LOCAL_CLK2CARD_ON_LSB 18
+// Field : LOCAL_CARD_CLK_STABLE
+#define LOCAL_CARD_CLK_STABLE_RESET 0x0
+#define LOCAL_CARD_CLK_STABLE_BITS 0x00020000
+#define LOCAL_CARD_CLK_STABLE_MSB 17
+#define LOCAL_CARD_CLK_STABLE_LSB 17
+// Field : LOCAL_CARD_CLK_EN
+#define LOCAL_CARD_CLK_EN_RESET 0x0
+#define LOCAL_CARD_CLK_EN_BITS 0x00010000
+#define LOCAL_CARD_CLK_EN_MSB 16
+#define LOCAL_CARD_CLK_EN_LSB 16
+// Field : LOCAL_CLK_GEN_SEL
+#define LOCAL_CLK_GEN_SEL_RESET 0x0
+#define LOCAL_CLK_GEN_SEL_BITS 0x00001000
+#define LOCAL_CLK_GEN_SEL_MSB 12
+#define LOCAL_CLK_GEN_SEL_LSB 12
+#define LOCAL_CLK_GEN_SEL_VALUE_PROGCLOCKMODE 0x0
+#define LOCAL_CLK_GEN_SEL_VALUE_DIVCLOCKMODE 0x1
+// Field : LOCAL_FREQ_SEL
+#define LOCAL_FREQ_SEL_RESET 0x000
+#define LOCAL_FREQ_SEL_BITS 0x000003ff
+#define LOCAL_FREQ_SEL_MSB 9
+#define LOCAL_FREQ_SEL_LSB 0
+// Register : USE_LOCAL
+#define USE_LOCAL 0x0000000c
+#define USE_LOCAL_BITS 0x01951001
+#define USE_LOCAL_RESET 0x00000000
+// Field : USE_LOCAL_TUNING_CCLK_SEL
+#define USE_LOCAL_TUNING_CCLK_SEL_RESET 0x0
+#define USE_LOCAL_TUNING_CCLK_SEL_BITS 0x01000000
+#define USE_LOCAL_TUNING_CCLK_SEL_MSB 24
+#define USE_LOCAL_TUNING_CCLK_SEL_LSB 24
+// Field : USE_LOCAL_TUNING_CCLK_UPDATE
+#define USE_LOCAL_TUNING_CCLK_UPDATE_RESET 0x0
+#define USE_LOCAL_TUNING_CCLK_UPDATE_BITS 0x00800000
+#define USE_LOCAL_TUNING_CCLK_UPDATE_MSB 23
+#define USE_LOCAL_TUNING_CCLK_UPDATE_LSB 23
+// Field : USE_LOCAL_SAMPLE_CCLK_SEL
+#define USE_LOCAL_SAMPLE_CCLK_SEL_RESET 0x0
+#define USE_LOCAL_SAMPLE_CCLK_SEL_BITS 0x00100000
+#define USE_LOCAL_SAMPLE_CCLK_SEL_MSB 20
+#define USE_LOCAL_SAMPLE_CCLK_SEL_LSB 20
+// Field : USE_LOCAL_CLK2CARD_ON
+#define USE_LOCAL_CLK2CARD_ON_RESET 0x0
+#define USE_LOCAL_CLK2CARD_ON_BITS 0x00040000
+#define USE_LOCAL_CLK2CARD_ON_MSB 18
+#define USE_LOCAL_CLK2CARD_ON_LSB 18
+// Field : USE_LOCAL_CARD_CLK_EN
+#define USE_LOCAL_CARD_CLK_EN_RESET 0x0
+#define USE_LOCAL_CARD_CLK_EN_BITS 0x00010000
+#define USE_LOCAL_CARD_CLK_EN_MSB 16
+#define USE_LOCAL_CARD_CLK_EN_LSB 16
+// Field : USE_LOCAL_CLK_GEN_SEL
+#define USE_LOCAL_CLK_GEN_SEL_RESET 0x0
+#define USE_LOCAL_CLK_GEN_SEL_BITS 0x00001000
+#define USE_LOCAL_CLK_GEN_SEL_MSB 12
+#define USE_LOCAL_CLK_GEN_SEL_LSB 12
+// Field : USE_LOCAL_FREQ_SEL
+#define USE_LOCAL_FREQ_SEL_RESET 0x0
+#define USE_LOCAL_FREQ_SEL_BITS 0x00000001
+#define USE_LOCAL_FREQ_SEL_MSB 0
+#define USE_LOCAL_FREQ_SEL_LSB 0
+// Register : SD_DELAY
+#define SD_DELAY 0x00000010
+#define SD_DELAY_BITS 0x0000001f
+#define SD_DELAY_RESET 0x00000000
+// Field : SD_DELAY_STEPS
+#define SD_DELAY_STEPS_RESET 0x00
+#define SD_DELAY_STEPS_BITS 0x0000001f
+#define SD_DELAY_STEPS_MSB 4
+#define SD_DELAY_STEPS_LSB 0
+// Register : RX_DELAY
+#define RX_DELAY 0x00000014
+#define RX_DELAY_BITS 0x19f3331f
+#define RX_DELAY_RESET 0x00000000
+// Field : RX_DELAY_BYPASS
+#define RX_DELAY_BYPASS_RESET 0x0
+#define RX_DELAY_BYPASS_BITS 0x10000000
+#define RX_DELAY_BYPASS_MSB 28
+#define RX_DELAY_BYPASS_LSB 28
+// Field : RX_DELAY_FAIL_ACTUAL
+#define RX_DELAY_FAIL_ACTUAL_RESET 0x0
+#define RX_DELAY_FAIL_ACTUAL_BITS 0x08000000
+#define RX_DELAY_FAIL_ACTUAL_MSB 27
+#define RX_DELAY_FAIL_ACTUAL_LSB 27
+// Field : RX_DELAY_ACTUAL
+#define RX_DELAY_ACTUAL_RESET 0x00
+#define RX_DELAY_ACTUAL_BITS 0x01f00000
+#define RX_DELAY_ACTUAL_MSB 24
+#define RX_DELAY_ACTUAL_LSB 20
+// Field : RX_DELAY_OFFSET
+#define RX_DELAY_OFFSET_RESET 0x0
+#define RX_DELAY_OFFSET_BITS 0x00030000
+#define RX_DELAY_OFFSET_MSB 17
+#define RX_DELAY_OFFSET_LSB 16
+// Field : RX_DELAY_OVERFLOW
+#define RX_DELAY_OVERFLOW_RESET 0x0
+#define RX_DELAY_OVERFLOW_BITS 0x00003000
+#define RX_DELAY_OVERFLOW_MSB 13
+#define RX_DELAY_OVERFLOW_LSB 12
+#define RX_DELAY_OVERFLOW_VALUE_ALLOW 0x0
+#define RX_DELAY_OVERFLOW_VALUE_CLAMP 0x1
+#define RX_DELAY_OVERFLOW_VALUE_FAIL 0x2
+// Field : RX_DELAY_MAP
+#define RX_DELAY_MAP_RESET 0x0
+#define RX_DELAY_MAP_BITS 0x00000300
+#define RX_DELAY_MAP_MSB 9
+#define RX_DELAY_MAP_LSB 8
+#define RX_DELAY_MAP_VALUE_DIRECT 0x0
+#define RX_DELAY_MAP_VALUE 0x1
+#define RX_DELAY_MAP_VALUE_STRETCH 0x2
+// Field : RX_DELAY_FIXED
+#define RX_DELAY_FIXED_RESET 0x00
+#define RX_DELAY_FIXED_BITS 0x0000001f
+#define RX_DELAY_FIXED_MSB 4
+#define RX_DELAY_FIXED_LSB 0
+// Register : NDIV
+#define NDIV 0x00000018
+#define NDIV_BITS 0x1fff0000
+#define NDIV_RESET 0x00110000
+// Field : NDIV_DIVB
+#define NDIV_DIVB_RESET 0x001
+#define NDIV_DIVB_BITS 0x1ff00000
+#define NDIV_DIVB_MSB 28
+#define NDIV_DIVB_LSB 20
+// Field : NDIV_DIVA
+#define NDIV_DIVA_RESET 0x1
+#define NDIV_DIVA_BITS 0x000f0000
+#define NDIV_DIVA_MSB 19
+#define NDIV_DIVA_LSB 16
+// Register : CS
+#define CS 0x0000001c
+#define CS_BITS 0x00111101
+#define CS_RESET 0x00000001
+// Field : CS_RX_DEL_UPDATED
+#define CS_RX_DEL_UPDATED_RESET 0x0
+#define CS_RX_DEL_UPDATED_BITS 0x00100000
+#define CS_RX_DEL_UPDATED_MSB 20
+#define CS_RX_DEL_UPDATED_LSB 20
+// Field : CS_RX_CLK_RUNNING
+#define CS_RX_CLK_RUNNING_RESET 0x0
+#define CS_RX_CLK_RUNNING_BITS 0x00010000
+#define CS_RX_CLK_RUNNING_MSB 16
+#define CS_RX_CLK_RUNNING_LSB 16
+// Field : CS_SD_CLK_RUNNING
+#define CS_SD_CLK_RUNNING_RESET 0x0
+#define CS_SD_CLK_RUNNING_BITS 0x00001000
+#define CS_SD_CLK_RUNNING_MSB 12
+#define CS_SD_CLK_RUNNING_LSB 12
+// Field : CS_TX_CLK_RUNNING
+#define CS_TX_CLK_RUNNING_RESET 0x0
+#define CS_TX_CLK_RUNNING_BITS 0x00000100
+#define CS_TX_CLK_RUNNING_MSB 8
+#define CS_TX_CLK_RUNNING_LSB 8
+// Field : CS_RESET
+#define CS_RESET_RESET 0x1
+#define CS_RESET_BITS 0x00000001
+#define CS_RESET_MSB 0
+#define CS_RESET_LSB 0
+
+#define FPGA_SRC_RATE 400000000
+
+/* Base number of steps to delay in relation to tx clk.
+ * The relationship of the 3 clocks are as follows:
+ * tx_clk: This clock is provided to the controller. Data is sent out
+ * to the pads using this clock.
+ * sd_clk: This clock is sent out to the card.
+ * rx_clk: This clock is used to sample the data coming back from the card.
+ * This may need to be several steps ahead of the tx_clk. The default rx delay
+ * is used as a base delay, and can be further adjusted by the sd host
+ * controller during the tuning process if using a DDR50 or faster SD card
+ */
+/*
+ * PRJY-1813 - the default SD clock delay needs to be set to ~60% of the total
+ * number of steps to meet tISU (>6ns) and tIH (>2ns) in high-speed mode.
+ * On FPGA this means delay SDCLK by 5, and sample RX with a delay of 6.
+ */
+#define DEFAULT_RX_DELAY 6
+#define DEFAULT_SD_DELAY 5
+
+struct rp1_sdio_clkgen {
+ struct device *dev;
+
+ /* Source clock. Either PLL VCO or fixed freq on FPGA */
+ struct clk *src_clk;
+ /* Desired base frequency. Max freq card can go */
+ struct clk *base_clk;
+
+ struct clk_hw hw;
+ void __iomem *regs;
+
+ /* Starting value of local register before changing freq */
+ u32 local_base;
+};
+
+static inline void clkgen_write(struct rp1_sdio_clkgen *clkgen, u32 reg, u32 val)
+{
+ dev_dbg(clkgen->dev, "%s: write reg 0x%x: 0x%x\n", __func__, reg, val);
+ writel(val, clkgen->regs + reg);
+}
+
+static inline u32 clkgen_read(struct rp1_sdio_clkgen *clkgen, u32 reg)
+{
+ u32 val = readl(clkgen->regs + reg);
+
+ dev_dbg(clkgen->dev, "%s: read reg 0x%x: 0x%x\n", __func__, reg, val);
+ return val;
+}
+
+static int get_steps(unsigned int steps)
+{
+ int ret = -1;
+
+ if (steps == 4)
+ ret = MODE_STEPS_PER_CYCLE_VALUE_STEPS_4;
+ else if (steps == 5)
+ ret = MODE_STEPS_PER_CYCLE_VALUE_STEPS_5;
+ else if (steps == 6)
+ ret = MODE_STEPS_PER_CYCLE_VALUE_STEPS_6;
+ else if (steps == 8)
+ ret = MODE_STEPS_PER_CYCLE_VALUE_STEPS_8;
+ else if (steps == 10)
+ ret = MODE_STEPS_PER_CYCLE_VALUE_STEPS_10;
+ else if (steps == 12)
+ ret = MODE_STEPS_PER_CYCLE_VALUE_STEPS_12;
+ else if (steps == 16)
+ ret = MODE_STEPS_PER_CYCLE_VALUE_STEPS_16;
+ else if (steps == 20)
+ ret = MODE_STEPS_PER_CYCLE_VALUE_STEPS_20;
+ return ret;
+}
+
+static int rp1_sdio_clk_init(struct rp1_sdio_clkgen *clkgen)
+{
+ unsigned long src_rate = clk_get_rate(clkgen->src_clk);
+ unsigned long base_rate = clk_get_rate(clkgen->base_clk);
+ unsigned int steps = src_rate / base_rate;
+ u32 reg = 0;
+ int steps_value = 0;
+
+ dev_dbg(clkgen->dev, "init: src_rate %lu, base_rate %lu, steps %d\n",
+ src_rate, base_rate, steps);
+
+ /* Assert reset while we set up clkgen */
+ clkgen_write(clkgen, CS, CS_RESET_BITS);
+
+ /* Pick clock source */
+ if (src_rate == FPGA_SRC_RATE) {
+ /* Using ALT SRC */
+ reg |= MODE_SRC_SEL_VALUE_CLK_ALT_SRC << MODE_SRC_SEL_LSB;
+ } else {
+ /* Assume we are using PLL SYS VCO */
+ reg |= MODE_SRC_SEL_VALUE_PLL_SYS_VCO << MODE_SRC_SEL_LSB;
+ }
+
+ /* How many delay steps are available in one cycle for this source */
+ steps_value = get_steps(steps);
+ if (steps_value < 0) {
+ dev_err(clkgen->dev, "Invalid step value: %d\n", steps);
+ return -EINVAL;
+ }
+ reg |= steps_value << MODE_STEPS_PER_CYCLE_LSB;
+
+ /* Mode register is done now*/
+ clkgen_write(clkgen, MODE, reg);
+
+ /* Now set delay mode */
+ /* Clamp value if out of range rx delay is used */
+ reg = RX_DELAY_OVERFLOW_VALUE_CLAMP << RX_DELAY_OVERFLOW_LSB;
+ /* SD tuning bus goes from 0x0 to 0xf but we don't necessarily have that
+ * many steps available depending on the source so map 0x0 -> 0xf to one
+ * cycle of rx delay
+ */
+ reg |= RX_DELAY_MAP_VALUE_STRETCH << RX_DELAY_MAP_LSB;
+
+ /* Default RX delay */
+ dev_dbg(clkgen->dev, "default rx delay %d\n", DEFAULT_RX_DELAY);
+ reg |= (DEFAULT_RX_DELAY & RX_DELAY_FIXED_BITS) << RX_DELAY_FIXED_LSB;
+ clkgen_write(clkgen, RX_DELAY, reg);
+
+ /* Default SD delay */
+ dev_dbg(clkgen->dev, "default sd delay %d\n", DEFAULT_SD_DELAY);
+ reg = (DEFAULT_SD_DELAY & SD_DELAY_STEPS_BITS) << SD_DELAY_STEPS_LSB;
+ clkgen_write(clkgen, SD_DELAY, reg);
+
+ /* We select freq, we turn on tx clock, we turn on sd clk,
+ * we pick clock generator mode
+ */
+ reg = USE_LOCAL_FREQ_SEL_BITS | USE_LOCAL_CARD_CLK_EN_BITS |
+ USE_LOCAL_CLK2CARD_ON_BITS | USE_LOCAL_CLK_GEN_SEL_BITS;
+ clkgen_write(clkgen, USE_LOCAL, reg);
+
+ /* Deassert reset. Reset bit is only writable bit of CS
+ * reg so fine to write a 0.
+ */
+ clkgen_write(clkgen, CS, 0);
+
+ return 0;
+}
+
+#define RUNNING \
+ (CS_TX_CLK_RUNNING_BITS | CS_RX_CLK_RUNNING_BITS | \
+ CS_SD_CLK_RUNNING_BITS)
+static int rp1_sdio_clk_is_prepared(struct clk_hw *hw)
+{
+ struct rp1_sdio_clkgen *clkgen =
+ container_of(hw, struct rp1_sdio_clkgen, hw);
+ u32 status;
+
+ dev_dbg(clkgen->dev, "is_prepared\n");
+ status = clkgen_read(clkgen, CS);
+ return ((status & RUNNING) == RUNNING);
+}
+
+/* Can define an additional divider if an sd card isn't working at full speed */
+/* #define SLOWDOWN 3 */
+
+static unsigned long rp1_sdio_clk_get_rate(struct clk_hw *hw,
+ unsigned long parent_rate)
+{
+ /* Get the current rate */
+ struct rp1_sdio_clkgen *clkgen =
+ container_of(hw, struct rp1_sdio_clkgen, hw);
+ unsigned long actual_rate = 0;
+ u32 ndiv_diva;
+ u32 ndiv_divb;
+ u32 tmp;
+ u32 div;
+
+ tmp = clkgen_read(clkgen, LOCAL);
+ if ((tmp & LOCAL_CLK2CARD_ON_BITS) == 0) {
+ dev_dbg(clkgen->dev, "get_rate 0\n");
+ return 0;
+ }
+
+ tmp = clkgen_read(clkgen, NDIV);
+ ndiv_diva = (tmp & NDIV_DIVA_BITS) >> NDIV_DIVA_LSB;
+ ndiv_divb = (tmp & NDIV_DIVB_BITS) >> NDIV_DIVB_LSB;
+ div = ndiv_diva * ndiv_divb;
+ actual_rate = (clk_get_rate(clkgen->base_clk) / div);
+
+#ifdef SLOWDOWN
+ actual_rate *= SLOWDOWN;
+#endif
+
+ dev_dbg(clkgen->dev, "get_rate. ndiv_diva %d, ndiv_divb %d = %lu\n",
+ ndiv_diva, ndiv_divb, actual_rate);
+
+ return actual_rate;
+}
+
+static int rp1_sdio_clk_set_rate(struct clk_hw *hw, unsigned long rate,
+ unsigned long parent_rate)
+{
+ struct rp1_sdio_clkgen *clkgen =
+ container_of(hw, struct rp1_sdio_clkgen, hw);
+ u32 div;
+ u32 reg;
+
+ dev_dbg(clkgen->dev, "set_rate %lu\n", rate);
+
+ if (rate == 0) {
+ /* Keep tx clock running */
+ clkgen_write(clkgen, LOCAL, LOCAL_CARD_CLK_EN_BITS);
+ return 0;
+ }
+
+#ifdef SLOWDOWN
+ rate /= SLOWDOWN;
+#endif
+
+ div = (clk_get_rate(clkgen->base_clk) / rate) - 1;
+ reg = LOCAL_CLK_GEN_SEL_BITS | LOCAL_CARD_CLK_EN_BITS |
+ LOCAL_CLK2CARD_ON_BITS | (div << LOCAL_FREQ_SEL_LSB);
+ clkgen_write(clkgen, LOCAL, reg);
+
+ return 0;
+}
+
+#define MAX_NDIV (256 * 8)
+static int rp1_sdio_clk_determine_rate(struct clk_hw *hw,
+ struct clk_rate_request *req)
+{
+ unsigned long rate;
+ struct rp1_sdio_clkgen *clkgen =
+ container_of(hw, struct rp1_sdio_clkgen, hw);
+ unsigned long base_rate = clk_get_rate(clkgen->base_clk);
+ u32 div;
+
+ /* What is the actual rate I can get if I request xyz */
+ if (req->rate) {
+ div = min((u32)(base_rate / req->rate), (u32)MAX_NDIV);
+ rate = base_rate / div;
+ req->rate = rate;
+ dev_dbg(clkgen->dev, "determine_rate %lu: %lu / %d = %lu\n",
+ req->rate, base_rate, div, rate);
+ } else {
+ rate = 0;
+ dev_dbg(clkgen->dev, "determine_rate %lu: %lu\n", req->rate,
+ rate);
+ }
+
+ return 0;
+}
+
+static const struct clk_ops rp1_sdio_clk_ops = {
+ .is_prepared = rp1_sdio_clk_is_prepared,
+ .recalc_rate = rp1_sdio_clk_get_rate,
+ .set_rate = rp1_sdio_clk_set_rate,
+ .determine_rate = rp1_sdio_clk_determine_rate,
+};
+
+static int rp1_sdio_clk_probe(struct platform_device *pdev)
+{
+ struct device_node *node = pdev->dev.of_node;
+ struct rp1_sdio_clkgen *clkgen;
+ void __iomem *regs;
+ struct clk_init_data init = {};
+ int ret;
+
+ clkgen = devm_kzalloc(&pdev->dev, sizeof(*clkgen), GFP_KERNEL);
+ if (!clkgen)
+ return -ENOMEM;
+ platform_set_drvdata(pdev, clkgen);
+
+ clkgen->dev = &pdev->dev;
+
+ /* Source freq */
+ clkgen->src_clk = devm_clk_get(&pdev->dev, "src");
+ if (IS_ERR(clkgen->src_clk)) {
+ int err = PTR_ERR(clkgen->src_clk);
+
+ dev_err(&pdev->dev, "failed to get src clk: %d\n", err);
+ return err;
+ }
+
+ /* Desired maximum output freq (i.e. base freq) */
+ clkgen->base_clk = devm_clk_get(&pdev->dev, "base");
+ if (IS_ERR(clkgen->base_clk)) {
+ int err = PTR_ERR(clkgen->base_clk);
+
+ dev_err(&pdev->dev, "failed to get base clk: %d\n", err);
+ return err;
+ }
+
+ regs = devm_platform_ioremap_resource(pdev, 0);
+ if (IS_ERR(regs))
+ return PTR_ERR(regs);
+
+ init.name = node->name;
+ init.ops = &rp1_sdio_clk_ops;
+ init.flags = CLK_GET_RATE_NOCACHE;
+
+ clkgen->hw.init = &init;
+ clkgen->regs = regs;
+
+ dev_info(&pdev->dev, "loaded %s\n", init.name);
+
+ ret = devm_clk_hw_register(&pdev->dev, &clkgen->hw);
+ if (ret)
+ return ret;
+
+ ret = of_clk_add_hw_provider(node, of_clk_hw_simple_get, &clkgen->hw);
+ if (ret)
+ return ret;
+
+ ret = rp1_sdio_clk_init(clkgen);
+ return ret;
+}
+
+static void rp1_sdio_clk_remove(struct platform_device *pdev)
+{
+}
+
+static const struct of_device_id rp1_sdio_clk_dt_ids[] = {
+ { .compatible = "raspberrypi,rp1-sdio-clk", },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, rp1_sdio_clk_dt_ids);
+
+static struct platform_driver rp1_sdio_clk_driver = {
+ .probe = rp1_sdio_clk_probe,
+ .remove = rp1_sdio_clk_remove,
+ .driver = {
+ .name = "rp1-sdio-clk",
+ .of_match_table = rp1_sdio_clk_dt_ids,
+ },
+};
+module_platform_driver(rp1_sdio_clk_driver);
+
+MODULE_AUTHOR("Liam Fraser <[email protected]>");
+MODULE_DESCRIPTION("RP1 SDIO clock driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/clk/clk-rp1.c b/drivers/clk/clk-rp1.c
index fd144755b879..ab74f20d4e5b 100644
--- a/drivers/clk/clk-rp1.c
+++ b/drivers/clk/clk-rp1.c
@@ -15,259 +15,259 @@
#include <dt-bindings/clock/raspberrypi,rp1-clocks.h>
-#define PLL_SYS_OFFSET 0x08000
-#define PLL_SYS_CS (PLL_SYS_OFFSET + 0x00)
-#define PLL_SYS_PWR (PLL_SYS_OFFSET + 0x04)
-#define PLL_SYS_FBDIV_INT (PLL_SYS_OFFSET + 0x08)
-#define PLL_SYS_FBDIV_FRAC (PLL_SYS_OFFSET + 0x0c)
-#define PLL_SYS_PRIM (PLL_SYS_OFFSET + 0x10)
-#define PLL_SYS_SEC (PLL_SYS_OFFSET + 0x14)
+#define PLL_SYS_OFFSET 0x08000
+#define PLL_SYS_CS (PLL_SYS_OFFSET + 0x00)
+#define PLL_SYS_PWR (PLL_SYS_OFFSET + 0x04)
+#define PLL_SYS_FBDIV_INT (PLL_SYS_OFFSET + 0x08)
+#define PLL_SYS_FBDIV_FRAC (PLL_SYS_OFFSET + 0x0c)
+#define PLL_SYS_PRIM (PLL_SYS_OFFSET + 0x10)
+#define PLL_SYS_SEC (PLL_SYS_OFFSET + 0x14)
-#define PLL_AUDIO_OFFSET 0x0c000
-#define PLL_AUDIO_CS (PLL_AUDIO_OFFSET + 0x00)
-#define PLL_AUDIO_PWR (PLL_AUDIO_OFFSET + 0x04)
-#define PLL_AUDIO_FBDIV_INT (PLL_AUDIO_OFFSET + 0x08)
-#define PLL_AUDIO_FBDIV_FRAC (PLL_AUDIO_OFFSET + 0x0c)
-#define PLL_AUDIO_PRIM (PLL_AUDIO_OFFSET + 0x10)
-#define PLL_AUDIO_SEC (PLL_AUDIO_OFFSET + 0x14)
-#define PLL_AUDIO_TERN (PLL_AUDIO_OFFSET + 0x18)
+#define PLL_AUDIO_OFFSET 0x0c000
+#define PLL_AUDIO_CS (PLL_AUDIO_OFFSET + 0x00)
+#define PLL_AUDIO_PWR (PLL_AUDIO_OFFSET + 0x04)
+#define PLL_AUDIO_FBDIV_INT (PLL_AUDIO_OFFSET + 0x08)
+#define PLL_AUDIO_FBDIV_FRAC (PLL_AUDIO_OFFSET + 0x0c)
+#define PLL_AUDIO_PRIM (PLL_AUDIO_OFFSET + 0x10)
+#define PLL_AUDIO_SEC (PLL_AUDIO_OFFSET + 0x14)
+#define PLL_AUDIO_TERN (PLL_AUDIO_OFFSET + 0x18)
-#define PLL_VIDEO_OFFSET 0x10000
-#define PLL_VIDEO_CS (PLL_VIDEO_OFFSET + 0x00)
-#define PLL_VIDEO_PWR (PLL_VIDEO_OFFSET + 0x04)
-#define PLL_VIDEO_FBDIV_INT (PLL_VIDEO_OFFSET + 0x08)
-#define PLL_VIDEO_FBDIV_FRAC (PLL_VIDEO_OFFSET + 0x0c)
-#define PLL_VIDEO_PRIM (PLL_VIDEO_OFFSET + 0x10)
-#define PLL_VIDEO_SEC (PLL_VIDEO_OFFSET + 0x14)
+#define PLL_VIDEO_OFFSET 0x10000
+#define PLL_VIDEO_CS (PLL_VIDEO_OFFSET + 0x00)
+#define PLL_VIDEO_PWR (PLL_VIDEO_OFFSET + 0x04)
+#define PLL_VIDEO_FBDIV_INT (PLL_VIDEO_OFFSET + 0x08)
+#define PLL_VIDEO_FBDIV_FRAC (PLL_VIDEO_OFFSET + 0x0c)
+#define PLL_VIDEO_PRIM (PLL_VIDEO_OFFSET + 0x10)
+#define PLL_VIDEO_SEC (PLL_VIDEO_OFFSET + 0x14)
-#define GPCLK_OE_CTRL 0x00000
+#define GPCLK_OE_CTRL 0x00000
-#define CLK_SYS_OFFSET 0x00014
-#define CLK_SYS_CTRL (CLK_SYS_OFFSET + 0x00)
-#define CLK_SYS_DIV_INT (CLK_SYS_OFFSET + 0x04)
-#define CLK_SYS_SEL (CLK_SYS_OFFSET + 0x0c)
+#define CLK_SYS_OFFSET 0x00014
+#define CLK_SYS_CTRL (CLK_SYS_OFFSET + 0x00)
+#define CLK_SYS_DIV_INT (CLK_SYS_OFFSET + 0x04)
+#define CLK_SYS_SEL (CLK_SYS_OFFSET + 0x0c)
-#define CLK_SLOW_OFFSET 0x00024
-#define CLK_SLOW_SYS_CTRL (CLK_SLOW_OFFSET + 0x00)
-#define CLK_SLOW_SYS_DIV_INT (CLK_SLOW_OFFSET + 0x04)
-#define CLK_SLOW_SYS_SEL (CLK_SLOW_OFFSET + 0x0c)
+#define CLK_SLOW_OFFSET 0x00024
+#define CLK_SLOW_SYS_CTRL (CLK_SLOW_OFFSET + 0x00)
+#define CLK_SLOW_SYS_DIV_INT (CLK_SLOW_OFFSET + 0x04)
+#define CLK_SLOW_SYS_SEL (CLK_SLOW_OFFSET + 0x0c)
-#define CLK_DMA_OFFSET 0x00044
-#define CLK_DMA_CTRL (CLK_DMA_OFFSET + 0x00)
-#define CLK_DMA_DIV_INT (CLK_DMA_OFFSET + 0x04)
-#define CLK_DMA_SEL (CLK_DMA_OFFSET + 0x0c)
+#define CLK_DMA_OFFSET 0x00044
+#define CLK_DMA_CTRL (CLK_DMA_OFFSET + 0x00)
+#define CLK_DMA_DIV_INT (CLK_DMA_OFFSET + 0x04)
+#define CLK_DMA_SEL (CLK_DMA_OFFSET + 0x0c)
-#define CLK_UART_OFFSET 0x00054
-#define CLK_UART_CTRL (CLK_UART_OFFSET + 0x00)
-#define CLK_UART_DIV_INT (CLK_UART_OFFSET + 0x04)
-#define CLK_UART_SEL (CLK_UART_OFFSET + 0x0c)
+#define CLK_UART_OFFSET 0x00054
+#define CLK_UART_CTRL (CLK_UART_OFFSET + 0x00)
+#define CLK_UART_DIV_INT (CLK_UART_OFFSET + 0x04)
+#define CLK_UART_SEL (CLK_UART_OFFSET + 0x0c)
-#define CLK_ETH_OFFSET 0x00064
-#define CLK_ETH_CTRL (CLK_ETH_OFFSET + 0x00)
-#define CLK_ETH_DIV_INT (CLK_ETH_OFFSET + 0x04)
-#define CLK_ETH_SEL (CLK_ETH_OFFSET + 0x0c)
+#define CLK_ETH_OFFSET 0x00064
+#define CLK_ETH_CTRL (CLK_ETH_OFFSET + 0x00)
+#define CLK_ETH_DIV_INT (CLK_ETH_OFFSET + 0x04)
+#define CLK_ETH_SEL (CLK_ETH_OFFSET + 0x0c)
-#define CLK_PWM0_OFFSET 0x00074
-#define CLK_PWM0_CTRL (CLK_PWM0_OFFSET + 0x00)
-#define CLK_PWM0_DIV_INT (CLK_PWM0_OFFSET + 0x04)
-#define CLK_PWM0_DIV_FRAC (CLK_PWM0_OFFSET + 0x08)
-#define CLK_PWM0_SEL (CLK_PWM0_OFFSET + 0x0c)
+#define CLK_PWM0_OFFSET 0x00074
+#define CLK_PWM0_CTRL (CLK_PWM0_OFFSET + 0x00)
+#define CLK_PWM0_DIV_INT (CLK_PWM0_OFFSET + 0x04)
+#define CLK_PWM0_DIV_FRAC (CLK_PWM0_OFFSET + 0x08)
+#define CLK_PWM0_SEL (CLK_PWM0_OFFSET + 0x0c)
-#define CLK_PWM1_OFFSET 0x00084
-#define CLK_PWM1_CTRL (CLK_PWM1_OFFSET + 0x00)
-#define CLK_PWM1_DIV_INT (CLK_PWM1_OFFSET + 0x04)
-#define CLK_PWM1_DIV_FRAC (CLK_PWM1_OFFSET + 0x08)
-#define CLK_PWM1_SEL (CLK_PWM1_OFFSET + 0x0c)
+#define CLK_PWM1_OFFSET 0x00084
+#define CLK_PWM1_CTRL (CLK_PWM1_OFFSET + 0x00)
+#define CLK_PWM1_DIV_INT (CLK_PWM1_OFFSET + 0x04)
+#define CLK_PWM1_DIV_FRAC (CLK_PWM1_OFFSET + 0x08)
+#define CLK_PWM1_SEL (CLK_PWM1_OFFSET + 0x0c)
-#define CLK_AUDIO_IN_OFFSET 0x00094
-#define CLK_AUDIO_IN_CTRL (CLK_AUDIO_IN_OFFSET + 0x00)
-#define CLK_AUDIO_IN_DIV_INT (CLK_AUDIO_IN_OFFSET + 0x04)
-#define CLK_AUDIO_IN_SEL (CLK_AUDIO_IN_OFFSET + 0x0c)
+#define CLK_AUDIO_IN_OFFSET 0x00094
+#define CLK_AUDIO_IN_CTRL (CLK_AUDIO_IN_OFFSET + 0x00)
+#define CLK_AUDIO_IN_DIV_INT (CLK_AUDIO_IN_OFFSET + 0x04)
+#define CLK_AUDIO_IN_SEL (CLK_AUDIO_IN_OFFSET + 0x0c)
-#define CLK_AUDIO_OUT_OFFSET 0x000a4
-#define CLK_AUDIO_OUT_CTRL (CLK_AUDIO_OUT_OFFSET + 0x00)
-#define CLK_AUDIO_OUT_DIV_INT (CLK_AUDIO_OUT_OFFSET + 0x04)
-#define CLK_AUDIO_OUT_SEL (CLK_AUDIO_OUT_OFFSET + 0x0c)
+#define CLK_AUDIO_OUT_OFFSET 0x000a4
+#define CLK_AUDIO_OUT_CTRL (CLK_AUDIO_OUT_OFFSET + 0x00)
+#define CLK_AUDIO_OUT_DIV_INT (CLK_AUDIO_OUT_OFFSET + 0x04)
+#define CLK_AUDIO_OUT_SEL (CLK_AUDIO_OUT_OFFSET + 0x0c)
-#define CLK_I2S_OFFSET 0x000b4
-#define CLK_I2S_CTRL (CLK_I2S_OFFSET + 0x00)
-#define CLK_I2S_DIV_INT (CLK_I2S_OFFSET + 0x04)
-#define CLK_I2S_SEL (CLK_I2S_OFFSET + 0x0c)
+#define CLK_I2S_OFFSET 0x000b4
+#define CLK_I2S_CTRL (CLK_I2S_OFFSET + 0x00)
+#define CLK_I2S_DIV_INT (CLK_I2S_OFFSET + 0x04)
+#define CLK_I2S_SEL (CLK_I2S_OFFSET + 0x0c)
-#define CLK_MIPI0_CFG_OFFSET 0x000c4
-#define CLK_MIPI0_CFG_CTRL (CLK_MIPI0_CFG_OFFSET + 0x00)
-#define CLK_MIPI0_CFG_DIV_INT (CLK_MIPI0_CFG_OFFSET + 0x04)
-#define CLK_MIPI0_CFG_SEL (CLK_MIPI0_CFG_OFFSET + 0x0c)
+#define CLK_MIPI0_CFG_OFFSET 0x000c4
+#define CLK_MIPI0_CFG_CTRL (CLK_MIPI0_CFG_OFFSET + 0x00)
+#define CLK_MIPI0_CFG_DIV_INT (CLK_MIPI0_CFG_OFFSET + 0x04)
+#define CLK_MIPI0_CFG_SEL (CLK_MIPI0_CFG_OFFSET + 0x0c)
-#define CLK_MIPI1_CFG_OFFSET 0x000d4
-#define CLK_MIPI1_CFG_CTRL (CLK_MIPI1_CFG_OFFSET + 0x00)
-#define CLK_MIPI1_CFG_DIV_INT (CLK_MIPI1_CFG_OFFSET + 0x04)
-#define CLK_MIPI1_CFG_SEL (CLK_MIPI1_CFG_OFFSET + 0x0c)
+#define CLK_MIPI1_CFG_OFFSET 0x000d4
+#define CLK_MIPI1_CFG_CTRL (CLK_MIPI1_CFG_OFFSET + 0x00)
+#define CLK_MIPI1_CFG_DIV_INT (CLK_MIPI1_CFG_OFFSET + 0x04)
+#define CLK_MIPI1_CFG_SEL (CLK_MIPI1_CFG_OFFSET + 0x0c)
-#define CLK_PCIE_AUX_OFFSET 0x000e4
-#define CLK_PCIE_AUX_CTRL (CLK_PCIE_AUX_OFFSET + 0x00)
-#define CLK_PCIE_AUX_DIV_INT (CLK_PCIE_AUX_OFFSET + 0x04)
-#define CLK_PCIE_AUX_SEL (CLK_PCIE_AUX_OFFSET + 0x0c)
+#define CLK_PCIE_AUX_OFFSET 0x000e4
+#define CLK_PCIE_AUX_CTRL (CLK_PCIE_AUX_OFFSET + 0x00)
+#define CLK_PCIE_AUX_DIV_INT (CLK_PCIE_AUX_OFFSET + 0x04)
+#define CLK_PCIE_AUX_SEL (CLK_PCIE_AUX_OFFSET + 0x0c)
-#define CLK_USBH0_MICROFRAME_OFFSET 0x000f4
-#define CLK_USBH0_MICROFRAME_CTRL (CLK_USBH0_MICROFRAME_OFFSET + 0x00)
-#define CLK_USBH0_MICROFRAME_DIV_INT (CLK_USBH0_MICROFRAME_OFFSET + 0x04)
-#define CLK_USBH0_MICROFRAME_SEL (CLK_USBH0_MICROFRAME_OFFSET + 0x0c)
+#define CLK_USBH0_MICROFRAME_OFFSET 0x000f4
+#define CLK_USBH0_MICROFRAME_CTRL (CLK_USBH0_MICROFRAME_OFFSET + 0x00)
+#define CLK_USBH0_MICROFRAME_DIV_INT (CLK_USBH0_MICROFRAME_OFFSET + 0x04)
+#define CLK_USBH0_MICROFRAME_SEL (CLK_USBH0_MICROFRAME_OFFSET + 0x0c)
-#define CLK_USBH1_MICROFRAME_OFFSET 0x00104
-#define CLK_USBH1_MICROFRAME_CTRL (CLK_USBH1_MICROFRAME_OFFSET + 0x00)
-#define CLK_USBH1_MICROFRAME_DIV_INT (CLK_USBH1_MICROFRAME_OFFSET + 0x04)
-#define CLK_USBH1_MICROFRAME_SEL (CLK_USBH1_MICROFRAME_OFFSET + 0x0c)
+#define CLK_USBH1_MICROFRAME_OFFSET 0x00104
+#define CLK_USBH1_MICROFRAME_CTRL (CLK_USBH1_MICROFRAME_OFFSET + 0x00)
+#define CLK_USBH1_MICROFRAME_DIV_INT (CLK_USBH1_MICROFRAME_OFFSET + 0x04)
+#define CLK_USBH1_MICROFRAME_SEL (CLK_USBH1_MICROFRAME_OFFSET + 0x0c)
-#define CLK_USBH0_SUSPEND_OFFSET 0x00114
-#define CLK_USBH0_SUSPEND_CTRL (CLK_USBH0_SUSPEND_OFFSET + 0x00)
-#define CLK_USBH0_SUSPEND_DIV_INT (CLK_USBH0_SUSPEND_OFFSET + 0x04)
-#define CLK_USBH0_SUSPEND_SEL (CLK_USBH0_SUSPEND_OFFSET + 0x0c)
+#define CLK_USBH0_SUSPEND_OFFSET 0x00114
+#define CLK_USBH0_SUSPEND_CTRL (CLK_USBH0_SUSPEND_OFFSET + 0x00)
+#define CLK_USBH0_SUSPEND_DIV_INT (CLK_USBH0_SUSPEND_OFFSET + 0x04)
+#define CLK_USBH0_SUSPEND_SEL (CLK_USBH0_SUSPEND_OFFSET + 0x0c)
-#define CLK_USBH1_SUSPEND_OFFSET 0x00124
-#define CLK_USBH1_SUSPEND_CTRL (CLK_USBH1_SUSPEND_OFFSET + 0x00)
-#define CLK_USBH1_SUSPEND_DIV_INT (CLK_USBH1_SUSPEND_OFFSET + 0x04)
-#define CLK_USBH1_SUSPEND_SEL (CLK_USBH1_SUSPEND_OFFSET + 0x0c)
+#define CLK_USBH1_SUSPEND_OFFSET 0x00124
+#define CLK_USBH1_SUSPEND_CTRL (CLK_USBH1_SUSPEND_OFFSET + 0x00)
+#define CLK_USBH1_SUSPEND_DIV_INT (CLK_USBH1_SUSPEND_OFFSET + 0x04)
+#define CLK_USBH1_SUSPEND_SEL (CLK_USBH1_SUSPEND_OFFSET + 0x0c)
-#define CLK_ETH_TSU_OFFSET 0x00134
-#define CLK_ETH_TSU_CTRL (CLK_ETH_TSU_OFFSET + 0x00)
-#define CLK_ETH_TSU_DIV_INT (CLK_ETH_TSU_OFFSET + 0x04)
-#define CLK_ETH_TSU_SEL (CLK_ETH_TSU_OFFSET + 0x0c)
+#define CLK_ETH_TSU_OFFSET 0x00134
+#define CLK_ETH_TSU_CTRL (CLK_ETH_TSU_OFFSET + 0x00)
+#define CLK_ETH_TSU_DIV_INT (CLK_ETH_TSU_OFFSET + 0x04)
+#define CLK_ETH_TSU_SEL (CLK_ETH_TSU_OFFSET + 0x0c)
-#define CLK_ADC_OFFSET 0x00144
-#define CLK_ADC_CTRL (CLK_ADC_OFFSET + 0x00)
-#define CLK_ADC_DIV_INT (CLK_ADC_OFFSET + 0x04)
-#define CLK_ADC_SEL (CLK_ADC_OFFSET + 0x0c)
+#define CLK_ADC_OFFSET 0x00144
+#define CLK_ADC_CTRL (CLK_ADC_OFFSET + 0x00)
+#define CLK_ADC_DIV_INT (CLK_ADC_OFFSET + 0x04)
+#define CLK_ADC_SEL (CLK_ADC_OFFSET + 0x0c)
-#define CLK_SDIO_TIMER_OFFSET 0x00154
-#define CLK_SDIO_TIMER_CTRL (CLK_SDIO_TIMER_OFFSET + 0x00)
-#define CLK_SDIO_TIMER_DIV_INT (CLK_SDIO_TIMER_OFFSET + 0x04)
-#define CLK_SDIO_TIMER_SEL (CLK_SDIO_TIMER_OFFSET + 0x0c)
+#define CLK_SDIO_TIMER_OFFSET 0x00154
+#define CLK_SDIO_TIMER_CTRL (CLK_SDIO_TIMER_OFFSET + 0x00)
+#define CLK_SDIO_TIMER_DIV_INT (CLK_SDIO_TIMER_OFFSET + 0x04)
+#define CLK_SDIO_TIMER_SEL (CLK_SDIO_TIMER_OFFSET + 0x0c)
-#define CLK_SDIO_ALT_SRC_OFFSET 0x00164
-#define CLK_SDIO_ALT_SRC_CTRL (CLK_SDIO_ALT_SRC_OFFSET + 0x00)
-#define CLK_SDIO_ALT_SRC_DIV_INT (CLK_SDIO_ALT_SRC_OFFSET + 0x04)
-#define CLK_SDIO_ALT_SRC_SEL (CLK_SDIO_ALT_SRC_OFFSET + 0x0c)
+#define CLK_SDIO_ALT_SRC_OFFSET 0x00164
+#define CLK_SDIO_ALT_SRC_CTRL (CLK_SDIO_ALT_SRC_OFFSET + 0x00)
+#define CLK_SDIO_ALT_SRC_DIV_INT (CLK_SDIO_ALT_SRC_OFFSET + 0x04)
+#define CLK_SDIO_ALT_SRC_SEL (CLK_SDIO_ALT_SRC_OFFSET + 0x0c)
-#define CLK_GP0_OFFSET 0x00174
-#define CLK_GP0_CTRL (CLK_GP0_OFFSET + 0x00)
-#define CLK_GP0_DIV_INT (CLK_GP0_OFFSET + 0x04)
-#define CLK_GP0_DIV_FRAC (CLK_GP0_OFFSET + 0x08)
-#define CLK_GP0_SEL (CLK_GP0_OFFSET + 0x0c)
+#define CLK_GP0_OFFSET 0x00174
+#define CLK_GP0_CTRL (CLK_GP0_OFFSET + 0x00)
+#define CLK_GP0_DIV_INT (CLK_GP0_OFFSET + 0x04)
+#define CLK_GP0_DIV_FRAC (CLK_GP0_OFFSET + 0x08)
+#define CLK_GP0_SEL (CLK_GP0_OFFSET + 0x0c)
-#define CLK_GP1_OFFSET 0x00184
-#define CLK_GP1_CTRL (CLK_GP1_OFFSET + 0x00)
-#define CLK_GP1_DIV_INT (CLK_GP1_OFFSET + 0x04)
-#define CLK_GP1_DIV_FRAC (CLK_GP1_OFFSET + 0x08)
-#define CLK_GP1_SEL (CLK_GP1_OFFSET + 0x0c)
+#define CLK_GP1_OFFSET 0x00184
+#define CLK_GP1_CTRL (CLK_GP1_OFFSET + 0x00)
+#define CLK_GP1_DIV_INT (CLK_GP1_OFFSET + 0x04)
+#define CLK_GP1_DIV_FRAC (CLK_GP1_OFFSET + 0x08)
+#define CLK_GP1_SEL (CLK_GP1_OFFSET + 0x0c)
-#define CLK_GP2_OFFSET 0x00194
-#define CLK_GP2_CTRL (CLK_GP2_OFFSET + 0x00)
-#define CLK_GP2_DIV_INT (CLK_GP2_OFFSET + 0x04)
-#define CLK_GP2_DIV_FRAC (CLK_GP2_OFFSET + 0x08)
-#define CLK_GP2_SEL (CLK_GP2_OFFSET + 0x0c)
+#define CLK_GP2_OFFSET 0x00194
+#define CLK_GP2_CTRL (CLK_GP2_OFFSET + 0x00)
+#define CLK_GP2_DIV_INT (CLK_GP2_OFFSET + 0x04)
+#define CLK_GP2_DIV_FRAC (CLK_GP2_OFFSET + 0x08)
+#define CLK_GP2_SEL (CLK_GP2_OFFSET + 0x0c)
-#define CLK_GP3_OFFSET 0x001a4
-#define CLK_GP3_CTRL (CLK_GP3_OFFSET + 0x00)
-#define CLK_GP3_DIV_INT (CLK_GP3_OFFSET + 0x04)
-#define CLK_GP3_DIV_FRAC (CLK_GP3_OFFSET + 0x08)
-#define CLK_GP3_SEL (CLK_GP3_OFFSET + 0x0c)
+#define CLK_GP3_OFFSET 0x001a4
+#define CLK_GP3_CTRL (CLK_GP3_OFFSET + 0x00)
+#define CLK_GP3_DIV_INT (CLK_GP3_OFFSET + 0x04)
+#define CLK_GP3_DIV_FRAC (CLK_GP3_OFFSET + 0x08)
+#define CLK_GP3_SEL (CLK_GP3_OFFSET + 0x0c)
-#define CLK_GP4_OFFSET 0x001b4
-#define CLK_GP4_CTRL (CLK_GP4_OFFSET + 0x00)
-#define CLK_GP4_DIV_INT (CLK_GP4_OFFSET + 0x04)
-#define CLK_GP4_DIV_FRAC (CLK_GP4_OFFSET + 0x08)
-#define CLK_GP4_SEL (CLK_GP4_OFFSET + 0x0c)
+#define CLK_GP4_OFFSET 0x001b4
+#define CLK_GP4_CTRL (CLK_GP4_OFFSET + 0x00)
+#define CLK_GP4_DIV_INT (CLK_GP4_OFFSET + 0x04)
+#define CLK_GP4_DIV_FRAC (CLK_GP4_OFFSET + 0x08)
+#define CLK_GP4_SEL (CLK_GP4_OFFSET + 0x0c)
-#define CLK_GP5_OFFSET 0x001c4
-#define CLK_GP5_CTRL (CLK_GP5_OFFSET + 0x00)
-#define CLK_GP5_DIV_INT (CLK_GP5_OFFSET + 0x04)
-#define CLK_GP5_DIV_FRAC (CLK_GP5_OFFSET + 0x08)
-#define CLK_GP5_SEL (CLK_GP5_OFFSET + 0x0c)
+#define CLK_GP5_OFFSET 0x001c4
+#define CLK_GP5_CTRL (CLK_GP5_OFFSET + 0x00)
+#define CLK_GP5_DIV_INT (CLK_GP5_OFFSET + 0x04)
+#define CLK_GP5_DIV_FRAC (CLK_GP5_OFFSET + 0x08)
+#define CLK_GP5_SEL (CLK_GP5_OFFSET + 0x0c)
-#define CLK_SYS_RESUS_CTRL 0x0020c
+#define CLK_SYS_RESUS_CTRL 0x0020c
-#define CLK_SLOW_SYS_RESUS_CTRL 0x00214
+#define CLK_SLOW_SYS_RESUS_CTRL 0x00214
-#define FC0_OFFSET 0x0021c
-#define FC0_REF_KHZ (FC0_OFFSET + 0x00)
-#define FC0_MIN_KHZ (FC0_OFFSET + 0x04)
-#define FC0_MAX_KHZ (FC0_OFFSET + 0x08)
-#define FC0_DELAY (FC0_OFFSET + 0x0c)
-#define FC0_INTERVAL (FC0_OFFSET + 0x10)
-#define FC0_SRC (FC0_OFFSET + 0x14)
-#define FC0_STATUS (FC0_OFFSET + 0x18)
-#define FC0_RESULT (FC0_OFFSET + 0x1c)
-#define FC_SIZE 0x20
-#define FC_COUNT 8
-#define FC_NUM(idx, off) ((idx) * 32 + (off))
+#define FC0_OFFSET 0x0021c
+#define FC0_REF_KHZ (FC0_OFFSET + 0x00)
+#define FC0_MIN_KHZ (FC0_OFFSET + 0x04)
+#define FC0_MAX_KHZ (FC0_OFFSET + 0x08)
+#define FC0_DELAY (FC0_OFFSET + 0x0c)
+#define FC0_INTERVAL (FC0_OFFSET + 0x10)
+#define FC0_SRC (FC0_OFFSET + 0x14)
+#define FC0_STATUS (FC0_OFFSET + 0x18)
+#define FC0_RESULT (FC0_OFFSET + 0x1c)
+#define FC_SIZE 0x20
+#define FC_COUNT 8
+#define FC_NUM(idx, off) ((idx) * 32 + (off))
-#define AUX_SEL 1
+#define AUX_SEL 1
-#define VIDEO_CLOCKS_OFFSET 0x4000
-#define VIDEO_CLK_VEC_CTRL (VIDEO_CLOCKS_OFFSET + 0x0000)
-#define VIDEO_CLK_VEC_DIV_INT (VIDEO_CLOCKS_OFFSET + 0x0004)
-#define VIDEO_CLK_VEC_SEL (VIDEO_CLOCKS_OFFSET + 0x000c)
-#define VIDEO_CLK_DPI_CTRL (VIDEO_CLOCKS_OFFSET + 0x0010)
-#define VIDEO_CLK_DPI_DIV_INT (VIDEO_CLOCKS_OFFSET + 0x0014)
-#define VIDEO_CLK_DPI_SEL (VIDEO_CLOCKS_OFFSET + 0x001c)
-#define VIDEO_CLK_MIPI0_DPI_CTRL (VIDEO_CLOCKS_OFFSET + 0x0020)
-#define VIDEO_CLK_MIPI0_DPI_DIV_INT (VIDEO_CLOCKS_OFFSET + 0x0024)
-#define VIDEO_CLK_MIPI0_DPI_DIV_FRAC (VIDEO_CLOCKS_OFFSET + 0x0028)
-#define VIDEO_CLK_MIPI0_DPI_SEL (VIDEO_CLOCKS_OFFSET + 0x002c)
-#define VIDEO_CLK_MIPI1_DPI_CTRL (VIDEO_CLOCKS_OFFSET + 0x0030)
-#define VIDEO_CLK_MIPI1_DPI_DIV_INT (VIDEO_CLOCKS_OFFSET + 0x0034)
-#define VIDEO_CLK_MIPI1_DPI_DIV_FRAC (VIDEO_CLOCKS_OFFSET + 0x0038)
-#define VIDEO_CLK_MIPI1_DPI_SEL (VIDEO_CLOCKS_OFFSET + 0x003c)
+#define VIDEO_CLOCKS_OFFSET 0x4000
+#define VIDEO_CLK_VEC_CTRL (VIDEO_CLOCKS_OFFSET + 0x0000)
+#define VIDEO_CLK_VEC_DIV_INT (VIDEO_CLOCKS_OFFSET + 0x0004)
+#define VIDEO_CLK_VEC_SEL (VIDEO_CLOCKS_OFFSET + 0x000c)
+#define VIDEO_CLK_DPI_CTRL (VIDEO_CLOCKS_OFFSET + 0x0010)
+#define VIDEO_CLK_DPI_DIV_INT (VIDEO_CLOCKS_OFFSET + 0x0014)
+#define VIDEO_CLK_DPI_SEL (VIDEO_CLOCKS_OFFSET + 0x001c)
+#define VIDEO_CLK_MIPI0_DPI_CTRL (VIDEO_CLOCKS_OFFSET + 0x0020)
+#define VIDEO_CLK_MIPI0_DPI_DIV_INT (VIDEO_CLOCKS_OFFSET + 0x0024)
+#define VIDEO_CLK_MIPI0_DPI_DIV_FRAC (VIDEO_CLOCKS_OFFSET + 0x0028)
+#define VIDEO_CLK_MIPI0_DPI_SEL (VIDEO_CLOCKS_OFFSET + 0x002c)
+#define VIDEO_CLK_MIPI1_DPI_CTRL (VIDEO_CLOCKS_OFFSET + 0x0030)
+#define VIDEO_CLK_MIPI1_DPI_DIV_INT (VIDEO_CLOCKS_OFFSET + 0x0034)
+#define VIDEO_CLK_MIPI1_DPI_DIV_FRAC (VIDEO_CLOCKS_OFFSET + 0x0038)
+#define VIDEO_CLK_MIPI1_DPI_SEL (VIDEO_CLOCKS_OFFSET + 0x003c)
-#define DIV_INT_8BIT_MAX GENMASK(7, 0) /* max divide for most clocks */
-#define DIV_INT_16BIT_MAX GENMASK(15, 0) /* max divide for GPx, PWM */
-#define DIV_INT_24BIT_MAX GENMASK(23, 0) /* max divide for CLK_SYS */
+#define DIV_INT_8BIT_MAX GENMASK(7, 0) /* max divide for most clocks */
+#define DIV_INT_16BIT_MAX GENMASK(15, 0) /* max divide for GPx, PWM */
+#define DIV_INT_24BIT_MAX GENMASK(23, 0) /* max divide for CLK_SYS */
-#define FC0_STATUS_DONE BIT(4)
-#define FC0_STATUS_RUNNING BIT(8)
-#define FC0_RESULT_FRAC_SHIFT 5
+#define FC0_STATUS_DONE BIT(4)
+#define FC0_STATUS_RUNNING BIT(8)
+#define FC0_RESULT_FRAC_SHIFT 5
-#define PLL_PRIM_DIV1_MASK GENMASK(18, 16)
-#define PLL_PRIM_DIV2_MASK GENMASK(14, 12)
+#define PLL_PRIM_DIV1_MASK GENMASK(18, 16)
+#define PLL_PRIM_DIV2_MASK GENMASK(14, 12)
-#define PLL_SEC_DIV_MASK GENMASK(12, 8)
+#define PLL_SEC_DIV_MASK GENMASK(12, 8)
-#define PLL_CS_LOCK BIT(31)
-#define PLL_CS_REFDIV_MASK BIT(1)
+#define PLL_CS_LOCK BIT(31)
+#define PLL_CS_REFDIV_MASK BIT(1)
-#define PLL_PWR_PD BIT(0)
-#define PLL_PWR_DACPD BIT(1)
-#define PLL_PWR_DSMPD BIT(2)
-#define PLL_PWR_POSTDIVPD BIT(3)
-#define PLL_PWR_4PHASEPD BIT(4)
-#define PLL_PWR_VCOPD BIT(5)
-#define PLL_PWR_MASK GENMASK(5, 0)
+#define PLL_PWR_PD BIT(0)
+#define PLL_PWR_DACPD BIT(1)
+#define PLL_PWR_DSMPD BIT(2)
+#define PLL_PWR_POSTDIVPD BIT(3)
+#define PLL_PWR_4PHASEPD BIT(4)
+#define PLL_PWR_VCOPD BIT(5)
+#define PLL_PWR_MASK GENMASK(5, 0)
-#define PLL_SEC_RST BIT(16)
-#define PLL_SEC_IMPL BIT(31)
+#define PLL_SEC_RST BIT(16)
+#define PLL_SEC_IMPL BIT(31)
/* PLL phase output for both PRI and SEC */
-#define PLL_PH_EN BIT(4)
-#define PLL_PH_PHASE_SHIFT 0
+#define PLL_PH_EN BIT(4)
+#define PLL_PH_PHASE_SHIFT 0
-#define RP1_PLL_PHASE_0 0
-#define RP1_PLL_PHASE_90 1
-#define RP1_PLL_PHASE_180 2
-#define RP1_PLL_PHASE_270 3
+#define RP1_PLL_PHASE_0 0
+#define RP1_PLL_PHASE_90 1
+#define RP1_PLL_PHASE_180 2
+#define RP1_PLL_PHASE_270 3
/* Clock fields for all clocks */
-#define CLK_CTRL_ENABLE BIT(11)
-#define CLK_CTRL_AUXSRC_MASK GENMASK(9, 5)
-#define CLK_CTRL_SRC_SHIFT 0
-#define CLK_DIV_FRAC_BITS 16
+#define CLK_CTRL_ENABLE BIT(11)
+#define CLK_CTRL_AUXSRC_MASK GENMASK(9, 5)
+#define CLK_CTRL_SRC_SHIFT 0
+#define CLK_DIV_FRAC_BITS 16
-#define LOCK_TIMEOUT_US 100000
-#define LOCK_POLL_DELAY_US 5
+#define LOCK_TIMEOUT_US 100000
+#define LOCK_POLL_DELAY_US 5
-#define MAX_CLK_PARENTS 16
+#define MAX_CLK_PARENTS 16
-#define PLL_DIV_INVALID 19
+#define PLL_DIV_INVALID 19
/*
* Secondary PLL channel output divider table.
* Divider values range from 8 to 19, where
@@ -282,8 +282,8 @@ static const struct clk_div_table pll_sec_div_table[] = {
{ 0x05, PLL_DIV_INVALID },
{ 0x06, PLL_DIV_INVALID },
{ 0x07, PLL_DIV_INVALID },
- { 0x08, 8 },
- { 0x09, 9 },
+ { 0x08, 8 },
+ { 0x09, 9 },
{ 0x0a, 10 },
{ 0x0b, 11 },
{ 0x0c, 12 },
@@ -373,8 +373,8 @@ static struct rp1_clk_desc *clk_audio;
static struct rp1_clk_desc *clk_i2s;
static struct clk_hw *clk_xosc;
-static inline
-void clockman_write(struct rp1_clockman *clockman, u32 reg, u32 val)
+static inline void clockman_write(struct rp1_clockman *clockman, u32 reg,
+ u32 val)
{
regmap_write(clockman->regmap, reg, val);
}
@@ -390,7 +390,8 @@ static inline u32 clockman_read(struct rp1_clockman *clockman, u32 reg)
static int rp1_pll_core_is_on(struct clk_hw *hw)
{
- struct rp1_clk_desc *pll_core = container_of(hw, struct rp1_clk_desc, hw);
+ struct rp1_clk_desc *pll_core =
+ container_of(hw, struct rp1_clk_desc, hw);
struct rp1_clockman *clockman = pll_core->clockman;
const struct rp1_pll_core_data *data = pll_core->data;
u32 pwr = clockman_read(clockman, data->pwr_reg);
@@ -400,7 +401,8 @@ static int rp1_pll_core_is_on(struct clk_hw *hw)
static int rp1_pll_core_on(struct clk_hw *hw)
{
- struct rp1_clk_desc *pll_core = container_of(hw, struct rp1_clk_desc, hw);
+ struct rp1_clk_desc *pll_core =
+ container_of(hw, struct rp1_clk_desc, hw);
struct rp1_clockman *clockman = pll_core->clockman;
const struct rp1_pll_core_data *data = pll_core->data;
u32 fbdiv_frac, val;
@@ -423,8 +425,8 @@ static int rp1_pll_core_on(struct clk_hw *hw)
/* Wait for the PLL to lock. */
ret = regmap_read_poll_timeout(clockman->regmap, data->cs_reg, val,
- val & PLL_CS_LOCK,
- LOCK_POLL_DELAY_US, LOCK_TIMEOUT_US);
+ val & PLL_CS_LOCK, LOCK_POLL_DELAY_US,
+ LOCK_TIMEOUT_US);
if (ret)
dev_err(clockman->dev, "%s: can't lock PLL\n",
clk_hw_get_name(hw));
@@ -434,7 +436,8 @@ static int rp1_pll_core_on(struct clk_hw *hw)
static void rp1_pll_core_off(struct clk_hw *hw)
{
- struct rp1_clk_desc *pll_core = container_of(hw, struct rp1_clk_desc, hw);
+ struct rp1_clk_desc *pll_core =
+ container_of(hw, struct rp1_clk_desc, hw);
struct rp1_clockman *clockman = pll_core->clockman;
const struct rp1_pll_core_data *data = pll_core->data;
@@ -474,10 +477,11 @@ static inline unsigned long get_pll_core_divider(struct clk_hw *hw,
return calc_rate;
}
-static int rp1_pll_core_set_rate(struct clk_hw *hw,
- unsigned long rate, unsigned long parent_rate)
+static int rp1_pll_core_set_rate(struct clk_hw *hw, unsigned long rate,
+ unsigned long parent_rate)
{
- struct rp1_clk_desc *pll_core = container_of(hw, struct rp1_clk_desc, hw);
+ struct rp1_clk_desc *pll_core =
+ container_of(hw, struct rp1_clk_desc, hw);
struct rp1_clockman *clockman = pll_core->clockman;
const struct rp1_pll_core_data *data = pll_core->data;
u32 fbdiv_int, fbdiv_frac;
@@ -488,8 +492,7 @@ static int rp1_pll_core_set_rate(struct clk_hw *hw,
clockman_write(clockman, data->fbdiv_frac_reg, 0);
spin_unlock(&clockman->regs_lock);
- get_pll_core_divider(hw, rate, parent_rate,
- &fbdiv_int, &fbdiv_frac);
+ get_pll_core_divider(hw, rate, parent_rate, &fbdiv_int, &fbdiv_frac);
spin_lock(&clockman->regs_lock);
clockman_write(clockman, data->pwr_reg, fbdiv_frac ? 0 : PLL_PWR_DSMPD);
@@ -505,7 +508,7 @@ static int rp1_pll_core_set_rate(struct clk_hw *hw,
/* Don't need to divide ref unless parent_rate > (output freq / 16) */
clockman_write(clockman, data->cs_reg,
clockman_read(clockman, data->cs_reg) |
- PLL_CS_REFDIV_MASK);
+ PLL_CS_REFDIV_MASK);
spin_unlock(&clockman->regs_lock);
return 0;
@@ -514,7 +517,8 @@ static int rp1_pll_core_set_rate(struct clk_hw *hw,
static unsigned long rp1_pll_core_recalc_rate(struct clk_hw *hw,
unsigned long parent_rate)
{
- struct rp1_clk_desc *pll_core = container_of(hw, struct rp1_clk_desc, hw);
+ struct rp1_clk_desc *pll_core =
+ container_of(hw, struct rp1_clk_desc, hw);
struct rp1_clockman *clockman = pll_core->clockman;
const struct rp1_pll_core_data *data = pll_core->data;
u32 fbdiv_int, fbdiv_frac;
@@ -538,8 +542,7 @@ static int rp1_pll_core_determine_rate(struct clk_hw *hw,
u32 fbdiv_int, fbdiv_frac;
req->rate = get_pll_core_divider(hw, req->rate, req->best_parent_rate,
- &fbdiv_int,
- &fbdiv_frac);
+ &fbdiv_int, &fbdiv_frac);
return 0;
}
@@ -549,8 +552,8 @@ static void get_pll_prim_dividers(unsigned long rate, unsigned long parent_rate,
{
unsigned int div1, div2;
unsigned int best_div1 = 7, best_div2 = 7;
- unsigned long best_rate_diff =
- abs_diff(DIV_ROUND_CLOSEST(parent_rate, best_div1 * best_div2), rate);
+ unsigned long best_rate_diff = abs_diff(
+ DIV_ROUND_CLOSEST(parent_rate, best_div1 * best_div2), rate);
unsigned long rate_diff, calc_rate;
for (div1 = 1; div1 <= 7; div1++) {
@@ -575,8 +578,8 @@ done:
*divider2 = best_div2;
}
-static int rp1_pll_set_rate(struct clk_hw *hw,
- unsigned long rate, unsigned long parent_rate)
+static int rp1_pll_set_rate(struct clk_hw *hw, unsigned long rate,
+ unsigned long parent_rate)
{
struct rp1_clk_desc *pll = container_of(hw, struct rp1_clk_desc, hw);
struct rp1_clockman *clockman = pll->clockman;
@@ -695,7 +698,8 @@ static int rp1_pll_ph_determine_rate(struct clk_hw *hw,
static int rp1_pll_divider_is_on(struct clk_hw *hw)
{
- struct rp1_clk_desc *divider = container_of(hw, struct rp1_clk_desc, div.hw);
+ struct rp1_clk_desc *divider =
+ container_of(hw, struct rp1_clk_desc, div.hw);
struct rp1_clockman *clockman = divider->clockman;
const struct rp1_pll_data *data = divider->data;
@@ -704,7 +708,8 @@ static int rp1_pll_divider_is_on(struct clk_hw *hw)
static int rp1_pll_divider_on(struct clk_hw *hw)
{
- struct rp1_clk_desc *divider = container_of(hw, struct rp1_clk_desc, div.hw);
+ struct rp1_clk_desc *divider =
+ container_of(hw, struct rp1_clk_desc, div.hw);
struct rp1_clockman *clockman = divider->clockman;
const struct rp1_pll_data *data = divider->data;
@@ -720,7 +725,8 @@ static int rp1_pll_divider_on(struct clk_hw *hw)
static void rp1_pll_divider_off(struct clk_hw *hw)
{
- struct rp1_clk_desc *divider = container_of(hw, struct rp1_clk_desc, div.hw);
+ struct rp1_clk_desc *divider =
+ container_of(hw, struct rp1_clk_desc, div.hw);
struct rp1_clockman *clockman = divider->clockman;
const struct rp1_pll_data *data = divider->data;
@@ -730,11 +736,11 @@ static void rp1_pll_divider_off(struct clk_hw *hw)
spin_unlock(&clockman->regs_lock);
}
-static int rp1_pll_divider_set_rate(struct clk_hw *hw,
- unsigned long rate,
+static int rp1_pll_divider_set_rate(struct clk_hw *hw, unsigned long rate,
unsigned long parent_rate)
{
- struct rp1_clk_desc *divider = container_of(hw, struct rp1_clk_desc, div.hw);
+ struct rp1_clk_desc *divider =
+ container_of(hw, struct rp1_clk_desc, div.hw);
struct rp1_clockman *clockman = divider->clockman;
const struct rp1_pll_data *data = divider->data;
u32 div, sec;
@@ -796,7 +802,8 @@ static unsigned long rp1_clock_recalc_rate(struct clk_hw *hw,
div = clockman_read(clockman, data->div_int_reg);
frac = (data->div_frac_reg != 0) ?
- clockman_read(clockman, data->div_frac_reg) : 0;
+ clockman_read(clockman, data->div_frac_reg) :
+ 0;
/* If the integer portion of the divider is 0, treat it as 2^16 */
if (!div)
@@ -818,11 +825,13 @@ static int rp1_clock_on(struct clk_hw *hw)
spin_lock(&clockman->regs_lock);
clockman_write(clockman, data->ctrl_reg,
- clockman_read(clockman, data->ctrl_reg) | CLK_CTRL_ENABLE);
+ clockman_read(clockman, data->ctrl_reg) |
+ CLK_CTRL_ENABLE);
/* If this is a GPCLK, turn on the output-enable */
if (data->oe_mask)
clockman_write(clockman, GPCLK_OE_CTRL,
- clockman_read(clockman, GPCLK_OE_CTRL) | data->oe_mask);
+ clockman_read(clockman, GPCLK_OE_CTRL) |
+ data->oe_mask);
spin_unlock(&clockman->regs_lock);
return 0;
@@ -836,11 +845,13 @@ static void rp1_clock_off(struct clk_hw *hw)
spin_lock(&clockman->regs_lock);
clockman_write(clockman, data->ctrl_reg,
- clockman_read(clockman, data->ctrl_reg) & ~CLK_CTRL_ENABLE);
+ clockman_read(clockman, data->ctrl_reg) &
+ ~CLK_CTRL_ENABLE);
/* If this is a GPCLK, turn off the output-enable */
if (data->oe_mask)
clockman_write(clockman, GPCLK_OE_CTRL,
- clockman_read(clockman, GPCLK_OE_CTRL) & ~data->oe_mask);
+ clockman_read(clockman, GPCLK_OE_CTRL) &
+ ~data->oe_mask);
spin_unlock(&clockman->regs_lock);
}
@@ -868,8 +879,7 @@ static u32 rp1_clock_choose_div(unsigned long rate, unsigned long parent_rate,
div <<= CLK_DIV_FRAC_BITS;
}
- div = clamp(div,
- 1ull << CLK_DIV_FRAC_BITS,
+ div = clamp(div, 1ull << CLK_DIV_FRAC_BITS,
(u64)data->div_int_max << CLK_DIV_FRAC_BITS);
return div;
@@ -929,7 +939,8 @@ static int rp1_clock_set_parent(struct clk_hw *hw, u8 index)
/* Select parent from aux list */
ctrl &= ~CLK_CTRL_AUXSRC_MASK;
- ctrl |= FIELD_PREP(CLK_CTRL_AUXSRC_MASK, index - data->num_std_parents);
+ ctrl |= FIELD_PREP(CLK_CTRL_AUXSRC_MASK,
+ index - data->num_std_parents);
/* Set src to aux list */
ctrl &= ~data->clk_src_mask;
ctrl |= (AUX_SEL << CLK_CTRL_SRC_SHIFT) & data->clk_src_mask;
@@ -948,10 +959,8 @@ static int rp1_clock_set_parent(struct clk_hw *hw, u8 index)
return 0;
}
-static int rp1_clock_set_rate_and_parent(struct clk_hw *hw,
- unsigned long rate,
- unsigned long parent_rate,
- u8 parent)
+static int rp1_clock_set_rate_and_parent(struct clk_hw *hw, unsigned long rate,
+ unsigned long parent_rate, u8 parent)
{
struct rp1_clk_desc *clock = container_of(hw, struct rp1_clk_desc, hw);
struct rp1_clockman *clockman = clock->clockman;
@@ -962,7 +971,8 @@ static int rp1_clock_set_rate_and_parent(struct clk_hw *hw,
clockman_write(clockman, data->div_int_reg, div >> CLK_DIV_FRAC_BITS);
if (data->div_frac_reg)
- clockman_write(clockman, data->div_frac_reg, div << (32 - CLK_DIV_FRAC_BITS));
+ clockman_write(clockman, data->div_frac_reg,
+ div << (32 - CLK_DIV_FRAC_BITS));
spin_unlock(&clockman->regs_lock);
@@ -983,8 +993,8 @@ static unsigned long calc_core_pll_rate(struct clk_hw *pll_hw,
int *pdiv_prim, int *pdiv_clk)
{
static const int prim_divs[] = {
- 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16,
- 18, 20, 21, 24, 25, 28, 30, 35, 36, 42, 49,
+ 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15,
+ 16, 18, 20, 21, 24, 25, 28, 30, 35, 36, 42, 49,
};
const unsigned long xosc_rate = clk_hw_get_rate(clk_xosc);
const unsigned long core_min = xosc_rate * 16;
@@ -1018,7 +1028,9 @@ static unsigned long calc_core_pll_rate(struct clk_hw *pll_hw,
div = ((best_rate << 24) + xosc_rate / 2) / xosc_rate;
div_int = div >> 24;
div_frac = div % (1 << 24);
- core_rate = (xosc_rate * ((div_int << 24) + div_frac) + (1 << 23)) >> 24;
+ core_rate = (xosc_rate * ((div_int << 24) + div_frac) +
+ (1 << 23)) >>
+ 24;
} else {
core_rate = 0;
}
@@ -1031,8 +1043,7 @@ static unsigned long calc_core_pll_rate(struct clk_hw *pll_hw,
return core_rate;
}
-static void rp1_clock_choose_div_and_prate(struct clk_hw *hw,
- int parent_idx,
+static void rp1_clock_choose_div_and_prate(struct clk_hw *hw, int parent_idx,
unsigned long rate,
unsigned long *prate,
unsigned long *calc_rate)
@@ -1047,7 +1058,8 @@ static void rp1_clock_choose_div_and_prate(struct clk_hw *hw,
parent = clk_hw_get_parent_by_index(hw, parent_idx);
- if (hw == clk_i2s_hw && clk_i2s->cached_rate == rate && parent == clk_audio_hw) {
+ if (hw == clk_i2s_hw && clk_i2s->cached_rate == rate &&
+ parent == clk_audio_hw) {
*prate = clk_audio->cached_rate;
*calc_rate = rate;
return;
@@ -1057,7 +1069,8 @@ static void rp1_clock_choose_div_and_prate(struct clk_hw *hw,
unsigned long core_rate, audio_rate, i2s_rate;
int div_prim, div_clk;
- core_rate = calc_core_pll_rate(parent, rate, &div_prim, &div_clk);
+ core_rate =
+ calc_core_pll_rate(parent, rate, &div_prim, &div_clk);
audio_rate = DIV_ROUND_CLOSEST(core_rate, div_prim);
i2s_rate = DIV_ROUND_CLOSEST(audio_rate, div_clk);
clk_audio_core->cached_rate = core_rate;
@@ -1152,8 +1165,8 @@ static int rp1_clock_determine_rate(struct clk_hw *hw,
return 0;
}
-static int rp1_varsrc_set_rate(struct clk_hw *hw,
- unsigned long rate, unsigned long parent_rate)
+static int rp1_varsrc_set_rate(struct clk_hw *hw, unsigned long rate,
+ unsigned long parent_rate)
{
struct rp1_clk_desc *clock = container_of(hw, struct rp1_clk_desc, hw);
@@ -1273,8 +1286,8 @@ static struct clk_hw *rp1_register_clock(struct rp1_clockman *clockman,
const struct rp1_clock_data *clock_data = desc->data;
int ret;
- if (WARN_ON_ONCE(MAX_CLK_PARENTS <
- clock_data->num_std_parents + clock_data->num_aux_parents))
+ if (WARN_ON_ONCE(MAX_CLK_PARENTS < clock_data->num_std_parents +
+ clock_data->num_aux_parents))
return ERR_PTR(-EINVAL);
/* There must be a gap for the AUX selector */
@@ -1292,168 +1305,114 @@ static struct clk_hw *rp1_register_clock(struct rp1_clockman *clockman,
}
/* Assignment helper macros for different clock types. */
-#define _REGISTER(f, ...) { .clk_register = f, __VA_ARGS__ }
+#define _REGISTER(f, ...) { .clk_register = f, __VA_ARGS__ }
-#define CLK_DATA(type, ...) .data = &(struct type) { __VA_ARGS__ }
+#define CLK_DATA(type, ...) \
+ .data = &(struct type) \
+ { \
+ __VA_ARGS__ \
+ }
-#define REGISTER_PLL(...) _REGISTER(&rp1_register_pll, \
- __VA_ARGS__)
+#define REGISTER_PLL(...) _REGISTER(&rp1_register_pll, __VA_ARGS__)
-#define REGISTER_PLL_DIV(...) _REGISTER(&rp1_register_pll_divider, \
- __VA_ARGS__)
+#define REGISTER_PLL_DIV(...) _REGISTER(&rp1_register_pll_divider, __VA_ARGS__)
-#define REGISTER_CLK(...) _REGISTER(&rp1_register_clock, \
- __VA_ARGS__)
+#define REGISTER_CLK(...) _REGISTER(&rp1_register_clock, __VA_ARGS__)
-static struct rp1_clk_desc pll_sys_core_desc = REGISTER_PLL(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "pll_sys_core",
- (const struct clk_parent_data[]) { { .index = 0 } },
- &rp1_pll_core_ops,
- CLK_IS_CRITICAL
- ),
- CLK_DATA(rp1_pll_core_data,
- .cs_reg = PLL_SYS_CS,
- .pwr_reg = PLL_SYS_PWR,
- .fbdiv_int_reg = PLL_SYS_FBDIV_INT,
- .fbdiv_frac_reg = PLL_SYS_FBDIV_FRAC,
- )
-);
+static struct rp1_clk_desc pll_sys_core_desc =
+ REGISTER_PLL(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "pll_sys_core",
+ (const struct clk_parent_data[]){ { .index = 0 } },
+ &rp1_pll_core_ops, CLK_IS_CRITICAL),
+ CLK_DATA(rp1_pll_core_data, .cs_reg = PLL_SYS_CS,
+ .pwr_reg = PLL_SYS_PWR,
+ .fbdiv_int_reg = PLL_SYS_FBDIV_INT,
+ .fbdiv_frac_reg = PLL_SYS_FBDIV_FRAC, ));
-static struct rp1_clk_desc pll_audio_core_desc = REGISTER_PLL(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "pll_audio_core",
- (const struct clk_parent_data[]) { { .index = 0 } },
- &rp1_pll_core_ops,
- CLK_IS_CRITICAL
- ),
- CLK_DATA(rp1_pll_core_data,
- .cs_reg = PLL_AUDIO_CS,
- .pwr_reg = PLL_AUDIO_PWR,
- .fbdiv_int_reg = PLL_AUDIO_FBDIV_INT,
- .fbdiv_frac_reg = PLL_AUDIO_FBDIV_FRAC,
- )
-);
+static struct rp1_clk_desc pll_audio_core_desc =
+ REGISTER_PLL(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "pll_audio_core",
+ (const struct clk_parent_data[]){ { .index = 0 } },
+ &rp1_pll_core_ops, CLK_IS_CRITICAL),
+ CLK_DATA(rp1_pll_core_data, .cs_reg = PLL_AUDIO_CS,
+ .pwr_reg = PLL_AUDIO_PWR,
+ .fbdiv_int_reg = PLL_AUDIO_FBDIV_INT,
+ .fbdiv_frac_reg = PLL_AUDIO_FBDIV_FRAC, ));
-static struct rp1_clk_desc pll_video_core_desc = REGISTER_PLL(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "pll_video_core",
- (const struct clk_parent_data[]) { { .index = 0 } },
- &rp1_pll_core_ops,
- CLK_IS_CRITICAL
- ),
- CLK_DATA(rp1_pll_core_data,
- .cs_reg = PLL_VIDEO_CS,
- .pwr_reg = PLL_VIDEO_PWR,
- .fbdiv_int_reg = PLL_VIDEO_FBDIV_INT,
- .fbdiv_frac_reg = PLL_VIDEO_FBDIV_FRAC,
- )
-);
+static struct rp1_clk_desc pll_video_core_desc =
+ REGISTER_PLL(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "pll_video_core",
+ (const struct clk_parent_data[]){ { .index = 0 } },
+ &rp1_pll_core_ops, CLK_IS_CRITICAL),
+ CLK_DATA(rp1_pll_core_data, .cs_reg = PLL_VIDEO_CS,
+ .pwr_reg = PLL_VIDEO_PWR,
+ .fbdiv_int_reg = PLL_VIDEO_FBDIV_INT,
+ .fbdiv_frac_reg = PLL_VIDEO_FBDIV_FRAC, ));
-static struct rp1_clk_desc pll_sys_desc = REGISTER_PLL(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "pll_sys",
- (const struct clk_parent_data[]) {
- { .hw = &pll_sys_core_desc.hw }
- },
- &rp1_pll_ops,
- 0
- ),
- CLK_DATA(rp1_pll_data,
- .ctrl_reg = PLL_SYS_PRIM,
- .fc0_src = FC_NUM(0, 2),
- )
-);
+static struct rp1_clk_desc pll_sys_desc =
+ REGISTER_PLL(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "pll_sys",
+ (const struct clk_parent_data[]){
+ { .hw = &pll_sys_core_desc.hw } },
+ &rp1_pll_ops, 0),
+ CLK_DATA(rp1_pll_data, .ctrl_reg = PLL_SYS_PRIM,
+ .fc0_src = FC_NUM(0, 2), ));
-static struct rp1_clk_desc pll_audio_desc = REGISTER_PLL(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "pll_audio",
- (const struct clk_parent_data[]) {
- { .hw = &pll_audio_core_desc.hw }
- },
- &rp1_pll_ops,
- CLK_SET_RATE_PARENT
- ),
- CLK_DATA(rp1_pll_data,
- .ctrl_reg = PLL_AUDIO_PRIM,
- .fc0_src = FC_NUM(4, 2),
- )
-);
+static struct rp1_clk_desc pll_audio_desc =
+ REGISTER_PLL(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "pll_audio",
+ (const struct clk_parent_data[]){
+ { .hw = &pll_audio_core_desc.hw } },
+ &rp1_pll_ops, CLK_SET_RATE_PARENT),
+ CLK_DATA(rp1_pll_data, .ctrl_reg = PLL_AUDIO_PRIM,
+ .fc0_src = FC_NUM(4, 2), ));
-static struct rp1_clk_desc pll_video_desc = REGISTER_PLL(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "pll_video",
- (const struct clk_parent_data[]) {
- { .hw = &pll_video_core_desc.hw }
- },
- &rp1_pll_ops,
- 0
- ),
- CLK_DATA(rp1_pll_data,
- .ctrl_reg = PLL_VIDEO_PRIM,
- .fc0_src = FC_NUM(3, 2),
- )
-);
+static struct rp1_clk_desc pll_video_desc =
+ REGISTER_PLL(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "pll_video",
+ (const struct clk_parent_data[]){
+ { .hw = &pll_video_core_desc.hw } },
+ &rp1_pll_ops, 0),
+ CLK_DATA(rp1_pll_data, .ctrl_reg = PLL_VIDEO_PRIM,
+ .fc0_src = FC_NUM(3, 2), ));
-static struct rp1_clk_desc pll_sys_sec_desc = REGISTER_PLL_DIV(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "pll_sys_sec",
- (const struct clk_parent_data[]) {
- { .hw = &pll_sys_core_desc.hw }
- },
- &rp1_pll_divider_ops,
- 0
- ),
- CLK_DATA(rp1_pll_data,
- .ctrl_reg = PLL_SYS_SEC,
- .fc0_src = FC_NUM(2, 2),
- )
-);
+static struct rp1_clk_desc pll_sys_sec_desc =
+ REGISTER_PLL_DIV(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "pll_sys_sec",
+ (const struct clk_parent_data[]){
+ { .hw = &pll_sys_core_desc.hw } },
+ &rp1_pll_divider_ops, 0),
+ CLK_DATA(rp1_pll_data, .ctrl_reg = PLL_SYS_SEC,
+ .fc0_src = FC_NUM(2, 2), ));
-static struct rp1_clk_desc pll_video_sec_desc = REGISTER_PLL_DIV(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "pll_video_sec",
- (const struct clk_parent_data[]) {
- { .hw = &pll_video_core_desc.hw }
- },
- &rp1_pll_divider_ops,
- 0
- ),
- CLK_DATA(rp1_pll_data,
- .ctrl_reg = PLL_VIDEO_SEC,
- .fc0_src = FC_NUM(5, 3),
- )
-);
+static struct rp1_clk_desc pll_video_sec_desc =
+ REGISTER_PLL_DIV(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "pll_video_sec",
+ (const struct clk_parent_data[]){
+ { .hw = &pll_video_core_desc.hw } },
+ &rp1_pll_divider_ops, 0),
+ CLK_DATA(rp1_pll_data, .ctrl_reg = PLL_VIDEO_SEC,
+ .fc0_src = FC_NUM(5, 3), ));
static const struct clk_parent_data clk_eth_tsu_parents[] = {
- { .index = 0 },
- { .hw = &pll_video_sec_desc.hw },
- { .index = -1 },
- { .index = -1 },
- { .index = -1 },
- { .index = -1 },
- { .index = -1 },
- { .index = -1 },
+ { .index = 0 }, { .hw = &pll_video_sec_desc.hw },
+ { .index = -1 }, { .index = -1 },
+ { .index = -1 }, { .index = -1 },
+ { .index = -1 }, { .index = -1 },
};
-static struct rp1_clk_desc clk_eth_tsu_desc = REGISTER_CLK(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "clk_eth_tsu",
- clk_eth_tsu_parents,
- &rp1_clk_ops,
- 0
- ),
- CLK_DATA(rp1_clock_data,
- .num_std_parents = 0,
- .num_aux_parents = 8,
- .ctrl_reg = CLK_ETH_TSU_CTRL,
- .div_int_reg = CLK_ETH_TSU_DIV_INT,
- .sel_reg = CLK_ETH_TSU_SEL,
- .div_int_max = DIV_INT_8BIT_MAX,
- .max_freq = 50 * HZ_PER_MHZ,
- .fc0_src = FC_NUM(5, 7),
- )
-);
+static struct rp1_clk_desc clk_eth_tsu_desc =
+ REGISTER_CLK(.hw.init = CLK_HW_INIT_PARENTS_DATA("clk_eth_tsu",
+ clk_eth_tsu_parents,
+ &rp1_clk_ops, 0),
+ CLK_DATA(rp1_clock_data, .num_std_parents = 0,
+ .num_aux_parents = 8,
+ .ctrl_reg = CLK_ETH_TSU_CTRL,
+ .div_int_reg = CLK_ETH_TSU_DIV_INT,
+ .sel_reg = CLK_ETH_TSU_SEL,
+ .div_int_max = DIV_INT_8BIT_MAX,
+ .max_freq = 50 * HZ_PER_MHZ,
+ .fc0_src = FC_NUM(5, 7), ));
static const struct clk_parent_data clk_eth_parents[] = {
{ .hw = &pll_sys_sec_desc.div.hw },
@@ -1461,24 +1420,16 @@ static const struct clk_parent_data clk_eth_parents[] = {
{ .hw = &pll_video_sec_desc.hw },
};
-static struct rp1_clk_desc clk_eth_desc = REGISTER_CLK(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "clk_eth",
- clk_eth_parents,
- &rp1_clk_ops,
- 0
- ),
- CLK_DATA(rp1_clock_data,
- .num_std_parents = 0,
- .num_aux_parents = 3,
- .ctrl_reg = CLK_ETH_CTRL,
- .div_int_reg = CLK_ETH_DIV_INT,
- .sel_reg = CLK_ETH_SEL,
- .div_int_max = DIV_INT_8BIT_MAX,
- .max_freq = 125 * HZ_PER_MHZ,
- .fc0_src = FC_NUM(4, 6),
- )
-);
+static struct rp1_clk_desc clk_eth_desc =
+ REGISTER_CLK(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "clk_eth", clk_eth_parents, &rp1_clk_ops, 0),
+ CLK_DATA(rp1_clock_data, .num_std_parents = 0,
+ .num_aux_parents = 3, .ctrl_reg = CLK_ETH_CTRL,
+ .div_int_reg = CLK_ETH_DIV_INT,
+ .sel_reg = CLK_ETH_SEL,
+ .div_int_max = DIV_INT_8BIT_MAX,
+ .max_freq = 125 * HZ_PER_MHZ,
+ .fc0_src = FC_NUM(4, 6), ));
static const struct clk_parent_data clk_sys_parents[] = {
{ .index = 0 },
@@ -1486,126 +1437,79 @@ static const struct clk_parent_data clk_sys_parents[] = {
{ .hw = &pll_sys_desc.hw },
};
-static struct rp1_clk_desc clk_sys_desc = REGISTER_CLK(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "clk_sys",
- clk_sys_parents,
- &rp1_clk_ops,
- CLK_IS_CRITICAL
- ),
- CLK_DATA(rp1_clock_data,
- .num_std_parents = 3,
- .num_aux_parents = 0,
- .ctrl_reg = CLK_SYS_CTRL,
- .div_int_reg = CLK_SYS_DIV_INT,
- .sel_reg = CLK_SYS_SEL,
- .div_int_max = DIV_INT_24BIT_MAX,
- .max_freq = 200 * HZ_PER_MHZ,
- .fc0_src = FC_NUM(0, 4),
- .clk_src_mask = 0x3,
- )
-);
+static struct rp1_clk_desc clk_sys_desc =
+ REGISTER_CLK(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "clk_sys", clk_sys_parents, &rp1_clk_ops,
+ CLK_IS_CRITICAL),
+ CLK_DATA(rp1_clock_data, .num_std_parents = 3,
+ .num_aux_parents = 0, .ctrl_reg = CLK_SYS_CTRL,
+ .div_int_reg = CLK_SYS_DIV_INT,
+ .sel_reg = CLK_SYS_SEL,
+ .div_int_max = DIV_INT_24BIT_MAX,
+ .max_freq = 200 * HZ_PER_MHZ,
+ .fc0_src = FC_NUM(0, 4), .clk_src_mask = 0x3, ));
-static struct rp1_clk_desc pll_sys_pri_ph_desc = REGISTER_PLL(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "pll_sys_pri_ph",
- (const struct clk_parent_data[]) {
- { .hw = &pll_sys_desc.hw }
- },
- &rp1_pll_ph_ops,
- 0
- ),
- CLK_DATA(rp1_pll_ph_data,
- .ph_reg = PLL_SYS_PRIM,
- .fixed_divider = 2,
- .phase = RP1_PLL_PHASE_0,
- .fc0_src = FC_NUM(1, 2),
- )
-);
+static struct rp1_clk_desc pll_sys_pri_ph_desc =
+ REGISTER_PLL(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "pll_sys_pri_ph",
+ (const struct clk_parent_data[]){
+ { .hw = &pll_sys_desc.hw } },
+ &rp1_pll_ph_ops, 0),
+ CLK_DATA(rp1_pll_ph_data, .ph_reg = PLL_SYS_PRIM,
+ .fixed_divider = 2, .phase = RP1_PLL_PHASE_0,
+ .fc0_src = FC_NUM(1, 2), ));
-static struct rp1_clk_desc pll_audio_pri_ph_desc = REGISTER_PLL(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "pll_audio_pri_ph",
- (const struct clk_parent_data[]) {
- { .hw = &pll_audio_desc.hw }
- },
- &rp1_pll_ph_ops,
- 0
- ),
- CLK_DATA(rp1_pll_ph_data,
- .ph_reg = PLL_AUDIO_PRIM,
- .fixed_divider = 2,
- .phase = RP1_PLL_PHASE_0,
- .fc0_src = FC_NUM(5, 1),
- )
-);
+static struct rp1_clk_desc pll_audio_pri_ph_desc =
+ REGISTER_PLL(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "pll_audio_pri_ph",
+ (const struct clk_parent_data[]){
+ { .hw = &pll_audio_desc.hw } },
+ &rp1_pll_ph_ops, 0),
+ CLK_DATA(rp1_pll_ph_data, .ph_reg = PLL_AUDIO_PRIM,
+ .fixed_divider = 2, .phase = RP1_PLL_PHASE_0,
+ .fc0_src = FC_NUM(5, 1), ));
-static struct rp1_clk_desc pll_video_pri_ph_desc = REGISTER_PLL(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "pll_video_pri_ph",
- (const struct clk_parent_data[]) {
- { .hw = &pll_video_desc.hw }
- },
- &rp1_pll_ph_ops,
- 0
- ),
- CLK_DATA(rp1_pll_ph_data,
- .ph_reg = PLL_VIDEO_PRIM,
- .fixed_divider = 2,
- .phase = RP1_PLL_PHASE_0,
- .fc0_src = FC_NUM(4, 3),
- )
-);
+static struct rp1_clk_desc pll_video_pri_ph_desc =
+ REGISTER_PLL(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "pll_video_pri_ph",
+ (const struct clk_parent_data[]){
+ { .hw = &pll_video_desc.hw } },
+ &rp1_pll_ph_ops, 0),
+ CLK_DATA(rp1_pll_ph_data, .ph_reg = PLL_VIDEO_PRIM,
+ .fixed_divider = 2, .phase = RP1_PLL_PHASE_0,
+ .fc0_src = FC_NUM(4, 3), ));
-static struct rp1_clk_desc pll_audio_sec_desc = REGISTER_PLL_DIV(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "pll_audio_sec",
- (const struct clk_parent_data[]) {
- { .hw = &pll_audio_core_desc.hw }
- },
- &rp1_pll_divider_ops,
- 0
- ),
- CLK_DATA(rp1_pll_data,
- .ctrl_reg = PLL_AUDIO_SEC,
- .fc0_src = FC_NUM(6, 2),
- )
-);
+static struct rp1_clk_desc pll_audio_sec_desc =
+ REGISTER_PLL_DIV(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "pll_audio_sec",
+ (const struct clk_parent_data[]){
+ { .hw = &pll_audio_core_desc.hw } },
+ &rp1_pll_divider_ops, 0),
+ CLK_DATA(rp1_pll_data, .ctrl_reg = PLL_AUDIO_SEC,
+ .fc0_src = FC_NUM(6, 2), ));
-static struct rp1_clk_desc pll_audio_tern_desc = REGISTER_PLL_DIV(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "pll_audio_tern",
- (const struct clk_parent_data[]) {
- { .hw = &pll_audio_core_desc.hw }
- },
- &rp1_pll_divider_ops,
- 0
- ),
- CLK_DATA(rp1_pll_data,
- .ctrl_reg = PLL_AUDIO_TERN,
- .fc0_src = FC_NUM(6, 2),
- )
-);
+static struct rp1_clk_desc pll_audio_tern_desc =
+ REGISTER_PLL_DIV(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "pll_audio_tern",
+ (const struct clk_parent_data[]){
+ { .hw = &pll_audio_core_desc.hw } },
+ &rp1_pll_divider_ops, 0),
+ CLK_DATA(rp1_pll_data, .ctrl_reg = PLL_AUDIO_TERN,
+ .fc0_src = FC_NUM(6, 2), ));
-static struct rp1_clk_desc clk_slow_sys_desc = REGISTER_CLK(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "clk_slow_sys",
- (const struct clk_parent_data[]) { { .index = 0 } },
- &rp1_clk_ops,
- CLK_IS_CRITICAL
- ),
- CLK_DATA(rp1_clock_data,
- .num_std_parents = 1,
- .num_aux_parents = 0,
- .ctrl_reg = CLK_SLOW_SYS_CTRL,
- .div_int_reg = CLK_SLOW_SYS_DIV_INT,
- .sel_reg = CLK_SLOW_SYS_SEL,
- .div_int_max = DIV_INT_8BIT_MAX,
- .max_freq = 50 * HZ_PER_MHZ,
- .fc0_src = FC_NUM(1, 4),
- .clk_src_mask = 0x1,
- )
-);
+static struct rp1_clk_desc clk_slow_sys_desc =
+ REGISTER_CLK(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "clk_slow_sys",
+ (const struct clk_parent_data[]){ { .index = 0 } },
+ &rp1_clk_ops, CLK_IS_CRITICAL),
+ CLK_DATA(rp1_clock_data, .num_std_parents = 1,
+ .num_aux_parents = 0,
+ .ctrl_reg = CLK_SLOW_SYS_CTRL,
+ .div_int_reg = CLK_SLOW_SYS_DIV_INT,
+ .sel_reg = CLK_SLOW_SYS_SEL,
+ .div_int_max = DIV_INT_8BIT_MAX,
+ .max_freq = 50 * HZ_PER_MHZ,
+ .fc0_src = FC_NUM(1, 4), .clk_src_mask = 0x1, ));
static const struct clk_parent_data clk_dma_parents[] = {
{ .hw = &pll_sys_pri_ph_desc.hw },
@@ -1613,24 +1517,16 @@ static const struct clk_parent_data clk_dma_parents[] = {
{ .index = 0 },
};
-static struct rp1_clk_desc clk_dma_desc = REGISTER_CLK(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "clk_dma",
- clk_dma_parents,
- &rp1_clk_ops,
- 0
- ),
- CLK_DATA(rp1_clock_data,
- .num_std_parents = 0,
- .num_aux_parents = 3,
- .ctrl_reg = CLK_DMA_CTRL,
- .div_int_reg = CLK_DMA_DIV_INT,
- .sel_reg = CLK_DMA_SEL,
- .div_int_max = DIV_INT_8BIT_MAX,
- .max_freq = 100 * HZ_PER_MHZ,
- .fc0_src = FC_NUM(2, 2),
- )
-);
+static struct rp1_clk_desc clk_dma_desc =
+ REGISTER_CLK(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "clk_dma", clk_dma_parents, &rp1_clk_ops, 0),
+ CLK_DATA(rp1_clock_data, .num_std_parents = 0,
+ .num_aux_parents = 3, .ctrl_reg = CLK_DMA_CTRL,
+ .div_int_reg = CLK_DMA_DIV_INT,
+ .sel_reg = CLK_DMA_SEL,
+ .div_int_max = DIV_INT_8BIT_MAX,
+ .max_freq = 100 * HZ_PER_MHZ,
+ .fc0_src = FC_NUM(2, 2), ));
static const struct clk_parent_data clk_uart_parents[] = {
{ .hw = &pll_sys_pri_ph_desc.hw },
@@ -1638,24 +1534,16 @@ static const struct clk_parent_data clk_uart_parents[] = {
{ .index = 0 },
};
-static struct rp1_clk_desc clk_uart_desc = REGISTER_CLK(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "clk_uart",
- clk_uart_parents,
- &rp1_clk_ops,
- 0
- ),
- CLK_DATA(rp1_clock_data,
- .num_std_parents = 0,
- .num_aux_parents = 3,
- .ctrl_reg = CLK_UART_CTRL,
- .div_int_reg = CLK_UART_DIV_INT,
- .sel_reg = CLK_UART_SEL,
- .div_int_max = DIV_INT_8BIT_MAX,
- .max_freq = 100 * HZ_PER_MHZ,
- .fc0_src = FC_NUM(6, 7),
- )
-);
+static struct rp1_clk_desc clk_uart_desc =
+ REGISTER_CLK(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "clk_uart", clk_uart_parents, &rp1_clk_ops, 0),
+ CLK_DATA(rp1_clock_data, .num_std_parents = 0,
+ .num_aux_parents = 3, .ctrl_reg = CLK_UART_CTRL,
+ .div_int_reg = CLK_UART_DIV_INT,
+ .sel_reg = CLK_UART_SEL,
+ .div_int_max = DIV_INT_8BIT_MAX,
+ .max_freq = 100 * HZ_PER_MHZ,
+ .fc0_src = FC_NUM(6, 7), ));
static const struct clk_parent_data clk_pwm0_parents[] = {
{ .index = -1 },
@@ -1663,25 +1551,17 @@ static const struct clk_parent_data clk_pwm0_parents[] = {
{ .index = 0 },
};
-static struct rp1_clk_desc clk_pwm0_desc = REGISTER_CLK(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "clk_pwm0",
- clk_pwm0_parents,
- &rp1_clk_ops,
- 0
- ),
- CLK_DATA(rp1_clock_data,
- .num_std_parents = 0,
- .num_aux_parents = 3,
- .ctrl_reg = CLK_PWM0_CTRL,
- .div_int_reg = CLK_PWM0_DIV_INT,
- .div_frac_reg = CLK_PWM0_DIV_FRAC,
- .sel_reg = CLK_PWM0_SEL,
- .div_int_max = DIV_INT_16BIT_MAX,
- .max_freq = 76800 * HZ_PER_KHZ,
- .fc0_src = FC_NUM(0, 5),
- )
-);
+static struct rp1_clk_desc clk_pwm0_desc =
+ REGISTER_CLK(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "clk_pwm0", clk_pwm0_parents, &rp1_clk_ops, 0),
+ CLK_DATA(rp1_clock_data, .num_std_parents = 0,
+ .num_aux_parents = 3, .ctrl_reg = CLK_PWM0_CTRL,
+ .div_int_reg = CLK_PWM0_DIV_INT,
+ .div_frac_reg = CLK_PWM0_DIV_FRAC,
+ .sel_reg = CLK_PWM0_SEL,
+ .div_int_max = DIV_INT_16BIT_MAX,
+ .max_freq = 76800 * HZ_PER_KHZ,
+ .fc0_src = FC_NUM(0, 5), ));
static const struct clk_parent_data clk_pwm1_parents[] = {
{ .index = -1 },
@@ -1689,52 +1569,36 @@ static const struct clk_parent_data clk_pwm1_parents[] = {
{ .index = 0 },
};
-static struct rp1_clk_desc clk_pwm1_desc = REGISTER_CLK(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "clk_pwm1",
- clk_pwm1_parents,
- &rp1_clk_ops,
- 0
- ),
- CLK_DATA(rp1_clock_data,
- .num_std_parents = 0,
- .num_aux_parents = 3,
- .ctrl_reg = CLK_PWM1_CTRL,
- .div_int_reg = CLK_PWM1_DIV_INT,
- .div_frac_reg = CLK_PWM1_DIV_FRAC,
- .sel_reg = CLK_PWM1_SEL,
- .div_int_max = DIV_INT_16BIT_MAX,
- .max_freq = 76800 * HZ_PER_KHZ,
- .fc0_src = FC_NUM(1, 5),
- )
-);
+static struct rp1_clk_desc clk_pwm1_desc =
+ REGISTER_CLK(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "clk_pwm1", clk_pwm1_parents, &rp1_clk_ops, 0),
+ CLK_DATA(rp1_clock_data, .num_std_parents = 0,
+ .num_aux_parents = 3, .ctrl_reg = CLK_PWM1_CTRL,
+ .div_int_reg = CLK_PWM1_DIV_INT,
+ .div_frac_reg = CLK_PWM1_DIV_FRAC,
+ .sel_reg = CLK_PWM1_SEL,
+ .div_int_max = DIV_INT_16BIT_MAX,
+ .max_freq = 76800 * HZ_PER_KHZ,
+ .fc0_src = FC_NUM(1, 5), ));
static const struct clk_parent_data clk_audio_in_parents[] = {
- { .index = -1 },
- { .index = -1 },
- { .index = -1 },
- { .hw = &pll_video_sec_desc.hw },
+ { .index = -1 }, { .index = -1 },
+ { .index = -1 }, { .hw = &pll_video_sec_desc.hw },
{ .index = 0 },
};
-static struct rp1_clk_desc clk_audio_in_desc = REGISTER_CLK(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "clk_audio_in",
- clk_audio_in_parents,
- &rp1_clk_ops,
- 0
- ),
- CLK_DATA(rp1_clock_data,
- .num_std_parents = 0,
- .num_aux_parents = 5,
- .ctrl_reg = CLK_AUDIO_IN_CTRL,
- .div_int_reg = CLK_AUDIO_IN_DIV_INT,
- .sel_reg = CLK_AUDIO_IN_SEL,
- .div_int_max = DIV_INT_8BIT_MAX,
- .max_freq = 76800 * HZ_PER_KHZ,
- .fc0_src = FC_NUM(2, 5),
- )
-);
+static struct rp1_clk_desc clk_audio_in_desc =
+ REGISTER_CLK(.hw.init = CLK_HW_INIT_PARENTS_DATA("clk_audio_in",
+ clk_audio_in_parents,
+ &rp1_clk_ops, 0),
+ CLK_DATA(rp1_clock_data, .num_std_parents = 0,
+ .num_aux_parents = 5,
+ .ctrl_reg = CLK_AUDIO_IN_CTRL,
+ .div_int_reg = CLK_AUDIO_IN_DIV_INT,
+ .sel_reg = CLK_AUDIO_IN_SEL,
+ .div_int_max = DIV_INT_8BIT_MAX,
+ .max_freq = 76800 * HZ_PER_KHZ,
+ .fc0_src = FC_NUM(2, 5), ));
static const struct clk_parent_data clk_audio_out_parents[] = {
{ .index = -1 },
@@ -1743,24 +1607,18 @@ static const struct clk_parent_data clk_audio_out_parents[] = {
{ .index = 0 },
};
-static struct rp1_clk_desc clk_audio_out_desc = REGISTER_CLK(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "clk_audio_out",
- clk_audio_out_parents,
- &rp1_clk_ops,
- 0
- ),
- CLK_DATA(rp1_clock_data,
- .num_std_parents = 0,
- .num_aux_parents = 4,
- .ctrl_reg = CLK_AUDIO_OUT_CTRL,
- .div_int_reg = CLK_AUDIO_OUT_DIV_INT,
- .sel_reg = CLK_AUDIO_OUT_SEL,
- .div_int_max = DIV_INT_8BIT_MAX,
- .max_freq = 153600 * HZ_PER_KHZ,
- .fc0_src = FC_NUM(3, 5),
- )
-);
+static struct rp1_clk_desc clk_audio_out_desc =
+ REGISTER_CLK(.hw.init = CLK_HW_INIT_PARENTS_DATA("clk_audio_out",
+ clk_audio_out_parents,
+ &rp1_clk_ops, 0),
+ CLK_DATA(rp1_clock_data, .num_std_parents = 0,
+ .num_aux_parents = 4,
+ .ctrl_reg = CLK_AUDIO_OUT_CTRL,
+ .div_int_reg = CLK_AUDIO_OUT_DIV_INT,
+ .sel_reg = CLK_AUDIO_OUT_SEL,
+ .div_int_max = DIV_INT_8BIT_MAX,
+ .max_freq = 153600 * HZ_PER_KHZ,
+ .fc0_src = FC_NUM(3, 5), ));
static const struct clk_parent_data clk_i2s_parents[] = {
{ .index = 0 },
@@ -1768,122 +1626,87 @@ static const struct clk_parent_data clk_i2s_parents[] = {
{ .hw = &pll_audio_sec_desc.hw },
};
-static struct rp1_clk_desc clk_i2s_desc = REGISTER_CLK(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "clk_i2s",
- clk_i2s_parents,
- &rp1_clk_ops,
- CLK_SET_RATE_PARENT
- ),
- CLK_DATA(rp1_clock_data,
- .num_std_parents = 0,
- .num_aux_parents = 3,
- .ctrl_reg = CLK_I2S_CTRL,
- .div_int_reg = CLK_I2S_DIV_INT,
- .sel_reg = CLK_I2S_SEL,
- .div_int_max = DIV_INT_8BIT_MAX,
- .max_freq = 50 * HZ_PER_MHZ,
- .fc0_src = FC_NUM(4, 4),
- )
-);
+static struct rp1_clk_desc clk_i2s_desc =
+ REGISTER_CLK(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "clk_i2s", clk_i2s_parents, &rp1_clk_ops,
+ CLK_SET_RATE_PARENT),
+ CLK_DATA(rp1_clock_data, .num_std_parents = 0,
+ .num_aux_parents = 3, .ctrl_reg = CLK_I2S_CTRL,
+ .div_int_reg = CLK_I2S_DIV_INT,
+ .sel_reg = CLK_I2S_SEL,
+ .div_int_max = DIV_INT_8BIT_MAX,
+ .max_freq = 50 * HZ_PER_MHZ,
+ .fc0_src = FC_NUM(4, 4), ));
-static struct rp1_clk_desc clk_mipi0_cfg_desc = REGISTER_CLK(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "clk_mipi0_cfg",
- (const struct clk_parent_data[]) { { .index = 0 } },
- &rp1_clk_ops,
- 0
- ),
- CLK_DATA(rp1_clock_data,
- .num_std_parents = 0,
- .num_aux_parents = 1,
- .ctrl_reg = CLK_MIPI0_CFG_CTRL,
- .div_int_reg = CLK_MIPI0_CFG_DIV_INT,
- .sel_reg = CLK_MIPI0_CFG_SEL,
- .div_int_max = DIV_INT_8BIT_MAX,
- .max_freq = 50 * HZ_PER_MHZ,
- .fc0_src = FC_NUM(4, 5),
- )
-);
+static struct rp1_clk_desc clk_mipi0_cfg_desc =
+ REGISTER_CLK(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "clk_mipi0_cfg",
+ (const struct clk_parent_data[]){ { .index = 0 } },
+ &rp1_clk_ops, 0),
+ CLK_DATA(rp1_clock_data, .num_std_parents = 0,
+ .num_aux_parents = 1,
+ .ctrl_reg = CLK_MIPI0_CFG_CTRL,
+ .div_int_reg = CLK_MIPI0_CFG_DIV_INT,
+ .sel_reg = CLK_MIPI0_CFG_SEL,
+ .div_int_max = DIV_INT_8BIT_MAX,
+ .max_freq = 50 * HZ_PER_MHZ,
+ .fc0_src = FC_NUM(4, 5), ));
-static struct rp1_clk_desc clk_mipi1_cfg_desc = REGISTER_CLK(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "clk_mipi1_cfg",
- (const struct clk_parent_data[]) { { .index = 0 } },
- &rp1_clk_ops,
- 0
- ),
- CLK_DATA(rp1_clock_data,
- .num_std_parents = 0,
- .num_aux_parents = 1,
- .ctrl_reg = CLK_MIPI1_CFG_CTRL,
- .div_int_reg = CLK_MIPI1_CFG_DIV_INT,
- .sel_reg = CLK_MIPI1_CFG_SEL,
- .div_int_max = DIV_INT_8BIT_MAX,
- .max_freq = 50 * HZ_PER_MHZ,
- .fc0_src = FC_NUM(5, 6),
- .clk_src_mask = 0x1,
- )
-);
+static struct rp1_clk_desc clk_mipi1_cfg_desc =
+ REGISTER_CLK(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "clk_mipi1_cfg",
+ (const struct clk_parent_data[]){ { .index = 0 } },
+ &rp1_clk_ops, 0),
+ CLK_DATA(rp1_clock_data, .num_std_parents = 0,
+ .num_aux_parents = 1,
+ .ctrl_reg = CLK_MIPI1_CFG_CTRL,
+ .div_int_reg = CLK_MIPI1_CFG_DIV_INT,
+ .sel_reg = CLK_MIPI1_CFG_SEL,
+ .div_int_max = DIV_INT_8BIT_MAX,
+ .max_freq = 50 * HZ_PER_MHZ,
+ .fc0_src = FC_NUM(5, 6), .clk_src_mask = 0x1, ));
-static struct rp1_clk_desc clk_adc_desc = REGISTER_CLK(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "clk_adc",
- (const struct clk_parent_data[]) { { .index = 0 } },
- &rp1_clk_ops,
- 0
- ),
- CLK_DATA(rp1_clock_data,
- .num_std_parents = 0,
- .num_aux_parents = 1,
- .ctrl_reg = CLK_ADC_CTRL,
- .div_int_reg = CLK_ADC_DIV_INT,
- .sel_reg = CLK_ADC_SEL,
- .div_int_max = DIV_INT_8BIT_MAX,
- .max_freq = 50 * HZ_PER_MHZ,
- .fc0_src = FC_NUM(5, 5),
- )
-);
+static struct rp1_clk_desc clk_adc_desc =
+ REGISTER_CLK(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "clk_adc",
+ (const struct clk_parent_data[]){ { .index = 0 } },
+ &rp1_clk_ops, 0),
+ CLK_DATA(rp1_clock_data, .num_std_parents = 0,
+ .num_aux_parents = 1, .ctrl_reg = CLK_ADC_CTRL,
+ .div_int_reg = CLK_ADC_DIV_INT,
+ .sel_reg = CLK_ADC_SEL,
+ .div_int_max = DIV_INT_8BIT_MAX,
+ .max_freq = 50 * HZ_PER_MHZ,
+ .fc0_src = FC_NUM(5, 5), ));
-static struct rp1_clk_desc clk_sdio_timer_desc = REGISTER_CLK(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "clk_sdio_timer",
- (const struct clk_parent_data[]) { { .index = 0 } },
- &rp1_clk_ops,
- 0
- ),
- CLK_DATA(rp1_clock_data,
- .num_std_parents = 0,
- .num_aux_parents = 1,
- .ctrl_reg = CLK_SDIO_TIMER_CTRL,
- .div_int_reg = CLK_SDIO_TIMER_DIV_INT,
- .sel_reg = CLK_SDIO_TIMER_SEL,
- .div_int_max = DIV_INT_8BIT_MAX,
- .max_freq = 50 * HZ_PER_MHZ,
- .fc0_src = FC_NUM(3, 4),
- )
-);
+static struct rp1_clk_desc clk_sdio_timer_desc =
+ REGISTER_CLK(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "clk_sdio_timer",
+ (const struct clk_parent_data[]){ { .index = 0 } },
+ &rp1_clk_ops, 0),
+ CLK_DATA(rp1_clock_data, .num_std_parents = 0,
+ .num_aux_parents = 1,
+ .ctrl_reg = CLK_SDIO_TIMER_CTRL,
+ .div_int_reg = CLK_SDIO_TIMER_DIV_INT,
+ .sel_reg = CLK_SDIO_TIMER_SEL,
+ .div_int_max = DIV_INT_8BIT_MAX,
+ .max_freq = 50 * HZ_PER_MHZ,
+ .fc0_src = FC_NUM(3, 4), ));
-static struct rp1_clk_desc clk_sdio_alt_src_desc = REGISTER_CLK(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "clk_sdio_alt_src",
- (const struct clk_parent_data[]) {
- { .hw = &pll_sys_desc.hw }
- },
- &rp1_clk_ops,
- 0
- ),
- CLK_DATA(rp1_clock_data,
- .num_std_parents = 0,
- .num_aux_parents = 1,
- .ctrl_reg = CLK_SDIO_ALT_SRC_CTRL,
- .div_int_reg = CLK_SDIO_ALT_SRC_DIV_INT,
- .sel_reg = CLK_SDIO_ALT_SRC_SEL,
- .div_int_max = DIV_INT_8BIT_MAX,
- .max_freq = 200 * HZ_PER_MHZ,
- .fc0_src = FC_NUM(5, 4),
- )
-);
+static struct rp1_clk_desc clk_sdio_alt_src_desc =
+ REGISTER_CLK(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "clk_sdio_alt_src",
+ (const struct clk_parent_data[]){
+ { .hw = &pll_sys_desc.hw } },
+ &rp1_clk_ops, 0),
+ CLK_DATA(rp1_clock_data, .num_std_parents = 0,
+ .num_aux_parents = 1,
+ .ctrl_reg = CLK_SDIO_ALT_SRC_CTRL,
+ .div_int_reg = CLK_SDIO_ALT_SRC_DIV_INT,
+ .sel_reg = CLK_SDIO_ALT_SRC_SEL,
+ .div_int_max = DIV_INT_8BIT_MAX,
+ .max_freq = 200 * HZ_PER_MHZ,
+ .fc0_src = FC_NUM(5, 4), ));
static const struct clk_parent_data clk_dpi_parents[] = {
{ .hw = &pll_sys_desc.hw },
@@ -1897,23 +1720,17 @@ static const struct clk_parent_data clk_dpi_parents[] = {
};
static struct rp1_clk_desc clk_dpi_desc = REGISTER_CLK(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "clk_dpi",
- clk_dpi_parents,
- &rp1_clk_ops,
- CLK_SET_RATE_NO_REPARENT /* Let DPI driver set parent */
- ),
- CLK_DATA(rp1_clock_data,
- .num_std_parents = 0,
- .num_aux_parents = 8,
- .ctrl_reg = VIDEO_CLK_DPI_CTRL,
- .div_int_reg = VIDEO_CLK_DPI_DIV_INT,
- .sel_reg = VIDEO_CLK_DPI_SEL,
- .div_int_max = DIV_INT_8BIT_MAX,
- .max_freq = 200 * HZ_PER_MHZ,
- .fc0_src = FC_NUM(1, 6),
- )
-);
+ .hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "clk_dpi", clk_dpi_parents, &rp1_clk_ops,
+ CLK_SET_RATE_NO_REPARENT /* Let DPI driver set parent */
+ ),
+ CLK_DATA(rp1_clock_data, .num_std_parents = 0,
+ .num_aux_parents = 8, .ctrl_reg = VIDEO_CLK_DPI_CTRL,
+ .div_int_reg = VIDEO_CLK_DPI_DIV_INT,
+ .sel_reg = VIDEO_CLK_DPI_SEL,
+ .div_int_max = DIV_INT_8BIT_MAX,
+ .max_freq = 200 * HZ_PER_MHZ,
+ .fc0_src = FC_NUM(1, 6), ));
static const struct clk_parent_data clk_gp0_parents[] = {
{ .index = 0 },
@@ -1934,26 +1751,18 @@ static const struct clk_parent_data clk_gp0_parents[] = {
{ .hw = &clk_sys_desc.hw },
};
-static struct rp1_clk_desc clk_gp0_desc = REGISTER_CLK(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "clk_gp0",
- clk_gp0_parents,
- &rp1_clk_ops,
- 0
- ),
- CLK_DATA(rp1_clock_data,
- .num_std_parents = 0,
- .num_aux_parents = 16,
- .oe_mask = BIT(0),
- .ctrl_reg = CLK_GP0_CTRL,
- .div_int_reg = CLK_GP0_DIV_INT,
- .div_frac_reg = CLK_GP0_DIV_FRAC,
- .sel_reg = CLK_GP0_SEL,
- .div_int_max = DIV_INT_16BIT_MAX,
- .max_freq = 100 * HZ_PER_MHZ,
- .fc0_src = FC_NUM(0, 1),
- )
-);
+static struct rp1_clk_desc clk_gp0_desc =
+ REGISTER_CLK(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "clk_gp0", clk_gp0_parents, &rp1_clk_ops, 0),
+ CLK_DATA(rp1_clock_data, .num_std_parents = 0,
+ .num_aux_parents = 16, .oe_mask = BIT(0),
+ .ctrl_reg = CLK_GP0_CTRL,
+ .div_int_reg = CLK_GP0_DIV_INT,
+ .div_frac_reg = CLK_GP0_DIV_FRAC,
+ .sel_reg = CLK_GP0_SEL,
+ .div_int_max = DIV_INT_16BIT_MAX,
+ .max_freq = 100 * HZ_PER_MHZ,
+ .fc0_src = FC_NUM(0, 1), ));
static const struct clk_parent_data clk_gp1_parents[] = {
{ .hw = &clk_sdio_timer_desc.hw },
@@ -1974,52 +1783,34 @@ static const struct clk_parent_data clk_gp1_parents[] = {
{ .index = -1 },
};
-static struct rp1_clk_desc clk_gp1_desc = REGISTER_CLK(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "clk_gp1",
- clk_gp1_parents,
- &rp1_clk_ops,
- 0
- ),
- CLK_DATA(rp1_clock_data,
- .num_std_parents = 0,
- .num_aux_parents = 16,
- .oe_mask = BIT(1),
- .ctrl_reg = CLK_GP1_CTRL,
- .div_int_reg = CLK_GP1_DIV_INT,
- .div_frac_reg = CLK_GP1_DIV_FRAC,
- .sel_reg = CLK_GP1_SEL,
- .div_int_max = DIV_INT_16BIT_MAX,
- .max_freq = 100 * HZ_PER_MHZ,
- .fc0_src = FC_NUM(1, 1),
- )
-);
+static struct rp1_clk_desc clk_gp1_desc =
+ REGISTER_CLK(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "clk_gp1", clk_gp1_parents, &rp1_clk_ops, 0),
+ CLK_DATA(rp1_clock_data, .num_std_parents = 0,
+ .num_aux_parents = 16, .oe_mask = BIT(1),
+ .ctrl_reg = CLK_GP1_CTRL,
+ .div_int_reg = CLK_GP1_DIV_INT,
+ .div_frac_reg = CLK_GP1_DIV_FRAC,
+ .sel_reg = CLK_GP1_SEL,
+ .div_int_max = DIV_INT_16BIT_MAX,
+ .max_freq = 100 * HZ_PER_MHZ,
+ .fc0_src = FC_NUM(1, 1), ));
-static struct rp1_clk_desc clksrc_mipi0_dsi_byteclk_desc = REGISTER_CLK(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "clksrc_mipi0_dsi_byteclk",
- (const struct clk_parent_data[]) { { .index = 0 } },
- &rp1_varsrc_ops,
- 0
- ),
- CLK_DATA(rp1_clock_data,
- .num_std_parents = 1,
- .num_aux_parents = 0,
- )
-);
+static struct rp1_clk_desc clksrc_mipi0_dsi_byteclk_desc =
+ REGISTER_CLK(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "clksrc_mipi0_dsi_byteclk",
+ (const struct clk_parent_data[]){ { .index = 0 } },
+ &rp1_varsrc_ops, 0),
+ CLK_DATA(rp1_clock_data, .num_std_parents = 1,
+ .num_aux_parents = 0, ));
-static struct rp1_clk_desc clksrc_mipi1_dsi_byteclk_desc = REGISTER_CLK(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "clksrc_mipi1_dsi_byteclk",
- (const struct clk_parent_data[]) { { .index = 0 } },
- &rp1_varsrc_ops,
- 0
- ),
- CLK_DATA(rp1_clock_data,
- .num_std_parents = 1,
- .num_aux_parents = 0,
- )
-);
+static struct rp1_clk_desc clksrc_mipi1_dsi_byteclk_desc =
+ REGISTER_CLK(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "clksrc_mipi1_dsi_byteclk",
+ (const struct clk_parent_data[]){ { .index = 0 } },
+ &rp1_varsrc_ops, 0),
+ CLK_DATA(rp1_clock_data, .num_std_parents = 1,
+ .num_aux_parents = 0, ));
static const struct clk_parent_data clk_mipi0_dpi_parents[] = {
{ .hw = &pll_sys_desc.hw },
@@ -2033,24 +1824,19 @@ static const struct clk_parent_data clk_mipi0_dpi_parents[] = {
};
static struct rp1_clk_desc clk_mipi0_dpi_desc = REGISTER_CLK(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "clk_mipi0_dpi",
- clk_mipi0_dpi_parents,
- &rp1_clk_ops,
- CLK_SET_RATE_NO_REPARENT /* Let DSI driver set parent */
- ),
- CLK_DATA(rp1_clock_data,
- .num_std_parents = 0,
- .num_aux_parents = 8,
- .ctrl_reg = VIDEO_CLK_MIPI0_DPI_CTRL,
- .div_int_reg = VIDEO_CLK_MIPI0_DPI_DIV_INT,
- .div_frac_reg = VIDEO_CLK_MIPI0_DPI_DIV_FRAC,
- .sel_reg = VIDEO_CLK_MIPI0_DPI_SEL,
- .div_int_max = DIV_INT_8BIT_MAX,
- .max_freq = 200 * HZ_PER_MHZ,
- .fc0_src = FC_NUM(2, 6),
- )
-);
+ .hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "clk_mipi0_dpi", clk_mipi0_dpi_parents, &rp1_clk_ops,
+ CLK_SET_RATE_NO_REPARENT /* Let DSI driver set parent */
+ ),
+ CLK_DATA(rp1_clock_data, .num_std_parents = 0,
+ .num_aux_parents = 8,
+ .ctrl_reg = VIDEO_CLK_MIPI0_DPI_CTRL,
+ .div_int_reg = VIDEO_CLK_MIPI0_DPI_DIV_INT,
+ .div_frac_reg = VIDEO_CLK_MIPI0_DPI_DIV_FRAC,
+ .sel_reg = VIDEO_CLK_MIPI0_DPI_SEL,
+ .div_int_max = DIV_INT_8BIT_MAX,
+ .max_freq = 200 * HZ_PER_MHZ,
+ .fc0_src = FC_NUM(2, 6), ));
static const struct clk_parent_data clk_mipi1_dpi_parents[] = {
{ .hw = &pll_sys_desc.hw },
@@ -2064,24 +1850,19 @@ static const struct clk_parent_data clk_mipi1_dpi_parents[] = {
};
static struct rp1_clk_desc clk_mipi1_dpi_desc = REGISTER_CLK(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "clk_mipi1_dpi",
- clk_mipi1_dpi_parents,
- &rp1_clk_ops,
- CLK_SET_RATE_NO_REPARENT /* Let DSI driver set parent */
- ),
- CLK_DATA(rp1_clock_data,
- .num_std_parents = 0,
- .num_aux_parents = 8,
- .ctrl_reg = VIDEO_CLK_MIPI1_DPI_CTRL,
- .div_int_reg = VIDEO_CLK_MIPI1_DPI_DIV_INT,
- .div_frac_reg = VIDEO_CLK_MIPI1_DPI_DIV_FRAC,
- .sel_reg = VIDEO_CLK_MIPI1_DPI_SEL,
- .div_int_max = DIV_INT_8BIT_MAX,
- .max_freq = 200 * HZ_PER_MHZ,
- .fc0_src = FC_NUM(3, 6),
- )
-);
+ .hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "clk_mipi1_dpi", clk_mipi1_dpi_parents, &rp1_clk_ops,
+ CLK_SET_RATE_NO_REPARENT /* Let DSI driver set parent */
+ ),
+ CLK_DATA(rp1_clock_data, .num_std_parents = 0,
+ .num_aux_parents = 8,
+ .ctrl_reg = VIDEO_CLK_MIPI1_DPI_CTRL,
+ .div_int_reg = VIDEO_CLK_MIPI1_DPI_DIV_INT,
+ .div_frac_reg = VIDEO_CLK_MIPI1_DPI_DIV_FRAC,
+ .sel_reg = VIDEO_CLK_MIPI1_DPI_SEL,
+ .div_int_max = DIV_INT_8BIT_MAX,
+ .max_freq = 200 * HZ_PER_MHZ,
+ .fc0_src = FC_NUM(3, 6), ));
static const struct clk_parent_data clk_gp2_parents[] = {
{ .hw = &clk_sdio_alt_src_desc.hw },
@@ -2102,26 +1883,18 @@ static const struct clk_parent_data clk_gp2_parents[] = {
{ .hw = &clk_sys_desc.hw },
};
-static struct rp1_clk_desc clk_gp2_desc = REGISTER_CLK(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "clk_gp2",
- clk_gp2_parents,
- &rp1_clk_ops,
- 0
- ),
- CLK_DATA(rp1_clock_data,
- .num_std_parents = 0,
- .num_aux_parents = 16,
- .oe_mask = BIT(2),
- .ctrl_reg = CLK_GP2_CTRL,
- .div_int_reg = CLK_GP2_DIV_INT,
- .div_frac_reg = CLK_GP2_DIV_FRAC,
- .sel_reg = CLK_GP2_SEL,
- .div_int_max = DIV_INT_16BIT_MAX,
- .max_freq = 100 * HZ_PER_MHZ,
- .fc0_src = FC_NUM(2, 1),
- )
-);
+static struct rp1_clk_desc clk_gp2_desc =
+ REGISTER_CLK(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "clk_gp2", clk_gp2_parents, &rp1_clk_ops, 0),
+ CLK_DATA(rp1_clock_data, .num_std_parents = 0,
+ .num_aux_parents = 16, .oe_mask = BIT(2),
+ .ctrl_reg = CLK_GP2_CTRL,
+ .div_int_reg = CLK_GP2_DIV_INT,
+ .div_frac_reg = CLK_GP2_DIV_FRAC,
+ .sel_reg = CLK_GP2_SEL,
+ .div_int_max = DIV_INT_16BIT_MAX,
+ .max_freq = 100 * HZ_PER_MHZ,
+ .fc0_src = FC_NUM(2, 1), ));
static const struct clk_parent_data clk_gp3_parents[] = {
{ .index = 0 },
@@ -2142,26 +1915,18 @@ static const struct clk_parent_data clk_gp3_parents[] = {
{ .index = -1 },
};
-static struct rp1_clk_desc clk_gp3_desc = REGISTER_CLK(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "clk_gp3",
- clk_gp3_parents,
- &rp1_clk_ops,
- 0
- ),
- CLK_DATA(rp1_clock_data,
- .num_std_parents = 0,
- .num_aux_parents = 16,
- .oe_mask = BIT(3),
- .ctrl_reg = CLK_GP3_CTRL,
- .div_int_reg = CLK_GP3_DIV_INT,
- .div_frac_reg = CLK_GP3_DIV_FRAC,
- .sel_reg = CLK_GP3_SEL,
- .div_int_max = DIV_INT_16BIT_MAX,
- .max_freq = 100 * HZ_PER_MHZ,
- .fc0_src = FC_NUM(3, 1),
- )
-);
+static struct rp1_clk_desc clk_gp3_desc =
+ REGISTER_CLK(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "clk_gp3", clk_gp3_parents, &rp1_clk_ops, 0),
+ CLK_DATA(rp1_clock_data, .num_std_parents = 0,
+ .num_aux_parents = 16, .oe_mask = BIT(3),
+ .ctrl_reg = CLK_GP3_CTRL,
+ .div_int_reg = CLK_GP3_DIV_INT,
+ .div_frac_reg = CLK_GP3_DIV_FRAC,
+ .sel_reg = CLK_GP3_SEL,
+ .div_int_max = DIV_INT_16BIT_MAX,
+ .max_freq = 100 * HZ_PER_MHZ,
+ .fc0_src = FC_NUM(3, 1), ));
static const struct clk_parent_data clk_gp4_parents[] = {
{ .index = 0 },
@@ -2182,26 +1947,18 @@ static const struct clk_parent_data clk_gp4_parents[] = {
{ .hw = &clk_sys_desc.hw },
};
-static struct rp1_clk_desc clk_gp4_desc = REGISTER_CLK(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "clk_gp4",
- clk_gp4_parents,
- &rp1_clk_ops,
- 0
- ),
- CLK_DATA(rp1_clock_data,
- .num_std_parents = 0,
- .num_aux_parents = 16,
- .oe_mask = BIT(4),
- .ctrl_reg = CLK_GP4_CTRL,
- .div_int_reg = CLK_GP4_DIV_INT,
- .div_frac_reg = CLK_GP4_DIV_FRAC,
- .sel_reg = CLK_GP4_SEL,
- .div_int_max = DIV_INT_16BIT_MAX,
- .max_freq = 100 * HZ_PER_MHZ,
- .fc0_src = FC_NUM(4, 1),
- )
-);
+static struct rp1_clk_desc clk_gp4_desc =
+ REGISTER_CLK(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "clk_gp4", clk_gp4_parents, &rp1_clk_ops, 0),
+ CLK_DATA(rp1_clock_data, .num_std_parents = 0,
+ .num_aux_parents = 16, .oe_mask = BIT(4),
+ .ctrl_reg = CLK_GP4_CTRL,
+ .div_int_reg = CLK_GP4_DIV_INT,
+ .div_frac_reg = CLK_GP4_DIV_FRAC,
+ .sel_reg = CLK_GP4_SEL,
+ .div_int_max = DIV_INT_16BIT_MAX,
+ .max_freq = 100 * HZ_PER_MHZ,
+ .fc0_src = FC_NUM(4, 1), ));
static const struct clk_parent_data clk_vec_parents[] = {
{ .hw = &pll_sys_pri_ph_desc.hw },
@@ -2215,23 +1972,17 @@ static const struct clk_parent_data clk_vec_parents[] = {
};
static struct rp1_clk_desc clk_vec_desc = REGISTER_CLK(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "clk_vec",
- clk_vec_parents,
- &rp1_clk_ops,
- CLK_SET_RATE_NO_REPARENT /* Let VEC driver set parent */
- ),
- CLK_DATA(rp1_clock_data,
- .num_std_parents = 0,
- .num_aux_parents = 8,
- .ctrl_reg = VIDEO_CLK_VEC_CTRL,
- .div_int_reg = VIDEO_CLK_VEC_DIV_INT,
- .sel_reg = VIDEO_CLK_VEC_SEL,
- .div_int_max = DIV_INT_8BIT_MAX,
- .max_freq = 108 * HZ_PER_MHZ,
- .fc0_src = FC_NUM(0, 6),
- )
-);
+ .hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "clk_vec", clk_vec_parents, &rp1_clk_ops,
+ CLK_SET_RATE_NO_REPARENT /* Let VEC driver set parent */
+ ),
+ CLK_DATA(rp1_clock_data, .num_std_parents = 0,
+ .num_aux_parents = 8, .ctrl_reg = VIDEO_CLK_VEC_CTRL,
+ .div_int_reg = VIDEO_CLK_VEC_DIV_INT,
+ .sel_reg = VIDEO_CLK_VEC_SEL,
+ .div_int_max = DIV_INT_8BIT_MAX,
+ .max_freq = 108 * HZ_PER_MHZ,
+ .fc0_src = FC_NUM(0, 6), ));
static const struct clk_parent_data clk_gp5_parents[] = {
{ .index = 0 },
@@ -2252,26 +2003,18 @@ static const struct clk_parent_data clk_gp5_parents[] = {
{ .index = -1 },
};
-static struct rp1_clk_desc clk_gp5_desc = REGISTER_CLK(
- .hw.init = CLK_HW_INIT_PARENTS_DATA(
- "clk_gp5",
- clk_gp5_parents,
- &rp1_clk_ops,
- 0
- ),
- CLK_DATA(rp1_clock_data,
- .num_std_parents = 0,
- .num_aux_parents = 16,
- .oe_mask = BIT(5),
- .ctrl_reg = CLK_GP5_CTRL,
- .div_int_reg = CLK_GP5_DIV_INT,
- .div_frac_reg = CLK_GP5_DIV_FRAC,
- .sel_reg = CLK_GP5_SEL,
- .div_int_max = DIV_INT_16BIT_MAX,
- .max_freq = 100 * HZ_PER_MHZ,
- .fc0_src = FC_NUM(5, 1),
- )
-);
+static struct rp1_clk_desc clk_gp5_desc =
+ REGISTER_CLK(.hw.init = CLK_HW_INIT_PARENTS_DATA(
+ "clk_gp5", clk_gp5_parents, &rp1_clk_ops, 0),
+ CLK_DATA(rp1_clock_data, .num_std_parents = 0,
+ .num_aux_parents = 16, .oe_mask = BIT(5),
+ .ctrl_reg = CLK_GP5_CTRL,
+ .div_int_reg = CLK_GP5_DIV_INT,
+ .div_frac_reg = CLK_GP5_DIV_FRAC,
+ .sel_reg = CLK_GP5_SEL,
+ .div_int_max = DIV_INT_16BIT_MAX,
+ .max_freq = 100 * HZ_PER_MHZ,
+ .fc0_src = FC_NUM(5, 1), ));
static struct rp1_clk_desc *const clk_desc_array[] = {
[RP1_PLL_SYS_CORE] = &pll_sys_core_desc,
@@ -2346,9 +2089,11 @@ static const struct regmap_range rp1_reg_ranges[] = {
regmap_reg_range(CLK_MIPI1_CFG_SEL, CLK_MIPI1_CFG_SEL),
regmap_reg_range(CLK_PCIE_AUX_CTRL, CLK_PCIE_AUX_DIV_INT),
regmap_reg_range(CLK_PCIE_AUX_SEL, CLK_PCIE_AUX_SEL),
- regmap_reg_range(CLK_USBH0_MICROFRAME_CTRL, CLK_USBH0_MICROFRAME_DIV_INT),
+ regmap_reg_range(CLK_USBH0_MICROFRAME_CTRL,
+ CLK_USBH0_MICROFRAME_DIV_INT),
regmap_reg_range(CLK_USBH0_MICROFRAME_SEL, CLK_USBH0_MICROFRAME_SEL),
- regmap_reg_range(CLK_USBH1_MICROFRAME_CTRL, CLK_USBH1_MICROFRAME_DIV_INT),
+ regmap_reg_range(CLK_USBH1_MICROFRAME_CTRL,
+ CLK_USBH1_MICROFRAME_DIV_INT),
regmap_reg_range(CLK_USBH1_MICROFRAME_SEL, CLK_USBH1_MICROFRAME_SEL),
regmap_reg_range(CLK_USBH0_SUSPEND_CTRL, CLK_USBH0_SUSPEND_DIV_INT),
regmap_reg_range(CLK_USBH0_SUSPEND_SEL, CLK_USBH0_SUSPEND_SEL),
@@ -2412,8 +2157,8 @@ static int rp1_clk_probe(struct platform_device *pdev)
if (IS_ERR(clockman->regs))
return PTR_ERR(clockman->regs);
- clockman->regmap = devm_regmap_init_mmio(dev, clockman->regs,
- &rp1_clk_regmap_cfg);
+ clockman->regmap =
+ devm_regmap_init_mmio(dev, clockman->regs, &rp1_clk_regmap_cfg);
if (IS_ERR(clockman->regmap)) {
dev_err_probe(dev, PTR_ERR(clockman->regmap),
"could not init clock regmap\n");