Sylwester Nawrocki wrote:
> 
> Add voltage regulator and platform data definition for M-5MOLS sensor
> and MIPI-CSI receiver drivers. Add CAM power domain dependencies for
> FIMC device and set up camera port A GPIO. Configure I2C0 bus timings.
> 
> Signed-off-by: Sylwester Nawrocki <[email protected]>
> Signed-off-by: HeungJun Kim <[email protected]>
> Signed-off-by: Kyungmin Park <[email protected]>
> ---
> Hi Kgene,
> 
> I have corrected the white space issues as you pointed out and removed
> unnecessary gpio_free() in this patch.
> 
> Thanks,
>  Sylwester
> ---
>  arch/arm/mach-exynos4/Kconfig     |    8 ++
>  arch/arm/mach-exynos4/mach-nuri.c |  156
> +++++++++++++++++++++++++++++++++++++
>  2 files changed, 164 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/arm/mach-exynos4/Kconfig b/arch/arm/mach-exynos4/Kconfig
> index dd660eb..4bc4b1f 100644
> --- a/arch/arm/mach-exynos4/Kconfig
> +++ b/arch/arm/mach-exynos4/Kconfig
> @@ -215,6 +215,7 @@ config MACH_UNIVERSAL_C210
>  config MACH_NURI
>       bool "Mobile NURI Board"
>       select CPU_EXYNOS4210
> +     select S5P_GPIO_INT
>       select S3C_DEV_WDT
>       select S3C_DEV_RTC
>       select S5P_DEV_FIMD0
> @@ -224,9 +225,16 @@ config MACH_NURI
>       select S3C_DEV_I2C1
>       select S3C_DEV_I2C3
>       select S3C_DEV_I2C5
> +     select S5P_DEV_CSIS0
> +     select S5P_DEV_FIMC0
> +     select S5P_DEV_FIMC1
> +     select S5P_DEV_FIMC2
> +     select S5P_DEV_FIMC3
>       select S5P_DEV_MFC
>       select S5P_DEV_USB_EHCI
> +     select S5P_SETUP_MIPIPHY
>       select EXYNOS4_DEV_PD
> +     select EXYNOS4_SETUP_FIMC
>       select EXYNOS4_SETUP_FIMD0
>       select EXYNOS4_SETUP_I2C1
>       select EXYNOS4_SETUP_I2C3
> diff --git a/arch/arm/mach-exynos4/mach-nuri.c
b/arch/arm/mach-exynos4/mach-
> nuri.c
> index bbd13f4..f5cecd8 100644
> --- a/arch/arm/mach-exynos4/mach-nuri.c
> +++ b/arch/arm/mach-exynos4/mach-nuri.c
> @@ -27,6 +27,9 @@
>  #include <linux/pwm_backlight.h>
> 
>  #include <video/platform_lcd.h>
> +#include <media/m5mols.h>
> +#include <media/s5p_fimc.h>
> +#include <media/v4l2-mediabus.h>
> 
>  #include <asm/mach/arch.h>
>  #include <asm/mach-types.h>
> @@ -45,6 +48,9 @@
>  #include <plat/iic.h>
>  #include <plat/mfc.h>
>  #include <plat/pd.h>
> +#include <plat/fimc-core.h>
> +#include <plat/camport.h>
> +#include <plat/mipi_csis.h>
> 
>  #include <mach/map.h>
> 
> @@ -65,6 +71,8 @@
>  enum fixed_regulator_id {
>       FIXED_REG_ID_MMC = 0,
>       FIXED_REG_ID_MAX8903,
> +     FIXED_REG_ID_CAM_A28V,
> +     FIXED_REG_ID_CAM_12V,
>  };
> 
>  static struct s3c2410_uartcfg nuri_uartcfgs[] __initdata = {
> @@ -1117,10 +1125,145 @@ static void __init nuri_ehci_init(void)
>       s5p_ehci_set_platdata(pdata);
>  }
> 
> +/* CAMERA */
> +static struct regulator_consumer_supply cam_vdda_supply[] = {
> +     REGULATOR_SUPPLY("a_sensor", "0-001f"),
> +};
> +
> +static struct regulator_init_data cam_vdda_reg_init_data = {
> +     .constraints = { .valid_ops_mask = REGULATOR_CHANGE_STATUS },
> +     .num_consumer_supplies = ARRAY_SIZE(cam_vdda_supply),
> +     .consumer_supplies = cam_vdda_supply,
> +};
> +
> +static struct fixed_voltage_config cam_vdda_fixed_voltage_cfg = {
> +     .supply_name    = "CAM_IO_EN",
> +     .microvolts     = 2800000,
> +     .gpio           = EXYNOS4_GPE2(1), /* CAM_IO_EN */
> +     .enable_high    = 1,
> +     .init_data      = &cam_vdda_reg_init_data,
> +};
> +
> +static struct platform_device cam_vdda_fixed_rdev = {
> +     .name = "reg-fixed-voltage", .id = FIXED_REG_ID_CAM_A28V,
> +     .dev = { .platform_data = &cam_vdda_fixed_voltage_cfg },
> +};
> +
> +static struct regulator_consumer_supply camera_8m_12v_supply =
> +     REGULATOR_SUPPLY("dig_12", "0-001f");
> +
> +static struct regulator_init_data cam_8m_12v_reg_init_data = {
> +     .num_consumer_supplies  = 1,
> +     .consumer_supplies      = &camera_8m_12v_supply,
> +     .constraints = {
> +             .valid_ops_mask = REGULATOR_CHANGE_STATUS
> +     },
> +};
> +
> +static struct fixed_voltage_config cam_8m_12v_fixed_voltage_cfg = {
> +     .supply_name    = "8M_1.2V",
> +     .microvolts     = 1200000,
> +     .gpio           = EXYNOS4_GPE2(5), /* 8M_1.2V_EN */
> +     .enable_high    = 1,
> +     .init_data      = &cam_8m_12v_reg_init_data,
> +};
> +
> +static struct platform_device cam_8m_12v_fixed_rdev = {
> +     .name = "reg-fixed-voltage", .id = FIXED_REG_ID_CAM_12V,
> +     .dev = { .platform_data = &cam_8m_12v_fixed_voltage_cfg },
> +};
> +
> +static struct s5p_platform_mipi_csis mipi_csis_platdata = {
> +     .clk_rate       = 166000000UL,
> +     .lanes          = 2,
> +     .alignment      = 32,
> +     .hs_settle      = 12,
> +     .phy_enable     = s5p_csis_phy_enable,
> +};
> +
> +#define GPIO_CAM_MEGA_RST    EXYNOS4_GPY3(7) /* ISP_RESET */
> +#define GPIO_CAM_8M_ISP_INT  EXYNOS4_GPL2(5)
> +
> +static struct m5mols_platform_data m5mols_platdata = {
> +     .gpio_reset = GPIO_CAM_MEGA_RST,
> +};
> +
> +static struct i2c_board_info m5mols_board_info = {
> +     I2C_BOARD_INFO("M5MOLS", 0x1F),
> +     .platform_data  = &m5mols_platdata,
> +};
> +
> +static struct s5p_fimc_isp_info nuri_camera_sensors[] = {
> +     {
> +             .flags          = V4L2_MBUS_PCLK_SAMPLE_FALLING |
> +                               V4L2_MBUS_VSYNC_ACTIVE_LOW,
> +             .bus_type       = FIMC_MIPI_CSI2,
> +             .board_info     = &m5mols_board_info,
> +             .clk_frequency  = 24000000UL,
> +             .csi_data_align = 32,
> +     },
> +};
> +
> +static struct s5p_platform_fimc fimc_md_platdata = {
> +     .isp_info       = nuri_camera_sensors,
> +     .num_clients    = ARRAY_SIZE(nuri_camera_sensors),
> +};
> +
> +struct platform_device s5p_device_fimc_md = {
> +     .name   = "s5p-fimc-md",
> +     .id     = -1,
> +};
> +
> +static struct gpio nuri_camera_gpios[] = {
> +     { GPIO_CAM_8M_ISP_INT,  GPIOF_IN,
> "8M_ISP_INT"  },
> +     { GPIO_CAM_MEGA_RST,    GPIOF_OUT_INIT_LOW, "CAM_8M_NRST" },
> +};
> +
> +static void nuri_camera_init(void)
> +{
> +     s3c_set_platdata(&mipi_csis_platdata, sizeof(mipi_csis_platdata),
> +                      &s5p_device_mipi_csis0);
> +     s3c_set_platdata(&fimc_md_platdata,  sizeof(fimc_md_platdata),
> +                      &s5p_device_fimc_md);
> +
> +     if (gpio_request_array(nuri_camera_gpios,
> +                            ARRAY_SIZE(nuri_camera_gpios))) {
> +             pr_err("%s: GPIO request failed\n", __func__);
> +             return;
> +     }
> +
> +     m5mols_board_info.irq =
> s5p_register_gpio_interrupt(GPIO_CAM_8M_ISP_INT);
> +     if (!IS_ERR_VALUE(m5mols_board_info.irq))
> +             s3c_gpio_cfgpin(GPIO_CAM_8M_ISP_INT,
> S3C_GPIO_SFN(0xF));
> +     else
> +             pr_err("%s: Failed to configure 8M_ISP_INT GPIO\n",
__func__);
> +
> +     /* Free GPIOs controlled directly by the sensor drivers. */
> +     gpio_free(GPIO_CAM_MEGA_RST);
> +
> +     if (exynos4_fimc_setup_gpio(S5P_CAMPORT_A)) {
> +             pr_err("%s: Camera port A setup failed\n", __func__);
> +             return;
> +     }
> +     /* Increase drive strength of the sensor clock output */
> +     s5p_gpio_set_drvstr(EXYNOS4_GPJ1(3), S5P_GPIO_DRVSTR_LV4);
> +}
> +
> +static struct s3c2410_platform_i2c nuri_i2c0_platdata __initdata = {
> +     .frequency      = 400000U,
> +     .sda_delay      = 200,
> +};
> +
>  static struct platform_device *nuri_devices[] __initdata = {
>       /* Samsung Platform Devices */
>       &s3c_device_i2c5, /* PMIC should initialize first */
> +     &s3c_device_i2c0,
>       &emmc_fixed_voltage,
> +     &s5p_device_mipi_csis0,
> +     &s5p_device_fimc0,
> +     &s5p_device_fimc1,
> +     &s5p_device_fimc2,
> +     &s5p_device_fimc3,
>       &s5p_device_fimd0,
>       &s3c_device_hsmmc0,
>       &s3c_device_hsmmc2,
> @@ -1137,6 +1280,8 @@ static struct platform_device *nuri_devices[]
__initdata =
> {
>       &s5p_device_mfc_r,
>       &exynos4_device_pd[PD_MFC],
>       &exynos4_device_pd[PD_LCD0],
> +     &exynos4_device_pd[PD_CAM],
> +     &s5p_device_fimc_md,
> 
>       /* NURI Devices */
>       &nuri_gpio_keys,
> @@ -1144,6 +1289,8 @@ static struct platform_device *nuri_devices[]
__initdata =
> {
>       &nuri_backlight_device,
>       &max8903_fixed_reg_dev,
>       &nuri_max8903_device,
> +     &cam_vdda_fixed_rdev,
> +     &cam_8m_12v_fixed_rdev,
>  };
> 
>  static void __init nuri_map_io(void)
> @@ -1164,6 +1311,7 @@ static void __init nuri_machine_init(void)
>       nuri_tsp_init();
>       nuri_power_init();
> 
> +     s3c_i2c0_set_platdata(&nuri_i2c0_platdata);
>       i2c_register_board_info(1, i2c1_devs, ARRAY_SIZE(i2c1_devs));
>       s3c_i2c3_set_platdata(&i2c3_data);
>       i2c_register_board_info(3, i2c3_devs, ARRAY_SIZE(i2c3_devs));
> @@ -1175,6 +1323,8 @@ static void __init nuri_machine_init(void)
> 
>       s5p_fimd0_set_platdata(&nuri_fb_pdata);
> 
> +     nuri_camera_init();
> +
>       nuri_ehci_init();
>       clk_xusbxti.rate = 24000000;
> 
> @@ -1182,6 +1332,12 @@ static void __init nuri_machine_init(void)
>       platform_add_devices(nuri_devices, ARRAY_SIZE(nuri_devices));
>       s5p_device_mfc.dev.parent = &exynos4_device_pd[PD_MFC].dev;
>       s5p_device_fimd0.dev.parent = &exynos4_device_pd[PD_LCD0].dev;
> +
> +     s5p_device_fimc0.dev.parent = &exynos4_device_pd[PD_CAM].dev;
> +     s5p_device_fimc1.dev.parent = &exynos4_device_pd[PD_CAM].dev;
> +     s5p_device_fimc2.dev.parent = &exynos4_device_pd[PD_CAM].dev;
> +     s5p_device_fimc3.dev.parent = &exynos4_device_pd[PD_CAM].dev;
> +     s5p_device_mipi_csis0.dev.parent = &exynos4_device_pd[PD_CAM].dev;
>  }
> 
>  MACHINE_START(NURI, "NURI")
> --
> 1.7.7

Looks better, will apply this.
Thanks.

Best regards,
Kgene.
--
Kukjin Kim <[email protected]>, Senior Engineer,
SW Solution Development Team, Samsung Electronics Co., Ltd.

--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to