Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 77316f05 authored by Sekhar Nori's avatar Sekhar Nori Committed by Kevin Hilman
Browse files

davinci: DA830/OMAP-L137 EVM: use runtime detection for UI card



This patch supports runtime detection of DA830 UI card and
eliminates the need for DA830_UI config option. Successful
probe of GPIO expander present on the UI card is used to
detect its presence. For this reason, GPIO_PCF857X is auto-
selected when DA830 EVM is configured. In case the UI card
is absent, the probe fails in reasonable time.

As a side effect this patch also gets rid of the voilation
of Documentation/SubmittingPatches section 2.2 in function
da830_evm_ui_expander_setup()

Signed-off-by: default avatarSekhar Nori <nsekhar@ti.com>
Signed-off-by: default avatarKevin Hilman <khilman@deeprootsystems.com>
parent a0433ac3
Loading
Loading
Loading
Loading
+7 −10
Original line number Original line Diff line number Diff line
@@ -100,21 +100,18 @@ config MACH_DAVINCI_DA830_EVM
	bool "TI DA830/OMAP-L137 Reference Platform"
	bool "TI DA830/OMAP-L137 Reference Platform"
	default ARCH_DAVINCI_DA830
	default ARCH_DAVINCI_DA830
	depends on ARCH_DAVINCI_DA830
	depends on ARCH_DAVINCI_DA830
	select GPIO_PCF857X
	help
	help
	  Say Y here to select the TI DA830/OMAP-L137 Evaluation Module.
	  Say Y here to select the TI DA830/OMAP-L137 Evaluation Module.


config DA830_UI
	bool "DA830/OMAP-L137 UI (User Interface) board support"
	depends on MACH_DAVINCI_DA830_EVM
	help
	  Say Y here if you have the DA830/OMAP-L137 UI
	  (User Interface) board installed and you want to
	  enable the peripherals located on User Interface
	  board.

choice
choice
	prompt "Select DA830/OMAP-L137 UI board peripheral"
	prompt "Select DA830/OMAP-L137 UI board peripheral"
	depends on DA830_UI
	depends on MACH_DAVINCI_DA830_EVM
	help
	  The presence of UI card on the DA830/OMAP-L137 EVM is detected
	  automatically based on successful probe of the I2C based GPIO
	  expander on that board. This option selected in this menu has
	  an effect only in case of a successful UI card detection.


config DA830_UI_LCD
config DA830_UI_LCD
	bool "LCD"
	bool "LCD"
+60 −60
Original line number Original line Diff line number Diff line
@@ -36,58 +36,6 @@
#define DA830_EMIF25_ASYNC_DATA_CE3_BASE	0x62000000
#define DA830_EMIF25_ASYNC_DATA_CE3_BASE	0x62000000
#define DA830_EMIF25_CONTROL_BASE		0x68000000
#define DA830_EMIF25_CONTROL_BASE		0x68000000


static struct at24_platform_data da830_evm_i2c_eeprom_info = {
	.byte_len	= SZ_256K / 8,
	.page_size	= 64,
	.flags		= AT24_FLAG_ADDR16,
	.setup		= davinci_get_mac_addr,
	.context	= (void *)0x7f00,
};

static int da830_evm_ui_expander_setup(struct i2c_client *client, int gpio,
		unsigned ngpio, void *context)
{
	gpio_request(gpio + 6, "MUX_MODE");
#ifdef CONFIG_DA830_UI_LCD
	gpio_direction_output(gpio + 6, 0);
#else /* Must be NAND or NOR */
	gpio_direction_output(gpio + 6, 1);
#endif
	return 0;
}

static int da830_evm_ui_expander_teardown(struct i2c_client *client, int gpio,
		unsigned ngpio, void *context)
{
	gpio_free(gpio + 6);
	return 0;
}

static struct pcf857x_platform_data da830_evm_ui_expander_info = {
	.gpio_base	= DAVINCI_N_GPIO,
	.setup		= da830_evm_ui_expander_setup,
	.teardown	= da830_evm_ui_expander_teardown,
};

static struct i2c_board_info __initdata da830_evm_i2c_devices[] = {
	{
		I2C_BOARD_INFO("24c256", 0x50),
		.platform_data	= &da830_evm_i2c_eeprom_info,
	},
	{
		I2C_BOARD_INFO("tlv320aic3x", 0x18),
	},
	{
		I2C_BOARD_INFO("pcf8574", 0x3f),
		.platform_data	= &da830_evm_ui_expander_info,
	},
};

static struct davinci_i2c_platform_data da830_evm_i2c_0_pdata = {
	.bus_freq	= 100,	/* kHz */
	.bus_delay	= 0,	/* usec */
};

