tangled
alpha
login
or
join now
tjh.dev
/
kernel
1
fork
atom
Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1
fork
atom
overview
issues
pulls
pipelines
Merge branch 'clk-fixes' into clk-next
Michael Turquette
11 years ago
da57b460
7f615dd4
+32
-34
7 changed files
expand all
collapse all
unified
split
drivers
clk
at91
clk-usb.c
clk-divider.c
pxa
clk-pxa27x.c
qcom
mmcc-apq8084.c
rockchip
clk.c
include
dt-bindings
clock
qcom,mmcc-apq8084.h
linux
clk-provider.h
+18
-17
drivers/clk/at91/clk-usb.c
reviewed
···
52
52
53
53
tmp = pmc_read(pmc, AT91_PMC_USB);
54
54
usbdiv = (tmp & AT91_PMC_OHCIUSBDIV) >> SAM9X5_USB_DIV_SHIFT;
55
55
-
return parent_rate / (usbdiv + 1);
55
55
+
56
56
+
return DIV_ROUND_CLOSEST(parent_rate, (usbdiv + 1));
56
57
}
57
58
58
59
static long at91sam9x5_clk_usb_round_rate(struct clk_hw *hw, unsigned long rate,
59
60
unsigned long *parent_rate)
60
61
{
61
62
unsigned long div;
62
62
-
unsigned long bestrate;
63
63
-
unsigned long tmp;
63
63
+
64
64
+
if (!rate)
65
65
+
return -EINVAL;
64
66
65
67
if (rate >= *parent_rate)
66
68
return *parent_rate;
67
69
68
68
-
div = *parent_rate / rate;
69
69
-
if (div >= SAM9X5_USB_MAX_DIV)
70
70
-
return *parent_rate / (SAM9X5_USB_MAX_DIV + 1);
70
70
+
div = DIV_ROUND_CLOSEST(*parent_rate, rate);
71
71
+
if (div > SAM9X5_USB_MAX_DIV + 1)
72
72
+
div = SAM9X5_USB_MAX_DIV + 1;
71
73
72
72
-
bestrate = *parent_rate / div;
73
73
-
tmp = *parent_rate / (div + 1);
74
74
-
if (bestrate - rate > rate - tmp)
75
75
-
bestrate = tmp;
76
76
-
77
77
-
return bestrate;
74
74
+
return DIV_ROUND_CLOSEST(*parent_rate, div);
78
75
}
79
76
80
77
static int at91sam9x5_clk_usb_set_parent(struct clk_hw *hw, u8 index)
···
103
106
u32 tmp;
104
107
struct at91sam9x5_clk_usb *usb = to_at91sam9x5_clk_usb(hw);
105
108
struct at91_pmc *pmc = usb->pmc;
106
106
-
unsigned long div = parent_rate / rate;
109
109
+
unsigned long div;
107
110
108
108
-
if (parent_rate % rate || div < 1 || div >= SAM9X5_USB_MAX_DIV)
111
111
+
if (!rate)
112
112
+
return -EINVAL;
113
113
+
114
114
+
div = DIV_ROUND_CLOSEST(parent_rate, rate);
115
115
+
if (div > SAM9X5_USB_MAX_DIV + 1 || !div)
109
116
return -EINVAL;
110
117
111
118
tmp = pmc_read(pmc, AT91_PMC_USB) & ~AT91_PMC_OHCIUSBDIV;
···
254
253
255
254
tmp_parent_rate = rate * usb->divisors[i];
256
255
tmp_parent_rate = __clk_round_rate(parent, tmp_parent_rate);
257
257
-
tmprate = tmp_parent_rate / usb->divisors[i];
256
256
+
tmprate = DIV_ROUND_CLOSEST(tmp_parent_rate, usb->divisors[i]);
258
257
if (tmprate < rate)
259
258
tmpdiff = rate - tmprate;
260
259
else
···
282
281
struct at91_pmc *pmc = usb->pmc;
283
282
unsigned long div;
284
283
285
285
-
if (!rate || parent_rate % rate)
284
284
+
if (!rate)
286
285
return -EINVAL;
287
286
288
288
-
div = parent_rate / rate;
287
287
+
div = DIV_ROUND_CLOSEST(parent_rate, rate);
289
288
290
289
for (i = 0; i < RM9200_USB_DIV_TAB_SIZE; i++) {
291
290
if (usb->divisors[i] == div) {
+9
-9
drivers/clk/clk-divider.c
reviewed
···
263
263
if (!rate)
264
264
rate = 1;
265
265
266
266
+
/* if read only, just return current value */
267
267
+
if (divider->flags & CLK_DIVIDER_READ_ONLY) {
268
268
+
bestdiv = readl(divider->reg) >> divider->shift;
269
269
+
bestdiv &= div_mask(divider);
270
270
+
bestdiv = _get_div(divider, bestdiv);
271
271
+
return bestdiv;
272
272
+
}
273
273
+
266
274
maxdiv = _get_maxdiv(divider);
267
275
268
276
if (!(__clk_get_flags(hw->clk) & CLK_SET_RATE_PARENT)) {
···
369
361
};
370
362
EXPORT_SYMBOL_GPL(clk_divider_ops);
371
363
372
372
-
const struct clk_ops clk_divider_ro_ops = {
373
373
-
.recalc_rate = clk_divider_recalc_rate,
374
374
-
};
375
375
-
EXPORT_SYMBOL_GPL(clk_divider_ro_ops);
376
376
-
377
364
static struct clk *_register_divider(struct device *dev, const char *name,
378
365
const char *parent_name, unsigned long flags,
379
366
void __iomem *reg, u8 shift, u8 width,
···
394
391
}
395
392
396
393
init.name = name;
397
397
-
if (clk_divider_flags & CLK_DIVIDER_READ_ONLY)
398
398
-
init.ops = &clk_divider_ro_ops;
399
399
-
else
400
400
-
init.ops = &clk_divider_ops;
394
394
+
init.ops = &clk_divider_ops;
401
395
init.flags = flags | CLK_IS_BASIC;
402
396
init.parent_names = (parent_name ? &parent_name: NULL);
403
397
init.num_parents = (parent_name ? 1 : 0);
+2
-2
drivers/clk/pxa/clk-pxa27x.c
reviewed
···
322
322
unsigned long ccsr = CCSR;
323
323
324
324
osc_forced = ccsr & (1 << CCCR_CPDIS_BIT);
325
325
-
a = cccr & CCCR_A_BIT;
325
325
+
a = cccr & (1 << CCCR_A_BIT);
326
326
l = ccsr & CCSR_L_MASK;
327
327
328
328
if (osc_forced || a)
···
341
341
unsigned long ccsr = CCSR;
342
342
343
343
osc_forced = ccsr & (1 << CCCR_CPDIS_BIT);
344
344
-
a = cccr & CCCR_A_BIT;
344
344
+
a = cccr & (1 << CCCR_A_BIT);
345
345
if (osc_forced)
346
346
return PXA_MEM_13Mhz;
347
347
if (a)
+1
-1
drivers/clk/qcom/mmcc-apq8084.c
reviewed
···
3122
3122
[ESC1_CLK_SRC] = &esc1_clk_src.clkr,
3123
3123
[HDMI_CLK_SRC] = &hdmi_clk_src.clkr,
3124
3124
[VSYNC_CLK_SRC] = &vsync_clk_src.clkr,
3125
3125
-
[RBCPR_CLK_SRC] = &rbcpr_clk_src.clkr,
3125
3125
+
[MMSS_RBCPR_CLK_SRC] = &rbcpr_clk_src.clkr,
3126
3126
[RBBMTIMER_CLK_SRC] = &rbbmtimer_clk_src.clkr,
3127
3127
[MAPLE_CLK_SRC] = &maple_clk_src.clkr,
3128
3128
[VDP_CLK_SRC] = &vdp_clk_src.clkr,
+1
-3
drivers/clk/rockchip/clk.c
reviewed
···
90
90
div->width = div_width;
91
91
div->lock = lock;
92
92
div->table = div_table;
93
93
-
div_ops = (div_flags & CLK_DIVIDER_READ_ONLY)
94
94
-
? &clk_divider_ro_ops
95
95
-
: &clk_divider_ops;
93
93
+
div_ops = &clk_divider_ops;
96
94
}
97
95
98
96
clk = clk_register_composite(NULL, name, parent_names, num_parents,
+1
-1
include/dt-bindings/clock/qcom,mmcc-apq8084.h
reviewed
···
60
60
#define ESC1_CLK_SRC 43
61
61
#define HDMI_CLK_SRC 44
62
62
#define VSYNC_CLK_SRC 45
63
63
-
#define RBCPR_CLK_SRC 46
63
63
+
#define MMSS_RBCPR_CLK_SRC 46
64
64
#define RBBMTIMER_CLK_SRC 47
65
65
#define MAPLE_CLK_SRC 48
66
66
#define VDP_CLK_SRC 49
-1
include/linux/clk-provider.h
reviewed
···
352
352
#define CLK_DIVIDER_READ_ONLY BIT(5)
353
353
354
354
extern const struct clk_ops clk_divider_ops;
355
355
-
extern const struct clk_ops clk_divider_ro_ops;
356
355
struct clk *clk_register_divider(struct device *dev, const char *name,
357
356
const char *parent_name, unsigned long flags,
358
357
void __iomem *reg, u8 shift, u8 width,