Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6e729b41 authored by Laurent Pinchart's avatar Laurent Pinchart
Browse files

sh_mobile_meram: Use direct function calls for the public API



There's no reason to use abstract operation pointers to implement the
MERAM API. Replace them by direct function calls.

Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
parent 4a237177
Loading
Loading
Loading
Loading
+10 −17
Original line number Diff line number Diff line
@@ -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;
		}

@@ -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;
@@ -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;
		}

@@ -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)
@@ -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,
	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;
+20 −20
Original line number Diff line number Diff line
@@ -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>
@@ -429,11 +430,10 @@ 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,
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)
				  unsigned int pixelformat, unsigned int *pitch)
{
	struct sh_mobile_meram_fb_cache *cache;
	struct sh_mobile_meram_priv *priv = pdata->priv;
@@ -441,6 +441,9 @@ static void *sh_mobile_cache_alloc(struct sh_mobile_meram_info *pdata,
	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)
@@ -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;
@@ -507,11 +511,14 @@ sh_mobile_cache_free(struct sh_mobile_meram_info *pdata, void *data)

	mutex_unlock(&priv->lock);
}
EXPORT_SYMBOL_GPL(sh_mobile_meram_cache_free);

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)
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;
@@ -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
@@ -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;

+35 −15
Original line number Diff line number Diff line
@@ -15,7 +15,6 @@ enum {


struct sh_mobile_meram_priv;
struct sh_mobile_meram_ops;

/*
 * struct sh_mobile_meram_info - MERAM platform data
@@ -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;
};
@@ -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,
#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 (*cache_free)(struct sh_mobile_meram_info *meram_dev, void *data);
	void (*cache_update)(struct sh_mobile_meram_info *meram_dev, void *data,
				  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)
{
}
#endif

#endif /* __VIDEO_SH_MOBILE_MERAM_H__  */