Skip to content

Commit 12ef393

Browse files
committed
Merge branch 'clk-bcm' into clk-next
- Make defines for bcm63xx-gate clks to use in DT - Support gate clks on BCM6318 SoCs - Add HDMI clks for BCM2711 SoCs - Support BCM2711 SoC firmware clks * clk-bcm: (42 commits) clk: bcm: dvp: Add missing module informations clk: bcm: rpi: Remove the quirks for the CPU clock clk: bcm2835: Don't cache the PLLB rate clk: bcm2835: Allow custom CCF flags for the PLLs Revert "clk: bcm2835: remove pllb" clk: bcm: rpi: Give firmware clocks a name clk: bcm: rpi: Discover the firmware clocks clk: bcm: rpi: Add an enum for the firmware clocks clk: bcm: rpi: Add DT provider for the clocks clk: bcm: rpi: Make the PLLB registration function return a clk_hw clk: bcm: rpi: Split pllb clock hooks clk: bcm: rpi: Rename is_prepared function clk: bcm: rpi: Pass the clocks data to the firmware function clk: bcm: rpi: Add clock id to data clk: bcm: rpi: Create a data structure for the clocks clk: bcm: rpi: Use CCF boundaries instead of rolling our own clk: bcm: rpi: Make sure the clkdev lookup is removed clk: bcm: rpi: Switch to clk_hw_register_clkdev clk: bcm: rpi: Remove pllb_arm_lookup global pointer clk: bcm: rpi: Make sure pllb_arm is removed ...
2 parents 7aae3c1 + eb46f54 commit 12ef393

23 files changed

+1136
-256
lines changed

Documentation/devicetree/bindings/arm/bcm/raspberrypi,bcm2835-firmware.txt

Lines changed: 0 additions & 14 deletions
This file was deleted.
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# SPDX-License-Identifier: GPL-2.0
2+
%YAML 1.2
3+
---
4+
$id: http://devicetree.org/schemas/arm/bcm/raspberrypi,bcm2835-firmware.yaml#
5+
$schema: http://devicetree.org/meta-schemas/core.yaml#
6+
7+
title: Raspberry Pi VideoCore firmware driver
8+
9+
maintainers:
10+
- Eric Anholt <[email protected]>
11+
- Stefan Wahren <[email protected]>
12+
13+
properties:
14+
compatible:
15+
items:
16+
- const: raspberrypi,bcm2835-firmware
17+
- const: simple-bus
18+
19+
mboxes:
20+
$ref: '/schemas/types.yaml#/definitions/phandle'
21+
description: |
22+
Phandle to the firmware device's Mailbox.
23+
(See: ../mailbox/mailbox.txt for more information)
24+
25+
clocks:
26+
type: object
27+
28+
properties:
29+
compatible:
30+
const: raspberrypi,firmware-clocks
31+
32+
"#clock-cells":
33+
const: 1
34+
description: >
35+
The argument is the ID of the clocks contained by the
36+
firmware messages.
37+
38+
required:
39+
- compatible
40+
- "#clock-cells"
41+
42+
additionalProperties: false
43+
44+
required:
45+
- compatible
46+
- mboxes
47+
48+
examples:
49+
- |
50+
firmware {
51+
compatible = "raspberrypi,bcm2835-firmware", "simple-bus";
52+
mboxes = <&mailbox>;
53+
54+
firmware_clocks: clocks {
55+
compatible = "raspberrypi,firmware-clocks";
56+
#clock-cells = <1>;
57+
};
58+
};
59+
...
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
2+
%YAML 1.2
3+
---
4+
$id: http://devicetree.org/schemas/clock/brcm,bcm2711-dvp.yaml#
5+
$schema: http://devicetree.org/meta-schemas/core.yaml#
6+
7+
title: Broadcom BCM2711 HDMI DVP Device Tree Bindings
8+
9+
maintainers:
10+
- Maxime Ripard <[email protected]>
11+
12+
properties:
13+
"#clock-cells":
14+
const: 1
15+
16+
"#reset-cells":
17+
const: 1
18+
19+
compatible:
20+
const: brcm,brcm2711-dvp
21+
22+
reg:
23+
maxItems: 1
24+
25+
clocks:
26+
maxItems: 1
27+
28+
required:
29+
- "#clock-cells"
30+
- "#reset-cells"
31+
- compatible
32+
- reg
33+
- clocks
34+
35+
additionalProperties: false
36+
37+
examples:
38+
- |
39+
dvp: clock@7ef00000 {
40+
compatible = "brcm,brcm2711-dvp";
41+
reg = <0x7ef00000 0x10>;
42+
clocks = <&clk_108MHz>;
43+
#clock-cells = <1>;
44+
#reset-cells = <1>;
45+
};
46+
47+
...

