Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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