/* linux/arch/arm/plat-s5p/dev-fimc-s5p.c * * Copyright (c) 2011 Samsung Electronics Co., Ltd. * http://www.samsung.com/ * * Device definition for FIMC device * * 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 #include #include #include #include #include #include #ifdef CONFIG_USE_FIMC_CMA #include static u64 s3c_fimc_dmamask = DMA_BIT_MASK(32); #endif static struct resource s3c_fimc0_resource[] = { [0] = { .start = S5P_PA_FIMC0, .end = S5P_PA_FIMC0 + SZ_4K - 1, .flags = IORESOURCE_MEM, }, [1] = { .start = IRQ_FIMC0, .end = IRQ_FIMC0, .flags = IORESOURCE_IRQ, }, }; struct platform_device s3c_device_fimc0 = { .name = "s3c-fimc", .id = 0, .num_resources = ARRAY_SIZE(s3c_fimc0_resource), .resource = s3c_fimc0_resource, }; static struct s3c_platform_fimc default_fimc0_data __initdata = { .default_cam = CAMERA_PAR_A, .hw_ver = 0x51, }; void __init s3c_fimc0_set_platdata(struct s3c_platform_fimc *pd) { struct s3c_platform_fimc *npd; if (!pd) pd = &default_fimc0_data; npd = kmemdup(pd, sizeof(struct s3c_platform_fimc), GFP_KERNEL); if (!npd) printk(KERN_ERR "%s: no memory for platform data\n", __func__); else { if (!npd->cfg_gpio) npd->cfg_gpio = s3c_fimc0_cfg_gpio; if (!npd->clk_on) npd->clk_on = s3c_fimc_clk_on; if (!npd->clk_off) npd->clk_off = s3c_fimc_clk_off; npd->hw_ver = 0x51; npd->use_cam = true; s3c_device_fimc0.dev.platform_data = npd; } } static struct resource s3c_fimc1_resource[] = { [0] = { .start = S5P_PA_FIMC1, .end = S5P_PA_FIMC1 + SZ_4K - 1, .flags = IORESOURCE_MEM, }, [1] = { .start = IRQ_FIMC1, .end = IRQ_FIMC1, .flags = IORESOURCE_IRQ, }, }; struct platform_device s3c_device_fimc1 = { .name = "s3c-fimc", .id = 1, #ifdef CONFIG_USE_FIMC_CMA .dev = { .dma_mask = &s3c_fimc_dmamask, .coherent_dma_mask = DMA_BIT_MASK(32), }, #endif .num_resources = ARRAY_SIZE(s3c_fimc1_resource), .resource = s3c_fimc1_resource, }; static struct s3c_platform_fimc default_fimc1_data __initdata = { .default_cam = CAMERA_PAR_A, .hw_ver = 0x51, }; void __init s3c_fimc1_set_platdata(struct s3c_platform_fimc *pd) { struct s3c_platform_fimc *npd; if (!pd) pd = &default_fimc1_data; npd = kmemdup(pd, sizeof(struct s3c_platform_fimc), GFP_KERNEL); if (!npd) printk(KERN_ERR "%s: no memory for platform data\n", __func__); else { if (!npd->cfg_gpio) npd->cfg_gpio = s3c_fimc1_cfg_gpio; if (!npd->clk_on) npd->clk_on = s3c_fimc_clk_on; if (!npd->clk_off) npd->clk_off = s3c_fimc_clk_off; npd->hw_ver = 0x51; npd->use_cam = false; s3c_device_fimc1.dev.platform_data = npd; } } static struct resource s3c_fimc2_resource[] = { [0] = { .start = S5P_PA_FIMC2, .end = S5P_PA_FIMC2 + SZ_4K - 1, .flags = IORESOURCE_MEM, }, [1] = { .start = IRQ_FIMC2, .end = IRQ_FIMC2, .flags = IORESOURCE_IRQ, }, }; struct platform_device s3c_device_fimc2 = { .name = "s3c-fimc", .id = 2, .num_resources = ARRAY_SIZE(s3c_fimc2_resource), .resource = s3c_fimc2_resource, }; static struct s3c_platform_fimc default_fimc2_data __initdata = { .default_cam = CAMERA_PAR_A, .hw_ver = 0x51, }; void __init s3c_fimc2_set_platdata(struct s3c_platform_fimc *pd) { struct s3c_platform_fimc *npd; if (!pd) pd = &default_fimc2_data; npd = kmemdup(pd, sizeof(struct s3c_platform_fimc), GFP_KERNEL); if (!npd) printk(KERN_ERR "%s: no memory for platform data\n", __func__); else { if (!npd->cfg_gpio) npd->cfg_gpio = s3c_fimc2_cfg_gpio; if (!npd->clk_on) npd->clk_on = s3c_fimc_clk_on; if (!npd->clk_off) npd->clk_off = s3c_fimc_clk_off; npd->hw_ver = 0x51; npd->use_cam = false; s3c_device_fimc2.dev.platform_data = npd; } } static struct resource s3c_fimc3_resource[] = { [0] = { .start = S5P_PA_FIMC3, .end = S5P_PA_FIMC3 + SZ_4K - 1, .flags = IORESOURCE_MEM, }, [1] = { .start = IRQ_FIMC3, .end = IRQ_FIMC3, .flags = IORESOURCE_IRQ, }, }; struct platform_device s3c_device_fimc3 = { .name = "s3c-fimc", .id = 3, .num_resources = ARRAY_SIZE(s3c_fimc3_resource), .resource = s3c_fimc3_resource, }; static struct s3c_platform_fimc default_fimc3_data __initdata = { .default_cam = CAMERA_PAR_A, .hw_ver = 0x51, }; void __init s3c_fimc3_set_platdata(struct s3c_platform_fimc *pd) { struct s3c_platform_fimc *npd; if (!pd) pd = &default_fimc3_data; npd = kmemdup(pd, sizeof(struct s3c_platform_fimc), GFP_KERNEL); if (!npd) printk(KERN_ERR "%s: no memory for platform data\n", __func__); else { if (!npd->cfg_gpio) npd->cfg_gpio = s3c_fimc3_cfg_gpio; if (!npd->clk_on) npd->clk_on = s3c_fimc_clk_on; if (!npd->clk_off) npd->clk_off = s3c_fimc_clk_off; npd->hw_ver = 0x51; npd->use_cam = false; s3c_device_fimc3.dev.platform_data = npd; } }