Skip to contentSkip to conversation

arm: omap3evm: Add support for an MT9M032 based camera board.

PATCH Superseded Martin Hostettler 6 participants 13 messages Sep 17, 2011 – Sep 19, 2011

Subsystems (4)

v2 of 4 Superseded Latest is v4 →

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 arm: omap3evm: Add support for an MT9M032 based camera board.

Adds board support for an MT9M032 based camera to omap3evm.

---
 arch/arm/mach-omap2/Makefile                |    1 +
 arch/arm/mach-omap2/board-omap3evm-camera.c |  183 +++++++++++++++++++++++++++
 2 files changed, 184 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/mach-omap2/board-omap3evm-camera.c

Changes in V2:
* ported to current mainline
* Style fixes
* Fix error handling

arch/arm/mach-omap2/Makefile +1 -0
index f343365..8ae3d25 100644
@@ -202,6 +202,7 @@ obj-$(CONFIG_MACH_OMAP3_TORPEDO)        += board-omap3logic.o \
 obj-$(CONFIG_MACH_OVERO)		+= board-overo.o \
 					   hsmmc.o
 obj-$(CONFIG_MACH_OMAP3EVM)		+= board-omap3evm.o \
+					   board-omap3evm-camera.o \
 					   hsmmc.o
 obj-$(CONFIG_MACH_OMAP3_PANDORA)	+= board-omap3pandora.o \
 					   hsmmc.o
arch/arm/mach-omap2/board-omap3evm-camera.c new file +183 -0

183 lines not on this page · raw message

Signature · 1 line
1.7.2.5
#1 lore raw

PATCH v2 1/1 arm: omap3evm: Add support for an MT9M032 based camera board.

Quoted 1 line · Martin Hostettler

Adds board support for an MT9M032 based camera to omap3evm.

All of the logging messages could be
prefixed by the printk subsystem if you
add #define pr_fmt before any #include

arch/arm/mach-omap2/board-omap3evm-camera.c

Quoted 1 line
arch/arm/mach-omap2/board-omap3evm-camera.c +0 -0

[]
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
[]

Quoted 1 line

+static int omap3evm_set_mux(enum omap3evmdc_mux mux_id)

[]

arch/arm/mach-omap2/board-omap3evm-camera.c line 62

