Skip to content

Commit

Permalink
sh_mobile_meram: Use direct function calls for the public API
Browse files Browse the repository at this point in the history
There's no reason to use abstract operation pointers to implement the
MERAM API. Replace them by direct function calls.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
  • Loading branch information
Laurent Pinchart committed Jul 19, 2012
1 parent 4a23717 commit 6e729b4
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 52 deletions.
27 changes: 10 additions & 17 deletions drivers/video/sh_mobile_lcdcfb.c
Original file line number Diff line number Diff line change
Expand Up @@ -1115,13 +1115,12 @@ static int sh_mobile_lcdc_start(struct sh_mobile_lcdc_priv *priv)
ch->line_size = ch->pitch;

/* Enable MERAM if possible. */
if (mdev == NULL || mdev->ops == NULL ||
ch->cfg->meram_cfg == NULL)
if (mdev == NULL || ch->cfg->meram_cfg == NULL)
continue;

/* Free the allocated MERAM cache. */
if (ch->cache) {
mdev->ops->cache_free(mdev, ch->cache);
sh_mobile_meram_cache_free(mdev, ch->cache);
ch->cache = NULL;
}

Expand All @@ -1144,11 +1143,11 @@ static int sh_mobile_lcdc_start(struct sh_mobile_lcdc_priv *priv)
break;
}

