diff options
-rw-r--r-- | drivers/video/sh_mobile_meram.c | 97 |
1 files changed, 71 insertions, 26 deletions
diff --git a/drivers/video/sh_mobile_meram.c b/drivers/video/sh_mobile_meram.c index 39f28a1aa074..85577cf9ff58 100644 --- a/drivers/video/sh_mobile_meram.c +++ b/drivers/video/sh_mobile_meram.c | |||
@@ -20,22 +20,67 @@ | |||
20 | #include "sh_mobile_meram.h" | 20 | #include "sh_mobile_meram.h" |
21 | 21 | ||
22 | /* meram registers */ | 22 | /* meram registers */ |
23 | #define MExxCTL 0x0 | 23 | #define MEVCR1 0x4 |
24 | #define MExxBSIZE 0x4 | 24 | #define MEVCR1_RST (1 << 31) |
25 | #define MExxMNCF 0x8 | 25 | #define MEVCR1_WD (1 << 30) |
26 | #define MExxSARA 0x10 | 26 | #define MEVCR1_AMD1 (1 << 29) |
27 | #define MExxSARB 0x14 | 27 | #define MEVCR1_AMD0 (1 << 28) |
28 | #define MExxSBSIZE 0x18 | 28 | #define MEQSEL1 0x40 |
29 | 29 | #define MEQSEL2 0x44 | |
30 | #define MERAM_MExxCTL_VAL(ctl, next_icb, addr) \ | 30 | |
31 | ((ctl) | (((next_icb) & 0x1f) << 11) | (((addr) & 0x7ff) << 16)) | 31 | #define MExxCTL 0x400 |
32 | #define MERAM_MExxBSIZE_VAL(a, b, c) \ | 32 | #define MExxCTL_BV (1 << 31) |
33 | (((a) << 28) | ((b) << 16) | (c)) | 33 | #define MExxCTL_BSZ_SHIFT 28 |
34 | 34 | #define MExxCTL_MSAR_MASK (0x7ff << MExxCTL_MSAR_SHIFT) | |
35 | #define MEVCR1 0x4 | 35 | #define MExxCTL_MSAR_SHIFT 16 |
36 | #define MEACTS 0x10 | 36 | #define MExxCTL_NXT_MASK (0x1f << MExxCTL_NXT_SHIFT) |
37 | #define MEQSEL1 0x40 | 37 | #define MExxCTL_NXT_SHIFT 11 |
38 | #define MEQSEL2 0x44 | 38 | #define MExxCTL_WD1 (1 << 10) |
39 | #define MExxCTL_WD0 (1 << 9) | ||
40 | #define MExxCTL_WS (1 << 8) | ||
41 | #define MExxCTL_CB (1 << 7) | ||
42 | #define MExxCTL_WBF (1 << 6) | ||
43 | #define MExxCTL_WF (1 << 5) | ||
44 | #define MExxCTL_RF (1 << 4) | ||
45 | #define MExxCTL_CM (1 << 3) | ||
46 | #define MExxCTL_MD_READ (1 << 0) | ||
47 | #define MExxCTL_MD_WRITE (2 << 0) | ||
48 | #define MExxCTL_MD_ICB_WB (3 << 0) | ||
49 | #define MExxCTL_MD_ICB (4 << 0) | ||
50 | #define MExxCTL_MD_FB (7 << 0) | ||
51 | #define MExxCTL_MD_MASK (7 << 0) | ||
52 | #define MExxBSIZE 0x404 | ||
53 | #define MExxBSIZE_RCNT_SHIFT 28 | ||
54 | #define MExxBSIZE_YSZM1_SHIFT 16 | ||
55 | #define MExxBSIZE_XSZM1_SHIFT 0 | ||
56 | #define MExxMNCF 0x408 | ||
57 | #define MExxMNCF_KWBNM_SHIFT 28 | ||
58 | #define MExxMNCF_KRBNM_SHIFT 24 | ||
59 | #define MExxMNCF_BNM_SHIFT 16 | ||
60 | #define MExxMNCF_XBV (1 << 15) | ||
61 | #define MExxMNCF_CPL_YCBCR444 (1 << 12) | ||
62 | #define MExxMNCF_CPL_YCBCR420 (2 << 12) | ||
63 | #define MExxMNCF_CPL_YCBCR422 (3 << 12) | ||
64 | #define MExxMNCF_CPL_MSK (3 << 12) | ||
65 | #define MExxMNCF_BL (1 << 2) | ||
66 | #define MExxMNCF_LNM_SHIFT 0 | ||
67 | #define MExxSARA 0x410 | ||
68 | #define MExxSARB 0x414 | ||
69 | #define MExxSBSIZE 0x418 | ||
70 | #define MExxSBSIZE_HDV (1 << 31) | ||
71 | #define MExxSBSIZE_HSZ16 (0 << 28) | ||
72 | #define MExxSBSIZE_HSZ32 (1 << 28) | ||
73 | #define MExxSBSIZE_HSZ64 (2 << 28) | ||
74 | #define MExxSBSIZE_HSZ128 (3 << 28) | ||
75 | #define MExxSBSIZE_SBSIZZ_SHIFT 0 | ||
76 | |||
77 | #define MERAM_MExxCTL_VAL(next, addr) \ | ||
78 | ((((next) << MExxCTL_NXT_SHIFT) & MExxCTL_NXT_MASK) | \ | ||
79 | (((addr) << MExxCTL_MSAR_SHIFT) & MExxCTL_MSAR_MASK)) | ||
80 | #define MERAM_MExxBSIZE_VAL(rcnt, yszm1, xszm1) \ | ||
81 | (((rcnt) << MExxBSIZE_RCNT_SHIFT) | \ | ||
82 | ((yszm1) << MExxBSIZE_YSZM1_SHIFT) | \ | ||
83 | ((xszm1) << MExxBSIZE_XSZM1_SHIFT)) | ||
39 | 84 | ||
40 | static unsigned long common_regs[] = { | 85 | static unsigned long common_regs[] = { |
41 | MEVCR1, | 86 | MEVCR1, |
@@ -72,8 +117,7 @@ struct sh_mobile_meram_priv { | |||
72 | * MERAM/ICB access functions | 117 | * MERAM/ICB access functions |
73 | */ | 118 | */ |
74 | 119 | ||
75 | #define MERAM_ICB_OFFSET(base, idx, off) \ | 120 | #define MERAM_ICB_OFFSET(base, idx, off) ((base) + (off) + (idx) * 0x20) |
76 | ((base) + (0x400 + ((idx) * 0x20) + (off))) | ||
77 | 121 | ||
78 | static inline void meram_write_icb(void __iomem *base, int idx, int off, | 122 | static inline void meram_write_icb(void __iomem *base, int idx, int off, |
79 | unsigned long val) | 123 | unsigned long val) |
@@ -308,17 +352,18 @@ static int meram_init(struct sh_mobile_meram_priv *priv, | |||
308 | /* | 352 | /* |
309 | * Set MERAM for framebuffer | 353 | * Set MERAM for framebuffer |
310 | * | 354 | * |
311 | * 0x70f: WD = 0x3, WS=0x1, CM=0x1, MD=FB mode | ||
312 | * we also chain the cache_icb and the marker_icb. | 355 | * we also chain the cache_icb and the marker_icb. |
313 | * we also split the allocated MERAM buffer between two ICBs. | 356 | * we also split the allocated MERAM buffer between two ICBs. |
314 | */ | 357 | */ |
315 | meram_write_icb(priv->base, icb->cache_icb, MExxCTL, | 358 | meram_write_icb(priv->base, icb->cache_icb, MExxCTL, |
316 | MERAM_MExxCTL_VAL(0x70f, icb->marker_icb, | 359 | MERAM_MExxCTL_VAL(icb->marker_icb, icb->meram_offset) | |
317 | icb->meram_offset)); | 360 | MExxCTL_WD1 | MExxCTL_WD0 | MExxCTL_WS | MExxCTL_CM | |
361 | MExxCTL_MD_FB); | ||
318 | meram_write_icb(priv->base, icb->marker_icb, MExxCTL, | 362 | meram_write_icb(priv->base, icb->marker_icb, MExxCTL, |
319 | MERAM_MExxCTL_VAL(0x70f, icb->cache_icb, | 363 | MERAM_MExxCTL_VAL(icb->cache_icb, icb->meram_offset + |
320 | icb->meram_offset + | 364 | icb->meram_size / 2) | |
321 | icb->meram_size / 2)); | 365 | MExxCTL_WD1 | MExxCTL_WD0 | MExxCTL_WS | MExxCTL_CM | |
366 | MExxCTL_MD_FB); | ||
322 | 367 | ||
323 | return 0; | 368 | return 0; |
324 | } | 369 | } |
@@ -507,7 +552,7 @@ static int sh_mobile_meram_runtime_suspend(struct device *dev) | |||
507 | /* Reset ICB on resume */ | 552 | /* Reset ICB on resume */ |
508 | if (icb_regs[k] == MExxCTL) | 553 | if (icb_regs[k] == MExxCTL) |
509 | priv->icb_saved_regs[j * ICB_REGS_SIZE + k] = | 554 | priv->icb_saved_regs[j * ICB_REGS_SIZE + k] = |
510 | 0x70; | 555 | MExxCTL_WBF | MExxCTL_WF | MExxCTL_RF; |
511 | } | 556 | } |
512 | } | 557 | } |
513 | return 0; | 558 | return 0; |
@@ -592,7 +637,7 @@ static int __devinit sh_mobile_meram_probe(struct platform_device *pdev) | |||
592 | 637 | ||
593 | /* initialize ICB addressing mode */ | 638 | /* initialize ICB addressing mode */ |
594 | if (pdata->addr_mode == SH_MOBILE_MERAM_MODE1) | 639 | if (pdata->addr_mode == SH_MOBILE_MERAM_MODE1) |
595 | meram_write_reg(priv->base, MEVCR1, 1 << 29); | 640 | meram_write_reg(priv->base, MEVCR1, MEVCR1_AMD1); |
596 | 641 | ||
597 | pm_runtime_enable(&pdev->dev); | 642 | pm_runtime_enable(&pdev->dev); |
598 | 643 | ||