diff options
Diffstat (limited to 'arch/arm/mach-pxa/ezx.c')
| -rw-r--r-- | arch/arm/mach-pxa/ezx.c | 251 | 
1 files changed, 247 insertions, 4 deletions
diff --git a/arch/arm/mach-pxa/ezx.c b/arch/arm/mach-pxa/ezx.c index 588b265e575..626c82b1397 100644 --- a/arch/arm/mach-pxa/ezx.c +++ b/arch/arm/mach-pxa/ezx.c @@ -17,7 +17,11 @@  #include <linux/delay.h>  #include <linux/pwm_backlight.h>  #include <linux/input.h> +#include <linux/gpio.h>  #include <linux/gpio_keys.h> +#include <linux/leds-lp3944.h> + +#include <media/soc_camera.h>  #include <asm/setup.h>  #include <asm/mach-types.h> @@ -29,6 +33,7 @@  #include <plat/i2c.h>  #include <mach/hardware.h>  #include <mach/pxa27x_keypad.h> +#include <mach/camera.h>  #include "devices.h"  #include "generic.h" @@ -38,6 +43,9 @@  #define GPIO15_A910_FLIP_LID 		15  #define GPIO12_E680_LOCK_SWITCH 	12  #define GPIO15_E6_LOCK_SWITCH 		15 +#define GPIO50_nCAM_EN			50 +#define GPIO19_GEN1_CAM_RST		19 +#define GPIO28_GEN2_CAM_RST		28  static struct platform_pwm_backlight_data ezx_backlight_data = {  	.pwm_id		= 0, @@ -191,8 +199,8 @@ static unsigned long gen1_pin_config[] __initdata = {  	GPIO94_CIF_DD_5,  	GPIO17_CIF_DD_6,  	GPIO108_CIF_DD_7, -	GPIO50_GPIO,				/* CAM_EN */ -	GPIO19_GPIO,				/* CAM_RST */ +	GPIO50_GPIO | MFP_LPM_DRIVE_HIGH,	/* CAM_EN */ +	GPIO19_GPIO | MFP_LPM_DRIVE_HIGH,	/* CAM_RST */  	/* EMU */  	GPIO120_GPIO,				/* EMU_MUX1 */ @@ -248,8 +256,8 @@ static unsigned long gen2_pin_config[] __initdata = {  	GPIO48_CIF_DD_5,  	GPIO93_CIF_DD_6,  	GPIO12_CIF_DD_7, -	GPIO50_GPIO,				/* CAM_EN */ -	GPIO28_GPIO,				/* CAM_RST */ +	GPIO50_GPIO | MFP_LPM_DRIVE_HIGH,	/* CAM_EN */ +	GPIO28_GPIO | MFP_LPM_DRIVE_HIGH,	/* CAM_RST */  	GPIO17_GPIO,				/* CAM_FLASH */  };  #endif @@ -683,6 +691,81 @@ static struct platform_device a780_gpio_keys = {  	},  }; +/* camera */ +static int a780_camera_init(void) +{ +	int err; + +	/* +	 * GPIO50_nCAM_EN is active low +	 * GPIO19_GEN1_CAM_RST is active on rising edge +	 */ +	err = gpio_request(GPIO50_nCAM_EN, "nCAM_EN"); +	if (err) { +		pr_err("%s: Failed to request nCAM_EN\n", __func__); +		goto fail; +	} + +	err = gpio_request(GPIO19_GEN1_CAM_RST, "CAM_RST"); +	if (err) { +		pr_err("%s: Failed to request CAM_RST\n", __func__); +		goto fail_gpio_cam_rst; +	} + +	gpio_direction_output(GPIO50_nCAM_EN, 1); +	gpio_direction_output(GPIO19_GEN1_CAM_RST, 0); + +	return 0; + +fail_gpio_cam_rst: +	gpio_free(GPIO50_nCAM_EN); +fail: +	return err; +} + +static int a780_camera_power(struct device *dev, int on) +{ +	gpio_set_value(GPIO50_nCAM_EN, !on); +	return 0; +} + +static int a780_camera_reset(struct device *dev) +{ +	gpio_set_value(GPIO19_GEN1_CAM_RST, 0); +	msleep(10); +	gpio_set_value(GPIO19_GEN1_CAM_RST, 1); + +	return 0; +} + +struct pxacamera_platform_data a780_pxacamera_platform_data = { +	.flags  = PXA_CAMERA_MASTER | PXA_CAMERA_DATAWIDTH_8 | +		PXA_CAMERA_PCLK_EN | PXA_CAMERA_MCLK_EN, +	.mclk_10khz = 5000, +}; + +static struct i2c_board_info a780_camera_i2c_board_info = { +	I2C_BOARD_INFO("mt9m111", 0x5d), +}; + +static struct soc_camera_link a780_iclink = { +	.bus_id         = 0, +	.flags          = SOCAM_SENSOR_INVERT_PCLK, +	.i2c_adapter_id = 0, +	.board_info     = &a780_camera_i2c_board_info, +	.module_name    = "mt9m111", +	.power          = a780_camera_power, +	.reset          = a780_camera_reset, +}; + +static struct platform_device a780_camera = { +	.name   = "soc-camera-pdrv", +	.id     = 0, +	.dev    = { +		.platform_data = &a780_iclink, +	}, +}; +  static struct platform_device *a780_devices[] __initdata = {  	&a780_gpio_keys,  }; @@ -693,12 +776,21 @@ static void __init a780_init(void)  	pxa2xx_mfp_config(ARRAY_AND_SIZE(gen1_pin_config));  	pxa2xx_mfp_config(ARRAY_AND_SIZE(a780_pin_config)); +	pxa_set_ffuart_info(NULL); +	pxa_set_btuart_info(NULL); +	pxa_set_stuart_info(NULL); +  	pxa_set_i2c_info(NULL);  	set_pxa_fb_info(&ezx_fb_info_1);  	pxa_set_keypad_info(&a780_keypad_platform_data); +	if (a780_camera_init() == 0) { +		pxa_set_camera_info(&a780_pxacamera_platform_data); +		platform_device_register(&a780_camera); +	} +  	platform_add_devices(ARRAY_AND_SIZE(ezx_devices));  	platform_add_devices(ARRAY_AND_SIZE(a780_devices));  } @@ -754,6 +846,10 @@ static void __init e680_init(void)  	pxa2xx_mfp_config(ARRAY_AND_SIZE(gen1_pin_config));  	pxa2xx_mfp_config(ARRAY_AND_SIZE(e680_pin_config)); +	pxa_set_ffuart_info(NULL); +	pxa_set_btuart_info(NULL); +	pxa_set_stuart_info(NULL); +  	pxa_set_i2c_info(NULL);  	i2c_register_board_info(0, ARRAY_AND_SIZE(e680_i2c_board_info)); @@ -816,6 +912,10 @@ static void __init a1200_init(void)  	pxa2xx_mfp_config(ARRAY_AND_SIZE(gen2_pin_config));  	pxa2xx_mfp_config(ARRAY_AND_SIZE(a1200_pin_config)); +	pxa_set_ffuart_info(NULL); +	pxa_set_btuart_info(NULL); +	pxa_set_stuart_info(NULL); +  	pxa_set_i2c_info(NULL);  	i2c_register_board_info(0, ARRAY_AND_SIZE(a1200_i2c_board_info)); @@ -864,6 +964,131 @@ static struct platform_device a910_gpio_keys = {  	},  }; +/* camera */ +static int a910_camera_init(void) +{ +	int err; + +	/* +	 * GPIO50_nCAM_EN is active low +	 * GPIO28_GEN2_CAM_RST is active on rising edge +	 */ +	err = gpio_request(GPIO50_nCAM_EN, "nCAM_EN"); +	if (err) { +		pr_err("%s: Failed to request nCAM_EN\n", __func__); +		goto fail; +	} + +	err = gpio_request(GPIO28_GEN2_CAM_RST, "CAM_RST"); +	if (err) { +		pr_err("%s: Failed to request CAM_RST\n", __func__); +		goto fail_gpio_cam_rst; +	} + +	gpio_direction_output(GPIO50_nCAM_EN, 1); +	gpio_direction_output(GPIO28_GEN2_CAM_RST, 0); + +	return 0; + +fail_gpio_cam_rst: +	gpio_free(GPIO50_nCAM_EN); +fail: +	return err; +} + +static int a910_camera_power(struct device *dev, int on) +{ +	gpio_set_value(GPIO50_nCAM_EN, !on); +	return 0; +} + +static int a910_camera_reset(struct device *dev) +{ +	gpio_set_value(GPIO28_GEN2_CAM_RST, 0); +	msleep(10); +	gpio_set_value(GPIO28_GEN2_CAM_RST, 1); + +	return 0; +} + +struct pxacamera_platform_data a910_pxacamera_platform_data = { +	.flags  = PXA_CAMERA_MASTER | PXA_CAMERA_DATAWIDTH_8 | +		PXA_CAMERA_PCLK_EN | PXA_CAMERA_MCLK_EN, +	.mclk_10khz = 5000, +}; + +static struct i2c_board_info a910_camera_i2c_board_info = { +	I2C_BOARD_INFO("mt9m111", 0x5d), +}; + +static struct soc_camera_link a910_iclink = { +	.bus_id         = 0, +	.i2c_adapter_id = 0, +	.board_info     = &a910_camera_i2c_board_info, +	.module_name    = "mt9m111", +	.power          = a910_camera_power, +	.reset          = a910_camera_reset, +}; + +static struct platform_device a910_camera = { +	.name   = "soc-camera-pdrv", +	.id     = 0, +	.dev    = { +		.platform_data = &a910_iclink, +	}, +}; + +/* leds-lp3944 */ +static struct lp3944_platform_data a910_lp3944_leds = { +	.leds_size = LP3944_LEDS_MAX, +	.leds = { +		[0] = { +			.name = "a910:red:", +			.status = LP3944_LED_STATUS_OFF, +			.type = LP3944_LED_TYPE_LED, +		}, +		[1] = { +			.name = "a910:green:", +			.status = LP3944_LED_STATUS_OFF, +			.type = LP3944_LED_TYPE_LED, +		}, +		[2] { +			.name = "a910:blue:", +			.status = LP3944_LED_STATUS_OFF, +			.type = LP3944_LED_TYPE_LED, +		}, +		/* Leds 3 and 4 are used as display power switches */ +		[3] = { +			.name = "a910::cli_display", +			.status = LP3944_LED_STATUS_OFF, +			.type = LP3944_LED_TYPE_LED_INVERTED +		}, +		[4] = { +			.name = "a910::main_display", +			.status = LP3944_LED_STATUS_ON, +			.type = LP3944_LED_TYPE_LED_INVERTED +		}, +		[5] = { .type = LP3944_LED_TYPE_NONE }, +		[6] = { +			.name = "a910::torch", +			.status = LP3944_LED_STATUS_OFF, +			.type = LP3944_LED_TYPE_LED, +		}, +		[7] = { +			.name = "a910::flash", +			.status = LP3944_LED_STATUS_OFF, +			.type = LP3944_LED_TYPE_LED_INVERTED, +		}, +	}, +}; + +static struct i2c_board_info __initdata a910_i2c_board_info[] = { +	{ +		I2C_BOARD_INFO("lp3944", 0x60), +		.platform_data = &a910_lp3944_leds, +	}, +}; +  static struct platform_device *a910_devices[] __initdata = {  	&a910_gpio_keys,  }; @@ -874,12 +1099,22 @@ static void __init a910_init(void)  	pxa2xx_mfp_config(ARRAY_AND_SIZE(gen2_pin_config));  	pxa2xx_mfp_config(ARRAY_AND_SIZE(a910_pin_config)); +	pxa_set_ffuart_info(NULL); +	pxa_set_btuart_info(NULL); +	pxa_set_stuart_info(NULL); +  	pxa_set_i2c_info(NULL); +	i2c_register_board_info(0, ARRAY_AND_SIZE(a910_i2c_board_info));  	set_pxa_fb_info(&ezx_fb_info_2);  	pxa_set_keypad_info(&a910_keypad_platform_data); +	if (a910_camera_init() == 0) { +		pxa_set_camera_info(&a910_pxacamera_platform_data); +		platform_device_register(&a910_camera); +	} +  	platform_add_devices(ARRAY_AND_SIZE(ezx_devices));  	platform_add_devices(ARRAY_AND_SIZE(a910_devices));  } @@ -935,6 +1170,10 @@ static void __init e6_init(void)  	pxa2xx_mfp_config(ARRAY_AND_SIZE(gen2_pin_config));  	pxa2xx_mfp_config(ARRAY_AND_SIZE(e6_pin_config)); +	pxa_set_ffuart_info(NULL); +	pxa_set_btuart_info(NULL); +	pxa_set_stuart_info(NULL); +  	pxa_set_i2c_info(NULL);  	i2c_register_board_info(0, ARRAY_AND_SIZE(e6_i2c_board_info)); @@ -971,6 +1210,10 @@ static void __init e2_init(void)  	pxa2xx_mfp_config(ARRAY_AND_SIZE(gen2_pin_config));  	pxa2xx_mfp_config(ARRAY_AND_SIZE(e2_pin_config)); +	pxa_set_ffuart_info(NULL); +	pxa_set_btuart_info(NULL); +	pxa_set_stuart_info(NULL); +  	pxa_set_i2c_info(NULL);  	i2c_register_board_info(0, ARRAY_AND_SIZE(e2_i2c_board_info));  |