cache = mdev->ops->cache_alloc(mdev, ch->cfg->meram_cfg,
cache = sh_mobile_meram_cache_alloc(mdev, ch->cfg->meram_cfg,
ch->pitch, ch->yres, pixelformat,
&ch->line_size);
if (!IS_ERR(cache)) {
mdev->ops->cache_update(mdev, cache,
sh_mobile_meram_cache_update(mdev, cache,
ch->base_addr_y, ch->base_addr_c,
&ch->base_addr_y, &ch->base_addr_c);
ch->cache = cache;
Expand Down Expand Up @@ -1223,9 +1222,7 @@ static void sh_mobile_lcdc_stop(struct sh_mobile_lcdc_priv *priv)

/* Free the MERAM cache. */
if (ch->cache) {
struct sh_mobile_meram_info *mdev;
mdev = priv->meram_dev;
mdev->ops->cache_free(mdev, ch->cache);
sh_mobile_meram_cache_free(priv->meram_dev, ch->cache);
ch->cache = 0;
}

Expand Down Expand Up @@ -1808,7 +1805,7 @@ static int sh_mobile_lcdc_pan(struct fb_var_screeninfo *var,
struct sh_mobile_lcdc_priv *priv = ch->lcdc;
unsigned long ldrcntr;
unsigned long new_pan_offset;
unsigned long base_addr_y, base_addr_c;
unsigned long base_addr_y, base_addr_c = 0;
unsigned long c_offset;

if (!ch->format->yuv)
Expand Down Expand Up @@ -1837,14 +1834,10 @@ static int sh_mobile_lcdc_pan(struct fb_var_screeninfo *var,
base_addr_c += var->xoffset;
}

if (ch->cache) {
struct sh_mobile_meram_info *mdev;

mdev = priv->meram_dev;
mdev->ops->cache_update(mdev, ch->cache,
base_addr_y, base_addr_c,
&base_addr_y, &base_addr_c);
}
if (ch->cache)
sh_mobile_meram_cache_update(priv->meram_dev, ch->cache,
base_addr_y, base_addr_c,
&base_addr_y, &base_addr_c);

ch->base_addr_y = base_addr_y;
ch->base_addr_c = base_addr_c;
Expand Down
40 changes: 20 additions & 20 deletions drivers/video/sh_mobile_meram.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

#include <linux/device.h>
#include <linux/err.h>
#include <linux/export.h>
#include <linux/genalloc.h>
#include <linux/io.h>
#include <linux/kernel.h>
Expand Down Expand Up @@ -429,18 +430,20 @@ meram_cache_alloc(struct sh_mobile_meram_priv *priv,
return ERR_PTR(-ENOMEM);
}

static void *sh_mobile_cache_alloc(struct sh_mobile_meram_info *pdata,
const struct sh_mobile_meram_cfg *cfg,
unsigned int xres, unsigned int yres,
unsigned int pixelformat,
unsigned int *pitch)
void *sh_mobile_meram_cache_alloc(struct sh_mobile_meram_info *pdata,
const struct sh_mobile_meram_cfg *cfg,
unsigned int xres, unsigned int yres,
unsigned int pixelformat, unsigned int *pitch)
{
struct sh_mobile_meram_fb_cache *cache;
struct sh_mobile_meram_priv *priv = pdata->priv;
struct platform_device *pdev = pdata->pdev;
unsigned int nplanes = is_nvcolor(pixelformat) ? 2 : 1;
unsigned int out_pitch;

if (priv == NULL)
return ERR_PTR(-ENODEV);

if (pixelformat != SH_MOBILE_MERAM_PF_NV &&
pixelformat != SH_MOBILE_MERAM_PF_NV24 &&
pixelformat != SH_MOBILE_MERAM_PF_RGB)
Expand Down Expand Up @@ -485,9 +488,10 @@ static void *sh_mobile_cache_alloc(struct sh_mobile_meram_info *pdata,
mutex_unlock(&priv->lock);
return cache;
}
EXPORT_SYMBOL_GPL(sh_mobile_meram_cache_alloc);

static void
sh_mobile_cache_free(struct sh_mobile_meram_info *pdata, void *data)
void
sh_mobile_meram_cache_free(struct sh_mobile_meram_info *pdata, void *data)
{
struct sh_mobile_meram_fb_cache *cache = data;
struct sh_mobile_meram_priv *priv = pdata->priv;
Expand All @@ -507,11 +511,14 @@ sh_mobile_cache_free(struct sh_mobile_meram_info *pdata, void *data)

mutex_unlock(&priv->lock);
}

static void
sh_mobile_cache_update(struct sh_mobile_meram_info *pdata, void *data,
unsigned long base_addr_y, unsigned long base_addr_c,
unsigned long *icb_addr_y, unsigned long *icb_addr_c)
EXPORT_SYMBOL_GPL(sh_mobile_meram_cache_free);

void
sh_mobile_meram_cache_update(struct sh_mobile_meram_info *pdata, void *data,
unsigned long base_addr_y,
unsigned long base_addr_c,
unsigned long *icb_addr_y,
unsigned long *icb_addr_c)
{
struct sh_mobile_meram_fb_cache *cache = data;
struct sh_mobile_meram_priv *priv = pdata->priv;
Expand All @@ -523,13 +530,7 @@ sh_mobile_cache_update(struct sh_mobile_meram_info *pdata, void *data,

mutex_unlock(&priv->lock);
}

static struct sh_mobile_meram_ops sh_mobile_meram_ops = {
.module = THIS_MODULE,
.cache_alloc = sh_mobile_cache_alloc,
.cache_free = sh_mobile_cache_free,
.cache_update = sh_mobile_cache_update,
};
EXPORT_SYMBOL_GPL(sh_mobile_meram_cache_update);

/* -----------------------------------------------------------------------------
* Power management
Expand Down Expand Up @@ -620,7 +621,6 @@ static int __devinit sh_mobile_meram_probe(struct platform_device *pdev)
for (i = 0; i < MERAM_ICB_NUM; ++i)
priv->icbs[i].index = i;

pdata->ops = &sh_mobile_meram_ops;
pdata->priv = priv;
pdata->pdev = pdev;

Expand Down
50 changes: 35 additions & 15 deletions include/video/sh_mobile_meram.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ enum {


struct sh_mobile_meram_priv;
struct sh_mobile_meram_ops;

/*
* struct sh_mobile_meram_info - MERAM platform data
Expand All @@ -24,7 +23,6 @@ struct sh_mobile_meram_ops;
struct sh_mobile_meram_info {
int addr_mode;
u32 reserved_icbs;
struct sh_mobile_meram_ops *ops;
struct sh_mobile_meram_priv *priv;
struct platform_device *pdev;
};
Expand All @@ -38,21 +36,43 @@ struct sh_mobile_meram_cfg {
struct sh_mobile_meram_icb_cfg icb[2];
};

struct module;
struct sh_mobile_meram_ops {
struct module *module;

/* LCDC cache management */
void *(*cache_alloc)(struct sh_mobile_meram_info *meram_dev,
const struct sh_mobile_meram_cfg *cfg,
unsigned int xres, unsigned int yres,
unsigned int pixelformat, unsigned int *pitch);
void (*cache_free)(struct sh_mobile_meram_info *meram_dev, void *data);
void (*cache_update)(struct sh_mobile_meram_info *meram_dev, void *data,
#if defined(CONFIG_FB_SH_MOBILE_MERAM) || \
defined(CONFIG_FB_SH_MOBILE_MERAM_MODULE)
void *sh_mobile_meram_cache_alloc(struct sh_mobile_meram_info *dev,
const struct sh_mobile_meram_cfg *cfg,
unsigned int xres, unsigned int yres,
unsigned int pixelformat,
unsigned int *pitch);
void sh_mobile_meram_cache_free(struct sh_mobile_meram_info *dev, void *data);
void sh_mobile_meram_cache_update(struct sh_mobile_meram_info *dev, void *data,
unsigned long base_addr_y,
unsigned long base_addr_c,
unsigned long *icb_addr_y,
unsigned long *icb_addr_c);
#else
static inline void *
sh_mobile_meram_cache_alloc(struct sh_mobile_meram_info *dev,
const struct sh_mobile_meram_cfg *cfg,
unsigned int xres, unsigned int yres,
unsigned int pixelformat,
unsigned int *pitch)
{
return ERR_PTR(-ENODEV);
}

static inline void
sh_mobile_meram_cache_free(struct sh_mobile_meram_info *dev, void *data)
{
}

static inline void
sh_mobile_meram_cache_update(struct sh_mobile_meram_info *dev, void *data,
unsigned long base_addr_y,
unsigned long base_addr_c,
unsigned long *icb_addr_y,
unsigned long *icb_addr_c);
};
unsigned long *icb_addr_c)
{
}
#endif

#endif /* __VIDEO_SH_MOBILE_MERAM_H__ */

0 comments on commit 6e729b4

Please sign in to comment.