From patchwork Wed Apr 13 15:53:31 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: weitway@gmail.com X-Patchwork-Id: 1002 Return-Path: Delivered-To: unknown Received: from imap.gmail.com (74.125.159.109) by localhost6.localdomain6 with IMAP4-SSL; 08 Jun 2011 14:48:11 -0000 Delivered-To: patches@linaro.org Received: by 10.68.59.138 with SMTP id z10cs327019pbq; Wed, 13 Apr 2011 08:54:57 -0700 (PDT) Received: by 10.42.150.72 with SMTP id z8mr1186963icv.487.1302710097310; Wed, 13 Apr 2011 08:54:57 -0700 (PDT) Received: from mail-iw0-f178.google.com (mail-iw0-f178.google.com [209.85.214.178]) by mx.google.com with ESMTPS id vq2si1981254icb.150.2011.04.13.08.54.56 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 13 Apr 2011 08:54:57 -0700 (PDT) Received-SPF: pass (google.com: domain of weitway@gmail.com designates 209.85.214.178 as permitted sender) client-ip=209.85.214.178; Authentication-Results: mx.google.com; spf=pass (google.com: domain of weitway@gmail.com designates 209.85.214.178 as permitted sender) smtp.mail=weitway@gmail.com; dkim=pass (test mode) header.i=@gmail.com Received: by iwn9 with SMTP id 9so1658645iwn.37 for ; Wed, 13 Apr 2011 08:54:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:from:to:cc:subject:date:message-id:x-mailer :in-reply-to:references; bh=gNvy4xrpC8lM25oTzoIWlulufe8Mz6yH4XEyjEAyNyo=; b=KVmGoOPxhablnfsU6q0uPo6/paHxlWTgW0ixAjrlEJZDAa4afh7J3mBKCvWy62Rbyp NNmQJbzzJkmCqYrP9rVU2TRMkVKm/BYpeRHCE24dgsaCL/1BqcNXI20AR0FNghIYbozd MJOGF08Y1JDshdL75Me4ZqTSV6+cBHLYh9Fo4= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; b=AUGscVqXgtE7fgkC6ExQ696pCdPtdIJg+6r0LJWUDJ08FrXAUV/B6R1l22KoXflHbP WsWXjr5TXap01TKNrOW8Yhmz1gaE7U1I68WbwBFL7FSjFVsn2ZPm+IOKA0kcakSizA7O xjlVcnj/KWeBdHrN9J5k8xmY3rPA0JgYM//LA= Received: by 10.231.139.202 with SMTP id f10mr8327191ibu.36.1302710096805; Wed, 13 Apr 2011 08:54:56 -0700 (PDT) Received: from localhost.localdomain ([116.235.131.170]) by mx.google.com with ESMTPS id f28sm513868ibh.50.2011.04.13.08.54.49 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 13 Apr 2011 08:54:56 -0700 (PDT) From: weitway@gmail.com To: linux-arm-kernel@lists.infradead.org Cc: u.kleine-koenig@pengutronix.de, s.hauer@pengutronix.de, eric.miao@linaro.org, Jason Chen , Jason Chen Subject: [PATCH 2/7] ARM i.MX5: Add IPU device support Date: Wed, 13 Apr 2011 23:53:31 +0800 Message-Id: <1302710016-3569-2-git-send-email-weitway@gmail.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1302710016-3569-1-git-send-email-weitway@gmail.com> References: <1302710016-3569-1-git-send-email-weitway@gmail.com> From: Jason Chen Signed-off-by: Sascha Hauer Signed-off-by: Jason Chen --- arch/arm/mach-mx5/devices-imx51.h | 4 + arch/arm/mach-mx5/devices-imx53.h | 4 + arch/arm/plat-mxc/devices/Kconfig | 4 + arch/arm/plat-mxc/devices/Makefile | 1 + arch/arm/plat-mxc/devices/platform-imx_ipuv3.c | 94 +++++++++++++++++++++++ arch/arm/plat-mxc/include/mach/devices-common.h | 12 +++ 6 files changed, 119 insertions(+), 0 deletions(-) diff --git a/arch/arm/mach-mx5/devices-imx51.h b/arch/arm/mach-mx5/devices-imx51.h index 7fff485..1bd73b3 100644 --- a/arch/arm/mach-mx5/devices-imx51.h +++ b/arch/arm/mach-mx5/devices-imx51.h @@ -55,3 +55,7 @@ extern const struct imx_mxc_pwm_data imx51_mxc_pwm_data[] __initconst; extern const struct imx_imx_keypad_data imx51_imx_keypad_data __initconst; #define imx51_add_imx_keypad(pdata) \ imx_add_imx_keypad(&imx51_imx_keypad_data, pdata) + +extern const struct imx_ipuv3_data imx51_ipuv3_data __initconst; +#define imx51_add_ipuv3(pdata) \ + imx_add_ipuv3(&imx51_ipuv3_data, pdata) diff --git a/arch/arm/mach-mx5/devices-imx53.h b/arch/arm/mach-mx5/devices-imx53.h index 9251008..8049039 100644 --- a/arch/arm/mach-mx5/devices-imx53.h +++ b/arch/arm/mach-mx5/devices-imx53.h @@ -33,3 +33,7 @@ extern const struct imx_spi_imx_data imx53_ecspi_data[] __initconst; extern const struct imx_imx2_wdt_data imx53_imx2_wdt_data[] __initconst; #define imx53_add_imx2_wdt(id, pdata) \ imx_add_imx2_wdt(&imx53_imx2_wdt_data[id]) + +extern const struct imx_ipuv3_data imx53_ipuv3_data __initconst; +#define imx53_add_ipuv3(pdata) \ + imx_add_ipuv3(&imx53_ipuv3_data, pdata) diff --git a/arch/arm/plat-mxc/devices/Kconfig b/arch/arm/plat-mxc/devices/Kconfig index b9ab1d5..f99317e 100644 --- a/arch/arm/plat-mxc/devices/Kconfig +++ b/arch/arm/plat-mxc/devices/Kconfig @@ -71,3 +71,7 @@ config IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX config IMX_HAVE_PLATFORM_SPI_IMX bool + +config IMX_HAVE_PLATFORM_IMX_IPUV3 + bool + diff --git a/arch/arm/plat-mxc/devices/Makefile b/arch/arm/plat-mxc/devices/Makefile index 75cd2ec..0a6be0a 100644 --- a/arch/arm/plat-mxc/devices/Makefile +++ b/arch/arm/plat-mxc/devices/Makefile @@ -22,3 +22,4 @@ obj-$(CONFIG_IMX_HAVE_PLATFORM_MXC_RNGA) += platform-mxc_rnga.o obj-$(CONFIG_IMX_HAVE_PLATFORM_MXC_W1) += platform-mxc_w1.o obj-$(CONFIG_IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX) += platform-sdhci-esdhc-imx.o obj-$(CONFIG_IMX_HAVE_PLATFORM_SPI_IMX) += platform-spi_imx.o +obj-$(CONFIG_IMX_HAVE_PLATFORM_IMX_IPUV3) += platform-imx_ipuv3.o diff --git a/arch/arm/plat-mxc/devices/platform-imx_ipuv3.c b/arch/arm/plat-mxc/devices/platform-imx_ipuv3.c new file mode 100644 index 0000000..fe76cf1 --- /dev/null +++ b/arch/arm/plat-mxc/devices/platform-imx_ipuv3.c @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2010 Pengutronix + * Uwe Kleine-Koenig + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License version 2 as published by the + * Free Software Foundation. + */ +#include +#include + +#define imx5_ipuv3_data_entry_single(soc, size, ipu_init) \ + { \ + .iobase = soc ## _IPU_CTRL_BASE_ADDR, \ + .irq_err = soc ## _INT_IPU_ERR, \ + .irq = soc ## _INT_IPU_SYN, \ + .iosize = size, \ + .init = ipu_init, \ + } + +#ifdef CONFIG_SOC_IMX51 +int __init mx51_ipuv3_init(struct platform_device *pdev) +{ + int ret = 0; + u32 val; + + /* hard reset the IPU */ + val = readl(MX51_IO_ADDRESS(MX51_SRC_BASE_ADDR)); + val |= 1 << 3; + writel(val, MX51_IO_ADDRESS(MX51_SRC_BASE_ADDR)); + + return ret; +} + +const struct imx_ipuv3_data imx51_ipuv3_data __initconst = + imx5_ipuv3_data_entry_single(MX51, + SZ_512M, mx51_ipuv3_init); +#endif /* ifdef CONFIG_SOC_IMX51 */ + +#ifdef CONFIG_SOC_IMX53 +int __init mx53_ipuv3_init(struct platform_device *pdev) +{ + int ret = 0; + u32 val; + int i; + + /* fixup ipu base address */ + for (i = 0; i < pdev->num_resources; i++) { + struct resource *r = &pdev->resource[i]; + + if (IORESOURCE_MEM == resource_type(r)) + r->start -= 0x18000000; + } + + /* hard reset the IPU */ + val = readl(MX53_IO_ADDRESS(MX53_SRC_BASE_ADDR)); + val |= 1 << 3; + writel(val, MX53_IO_ADDRESS(MX53_SRC_BASE_ADDR)); + + return ret; +} + +const struct imx_ipuv3_data imx53_ipuv3_data __initconst = + imx5_ipuv3_data_entry_single(MX53, + SZ_128M, mx53_ipuv3_init); +#endif + +struct platform_device *__init imx_add_ipuv3( + const struct imx_ipuv3_data *data, + struct imx_ipuv3_platform_data *pdata) +{ + struct resource res[] = { + { + .start = data->iobase, + .end = data->iobase + data->iosize - 1, + .flags = IORESOURCE_MEM, + }, { + .start = data->irq_err, + .end = data->irq_err, + .flags = IORESOURCE_IRQ, + }, { + .start = data->irq, + .end = data->irq, + .flags = IORESOURCE_IRQ, + }, + }; + + pdata->init = data->init; + + return imx_add_platform_device("imx-ipuv3", -1, + res, ARRAY_SIZE(res), pdata, sizeof(*pdata)); +} + + diff --git a/arch/arm/plat-mxc/include/mach/devices-common.h b/arch/arm/plat-mxc/include/mach/devices-common.h index 8658c9c..c65ea3a 100644 --- a/arch/arm/plat-mxc/include/mach/devices-common.h +++ b/arch/arm/plat-mxc/include/mach/devices-common.h @@ -264,3 +264,15 @@ struct imx_spi_imx_data { struct platform_device *__init imx_add_spi_imx( const struct imx_spi_imx_data *data, const struct spi_imx_master *pdata); + +#include +struct imx_ipuv3_data { + resource_size_t iobase; + resource_size_t iosize; + resource_size_t irq_err; + resource_size_t irq; + int (*init) (struct platform_device *); +}; +struct platform_device *__init imx_add_ipuv3( + const struct imx_ipuv3_data *data, + struct imx_ipuv3_platform_data *pdata);