Skip to content

Commit 17b6872

Browse files
committed
Merge pull request torvalds#54 from HarveyHunt/ci20-v3.18-mmc-regression-cgu
Ci20 v3.18 MSC0 Performance Fix
2 parents a19d10e + 41903f7 commit 17b6872

File tree

5 files changed

+46
-35
lines changed

5 files changed

+46
-35
lines changed

arch/mips/boot/dts/ci20.dts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@
125125

126126
&msc0 {
127127
bus-width = <4>;
128-
max-frequency = <48000000>;
128+
max-frequency = <50000000>;
129129
cd-gpios = <&gpf 20 GPIO_ACTIVE_LOW>;
130130

131131
pinctrl-names = "default";

drivers/clk/jz47xx/jz4740-cgu.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -94,81 +94,81 @@ static const struct jz47xx_cgu_clk_info jz4740_cgu_clocks[] = {
9494
[JZ4740_CLK_PLL_HALF] = {
9595
"pll half", CGU_CLK_DIV,
9696
.parents = { JZ4740_CLK_PLL, -1 },
97-
.div = { CGU_REG_CPCCR, 21, 1, -1, -1, -1 },
97+
.div = { CGU_REG_CPCCR, 21, 0, 1, -1, -1, -1 },
9898
},
9999

100100
[JZ4740_CLK_CCLK] = {
101101
"cclk", CGU_CLK_DIV,
102102
.parents = { JZ4740_CLK_PLL, -1 },
103-
.div = { CGU_REG_CPCCR, 0, 4, 22, -1, -1 },
103+
.div = { CGU_REG_CPCCR, 0, 0, 4, 22, -1, -1 },
104104
},
105105

106106
[JZ4740_CLK_HCLK] = {
107107
"hclk", CGU_CLK_DIV,
108108
.parents = { JZ4740_CLK_PLL, -1 },
109-
.div = { CGU_REG_CPCCR, 4, 4, 22, -1, -1 },
109+
.div = { CGU_REG_CPCCR, 4, 0, 4, 22, -1, -1 },
110110
},
111111

112112
[JZ4740_CLK_PCLK] = {
113113
"pclk", CGU_CLK_DIV,
114114
.parents = { JZ4740_CLK_PLL, -1 },
115-
.div = { CGU_REG_CPCCR, 8, 4, 22, -1, -1 },
115+
.div = { CGU_REG_CPCCR, 8, 0, 4, 22, -1, -1 },
116116
},
117117

118118
[JZ4740_CLK_MCLK] = {
119119
"mclk", CGU_CLK_DIV,
120120
.parents = { JZ4740_CLK_PLL, -1 },
121-
.div = { CGU_REG_CPCCR, 12, 4, 22, -1, -1 },
121+
.div = { CGU_REG_CPCCR, 12, 0, 4, 22, -1, -1 },
122122
},
123123

124124
[JZ4740_CLK_LCD] = {
125125
"lcd", CGU_CLK_DIV | CGU_CLK_GATE,
126126
.parents = { JZ4740_CLK_PLL_HALF, -1 },
127-
.div = { CGU_REG_CPCCR, 16, 5, 22, -1, -1 },
127+
.div = { CGU_REG_CPCCR, 16, 0, 5, 22, -1, -1 },
128128
.gate_bit = 10,
129129
},
130130

131131
[JZ4740_CLK_LCD_PCLK] = {
132132
"lcd_pclk", CGU_CLK_DIV,
133133
.parents = { JZ4740_CLK_PLL_HALF, -1 },
134-
.div = { CGU_REG_LPCDR, 0, 11, -1, -1, -1 },
134+
.div = { CGU_REG_LPCDR, 0, 0, 11, -1, -1, -1 },
135135
},
136136

137137
[JZ4740_CLK_I2S] = {
138138
"i2s", CGU_CLK_MUX | CGU_CLK_DIV | CGU_CLK_GATE,
139139
.parents = { JZ4740_CLK_EXT, JZ4740_CLK_PLL_HALF, -1 },
140140
.mux = { CGU_REG_CPCCR, 31, 1 },
141-
.div = { CGU_REG_I2SCDR, 0, 8, -1, -1, -1 },
141+
.div = { CGU_REG_I2SCDR, 0, 0, 8, -1, -1, -1 },
142142
.gate_bit = 6,
143143
},
144144

145145
[JZ4740_CLK_SPI] = {
146146
"spi", CGU_CLK_MUX | CGU_CLK_DIV | CGU_CLK_GATE,
147147
.parents = { JZ4740_CLK_EXT, JZ4740_CLK_PLL, -1 },
148148
.mux = { CGU_REG_SSICDR, 31, 1 },
149-
.div = { CGU_REG_SSICDR, 0, 4, -1, -1, -1 },
149+
.div = { CGU_REG_SSICDR, 0, 0, 4, -1, -1, -1 },
150150
.gate_bit = 4,
151151
},
152152

153153
[JZ4740_CLK_MMC] = {
154154
"mmc", CGU_CLK_DIV | CGU_CLK_GATE,
155155
.parents = { JZ4740_CLK_PLL_HALF, -1 },
156-
.div = { CGU_REG_MSCCDR, 0, 5, -1, -1, -1 },
156+
.div = { CGU_REG_MSCCDR, 0, 0, 5, -1, -1, -1 },
157157
.gate_bit = 7,
158158
},
159159

160160
[JZ4740_CLK_UHC] = {
161161
"uhc", CGU_CLK_DIV | CGU_CLK_GATE,
162162
.parents = { JZ4740_CLK_PLL_HALF, -1 },
163-
.div = { CGU_REG_UHCCDR, 0, 4, -1, -1, -1 },
163+
.div = { CGU_REG_UHCCDR, 0, 0, 4, -1, -1, -1 },
164164
.gate_bit = 14,
165165
},
166166

167167
[JZ4740_CLK_UDC] = {
168168
"udc", CGU_CLK_MUX | CGU_CLK_DIV,
169169
.parents = { JZ4740_CLK_EXT, JZ4740_CLK_PLL_HALF, -1 },
170170
.mux = { CGU_REG_CPCCR, 29, 1 },
171-
.div = { CGU_REG_CPCCR, 23, 6, -1, -1, -1 },
171+
.div = { CGU_REG_CPCCR, 23, 0, 6, -1, -1, -1 },
172172
/* TODO: gate via SCR */
173173
},
174174

drivers/clk/jz47xx/jz4780-cgu.c

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -228,21 +228,21 @@ static const struct jz47xx_cgu_clk_info jz4780_cgu_clocks[] = {
228228
[JZ4780_CLK_CPU] = {
229229
"cpu", CGU_CLK_DIV,
230230
.parents = { JZ4780_CLK_CPUMUX, -1 },
231-
.div = { CGU_REG_CLOCKCONTROL, 0, 4, 22, -1, -1 },
231+
.div = { CGU_REG_CLOCKCONTROL, 0, 0, 4, 22, -1, -1 },
232232
},
233233

234234
[JZ4780_CLK_L2CACHE] = {
235235
"l2cache", CGU_CLK_DIV,
236236
.parents = { JZ4780_CLK_CPUMUX, -1 },
237-
.div = { CGU_REG_CLOCKCONTROL, 4, 4, -1, -1, -1 },
237+
.div = { CGU_REG_CLOCKCONTROL, 4, 0, 4, -1, -1, -1 },
238238
},
239239

240240
[JZ4780_CLK_AHB0] = {
241241
"ahb0", CGU_CLK_MUX | CGU_CLK_DIV,
242242
.parents = { -1, JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
243243
JZ4780_CLK_EPLL },
244244
.mux = { CGU_REG_CLOCKCONTROL, 26, 2 },
245-
.div = { CGU_REG_CLOCKCONTROL, 8, 4, 21, -1, -1 },
245+
.div = { CGU_REG_CLOCKCONTROL, 8, 0, 4, 21, -1, -1 },
246246
},
247247

248248
[JZ4780_CLK_AHB2PMUX] = {
@@ -255,36 +255,36 @@ static const struct jz47xx_cgu_clk_info jz4780_cgu_clocks[] = {
255255
[JZ4780_CLK_AHB2] = {
256256
"ahb2", CGU_CLK_DIV,
257257
.parents = { JZ4780_CLK_AHB2PMUX, -1 },
258-
.div = { CGU_REG_CLOCKCONTROL, 12, 4, 20, -1, -1 },
258+
.div = { CGU_REG_CLOCKCONTROL, 12, 0, 4, 20, -1, -1 },
259259
},
260260

261261
[JZ4780_CLK_PCLK] = {
262262
"pclk", CGU_CLK_DIV,
263263
.parents = { JZ4780_CLK_AHB2PMUX, -1 },
264-
.div = { CGU_REG_CLOCKCONTROL, 16, 4, 20, -1, -1 },
264+
.div = { CGU_REG_CLOCKCONTROL, 16, 0, 4, 20, -1, -1 },
265265
},
266266

267267
[JZ4780_CLK_DDR] = {
268268
"ddr", CGU_CLK_MUX | CGU_CLK_DIV,
269269
.parents = { -1, JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL, -1 },
270270
.mux = { CGU_REG_DDRCDR, 30, 2 },
271-
.div = { CGU_REG_DDRCDR, 0, 4, 29, 28, 27 },
271+
.div = { CGU_REG_DDRCDR, 0, 0, 4, 29, 28, 27 },
272272
},
273273

274274
[JZ4780_CLK_VPU] = {
275275
"vpu", CGU_CLK_MUX | CGU_CLK_DIV | CGU_CLK_GATE,
276276
.parents = { JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
277277
JZ4780_CLK_EPLL, -1 },
278278
.mux = { CGU_REG_VPUCDR, 30, 2 },
279-
.div = { CGU_REG_VPUCDR, 0, 4, 29, 28, 27 },
279+
.div = { CGU_REG_VPUCDR, 0, 0, 4, 29, 28, 27 },
280280
.gate_bit = 32 + 2,
281281
},
282282

283283
[JZ4780_CLK_I2SPLL] = {
284284
"i2s_pll", CGU_CLK_MUX | CGU_CLK_DIV,
285285
.parents = { JZ4780_CLK_SCLKA, JZ4780_CLK_EPLL, -1 },
286286
.mux = { CGU_REG_I2SCDR, 30, 1 },
287-
.div = { CGU_REG_I2SCDR, 0, 8, 29, 28, 27 },
287+
.div = { CGU_REG_I2SCDR, 0, 0, 8, 29, 28, 27 },
288288
},
289289

290290
[JZ4780_CLK_I2S] = {
@@ -298,15 +298,15 @@ static const struct jz47xx_cgu_clk_info jz4780_cgu_clocks[] = {
298298
.parents = { JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
299299
JZ4780_CLK_VPLL, -1 },
300300
.mux = { CGU_REG_LP0CDR, 30, 2 },
301-
.div = { CGU_REG_LP0CDR, 0, 8, 28, 27, 26 },
301+
.div = { CGU_REG_LP0CDR, 0, 0, 8, 28, 27, 26 },
302302
},
303303

304304
[JZ4780_CLK_LCD1PIXCLK] = {
305305
"lcd1pixclk", CGU_CLK_MUX | CGU_CLK_DIV,
306306
.parents = { JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
307307
JZ4780_CLK_VPLL, -1 },
308308
.mux = { CGU_REG_LP1CDR, 30, 2 },
309-
.div = { CGU_REG_LP1CDR, 0, 8, 28, 27, 26 },
309+
.div = { CGU_REG_LP1CDR, 0, 0, 8, 28, 27, 26 },
310310
},
311311

312312
[JZ4780_CLK_MSCMUX] = {
@@ -318,21 +318,21 @@ static const struct jz47xx_cgu_clk_info jz4780_cgu_clocks[] = {
318318
[JZ4780_CLK_MSC0] = {
319319
"msc0", CGU_CLK_DIV | CGU_CLK_GATE,
320320
.parents = { JZ4780_CLK_MSCMUX, -1 },
321-
.div = { CGU_REG_MSC0CDR, 0, 8, 29, 28, 27 },
321+
.div = { CGU_REG_MSC0CDR, 0, 1, 8, 29, 28, 27 },
322322
.gate_bit = 3,
323323
},
324324

325325
[JZ4780_CLK_MSC1] = {
326326
"msc1", CGU_CLK_DIV | CGU_CLK_GATE,
327327
.parents = { JZ4780_CLK_MSCMUX, -1 },
328-
.div = { CGU_REG_MSC1CDR, 0, 8, 29, 28, 27 },
328+
.div = { CGU_REG_MSC1CDR, 0, 1, 8, 29, 28, 27 },
329329
.gate_bit = 11,
330330
},
331331

332332
[JZ4780_CLK_MSC2] = {
333333
"msc2", CGU_CLK_DIV | CGU_CLK_GATE,
334334
.parents = { JZ4780_CLK_MSCMUX, -1 },
335-
.div = { CGU_REG_MSC2CDR, 0, 8, 29, 28, 27 },
335+
.div = { CGU_REG_MSC2CDR, 0, 1, 8, 29, 28, 27 },
336336
.gate_bit = 12,
337337
},
338338

@@ -341,15 +341,15 @@ static const struct jz47xx_cgu_clk_info jz4780_cgu_clocks[] = {
341341
.parents = { JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
342342
JZ4780_CLK_EPLL, JZ4780_CLK_OTGPHY },
343343
.mux = { CGU_REG_UHCCDR, 30, 2 },
344-
.div = { CGU_REG_UHCCDR, 0, 8, 29, 28, 27 },
344+
.div = { CGU_REG_UHCCDR, 0, 0, 8, 29, 28, 27 },
345345
.gate_bit = 24,
346346
},
347347

348348
[JZ4780_CLK_SSIPLL] = {
349349
"ssi_pll", CGU_CLK_MUX | CGU_CLK_DIV,
350350
.parents = { JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL, -1 },
351351
.mux = { CGU_REG_SSICDR, 30, 1 },
352-
.div = { CGU_REG_SSICDR, 0, 8, 29, 28, 27 },
352+
.div = { CGU_REG_SSICDR, 0, 0, 8, 29, 28, 27 },
353353
},
354354

355355
[JZ4780_CLK_SSI] = {
@@ -362,15 +362,15 @@ static const struct jz47xx_cgu_clk_info jz4780_cgu_clocks[] = {
362362
"cim_mclk", CGU_CLK_MUX | CGU_CLK_DIV,
363363
.parents = { JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL, -1 },
364364
.mux = { CGU_REG_CIMCDR, 31, 1 },
365-
.div = { CGU_REG_CIMCDR, 0, 8, 30, 29, 28 },
365+
.div = { CGU_REG_CIMCDR, 0, 0, 8, 30, 29, 28 },
366366
},
367367

368368
[JZ4780_CLK_PCMPLL] = {
369369
"pcm_pll", CGU_CLK_MUX | CGU_CLK_DIV,
370370
.parents = { JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
371371
JZ4780_CLK_EPLL, JZ4780_CLK_VPLL },
372372
.mux = { CGU_REG_PCMCDR, 29, 2 },
373-
.div = { CGU_REG_PCMCDR, 0, 8, 28, 27, 26 },
373+
.div = { CGU_REG_PCMCDR, 0, 0, 8, 28, 27, 26 },
374374
},
375375

376376
[JZ4780_CLK_PCM] = {
@@ -385,7 +385,7 @@ static const struct jz47xx_cgu_clk_info jz4780_cgu_clocks[] = {
385385
.parents = { -1, JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
386386
JZ4780_CLK_EPLL },
387387
.mux = { CGU_REG_GPUCDR, 30, 2 },
388-
.div = { CGU_REG_GPUCDR, 0, 4, 29, 28, 27 },
388+
.div = { CGU_REG_GPUCDR, 0, 0, 4, 29, 28, 27 },
389389
.gate_bit = 32 + 4,
390390
},
391391

@@ -394,7 +394,7 @@ static const struct jz47xx_cgu_clk_info jz4780_cgu_clocks[] = {
394394
.parents = { JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
395395
JZ4780_CLK_VPLL, -1 },
396396
.mux = { CGU_REG_HDMICDR, 30, 2 },
397-
.div = { CGU_REG_HDMICDR, 0, 8, 29, 28, 26 },
397+
.div = { CGU_REG_HDMICDR, 0, 0, 8, 29, 28, 26 },
398398
.gate_bit = 32 + 9,
399399
},
400400

@@ -403,7 +403,7 @@ static const struct jz47xx_cgu_clk_info jz4780_cgu_clocks[] = {
403403
.parents = { -1, JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
404404
JZ4780_CLK_EPLL },
405405
.mux = { CGU_REG_BCHCDR, 30, 2 },
406-
.div = { CGU_REG_BCHCDR, 0, 4, 29, 28, 27 },
406+
.div = { CGU_REG_BCHCDR, 0, 0, 4, 29, 28, 27 },
407407
.gate_bit = 1,
408408
},
409409

drivers/clk/jz47xx/jz47xx-cgu.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,7 @@ static unsigned long jz47xx_clk_recalc_rate(struct clk_hw *hw,
332332
div = (div_reg >> clk_info->div.shift) &
333333
((1 << clk_info->div.bits) - 1);
334334
div += 1;
335+
div <<= clk_info->div.div;
335336

336337
rate /= div;
337338
}
@@ -352,6 +353,12 @@ static unsigned jz47xx_clk_calc_div(const struct jz47xx_cgu_clk_info *clk_info,
352353
div = min_t(unsigned, div, 1 << clk_info->div.bits);
353354
div = max_t(unsigned, div, 1);
354355

356+
/* If the divider value itself must be divided before being written to
357+
* the divider register, we must ensure we don't have any bits set that
358+
* would be lost as a result of doing so. */
359+
div >>= clk_info->div.div;
360+
div <<= clk_info->div.div;
361+
355362
return div;
356363
}
357364

@@ -401,7 +408,7 @@ static int jz47xx_clk_set_rate(struct clk_hw *hw, unsigned long req_rate,
401408
/* update the divide */
402409
mask = (1 << clk_info->div.bits) - 1;
403410
reg &= ~(mask << clk_info->div.shift);
404-
reg |= (div - 1) << clk_info->div.shift;
411+
reg |= ((div >> clk_info->div.div) - 1) << clk_info->div.shift;
405412

406413
/* clear the stop bit */
407414
if (clk_info->div.stop_bit != -1)

drivers/clk/jz47xx/jz47xx-cgu.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,11 @@ struct jz47xx_cgu_mux_info {
8080
/**
8181
* struct jz47xx_cgu_div_info - information about a divider
8282
* @reg: offset of the divider control register within the CGU
83-
* @shift: number of bits to shift the divide value by (ie. the index of
83+
* @shift: number of bits to left shift the divide value by (ie. the index of
8484
* the lowest bit of the divide value within its control register)
85+
* @div: number of bits to right shift the divide value by (ie. for if the
86+
* effective divider value is the value written to the register
87+
* multiplied by some constant).
8588
* @bits: the size of the divide value in bits
8689
* @ce_bit: the index of the change enable bit within reg, or -1 is there
8790
* isn't one
@@ -91,6 +94,7 @@ struct jz47xx_cgu_mux_info {
9194
struct jz47xx_cgu_div_info {
9295
unsigned reg;
9396
unsigned shift:5;
97+
unsigned div:5;
9498
unsigned bits:5;
9599
int ce_bit:6;
96100
int busy_bit:6;

0 commit comments

Comments
 (0)