Quoted 1 line
arch/arm/mach-omap2/board-omap3evm-camera.c +1 -0
+	switch (mux_id) {

[]

arch/arm/mach-omap2/board-omap3evm-camera.c line 78

Quoted 2 lines
arch/arm/mach-omap2/board-omap3evm-camera.c +2 -0
+	default:
+		pr_err("omap3evm-camera: Invalid mux id #%d\n", mux_id);
		pr_err("Invalid mux id #%d\n", mux_id);

[]

Quoted 1 line

+static int __init camera_init(void)

[]

arch/arm/mach-omap2/board-omap3evm-camera.c line 134

Quoted 3 lines
arch/arm/mach-omap2/board-omap3evm-camera.c +3 -0
+	if (gpio_request(nCAM_VD_SEL, "nCAM_VD_SEL") < 0) {
+		pr_err("omap3evm-camera: Failed to get GPIO nCAM_VD_SEL(%d)\n",
+		       nCAM_VD_SEL);
		pr_err("Failed to get GPIO nCAM_VD_SEL(%d)\n",
		       nCAM_VD_SEL);

etc.

#2 lore raw

PATCH v2 1/1 arm: omap3evm: Add support for an MT9M032 based camera board.

Quoted 6 lines · Joe Perches
Quoted 1 line · Martin Hostettler

Adds board support for an MT9M032 based camera to omap3evm.

All of the logging messages could be
prefixed by the printk subsystem if you
add #define pr_fmt before any #include

Ah, i didn't really knew about that feature yet. I really have to keep that in mind when grepping for error messages in the future.

But i don't think it would help much, as i now reducted the total number of pr_err calls to 2 in this patch.

Thanks for the idea anyway.

- Martin Hostettler

Quoted 24 lines

arch/arm/mach-omap2/board-omap3evm-camera.c

Quoted 2 lines
arch/arm/mach-omap2/board-omap3evm-camera.c +0 -0

[]
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
[]

Quoted 1 line

+static int omap3evm_set_mux(enum omap3evmdc_mux mux_id)

[]

arch/arm/mach-omap2/board-omap3evm-camera.c line 62

Quoted 1 line
arch/arm/mach-omap2/board-omap3evm-camera.c +1 -0
+	switch (mux_id) {

[]

arch/arm/mach-omap2/board-omap3evm-camera.c line 78

Quoted 2 lines
arch/arm/mach-omap2/board-omap3evm-camera.c +2 -0
+	default:
+		pr_err("omap3evm-camera: Invalid mux id #%d\n", mux_id);
		pr_err("Invalid mux id #%d\n", mux_id);

[]

Quoted 1 line

+static int __init camera_init(void)

[]

arch/arm/mach-omap2/board-omap3evm-camera.c line 134

Quoted 3 lines
arch/arm/mach-omap2/board-omap3evm-camera.c +3 -0
+	if (gpio_request(nCAM_VD_SEL, "nCAM_VD_SEL") < 0) {
+		pr_err("omap3evm-camera: Failed to get GPIO nCAM_VD_SEL(%d)\n",
+		       nCAM_VD_SEL);
		pr_err("Failed to get GPIO nCAM_VD_SEL(%d)\n",
		       nCAM_VD_SEL);

etc.

#3 lore raw

PATCH v2 1/1 arm: omap3evm: Add support for an MT9M032 based camera board.

In reply to Martin Hostettler
Quoted 1 line · Martin Hostettler

Adds board support for an MT9M032 based camera to omap3evm.

...

Quoted 6 lines
arch/arm/mach-omap2/board-omap3evm-camera.c new file +6 -0
+
+static int __init camera_init(void)
+{
+	int ret = -EINVAL;
+	
+	omap_mux_init_gpio(nCAM_VD_SEL, OMAP_PIN_OUTPUT);

arch/arm/mach-omap2/board-omap3evm-camera.c line 141

Quoted 10 lines
arch/arm/mach-omap2/board-omap3evm-camera.c new file +10 -0
+	if (gpio_request(nCAM_VD_SEL, "nCAM_VD_SEL")<  0) {
+		pr_err("omap3evm-camera: Failed to get GPIO nCAM_VD_SEL(%d)\n",
+		       nCAM_VD_SEL);
+		goto err;
+	}
+	if (gpio_direction_output(nCAM_VD_SEL, 1)<  0) {
+		pr_err("omap3evm-camera: Failed to set GPIO nCAM_VD_SEL(%d) direction\n",
+		       nCAM_VD_SEL);
+		goto err_vdsel;
+	}

How about replacing gpio_request + gpio_direction_output with:

	gpio_request_one(nCAM_VD_SEL, GPIOF_OUT_INIT_HIGH, "nCAM_VD_SEL");

arch/arm/mach-omap2/board-omap3evm-camera.c line 152

Quoted 11 lines
arch/arm/mach-omap2/board-omap3evm-camera.c new file +11 -0
+
+	if (gpio_request(EVM_TWL_GPIO_BASE + 2, "T2_GPIO2")<  0) {
+		pr_err("omap3evm-camera: Failed to get GPIO T2_GPIO2(%d)\n",
+		       EVM_TWL_GPIO_BASE + 2);
+		goto err_vdsel;
+	}
+	if (gpio_direction_output(EVM_TWL_GPIO_BASE + 2, 0)<  0) {
+		pr_err("omap3evm-camera: Failed to set GPIO T2_GPIO2(%d) direction\n",
+		       EVM_TWL_GPIO_BASE + 2);
+		goto err_2;
+	}

gpio_request_one(EVM_TWL_GPIO_BASE + 2, GPIOF_OUT_INIT_LOW, "T2_GPIO2");

arch/arm/mach-omap2/board-omap3evm-camera.c line 163

Quoted 11 lines
arch/arm/mach-omap2/board-omap3evm-camera.c new file +11 -0
+
+	if (gpio_request(EVM_TWL_GPIO_BASE + 8, "nCAM_VD_EN")<  0) {
+		pr_err("omap3evm-camera: Failed to get GPIO nCAM_VD_EN(%d)\n",
+		       EVM_TWL_GPIO_BASE + 8);
+		goto err_2;
+	}
+	if (gpio_direction_output(EVM_TWL_GPIO_BASE + 8, 0)<  0) {
+		pr_err("omap3evm-camera: Failed to set GPIO nCAM_VD_EN(%d) direction\n",
+		       EVM_TWL_GPIO_BASE + 8);
+		goto err_8;
+	}

...and gpio_request_one(EVM_TWL_GPIO_BASE + 8, GPIOF_OUT_INIT_LOW, "nCAM_VD_EN") ?

Quoted 10 lines
arch/arm/mach-omap2/board-omap3evm-camera.c new file +10 -0
+
+	omap3evm_set_mux(MUX_CAMERA_SENSOR);
+
+	
+	ret = omap3_init_camera(&isp_platform_data);
+	if (ret<  0)
+		goto err_8;
+	return 0;
+	
+err_8:

arch/arm/mach-omap2/board-omap3evm-camera.c line 183

Quoted 10 lines
arch/arm/mach-omap2/board-omap3evm-camera.c new file +10 -0
+	gpio_free(EVM_TWL_GPIO_BASE + 8);
+err_2:
+	gpio_free(EVM_TWL_GPIO_BASE + 2);
+err_vdsel:
+	gpio_free(nCAM_VD_SEL);
+err:
+	return ret;
+}
+
+device_initcall(camera_init);

--
Regards,
Sylwester

#4 lore raw

PATCH v2 1/1 arm: omap3evm: Add support for an MT9M032 based camera board.

Quoted 24 lines · On Sunday 18 September 2011 00:00:16 Sylwester Nawrocki wrote:
Quoted 1 line · Martin Hostettler

Adds board support for an MT9M032 based camera to omap3evm.

...

Quoted 14 lines
arch/arm/mach-omap2/board-omap3evm-camera.c new file +13 -0
+
+static int __init camera_init(void)
+{
+	int ret = -EINVAL;
+
+	omap_mux_init_gpio(nCAM_VD_SEL, OMAP_PIN_OUTPUT);
+	if (gpio_request(nCAM_VD_SEL, "nCAM_VD_SEL")<  0) {
+		pr_err("omap3evm-camera: Failed to get GPIO nCAM_VD_SEL(%d)\n",
+		       nCAM_VD_SEL);
+		goto err;
+	}
+	if (gpio_direction_output(nCAM_VD_SEL, 1)<  0) {
+		pr_err("omap3evm-camera: Failed to set GPIO nCAM_VD_SEL(%d)

direction\n", + nCAM_VD_SEL);

Review

Quoted 2 lines
(quoted diff) +2 -0
+		goto err_vdsel;
+	}

How about replacing gpio_request + gpio_direction_output with:

Quoted 1 line
	gpio_request_one(nCAM_VD_SEL, GPIOF_OUT_INIT_HIGH, "nCAM_VD_SEL");

I'd even propose gpio_request_array().

Quoted 8 lines

arch/arm/mach-omap2/board-omap3evm-camera.c

Quoted 8 lines
arch/arm/mach-omap2/board-omap3evm-camera.c new file +8 -0
+
+	if (gpio_request(EVM_TWL_GPIO_BASE + 2, "T2_GPIO2")<  0) {
+		pr_err("omap3evm-camera: Failed to get GPIO T2_GPIO2(%d)\n",
+		       EVM_TWL_GPIO_BASE + 2);
+		goto err_vdsel;
+	}
+	if (gpio_direction_output(EVM_TWL_GPIO_BASE + 2, 0)<  0) {
+		pr_err("omap3evm-camera: Failed to set GPIO T2_GPIO2(%d) 

direction\n",

Quoted 41 lines

arch/arm/mach-omap2/board-omap3evm-camera.c line 152

Quoted 3 lines
arch/arm/mach-omap2/board-omap3evm-camera.c new file +3 -0
+		       EVM_TWL_GPIO_BASE + 2);
+		goto err_2;
+	}

gpio_request_one(EVM_TWL_GPIO_BASE + 2, GPIOF_OUT_INIT_LOW, "T2_GPIO2");

Review

Quoted 11 lines
arch/arm/mach-omap2/board-omap3evm-camera.c new file +8 -0
+
+	if (gpio_request(EVM_TWL_GPIO_BASE + 8, "nCAM_VD_EN")<  0) {
+		pr_err("omap3evm-camera: Failed to get GPIO nCAM_VD_EN(%d)\n",
+		       EVM_TWL_GPIO_BASE + 8);
+		goto err_2;
+	}
+	if (gpio_direction_output(EVM_TWL_GPIO_BASE + 8, 0)<  0) {
+		pr_err("omap3evm-camera: Failed to set GPIO nCAM_VD_EN(%d)

direction\n", + EVM_TWL_GPIO_BASE + 8);

(quoted diff) +2 -0
+		goto err_8;
+	}

...and gpio_request_one(EVM_TWL_GPIO_BASE + 8, GPIOF_OUT_INIT_LOW,
"nCAM_VD_EN") ?

Quoted 20 lines
arch/arm/mach-omap2/board-omap3evm-camera.c new file +20 -0
+
+	omap3evm_set_mux(MUX_CAMERA_SENSOR);
+
+
+	ret = omap3_init_camera(&isp_platform_data);
+	if (ret<  0)
+		goto err_8;
+	return 0;
+
+err_8:
+	gpio_free(EVM_TWL_GPIO_BASE + 8);
+err_2:
+	gpio_free(EVM_TWL_GPIO_BASE + 2);
+err_vdsel:
+	gpio_free(nCAM_VD_SEL);
+err:
+	return ret;
+}
+
+device_initcall(camera_init);
Signature · 3 lines
Regards,

Laurent Pinchart
#5 lore raw

PATCH v2 1/1 arm: omap3evm: Add support for an MT9M032 based camera board.

Quoted 25 lines · Laurent Pinchart
Quoted 24 lines · On Sunday 18 September 2011 00:00:16 Sylwester Nawrocki wrote:
Quoted 1 line · Martin Hostettler

Adds board support for an MT9M032 based camera to omap3evm.

...

Quoted 14 lines
arch/arm/mach-omap2/board-omap3evm-camera.c new file +13 -0
+
+static int __init camera_init(void)
+{
+	int ret = -EINVAL;
+
+	omap_mux_init_gpio(nCAM_VD_SEL, OMAP_PIN_OUTPUT);
+	if (gpio_request(nCAM_VD_SEL, "nCAM_VD_SEL")<  0) {
+		pr_err("omap3evm-camera: Failed to get GPIO nCAM_VD_SEL(%d)\n",
+		       nCAM_VD_SEL);
+		goto err;
+	}
+	if (gpio_direction_output(nCAM_VD_SEL, 1)<  0) {
+		pr_err("omap3evm-camera: Failed to set GPIO nCAM_VD_SEL(%d)

direction\n", + nCAM_VD_SEL);

Review

Quoted 2 lines
(quoted diff) +2 -0
+		goto err_vdsel;
+	}

How about replacing gpio_request + gpio_direction_output with:

Quoted 4 lines
Quoted 1 line
	gpio_request_one(nCAM_VD_SEL, GPIOF_OUT_INIT_HIGH, "nCAM_VD_SEL");

I'd even propose gpio_request_array().

Nice interface. Apart from a bit less detailed error reporting it nicely simplifies the code. I'll make a new patch using that soon.

- Martin Hostettler

#6 lore raw

PATCH v2 1/1 arm: omap3evm: Add support for an MT9M032 based camera board.

In reply to Martin Hostettler

Hi Martin,

Quoted 206 lines · On Saturday 17 September 2011 11:34:57 Martin Hostettler wrote:

Adds board support for an MT9M032 based camera to omap3evm.

---
 arch/arm/mach-omap2/Makefile                |    1 +
 arch/arm/mach-omap2/board-omap3evm-camera.c |  183
+++++++++++++++++++++++++++ 2 files changed, 184 insertions(+), 0
deletions(-)
 create mode 100644 arch/arm/mach-omap2/board-omap3evm-camera.c

Changes in V2:
* ported to current mainline
* Style fixes
* Fix error handling

arch/arm/mach-omap2/Makefile +1 -0
index f343365..8ae3d25 100644
@@ -202,6 +202,7 @@ obj-$(CONFIG_MACH_OMAP3_TORPEDO)        +=
 board-omap3logic.o \ obj-$(CONFIG_MACH_OVERO)		+= board-overo.o \
 					   hsmmc.o
 obj-$(CONFIG_MACH_OMAP3EVM)		+= board-omap3evm.o \
+					   board-omap3evm-camera.o \
 					   hsmmc.o
 obj-$(CONFIG_MACH_OMAP3_PANDORA)	+= board-omap3pandora.o \
 					   hsmmc.o
(quoted diff) +0 -0

b/arch/arm/mach-omap2/board-omap3evm-camera.c new file mode 100644 index 0000000..be987d9

arch/arm/mach-omap2/board-omap3evm-camera.c new file +6 -0
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2010-2011 Lund Engineering
+ * Contact: Gil Lund <[email protected]>
+ * Author: Martin Hostettler <[email protected]>
+ *
+ * Board intregration for a MT9M032 camera connected to IMAGE_CONN and I2C

Bus 2 + *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */

arch/arm/mach-omap2/board-omap3evm-camera.c new file +30 -0
+
+#include <linux/i2c.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+
+#include <linux/gpio.h>
+#include <plat/mux.h>
+#include "mux.h"
+
+#include "../../../drivers/media/video/omap3isp/isp.h"
+#include "media/mt9m032.h"
+
+#include "devices.h"
+
+#define EVM_TWL_GPIO_BASE OMAP_MAX_GPIO_LINES
+#define GPIO98_VID_DEC_RES	98
+#define nCAM_VD_SEL		157
+
+#define MT9M032_I2C_BUS_NUM	2
+
+
+enum omap3evmdc_mux {
+	MUX_TVP5146,
+	MUX_CAMERA_SENSOR,
+	MUX_EXP_CAMERA_SENSOR,
+};
+
+/**
+ * omap3evm_set_mux - Sets mux to enable signal routing to
+ *                           different peripherals present on new EVM

board + * @mux_id: enum, mux id to enable
+ *
+ * Returns 0 for success or a negative error code
+ */

arch/arm/mach-omap2/board-omap3evm-camera.c new file +83 -0
+static int omap3evm_set_mux(enum omap3evmdc_mux mux_id)
+{
+	/* Set GPIO6 = 1 */
+	gpio_set_value_cansleep(EVM_TWL_GPIO_BASE + 6, 1);
+	gpio_set_value_cansleep(EVM_TWL_GPIO_BASE + 2, 0);
+
+	switch (mux_id) {
+	case MUX_TVP5146:
+		gpio_set_value_cansleep(EVM_TWL_GPIO_BASE + 2, 0);
+		gpio_set_value(nCAM_VD_SEL, 1);
+		break;
+
+	case MUX_CAMERA_SENSOR:
+		gpio_set_value_cansleep(EVM_TWL_GPIO_BASE + 2, 0);
+		gpio_set_value(nCAM_VD_SEL, 0);
+		break;
+
+	case MUX_EXP_CAMERA_SENSOR:
+		gpio_set_value_cansleep(EVM_TWL_GPIO_BASE + 2, 1);
+		break;
+
+	default:
+		pr_err("omap3evm-camera: Invalid mux id #%d\n", mux_id);
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
+static struct mt9m032_platform_data mt9m032_platform_data = {
+	.ext_clock = 13500000,
+	.pll_pre_div = 6,
+	.pll_mul = 120,
+	.pll_out_div = 5,
+	.invert_pixclock = 1,
+};
+
+static struct i2c_board_info camera_i2c_devices[] = {
+	{
+		I2C_BOARD_INFO(MT9M032_NAME, MT9M032_I2C_ADDR),
+		.platform_data = &mt9m032_platform_data,
+	},
+};
+
+static struct isp_subdev_i2c_board_info camera_i2c_subdevs[] = {
+	{
+		.board_info = &camera_i2c_devices[0],
+		.i2c_adapter_id = MT9M032_I2C_BUS_NUM,
+	},
+	{},
+};
+
+static struct isp_v4l2_subdevs_group camera_subdevs[] = {
+	{
+		.subdevs = camera_i2c_subdevs,
+		.interface = ISP_INTERFACE_PARALLEL,
+		.bus = {
+			.parallel = {
+				.data_lane_shift = 1,
+				.clk_pol = 0,
+				.bridge = ISPCTRL_PAR_BRIDGE_DISABLE,
+			}
+		},
+	},
+	{},
+};
+
+static struct isp_platform_data isp_platform_data = {
+	.subdevs = camera_subdevs,
+};
+
+static int __init camera_init(void)
+{
+	int ret = -EINVAL;
+
+	omap_mux_init_gpio(nCAM_VD_SEL, OMAP_PIN_OUTPUT);
+	if (gpio_request(nCAM_VD_SEL, "nCAM_VD_SEL") < 0) {
+		pr_err("omap3evm-camera: Failed to get GPIO nCAM_VD_SEL(%d)\n",
+		       nCAM_VD_SEL);
+		goto err;
+	}
+	if (gpio_direction_output(nCAM_VD_SEL, 1) < 0) {
+		pr_err("omap3evm-camera: Failed to set GPIO nCAM_VD_SEL(%d)

direction\n", + nCAM_VD_SEL);

arch/arm/mach-omap2/board-omap3evm-camera.c new file +34 -0
+		goto err_vdsel;
+	}
+
+	if (gpio_request(EVM_TWL_GPIO_BASE + 2, "T2_GPIO2") < 0) {
+		pr_err("omap3evm-camera: Failed to get GPIO T2_GPIO2(%d)\n",
+		       EVM_TWL_GPIO_BASE + 2);
+		goto err_vdsel;
+	}
+	if (gpio_direction_output(EVM_TWL_GPIO_BASE + 2, 0) < 0) {
+		pr_err("omap3evm-camera: Failed to set GPIO T2_GPIO2(%d) direction\n",
+		       EVM_TWL_GPIO_BASE + 2);
+		goto err_2;
+	}
+
+	if (gpio_request(EVM_TWL_GPIO_BASE + 8, "nCAM_VD_EN") < 0) {
+		pr_err("omap3evm-camera: Failed to get GPIO nCAM_VD_EN(%d)\n",
+		       EVM_TWL_GPIO_BASE + 8);
+		goto err_2;
+	}
+	if (gpio_direction_output(EVM_TWL_GPIO_BASE + 8, 0) < 0) {
+		pr_err("omap3evm-camera: Failed to set GPIO nCAM_VD_EN(%d) direction\n",
+		       EVM_TWL_GPIO_BASE + 8);
+		goto err_8;
+	}
+
+	omap3evm_set_mux(MUX_CAMERA_SENSOR);
+
+
+	ret = omap3_init_camera(&isp_platform_data);
+	if (ret < 0)
+		goto err_8;
+	return 0;
+
+err_8:

arch/arm/mach-omap2/board-omap3evm-camera.c line 183

Quoted 10 lines
arch/arm/mach-omap2/board-omap3evm-camera.c new file +10 -0
+	gpio_free(EVM_TWL_GPIO_BASE + 8);
+err_2:
+	gpio_free(EVM_TWL_GPIO_BASE + 2);
+err_vdsel:
+	gpio_free(nCAM_VD_SEL);
+err:
+	return ret;
+}
+
+device_initcall(camera_init);

Please don't use device_initcall(), but call the function directly from the OMAP3 EVM init handler. Otherwise camera_init() will be called if OMAP3 EVM support is compiled in the kernel, regardless of the board the kernel runs on.

Signature · 3 lines
Regards,

Laurent Pinchart
#7 lore raw

PATCH v2 1/1 arm: omap3evm: Add support for an MT9M032 based camera board.

Quoted 44 lines

-----Original Message-----
From: linux-omap-owner at vger.kernel.org [mailto:linux-omap- owner at vger.kernel.org] On Behalf Of Laurent Pinchart
Sent: Monday, September 19, 2011 3:29 AM
To: Martin Hostettler
Cc: Tony Lindgren; linux-omap at vger.kernel.org; linux- media at vger.kernel.org; linux-arm-kernel at lists.infradead.org
Subject: Re: [PATCH v2] arm: omap3evm: Add support for an MT9M032 based camera board.

Hi Martin,

Quoted 30 lines · On Saturday 17 September 2011 11:34:57 Martin Hostettler wrote:

Adds board support for an MT9M032 based camera to omap3evm.

---
 arch/arm/mach-omap2/Makefile                |    1 +
 arch/arm/mach-omap2/board-omap3evm-camera.c |  183
+++++++++++++++++++++++++++ 2 files changed, 184 insertions(+), 0
deletions(-)
 create mode 100644 arch/arm/mach-omap2/board-omap3evm-camera.c

Changes in V2:
* ported to current mainline
* Style fixes
* Fix error handling

arch/arm/mach-omap2/Makefile +1 -0
index f343365..8ae3d25 100644
@@ -202,6 +202,7 @@ obj-$(CONFIG_MACH_OMAP3_TORPEDO)        +=
 board-omap3logic.o \ obj-$(CONFIG_MACH_OVERO)		+= board-overo.o \
 					   hsmmc.o
 obj-$(CONFIG_MACH_OMAP3EVM)		+= board-omap3evm.o \
+					   board-omap3evm-camera.o \
 					   hsmmc.o
 obj-$(CONFIG_MACH_OMAP3_PANDORA)	+= board-omap3pandora.o \
 					   hsmmc.o
(quoted diff) +0 -0

b/arch/arm/mach-omap2/board-omap3evm-camera.c new file mode 100644 index 0000000..be987d9

Quoted 8 lines

arch/arm/mach-omap2/board-omap3evm-camera.c line 5

Quoted 8 lines
arch/arm/mach-omap2/board-omap3evm-camera.c new file +5 -0
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2010-2011 Lund Engineering
+ * Contact: Gil Lund <[email protected]>
+ * Author: Martin Hostettler <[email protected]>
+ *

[Hiremath, Vaibhav] The file below seems copied from (which is coming from all older releases of TI)

http://arago-project.org/git/projects/?p=linux-omap3.git;a=blob;f=arch/arm/mach-omap2/board-omap3evm-camera.c;h=2e6ccfef69027dee880d507b98b5a7998d4bbe7e;hb=adcd067326836777c049e3cb32a5b7d9d401fc31

So I would appreciate if you keep original copyright and authorship of the file and add your sign-off to the patch.

Thanks,
Vaibhav

Quoted 197 lines

arch/arm/mach-omap2/board-omap3evm-camera.c line 6

Quoted 1 line
arch/arm/mach-omap2/board-omap3evm-camera.c new file +1 -0
+ * Board intregration for a MT9M032 camera connected to IMAGE_CONN and

I2C

Quoted 133 lines

Bus 2 + *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */

arch/arm/mach-omap2/board-omap3evm-camera.c new file +30 -0
+
+#include <linux/i2c.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+
+#include <linux/gpio.h>
+#include <plat/mux.h>
+#include "mux.h"
+
+#include "../../../drivers/media/video/omap3isp/isp.h"
+#include "media/mt9m032.h"
+
+#include "devices.h"
+
+#define EVM_TWL_GPIO_BASE OMAP_MAX_GPIO_LINES
+#define GPIO98_VID_DEC_RES	98
+#define nCAM_VD_SEL		157
+
+#define MT9M032_I2C_BUS_NUM	2
+
+
+enum omap3evmdc_mux {
+	MUX_TVP5146,
+	MUX_CAMERA_SENSOR,
+	MUX_EXP_CAMERA_SENSOR,
+};
+
+/**
+ * omap3evm_set_mux - Sets mux to enable signal routing to
+ *                           different peripherals present on new EVM

board + * @mux_id: enum, mux id to enable
+ *
+ * Returns 0 for success or a negative error code
+ */

arch/arm/mach-omap2/board-omap3evm-camera.c new file +83 -0
+static int omap3evm_set_mux(enum omap3evmdc_mux mux_id)
+{
+	/* Set GPIO6 = 1 */
+	gpio_set_value_cansleep(EVM_TWL_GPIO_BASE + 6, 1);
+	gpio_set_value_cansleep(EVM_TWL_GPIO_BASE + 2, 0);
+
+	switch (mux_id) {
+	case MUX_TVP5146:
+		gpio_set_value_cansleep(EVM_TWL_GPIO_BASE + 2, 0);
+		gpio_set_value(nCAM_VD_SEL, 1);
+		break;
+
+	case MUX_CAMERA_SENSOR:
+		gpio_set_value_cansleep(EVM_TWL_GPIO_BASE + 2, 0);
+		gpio_set_value(nCAM_VD_SEL, 0);
+		break;
+
+	case MUX_EXP_CAMERA_SENSOR:
+		gpio_set_value_cansleep(EVM_TWL_GPIO_BASE + 2, 1);
+		break;
+
+	default:
+		pr_err("omap3evm-camera: Invalid mux id #%d\n", mux_id);
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
+static struct mt9m032_platform_data mt9m032_platform_data = {
+	.ext_clock = 13500000,
+	.pll_pre_div = 6,
+	.pll_mul = 120,
+	.pll_out_div = 5,
+	.invert_pixclock = 1,
+};
+
+static struct i2c_board_info camera_i2c_devices[] = {
+	{
+		I2C_BOARD_INFO(MT9M032_NAME, MT9M032_I2C_ADDR),
+		.platform_data = &mt9m032_platform_data,
+	},
+};
+
+static struct isp_subdev_i2c_board_info camera_i2c_subdevs[] = {
+	{
+		.board_info = &camera_i2c_devices[0],
+		.i2c_adapter_id = MT9M032_I2C_BUS_NUM,
+	},
+	{},
+};
+
+static struct isp_v4l2_subdevs_group camera_subdevs[] = {
+	{
+		.subdevs = camera_i2c_subdevs,
+		.interface = ISP_INTERFACE_PARALLEL,
+		.bus = {
+			.parallel = {
+				.data_lane_shift = 1,
+				.clk_pol = 0,
+				.bridge = ISPCTRL_PAR_BRIDGE_DISABLE,
+			}
+		},
+	},
+	{},
+};
+
+static struct isp_platform_data isp_platform_data = {
+	.subdevs = camera_subdevs,
+};
+
+static int __init camera_init(void)
+{
+	int ret = -EINVAL;
+
+	omap_mux_init_gpio(nCAM_VD_SEL, OMAP_PIN_OUTPUT);
+	if (gpio_request(nCAM_VD_SEL, "nCAM_VD_SEL") < 0) {
+		pr_err("omap3evm-camera: Failed to get GPIO nCAM_VD_SEL(%d)\n",
+		       nCAM_VD_SEL);
+		goto err;
+	}
+	if (gpio_direction_output(nCAM_VD_SEL, 1) < 0) {
+		pr_err("omap3evm-camera: Failed to set GPIO nCAM_VD_SEL(%d)

direction\n", + nCAM_VD_SEL);

arch/arm/mach-omap2/board-omap3evm-camera.c

Quoted 10 lines
arch/arm/mach-omap2/board-omap3evm-camera.c new file +10 -0
+		goto err_vdsel;
+	}
+
+	if (gpio_request(EVM_TWL_GPIO_BASE + 2, "T2_GPIO2") < 0) {
+		pr_err("omap3evm-camera: Failed to get GPIO T2_GPIO2(%d)\n",
+		       EVM_TWL_GPIO_BASE + 2);
+		goto err_vdsel;
+	}
+	if (gpio_direction_output(EVM_TWL_GPIO_BASE + 2, 0) < 0) {
+		pr_err("omap3evm-camera: Failed to set GPIO T2_GPIO2(%d)

direction\n",

arch/arm/mach-omap2/board-omap3evm-camera.c

Quoted 11 lines
arch/arm/mach-omap2/board-omap3evm-camera.c new file +11 -0
+		       EVM_TWL_GPIO_BASE + 2);
+		goto err_2;
+	}
+
+	if (gpio_request(EVM_TWL_GPIO_BASE + 8, "nCAM_VD_EN") < 0) {
+		pr_err("omap3evm-camera: Failed to get GPIO nCAM_VD_EN(%d)\n",
+		       EVM_TWL_GPIO_BASE + 8);
+		goto err_2;
+	}
+	if (gpio_direction_output(EVM_TWL_GPIO_BASE + 8, 0) < 0) {
+		pr_err("omap3evm-camera: Failed to set GPIO nCAM_VD_EN(%d)

direction\n",

Quoted 13 lines
arch/arm/mach-omap2/board-omap3evm-camera.c new file +13 -0
+		       EVM_TWL_GPIO_BASE + 8);
+		goto err_8;
+	}
+
+	omap3evm_set_mux(MUX_CAMERA_SENSOR);
+
+
+	ret = omap3_init_camera(&isp_platform_data);
+	if (ret < 0)
+		goto err_8;
+	return 0;
+
+err_8:

arch/arm/mach-omap2/board-omap3evm-camera.c line 183

Quoted 10 lines
arch/arm/mach-omap2/board-omap3evm-camera.c new file +10 -0
+	gpio_free(EVM_TWL_GPIO_BASE + 8);
+err_2:
+	gpio_free(EVM_TWL_GPIO_BASE + 2);
+err_vdsel:
+	gpio_free(nCAM_VD_SEL);
+err:
+	return ret;
+}
+
+device_initcall(camera_init);

Please don't use device_initcall(), but call the function directly from the
OMAP3 EVM init handler. Otherwise camera_init() will be called if OMAP3 EVM
support is compiled in the kernel, regardless of the board the kernel runs on.

--
Regards,

Laurent Pinchart
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html

#8 lore raw

PATCH v2 1/1 arm: omap3evm: Add support for an MT9M032 based camera board.

Quoted 54 lines · Vaibhav
Quoted 44 lines

-----Original Message-----
From: linux-omap-owner at vger.kernel.org [mailto:linux-omap- owner at vger.kernel.org] On Behalf Of Laurent Pinchart
Sent: Monday, September 19, 2011 3:29 AM
To: Martin Hostettler
Cc: Tony Lindgren; linux-omap at vger.kernel.org; linux- media at vger.kernel.org; linux-arm-kernel at lists.infradead.org
Subject: Re: [PATCH v2] arm: omap3evm: Add support for an MT9M032 based camera board.

Hi Martin,

Quoted 30 lines · On Saturday 17 September 2011 11:34:57 Martin Hostettler wrote:

Adds board support for an MT9M032 based camera to omap3evm.

---
 arch/arm/mach-omap2/Makefile                |    1 +
 arch/arm/mach-omap2/board-omap3evm-camera.c |  183
+++++++++++++++++++++++++++ 2 files changed, 184 insertions(+), 0
deletions(-)
 create mode 100644 arch/arm/mach-omap2/board-omap3evm-camera.c

Changes in V2:
* ported to current mainline
* Style fixes
* Fix error handling

arch/arm/mach-omap2/Makefile +1 -0
index f343365..8ae3d25 100644
@@ -202,6 +202,7 @@ obj-$(CONFIG_MACH_OMAP3_TORPEDO)        +=
 board-omap3logic.o \ obj-$(CONFIG_MACH_OVERO)		+= board-overo.o \
 					   hsmmc.o
 obj-$(CONFIG_MACH_OMAP3EVM)		+= board-omap3evm.o \
+					   board-omap3evm-camera.o \
 					   hsmmc.o
 obj-$(CONFIG_MACH_OMAP3_PANDORA)	+= board-omap3pandora.o \
 					   hsmmc.o
(quoted diff) +0 -0

b/arch/arm/mach-omap2/board-omap3evm-camera.c new file mode 100644 index 0000000..be987d9

Quoted 8 lines

arch/arm/mach-omap2/board-omap3evm-camera.c line 5

Quoted 8 lines
arch/arm/mach-omap2/board-omap3evm-camera.c new file +5 -0
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2010-2011 Lund Engineering
+ * Contact: Gil Lund <[email protected]>
+ * Author: Martin Hostettler <[email protected]>
+ *

[Hiremath, Vaibhav] The file below seems copied from (which is coming from all older releases of TI)

Quoted 4 lines

http://arago-project.org/git/projects/?p=linux-omap3.git;a=blob;f=arch/arm/mach-omap2/board-omap3evm-camera.c;h=2e6ccfef69027dee880d507b98b5a7998d4bbe7e;hb=adcd067326836777c049e3cb32a5b7d9d401fc31

So I would appreciate if you keep original copyright and authorship of the file and add your sign-off to the patch.

First of all i don't have any problem Adding your name and the TI copyright.
Maybe i should have been more careful when looking at and adeption omap3evm_set_mux as i really took that from the TI code.

I honestly don't remember if i took any other code from that file or not. It ends up doing what the hardware needs anyway. For me it doesn't matter with such trival things, but i should have been more careful.

Do you consider it resolved if use the following at the start?

/*
* Copyright (C) 2010 Texas Instruments Inc
* Copyright (C) 2010-2011 Lund Engineering
* Contact: Gil Lund <[email protected]>
* Authors:
* Vaibhav Hiremath <[email protected]>
* Martin Hostettler <[email protected]>
*/

But then again the copy on my harddisk has these too...

* Contributors:
* Anuj Aggarwal <[email protected]>
* Sivaraj R <[email protected]>

Maybe i should add them too.

Not sure really...

- Martin Hostettler

#9 lore raw

PATCH v2 1/1 arm: omap3evm: Add support for an MT9M032 based camera board.

Quoted 74 lines

-----Original Message-----
From: martin at neutronstar.dyndns.org [mailto:martin at neutronstar.dyndns.org]
Sent: Tuesday, September 20, 2011 12:55 AM
To: Hiremath, Vaibhav
Cc: Laurent Pinchart; Tony Lindgren; linux-omap at vger.kernel.org; linux- media at vger.kernel.org; linux-arm-kernel at lists.infradead.org
Subject: Re: [PATCH v2] arm: omap3evm: Add support for an MT9M032 based camera board.

Quoted 9 lines · Vaibhav
Quoted 9 lines

-----Original Message-----
From: linux-omap-owner at vger.kernel.org [mailto:linux-omap- owner at vger.kernel.org] On Behalf Of Laurent Pinchart
Sent: Monday, September 19, 2011 3:29 AM
To: Martin Hostettler
Cc: Tony Lindgren; linux-omap at vger.kernel.org; linux- media at vger.kernel.org; linux-arm-kernel at lists.infradead.org
Subject: Re: [PATCH v2] arm: omap3evm: Add support for an MT9M032

based

Quoted 15 lines
Quoted 15 lines

camera board.

Hi Martin,

Quoted 10 lines · On Saturday 17 September 2011 11:34:57 Martin Hostettler wrote:

Adds board support for an MT9M032 based camera to omap3evm.

---
 arch/arm/mach-omap2/Makefile                |    1 +
 arch/arm/mach-omap2/board-omap3evm-camera.c |  183
+++++++++++++++++++++++++++ 2 files changed, 184 insertions(+), 0
deletions(-)
 create mode 100644 arch/arm/mach-omap2/board-omap3evm-camera.c
Quoted 6 lines
Quoted 6 lines

arch/arm/mach-

Quoted 6 lines

Changes in V2:
* ported to current mainline
* Style fixes
* Fix error handling

arch/arm/mach- renamed from arch/arm/mach-omap2/Makefile +0 -0

omap2/Makefile

Quoted 5 lines
Quoted 5 lines
Quoted 5 lines

index f343365..8ae3d25 100644

arch/arm/mach-omap2/Makefile +0 -0
@@ -202,6 +202,7 @@ obj-$(CONFIG_MACH_OMAP3_TORPEDO)        +=

board-omap3logic.o \ obj-$(CONFIG_MACH_OVERO) += board-

overo.o \

Quoted 10 lines
Quoted 10 lines
Quoted 10 lines
arch/arm/mach-omap2/Makefile +1 -0
 					   hsmmc.o
 obj-$(CONFIG_MACH_OMAP3EVM)		+= board-omap3evm.o \
+					   board-omap3evm-camera.o \
 					   hsmmc.o
 obj-$(CONFIG_MACH_OMAP3_PANDORA)	+= board-omap3pandora.o \
 					   hsmmc.o
(quoted diff) +0 -0

b/arch/arm/mach-omap2/board-omap3evm-camera.c new file mode 100644 index 0000000..be987d9
--- /dev/null

Quoted 8 lines
Quoted 7 lines

arch/arm/mach-omap2/board-omap3evm-camera.c line 5

Quoted 7 lines

+++ b/arch/arm/mach-omap2/board-omap3evm-camera.c

arch/arm/mach-omap2/board-omap3evm-camera.c new file +5 -0
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2010-2011 Lund Engineering
+ * Contact: Gil Lund <[email protected]>
+ * Author: Martin Hostettler <[email protected]>
+ *

[Hiremath, Vaibhav] The file below seems copied from (which is coming

from all older releases of TI)

Quoted 2 lines

http://arago-project.org/git/projects/?p=linux-

omap3.git;a=blob;f=arch/arm/mach-omap2/board-omap3evm- camera.c;h=2e6ccfef69027dee880d507b98b5a7998d4bbe7e;hb=adcd067326836777c04 9e3cb32a5b7d9d401fc31

Quoted 1 line
Quoted 9 lines
Quoted 1 line

So I would appreciate if you keep original copyright and authorship of

the file and add your sign-off to the patch.

Quoted 1 line

First of all i don't have any problem Adding your name and the TI copyright.
Maybe i should have been more careful when looking at and adeption omap3evm_set_mux as i really took that from the TI code.

The best practice it to always keep copy-right of the file intact... I wouldn't mind if you use and modify any part of the code and also add your authorship. I feel, Copy-right is important part.

Quoted 8 lines

I honestly don't remember if i took any other code from that file or not. It ends up doing what the hardware needs anyway. For me it doesn't matter with such trival things, but i should have been more careful.

Do you consider it resolved if use the following at the start?

/*
* Copyright (C) 2010 Texas Instruments Inc

Change it to 2011.

Quoted 2 lines

* Copyright (C) 2010-2011 Lund Engineering
* Contact: Gil Lund <[email protected]>

Not sure do you really need above line...

Quoted 6 lines

* Authors:
* Vaibhav Hiremath <[email protected]>
* Martin Hostettler <[email protected]>
*/

Looks ok to me.

Quoted 11 lines

But then again the copy on my harddisk has these too...

* Contributors:
* Anuj Aggarwal <[email protected]>
* Sivaraj R <[email protected]>

Maybe i should add them too.

Not sure really...

I think we should not pollute source file with all our names, so I would recommend to put copy rights and probably author.

Thanks,
Vaibhav

Quoted 1 line

- Martin Hostettler

#10 lore raw

PATCH v2 1/1 arm: omap3evm: Add support for an MT9M032 based camera board.

In reply to Laurent Pinchart
Quoted 31 lines · Laurent Pinchart

Hi Martin,

Quoted 28 lines · On Saturday 17 September 2011 11:34:57 Martin Hostettler wrote:

Adds board support for an MT9M032 based camera to omap3evm.

---
 arch/arm/mach-omap2/Makefile                |    1 +
 arch/arm/mach-omap2/board-omap3evm-camera.c |  183
+++++++++++++++++++++++++++ 2 files changed, 184 insertions(+), 0
deletions(-)
 create mode 100644 arch/arm/mach-omap2/board-omap3evm-camera.c

Changes in V2:
* ported to current mainline
* Style fixes
* Fix error handling

arch/arm/mach-omap2/Makefile +9 -0
index f343365..8ae3d25 100644
+	return 0;
+
+err_8:
+	gpio_free(EVM_TWL_GPIO_BASE + 8);
+err_2:
+	gpio_free(EVM_TWL_GPIO_BASE + 2);
+err_vdsel:
+	gpio_free(nCAM_VD_SEL);
+err:
Quoted 8 lines

arch/arm/mach-omap2/Makefile

Quoted 4 lines
arch/arm/mach-omap2/Makefile +4 -0
+	return ret;
+}
+
+device_initcall(camera_init);

Please don't use device_initcall(), but call the function directly from the OMAP3 EVM init handler. Otherwise camera_init() will be called if OMAP3 EVM support is compiled in the kernel, regardless of the board the kernel runs on.

Ok, will do.
In which header should the prototyp of that function go? Or can i just add a prototyp to board-omap3evm.c directly?
I couldn't find anything that looked right, this is rather board specific after all.

- Martin Hostettler

Quoted 5 lines
Signature · 4 lines
-- 
Regards,

Laurent Pinchart
#11 lore raw

PATCH v2 1/1 arm: omap3evm: Add support for an MT9M032 based camera board.

Hi Martin,

Quoted 43 lines · On Monday 19 September 2011 08:10:19 [email protected] wrote:
Quoted 33 lines · Laurent Pinchart
Quoted 32 lines · On Saturday 17 September 2011 11:34:57 Martin Hostettler wrote:

Adds board support for an MT9M032 based camera to omap3evm.

---

 arch/arm/mach-omap2/Makefile                |    1 +
 arch/arm/mach-omap2/board-omap3evm-camera.c |  183

+++++++++++++++++++++++++++ 2 files changed, 184 insertions(+), 0 deletions(-)

 create mode 100644 arch/arm/mach-omap2/board-omap3evm-camera.c

Changes in V2:
* ported to current mainline
* Style fixes
* Fix error handling

(quoted diff) +0 -0

b/arch/arm/mach-omap2/Makefile index f343365..8ae3d25 100644

arch/arm/mach-omap2/Makefile +10 -0
+	return 0;
+
+err_8:
+	gpio_free(EVM_TWL_GPIO_BASE + 8);
+err_2:
+	gpio_free(EVM_TWL_GPIO_BASE + 2);
+err_vdsel:
+	gpio_free(nCAM_VD_SEL);
+err:
+	return ret;
Quoted 8 lines

arch/arm/mach-omap2/Makefile

Quoted 3 lines
arch/arm/mach-omap2/Makefile +3 -0
+}
+
+device_initcall(camera_init);

Please don't use device_initcall(), but call the function directly from the OMAP3 EVM init handler. Otherwise camera_init() will be called if OMAP3 EVM support is compiled in the kernel, regardless of the board the kernel runs on.

Quoted 5 lines

Ok, will do.
In which header should the prototyp of that function go? Or can i just add a prototyp to board-omap3evm.c directly?
I couldn't find anything that looked right, this is rather board specific after all.

You can either create arch/arm/mach-omap2/board-omap3evm.h or add the prototype to board-omap3evm.c.

Signature · 3 lines
Regards,

Laurent Pinchart
#12 lore raw

PATCH v2 1/1 arm: omap3evm: Add support for an MT9M032 based camera board.

In reply to Laurent Pinchart

Hi

Quoted 36 lines · Laurent Pinchart

Hi Martin,

Quoted 33 lines · On Saturday 17 September 2011 11:34:57 Martin Hostettler wrote:

Adds board support for an MT9M032 based camera to omap3evm.

---
 arch/arm/mach-omap2/Makefile                |    1 +
 arch/arm/mach-omap2/board-omap3evm-camera.c |  183
+++++++++++++++++++++++++++ 2 files changed, 184 insertions(+), 0
deletions(-)
 create mode 100644 arch/arm/mach-omap2/board-omap3evm-camera.c

Changes in V2:
* ported to current mainline
* Style fixes
* Fix error handling

arch/arm/mach-omap2/Makefile +1 -0
index f343365..8ae3d25 100644
@@ -202,6 +202,7 @@ obj-$(CONFIG_MACH_OMAP3_TORPEDO)        +=
 board-omap3logic.o \ obj-$(CONFIG_MACH_OVERO)		+= board-overo.o \
 					   hsmmc.o
 obj-$(CONFIG_MACH_OMAP3EVM)		+= board-omap3evm.o \
+					   board-omap3evm-camera.o \
 					   hsmmc.o
 obj-$(CONFIG_MACH_OMAP3_PANDORA)	+= board-omap3pandora.o \
 					   hsmmc.o
(quoted diff) +0 -0

b/arch/arm/mach-omap2/board-omap3evm-camera.c new file mode 100644 index 0000000..be987d9

arch/arm/mach-omap2/board-omap3evm-camera.c new file +0 -0
@@ -0,0 +1,183 @@

[snip]

Quoted 53 lines
Quoted 53 lines
arch/arm/mach-omap2/board-omap3evm-camera.c new file +12 -0
+static int __init camera_init(void)
+{
+	int ret = -EINVAL;
+
+	omap_mux_init_gpio(nCAM_VD_SEL, OMAP_PIN_OUTPUT);
+	if (gpio_request(nCAM_VD_SEL, "nCAM_VD_SEL") < 0) {
+		pr_err("omap3evm-camera: Failed to get GPIO nCAM_VD_SEL(%d)\n",
+		       nCAM_VD_SEL);
+		goto err;
+	}
+	if (gpio_direction_output(nCAM_VD_SEL, 1) < 0) {
+		pr_err("omap3evm-camera: Failed to set GPIO nCAM_VD_SEL(%d)

direction\n", + nCAM_VD_SEL);

arch/arm/mach-omap2/board-omap3evm-camera.c new file +40 -0
+		goto err_vdsel;
+	}
+
+	if (gpio_request(EVM_TWL_GPIO_BASE + 2, "T2_GPIO2") < 0) {
+		pr_err("omap3evm-camera: Failed to get GPIO T2_GPIO2(%d)\n",
+		       EVM_TWL_GPIO_BASE + 2);
+		goto err_vdsel;
+	}
+	if (gpio_direction_output(EVM_TWL_GPIO_BASE + 2, 0) < 0) {
+		pr_err("omap3evm-camera: Failed to set GPIO T2_GPIO2(%d) direction\n",
+		       EVM_TWL_GPIO_BASE + 2);
+		goto err_2;
+	}
+
+	if (gpio_request(EVM_TWL_GPIO_BASE + 8, "nCAM_VD_EN") < 0) {
+		pr_err("omap3evm-camera: Failed to get GPIO nCAM_VD_EN(%d)\n",
+		       EVM_TWL_GPIO_BASE + 8);
+		goto err_2;
+	}
+	if (gpio_direction_output(EVM_TWL_GPIO_BASE + 8, 0) < 0) {
+		pr_err("omap3evm-camera: Failed to set GPIO nCAM_VD_EN(%d) direction\n",
+		       EVM_TWL_GPIO_BASE + 8);
+		goto err_8;
+	}
+
+	omap3evm_set_mux(MUX_CAMERA_SENSOR);
+
+
+	ret = omap3_init_camera(&isp_platform_data);
+	if (ret < 0)
+		goto err_8;
+	return 0;
+
+err_8:
+	gpio_free(EVM_TWL_GPIO_BASE + 8);
+err_2:
+	gpio_free(EVM_TWL_GPIO_BASE + 2);
+err_vdsel:
+	gpio_free(nCAM_VD_SEL);
+err:
Quoted 8 lines

arch/arm/mach-omap2/board-omap3evm-camera.c line 183

Quoted 4 lines
arch/arm/mach-omap2/board-omap3evm-camera.c new file +4 -0
+	return ret;
+}
+
+device_initcall(camera_init);

Please don't use device_initcall(), but call the function directly from the OMAP3 EVM init handler. Otherwise camera_init() will be called if OMAP3 EVM support is compiled in the kernel, regardless of the board the kernel runs on.

Another possibility is to put

	if (!machine_is_omap3evm())
		return 0;

in the beginning of the function. Probably, best to follow what other omap3 boards do.

Thanks
Guennadi
---
Guennadi Liakhovetski, Ph.D.
Freelance Open-Source Software Developer
http://www.open-technology.de/