|
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