@@ -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);
new file mode 100644
@@ -0,0 +1,177 @@
+/*
+ * arch/arm/mach-omap2/board-rx51-camera.c
+ *
+ * Copyright (C) 2008 Nokia Corporation
+ *
+ * Contact: Sakari Ailus <sakari.ailus@nokia.com>
+ * Tuukka Toivonen <tuukka.o.toivonen@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__);
+}
@@ -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"
@@ -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