75
74
struct dss_clock_info cache_dss_cinfo;
76
75
struct dispc_clock_info cache_dispc_cinfo;
78
enum dss_clk_source dsi_clk_source;
79
enum dss_clk_source dispc_clk_source;
80
enum dss_clk_source lcd_clk_source[MAX_DSS_LCD_MANAGERS];
77
enum omap_dss_clk_source dsi_clk_source[MAX_NUM_DSI];
78
enum omap_dss_clk_source dispc_clk_source;
79
enum omap_dss_clk_source lcd_clk_source[MAX_DSS_LCD_MANAGERS];
82
81
u32 ctx[DSS_SZ_REGS / sizeof(u32)];
85
static const struct dss_clk_source_name dss_generic_clk_source_names[] = {
86
{ DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC, "DSI_PLL_HSDIV_DISPC" },
87
{ DSS_CLK_SRC_DSI_PLL_HSDIV_DSI, "DSI_PLL_HSDIV_DSI" },
88
{ DSS_CLK_SRC_FCK, "DSS_FCK" },
84
static const char * const dss_generic_clk_source_names[] = {
85
[OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC] = "DSI_PLL_HSDIV_DISPC",
86
[OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DSI] = "DSI_PLL_HSDIV_DSI",
87
[OMAP_DSS_CLK_SRC_FCK] = "DSS_FCK",
91
90
static void dss_clk_enable_all_no_ctx(void);
230
229
REG_FLD_MOD(DSS_PLL_CONTROL, 0, 18, 18); /* SDI_PLL_SYSRESET */
233
const char *dss_get_generic_clk_source_name(enum dss_clk_source clk_src)
232
const char *dss_get_generic_clk_source_name(enum omap_dss_clk_source clk_src)
235
return dss_generic_clk_source_names[clk_src].clksrc_name;
234
return dss_generic_clk_source_names[clk_src];
238
237
void dss_dump_clocks(struct seq_file *s)
240
239
unsigned long dpll4_ck_rate;
241
240
unsigned long dpll4_m4_ck_rate;
241
const char *fclk_name, *fclk_real_name;
242
unsigned long fclk_rate;
243
244
dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK);
245
dpll4_ck_rate = clk_get_rate(clk_get_parent(dss.dpll4_m4_ck));
246
dpll4_m4_ck_rate = clk_get_rate(dss.dpll4_m4_ck);
248
246
seq_printf(s, "- DSS -\n");
250
seq_printf(s, "dpll4_ck %lu\n", dpll4_ck_rate);
252
if (cpu_is_omap3630() || cpu_is_omap44xx())
253
seq_printf(s, "%s (%s) = %lu / %lu = %lu\n",
254
dss_get_generic_clk_source_name(DSS_CLK_SRC_FCK),
255
dss_feat_get_clk_source_name(DSS_CLK_SRC_FCK),
257
dpll4_ck_rate / dpll4_m4_ck_rate,
258
dss_clk_get_rate(DSS_CLK_FCK));
260
seq_printf(s, "%s (%s) = %lu / %lu * 2 = %lu\n",
261
dss_get_generic_clk_source_name(DSS_CLK_SRC_FCK),
262
dss_feat_get_clk_source_name(DSS_CLK_SRC_FCK),
264
dpll4_ck_rate / dpll4_m4_ck_rate,
265
dss_clk_get_rate(DSS_CLK_FCK));
248
fclk_name = dss_get_generic_clk_source_name(OMAP_DSS_CLK_SRC_FCK);
249
fclk_real_name = dss_feat_get_clk_source_name(OMAP_DSS_CLK_SRC_FCK);
250
fclk_rate = dss_clk_get_rate(DSS_CLK_FCK);
252
if (dss.dpll4_m4_ck) {
253
dpll4_ck_rate = clk_get_rate(clk_get_parent(dss.dpll4_m4_ck));
254
dpll4_m4_ck_rate = clk_get_rate(dss.dpll4_m4_ck);
256
seq_printf(s, "dpll4_ck %lu\n", dpll4_ck_rate);
258
if (cpu_is_omap3630() || cpu_is_omap44xx())
259
seq_printf(s, "%s (%s) = %lu / %lu = %lu\n",
260
fclk_name, fclk_real_name,
262
dpll4_ck_rate / dpll4_m4_ck_rate,
265
seq_printf(s, "%s (%s) = %lu / %lu * 2 = %lu\n",
266
fclk_name, fclk_real_name,
268
dpll4_ck_rate / dpll4_m4_ck_rate,
271
seq_printf(s, "%s (%s) = %lu\n",
272
fclk_name, fclk_real_name,
267
276
dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK);
293
void dss_select_dispc_clk_source(enum dss_clk_source clk_src)
301
void dss_select_dispc_clk_source(enum omap_dss_clk_source clk_src)
303
struct platform_device *dsidev;
298
307
switch (clk_src) {
299
case DSS_CLK_SRC_FCK:
308
case OMAP_DSS_CLK_SRC_FCK:
302
case DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC:
311
case OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC:
304
dsi_wait_pll_hsdiv_dispc_active();
313
dsidev = dsi_get_dsidev_from_id(0);
314
dsi_wait_pll_hsdiv_dispc_active(dsidev);
316
case OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC:
318
dsidev = dsi_get_dsidev_from_id(1);
319
dsi_wait_pll_hsdiv_dispc_active(dsidev);
314
329
dss.dispc_clk_source = clk_src;
317
void dss_select_dsi_clk_source(enum dss_clk_source clk_src)
332
void dss_select_dsi_clk_source(int dsi_module,
333
enum omap_dss_clk_source clk_src)
335
struct platform_device *dsidev;
321
338
switch (clk_src) {
322
case DSS_CLK_SRC_FCK:
339
case OMAP_DSS_CLK_SRC_FCK:
325
case DSS_CLK_SRC_DSI_PLL_HSDIV_DSI:
327
dsi_wait_pll_hsdiv_dsi_active();
342
case OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DSI:
343
BUG_ON(dsi_module != 0);
345
dsidev = dsi_get_dsidev_from_id(0);
346
dsi_wait_pll_hsdiv_dsi_active(dsidev);
348
case OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DSI:
349
BUG_ON(dsi_module != 1);
351
dsidev = dsi_get_dsidev_from_id(1);
352
dsi_wait_pll_hsdiv_dsi_active(dsidev);
333
358
REG_FLD_MOD(DSS_CONTROL, b, 1, 1); /* DSI_CLK_SWITCH */
335
dss.dsi_clk_source = clk_src;
360
dss.dsi_clk_source[dsi_module] = clk_src;
338
363
void dss_select_lcd_clk_source(enum omap_channel channel,
339
enum dss_clk_source clk_src)
364
enum omap_dss_clk_source clk_src)
366
struct platform_device *dsidev;
343
369
if (!dss_has_feature(FEAT_LCD_CLK_SRC))
346
372
switch (clk_src) {
347
case DSS_CLK_SRC_FCK:
373
case OMAP_DSS_CLK_SRC_FCK:
350
case DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC:
376
case OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC:
351
377
BUG_ON(channel != OMAP_DSS_CHANNEL_LCD);
353
dsi_wait_pll_hsdiv_dispc_active();
379
dsidev = dsi_get_dsidev_from_id(0);
380
dsi_wait_pll_hsdiv_dispc_active(dsidev);
382
case OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC:
383
BUG_ON(channel != OMAP_DSS_CHANNEL_LCD2);
385
dsidev = dsi_get_dsidev_from_id(1);
386
dsi_wait_pll_hsdiv_dispc_active(dsidev);
363
396
dss.lcd_clk_source[ix] = clk_src;
366
enum dss_clk_source dss_get_dispc_clk_source(void)
399
enum omap_dss_clk_source dss_get_dispc_clk_source(void)
368
401
return dss.dispc_clk_source;
371
enum dss_clk_source dss_get_dsi_clk_source(void)
404
enum omap_dss_clk_source dss_get_dsi_clk_source(int dsi_module)
373
return dss.dsi_clk_source;
406
return dss.dsi_clk_source[dsi_module];
376
enum dss_clk_source dss_get_lcd_clk_source(enum omap_channel channel)
409
enum omap_dss_clk_source dss_get_lcd_clk_source(enum omap_channel channel)
378
int ix = channel == OMAP_DSS_CHANNEL_LCD ? 0 : 1;
379
return dss.lcd_clk_source[ix];
411
if (dss_has_feature(FEAT_LCD_CLK_SRC)) {
412
int ix = channel == OMAP_DSS_CHANNEL_LCD ? 0 : 1;
413
return dss.lcd_clk_source[ix];
415
/* LCD_CLK source is the same as DISPC_FCLK source for
417
return dss.dispc_clk_source;
382
421
/* calculate clock rates using dividers in cinfo */
383
422
int dss_calc_clock_rates(struct dss_clock_info *cinfo)
386
u16 fck_div_max = 16;
388
if (cpu_is_omap3630() || cpu_is_omap44xx())
391
if ((cinfo->fck_div > fck_div_max) || cinfo->fck_div == 0)
394
prate = clk_get_rate(clk_get_parent(dss.dpll4_m4_ck));
396
cinfo->fck = prate / cinfo->fck_div;
424
if (dss.dpll4_m4_ck) {
426
u16 fck_div_max = 16;
428
if (cpu_is_omap3630() || cpu_is_omap44xx())
431
if (cinfo->fck_div > fck_div_max || cinfo->fck_div == 0)
434
prate = clk_get_rate(clk_get_parent(dss.dpll4_m4_ck));
436
cinfo->fck = prate / cinfo->fck_div;
438
if (cinfo->fck_div != 0)
440
cinfo->fck = dss_clk_get_rate(DSS_CLK_FCK);
401
446
int dss_set_clock_div(struct dss_clock_info *cinfo)
448
if (dss.dpll4_m4_ck) {
406
if (cpu_is_omap34xx() || cpu_is_omap44xx()) {
407
452
prate = clk_get_rate(clk_get_parent(dss.dpll4_m4_ck));
408
453
DSSDBG("dpll4_m4 = %ld\n", prate);
410
455
r = clk_set_rate(dss.dpll4_m4_ck, prate / cinfo->fck_div);
459
if (cinfo->fck_div != 0)
415
463
DSSDBG("fck = %ld (%d)\n", cinfo->fck, cinfo->fck_div);
640
688
* the kernel resets it */
641
689
omap_writel(omap_readl(0x48050440) & ~0x3, 0x48050440);
691
#ifdef CONFIG_OMAP2_DSS_SLEEP_BEFORE_RESET
643
692
/* We need to wait here a bit, otherwise we sometimes start to
644
693
* get synclost errors, and after that only power cycle will
645
694
* restore DSS functionality. I have no idea why this happens.
646
695
* And we have to wait _before_ resetting the DSS, but after
647
696
* enabling clocks.
698
* This bug was at least present on OMAP3430. It's unknown
699
* if it happens on OMAP2 or OMAP3630.
651
704
_omap_dss_reset();
661
714
REG_FLD_MOD(DSS_CONTROL, 1, 3, 3); /* venc clock 4x enable */
662
715
REG_FLD_MOD(DSS_CONTROL, 0, 2, 2); /* venc clock mode = normal */
665
717
if (cpu_is_omap34xx()) {
666
dss.dpll4_m4_ck = clk_get(NULL, "dpll4_m4_ck");
667
if (IS_ERR(dss.dpll4_m4_ck)) {
718
dpll4_m4_ck = clk_get(NULL, "dpll4_m4_ck");
719
if (IS_ERR(dpll4_m4_ck)) {
668
720
DSSERR("Failed to get dpll4_m4_ck\n");
669
r = PTR_ERR(dss.dpll4_m4_ck);
721
r = PTR_ERR(dpll4_m4_ck);
672
724
} else if (cpu_is_omap44xx()) {
673
dss.dpll4_m4_ck = clk_get(NULL, "dpll_per_m5x2_ck");
674
if (IS_ERR(dss.dpll4_m4_ck)) {
725
dpll4_m4_ck = clk_get(NULL, "dpll_per_m5x2_ck");
726
if (IS_ERR(dpll4_m4_ck)) {
675
727
DSSERR("Failed to get dpll4_m4_ck\n");
676
r = PTR_ERR(dss.dpll4_m4_ck);
728
r = PTR_ERR(dpll4_m4_ck);
731
} else { /* omap24xx */
681
dss.dsi_clk_source = DSS_CLK_SRC_FCK;
682
dss.dispc_clk_source = DSS_CLK_SRC_FCK;
683
dss.lcd_clk_source[0] = DSS_CLK_SRC_FCK;
684
dss.lcd_clk_source[1] = DSS_CLK_SRC_FCK;
735
dss.dpll4_m4_ck = dpll4_m4_ck;
737
dss.dsi_clk_source[0] = OMAP_DSS_CLK_SRC_FCK;
738
dss.dsi_clk_source[1] = OMAP_DSS_CLK_SRC_FCK;
739
dss.dispc_clk_source = OMAP_DSS_CLK_SRC_FCK;
740
dss.lcd_clk_source[0] = OMAP_DSS_CLK_SRC_FCK;
741
dss.lcd_clk_source[1] = OMAP_DSS_CLK_SRC_FCK;
686
743
dss_save_context();