aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/video/sh_mobile_meram.c178
-rw-r--r--include/video/sh_mobile_meram.h12
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 */
111struct 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 */
103struct sh_mobile_meram_priv { 128struct 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
159static inline int meram_check_overlap(struct sh_mobile_meram_priv *priv, 183static 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
191static inline void meram_mark(struct sh_mobile_meram_priv *priv, 218static 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
214static inline void meram_unmark(struct sh_mobile_meram_priv *priv, 237static 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,
244static inline int is_nvcolor(int cspace) 247static 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 */
255static inline void meram_set_next_addr(struct sh_mobile_meram_priv *priv, 258static 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 */
282static inline void meram_get_next_icb_addr(struct sh_mobile_meram_info *pdata, 288static inline void
283 struct sh_mobile_meram_cfg *cfg, 289meram_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
306static int meram_init(struct sh_mobile_meram_priv *priv, 314static 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
376static void meram_deinit(struct sh_mobile_meram_priv *priv, 385static 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
391static int sh_mobile_meram_register(struct sh_mobile_meram_info *pdata, 402static 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
494static int sh_mobile_meram_unregister(struct sh_mobile_meram_info *pdata, 497static 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
519static int sh_mobile_meram_update(struct sh_mobile_meram_info *pdata, 524static 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
37struct sh_mobile_meram_cfg { 35struct 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
43struct module; 39struct 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,