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 <g.liakhovetski@xxxxxx> --- 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 <media/sh_mobile_ceu.h> #include <media/sh_mobile_csi2.h> #include <media/soc_camera.h> +#include <media/v4l2-async.h> #include <sound/sh_fsi.h> #include <sound/simple_card.h> @@ -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) -- 1.7.2.5 -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html