Skip to content

Commit dc917ea

Browse files
3x380Vtsbogend
authored andcommitted
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>
1 parent 2257c6c commit dc917ea

File tree

1 file changed

+18
-13
lines changed

1 file changed

+18
-13
lines changed

arch/mips/cavium-octeon/octeon-usb.c

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -187,12 +187,7 @@
187187
#define USBDRD_UCTL_ECC 0xf0
188188
#define USBDRD_UCTL_SPARE1 0xf8
189189

190-
#define OCTEON_H_CLKDIV_SEL 8
191-
#define OCTEON_MIN_H_CLK_RATE 150000000
192-
#define OCTEON_MAX_H_CLK_RATE 300000000
193-
194190
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};
196191

197192
#ifdef CONFIG_CAVIUM_OCTEON_SOC
198193
#include <asm/octeon/octeon.h>
@@ -240,6 +235,21 @@ static inline void dwc3_octeon_writeq(void __iomem *base, uint64_t val) { }
240235
static inline void dwc3_octeon_config_gpio(int index, int gpio) { }
241236
#endif
242237

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+
243253
static int dwc3_octeon_config_power(struct device *dev, void __iomem *base)
244254
{
245255
uint32_t gpio_pwr[3];
@@ -284,9 +294,9 @@ static int dwc3_octeon_config_power(struct device *dev, void __iomem *base)
284294

285295
static int dwc3_octeon_clocks_start(struct device *dev, void __iomem *base)
286296
{
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;
288298
u32 clock_rate;
289-
u64 div, h_clk_rate, val;
299+
u64 val;
290300
void __iomem *uctl_ctl_reg = base + USBDRD_UCTL_CTL;
291301

292302
if (dev->of_node) {
@@ -363,12 +373,7 @@ static int dwc3_octeon_clocks_start(struct device *dev, void __iomem *base)
363373
dwc3_octeon_writeq(uctl_ctl_reg, val);
364374

365375
/* 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();
372377
val = dwc3_octeon_readq(uctl_ctl_reg);
373378
val &= ~USBDRD_UCTL_CTL_H_CLKDIV_SEL;
374379
val |= FIELD_PREP(USBDRD_UCTL_CTL_H_CLKDIV_SEL, div);

0 commit comments

Comments
 (0)