Message ID | 1316252097-4213-1-git-send-email-martin@neutronstar.dyndns.org (mailing list archive) |
---|---|
State | Changes Requested, archived |
Headers |
Received: from mail.tu-berlin.de ([130.149.7.33]) by www.linuxtv.org with esmtp (Exim 4.72) (envelope-from <linux-media-owner@vger.kernel.org>) id 1R4rIu-000479-HF; Sat, 17 Sep 2011 11:35:21 +0200 X-tubIT-Incoming-IP: 209.132.180.67 Received: from vger.kernel.org ([209.132.180.67]) by mail.tu-berlin.de (exim-4.75/mailfrontend-4) with esmtp id 1R4rIt-0006SD-Bt; Sat, 17 Sep 2011 11:35:20 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752594Ab1IQJfR (ORCPT <rfc822;patchwork@linuxtv.org> + 5 others); Sat, 17 Sep 2011 05:35:17 -0400 Received: from moutng.kundenserver.de ([212.227.17.9]:59058 "EHLO moutng.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751737Ab1IQJfQ (ORCPT <rfc822;linux-media@vger.kernel.org>); Sat, 17 Sep 2011 05:35:16 -0400 Received: from localhost ([212.255.36.232]) by mrelayeu.kundenserver.de (node=mrbap3) with ESMTP (Nemesis) id 0LjbI0-1RgNuk3enY-00bg2N; Sat, 17 Sep 2011 11:35:15 +0200 From: Martin Hostettler <martin@neutronstar.dyndns.org> To: Laurent Pinchart <laurent.pinchart@ideasonboard.com>, Tony Lindgren <tony@atomide.com>, linux-omap@vger.kernel.org Cc: linux-media@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Martin Hostettler <martin@neutronstar.dyndns.org> Subject: [PATCH v2] arm: omap3evm: Add support for an MT9M032 based camera board. Date: Sat, 17 Sep 2011 11:34:57 +0200 Message-Id: <1316252097-4213-1-git-send-email-martin@neutronstar.dyndns.org> X-Mailer: git-send-email 1.7.2.5 X-Provags-ID: V02:K0:bWK60NXzQwj/nGQxeeGv/1xoGi4j8bTq7kkhOKKyByo Ll8vw227ortvde3W4QDNqyD34x34DRSv1N78nCLdVkMtFULq8w C0DhDUeSmtmA8fEkCekTNOv30GmXsOBe+xo//daCpOeC+rB/7J mXa7Ml9m+xe689gX+hh87H6PvpFUD4q+25NnK3/S/PfZj/OhSn BdF3DEVybDuaUM67dabBzUiILudJBGV0jijPigQpC1jlM4BCGc AEBoofiNciN2IakpZxABw0Qlwy/IwNphxH4331cbnjSYuEcdjj czi7C9GwnouMjHBUCE3subw7zqgURYnSiO1y0ECzbiFHYtnoNW clkMApoInujie4b13tmjYfHA8HJomh2yG7xMKo3oJRvkGR8iWF 8wAa/fZ57khvmwwShxI/YzmTNf3ghchbJw= Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: <linux-media.vger.kernel.org> X-Mailing-List: linux-media@vger.kernel.org X-PMX-Version: 5.6.1.2065439, Antispam-Engine: 2.7.2.376379, Antispam-Data: 2011.9.17.93014 X-PMX-Spam: Gauge=X, Probability=10%, Report=' HASHBUSTER_BLOCK_V2 0.5, MULTIPLE_RCPTS 0.1, BODY_SIZE_6000_6999 0, BODY_SIZE_7000_LESS 0, __ANY_URI 0, __CP_MEDIA_BODY 0, __CP_URI_IN_BODY 0, __HASHBUSTER_BLOCK_V2_1 0, __HAS_MSGID 0, __HAS_X_MAILER 0, __HAS_X_MAILING_LIST 0, __LINES_OF_YELLING 0, __MIME_TEXT_ONLY 0, __MULTIPLE_RCPTS_CC_X2 0, __SANE_MSGID 0, __TO_MALFORMED_2 0, __URI_NO_WWW 0, __URI_NS ' X-LSpam-Score: 1.0 (+) X-LSpam-Report: No, score=1.0 required=5.0 tests=BAYES_00=-1.9, KB_DATE_CONTAINS_TAB=2.751, RCVD_IN_DNSWL_MED=-2.3, TAB_IN_FROM=2.494 autolearn=no |
Commit Message
Martin Hostettler
Sept. 17, 2011, 9:34 a.m. UTC
Adds board support for an MT9M032 based camera to omap3evm. Sigend-off-by: Martin Hostettler <martin@neutronstar.dyndns.org> --- 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
Comments
On Sat, 2011-09-17 at 11:34 +0200, Martin Hostettler wrote: > 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 > diff --git a/arch/arm/mach-omap2/board-omap3evm-camera.c b/arch/arm/mach-omap2/board-omap3evm-camera.c [] #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt [] > +static int omap3evm_set_mux(enum omap3evmdc_mux mux_id) [] > + switch (mux_id) { [] > + default: > + pr_err("omap3evm-camera: Invalid mux id #%d\n", mux_id); pr_err("Invalid mux id #%d\n", mux_id); [] > +static int __init camera_init(void) [] > + 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. -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 09/17/2011 11:34 AM, Martin Hostettler wrote: > Adds board support for an MT9M032 based camera to omap3evm. ... > + > +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); > + 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"); > + > + 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"); > + > + 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") ? > + > + 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); -- Regards, Sylwester -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Sunday 18 September 2011 00:00:16 Sylwester Nawrocki wrote: > On 09/17/2011 11:34 AM, Martin Hostettler wrote: > > Adds board support for an MT9M032 based camera to omap3evm. > > ... > > > + > > +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); > > + 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"); I'd even propose gpio_request_array(). > > + > > + 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"); > > > + > > + 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") ? > > > + > > + 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);
On Sat, Sep 17, 2011 at 01:24:29PM -0700, Joe Perches wrote: > On Sat, 2011-09-17 at 11:34 +0200, Martin Hostettler wrote: > > 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 > > > diff --git a/arch/arm/mach-omap2/board-omap3evm-camera.c b/arch/arm/mach-omap2/board-omap3evm-camera.c > [] > #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt > [] > > +static int omap3evm_set_mux(enum omap3evmdc_mux mux_id) > [] > > + switch (mux_id) { > [] > > + default: > > + pr_err("omap3evm-camera: Invalid mux id #%d\n", mux_id); > > pr_err("Invalid mux id #%d\n", mux_id); > [] > > +static int __init camera_init(void) > [] > > + 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. > -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Sun, Sep 18, 2011 at 12:08:20AM +0200, Laurent Pinchart wrote: > On Sunday 18 September 2011 00:00:16 Sylwester Nawrocki wrote: > > On 09/17/2011 11:34 AM, Martin Hostettler wrote: > > > Adds board support for an MT9M032 based camera to omap3evm. > > > > ... > > > > > + > > > +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); > > > + 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"); > > 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 -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi Martin, On Saturday 17 September 2011 11:34:57 Martin Hostettler wrote: > Adds board support for an MT9M032 based camera to omap3evm. > > Sigend-off-by: Martin Hostettler <martin@neutronstar.dyndns.org> > --- > 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 > > diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile > index f343365..8ae3d25 100644 > --- a/arch/arm/mach-omap2/Makefile > +++ b/arch/arm/mach-omap2/Makefile > @@ -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 > diff --git a/arch/arm/mach-omap2/board-omap3evm-camera.c > b/arch/arm/mach-omap2/board-omap3evm-camera.c new file mode 100644 > index 0000000..be987d9 > --- /dev/null > +++ b/arch/arm/mach-omap2/board-omap3evm-camera.c > @@ -0,0 +1,183 @@ > +/* > + * Copyright (C) 2010-2011 Lund Engineering > + * Contact: Gil Lund <gwlund@lundeng.com> > + * Author: Martin Hostettler <martin@neutronstar.dyndns.org> > + * > + * 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 > + */ > + > +#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 > + */ > +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); > + 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: > + 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.
> -----Original Message----- > From: linux-omap-owner@vger.kernel.org [mailto:linux-omap- > owner@vger.kernel.org] On Behalf Of Laurent Pinchart > Sent: Monday, September 19, 2011 3:29 AM > To: Martin Hostettler > Cc: Tony Lindgren; linux-omap@vger.kernel.org; linux- > media@vger.kernel.org; linux-arm-kernel@lists.infradead.org > Subject: Re: [PATCH v2] arm: omap3evm: Add support for an MT9M032 based > camera board. > > Hi Martin, > > On Saturday 17 September 2011 11:34:57 Martin Hostettler wrote: > > Adds board support for an MT9M032 based camera to omap3evm. > > > > Sigend-off-by: Martin Hostettler <martin@neutronstar.dyndns.org> > > --- > > 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 > > > > diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile > > index f343365..8ae3d25 100644 > > --- a/arch/arm/mach-omap2/Makefile > > +++ b/arch/arm/mach-omap2/Makefile > > @@ -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 > > diff --git a/arch/arm/mach-omap2/board-omap3evm-camera.c > > b/arch/arm/mach-omap2/board-omap3evm-camera.c new file mode 100644 > > index 0000000..be987d9 > > --- /dev/null > > +++ b/arch/arm/mach-omap2/board-omap3evm-camera.c > > @@ -0,0 +1,183 @@ > > +/* > > + * Copyright (C) 2010-2011 Lund Engineering > > + * Contact: Gil Lund <gwlund@lundeng.com> > > + * Author: Martin Hostettler <martin@neutronstar.dyndns.org> > > + * [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 > > + * 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 > > + */ > > + > > +#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 > > + */ > > +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); > > + 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: > > + 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@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Sun, Sep 18, 2011 at 11:58:55PM +0200, Laurent Pinchart wrote: > Hi Martin, > > On Saturday 17 September 2011 11:34:57 Martin Hostettler wrote: > > Adds board support for an MT9M032 based camera to omap3evm. > > > > Sigend-off-by: Martin Hostettler <martin@neutronstar.dyndns.org> > > --- > > 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 > > > > diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile > > index f343365..8ae3d25 100644 > > --- a/arch/arm/mach-omap2/Makefile > > +++ b/arch/arm/mach-omap2/Makefile > > + 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); > > 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 > > -- > Regards, > > Laurent Pinchart -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi Martin, On Monday 19 September 2011 08:10:19 martin@neutronstar.dyndns.org wrote: > On Sun, Sep 18, 2011 at 11:58:55PM +0200, Laurent Pinchart wrote: > > On Saturday 17 September 2011 11:34:57 Martin Hostettler wrote: > > > Adds board support for an MT9M032 based camera to omap3evm. > > > > > > Sigend-off-by: Martin Hostettler <martin@neutronstar.dyndns.org> > > > --- > > > > > > 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 > > > > > > diff --git a/arch/arm/mach-omap2/Makefile > > > b/arch/arm/mach-omap2/Makefile index f343365..8ae3d25 100644 > > > --- a/arch/arm/mach-omap2/Makefile > > > +++ b/arch/arm/mach-omap2/Makefile > > > + 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); > > > > 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. You can either create arch/arm/mach-omap2/board-omap3evm.h or add the prototype to board-omap3evm.c.
Hi On Sun, 18 Sep 2011, Laurent Pinchart wrote: > Hi Martin, > > On Saturday 17 September 2011 11:34:57 Martin Hostettler wrote: > > Adds board support for an MT9M032 based camera to omap3evm. > > > > Sigend-off-by: Martin Hostettler <martin@neutronstar.dyndns.org> > > --- > > 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 > > > > diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile > > index f343365..8ae3d25 100644 > > --- a/arch/arm/mach-omap2/Makefile > > +++ b/arch/arm/mach-omap2/Makefile > > @@ -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 > > diff --git a/arch/arm/mach-omap2/board-omap3evm-camera.c > > b/arch/arm/mach-omap2/board-omap3evm-camera.c new file mode 100644 > > index 0000000..be987d9 > > --- /dev/null > > +++ b/arch/arm/mach-omap2/board-omap3evm-camera.c > > @@ -0,0 +1,183 @@ [snip] > > +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); > > + 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: > > + 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/ -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Mon, Sep 19, 2011 at 11:37:37AM +0530, Hiremath, Vaibhav wrote: > > > -----Original Message----- > > From: linux-omap-owner@vger.kernel.org [mailto:linux-omap- > > owner@vger.kernel.org] On Behalf Of Laurent Pinchart > > Sent: Monday, September 19, 2011 3:29 AM > > To: Martin Hostettler > > Cc: Tony Lindgren; linux-omap@vger.kernel.org; linux- > > media@vger.kernel.org; linux-arm-kernel@lists.infradead.org > > Subject: Re: [PATCH v2] arm: omap3evm: Add support for an MT9M032 based > > camera board. > > > > Hi Martin, > > > > On Saturday 17 September 2011 11:34:57 Martin Hostettler wrote: > > > Adds board support for an MT9M032 based camera to omap3evm. > > > > > > Sigend-off-by: Martin Hostettler <martin@neutronstar.dyndns.org> > > > --- > > > 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 > > > > > > diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile > > > index f343365..8ae3d25 100644 > > > --- a/arch/arm/mach-omap2/Makefile > > > +++ b/arch/arm/mach-omap2/Makefile > > > @@ -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 > > > diff --git a/arch/arm/mach-omap2/board-omap3evm-camera.c > > > b/arch/arm/mach-omap2/board-omap3evm-camera.c new file mode 100644 > > > index 0000000..be987d9 > > > --- /dev/null > > > +++ b/arch/arm/mach-omap2/board-omap3evm-camera.c > > > @@ -0,0 +1,183 @@ > > > +/* > > > + * Copyright (C) 2010-2011 Lund Engineering > > > + * Contact: Gil Lund <gwlund@lundeng.com> > > > + * Author: Martin Hostettler <martin@neutronstar.dyndns.org> > > > + * > [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. > 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 <gwlund@lundeng.com> * Authors: * Vaibhav Hiremath <hvaibhav@ti.com> * Martin Hostettler <martin@neutronstar.dyndns.org> */ But then again the copy on my harddisk has these too... * Contributors: * Anuj Aggarwal <anuj.aggarwal@ti.com> * Sivaraj R <sivaraj@ti.com> Maybe i should add them too. Not sure really... - Martin Hostettler -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
> -----Original Message----- > From: martin@neutronstar.dyndns.org [mailto:martin@neutronstar.dyndns.org] > Sent: Tuesday, September 20, 2011 12:55 AM > To: Hiremath, Vaibhav > Cc: Laurent Pinchart; Tony Lindgren; linux-omap@vger.kernel.org; linux- > media@vger.kernel.org; linux-arm-kernel@lists.infradead.org > Subject: Re: [PATCH v2] arm: omap3evm: Add support for an MT9M032 based > camera board. > > On Mon, Sep 19, 2011 at 11:37:37AM +0530, Hiremath, Vaibhav wrote: > > > > > -----Original Message----- > > > From: linux-omap-owner@vger.kernel.org [mailto:linux-omap- > > > owner@vger.kernel.org] On Behalf Of Laurent Pinchart > > > Sent: Monday, September 19, 2011 3:29 AM > > > To: Martin Hostettler > > > Cc: Tony Lindgren; linux-omap@vger.kernel.org; linux- > > > media@vger.kernel.org; linux-arm-kernel@lists.infradead.org > > > Subject: Re: [PATCH v2] arm: omap3evm: Add support for an MT9M032 > based > > > camera board. > > > > > > Hi Martin, > > > > > > On Saturday 17 September 2011 11:34:57 Martin Hostettler wrote: > > > > Adds board support for an MT9M032 based camera to omap3evm. > > > > > > > > Sigend-off-by: Martin Hostettler <martin@neutronstar.dyndns.org> > > > > --- > > > > 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 > > > > > > > > diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach- > omap2/Makefile > > > > index f343365..8ae3d25 100644 > > > > --- a/arch/arm/mach-omap2/Makefile > > > > +++ b/arch/arm/mach-omap2/Makefile > > > > @@ -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 > > > > diff --git a/arch/arm/mach-omap2/board-omap3evm-camera.c > > > > b/arch/arm/mach-omap2/board-omap3evm-camera.c new file mode 100644 > > > > index 0000000..be987d9 > > > > --- /dev/null > > > > +++ b/arch/arm/mach-omap2/board-omap3evm-camera.c > > > > @@ -0,0 +1,183 @@ > > > > +/* > > > > + * Copyright (C) 2010-2011 Lund Engineering > > > > + * Contact: Gil Lund <gwlund@lundeng.com> > > > > + * Author: Martin Hostettler <martin@neutronstar.dyndns.org> > > > > + * > > [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=adcd067326836777c04 > 9e3cb32a5b7d9d401fc31 > > > > 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. > 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. > 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. > * Copyright (C) 2010-2011 Lund Engineering > * Contact: Gil Lund <gwlund@lundeng.com> Not sure do you really need above line... > * Authors: > * Vaibhav Hiremath <hvaibhav@ti.com> > * Martin Hostettler <martin@neutronstar.dyndns.org> > */ > > Looks ok to me. > But then again the copy on my harddisk has these too... > > * Contributors: > * Anuj Aggarwal <anuj.aggarwal@ti.com> > * Sivaraj R <sivaraj@ti.com> > > 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 > - Martin Hostettler -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index f343365..8ae3d25 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile @@ -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 diff --git a/arch/arm/mach-omap2/board-omap3evm-camera.c b/arch/arm/mach-omap2/board-omap3evm-camera.c new file mode 100644 index 0000000..be987d9 --- /dev/null +++ b/arch/arm/mach-omap2/board-omap3evm-camera.c @@ -0,0 +1,183 @@ +/* + * Copyright (C) 2010-2011 Lund Engineering + * Contact: Gil Lund <gwlund@lundeng.com> + * Author: Martin Hostettler <martin@neutronstar.dyndns.org> + * + * 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 + */ + +#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 + */ +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); + 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: + return ret; +} + +device_initcall(camera_init);