Hello,

I'm sending ADP1653 flash torch board code for Nokia RX-51. Kernel
driver ADP1653 is already in upstream kernel. Board code was extracted
from this big camera meego patch:

https://api.pub.meego.com/public/source/CE:Adaptation:N900/kernel-adaptation-n900/linux-2.6-Camera-for-Meego-N900-Adaptation-kernel-2.6.37-patch.patch

diff --git a/arch/arm/mach-omap2/board-rx51.c b/arch/arm/mach-omap2/board-rx51.c
index d0374ea..92117a13 100644
--- a/arch/arm/mach-omap2/board-rx51.c
+++ b/arch/arm/mach-omap2/board-rx51.c
@@ -75,6 +75,7 @@ static struct platform_device leds_gpio = {
 */
 
 extern void __init rx51_peripherals_init(void);
+extern void __init rx51_camera_init(void);
 
 #ifdef CONFIG_OMAP_MUX
 static struct omap_board_mux board_mux[] __initdata = {
@@ -100,6 +101,7 @@ static void __init rx51_init(void)
 
        usb_musb_init(&musb_board_data);
        rx51_peripherals_init();
+       rx51_camera_init();
 
        /* Ensure SDRC pins are mux'd for self-refresh */
        omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
diff --git a/arch/arm/mach-omap2/board-rx51-camera.c 
b/arch/arm/mach-omap2/board-rx51-camera.c
new file mode 100644
index 0000000..26b37ea
--- /dev/null
+++ b/arch/arm/mach-omap2/board-rx51-camera.c
@@ -0,0 +1,177 @@
+/*
+ * arch/arm/mach-omap2/board-rx51-camera.c
+ *
+ * Copyright (C) 2008 Nokia Corporation
+ *
+ * Contact: Sakari Ailus <sakari.ai...@nokia.com>
+ *          Tuukka Toivonen <tuukka.o.toivo...@nokia.com>
+ *
+ * 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/delay.h>
+
+#include <asm/gpio.h>
+
+#include "../../../drivers/media/platform/omap3isp/isp.h"
+
+#include <media/adp1653.h>
+
+#include "devices.h"
+
+#define ADP1653_GPIO_ENABLE    88      /* Used for resetting ADP1653 */
+#define ADP1653_GPIO_INT       167     /* Fault interrupt */
+#define ADP1653_GPIO_STROBE    126     /* Pin used in cam_strobe mode ->
+                                        * control using ISP drivers */
+
+static int __init rx51_adp1653_init(void)
+{
+       int err;
+
+       err = gpio_request(ADP1653_GPIO_ENABLE, "adp1653 enable");
+       if (err) {
+               printk(KERN_ERR ADP1653_NAME
+                      " Failed to request EN gpio\n");
+               err = -ENODEV;
+               goto err_omap_request_gpio;
+       }
+
+       err = gpio_request(ADP1653_GPIO_INT, "adp1653 interrupt");
+       if (err) {
+               printk(KERN_ERR ADP1653_NAME " Failed to request IRQ gpio\n");
+               err = -ENODEV;
+               goto err_omap_request_gpio_2;
+       }
+
+       err = gpio_request(ADP1653_GPIO_STROBE, "adp1653 strobe");
+       if (err) {
+               printk(KERN_ERR ADP1653_NAME
+                      " Failed to request STROBE gpio\n");
+               err = -ENODEV;
+               goto err_omap_request_gpio_3;
+       }
+
+       gpio_direction_output(ADP1653_GPIO_ENABLE, 0);
+       gpio_direction_input(ADP1653_GPIO_INT);
+       gpio_direction_output(ADP1653_GPIO_STROBE, 0);
+
+       return 0;
+
+err_omap_request_gpio_3:
+       gpio_free(ADP1653_GPIO_INT);
+
+err_omap_request_gpio_2:
+       gpio_free(ADP1653_GPIO_ENABLE);
+
+err_omap_request_gpio:
+       return err;
+}
+
+static int __init rx51_camera_hw_init(void)
+{
+       int rval;
+
+       rval = rx51_adp1653_init();
+       if (rval)
+               return rval;
+
+       return 0;
+}
+
+/*
+ *
+ * ADP1653
+ *
+ */
+
+static int rx51_adp1653_power(struct v4l2_subdev *subdev, int on)
+{
+       gpio_set_value(ADP1653_GPIO_ENABLE, on);
+       if (on) {
+               /* Some delay is apparently required. */
+               udelay(20);
+       }
+
+       return 0;
+}
+
+static struct adp1653_platform_data rx51_adp1653_platform_data = {
+       .power                   = rx51_adp1653_power,
+       /* Must be limited to 500 ms in RX-51 */
+       .max_flash_timeout       = 500000,              /* us */
+       /* Must be limited to 320 mA in RX-51 B3 and newer hardware */
+       .max_flash_intensity     = ADP1653_FLASH_INTENSITY_REG_TO_mA(19),
+       /* Must be limited to 50 mA in RX-51 */
+       .max_torch_intensity     = ADP1653_FLASH_INTENSITY_REG_TO_mA(1),
+       .max_indicator_intensity = ADP1653_INDICATOR_INTENSITY_REG_TO_uA(
+               ADP1653_REG_OUT_SEL_ILED_MAX),
+};
+
+/*
+ *
+ * Init it all
+ *
+ */
+
+#define ADP1653_I2C_BUS_NUM            2
+
+static struct i2c_board_info rx51_camera_i2c_devices[] = {
+       {
+               I2C_BOARD_INFO(ADP1653_NAME, ADP1653_I2C_ADDR),
+               .platform_data = &rx51_adp1653_platform_data,
+       },
+};
+
+static struct isp_subdev_i2c_board_info rx51_camera_primary_subdevs[] = {
+       {
+               .board_info = &rx51_camera_i2c_devices[0],
+               .i2c_adapter_id = ADP1653_I2C_BUS_NUM,
+       },
+       { NULL, 0, },
+};
+
+static struct isp_v4l2_subdevs_group rx51_camera_subdevs[] = {
+       {
+               .subdevs = rx51_camera_primary_subdevs,
+               .interface = ISP_INTERFACE_CCP2B_PHY1,
+               .bus = { .ccp2 = {
+                       .strobe_clk_pol         = 0,
+                       .crc                    = 1,
+                       .ccp2_mode              = 1,
+                       .phy_layer              = 1,
+                       .vpclk_div              = 1,
+               } },
+       },
+       { NULL, 0, },
+};
+
+static struct isp_platform_data rx51_isp_platform_data = {
+       .subdevs = rx51_camera_subdevs,
+};
+
+void __init rx51_camera_init(void)
+{
+       if (rx51_camera_hw_init()) {
+               printk(KERN_WARNING "%s: Unable to initialize camera\n",
+                      __func__);
+               return;
+       }
+
+       if (omap3_init_camera(&rx51_isp_platform_data) < 0)
+               printk(KERN_WARNING "%s: Unable to register camera platform "
+                      "device\n", __func__);
+}
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig
index be0f62b..268fa57 100644
--- a/arch/arm/mach-omap2/Kconfig
+++ b/arch/arm/mach-omap2/Kconfig
@@ -286,6 +287,7 @@ config MACH_NOKIA_RX51
        depends on ARCH_OMAP3
        default y
        select OMAP_PACKAGE_CBB
+       select VIDEO_ADP1653 if VIDEO_OMAP3 && VIDEO_HELPER_CHIPS_AUTO
 
 config MACH_OMAP_ZOOM2
        bool "OMAP3 Zoom2 board"
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
index c8b6ff3..df78c58 100644
--- a/arch/arm/mach-omap2/Makefile
+++ b/arch/arm/mach-omap2/Makefile
@@ -239,6 +239,7 @@ obj-$(CONFIG_MACH_NOKIA_RM680)              += 
board-rm680.o sdram-nokia.o
 obj-$(CONFIG_MACH_NOKIA_RX51)          += board-rx51.o sdram-nokia.o
 obj-$(CONFIG_MACH_NOKIA_RX51)          += board-rx51-peripherals.o
 obj-$(CONFIG_MACH_NOKIA_RX51)          += board-rx51-video.o
+obj-$(CONFIG_MACH_NOKIA_RX51)          += board-rx51-camera.o
 obj-$(CONFIG_MACH_OMAP_ZOOM2)          += board-zoom.o board-zoom-peripherals.o
 obj-$(CONFIG_MACH_OMAP_ZOOM2)          += board-zoom-display.o
 obj-$(CONFIG_MACH_OMAP_ZOOM2)          += board-zoom-debugboard.o


-- 
Pali Rohár
pali.ro...@gmail.com

Attachment: signature.asc
Description: This is a digitally signed message part.

Reply via email to