From patchwork Tue Jun 11 08:23:48 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guennadi Liakhovetski X-Patchwork-Id: 2700741 Return-Path: X-Original-To: patchwork-linux-sh@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork1.kernel.org (Postfix) with ESMTP id AF95040213 for ; Tue, 11 Jun 2013 09:27:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751649Ab3FKJ1T (ORCPT ); Tue, 11 Jun 2013 05:27:19 -0400 Received: from moutng.kundenserver.de ([212.227.17.8]:61930 "EHLO moutng.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751984Ab3FKJ1R (ORCPT ); Tue, 11 Jun 2013 05:27:17 -0400 Received: from axis700.grange (dslb-178-001-148-081.pools.arcor-ip.net [178.1.148.81]) by mrelayeu.kundenserver.de (node=mreu4) with ESMTP (Nemesis) id 0MOYSH-1Uh7eo1e69-006REl; Tue, 11 Jun 2013 11:27:16 +0200 Received: from 6a.grange (unknown [192.168.1.11]) by axis700.grange (Postfix) with ESMTPS id 93E3140BD5; Tue, 11 Jun 2013 10:24:05 +0200 (CEST) Received: from lyakh by 6a.grange with local (Exim 4.72) (envelope-from ) id 1UmJs5-0002CA-86; Tue, 11 Jun 2013 10:24:05 +0200 From: Guennadi Liakhovetski To: linux-media@vger.kernel.org Cc: Laurent Pinchart , Sylwester Nawrocki , Hans Verkuil , linux-sh@vger.kernel.org, Magnus Damm , Sakari Ailus , Prabhakar Lad , Sascha Hauer , Guennadi Liakhovetski Subject: [PATCH v10 21/21] ARM: shmobile: convert ap4evb to asynchronously register camera subdevices Date: Tue, 11 Jun 2013 10:23:48 +0200 Message-Id: <1370939028-8352-22-git-send-email-g.liakhovetski@gmx.de> X-Mailer: git-send-email 1.7.2.5 In-Reply-To: <1370939028-8352-1-git-send-email-g.liakhovetski@gmx.de> References: <1370939028-8352-1-git-send-email-g.liakhovetski@gmx.de> X-Provags-ID: V02:K0:XWyBVcEONeTWrUYExtOCt8mwlSCn++Q8/vjjK8L4639 zYh9Quu05SC//kGs6WCN/UZlxZDPOrzlOao2GJC1zvLPZeFOy8 TU9eVWWLHfSbhz6zyOs1LJ3Zsj7EPn+1xRj1y5yMvELx0+eGqh KI7gy+kprRQOKVolLs993UVYOJCl3UQ1jgixfq9ZbR5LUB4Awr s0s8FVsX8bBFV4g8fww02CCaDdxLNYHlOaOpHJE8Xzs2JfkEju DzGIiWe9c7d5ItcR5VjaV9W87UbgezAdyE/1U3siD5QY6qeY4d y0rtstPYrubU6Axw8oAyeMtfsEZGkus+575lnnFmSZEDh8DjSZ g+FZxvRwCdd6Rr3gcX8IxCRTcu1EBqWPTeeZKJXqQsHwZtI1o6 eObWSq3UX/RzA== Sender: linux-sh-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-sh@vger.kernel.org Register the imx074 camera I2C and the CSI-2 platform devices directly in board platform data instead of letting the sh_mobile_ceu_camera driver and the soc-camera framework register them at their run-time. This uses the V4L2 asynchronous subdevice probing capability. Signed-off-by: Guennadi Liakhovetski --- arch/arm/mach-shmobile/board-ap4evb.c | 103 +++++++++++++++++++------------- arch/arm/mach-shmobile/clock-sh7372.c | 1 + 2 files changed, 62 insertions(+), 42 deletions(-) diff --git a/arch/arm/mach-shmobile/board-ap4evb.c b/arch/arm/mach-shmobile/board-ap4evb.c index 45f78ca..f0beec0 100644 --- a/arch/arm/mach-shmobile/board-ap4evb.c +++ b/arch/arm/mach-shmobile/board-ap4evb.c @@ -51,6 +51,7 @@ #include #include #include +#include #include #include @@ -872,22 +873,32 @@ static struct platform_device leds_device = { }, }; -static struct i2c_board_info imx074_info = { - I2C_BOARD_INFO("imx074", 0x1a), +/* I2C */ +static struct soc_camera_subdev_desc imx074_desc; +static struct i2c_board_info i2c0_devices[] = { + { + I2C_BOARD_INFO("ak4643", 0x13), + }, { + I2C_BOARD_INFO("imx074", 0x1a), + .platform_data = &imx074_desc, + }, }; -static struct soc_camera_link imx074_link = { - .bus_id = 0, - .board_info = &imx074_info, - .i2c_adapter_id = 0, - .module_name = "imx074", +static struct i2c_board_info i2c1_devices[] = { + { + I2C_BOARD_INFO("r2025sd", 0x32), + }, }; -static struct platform_device ap4evb_camera = { - .name = "soc-camera-pdrv", - .id = 0, - .dev = { - .platform_data = &imx074_link, +static struct resource csi2_resources[] = { + { + .name = "CSI2", + .start = 0xffc90000, + .end = 0xffc90fff, + .flags = IORESOURCE_MEM, + }, { + .start = intcs_evt2irq(0x17a0), + .flags = IORESOURCE_IRQ, }, }; @@ -896,7 +907,7 @@ static struct sh_csi2_client_config csi2_clients[] = { .phy = SH_CSI2_PHY_MAIN, .lanes = 0, /* default: 2 lanes */ .channel = 0, - .pdev = &ap4evb_camera, + .name = "imx074", }, }; @@ -907,31 +918,50 @@ static struct sh_csi2_pdata csi2_info = { .flags = SH_CSI2_ECC | SH_CSI2_CRC, }; -static struct resource csi2_resources[] = { - [0] = { - .name = "CSI2", - .start = 0xffc90000, - .end = 0xffc90fff, - .flags = IORESOURCE_MEM, +static struct platform_device csi2_device = { + .name = "sh-mobile-csi2", + .id = 0, + .num_resources = ARRAY_SIZE(csi2_resources), + .resource = csi2_resources, + .dev = { + .platform_data = &csi2_info, }, - [1] = { - .start = intcs_evt2irq(0x17a0), - .flags = IORESOURCE_IRQ, +}; + +static struct soc_camera_async_subdev csi2_sd = { + .asd = { + .bus_type = V4L2_ASYNC_BUS_PLATFORM, + .match.platform.name = "sh-mobile-csi2.0", }, + .role = SOCAM_SUBDEV_DATA_PROCESSOR, }; -static struct sh_mobile_ceu_companion csi2 = { - .id = 0, - .num_resources = ARRAY_SIZE(csi2_resources), - .resource = csi2_resources, - .platform_data = &csi2_info, +static struct soc_camera_async_subdev imx074_sd = { + .asd = { + .bus_type = V4L2_ASYNC_BUS_I2C, + .match.i2c = { + .adapter_id = 0, + .address = 0x1a, + }, + }, + .role = SOCAM_SUBDEV_DATA_SOURCE, }; +static struct v4l2_async_subdev *ceu_subdevs[] = { + /* Single 2-element group */ + &csi2_sd.asd, + &imx074_sd.asd, +}; + +/* 0-terminated array of group-sizes */ +static int ceu_subdev_sizes[] = {ARRAY_SIZE(ceu_subdevs), 0}; + static struct sh_mobile_ceu_info sh_mobile_ceu_info = { .flags = SH_CEU_FLAG_USE_8BIT_BUS, .max_width = 8188, .max_height = 8188, - .csi2 = &csi2, + .asd = ceu_subdevs, + .asd_sizes = ceu_subdev_sizes, }; static struct resource ceu_resources[] = { @@ -976,7 +1006,7 @@ static struct platform_device *ap4evb_devices[] __initdata = { &lcdc_device, &lcdc1_device, &ceu_device, - &ap4evb_camera, + &csi2_device, &meram_device, }; @@ -1071,19 +1101,6 @@ static struct i2c_board_info tsc_device = { /*.irq is selected on ap4evb_init */ }; -/* I2C */ -static struct i2c_board_info i2c0_devices[] = { - { - I2C_BOARD_INFO("ak4643", 0x13), - }, -}; - -static struct i2c_board_info i2c1_devices[] = { - { - I2C_BOARD_INFO("r2025sd", 0x32), - }, -}; - static const struct pinctrl_map ap4evb_pinctrl_map[] = { /* MMCIF */ @@ -1120,6 +1137,7 @@ static void __init ap4evb_init(void) { "A3SP", &sdhi0_device, }, { "A3SP", &sdhi1_device, }, { "A4R", &ceu_device, }, + { "A4R", &csi2_device, }, }; u32 srcr4; struct clk *clk; @@ -1319,6 +1337,7 @@ static void __init ap4evb_init(void) sh7372_pm_init(); pm_clk_add(&fsi_device.dev, "spu2"); pm_clk_add(&lcdc1_device.dev, "hdmi"); + pm_clk_add(&csi2_device.dev, "csir"); } MACHINE_START(AP4EVB, "ap4evb") diff --git a/arch/arm/mach-shmobile/clock-sh7372.c b/arch/arm/mach-shmobile/clock-sh7372.c index 7e10593..0d6dcd3 100644 --- a/arch/arm/mach-shmobile/clock-sh7372.c +++ b/arch/arm/mach-shmobile/clock-sh7372.c @@ -584,6 +584,7 @@ static struct clk_lookup lookups[] = { CLKDEV_ICK_ID("divb", "sh_fsi2", &fsidivs[FSIDIV_B]), CLKDEV_ICK_ID("xcka", "sh_fsi2", &fsiack_clk), CLKDEV_ICK_ID("xckb", "sh_fsi2", &fsibck_clk), + CLKDEV_ICK_ID("csir", "sh-mobile-csi2.0", &div4_clks[DIV4_CSIR]), }; void __init sh7372_clock_init(void)