MIPS: OCTEON: octeon-usb: cleanup divider calculation

Simple self-contained function is easier to review.

Signed-off-by: Ladislav Michl <ladis@linux-mips.org>
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>

authored by Ladislav Michl and committed by Thomas Bogendoerfer dc917ea7 2257c6c9

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