Commit 76e3fc36 authored by Mike Rapoport's avatar Mike Rapoport Committed by Eric Miao
Browse files

[ARM] pxa/em-x270: add exeda GPIO extender and update GPIO mappings

parent 1ce2c51e
Loading
Loading
Loading
Loading
+46 −18
Original line number Diff line number Diff line
@@ -28,6 +28,8 @@
#include <linux/spi/libertas_spi.h>
#include <linux/power_supply.h>
#include <linux/apm-emulation.h>
#include <linux/i2c.h>
#include <linux/i2c/pca953x.h>

#include <media/soc_camera.h>

@@ -52,15 +54,18 @@
#define GPIO13_MMC_CD		(13)
#define GPIO95_MMC_WP		(95)
#define GPIO56_NAND_RB		(56)
#define GPIO93_CAM_RESET	(93)

/* eXeda specific GPIOs */
#define GPIO114_MMC_CD		(114)
#define GPIO20_NAND_RB		(20)
#define GPIO38_SD_PWEN		(38)
#define GPIO37_WLAN_RST		(37)
#define GPIO95_TOUCHPAD_INT	(95)
#define GPIO130_CAM_RESET	(130)

/* common  GPIOs */
#define GPIO11_NAND_CS		(11)
#define GPIO93_CAM_RESET	(93)
#define GPIO41_ETHIRQ		(41)
#define EM_X270_ETHIRQ		IRQ_GPIO(GPIO41_ETHIRQ)
#define GPIO115_WLAN_PWEN	(115)
@@ -69,6 +74,7 @@
static int mmc_cd;
static int nand_rb;
static int dm9000_flags;
static int cam_reset;

static unsigned long common_pin_config[] = {
	/* AC'97 */
@@ -180,7 +186,6 @@ static unsigned long common_pin_config[] = {

	/* power controls */
	GPIO20_GPIO	| MFP_LPM_DRIVE_LOW,	/* GPRS_PWEN */
	GPIO93_GPIO	| MFP_LPM_DRIVE_LOW,	/* Camera reset */
	GPIO115_GPIO	| MFP_LPM_DRIVE_LOW,	/* WLAN_PWEN */

	/* NAND controls */
@@ -193,12 +198,14 @@ static unsigned long common_pin_config[] = {
static unsigned long em_x270_pin_config[] = {
	GPIO13_GPIO,				/* MMC card detect */
	GPIO56_GPIO,				/* NAND Ready/Busy */
	GPIO93_GPIO	| MFP_LPM_DRIVE_LOW,	/* Camera reset */
	GPIO95_GPIO,				/* MMC Write protect */
};

static unsigned long exeda_pin_config[] = {
	GPIO20_GPIO,				/* NAND Ready/Busy */
	GPIO38_GPIO	| MFP_LPM_DRIVE_LOW,	/* SD slot power */
	GPIO95_GPIO,				/* touchpad IRQ */
	GPIO114_GPIO,				/* MMC card detect */
};

@@ -863,26 +870,26 @@ static int em_x270_sensor_init(struct device *dev)
{
	int ret;

	ret = gpio_request(GPIO93_CAM_RESET, "camera reset");
	ret = gpio_request(cam_reset, "camera reset");
	if (ret)
		return ret;

	gpio_direction_output(GPIO93_CAM_RESET, 0);
	gpio_direction_output(cam_reset, 0);

	em_x270_camera_ldo = regulator_get(NULL, "vcc cam");
	if (em_x270_camera_ldo == NULL) {
		gpio_free(GPIO93_CAM_RESET);
		gpio_free(cam_reset);
		return -ENODEV;
	}

	ret = regulator_enable(em_x270_camera_ldo);
	if (ret) {
		regulator_put(em_x270_camera_ldo);
		gpio_free(GPIO93_CAM_RESET);
		gpio_free(cam_reset);
		return ret;
	}

	gpio_set_value(GPIO93_CAM_RESET, 1);
	gpio_set_value(cam_reset, 1);

	return 0;
}
@@ -902,7 +909,7 @@ static int em_x270_sensor_power(struct device *dev, int on)
	if (on == is_on)
		return 0;

	gpio_set_value(GPIO93_CAM_RESET, !on);
	gpio_set_value(cam_reset, !on);

	if (on)
		ret = regulator_enable(em_x270_camera_ldo);
@@ -912,7 +919,7 @@ static int em_x270_sensor_power(struct device *dev, int on)
	if (ret)
		return ret;

	gpio_set_value(GPIO93_CAM_RESET, on);
	gpio_set_value(cam_reset, on);

	return 0;
}
@@ -929,13 +936,8 @@ static struct i2c_board_info em_x270_i2c_cam_info[] = {
	},
};

static struct i2c_pxa_platform_data em_x270_i2c_info = {
	.fast_mode = 1,
};

static void  __init em_x270_init_camera(void)
{
	pxa_set_i2c_info(&em_x270_i2c_info);
	i2c_register_board_info(0, ARRAY_AND_SIZE(em_x270_i2c_cam_info));
	pxa_set_camera_info(&em_x270_camera_platform_data);
}
@@ -1069,6 +1071,29 @@ static void __init em_x270_init_da9030(void)
	i2c_register_board_info(1, &em_x270_i2c_pmic_info, 1);
}

static struct pca953x_platform_data exeda_gpio_ext_pdata = {
	.gpio_base = 128,
};

static struct i2c_board_info exeda_i2c_info[] = {
	{
		I2C_BOARD_INFO("pca9555", 0x21),
		.platform_data = &exeda_gpio_ext_pdata,
	},
};

static struct i2c_pxa_platform_data em_x270_i2c_info = {
	.fast_mode = 1,
};

static void __init em_x270_init_i2c(void)
{
	pxa_set_i2c_info(&em_x270_i2c_info);

	if (machine_is_exeda())
		i2c_register_board_info(0, ARRAY_AND_SIZE(exeda_i2c_info));
}

static void __init em_x270_module_init(void)
{
	pr_info("%s\n", __func__);
@@ -1077,6 +1102,7 @@ static void __init em_x270_module_init(void)
	mmc_cd = GPIO13_MMC_CD;
	nand_rb = GPIO56_NAND_RB;
	dm9000_flags = DM9000_PLATF_32BITONLY;
	cam_reset = GPIO93_CAM_RESET;
}

static void __init em_x270_exeda_init(void)
@@ -1087,6 +1113,7 @@ static void __init em_x270_exeda_init(void)
	mmc_cd = GPIO114_MMC_CD;
	nand_rb = GPIO20_NAND_RB;
	dm9000_flags = DM9000_PLATF_16BITONLY;
	cam_reset = GPIO130_CAM_RESET;
}

static void __init em_x270_init(void)
@@ -1111,8 +1138,9 @@ static void __init em_x270_init(void)
	em_x270_init_keypad();
	em_x270_init_gpio_keys();
	em_x270_init_ac97();
	em_x270_init_camera();
	em_x270_init_spi();
	em_x270_init_i2c();
	em_x270_init_camera();
}

MACHINE_START(EM_X270, "Compulab EM-X270")