.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
---|
1 | 2 | /* Copyright (c) 2012-2015, 2017-2018, The Linux Foundation. |
---|
2 | 3 | * All rights reserved. |
---|
3 | | - * |
---|
4 | | - * This program is free software; you can redistribute it and/or modify |
---|
5 | | - * it under the terms of the GNU General Public License version 2 and |
---|
6 | | - * only version 2 as published by the Free Software Foundation. |
---|
7 | | - * |
---|
8 | | - * This program is distributed in the hope that it will be useful, |
---|
9 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
10 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
11 | | - * GNU General Public License for more details. |
---|
12 | 4 | */ |
---|
13 | 5 | |
---|
14 | 6 | #include <linux/clk.h> |
---|
15 | 7 | #include <linux/clk/clk-conf.h> |
---|
16 | 8 | #include <linux/err.h> |
---|
17 | 9 | #include <linux/delay.h> |
---|
| 10 | +#include <linux/of.h> |
---|
| 11 | + |
---|
| 12 | +#include <drm/drm_print.h> |
---|
18 | 13 | |
---|
19 | 14 | #include "dpu_io_util.h" |
---|
20 | 15 | |
---|
.. | .. |
---|
98 | 93 | DEV_DBG("%pS->%s: enable '%s'\n", |
---|
99 | 94 | __builtin_return_address(0), __func__, |
---|
100 | 95 | clk_arry[i].clk_name); |
---|
101 | | - if (clk_arry[i].clk) { |
---|
102 | | - rc = clk_prepare_enable(clk_arry[i].clk); |
---|
103 | | - if (rc) |
---|
104 | | - DEV_ERR("%pS->%s: %s en fail. rc=%d\n", |
---|
105 | | - __builtin_return_address(0), |
---|
106 | | - __func__, |
---|
107 | | - clk_arry[i].clk_name, rc); |
---|
108 | | - } else { |
---|
109 | | - DEV_ERR("%pS->%s: '%s' is not available\n", |
---|
110 | | - __builtin_return_address(0), __func__, |
---|
111 | | - clk_arry[i].clk_name); |
---|
112 | | - rc = -EPERM; |
---|
113 | | - } |
---|
| 96 | + rc = clk_prepare_enable(clk_arry[i].clk); |
---|
| 97 | + if (rc) |
---|
| 98 | + DEV_ERR("%pS->%s: %s en fail. rc=%d\n", |
---|
| 99 | + __builtin_return_address(0), |
---|
| 100 | + __func__, |
---|
| 101 | + clk_arry[i].clk_name, rc); |
---|
114 | 102 | |
---|
115 | | - if (rc) { |
---|
116 | | - msm_dss_enable_clk(&clk_arry[i], |
---|
117 | | - i, false); |
---|
| 103 | + if (rc && i) { |
---|
| 104 | + msm_dss_enable_clk(&clk_arry[i - 1], |
---|
| 105 | + i - 1, false); |
---|
118 | 106 | break; |
---|
119 | 107 | } |
---|
120 | 108 | } |
---|
.. | .. |
---|
124 | 112 | __builtin_return_address(0), __func__, |
---|
125 | 113 | clk_arry[i].clk_name); |
---|
126 | 114 | |
---|
127 | | - if (clk_arry[i].clk) |
---|
128 | | - clk_disable_unprepare(clk_arry[i].clk); |
---|
129 | | - else |
---|
130 | | - DEV_ERR("%pS->%s: '%s' is not available\n", |
---|
131 | | - __builtin_return_address(0), __func__, |
---|
132 | | - clk_arry[i].clk_name); |
---|
| 115 | + clk_disable_unprepare(clk_arry[i].clk); |
---|
133 | 116 | } |
---|
134 | 117 | } |
---|
135 | 118 | |
---|
.. | .. |
---|
164 | 147 | "clock-names", i, |
---|
165 | 148 | &clock_name); |
---|
166 | 149 | if (rc) { |
---|
167 | | - dev_err(&pdev->dev, "Failed to get clock name for %d\n", |
---|
| 150 | + DRM_DEV_ERROR(&pdev->dev, "Failed to get clock name for %d\n", |
---|
168 | 151 | i); |
---|
169 | 152 | break; |
---|
170 | 153 | } |
---|
.. | .. |
---|
176 | 159 | |
---|
177 | 160 | rc = msm_dss_get_clk(&pdev->dev, mp->clk_config, num_clk); |
---|
178 | 161 | if (rc) { |
---|
179 | | - dev_err(&pdev->dev, "Failed to get clock refs %d\n", rc); |
---|
| 162 | + DRM_DEV_ERROR(&pdev->dev, "Failed to get clock refs %d\n", rc); |
---|
180 | 163 | goto err; |
---|
181 | 164 | } |
---|
182 | 165 | |
---|
183 | 166 | rc = of_clk_set_defaults(pdev->dev.of_node, false); |
---|
184 | 167 | if (rc) { |
---|
185 | | - dev_err(&pdev->dev, "Failed to set clock defaults %d\n", rc); |
---|
| 168 | + DRM_DEV_ERROR(&pdev->dev, "Failed to set clock defaults %d\n", rc); |
---|
186 | 169 | goto err; |
---|
187 | 170 | } |
---|
188 | 171 | |
---|
.. | .. |
---|
192 | 175 | continue; |
---|
193 | 176 | mp->clk_config[i].rate = rate; |
---|
194 | 177 | mp->clk_config[i].type = DSS_CLK_PCLK; |
---|
| 178 | + mp->clk_config[i].max_rate = rate; |
---|
195 | 179 | } |
---|
196 | 180 | |
---|
197 | 181 | mp->num_clk = num_clk; |
---|