[PATCH 3/3] drm/exynos: Add device tree support for fimc ipp driver

Eunchul Kim chulspro.kim at samsung.com
Fri Apr 19 04:38:13 PDT 2013


Dear Sylwester Nawrocki.

Sorry. I didn't check your third patch. I understand the "mux", "parent" 
meaning. please ignore my comment of "mux", "parent"

and please check below comments.

Thank's
BR
Eunchul Kim.

On 04/17/2013 02:31 AM, Sylwester Nawrocki wrote:
> This patch adds OF initialization support for the FIMC driver.
> The binding documentation can be found at Documentation/devicetree/
> bindings/media/samsung-fimc.txt.
>
> The syscon regmap interface is used to serialize access to the
> shared CAMBLK registers from within the V4L2 FIMC-IS and the DRM
> FIMC drivers. The DRM driver uses this interface for setting up
> the FIFO data link between FIMD and FIMC IP blocks, while the V4L2
> one for setting up a data link between the camera ISP and FIMC for
> camera capture. The CAMBLK registers are not accessed any more
> through a statically mapped IO. Synchronized access to these
> registers is required for simultaneous operation of the camera
> ISP and the DRM IPP on Exynos4x12.
>
> Exynos4 is going to be a dt-only platform since 3.10, thus the
> driver data and driver_ids static data structures are removed.
>
> Camera input signal polarities are not currently parsed from the
> device tree.
>
> Signed-off-by: Sylwester Nawrocki <s.nawrocki at samsung.com>
> Signed-off-by: Kyungmin Park <kyungmin.park at samsung.com>
> ---
>   drivers/gpu/drm/exynos/Kconfig           |    2 +-
>   drivers/gpu/drm/exynos/exynos_drm_fimc.c |  101 +++++++++++++++---------------
>   drivers/gpu/drm/exynos/regs-fimc.h       |    7 +--
>   3 files changed, 53 insertions(+), 57 deletions(-)
>
> diff --git a/drivers/gpu/drm/exynos/Kconfig b/drivers/gpu/drm/exynos/Kconfig
> index 406f32a..5c4be2a 100644
> --- a/drivers/gpu/drm/exynos/Kconfig
> +++ b/drivers/gpu/drm/exynos/Kconfig
> @@ -56,7 +56,7 @@ config DRM_EXYNOS_IPP
>
>   config DRM_EXYNOS_FIMC
>   	bool "Exynos DRM FIMC"
> -	depends on DRM_EXYNOS_IPP
> +	depends on DRM_EXYNOS_IPP && MFD_SYSCON && OF
>   	help
>   	  Choose this option if you want to use Exynos FIMC for DRM.
>
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimc.c b/drivers/gpu/drm/exynos/exynos_drm_fimc.c
> index 9bea585..f25801e 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_fimc.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_fimc.c
> @@ -12,11 +12,12 @@
>    *
>    */
>   #include <linux/kernel.h>
> +#include <linux/mfd/syscon.h>
>   #include <linux/module.h>
>   #include <linux/platform_device.h>
> +#include <linux/regmap.h>
>   #include <linux/clk.h>
>   #include <linux/pm_runtime.h>
> -#include <plat/map-base.h>
>
>   #include <drm/drmP.h>
>   #include <drm/exynos_drm.h>
> @@ -140,15 +141,6 @@ struct fimc_capability {
>   };
>
>   /*
> - * A structure of fimc driver data.
> - *
> - * @parent_clk: name of parent clock.
> - */
> -struct fimc_driverdata {
> -	char	*parent_clk;
> -};
> -
> -/*
>    * A structure of fimc context.
>    *
>    * @ippdrv: prepare initialization using ippdrv.
> @@ -158,6 +150,7 @@ struct fimc_driverdata {
>    * @lock: locking of operations.
>    * @clocks: fimc clocks.
>    * @clk_frequency: LCLK clock frequency.
> + * @sysreg: handle to SYSREG block regmap.
>    * @sc: scaler infomations.
>    * @pol: porarity of writeback.
>    * @id: fimc id.
> @@ -172,8 +165,8 @@ struct fimc_context {
>   	struct mutex	lock;
>   	struct clk	*clocks[FIMC_CLKS_MAX];
>   	u32		clk_frequency;
> +	struct regmap	*sysreg;
>   	struct fimc_scaler	sc;
> -	struct fimc_driverdata	*ddata;
>   	struct exynos_drm_ipp_pol	pol;
>   	int	id;
>   	int	irq;
> @@ -217,17 +210,13 @@ static void fimc_sw_reset(struct fimc_context *ctx)
>   	fimc_write(0x0, EXYNOS_CIFCNTSEQ);
>   }
>
> -static void fimc_set_camblk_fimd0_wb(struct fimc_context *ctx)
> +static int fimc_set_camblk_fimd0_wb(struct fimc_context *ctx)
>   {
> -	u32 camblk_cfg;
> -
>   	DRM_DEBUG_KMS("%s\n", __func__);
>
> -	camblk_cfg = readl(SYSREG_CAMERA_BLK);
> -	camblk_cfg &= ~(SYSREG_FIMD0WB_DEST_MASK);
> -	camblk_cfg |= ctx->id << (SYSREG_FIMD0WB_DEST_SHIFT);
> -
> -	writel(camblk_cfg, SYSREG_CAMERA_BLK);
> +	return regmap_update_bits(ctx->sysreg, SYSREG_CAMERA_BLK,
> +				  SYSREG_FIMD0WB_DEST_MASK,
> +				  ctx->id << SYSREG_FIMD0WB_DEST_SHIFT);
>   }
>
>   static void fimc_set_type_ctrl(struct fimc_context *ctx, enum fimc_wb wb)
> @@ -1628,7 +1617,9 @@ static int fimc_ippdrv_start(struct device *dev, enum drm_exynos_ipp_cmd cmd)
>   		fimc_handle_lastend(ctx, true);
>
>   		/* setup FIMD */
> -		fimc_set_camblk_fimd0_wb(ctx);
> +		ret = fimc_set_camblk_fimd0_wb(ctx);
> +		if (ret < 0)

