Skip to content

Preliminary support for s5k4ecgx 5Mp camera sensor #45

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 30 additions & 8 deletions arch/arm/configs/odroidx2_defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,7 @@ CONFIG_S5P_DEV_MFC=y
CONFIG_S5P_DEV_TV=y
CONFIG_S5P_DEV_USB_EHCI=y
CONFIG_S3C24XX_PWM=y
CONFIG_S5P_SETUP_MIPIPHY=y
CONFIG_SAMSUNG_DMADEV=y

#
Expand Down Expand Up @@ -1089,7 +1090,7 @@ CONFIG_STANDALONE=y
CONFIG_PREVENT_FIRMWARE_BUILD=y
CONFIG_FW_LOADER=y
CONFIG_FIRMWARE_IN_KERNEL=y
CONFIG_EXTRA_FIRMWARE="edid/1024x768.bin edid/1280x1024.bin edid/1280x720.bin edid/1680x1050.bin edid/1920x1080.bin"
CONFIG_EXTRA_FIRMWARE="edid/1024x768.bin edid/1280x1024.bin edid/1280x720.bin edid/1680x1050.bin edid/1920x1080.bin s5k4ecgx.bin"
CONFIG_EXTRA_FIRMWARE_DIR="firmware"
# CONFIG_DEBUG_DRIVER is not set
# CONFIG_DEBUG_DEVRES is not set
Expand Down Expand Up @@ -1754,13 +1755,13 @@ CONFIG_HW_RANDOM_EXYNOS=y
CONFIG_I2C=y
CONFIG_I2C_BOARDINFO=y
CONFIG_I2C_COMPAT=y
CONFIG_I2C_CHARDEV=m
CONFIG_I2C_MUX=m
CONFIG_I2C_CHARDEV=y
CONFIG_I2C_MUX=y

#
# Multiplexer I2C Chip support
#
# CONFIG_I2C_MUX_GPIO is not set
CONFIG_I2C_MUX_GPIO=y
# CONFIG_I2C_MUX_PCA9541 is not set
# CONFIG_I2C_MUX_PCA954x is not set
CONFIG_I2C_HELPER_AUTO=y
Expand Down Expand Up @@ -2050,7 +2051,7 @@ CONFIG_VIDEO_V4L2=y
# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
CONFIG_VIDEO_TUNER=m
CONFIG_V4L2_MEM2MEM_DEV=y
CONFIG_VIDEOBUF_GEN=m
CONFIG_VIDEOBUF_GEN=y
CONFIG_VIDEOBUF_VMALLOC=m
CONFIG_VIDEOBUF_DVB=m
CONFIG_VIDEOBUF2_CORE=y
Expand Down Expand Up @@ -2229,10 +2230,13 @@ CONFIG_VIDEO_EM28XX_DVB=m
CONFIG_VIDEO_EM28XX_RC=m
CONFIG_V4L_PLATFORM_DRIVERS=y
# CONFIG_VIDEO_TIMBERDALE is not set
# CONFIG_SOC_CAMERA is not set
CONFIG_SOC_CAMERA=y
CONFIG_SOC_CAMERA_PLATFORM=y
# CONFIG_VIDEO_SH_MOBILE_CSI2 is not set
# CONFIG_VIDEO_SH_MOBILE_CEU is not set
CONFIG_VIDEO_SAMSUNG_S5P_FIMC=y
CONFIG_VIDEO_S5P_FIMC=y
# CONFIG_VIDEO_S5P_MIPI_CSIS is not set
CONFIG_VIDEO_S5P_MIPI_CSIS=y
CONFIG_VIDEO_EXYNOS_FIMC_LITE=y
# CONFIG_VIDEO_SAMSUNG_S5P_TV is not set
CONFIG_V4L_MEM2MEM_DRIVERS=y
Expand Down Expand Up @@ -2361,7 +2365,7 @@ CONFIG_VIDEO_CX2341X=m
# CONFIG_VIDEO_NOON010PC30 is not set
# CONFIG_VIDEO_M5MOLS is not set
# CONFIG_VIDEO_S5K6AA is not set
# CONFIG_VIDEO_S5K4ECGX is not set
CONFIG_VIDEO_S5K4ECGX=y
# CONFIG_VIDEO_SMIAPP is not set

#
Expand All @@ -2385,6 +2389,24 @@ CONFIG_VIDEO_CX2341X=m
#
# Sensors used on soc_camera driver
#

