kernel: bump 5.4 to 5.4.48
[oweals/openwrt.git] / target / linux / bcm27xx / patches-5.4 / 950-0021-clk-bcm2835-Add-claim-clocks-property.patch
1 From b7c3fda0df5da90e87b037348c6d27f669c38388 Mon Sep 17 00:00:00 2001
2 From: Phil Elwell <phil@raspberrypi.org>
3 Date: Mon, 13 Feb 2017 17:20:08 +0000
4 Subject: [PATCH] clk-bcm2835: Add claim-clocks property
5
6 The claim-clocks property can be used to prevent PLLs and dividers
7 from being marked as critical. It contains a vector of clock IDs,
8 as defined by dt-bindings/clock/bcm2835.h.
9
10 Use this mechanism to claim PLLD_DSI0, PLLD_DSI1, PLLH_AUX and
11 PLLH_PIX for the vc4_kms_v3d driver.
12
13 Signed-off-by: Phil Elwell <phil@raspberrypi.org>
14 ---
15  drivers/clk/bcm/clk-bcm2835.c | 34 ++++++++++++++++++++++++++++++++--
16  1 file changed, 32 insertions(+), 2 deletions(-)
17
18 --- a/drivers/clk/bcm/clk-bcm2835.c
19 +++ b/drivers/clk/bcm/clk-bcm2835.c
20 @@ -1295,6 +1295,8 @@ static const struct clk_ops bcm2835_vpu_
21         .debug_init = bcm2835_clock_debug_init,
22  };
23  
24 +static bool bcm2835_clk_is_claimed(const char *name);
25 +
26  static struct clk_hw *bcm2835_register_pll(struct bcm2835_cprman *cprman,
27                                            const struct bcm2835_pll_data *data)
28  {
29 @@ -1311,6 +1313,9 @@ static struct clk_hw *bcm2835_register_p
30         init.ops = &bcm2835_pll_clk_ops;
31         init.flags = CLK_IGNORE_UNUSED;
32  
33 +       if (!bcm2835_clk_is_claimed(data->name))
34 +               init.flags |= CLK_IS_CRITICAL;
35 +
36         pll = kzalloc(sizeof(*pll), GFP_KERNEL);
37         if (!pll)
38                 return NULL;
39 @@ -1364,8 +1369,10 @@ bcm2835_register_pll_divider(struct bcm2
40         divider->div.table = NULL;
41  
42         if (!(cprman_read(cprman, data->cm_reg) & data->hold_mask)) {
43 -               init.flags |= CLK_IS_CRITICAL;
44 -               divider->div.flags |= CLK_IS_CRITICAL;
45 +               if (!bcm2835_clk_is_claimed(data->source_pll))
46 +                       init.flags |= CLK_IS_CRITICAL;
47 +               if (!bcm2835_clk_is_claimed(data->name))
48 +                       divider->div.flags |= CLK_IS_CRITICAL;
49         }
50  
51         divider->cprman = cprman;
52 @@ -2173,6 +2180,8 @@ static const struct bcm2835_clk_desc clk
53                 .ctl_reg = CM_PERIICTL),
54  };
55  
56 +static bool bcm2835_clk_claimed[ARRAY_SIZE(clk_desc_array)];
57 +
58  /*
59   * Permanently take a reference on the parent of the SDRAM clock.
60   *
61 @@ -2192,6 +2201,19 @@ static int bcm2835_mark_sdc_parent_criti
62         return clk_prepare_enable(parent);
63  }
64  
65 +static bool bcm2835_clk_is_claimed(const char *name)
66 +{
67 +       int i;
68 +
69 +       for (i = 0; i < ARRAY_SIZE(clk_desc_array); i++) {
70 +               const char *clk_name = *(const char **)(clk_desc_array[i].data);
71 +               if (!strcmp(name, clk_name))
72 +                   return bcm2835_clk_claimed[i];
73 +       }
74 +
75 +       return false;
76 +}
77 +
78  static int bcm2835_clk_probe(struct platform_device *pdev)
79  {
80         struct device *dev = &pdev->dev;
81 @@ -2202,6 +2224,7 @@ static int bcm2835_clk_probe(struct plat
82         const size_t asize = ARRAY_SIZE(clk_desc_array);
83         const struct cprman_plat_data *pdata;
84         size_t i;
85 +       u32 clk_id;
86         int ret;
87  
88         pdata = of_device_get_match_data(&pdev->dev);
89 @@ -2221,6 +2244,13 @@ static int bcm2835_clk_probe(struct plat
90         if (IS_ERR(cprman->regs))
91                 return PTR_ERR(cprman->regs);
92  
93 +       memset(bcm2835_clk_claimed, 0, sizeof(bcm2835_clk_claimed));
94 +       for (i = 0;
95 +            !of_property_read_u32_index(pdev->dev.of_node, "claim-clocks",
96 +                                        i, &clk_id);
97 +            i++)
98 +               bcm2835_clk_claimed[clk_id]= true;
99 +
100         memcpy(cprman->real_parent_names, cprman_parent_names,
101                sizeof(cprman_parent_names));
102         of_clk_parent_fill(dev->of_node, cprman->real_parent_names,