Documentation/devicetree/bindings/clock/brcm,bcm63xx-clocks.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ Gated Clock Controller Bindings for MIPS based BCM63XX SoCs
33
Required properties:
44
- compatible: must be one of:
55
"brcm,bcm3368-clocks"
6+
"brcm,bcm6318-clocks"
7+
"brcm,bcm6318-ubus-clocks"
68
"brcm,bcm6328-clocks"
79
"brcm,bcm6358-clocks"
810
"brcm,bcm6362-clocks"

drivers/clk/bcm/Kconfig

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,15 @@
11
# SPDX-License-Identifier: GPL-2.0-only
2+
3+
config CLK_BCM2711_DVP
4+
tristate "Broadcom BCM2711 DVP support"
5+
depends on ARCH_BCM2835 ||COMPILE_TEST
6+
depends on COMMON_CLK
7+
default ARCH_BCM2835
8+
select RESET_SIMPLE
9+
help
10+
Enable common clock framework support for the Broadcom BCM2711
11+
DVP Controller.
12+
213
config CLK_BCM2835
314
bool "Broadcom BCM2835 clock support"
415
depends on ARCH_BCM2835 || ARCH_BRCMSTB || COMPILE_TEST

drivers/clk/bcm/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ obj-$(CONFIG_CLK_BCM_KONA) += clk-kona-setup.o
66
obj-$(CONFIG_CLK_BCM_KONA) += clk-bcm281xx.o
77
obj-$(CONFIG_CLK_BCM_KONA) += clk-bcm21664.o
88
obj-$(CONFIG_COMMON_CLK_IPROC) += clk-iproc-armpll.o clk-iproc-pll.o clk-iproc-asiu.o
9+
obj-$(CONFIG_CLK_BCM2711_DVP) += clk-bcm2711-dvp.o
910
obj-$(CONFIG_CLK_BCM2835) += clk-bcm2835.o
1011
obj-$(CONFIG_CLK_BCM2835) += clk-bcm2835-aux.o
1112
obj-$(CONFIG_CLK_RASPBERRYPI) += clk-raspberrypi.o

drivers/clk/bcm/clk-bcm2711-dvp.c

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
// SPDX-License-Identifier: GPL-2.0-or-later
2+
// Copyright 2020 Cerno
3+
4+
#include <linux/clk-provider.h>
5+
#include <linux/module.h>
6+
#include <linux/platform_device.h>
7+
#include <linux/reset-controller.h>
8+
#include <linux/reset/reset-simple.h>
9+
10+
#define DVP_HT_RPI_SW_INIT 0x04
11+
#define DVP_HT_RPI_MISC_CONFIG 0x08
12+
13+
#define NR_CLOCKS 2
14+
#define NR_RESETS 6
15+
16+
struct clk_dvp {
17+
struct clk_hw_onecell_data *data;
18+
struct reset_simple_data reset;
19+
};
20+
21+
static const struct clk_parent_data clk_dvp_parent = {
22+
.index = 0,
23+
};
24+
25+
static int clk_dvp_probe(struct platform_device *pdev)
26+
{
27+
struct clk_hw_onecell_data *data;
28+
struct resource *res;
29+
struct clk_dvp *dvp;
30+
void __iomem *base;
31+
int ret;
32+
33+
dvp = devm_kzalloc(&pdev->dev, sizeof(*dvp), GFP_KERNEL);
34+
if (!dvp)
35+
return -ENOMEM;
36+
platform_set_drvdata(pdev, dvp);
37+
38+
dvp->data = devm_kzalloc(&pdev->dev,
39+
struct_size(dvp->data, hws, NR_CLOCKS),
40+
GFP_KERNEL);
41+
if (!dvp->data)
42+
return -ENOMEM;
43+
data = dvp->data;
44+
45+
base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
46+
if (IS_ERR(base))
47+
return PTR_ERR(base);
48+
49+
dvp->reset.rcdev.owner = THIS_MODULE;
50+
dvp->reset.rcdev.nr_resets = NR_RESETS;
51+
dvp->reset.rcdev.ops = &reset_simple_ops;
52+
dvp->reset.rcdev.of_node = pdev->dev.of_node;
53+
dvp->reset.membase = base + DVP_HT_RPI_SW_INIT;
54+
spin_lock_init(&dvp->reset.lock);
55+
56+
ret = devm_reset_controller_register(&pdev->dev, &dvp->reset.rcdev);
57+
if (ret)
58+
return ret;
59+
60+
data->hws[0] = clk_hw_register_gate_parent_data(&pdev->dev,
61+
"hdmi0-108MHz",
62+
&clk_dvp_parent, 0,
63+
base + DVP_HT_RPI_MISC_CONFIG, 3,
64+
CLK_GATE_SET_TO_DISABLE,
65+
&dvp->reset.lock);
66+
if (IS_ERR(data->hws[0]))
67+
return PTR_ERR(data->hws[0]);
68+
69+
data->hws[1] = clk_hw_register_gate_parent_data(&pdev->dev,
70+
"hdmi1-108MHz",
71+
&clk_dvp_parent, 0,
72+
base + DVP_HT_RPI_MISC_CONFIG, 4,
73+
CLK_GATE_SET_TO_DISABLE,
74+
&dvp->reset.lock);
75+
if (IS_ERR(data->hws[1])) {
76+
ret = PTR_ERR(data->hws[1]);
77+
goto unregister_clk0;
78+
}
79+
80+
data->num = NR_CLOCKS;
81+
ret = of_clk_add_hw_provider(pdev->dev.of_node, of_clk_hw_onecell_get,
82+
data);
83+
if (ret)
84+
goto unregister_clk1;
85+
86+
return 0;
87+
88+
unregister_clk1:
89+
clk_hw_unregister_gate(data->hws[1]);
90+
91+
unregister_clk0:
92+
clk_hw_unregister_gate(data->hws[0]);
93+
return ret;
94+
};
95+
96+
static int clk_dvp_remove(struct platform_device *pdev)
97+
{
98+
struct clk_dvp *dvp = platform_get_drvdata(pdev);
99+
struct clk_hw_onecell_data *data = dvp->data;
100+
101+
clk_hw_unregister_gate(data->hws[1]);
102+
clk_hw_unregister_gate(data->hws[0]);
103+
104+
return 0;
105+
}
106+
107+
static const struct of_device_id clk_dvp_dt_ids[] = {
108+
{ .compatible = "brcm,brcm2711-dvp", },
109+
{ /* sentinel */ }
110+
};
111+
112+
static struct platform_driver clk_dvp_driver = {
113+
.probe = clk_dvp_probe,
114+
.remove = clk_dvp_remove,
115+
.driver = {
116+
.name = "brcm2711-dvp",
117+
.of_match_table = clk_dvp_dt_ids,
118+
},
119+
};
120+
module_platform_driver(clk_dvp_driver);
121+
122+
MODULE_AUTHOR("Maxime Ripard <[email protected]>");
123+
MODULE_DESCRIPTION("BCM2711 DVP clock driver");
124+
MODULE_LICENSE("GPL");

