diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2012-03-15 08:18:17 -0400 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2012-07-18 20:05:22 -0400 |
commit | 239921ec1d969e904676f444a92e6d68a928d98c (patch) | |
tree | 44b8fbf6a560ed526d926c40fec48043d469ff46 /drivers/video/sh_mobile_meram.c | |
parent | 6e729b416b44296f5ed503b40ac58c2bffb43caf (diff) |
sh_mobile_meram: Add direct MERAM allocation API
The API can be used to allocate and free MERAM blocks directly, without
going through ICBs.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'drivers/video/sh_mobile_meram.c')
-rw-r--r-- | drivers/video/sh_mobile_meram.c | 41 |
1 files changed, 37 insertions, 4 deletions
diff --git a/drivers/video/sh_mobile_meram.c b/drivers/video/sh_mobile_meram.c index fdb6fc1decb0..7a0ba8bb3fbe 100644 --- a/drivers/video/sh_mobile_meram.c +++ b/drivers/video/sh_mobile_meram.c | |||
@@ -195,6 +195,21 @@ static inline unsigned long meram_read_reg(void __iomem *base, unsigned int off) | |||
195 | } | 195 | } |
196 | 196 | ||
197 | /* ----------------------------------------------------------------------------- | 197 | /* ----------------------------------------------------------------------------- |
198 | * MERAM allocation and free | ||
199 | */ | ||
200 | |||
201 | static unsigned long meram_alloc(struct sh_mobile_meram_priv *priv, size_t size) | ||
202 | { | ||
203 | return gen_pool_alloc(priv->pool, size); | ||
204 | } | ||
205 | |||
206 | static void meram_free(struct sh_mobile_meram_priv *priv, unsigned long mem, | ||
207 | size_t size) | ||
208 | { | ||
209 | gen_pool_free(priv->pool, mem, size); | ||
210 | } | ||
211 | |||
212 | /* ----------------------------------------------------------------------------- | ||
198 | * LCDC cache planes allocation, init, cleanup and free | 213 | * LCDC cache planes allocation, init, cleanup and free |
199 | */ | 214 | */ |
200 | 215 | ||
@@ -216,7 +231,7 @@ static int meram_plane_alloc(struct sh_mobile_meram_priv *priv, | |||
216 | return -ENOMEM; | 231 | return -ENOMEM; |
217 | plane->marker = &priv->icbs[idx]; | 232 | plane->marker = &priv->icbs[idx]; |
218 | 233 | ||
219 | mem = gen_pool_alloc(priv->pool, size * 1024); | 234 | mem = meram_alloc(priv, size * 1024); |
220 | if (mem == 0) | 235 | if (mem == 0) |
221 | return -ENOMEM; | 236 | return -ENOMEM; |
222 | 237 | ||
@@ -233,8 +248,8 @@ static int meram_plane_alloc(struct sh_mobile_meram_priv *priv, | |||
233 | static void meram_plane_free(struct sh_mobile_meram_priv *priv, | 248 | static void meram_plane_free(struct sh_mobile_meram_priv *priv, |
234 | struct sh_mobile_meram_fb_plane *plane) | 249 | struct sh_mobile_meram_fb_plane *plane) |
235 | { | 250 | { |
236 | gen_pool_free(priv->pool, priv->meram + plane->marker->offset, | 251 | meram_free(priv, priv->meram + plane->marker->offset, |
237 | plane->marker->size * 1024); | 252 | plane->marker->size * 1024); |
238 | 253 | ||
239 | __clear_bit(plane->marker->index, &priv->used_icb); | 254 | __clear_bit(plane->marker->index, &priv->used_icb); |
240 | __clear_bit(plane->cache->index, &priv->used_icb); | 255 | __clear_bit(plane->cache->index, &priv->used_icb); |
@@ -386,9 +401,27 @@ static void meram_plane_cleanup(struct sh_mobile_meram_priv *priv, | |||
386 | } | 401 | } |
387 | 402 | ||
388 | /* ----------------------------------------------------------------------------- | 403 | /* ----------------------------------------------------------------------------- |
389 | * LCDC cache operations | 404 | * MERAM operations |
390 | */ | 405 | */ |
391 | 406 | ||
407 | unsigned long sh_mobile_meram_alloc(struct sh_mobile_meram_info *pdata, | ||
408 | size_t size) | ||
409 | { | ||
410 | struct sh_mobile_meram_priv *priv = pdata->priv; | ||
411 | |||
412 | return meram_alloc(priv, size); | ||
413 | } | ||
414 | EXPORT_SYMBOL_GPL(sh_mobile_meram_alloc); | ||
415 | |||
416 | void sh_mobile_meram_free(struct sh_mobile_meram_info *pdata, unsigned long mem, | ||
417 | size_t size) | ||
418 | { | ||
419 | struct sh_mobile_meram_priv *priv = pdata->priv; | ||
420 | |||
421 | meram_free(priv, mem, size); | ||
422 | } | ||
423 | EXPORT_SYMBOL_GPL(sh_mobile_meram_free); | ||
424 | |||
392 | /* Allocate memory for the ICBs and mark them as used. */ | 425 | /* Allocate memory for the ICBs and mark them as used. */ |
393 | static struct sh_mobile_meram_fb_cache * | 426 | static struct sh_mobile_meram_fb_cache * |
394 | meram_cache_alloc(struct sh_mobile_meram_priv *priv, | 427 | meram_cache_alloc(struct sh_mobile_meram_priv *priv, |