Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v2.6.37-rc7 297 lines 10 kB view raw
1/* 2 * camera image capture (abstract) bus driver header 3 * 4 * Copyright (C) 2006, Sascha Hauer, Pengutronix 5 * Copyright (C) 2008, Guennadi Liakhovetski <kernel@pengutronix.de> 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License version 2 as 9 * published by the Free Software Foundation. 10 */ 11 12#ifndef SOC_CAMERA_H 13#define SOC_CAMERA_H 14 15#include <linux/device.h> 16#include <linux/mutex.h> 17#include <linux/pm.h> 18#include <linux/videodev2.h> 19#include <media/videobuf-core.h> 20#include <media/v4l2-device.h> 21 22extern struct bus_type soc_camera_bus_type; 23 24struct file; 25 26struct soc_camera_device { 27 struct list_head list; 28 struct device dev; 29 struct device *pdev; /* Platform device */ 30 s32 user_width; 31 s32 user_height; 32 enum v4l2_colorspace colorspace; 33 unsigned char iface; /* Host number */ 34 unsigned char devnum; /* Device number per host */ 35 struct soc_camera_sense *sense; /* See comment in struct definition */ 36 struct soc_camera_ops *ops; 37 struct video_device *vdev; 38 const struct soc_camera_format_xlate *current_fmt; 39 struct soc_camera_format_xlate *user_formats; 40 int num_user_formats; 41 enum v4l2_field field; /* Preserve field over close() */ 42 void *host_priv; /* Per-device host private data */ 43 /* soc_camera.c private count. Only accessed with .video_lock held */ 44 int use_count; 45 struct mutex video_lock; /* Protects device data */ 46 struct file *streamer; /* stream owner */ 47 struct videobuf_queue vb_vidq; 48}; 49 50struct soc_camera_host { 51 struct v4l2_device v4l2_dev; 52 struct list_head list; 53 unsigned char nr; /* Host number */ 54 void *priv; 55 const char *drv_name; 56 struct soc_camera_host_ops *ops; 57}; 58 59struct soc_camera_host_ops { 60 struct module *owner; 61 int (*add)(struct soc_camera_device *); 62 void (*remove)(struct soc_camera_device *); 63 int (*suspend)(struct soc_camera_device *, pm_message_t); 64 int (*resume)(struct soc_camera_device *); 65 /* 66 * .get_formats() is called for each client device format, but 67 * .put_formats() is only called once. Further, if any of the calls to 68 * .get_formats() fail, .put_formats() will not be called at all, the 69 * failing .get_formats() must then clean up internally. 70 */ 71 int (*get_formats)(struct soc_camera_device *, unsigned int, 72 struct soc_camera_format_xlate *); 73 void (*put_formats)(struct soc_camera_device *); 74 int (*cropcap)(struct soc_camera_device *, struct v4l2_cropcap *); 75 int (*get_crop)(struct soc_camera_device *, struct v4l2_crop *); 76 int (*set_crop)(struct soc_camera_device *, struct v4l2_crop *); 77 int (*set_fmt)(struct soc_camera_device *, struct v4l2_format *); 78 int (*try_fmt)(struct soc_camera_device *, struct v4l2_format *); 79 void (*init_videobuf)(struct videobuf_queue *, 80 struct soc_camera_device *); 81 int (*reqbufs)(struct soc_camera_device *, struct v4l2_requestbuffers *); 82 int (*querycap)(struct soc_camera_host *, struct v4l2_capability *); 83 int (*set_bus_param)(struct soc_camera_device *, __u32); 84 int (*get_ctrl)(struct soc_camera_device *, struct v4l2_control *); 85 int (*set_ctrl)(struct soc_camera_device *, struct v4l2_control *); 86 int (*get_parm)(struct soc_camera_device *, struct v4l2_streamparm *); 87 int (*set_parm)(struct soc_camera_device *, struct v4l2_streamparm *); 88 unsigned int (*poll)(struct file *, poll_table *); 89 const struct v4l2_queryctrl *controls; 90 int num_controls; 91}; 92 93#define SOCAM_SENSOR_INVERT_PCLK (1 << 0) 94#define SOCAM_SENSOR_INVERT_MCLK (1 << 1) 95#define SOCAM_SENSOR_INVERT_HSYNC (1 << 2) 96#define SOCAM_SENSOR_INVERT_VSYNC (1 << 3) 97#define SOCAM_SENSOR_INVERT_DATA (1 << 4) 98 99struct i2c_board_info; 100 101struct soc_camera_link { 102 /* Camera bus id, used to match a camera and a bus */ 103 int bus_id; 104 /* Per camera SOCAM_SENSOR_* bus flags */ 105 unsigned long flags; 106 int i2c_adapter_id; 107 struct i2c_board_info *board_info; 108 const char *module_name; 109 void *priv; 110 111 /* 112 * For non-I2C devices platform platform has to provide methods to 113 * add a device to the system and to remove 114 */ 115 int (*add_device)(struct soc_camera_link *, struct device *); 116 void (*del_device)(struct soc_camera_link *); 117 /* Optional callbacks to power on or off and reset the sensor */ 118 int (*power)(struct device *, int); 119 int (*reset)(struct device *); 120 /* 121 * some platforms may support different data widths than the sensors 122 * native ones due to different data line routing. Let the board code 123 * overwrite the width flags. 124 */ 125 int (*set_bus_param)(struct soc_camera_link *, unsigned long flags); 126 unsigned long (*query_bus_param)(struct soc_camera_link *); 127 void (*free_bus)(struct soc_camera_link *); 128}; 129 130static inline struct soc_camera_device *to_soc_camera_dev( 131 const struct device *dev) 132{ 133 return container_of(dev, struct soc_camera_device, dev); 134} 135 136static inline struct soc_camera_host *to_soc_camera_host( 137 const struct device *dev) 138{ 139 struct v4l2_device *v4l2_dev = dev_get_drvdata(dev); 140 141 return container_of(v4l2_dev, struct soc_camera_host, v4l2_dev); 142} 143 144static inline struct soc_camera_link *to_soc_camera_link( 145 const struct soc_camera_device *icd) 146{ 147 return icd->dev.platform_data; 148} 149 150static inline struct device *to_soc_camera_control( 151 const struct soc_camera_device *icd) 152{ 153 return dev_get_drvdata(&icd->dev); 154} 155 156static inline struct v4l2_subdev *soc_camera_to_subdev( 157 const struct soc_camera_device *icd) 158{ 159 struct device *control = to_soc_camera_control(icd); 160 return dev_get_drvdata(control); 161} 162 163int soc_camera_host_register(struct soc_camera_host *ici); 164void soc_camera_host_unregister(struct soc_camera_host *ici); 165 166const struct soc_camera_format_xlate *soc_camera_xlate_by_fourcc( 167 struct soc_camera_device *icd, unsigned int fourcc); 168 169/** 170 * struct soc_camera_format_xlate - match between host and sensor formats 171 * @code: code of a sensor provided format 172 * @host_fmt: host format after host translation from code 173 * 174 * Host and sensor translation structure. Used in table of host and sensor 175 * formats matchings in soc_camera_device. A host can override the generic list 176 * generation by implementing get_formats(), and use it for format checks and 177 * format setup. 178 */ 179struct soc_camera_format_xlate { 180 enum v4l2_mbus_pixelcode code; 181 const struct soc_mbus_pixelfmt *host_fmt; 182}; 183 184struct soc_camera_ops { 185 int (*suspend)(struct soc_camera_device *, pm_message_t state); 186 int (*resume)(struct soc_camera_device *); 187 unsigned long (*query_bus_param)(struct soc_camera_device *); 188 int (*set_bus_param)(struct soc_camera_device *, unsigned long); 189 int (*enum_input)(struct soc_camera_device *, struct v4l2_input *); 190 const struct v4l2_queryctrl *controls; 191 int num_controls; 192}; 193 194#define SOCAM_SENSE_PCLK_CHANGED (1 << 0) 195 196/** 197 * This struct can be attached to struct soc_camera_device by the host driver 198 * to request sense from the camera, for example, when calling .set_fmt(). The 199 * host then can check which flags are set and verify respective values if any. 200 * For example, if SOCAM_SENSE_PCLK_CHANGED is set, it means, pixclock has 201 * changed during this operation. After completion the host should detach sense. 202 * 203 * @flags ored SOCAM_SENSE_* flags 204 * @master_clock if the host wants to be informed about pixel-clock 205 * change, it better set master_clock. 206 * @pixel_clock_max maximum pixel clock frequency supported by the host, 207 * camera is not allowed to exceed this. 208 * @pixel_clock if the camera driver changed pixel clock during this 209 * operation, it sets SOCAM_SENSE_PCLK_CHANGED, uses 210 * master_clock to calculate the new pixel-clock and 211 * sets this field. 212 */ 213struct soc_camera_sense { 214 unsigned long flags; 215 unsigned long master_clock; 216 unsigned long pixel_clock_max; 217 unsigned long pixel_clock; 218}; 219 220static inline struct v4l2_queryctrl const *soc_camera_find_qctrl( 221 struct soc_camera_ops *ops, int id) 222{ 223 int i; 224 225 for (i = 0; i < ops->num_controls; i++) 226 if (ops->controls[i].id == id) 227 return &ops->controls[i]; 228 229 return NULL; 230} 231 232#define SOCAM_MASTER (1 << 0) 233#define SOCAM_SLAVE (1 << 1) 234#define SOCAM_HSYNC_ACTIVE_HIGH (1 << 2) 235#define SOCAM_HSYNC_ACTIVE_LOW (1 << 3) 236#define SOCAM_VSYNC_ACTIVE_HIGH (1 << 4) 237#define SOCAM_VSYNC_ACTIVE_LOW (1 << 5) 238#define SOCAM_DATAWIDTH_4 (1 << 6) 239#define SOCAM_DATAWIDTH_8 (1 << 7) 240#define SOCAM_DATAWIDTH_9 (1 << 8) 241#define SOCAM_DATAWIDTH_10 (1 << 9) 242#define SOCAM_DATAWIDTH_15 (1 << 10) 243#define SOCAM_DATAWIDTH_16 (1 << 11) 244#define SOCAM_PCLK_SAMPLE_RISING (1 << 12) 245#define SOCAM_PCLK_SAMPLE_FALLING (1 << 13) 246#define SOCAM_DATA_ACTIVE_HIGH (1 << 14) 247#define SOCAM_DATA_ACTIVE_LOW (1 << 15) 248 249#define SOCAM_DATAWIDTH_MASK (SOCAM_DATAWIDTH_4 | SOCAM_DATAWIDTH_8 | \ 250 SOCAM_DATAWIDTH_9 | SOCAM_DATAWIDTH_10 | \ 251 SOCAM_DATAWIDTH_15 | SOCAM_DATAWIDTH_16) 252 253static inline unsigned long soc_camera_bus_param_compatible( 254 unsigned long camera_flags, unsigned long bus_flags) 255{ 256 unsigned long common_flags, hsync, vsync, pclk, data, buswidth, mode; 257 258 common_flags = camera_flags & bus_flags; 259 260 hsync = common_flags & (SOCAM_HSYNC_ACTIVE_HIGH | SOCAM_HSYNC_ACTIVE_LOW); 261 vsync = common_flags & (SOCAM_VSYNC_ACTIVE_HIGH | SOCAM_VSYNC_ACTIVE_LOW); 262 pclk = common_flags & (SOCAM_PCLK_SAMPLE_RISING | SOCAM_PCLK_SAMPLE_FALLING); 263 data = common_flags & (SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATA_ACTIVE_LOW); 264 mode = common_flags & (SOCAM_MASTER | SOCAM_SLAVE); 265 buswidth = common_flags & SOCAM_DATAWIDTH_MASK; 266 267 return (!hsync || !vsync || !pclk || !data || !mode || !buswidth) ? 0 : 268 common_flags; 269} 270 271static inline void soc_camera_limit_side(int *start, int *length, 272 unsigned int start_min, 273 unsigned int length_min, unsigned int length_max) 274{ 275 if (*length < length_min) 276 *length = length_min; 277 else if (*length > length_max) 278 *length = length_max; 279 280 if (*start < start_min) 281 *start = start_min; 282 else if (*start > start_min + length_max - *length) 283 *start = start_min + length_max - *length; 284} 285 286extern unsigned long soc_camera_apply_sensor_flags(struct soc_camera_link *icl, 287 unsigned long flags); 288 289/* This is only temporary here - until v4l2-subdev begins to link to video_device */ 290#include <linux/i2c.h> 291static inline struct video_device *soc_camera_i2c_to_vdev(struct i2c_client *client) 292{ 293 struct soc_camera_device *icd = client->dev.platform_data; 294 return icd->vdev; 295} 296 297#endif