#
# soc_camera sensor drivers
#
# CONFIG_SOC_CAMERA_IMX074 is not set
# CONFIG_SOC_CAMERA_MT9M001 is not set
# CONFIG_SOC_CAMERA_MT9M111 is not set
# CONFIG_SOC_CAMERA_MT9T031 is not set
# CONFIG_SOC_CAMERA_MT9T112 is not set
# CONFIG_SOC_CAMERA_MT9V022 is not set
# CONFIG_SOC_CAMERA_OV2640 is not set
# CONFIG_SOC_CAMERA_OV5642 is not set
# CONFIG_SOC_CAMERA_OV6650 is not set
# CONFIG_SOC_CAMERA_OV772X is not set
# CONFIG_SOC_CAMERA_OV9640 is not set
# CONFIG_SOC_CAMERA_OV9740 is not set
# CONFIG_SOC_CAMERA_RJ54N1 is not set
# CONFIG_SOC_CAMERA_TW9910 is not set
# CONFIG_MEDIA_ATTACH is not set
CONFIG_MEDIA_TUNER=y

Expand Down
19 changes: 11 additions & 8 deletions arch/arm/mach-exynos/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -428,14 +428,14 @@ config MACH_HKDK4412
select SOC_EXYNOS4412
select MACH_SMDK4212
select EXYNOS4_SETUP_FIMC
select S5P_DEV_FIMC0
select S5P_DEV_FIMC1
select S5P_DEV_FIMC2
select S5P_DEV_FIMC3
select S5P_DEV_MFC
select EXYNOS_DEV_DMA
select EXYNOS_DEV_DRM
select EXYNOS_DEV_SYSMMU
select S5P_DEV_FIMC0
select S5P_DEV_FIMC1
select S5P_DEV_FIMC2
select S5P_DEV_FIMC3
select S5P_DEV_MFC
select EXYNOS_DEV_DMA
select EXYNOS_DEV_DRM
select EXYNOS_DEV_SYSMMU
select S3C_DEV_HSMMC
select S3C_DEV_HSMMC1
select S3C_DEV_USB_HSOTG
Expand All @@ -444,13 +444,16 @@ config MACH_HKDK4412
select S5P_DEV_JPEG
select S5P_DEV_USB_EHCI
select S5P_DEV_I2C_HDMIPHY
select S5P_SETUP_MIPIPHY
select S5P_DEV_TV
select S5P_GPIO_INT
select EXYNOS4_DEV_USB_OHCI
select EXYNOS4_DEV_DWMCI
select EXYNOS4_SETUP_DWMCI
select SAMSUNG_DEV_ADC
select EXYNOS_SETUP_SPI
select EXYNOS4_SETUP_I2C5
select S3C_DEV_I2C5
help
Machine support for ODROIDs based on Samsung EXYNOS4412 (X/X2/U2)

Expand Down
98 changes: 92 additions & 6 deletions arch/arm/mach-exynos/mach-hkdk4412.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
#include <video/platform_lcd.h>
#include <video/samsung_fimd.h>
#include <linux/platform_data/spi-s3c64xx.h>
#include <linux/platform_data/i2c-s3c2410.h>

#include <mach/gpio.h>
#include <mach/map.h>
Expand All @@ -65,6 +66,14 @@

#include <linux/w1-gpio.h>

#if defined(CONFIG_VIDEO_S5P_MIPI_CSIS) && ( defined(CONFIG_ODROID_X2) || defined(CONFIG_ODROID_X))
#include <linux/platform_data/mipi-csis.h>
#include <media/s5p_fimc.h>
#include <media/v4l2-mediabus.h>
#include <media/s5k4ecgx.h>
#include <plat/camport.h>
#endif

extern void exynos4_setup_dwmci_cfg_gpio(struct platform_device *dev, int width);

/* Following are default values for UCON, ULCON and UFCON UART registers */
Expand Down Expand Up @@ -137,6 +146,58 @@ static struct max98090_pdata max98090 = {
};
#endif

#if defined(CONFIG_VIDEO_S5P_MIPI_CSIS) && ( defined(CONFIG_ODROID_X2) || defined(CONFIG_ODROID_X))
static struct s5k4ecgx_platform_data hkdk_s5k4ecgx_platform_data = {
.gpio_reset.gpio = EXYNOS4_GPX3(1),
.gpio_reset.level = 1,
};

static struct i2c_board_info s5k4ecgx_i2c_info = {
I2C_BOARD_INFO("s5k4ecgx", 0x5A >> 1),
.platform_data = &hkdk_s5k4ecgx_platform_data,
};

static struct s5p_fimc_isp_info hkdk_camera_sensors[] = {
{

.flags = V4L2_MBUS_PCLK_SAMPLE_FALLING | V4L2_MBUS_VSYNC_ACTIVE_HIGH,
.bus_type = FIMC_MIPI_CSI2,
.board_info = &s5k4ecgx_i2c_info,
.clk_frequency = 24000000UL,
.i2c_bus_num = 5,
},
};