drivers/clk/bcm/clk-bcm2835.c

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,7 @@ struct bcm2835_pll_data {
421421
u32 reference_enable_mask;
422422
/* Bit in CM_LOCK to indicate when the PLL has locked. */
423423
u32 lock_mask;
424+
u32 flags;
424425

425426
const struct bcm2835_pll_ana_bits *ana;
426427

@@ -1310,7 +1311,7 @@ static struct clk_hw *bcm2835_register_pll(struct bcm2835_cprman *cprman,
13101311
init.num_parents = 1;
13111312
init.name = pll_data->name;
13121313
init.ops = &bcm2835_pll_clk_ops;
1313-
init.flags = CLK_IGNORE_UNUSED;
1314+
init.flags = pll_data->flags | CLK_IGNORE_UNUSED;
13141315

13151316
pll = kzalloc(sizeof(*pll), GFP_KERNEL);
13161317
if (!pll)
@@ -1684,10 +1685,33 @@ static const struct bcm2835_clk_desc clk_desc_array[] = {
16841685
.fixed_divider = 1,
16851686
.flags = CLK_SET_RATE_PARENT),
16861687

1687-
/*
1688-
* PLLB is used for the ARM's clock. Controlled by firmware, see
1689-
* clk-raspberrypi.c.
1690-
*/
1688+
/* PLLB is used for the ARM's clock. */
1689+
[BCM2835_PLLB] = REGISTER_PLL(
1690+
SOC_ALL,
1691+
.name = "pllb",
1692+
.cm_ctrl_reg = CM_PLLB,
1693+
.a2w_ctrl_reg = A2W_PLLB_CTRL,
1694+
.frac_reg = A2W_PLLB_FRAC,
1695+
.ana_reg_base = A2W_PLLB_ANA0,
1696+
.reference_enable_mask = A2W_XOSC_CTRL_PLLB_ENABLE,
1697+
.lock_mask = CM_LOCK_FLOCKB,
1698+
1699+
.ana = &bcm2835_ana_default,
1700+
1701+
.min_rate = 600000000u,
1702+
.max_rate = 3000000000u,
1703+
.max_fb_rate = BCM2835_MAX_FB_RATE,
1704+
.flags = CLK_GET_RATE_NOCACHE),
1705+
[BCM2835_PLLB_ARM] = REGISTER_PLL_DIV(
1706+
SOC_ALL,
1707+
.name = "pllb_arm",
1708+
.source_pll = "pllb",
1709+
.cm_reg = CM_PLLB,
1710+
.a2w_reg = A2W_PLLB_ARM,
1711+
.load_mask = CM_PLLB_LOADARM,
1712+
.hold_mask = CM_PLLB_HOLDARM,
1713+
.fixed_divider = 1,
1714+
.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE),
16911715

16921716
/*
16931717
* PLLC is the core PLL, used to drive the core VPU clock.

0 commit comments

Comments
 (0)