- please adds error log information for indicating error.

> +			return ret;
>
>   		set_wb.enable = 1;
>   		set_wb.refresh = property->refresh_rate;
> @@ -1784,26 +1775,50 @@ e_clk_free:
>   	return ret;
>   }
>
> +static int fimc_parse_dt(struct fimc_context *ctx)
> +{
> +	struct device_node *node = ctx->dev->of_node;
> +
> +	if (!of_property_read_bool(node, "samsung,lcd-wb"))

- It also need error log ?

> +		return -ENODEV;
> +
> +	if (of_property_read_u32(node, "clock-frequency",
> +					&ctx->clk_frequency))
> +		ctx->clk_frequency = FIMC_DEFAULT_LCLK_FREQUENCY;

- We have many kind of H/W version of FIMC device. I think we need to 
use pdata instead of static value.

> +
> +	ctx->id = of_alias_get_id(node, "fimc");
> +	if (ctx->id < 0)
> +		return -EINVAL;
> +
> +	return 0;
> +}
> +
>   static int fimc_probe(struct platform_device *pdev)
>   {
>   	struct device *dev = &pdev->dev;
>   	struct fimc_context *ctx;
>   	struct resource *res;
>   	struct exynos_drm_ippdrv *ippdrv;
> -	struct exynos_drm_fimc_pdata *pdata;
> -	struct fimc_driverdata *ddata;
>   	int ret;
>
> -	pdata = pdev->dev.platform_data;
> -	if (!pdata) {
> -		dev_err(dev, "no platform data specified.\n");
> -		return -EINVAL;
> -	}
> +	if (!dev->of_node)

- ditto.(error log)

> +		return -ENODEV;
>
>   	ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
>   	if (!ctx)
>   		return -ENOMEM;
>
> +	ctx->dev = dev;
> +
> +	ret = fimc_parse_dt(ctx);
> +	if (ret < 0)
> +		return ret;
> +
> +	ctx->sysreg = syscon_regmap_lookup_by_phandle(dev->of_node,
> +						"samsung,sysreg");
> +	if (IS_ERR(ctx->sysreg))

- ditto.(error log)

> +		return PTR_ERR(ctx->sysreg);
> +
>   	/* resource memory */
>   	ctx->regs_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>   	ctx->regs = devm_ioremap_resource(dev, ctx->regs_res);
> @@ -1828,10 +1843,6 @@ static int fimc_probe(struct platform_device *pdev)
>   	ret = fimc_setup_clocks(ctx);
>   	if (ret < 0)
>   		goto err_free_irq;
> -	/* context initailization */
> -	ctx->id = pdev->id;
> -	ctx->pol = pdata->pol;
> -	ctx->ddata = ddata;
>
>   	ippdrv = &ctx->ippdrv;
>   	ippdrv->dev = dev;
> @@ -1941,36 +1952,22 @@ static int fimc_runtime_resume(struct device *dev)
>   }
>   #endif
>
> -static struct fimc_driverdata exynos4210_fimc_data = {
> -	.parent_clk = "mout_mpll",
> -};
> -
> -static struct fimc_driverdata exynos4410_fimc_data = {
> -	.parent_clk = "mout_mpll_user",
> -};
> -
> -static struct platform_device_id fimc_driver_ids[] = {
> -	{
> -		.name		= "exynos4210-fimc",
> -		.driver_data	= (unsigned long)&exynos4210_fimc_data,
> -	}, {
> -		.name		= "exynos4412-fimc",
> -		.driver_data	= (unsigned long)&exynos4410_fimc_data,
> -	},
> -	{},
> -};
> -MODULE_DEVICE_TABLE(platform, fimc_driver_ids);
> -
>   static const struct dev_pm_ops fimc_pm_ops = {
>   	SET_SYSTEM_SLEEP_PM_OPS(fimc_suspend, fimc_resume)
>   	SET_RUNTIME_PM_OPS(fimc_runtime_suspend, fimc_runtime_resume, NULL)
>   };
>
> +static const struct of_device_id fimc_of_match[] = {
> +	{ .compatible = "samsung,exynos4210-fimc" },
> +	{ .compatible = "samsung,exynos4212-fimc" },
> +	{ },
> +};
> +
>   struct platform_driver fimc_driver = {
>   	.probe		= fimc_probe,
>   	.remove		= fimc_remove,
> -	.id_table	= fimc_driver_ids,
>   	.driver		= {
> +		.of_match_table = fimc_of_match,
>   		.name	= "exynos-drm-fimc",
>   		.owner	= THIS_MODULE,
>   		.pm	= &fimc_pm_ops,
> diff --git a/drivers/gpu/drm/exynos/regs-fimc.h b/drivers/gpu/drm/exynos/regs-fimc.h
> index b4f9ca1..3049613 100644
> --- a/drivers/gpu/drm/exynos/regs-fimc.h
> +++ b/drivers/gpu/drm/exynos/regs-fimc.h
> @@ -661,9 +661,8 @@
>   #define EXYNOS_CLKSRC_SCLK				(1 << 1)
>
>   /* SYSREG for FIMC writeback */
> -#define SYSREG_CAMERA_BLK			(S3C_VA_SYS + 0x0218)
> -#define SYSREG_ISP_BLK				(S3C_VA_SYS + 0x020c)
> -#define SYSREG_FIMD0WB_DEST_MASK	(0x3 << 23)
> -#define SYSREG_FIMD0WB_DEST_SHIFT	23
> +#define SYSREG_CAMERA_BLK			(0x0218)
> +#define SYSREG_FIMD0WB_DEST_MASK		(0x3 << 23)
> +#define SYSREG_FIMD0WB_DEST_SHIFT		23
>
>   #endif /* EXYNOS_REGS_FIMC_H */
>



More information about the dri-devel mailing list