static struct s5p_platform_mipi_csis mipi_csis_platdata = {
.clk_rate = 176000000UL,
.wclk_source = 0,
.lanes = 2,
.hs_settle = 12,
};

static struct s5p_platform_fimc fimc_md_platdata = {
.isp_info = hkdk_camera_sensors,
.num_clients = ARRAY_SIZE(hkdk_camera_sensors),
};

static void __init hkdk4412_camera_init(void)
{
s3c_gpio_cfgpin(EXYNOS4_GPX3(1), S3C_GPIO_OUTPUT);

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 (exynos4_fimc_setup_gpio(S5P_CAMPORT_B)) {
pr_err("%s: Camera port B setup failed\n", __func__);
return;
}
/* Increase drive strength of the sensor clock output */
s5p_gpio_set_drvstr(EXYNOS4_GPE1(0), S5P_GPIO_DRVSTR_LV4);
}

#endif


static struct i2c_board_info hkdk4412_i2c_devs0[] __initdata = {
{
I2C_BOARD_INFO("max77686", (0x12 >> 1)),
Expand Down Expand Up @@ -190,6 +251,10 @@ static struct i2c_board_info hkdk4412_i2c_devs3[] __initdata = {
/* nothing here yet */
};

static struct i2c_board_info hkdk4412_i2c_devs5[] __initdata = {
/* nothing here yet */
};

static struct i2c_board_info hkdk4412_i2c_devs7[] __initdata = {
/* nothing here yet */
};
Expand Down Expand Up @@ -483,7 +548,9 @@ static struct platform_device odroid_fan = {
};
#endif

// SPI1
// SPI1 - turn off for CSI testing

#if 0
static struct s3c64xx_spi_csinfo spi1_csi = {
.fb_delay = 0x2,
.line = EXYNOS4_GPB(5),
Expand All @@ -499,6 +566,7 @@ static struct spi_board_info spi1_board_info[] __initdata = {
.controller_data = &spi1_csi,
},
};
#endif

static struct platform_device *hkdk4412_devices[] __initdata = {
&s3c_device_hsmmc2,
Expand All @@ -509,6 +577,7 @@ static struct platform_device *hkdk4412_devices[] __initdata = {
#if defined(CONFIG_W1_MASTER_GPIO) || defined(CONFIG_W1_MASTER_GPIO_MODULE)
&odroidu3_w1_device,
#endif
&s3c_device_i2c5,
&s3c_device_i2c7,
&s3c_device_rtc,
&s3c_device_usb_hsotg,
Expand All @@ -517,11 +586,14 @@ static struct platform_device *hkdk4412_devices[] __initdata = {
#ifdef CONFIG_SND_SAMSUNG_I2S
&exynos4_device_i2s0,
#endif
&s5p_device_fimc0,
&s5p_device_fimc1,
&s5p_device_fimc2,
&s5p_device_fimc3,
&s5p_device_fimc_md,
#if defined(CONFIG_VIDEO_S5P_MIPI_CSIS) && ( defined(CONFIG_ODROID_X2) || defined(CONFIG_ODROID_X))
&s5p_device_mipi_csis0,
&s5p_device_fimc0,
&s5p_device_fimc1,
&s5p_device_fimc2,
&s5p_device_fimc3,
&s5p_device_fimc_md,
#endif
&s5p_device_fimd0,
&s5p_device_mfc,
&s5p_device_mfc_l,
Expand Down Expand Up @@ -554,7 +626,10 @@ static struct platform_device *hkdk4412_devices[] __initdata = {
&s3c_device_timer[0],
&odroid_fan,
#endif

#if 0
&s3c64xx_device_spi1,
#endif
};

#if defined(CONFIG_S5P_DEV_TV)
Expand Down Expand Up @@ -654,6 +729,11 @@ static void __init hkdk4412_machine_init(void)
ARRAY_SIZE(hkdk4412_i2c_devs4));
#endif

s3c_i2c5_set_platdata(NULL);
s3c_i2c5_cfg_gpio(&s3c_device_i2c5);
i2c_register_board_info(5, hkdk4412_i2c_devs5,
ARRAY_SIZE(hkdk4412_i2c_devs5));

s3c_i2c7_set_platdata(NULL);
i2c_register_board_info(7, hkdk4412_i2c_devs7,
ARRAY_SIZE(hkdk4412_i2c_devs7));
Expand All @@ -671,8 +751,10 @@ static void __init hkdk4412_machine_init(void)
s5p_fimd0_set_platdata(&hkdk4412_fb_pdata);
#endif

#if 0
s3c64xx_spi1_set_platdata(NULL, 0, 1);
spi_register_board_info(spi1_board_info, ARRAY_SIZE(spi1_board_info));
#endif

#if defined(CONFIG_S5P_DEV_TV)
s5p_i2c_hdmiphy_set_platdata(NULL);
Expand All @@ -692,6 +774,10 @@ static void __init hkdk4412_machine_init(void)
samsung_bl_set(&hkdk4412_bl_gpio_info, &hkdk4412_bl_data);

register_reboot_notifier(&hkdk4412_reboot_notifier_nb);

#ifdef CONFIG_VIDEO_S5P_MIPI_CSIS
hkdk4412_camera_init();
#endif
}

#if defined(CONFIG_ODROID_X)
Expand Down
26 changes: 18 additions & 8 deletions arch/arm/mach-exynos/pmic-77686.h
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,8 @@ static struct regulator_init_data max77686_buck8_data = {
//-----------------------------------------------------------------------------------
// BUCK9 : IO(1.2V)
//-----------------------------------------------------------------------------------
static struct regulator_consumer_supply buck9_consumer =
REGULATOR_SUPPLY("vddio", "5-002d");
static struct regulator_init_data max77686_buck9_data = {
.constraints = {
.name = "BUCK9 1V2",
Expand All @@ -219,6 +221,8 @@ static struct regulator_init_data max77686_buck9_data = {
.enabled = 1,
},
},
.num_consumer_supplies = 1,
.consumer_supplies = &buck9_consumer,
};

//-----------------------------------------------------------------------------------
Expand Down Expand Up @@ -374,6 +378,7 @@ static struct regulator_consumer_supply ldo8_consumer_77686[] = {
REGULATOR_SUPPLY("vdd", "exynos4-hdmi"),
REGULATOR_SUPPLY("vdd_pll", "exynos4-hdmi"),
REGULATOR_SUPPLY("vdd8_mipi", NULL),
REGULATOR_SUPPLY("vddcore", "s5p-mipi-csis.0"),
};

static struct regulator_init_data max77686_ldo8_data = {
Expand Down Expand Up @@ -422,6 +427,7 @@ static struct regulator_consumer_supply ldo10_consumer_77686[] = {
REGULATOR_SUPPLY("vdd_osc", "exynos4-hdmi"),
REGULATOR_SUPPLY("vdd10_mipi", NULL),
REGULATOR_SUPPLY("vdd_tmu", NULL),
REGULATOR_SUPPLY("vddio", "s5p-mipi-csis.0"),
};

static struct regulator_init_data max77686_ldo10_data = {
Expand Down Expand Up @@ -574,8 +580,10 @@ static struct regulator_init_data max77686_ldo16_data = {
//-----------------------------------------------------------------------------------
// LDO17 : VDDQ_CAM (1.8V)
//-----------------------------------------------------------------------------------
static struct regulator_consumer_supply ldo17_consumer_77686 =
REGULATOR_SUPPLY("vddq_cam", NULL);
static struct regulator_consumer_supply ldo17_consumer_77686[] = {
REGULATOR_SUPPLY("vddq_cam", NULL),
REGULATOR_SUPPLY("vddreg", "5-002d"),
};

static struct regulator_init_data max77686_ldo17_data = {
.constraints = {
Expand All @@ -590,8 +598,8 @@ static struct regulator_init_data max77686_ldo17_data = {
.enabled = 1,
},
},
.num_consumer_supplies = 1,
.consumer_supplies = &ldo17_consumer_77686,
.num_consumer_supplies = ARRAY_SIZE(ldo17_consumer_77686),
.consumer_supplies = ldo17_consumer_77686,
};

//-----------------------------------------------------------------------------------
Expand Down Expand Up @@ -730,8 +738,10 @@ static struct regulator_init_data max77686_ldo22_data = {
//-----------------------------------------------------------------------------------
// LDO23 : TOUCH (2.8V)
//-----------------------------------------------------------------------------------
static struct regulator_consumer_supply ldo23_consumer_77686 =
REGULATOR_SUPPLY("vdd_touch", NULL);
static struct regulator_consumer_supply ldo23_consumer_77686[] = {
REGULATOR_SUPPLY("vdd_touch", NULL),
REGULATOR_SUPPLY("vdda", "5-002d"),
};

static struct regulator_init_data max77686_ldo23_data = {
.constraints = {
Expand Down Expand Up @@ -759,8 +769,8 @@ static struct regulator_init_data max77686_ldo23_data = {
.enabled = 1,
},
},
.num_consumer_supplies = 1,
.consumer_supplies = &ldo23_consumer_77686,
.num_consumer_supplies = ARRAY_SIZE(ldo23_consumer_77686),
.consumer_supplies = ldo23_consumer_77686,
};

//-----------------------------------------------------------------------------------
Expand Down
Loading