2 * arch/arm/mach-omap2/board-rx51-camera.c
4 * Copyright (C) 2008 Nokia Corporation
6 * Contact: Sakari Ailus <sakari.ailus@nokia.com>
7 * Tuukka Toivonen <tuukka.o.toivonen@nokia.com>
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * version 2 as published by the Free Software Foundation.
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
25 #include <linux/i2c.h>
26 #include <linux/i2c/twl4030.h>
27 #include <linux/delay.h>
29 #include <linux/videodev2.h>
30 #include <linux/device.h>
33 #include <mach/control.h>
34 #include <mach/omap-pm.h>
36 #include "../../../drivers/media/video/omap34xxcam.h"
37 #include "../../../drivers/media/video/isp/ispreg.h"
38 #include "../../../drivers/media/video/et8ek8.h"
39 #include "../../../drivers/media/video/smia-sensor.h"
41 #include <media/ad5820.h>
42 #include <media/adp1653.h>
43 #include <media/smiaregs.h>
45 #include "board-rx51-camera.h"
47 #define ADP1653_GPIO_ENABLE 88 /* Used for resetting ADP1653 */
48 #define ADP1653_GPIO_INT 167 /* Fault interrupt */
49 #define ADP1653_GPIO_STROBE 126 /* Pin used in cam_strobe mode ->
50 * control using ISP drivers */
52 #define STINGRAY_RESET_GPIO 102
53 #define ACMELITE_RESET_GPIO 97 /* Used also to MUX between cameras */
55 #define RX51_CAMERA_STINGRAY 0
56 #define RX51_CAMERA_ACMELITE 1
61 #define GPIO_DIR_OUTPUT 0
69 /* Assign camera to peripheral power group P3 */
70 #define CAMERA_DEV_GRP (0x4 << 5)
71 #define VAUX2_1V8 0x05
72 #define VAUX3_1V8 0x01
73 #define VAUX4_2V8 0x09
75 /* Earlier rx51 builds require VAUX3. */
76 #define NEEDS_VAUX3 (system_rev >= 0x100 && system_rev < 0x900)
78 static struct rx51_camera {
83 static DEFINE_MUTEX(rx51_camera_mutex);
85 /* Acquires the given slave `which' for camera if possible.
86 * Returns the bitmask containing previously acquired slaves for the device.
88 static int rx51_camera_acquire(int camera, int which)
90 int other = 1 - camera;
93 if (!rx51_camera[camera].okay)
96 if (rx51_camera[other].inuse)
99 old_which = rx51_camera[camera].inuse;
100 rx51_camera[camera].inuse |= which;
105 /* Releases the given slave `which' for camera.
106 * Returns the bitmask containing still acquired slaves for the device.
108 static int rx51_camera_release(int camera, int which)
110 rx51_camera[camera].inuse &= ~which;
112 return rx51_camera[camera].inuse;
115 static int rx51_camera_power_on_nolock(int camera)
120 gpio_set_value(STINGRAY_RESET_GPIO, 0);
122 /* Mux to Stingray and reset Acme Lite */
123 gpio_set_value(ACMELITE_RESET_GPIO, 0);
125 /* VAUX2=1.8 V (muxer voltage) */
126 rval = twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
127 VAUX2_1V8, TWL4030_VAUX2_DEDICATED);
130 rval = twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
131 CAMERA_DEV_GRP, TWL4030_VAUX2_DEV_GRP);
135 /* Off & sleep -> Active state */
136 rval = twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
137 0xEE, TWL4030_VAUX2_REMAP);
141 /* VAUX4=2.8 V (camera VANA) */
142 rval = twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
143 VAUX4_2V8, TWL4030_VAUX4_DEDICATED);
146 rval = twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
147 CAMERA_DEV_GRP, TWL4030_VAUX4_DEV_GRP);
150 rval = twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
151 0xEE, TWL4030_VAUX4_REMAP);
156 /* VAUX3=1.8 V (camera VDIG) */
157 printk(KERN_INFO "%s: VAUX3 on for old board\n", __func__);
158 rval = twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
160 TWL4030_VAUX3_DEDICATED);
163 rval = twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
165 TWL4030_VAUX3_DEV_GRP);
168 rval = twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
169 0xEE, TWL4030_VAUX3_REMAP);
174 /* Let the voltages stabilize */
177 /* XSHUTDOWN on, enable camera and set muxer */
178 gpio_set_value(camera == RX51_CAMERA_STINGRAY ?
179 STINGRAY_RESET_GPIO : ACMELITE_RESET_GPIO, 1);
181 /* CONTROL_CSIRXFE */
184 * CSIb receiver data/clock or data/strobe mode
186 * Stingray uses data/strobe.
188 ((camera ? 0 : 1) << 10)
189 | BIT(12) /* Enable differential transceiver */
190 | BIT(13) /* Disable reset */
191 , OMAP343X_CTRL_BASE + OMAP343X_CONTROL_CSIRXFE);
193 /* Let the voltages stabilize */
199 printk(KERN_ALERT "%s: Error %d in writing to TWL4030!\n", __func__,
205 static int rx51_camera_power_on(int camera, int which)
209 mutex_lock(&rx51_camera_mutex);
211 rval = rx51_camera_acquire(camera, which);
214 rval = rx51_camera_power_on_nolock(camera);
218 mutex_unlock(&rx51_camera_mutex);
221 printk(KERN_INFO "%s: power_on camera %d which %d failed\n",
222 __func__, camera, which);
227 static void rx51_camera_power_off_nolock(int camera)
232 gpio_set_value(STINGRAY_RESET_GPIO, 0);
233 gpio_set_value(ACMELITE_RESET_GPIO, 0);
235 /* VAUX2 (muxer voltage) off */
236 rval = twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
237 0, TWL4030_VAUX2_DEV_GRP);
240 /* Off & sleep -> Off state */
241 rval = twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
242 0x00, TWL4030_VAUX2_REMAP);
246 /* VAUX4 (camera VANA) off */
247 rval = twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
248 0, TWL4030_VAUX4_DEV_GRP);
251 rval = twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
252 0x00, TWL4030_VAUX4_REMAP);
257 printk(KERN_INFO "%s: VAUX3 off for old board\n", __func__);
258 /* VAUX3 (camera VDIG) off */
259 rval = twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
260 0, TWL4030_VAUX3_DEV_GRP);
263 rval = twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
264 0x00, TWL4030_VAUX3_REMAP);
272 printk(KERN_ALERT "%s: Error %d in writing to TWL4030!\n", __func__,
276 static void rx51_camera_power_off(int camera, int which)
280 mutex_lock(&rx51_camera_mutex);
282 rval = rx51_camera_release(camera, which);
284 rx51_camera_power_off_nolock(camera);
286 mutex_unlock(&rx51_camera_mutex);
289 static void __init rx51_stingray_init(void)
291 if (gpio_request(STINGRAY_RESET_GPIO, "stingray reset") != 0) {
292 printk(KERN_INFO "%s: unable to acquire Stingray reset gpio\n",
297 /* XSHUTDOWN off, reset */
298 gpio_direction_output(STINGRAY_RESET_GPIO, 0);
299 rx51_camera_power_off_nolock(RX51_CAMERA_STINGRAY);
300 rx51_camera[RX51_CAMERA_STINGRAY].okay = 1;
301 rx51_camera[RX51_CAMERA_STINGRAY].inuse = 0;
304 static void __init rx51_acmelite_init(void)
306 if (gpio_request(ACMELITE_RESET_GPIO, "acmelite reset") != 0) {
307 printk(KERN_INFO "%s: unable to acquire Acme Lite reset gpio\n",
312 /* XSHUTDOWN off, reset */
313 gpio_direction_output(ACMELITE_RESET_GPIO, 0);
314 rx51_camera_power_off_nolock(RX51_CAMERA_ACMELITE);
315 rx51_camera[RX51_CAMERA_ACMELITE].okay = 1;
316 rx51_camera[RX51_CAMERA_ACMELITE].inuse = 0;
319 static int __init rx51_adp1653_init(void)
323 err = gpio_request(ADP1653_GPIO_ENABLE, "adp1653 enable");
325 printk(KERN_ERR ADP1653_NAME
326 " Failed to request EN gpio\n");
328 goto err_omap_request_gpio;
331 err = gpio_request(ADP1653_GPIO_INT, "adp1653 interrupt");
333 printk(KERN_ERR ADP1653_NAME " Failed to request IRQ gpio\n");
335 goto err_omap_request_gpio_2;
338 err = gpio_request(ADP1653_GPIO_STROBE, "adp1653 strobe");
340 printk(KERN_ERR ADP1653_NAME
341 " Failed to request STROBE gpio\n");
343 goto err_omap_request_gpio_3;
346 gpio_direction_output(ADP1653_GPIO_ENABLE, 0);
347 gpio_direction_input(ADP1653_GPIO_INT);
348 gpio_direction_output(ADP1653_GPIO_STROBE, 0);
352 err_omap_request_gpio_3:
353 gpio_free(ADP1653_GPIO_INT);
355 err_omap_request_gpio_2:
356 gpio_free(ADP1653_GPIO_ENABLE);
358 err_omap_request_gpio:
362 static int __init rx51_camera_hw_init(void)
366 rval = rx51_adp1653_init();
370 mutex_init(&rx51_camera_mutex);
371 rx51_stingray_init();
372 rx51_acmelite_init();
383 #define STINGRAY_XCLK OMAP34XXCAM_XCLK_A
385 static struct isp_interface_config rx51_stingray_config = {
386 .ccdc_par_ser = ISP_CSIB,
388 .hsvs_syncdetect = ISPCTRL_SYNC_DETECT_VSRISE,
399 .strobe_clock_inv = 0,
408 static struct omap34xxcam_hw_config rx51_stingray_omap34xxcam_hw_config = {
411 .dev_type = OMAP34XXCAM_SLAVE_SENSOR,
415 .capture_mem = PAGE_ALIGN(2608 * 1966 * 2) * 2,
416 .ival_default = { 1, 30 },
421 static int rx51_stingray_configure_interface(struct v4l2_int_device *s,
422 struct smia_mode *mode)
424 struct omap34xxcam_videodev *vdev = s->u.slave->master->priv;
425 static const int S = 8;
427 /* Configure sensor interface. */
428 rx51_stingray_config.u.csi.format = mode->pixel_format;
429 rx51_stingray_config.u.csi.data_size = mode->window_height;
430 /* Calculate average pixel clock per line. Assume buffers can spread
431 * the data over horizontal blanking time. Rounding upwards. */
432 rx51_stingray_config.pixelclk =
434 * (((mode->pixel_clock + (1<<S) - 1) >> S) + mode->width - 1)
436 rx51_stingray_config.pixelclk <<= S;
437 return isp_configure_interface(vdev->cam->isp, &rx51_stingray_config);
440 static int rx51_stingray_set_xclk(struct v4l2_int_device *s, int hz)
442 struct omap34xxcam_videodev *vdev = s->u.slave->master->priv;
444 isp_set_xclk(vdev->cam->isp, hz, STINGRAY_XCLK);
449 static int rx51_stingray_power_on(struct v4l2_int_device *s)
451 struct omap34xxcam_videodev *vdev = s->u.slave->master->priv;
452 struct device *dev = vdev->cam->isp;
455 omap_pm_set_min_bus_tput(dev, OCP_INITIATOR_AGENT, 400000);
457 rval = rx51_camera_power_on(RX51_CAMERA_STINGRAY, RX51_SENSOR);
460 omap_pm_set_min_bus_tput(dev, 2, 0);
465 static int rx51_stingray_power_off(struct v4l2_int_device *s)
467 struct omap34xxcam_videodev *vdev = s->u.slave->master->priv;
468 struct device *dev = vdev->cam->isp;
470 rx51_camera_power_off(RX51_CAMERA_STINGRAY, RX51_SENSOR);
472 omap_pm_set_min_bus_tput(dev, OCP_INITIATOR_AGENT, 0);
477 static int rx51_stingray_g_priv(struct v4l2_int_device *s, void *priv)
479 *(struct omap34xxcam_hw_config *)priv =
480 rx51_stingray_omap34xxcam_hw_config;
485 static struct et8ek8_platform_data et8ek8_tmp_platform_data;
487 static struct et8ek8_platform_data et8ek8_my_platform_data = {
488 .g_priv = rx51_stingray_g_priv,
489 .configure_interface = rx51_stingray_configure_interface,
490 .set_xclk = rx51_stingray_set_xclk,
491 .power_on = rx51_stingray_power_on,
492 .power_off = rx51_stingray_power_off,
501 static struct omap34xxcam_hw_config ad5820_omap34xxcam_hw_config = {
504 .dev_type = OMAP34XXCAM_SLAVE_LENS,
511 static int ad5820_g_priv(struct v4l2_int_device *s, void *priv)
513 *(struct omap34xxcam_hw_config *)priv = ad5820_omap34xxcam_hw_config;
518 static int ad5820_s_power(struct v4l2_int_device *s, enum v4l2_power state)
520 if (state == V4L2_POWER_ON)
521 return rx51_camera_power_on(RX51_CAMERA_STINGRAY, RX51_LENS);
523 rx51_camera_power_off(RX51_CAMERA_STINGRAY, RX51_LENS);
528 static struct ad5820_platform_data ad5820_tmp_platform_data;
530 static struct ad5820_platform_data ad5820_my_platform_data = {
531 .g_priv = ad5820_g_priv,
532 .s_power = ad5820_s_power,
542 static struct omap34xxcam_hw_config adp1653_omap34xxcam_hw_config = {
545 .dev_type = OMAP34XXCAM_SLAVE_FLASH,
552 static int rx51_adp1653_g_priv(struct v4l2_int_device *s, void *priv)
554 *(struct omap34xxcam_hw_config *)priv = adp1653_omap34xxcam_hw_config;
559 static int rx51_adp1653_power_on(struct v4l2_int_device *s)
561 gpio_set_value(ADP1653_GPIO_ENABLE, 1);
563 /* Some delay is apparently required. */
569 static int rx51_adp1653_power_off(struct v4l2_int_device *s)
571 gpio_set_value(ADP1653_GPIO_ENABLE, 0);
576 static struct adp1653_platform_data adp1653_tmp_platform_data;
578 static struct adp1653_platform_data adp1653_my_platform_data = {
579 .g_priv = rx51_adp1653_g_priv,
580 .power_on = rx51_adp1653_power_on,
581 .power_off = rx51_adp1653_power_off,
582 /* Must be limited to 500 ms in RX-51 */
583 .max_flash_timeout = 500000, /* us */
584 /* Must be limited to 320 mA in RX-51 B3 and newer hardware */
585 .max_flash_intensity = 19,
586 /* Must be limited to 50 mA in RX-51 */
587 .max_torch_intensity = 1,
588 .max_indicator_intensity = ADP1653_REG_OUT_SEL_ILED_MAX,
597 #define ACMELITE_XCLK OMAP34XXCAM_XCLK_A
599 static struct isp_interface_config rx51_acmelite_config = {
600 .ccdc_par_ser = ISP_CSIB,
602 .hsvs_syncdetect = ISPCTRL_SYNC_DETECT_VSRISE,
613 .strobe_clock_inv = 0,
618 .format = V4L2_PIX_FMT_SGRBG10,
623 static struct omap34xxcam_hw_config rx51_acmelite_omap34xxcam_hw_config = {
626 .dev_type = OMAP34XXCAM_SLAVE_SENSOR,
630 .capture_mem = PAGE_ALIGN(648 * 488 * 2) * 4,
631 .ival_default = { 1, 30 },
636 static int rx51_acmelite_configure_interface(struct v4l2_int_device *s,
637 int width, int height)
639 struct omap34xxcam_videodev *vdev = s->u.slave->master->priv;
641 /* Configure sensor interface. */
642 rx51_acmelite_config.u.csi.data_size = height;
644 return isp_configure_interface(vdev->cam->isp, &rx51_acmelite_config);
647 static int rx51_acmelite_set_xclk(struct v4l2_int_device *s, int hz)
649 struct omap34xxcam_videodev *vdev = s->u.slave->master->priv;
651 isp_set_xclk(vdev->cam->isp, hz, ACMELITE_XCLK);
656 static int rx51_acmelite_power_on(struct v4l2_int_device *s)
658 struct omap34xxcam_videodev *vdev = s->u.slave->master->priv;
659 struct device *dev = vdev->cam->isp;
662 omap_pm_set_min_bus_tput(dev, OCP_INITIATOR_AGENT, 400000);
664 rval = rx51_camera_power_on(RX51_CAMERA_ACMELITE, RX51_SENSOR);
667 omap_pm_set_min_bus_tput(dev, 2, 0);
672 static int rx51_acmelite_power_off(struct v4l2_int_device *s)
674 struct omap34xxcam_videodev *vdev = s->u.slave->master->priv;
675 struct device *dev = vdev->cam->isp;
677 rx51_camera_power_off(RX51_CAMERA_ACMELITE, RX51_SENSOR);
679 omap_pm_set_min_bus_tput(dev, OCP_INITIATOR_AGENT, 0);
684 static int rx51_acmelite_g_priv(struct v4l2_int_device *s, void *priv)
686 *(struct omap34xxcam_hw_config *)priv =
687 rx51_acmelite_omap34xxcam_hw_config;
692 static struct smia_sensor_platform_data smia_sensor_tmp_platform_data;
694 static struct smia_sensor_platform_data smia_sensor_my_platform_data = {
695 .g_priv = rx51_acmelite_g_priv,
696 .configure_interface = rx51_acmelite_configure_interface,
697 .set_xclk = rx51_acmelite_set_xclk,
698 .power_on = rx51_acmelite_power_on,
699 .power_off = rx51_acmelite_power_off,
708 static int __init rx51_camera_init(void) {
711 err = rx51_camera_hw_init();
716 adp1653_tmp_platform_data = rx51_adp1653_platform_data;
717 rx51_adp1653_platform_data = adp1653_my_platform_data;
720 et8ek8_tmp_platform_data = rx51_et8ek8_platform_data;
721 rx51_et8ek8_platform_data = et8ek8_my_platform_data;
724 ad5820_tmp_platform_data = rx51_ad5820_platform_data;
725 rx51_ad5820_platform_data = ad5820_my_platform_data;
728 smia_sensor_tmp_platform_data = rx51_smia_sensor_platform_data;
729 rx51_smia_sensor_platform_data = smia_sensor_my_platform_data;
731 /* FIXME: can't unload yet. */
732 __module_get(THIS_MODULE);
734 /* FIXME: somehow initiate device init. */
735 v4l2_int_device_try_attach_all();
740 static void __exit rx51_camera_exit(void) {
741 rx51_et8ek8_platform_data = et8ek8_tmp_platform_data;
742 rx51_ad5820_platform_data = ad5820_tmp_platform_data;
743 rx51_adp1653_platform_data = adp1653_tmp_platform_data;
744 rx51_smia_sensor_platform_data = smia_sensor_tmp_platform_data;
746 gpio_free(ADP1653_GPIO_ENABLE);
747 gpio_free(ADP1653_GPIO_INT);
748 gpio_free(ADP1653_GPIO_STROBE);
751 module_init(rx51_camera_init);
752 module_exit(rx51_camera_exit);
754 MODULE_LICENSE("GPL");