diff options
-rw-r--r-- | drivers/video/sh_mobile_meram.c | 178 | ||||
-rw-r--r-- | include/video/sh_mobile_meram.h | 12 |
2 files changed, 94 insertions, 96 deletions
diff --git a/drivers/video/sh_mobile_meram.c b/drivers/video/sh_mobile_meram.c index 7af2ffe475d4..cddb180f8267 100644 --- a/drivers/video/sh_mobile_meram.c +++ b/drivers/video/sh_mobile_meram.c | |||
@@ -100,14 +100,38 @@ static unsigned long icb_regs[] = { | |||
100 | }; | 100 | }; |
101 | #define ICB_REGS_SIZE ARRAY_SIZE(icb_regs) | 101 | #define ICB_REGS_SIZE ARRAY_SIZE(icb_regs) |
102 | 102 | ||
103 | /* | ||
104 | * sh_mobile_meram_icb - MERAM ICB information | ||
105 | * @regs: Registers cache | ||
106 | * @region: Start and end addresses of the MERAM region | ||
107 | * @cache_unit: Bytes to cache per ICB | ||
108 | * @pixelformat: Video pixel format of the data stored in the ICB | ||
109 | * @current_reg: Which of Start Address Register A (0) or B (1) is in use | ||
110 | */ | ||
111 | struct sh_mobile_meram_icb { | ||
112 | unsigned long regs[ICB_REGS_SIZE]; | ||
113 | |||
114 | unsigned long region; | ||
115 | unsigned int cache_unit; | ||
116 | unsigned int pixelformat; | ||
117 | unsigned int current_reg; | ||
118 | }; | ||
119 | |||
120 | /* | ||
121 | * sh_mobile_meram_priv - MERAM device | ||
122 | * @base: Registers base address | ||
123 | * @regs: Registers cache | ||
124 | * @lock: Protects used_icb and icbs | ||
125 | * @used_icb: Bitmask of used ICBs | ||
126 | * @icbs: ICBs | ||
127 | */ | ||
103 | struct sh_mobile_meram_priv { | 128 | struct sh_mobile_meram_priv { |
104 | void __iomem *base; | 129 | void __iomem *base; |
105 | struct mutex lock; | 130 | unsigned long regs[CMN_REGS_SIZE]; |
106 | unsigned long used_icb; | 131 | |
107 | unsigned int used_meram_cache_regions; | 132 | struct mutex lock; |
108 | unsigned long used_meram_cache[SH_MOBILE_MERAM_ICB_NUM]; | 133 | unsigned long used_icb; |
109 | unsigned long cmn_saved_regs[CMN_REGS_SIZE]; | 134 | struct sh_mobile_meram_icb icbs[SH_MOBILE_MERAM_ICB_NUM]; |
110 | unsigned long icb_saved_regs[ICB_REGS_SIZE * SH_MOBILE_MERAM_ICB_NUM]; | ||
111 | }; | 135 | }; |
112 | 136 | ||
113 | /* settings */ | 137 | /* settings */ |
@@ -157,7 +181,7 @@ static inline unsigned long meram_read_reg(void __iomem *base, unsigned int off) | |||
157 | */ | 181 | */ |
158 | 182 | ||
159 | static inline int meram_check_overlap(struct sh_mobile_meram_priv *priv, | 183 | static inline int meram_check_overlap(struct sh_mobile_meram_priv *priv, |
160 | struct sh_mobile_meram_icb_cfg *new) | 184 | const struct sh_mobile_meram_icb_cfg *new) |
161 | { | 185 | { |
162 | unsigned int used_start, used_end, meram_start, meram_end; | 186 | unsigned int used_start, used_end, meram_start, meram_end; |
163 | unsigned int i; | 187 | unsigned int i; |
@@ -167,17 +191,20 @@ static inline int meram_check_overlap(struct sh_mobile_meram_priv *priv, | |||
167 | return 1; | 191 | return 1; |
168 | 192 | ||
169 | if (test_bit(new->marker_icb, &priv->used_icb) || | 193 | if (test_bit(new->marker_icb, &priv->used_icb) || |
170 | test_bit(new->cache_icb, &priv->used_icb)) | 194 | test_bit(new->cache_icb, &priv->used_icb)) |
171 | return 1; | 195 | return 1; |
172 | 196 | ||
173 | for (i = 0; i < priv->used_meram_cache_regions; i++) { | 197 | for (i = 0; i < SH_MOBILE_MERAM_ICB_NUM; i++) { |
174 | used_start = MERAM_CACHE_START(priv->used_meram_cache[i]); | 198 | if (!test_bit(i, &priv->used_icb)) |
175 | used_end = MERAM_CACHE_END(priv->used_meram_cache[i]); | 199 | continue; |
200 | |||
201 | used_start = MERAM_CACHE_START(priv->icbs[i].region); | ||
202 | used_end = MERAM_CACHE_END(priv->icbs[i].region); | ||
176 | meram_start = new->meram_offset; | 203 | meram_start = new->meram_offset; |
177 | meram_end = new->meram_offset + new->meram_size; | 204 | meram_end = new->meram_offset + new->meram_size; |
178 | 205 | ||
179 | if ((meram_start >= used_start && meram_start < used_end) || | 206 | if ((meram_start >= used_start && meram_start < used_end) || |
180 | (meram_end > used_start && meram_end < used_end)) | 207 | (meram_end > used_start && meram_end < used_end)) |
181 | return 1; | 208 | return 1; |
182 | } | 209 | } |
183 | 210 | ||
@@ -189,22 +216,18 @@ static inline int meram_check_overlap(struct sh_mobile_meram_priv *priv, | |||
189 | */ | 216 | */ |
190 | 217 | ||
191 | static inline void meram_mark(struct sh_mobile_meram_priv *priv, | 218 | static inline void meram_mark(struct sh_mobile_meram_priv *priv, |
192 | struct sh_mobile_meram_icb_cfg *new) | 219 | const struct sh_mobile_meram_icb_cfg *new, |
220 | int pixelformat) | ||
193 | { | 221 | { |
194 | unsigned int n; | ||
195 | |||
196 | if (new->marker_icb < 0 || new->cache_icb < 0) | ||
197 | return; | ||
198 | |||
199 | __set_bit(new->marker_icb, &priv->used_icb); | 222 | __set_bit(new->marker_icb, &priv->used_icb); |
200 | __set_bit(new->cache_icb, &priv->used_icb); | 223 | __set_bit(new->cache_icb, &priv->used_icb); |
201 | 224 | ||
202 | n = priv->used_meram_cache_regions; | 225 | priv->icbs[new->marker_icb].region = MERAM_CACHE_SET(new->meram_offset, |
203 | 226 | new->meram_size); | |
204 | priv->used_meram_cache[n] = MERAM_CACHE_SET(new->meram_offset, | 227 | priv->icbs[new->cache_icb].region = MERAM_CACHE_SET(new->meram_offset, |
205 | new->meram_size); | 228 | new->meram_size); |
206 | 229 | priv->icbs[new->marker_icb].current_reg = 1; | |
207 | priv->used_meram_cache_regions++; | 230 | priv->icbs[new->marker_icb].pixelformat = pixelformat; |
208 | } | 231 | } |
209 | 232 | ||
210 | /* | 233 | /* |
@@ -212,30 +235,10 @@ static inline void meram_mark(struct sh_mobile_meram_priv *priv, | |||
212 | */ | 235 | */ |
213 | 236 | ||
214 | static inline void meram_unmark(struct sh_mobile_meram_priv *priv, | 237 | static inline void meram_unmark(struct sh_mobile_meram_priv *priv, |
215 | struct sh_mobile_meram_icb_cfg *icb) | 238 | const struct sh_mobile_meram_icb_cfg *icb) |
216 | { | 239 | { |
217 | unsigned long pattern; | ||
218 | unsigned int i; | ||
219 | |||
220 | if (icb->marker_icb < 0 || icb->cache_icb < 0) | ||
221 | return; | ||
222 | |||
223 | __clear_bit(icb->marker_icb, &priv->used_icb); | 240 | __clear_bit(icb->marker_icb, &priv->used_icb); |
224 | __clear_bit(icb->cache_icb, &priv->used_icb); | 241 | __clear_bit(icb->cache_icb, &priv->used_icb); |
225 | |||
226 | pattern = MERAM_CACHE_SET(icb->meram_offset, icb->meram_size); | ||
227 | for (i = 0; i < priv->used_meram_cache_regions; i++) { | ||
228 | if (priv->used_meram_cache[i] == pattern) { | ||
229 | while (i < priv->used_meram_cache_regions - 1) { | ||
230 | priv->used_meram_cache[i] = | ||
231 | priv->used_meram_cache[i + 1] ; | ||
232 | i++; | ||
233 | } | ||
234 | priv->used_meram_cache[i] = 0; | ||
235 | priv->used_meram_cache_regions--; | ||
236 | break; | ||
237 | } | ||
238 | } | ||
239 | } | 242 | } |
240 | 243 | ||
241 | /* | 244 | /* |
@@ -244,7 +247,7 @@ static inline void meram_unmark(struct sh_mobile_meram_priv *priv, | |||
244 | static inline int is_nvcolor(int cspace) | 247 | static inline int is_nvcolor(int cspace) |
245 | { | 248 | { |
246 | if (cspace == SH_MOBILE_MERAM_PF_NV || | 249 | if (cspace == SH_MOBILE_MERAM_PF_NV || |
247 | cspace == SH_MOBILE_MERAM_PF_NV24) | 250 | cspace == SH_MOBILE_MERAM_PF_NV24) |
248 | return 1; | 251 | return 1; |
249 | return 0; | 252 | return 0; |
250 | } | 253 | } |
@@ -253,46 +256,51 @@ static inline int is_nvcolor(int cspace) | |||
253 | * set the next address to fetch | 256 | * set the next address to fetch |
254 | */ | 257 | */ |
255 | static inline void meram_set_next_addr(struct sh_mobile_meram_priv *priv, | 258 | static inline void meram_set_next_addr(struct sh_mobile_meram_priv *priv, |
256 | struct sh_mobile_meram_cfg *cfg, | 259 | const struct sh_mobile_meram_cfg *cfg, |
257 | unsigned long base_addr_y, | 260 | unsigned long base_addr_y, |
258 | unsigned long base_addr_c) | 261 | unsigned long base_addr_c) |
259 | { | 262 | { |
263 | struct sh_mobile_meram_icb *icb = &priv->icbs[cfg->icb[0].marker_icb]; | ||
260 | unsigned long target; | 264 | unsigned long target; |
261 | 265 | ||
262 | cfg->current_reg ^= 1; | 266 | icb->current_reg ^= 1; |
263 | target = cfg->current_reg ? MExxSARB : MExxSARA; | 267 | target = icb->current_reg ? MExxSARB : MExxSARA; |
264 | 268 | ||
265 | /* set the next address to fetch */ | 269 | /* set the next address to fetch */ |
266 | meram_write_icb(priv->base, cfg->icb[0].cache_icb, target, | 270 | meram_write_icb(priv->base, cfg->icb[0].cache_icb, target, |
267 | base_addr_y); | 271 | base_addr_y); |
268 | meram_write_icb(priv->base, cfg->icb[0].marker_icb, target, | 272 | meram_write_icb(priv->base, cfg->icb[0].marker_icb, target, |
269 | base_addr_y + cfg->icb[0].cache_unit); | 273 | base_addr_y + |
274 | priv->icbs[cfg->icb[0].marker_icb].cache_unit); | ||
270 | 275 | ||
271 | if (is_nvcolor(cfg->pixelformat)) { | 276 | if (is_nvcolor(icb->pixelformat)) { |
272 | meram_write_icb(priv->base, cfg->icb[1].cache_icb, target, | 277 | meram_write_icb(priv->base, cfg->icb[1].cache_icb, target, |
273 | base_addr_c); | 278 | base_addr_c); |
274 | meram_write_icb(priv->base, cfg->icb[1].marker_icb, target, | 279 | meram_write_icb(priv->base, cfg->icb[1].marker_icb, target, |
275 | base_addr_c + cfg->icb[1].cache_unit); | 280 | base_addr_c + |
281 | priv->icbs[cfg->icb[1].marker_icb].cache_unit); | ||
276 | } | 282 | } |
277 | } | 283 | } |
278 | 284 | ||
279 | /* | 285 | /* |
280 | * get the next ICB address | 286 | * get the next ICB address |
281 | */ | 287 | */ |
282 | static inline void meram_get_next_icb_addr(struct sh_mobile_meram_info *pdata, | 288 | static inline void |
283 | struct sh_mobile_meram_cfg *cfg, | 289 | meram_get_next_icb_addr(struct sh_mobile_meram_info *pdata, |
284 | unsigned long *icb_addr_y, | 290 | const struct sh_mobile_meram_cfg *cfg, |
285 | unsigned long *icb_addr_c) | 291 | unsigned long *icb_addr_y, unsigned long *icb_addr_c) |
286 | { | 292 | { |
293 | struct sh_mobile_meram_priv *priv = pdata->priv; | ||
294 | struct sh_mobile_meram_icb *icb = &priv->icbs[cfg->icb[0].marker_icb]; | ||
287 | unsigned long icb_offset; | 295 | unsigned long icb_offset; |
288 | 296 | ||
289 | if (pdata->addr_mode == SH_MOBILE_MERAM_MODE0) | 297 | if (pdata->addr_mode == SH_MOBILE_MERAM_MODE0) |
290 | icb_offset = 0x80000000 | (cfg->current_reg << 29); | 298 | icb_offset = 0x80000000 | (icb->current_reg << 29); |
291 | else | 299 | else |
292 | icb_offset = 0xc0000000 | (cfg->current_reg << 23); | 300 | icb_offset = 0xc0000000 | (icb->current_reg << 23); |
293 | 301 | ||
294 | *icb_addr_y = icb_offset | (cfg->icb[0].marker_icb << 24); | 302 | *icb_addr_y = icb_offset | (cfg->icb[0].marker_icb << 24); |
295 | if (is_nvcolor(cfg->pixelformat)) | 303 | if (is_nvcolor(icb->pixelformat)) |
296 | *icb_addr_c = icb_offset | (cfg->icb[1].marker_icb << 24); | 304 | *icb_addr_c = icb_offset | (cfg->icb[1].marker_icb << 24); |
297 | } | 305 | } |
298 | 306 | ||
@@ -304,7 +312,7 @@ static inline void meram_get_next_icb_addr(struct sh_mobile_meram_info *pdata, | |||
304 | */ | 312 | */ |
305 | 313 | ||
306 | static int meram_init(struct sh_mobile_meram_priv *priv, | 314 | static int meram_init(struct sh_mobile_meram_priv *priv, |
307 | struct sh_mobile_meram_icb_cfg *icb, | 315 | const struct sh_mobile_meram_icb_cfg *icb, |
308 | unsigned int xres, unsigned int yres, | 316 | unsigned int xres, unsigned int yres, |
309 | unsigned int *out_pitch) | 317 | unsigned int *out_pitch) |
310 | { | 318 | { |
@@ -352,7 +360,8 @@ static int meram_init(struct sh_mobile_meram_priv *priv, | |||
352 | meram_write_icb(priv->base, icb->marker_icb, MExxSBSIZE, xpitch); | 360 | meram_write_icb(priv->base, icb->marker_icb, MExxSBSIZE, xpitch); |
353 | 361 | ||
354 | /* save a cache unit size */ | 362 | /* save a cache unit size */ |
355 | icb->cache_unit = xres * save_lines; | 363 | priv->icbs[icb->cache_icb].cache_unit = xres * save_lines; |
364 | priv->icbs[icb->marker_icb].cache_unit = xres * save_lines; | ||
356 | 365 | ||
357 | /* | 366 | /* |
358 | * Set MERAM for framebuffer | 367 | * Set MERAM for framebuffer |
@@ -374,14 +383,16 @@ static int meram_init(struct sh_mobile_meram_priv *priv, | |||
374 | } | 383 | } |
375 | 384 | ||
376 | static void meram_deinit(struct sh_mobile_meram_priv *priv, | 385 | static void meram_deinit(struct sh_mobile_meram_priv *priv, |
377 | struct sh_mobile_meram_icb_cfg *icb) | 386 | const struct sh_mobile_meram_icb_cfg *icb) |
378 | { | 387 | { |
379 | /* disable ICB */ | 388 | /* disable ICB */ |
380 | meram_write_icb(priv->base, icb->cache_icb, MExxCTL, | 389 | meram_write_icb(priv->base, icb->cache_icb, MExxCTL, |
381 | MExxCTL_WBF | MExxCTL_WF | MExxCTL_RF); | 390 | MExxCTL_WBF | MExxCTL_WF | MExxCTL_RF); |
382 | meram_write_icb(priv->base, icb->marker_icb, MExxCTL, | 391 | meram_write_icb(priv->base, icb->marker_icb, MExxCTL, |
383 | MExxCTL_WBF | MExxCTL_WF | MExxCTL_RF); | 392 | MExxCTL_WBF | MExxCTL_WF | MExxCTL_RF); |
384 | icb->cache_unit = 0; | 393 | |
394 | priv->icbs[icb->cache_icb].cache_unit = 0; | ||
395 | priv->icbs[icb->marker_icb].cache_unit = 0; | ||
385 | } | 396 | } |
386 | 397 | ||
387 | /* | 398 | /* |
@@ -389,7 +400,7 @@ static void meram_deinit(struct sh_mobile_meram_priv *priv, | |||
389 | */ | 400 | */ |
390 | 401 | ||
391 | static int sh_mobile_meram_register(struct sh_mobile_meram_info *pdata, | 402 | static int sh_mobile_meram_register(struct sh_mobile_meram_info *pdata, |
392 | struct sh_mobile_meram_cfg *cfg, | 403 | const struct sh_mobile_meram_cfg *cfg, |
393 | unsigned int xres, unsigned int yres, | 404 | unsigned int xres, unsigned int yres, |
394 | unsigned int pixelformat, | 405 | unsigned int pixelformat, |
395 | unsigned long base_addr_y, | 406 | unsigned long base_addr_y, |
@@ -433,12 +444,6 @@ static int sh_mobile_meram_register(struct sh_mobile_meram_info *pdata, | |||
433 | 444 | ||
434 | mutex_lock(&priv->lock); | 445 | mutex_lock(&priv->lock); |
435 | 446 | ||
436 | if (priv->used_meram_cache_regions + 2 > SH_MOBILE_MERAM_ICB_NUM) { | ||
437 | dev_err(&pdev->dev, "no more ICB available."); | ||
438 | error = -EINVAL; | ||
439 | goto err; | ||
440 | } | ||
441 | |||
442 | /* make sure that there's no overlaps */ | 447 | /* make sure that there's no overlaps */ |
443 | if (meram_check_overlap(priv, &cfg->icb[0])) { | 448 | if (meram_check_overlap(priv, &cfg->icb[0])) { |
444 | dev_err(&pdev->dev, "conflicting config detected."); | 449 | dev_err(&pdev->dev, "conflicting config detected."); |
@@ -464,10 +469,9 @@ static int sh_mobile_meram_register(struct sh_mobile_meram_info *pdata, | |||
464 | } | 469 | } |
465 | 470 | ||
466 | /* we now register the ICB */ | 471 | /* we now register the ICB */ |
467 | cfg->pixelformat = pixelformat; | 472 | meram_mark(priv, &cfg->icb[0], pixelformat); |
468 | meram_mark(priv, &cfg->icb[0]); | ||
469 | if (is_nvcolor(pixelformat)) | 473 | if (is_nvcolor(pixelformat)) |
470 | meram_mark(priv, &cfg->icb[1]); | 474 | meram_mark(priv, &cfg->icb[1], pixelformat); |
471 | 475 | ||
472 | /* initialize MERAM */ | 476 | /* initialize MERAM */ |
473 | meram_init(priv, &cfg->icb[0], xres, yres, &out_pitch); | 477 | meram_init(priv, &cfg->icb[0], xres, yres, &out_pitch); |
@@ -479,7 +483,6 @@ static int sh_mobile_meram_register(struct sh_mobile_meram_info *pdata, | |||
479 | meram_init(priv, &cfg->icb[1], 2 * xres, (yres + 1) / 2, | 483 | meram_init(priv, &cfg->icb[1], 2 * xres, (yres + 1) / 2, |
480 | &out_pitch); | 484 | &out_pitch); |
481 | 485 | ||
482 | cfg->current_reg = 1; | ||
483 | meram_set_next_addr(priv, cfg, base_addr_y, base_addr_c); | 486 | meram_set_next_addr(priv, cfg, base_addr_y, base_addr_c); |
484 | meram_get_next_icb_addr(pdata, cfg, icb_addr_y, icb_addr_c); | 487 | meram_get_next_icb_addr(pdata, cfg, icb_addr_y, icb_addr_c); |
485 | 488 | ||
@@ -492,19 +495,21 @@ err: | |||
492 | } | 495 | } |
493 | 496 | ||
494 | static int sh_mobile_meram_unregister(struct sh_mobile_meram_info *pdata, | 497 | static int sh_mobile_meram_unregister(struct sh_mobile_meram_info *pdata, |
495 | struct sh_mobile_meram_cfg *cfg) | 498 | const struct sh_mobile_meram_cfg *cfg) |
496 | { | 499 | { |
497 | struct sh_mobile_meram_priv *priv; | 500 | struct sh_mobile_meram_priv *priv; |
501 | struct sh_mobile_meram_icb *icb; | ||
498 | 502 | ||
499 | if (!pdata || !pdata->priv || !cfg) | 503 | if (!pdata || !pdata->priv || !cfg) |
500 | return -EINVAL; | 504 | return -EINVAL; |
501 | 505 | ||
502 | priv = pdata->priv; | 506 | priv = pdata->priv; |
507 | icb = &priv->icbs[cfg->icb[0].marker_icb]; | ||
503 | 508 | ||
504 | mutex_lock(&priv->lock); | 509 | mutex_lock(&priv->lock); |
505 | 510 | ||
506 | /* deinit & unmark */ | 511 | /* deinit & unmark */ |
507 | if (is_nvcolor(cfg->pixelformat)) { | 512 | if (is_nvcolor(icb->pixelformat)) { |
508 | meram_deinit(priv, &cfg->icb[1]); | 513 | meram_deinit(priv, &cfg->icb[1]); |
509 | meram_unmark(priv, &cfg->icb[1]); | 514 | meram_unmark(priv, &cfg->icb[1]); |
510 | } | 515 | } |
@@ -517,7 +522,7 @@ static int sh_mobile_meram_unregister(struct sh_mobile_meram_info *pdata, | |||
517 | } | 522 | } |
518 | 523 | ||
519 | static int sh_mobile_meram_update(struct sh_mobile_meram_info *pdata, | 524 | static int sh_mobile_meram_update(struct sh_mobile_meram_info *pdata, |
520 | struct sh_mobile_meram_cfg *cfg, | 525 | const struct sh_mobile_meram_cfg *cfg, |
521 | unsigned long base_addr_y, | 526 | unsigned long base_addr_y, |
522 | unsigned long base_addr_c, | 527 | unsigned long base_addr_c, |
523 | unsigned long *icb_addr_y, | 528 | unsigned long *icb_addr_y, |
@@ -547,18 +552,17 @@ static int sh_mobile_meram_runtime_suspend(struct device *dev) | |||
547 | unsigned int i, j; | 552 | unsigned int i, j; |
548 | 553 | ||
549 | for (i = 0; i < CMN_REGS_SIZE; i++) | 554 | for (i = 0; i < CMN_REGS_SIZE; i++) |
550 | priv->cmn_saved_regs[i] = meram_read_reg(priv->base, | 555 | priv->regs[i] = meram_read_reg(priv->base, common_regs[i]); |
551 | common_regs[i]); | ||
552 | 556 | ||
553 | for (i = 0; i < 32; i++) { | 557 | for (i = 0; i < 32; i++) { |
554 | if (!test_bit(i, &priv->used_icb)) | 558 | if (!test_bit(i, &priv->used_icb)) |
555 | continue; | 559 | continue; |
556 | for (j = 0; j < ICB_REGS_SIZE; j++) { | 560 | for (j = 0; j < ICB_REGS_SIZE; j++) { |
557 | priv->icb_saved_regs[i * ICB_REGS_SIZE + j] = | 561 | priv->icbs[i].regs[j] = |
558 | meram_read_icb(priv->base, i, icb_regs[j]); | 562 | meram_read_icb(priv->base, i, icb_regs[j]); |
559 | /* Reset ICB on resume */ | 563 | /* Reset ICB on resume */ |
560 | if (icb_regs[j] == MExxCTL) | 564 | if (icb_regs[j] == MExxCTL) |
561 | priv->icb_saved_regs[i * ICB_REGS_SIZE + j] |= | 565 | priv->icbs[i].regs[j] |= |
562 | MExxCTL_WBF | MExxCTL_WF | MExxCTL_RF; | 566 | MExxCTL_WBF | MExxCTL_WF | MExxCTL_RF; |
563 | } | 567 | } |
564 | } | 568 | } |
@@ -574,15 +578,13 @@ static int sh_mobile_meram_runtime_resume(struct device *dev) | |||
574 | for (i = 0; i < 32; i++) { | 578 | for (i = 0; i < 32; i++) { |
575 | if (!test_bit(i, &priv->used_icb)) | 579 | if (!test_bit(i, &priv->used_icb)) |
576 | continue; | 580 | continue; |
577 | for (j = 0; j < ICB_REGS_SIZE; j++) { | 581 | for (j = 0; j < ICB_REGS_SIZE; j++) |
578 | meram_write_icb(priv->base, i, icb_regs[j], | 582 | meram_write_icb(priv->base, i, icb_regs[j], |
579 | priv->icb_saved_regs[i * ICB_REGS_SIZE + j]); | 583 | priv->icbs[i].regs[j]); |
580 | } | ||
581 | } | 584 | } |
582 | 585 | ||
583 | for (i = 0; i < CMN_REGS_SIZE; i++) | 586 | for (i = 0; i < CMN_REGS_SIZE; i++) |
584 | meram_write_reg(priv->base, common_regs[i], | 587 | meram_write_reg(priv->base, common_regs[i], priv->regs[i]); |
585 | priv->cmn_saved_regs[i]); | ||
586 | return 0; | 588 | return 0; |
587 | } | 589 | } |
588 | 590 | ||
diff --git a/include/video/sh_mobile_meram.h b/include/video/sh_mobile_meram.h index 6755e3f89a36..05ca3f92de10 100644 --- a/include/video/sh_mobile_meram.h +++ b/include/video/sh_mobile_meram.h | |||
@@ -30,14 +30,10 @@ struct sh_mobile_meram_icb_cfg { | |||
30 | unsigned int cache_icb; /* ICB # for Cache ICB */ | 30 | unsigned int cache_icb; /* ICB # for Cache ICB */ |
31 | unsigned int meram_offset; /* MERAM Buffer Offset to use */ | 31 | unsigned int meram_offset; /* MERAM Buffer Offset to use */ |
32 | unsigned int meram_size; /* MERAM Buffer Size to use */ | 32 | unsigned int meram_size; /* MERAM Buffer Size to use */ |
33 | |||
34 | unsigned int cache_unit; /* bytes to cache per ICB */ | ||
35 | }; | 33 | }; |
36 | 34 | ||
37 | struct sh_mobile_meram_cfg { | 35 | struct sh_mobile_meram_cfg { |
38 | struct sh_mobile_meram_icb_cfg icb[2]; | 36 | struct sh_mobile_meram_icb_cfg icb[2]; |
39 | int pixelformat; | ||
40 | int current_reg; | ||
41 | }; | 37 | }; |
42 | 38 | ||
43 | struct module; | 39 | struct module; |
@@ -45,7 +41,7 @@ struct sh_mobile_meram_ops { | |||
45 | struct module *module; | 41 | struct module *module; |
46 | /* register usage of meram */ | 42 | /* register usage of meram */ |
47 | int (*meram_register)(struct sh_mobile_meram_info *meram_dev, | 43 | int (*meram_register)(struct sh_mobile_meram_info *meram_dev, |
48 | struct sh_mobile_meram_cfg *cfg, | 44 | const struct sh_mobile_meram_cfg *cfg, |
49 | unsigned int xres, unsigned int yres, | 45 | unsigned int xres, unsigned int yres, |
50 | unsigned int pixelformat, | 46 | unsigned int pixelformat, |
51 | unsigned long base_addr_y, | 47 | unsigned long base_addr_y, |
@@ -56,11 +52,11 @@ struct sh_mobile_meram_ops { | |||
56 | 52 | ||
57 | /* unregister usage of meram */ | 53 | /* unregister usage of meram */ |
58 | int (*meram_unregister)(struct sh_mobile_meram_info *meram_dev, | 54 | int (*meram_unregister)(struct sh_mobile_meram_info *meram_dev, |
59 | struct sh_mobile_meram_cfg *cfg); | 55 | const struct sh_mobile_meram_cfg *cfg); |
60 | 56 | ||
61 | /* update meram settings */ | 57 | /* update meram settings */ |
62 | int (*meram_update)(struct sh_mobile_meram_info *meram_dev, | 58 | int (*meram_update)(struct sh_mobile_meram_info *meram_dev, |
63 | struct sh_mobile_meram_cfg *cfg, | 59 | const struct sh_mobile_meram_cfg *cfg, |
64 | unsigned long base_addr_y, | 60 | unsigned long base_addr_y, |
65 | unsigned long base_addr_c, | 61 | unsigned long base_addr_c, |
66 | unsigned long *icb_addr_y, | 62 | unsigned long *icb_addr_y, |