|
187 | 187 | #define USBDRD_UCTL_ECC 0xf0
|
188 | 188 | #define USBDRD_UCTL_SPARE1 0xf8
|
189 | 189 |
|
190 |
| -#define OCTEON_H_CLKDIV_SEL 8 |
191 |
| -#define OCTEON_MIN_H_CLK_RATE 150000000 |
192 |
| -#define OCTEON_MAX_H_CLK_RATE 300000000 |
193 |
| - |
194 | 190 | static DEFINE_MUTEX(dwc3_octeon_clocks_mutex);
|
195 |
| -static uint8_t clk_div[OCTEON_H_CLKDIV_SEL] = {1, 2, 4, 6, 8, 16, 24, 32}; |
196 | 191 |
|
197 | 192 | #ifdef CONFIG_CAVIUM_OCTEON_SOC
|
198 | 193 | #include <asm/octeon/octeon.h>
|
@@ -240,6 +235,21 @@ static inline void dwc3_octeon_writeq(void __iomem *base, uint64_t val) { }
|
240 | 235 | static inline void dwc3_octeon_config_gpio(int index, int gpio) { }
|
241 | 236 | #endif
|
242 | 237 |
|
| 238 | +static int dwc3_octeon_get_divider(void) |
| 239 | +{ |
| 240 | + static const uint8_t clk_div[] = { 1, 2, 4, 6, 8, 16, 24, 32 }; |
| 241 | + int div = 0; |
| 242 | + |
| 243 | + while (div < ARRAY_SIZE(clk_div)) { |
| 244 | + uint64_t rate = octeon_get_io_clock_rate() / clk_div[div]; |
| 245 | + if (rate <= 300000000 && rate >= 150000000) |
| 246 | + break; |
| 247 | + div++; |
| 248 | + } |
| 249 | + |
| 250 | + return div; |
| 251 | +} |
| 252 | + |
243 | 253 | static int dwc3_octeon_config_power(struct device *dev, void __iomem *base)
|
244 | 254 | {
|
245 | 255 | uint32_t gpio_pwr[3];
|
@@ -284,9 +294,9 @@ static int dwc3_octeon_config_power(struct device *dev, void __iomem *base)
|
284 | 294 |
|
285 | 295 | static int dwc3_octeon_clocks_start(struct device *dev, void __iomem *base)
|
286 | 296 | {
|
287 |
| - int i, mpll_mul, ref_clk_fsel, ref_clk_sel = 2; |
| 297 | + int i, div, mpll_mul, ref_clk_fsel, ref_clk_sel = 2; |
288 | 298 | u32 clock_rate;
|
289 |
| - u64 div, h_clk_rate, val; |
| 299 | + u64 val; |
290 | 300 | void __iomem *uctl_ctl_reg = base + USBDRD_UCTL_CTL;
|
291 | 301 |
|
292 | 302 | if (dev->of_node) {
|
@@ -363,12 +373,7 @@ static int dwc3_octeon_clocks_start(struct device *dev, void __iomem *base)
|
363 | 373 | dwc3_octeon_writeq(uctl_ctl_reg, val);
|
364 | 374 |
|
365 | 375 | /* Step 4b: Select controller clock frequency. */
|
366 |
| - for (div = 0; div < OCTEON_H_CLKDIV_SEL; div++) { |
367 |
| - h_clk_rate = octeon_get_io_clock_rate() / clk_div[div]; |
368 |
| - if (h_clk_rate <= OCTEON_MAX_H_CLK_RATE && |
369 |
| - h_clk_rate >= OCTEON_MIN_H_CLK_RATE) |
370 |
| - break; |
371 |
| - } |
| 376 | + div = dwc3_octeon_get_divider(); |
372 | 377 | val = dwc3_octeon_readq(uctl_ctl_reg);
|
373 | 378 | val &= ~USBDRD_UCTL_CTL_H_CLKDIV_SEL;
|
374 | 379 | val |= FIELD_PREP(USBDRD_UCTL_CTL_H_CLKDIV_SEL, div);
|
|
0 commit comments