/*
/*
 * USB1 VBUS is controlled by GPIO1[15], over-current is reported on GPIO2[4].
 * USB1 VBUS is controlled by GPIO1[15], over-current is reported on GPIO2[4].
 */
 */
@@ -425,7 +373,7 @@ static struct platform_device da830_evm_nand_device = {
	.resource	= da830_evm_nand_resources,
	.resource	= da830_evm_nand_resources,
};
};


static inline void da830_evm_init_nand(void)
static inline void da830_evm_init_nand(int mux_mode)
{
{
	int ret;
	int ret;


@@ -437,13 +385,15 @@ static inline void da830_evm_init_nand(void)
	ret = platform_device_register(&da830_evm_nand_device);
	ret = platform_device_register(&da830_evm_nand_device);
	if (ret)
	if (ret)
		pr_warning("da830_evm_init: NAND device not registered.\n");
		pr_warning("da830_evm_init: NAND device not registered.\n");

	gpio_direction_output(mux_mode, 1);
}
}
#else
#else
static inline void da830_evm_init_nand(void) { }
static inline void da830_evm_init_nand(int mux_mode) { }
#endif
#endif


#ifdef CONFIG_DA830_UI_LCD
#ifdef CONFIG_DA830_UI_LCD
static inline void da830_evm_init_lcdc(void)
static inline void da830_evm_init_lcdc(int mux_mode)
{
{
	int ret;
	int ret;


@@ -455,11 +405,65 @@ static inline void da830_evm_init_lcdc(void)
	ret = da8xx_register_lcdc(&sharp_lcd035q3dg01_pdata);
	ret = da8xx_register_lcdc(&sharp_lcd035q3dg01_pdata);
	if (ret)
	if (ret)
		pr_warning("da830_evm_init: lcd setup failed: %d\n", ret);
		pr_warning("da830_evm_init: lcd setup failed: %d\n", ret);

	gpio_direction_output(mux_mode, 0);
}
}
#else
#else
static inline void da830_evm_init_lcdc(void) { }
static inline void da830_evm_init_lcdc(int mux_mode) { }
#endif
#endif


static struct at24_platform_data da830_evm_i2c_eeprom_info = {
	.byte_len	= SZ_256K / 8,
	.page_size	= 64,
	.flags		= AT24_FLAG_ADDR16,
	.setup		= davinci_get_mac_addr,
	.context	= (void *)0x7f00,
};

static int da830_evm_ui_expander_setup(struct i2c_client *client, int gpio,
		unsigned ngpio, void *context)
{
	gpio_request(gpio + 6, "UI MUX_MODE");

	da830_evm_init_lcdc(gpio + 6);

	da830_evm_init_nand(gpio + 6);

	return 0;
}

static int da830_evm_ui_expander_teardown(struct i2c_client *client, int gpio,
		unsigned ngpio, void *context)
{
	gpio_free(gpio + 6);
	return 0;
}

static struct pcf857x_platform_data da830_evm_ui_expander_info = {
	.gpio_base	= DAVINCI_N_GPIO,
	.setup		= da830_evm_ui_expander_setup,
	.teardown	= da830_evm_ui_expander_teardown,
};

static struct i2c_board_info __initdata da830_evm_i2c_devices[] = {
	{
		I2C_BOARD_INFO("24c256", 0x50),
		.platform_data	= &da830_evm_i2c_eeprom_info,
	},
	{
		I2C_BOARD_INFO("tlv320aic3x", 0x18),
	},
	{
		I2C_BOARD_INFO("pcf8574", 0x3f),
		.platform_data	= &da830_evm_ui_expander_info,
	},
};

static struct davinci_i2c_platform_data da830_evm_i2c_0_pdata = {
	.bus_freq	= 100,	/* kHz */
	.bus_delay	= 0,	/* usec */
};

static __init void da830_evm_init(void)
static __init void da830_evm_init(void)
{
{
	struct davinci_soc_info *soc_info = &davinci_soc_info;
	struct davinci_soc_info *soc_info = &davinci_soc_info;
@@ -514,10 +518,6 @@ static __init void da830_evm_init(void)


	da830_evm_init_mmc();
	da830_evm_init_mmc();


	da830_evm_init_lcdc();

	da830_evm_init_nand();

	ret = da8xx_register_rtc();
	ret = da8xx_register_rtc();
	if (ret)
	if (ret)
		pr_warning("da830_evm_init: rtc setup failed: %d\n", ret);
		pr_warning("da830_evm_init: rtc setup failed: %d\n", ret);