linux/drivers/media/i2c/smiapp/smiapp.h
<<
>>
Prefs
   1/*
   2 * drivers/media/i2c/smiapp/smiapp.h
   3 *
   4 * Generic driver for SMIA/SMIA++ compliant camera modules
   5 *
   6 * Copyright (C) 2010--2012 Nokia Corporation
   7 * Contact: Sakari Ailus <sakari.ailus@iki.fi>
   8 *
   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.
  12 *
  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.
  17 */
  18
  19#ifndef __SMIAPP_PRIV_H_
  20#define __SMIAPP_PRIV_H_
  21
  22#include <linux/mutex.h>
  23#include <media/v4l2-ctrls.h>
  24#include <media/v4l2-subdev.h>
  25#include <media/i2c/smiapp.h>
  26
  27#include "smiapp-pll.h"
  28#include "smiapp-reg.h"
  29#include "smiapp-regs.h"
  30#include "smiapp-quirk.h"
  31
  32/*
  33 * Standard SMIA++ constants
  34 */
  35#define SMIA_VERSION_1                  10
  36#define SMIAPP_VERSION_0_8              8 /* Draft 0.8 */
  37#define SMIAPP_VERSION_0_9              9 /* Draft 0.9 */
  38#define SMIAPP_VERSION_1                10
  39
  40#define SMIAPP_PROFILE_0                0
  41#define SMIAPP_PROFILE_1                1
  42#define SMIAPP_PROFILE_2                2
  43
  44#define SMIAPP_NVM_PAGE_SIZE            64      /* bytes */
  45
  46#define SMIAPP_RESET_DELAY_CLOCKS       2400
  47#define SMIAPP_RESET_DELAY(clk)                         \
  48        (1000 + (SMIAPP_RESET_DELAY_CLOCKS * 1000       \
  49                 + (clk) / 1000 - 1) / ((clk) / 1000))
  50
  51#define SMIAPP_COLOUR_COMPONENTS        4
  52
  53#include "smiapp-limits.h"
  54
  55struct smiapp_quirk;
  56
  57#define SMIAPP_MODULE_IDENT_FLAG_REV_LE         (1 << 0)
  58
  59struct smiapp_module_ident {
  60        u8 manufacturer_id;
  61        u16 model_id;
  62        u8 revision_number_major;
  63
  64        u8 flags;
  65
  66        char *name;
  67        const struct smiapp_quirk *quirk;
  68};
  69
  70struct smiapp_module_info {
  71        u32 manufacturer_id;
  72        u32 model_id;
  73        u32 revision_number_major;
  74        u32 revision_number_minor;
  75
  76        u32 module_year;
  77        u32 module_month;
  78        u32 module_day;
  79
  80        u32 sensor_manufacturer_id;
  81        u32 sensor_model_id;
  82        u32 sensor_revision_number;
  83        u32 sensor_firmware_version;
  84
  85        u32 smia_version;
  86        u32 smiapp_version;
  87
  88        u32 smiapp_profile;
  89
  90        char *name;
  91        const struct smiapp_quirk *quirk;
  92};
  93
  94#define SMIAPP_IDENT_FQ(manufacturer, model, rev, fl, _name, _quirk)    \
  95        { .manufacturer_id = manufacturer,                              \
  96          .model_id = model,                                            \
  97          .revision_number_major = rev,                                 \
  98          .flags = fl,                                                  \
  99          .name = _name,                                                \
 100          .quirk = _quirk, }
 101
 102#define SMIAPP_IDENT_LQ(manufacturer, model, rev, _name, _quirk)        \
 103        { .manufacturer_id = manufacturer,                              \
 104          .model_id = model,                                            \
 105          .revision_number_major = rev,                                 \
 106          .flags = SMIAPP_MODULE_IDENT_FLAG_REV_LE,                     \
 107          .name = _name,                                                \
 108          .quirk = _quirk, }
 109
 110#define SMIAPP_IDENT_L(manufacturer, model, rev, _name)                 \
 111        { .manufacturer_id = manufacturer,                              \
 112          .model_id = model,                                            \
 113          .revision_number_major = rev,                                 \
 114          .flags = SMIAPP_MODULE_IDENT_FLAG_REV_LE,                     \
 115          .name = _name, }
 116
 117#define SMIAPP_IDENT_Q(manufacturer, model, rev, _name, _quirk)         \
 118        { .manufacturer_id = manufacturer,                              \
 119          .model_id = model,                                            \
 120          .revision_number_major = rev,                                 \
 121          .flags = 0,                                                   \
 122          .name = _name,                                                \
 123          .quirk = _quirk, }
 124
 125#define SMIAPP_IDENT(manufacturer, model, rev, _name)                   \
 126        { .manufacturer_id = manufacturer,                              \
 127          .model_id = model,                                            \
 128          .revision_number_major = rev,                                 \
 129          .flags = 0,                                                   \
 130          .name = _name, }
 131
 132struct smiapp_reg_limits {
 133        u32 addr;
 134        char *what;
 135};
 136
 137extern struct smiapp_reg_limits smiapp_reg_limits[];
 138
 139struct smiapp_csi_data_format {
 140        u32 code;
 141        u8 width;
 142        u8 compressed;
 143        u8 pixel_order;
 144};
 145
 146#define SMIAPP_SUBDEVS                  3
 147
 148#define SMIAPP_PA_PAD_SRC               0
 149#define SMIAPP_PAD_SINK                 0
 150#define SMIAPP_PAD_SRC                  1
 151#define SMIAPP_PADS                     2
 152
 153struct smiapp_binning_subtype {
 154        u8 horizontal:4;
 155        u8 vertical:4;
 156} __packed;
 157
 158struct smiapp_subdev {
 159        struct v4l2_subdev sd;
 160        struct media_pad pads[SMIAPP_PADS];
 161        struct v4l2_rect sink_fmt;
 162        struct v4l2_rect crop[SMIAPP_PADS];
 163        struct v4l2_rect compose; /* compose on sink */
 164        unsigned short sink_pad;
 165        unsigned short source_pad;
 166        int npads;
 167        struct smiapp_sensor *sensor;
 168        struct v4l2_ctrl_handler ctrl_handler;
 169};
 170
 171/*
 172 * struct smiapp_sensor - Main device structure
 173 */
 174struct smiapp_sensor {
 175        /*
 176         * "mutex" is used to serialise access to all fields here
 177         * except v4l2_ctrls at the end of the struct. "mutex" is also
 178         * used to serialise access to file handle specific
 179         * information.
 180         */
 181        struct mutex mutex;
 182        struct smiapp_subdev ssds[SMIAPP_SUBDEVS];
 183        u32 ssds_used;
 184        struct smiapp_subdev *src;
 185        struct smiapp_subdev *binner;
 186        struct smiapp_subdev *scaler;
 187        struct smiapp_subdev *pixel_array;
 188        struct smiapp_hwconfig *hwcfg;
 189        struct regulator *vana;
 190        struct clk *ext_clk;
 191        struct gpio_desc *xshutdown;
 192        u32 limits[SMIAPP_LIMIT_LAST];
 193        u8 nbinning_subtypes;
 194        struct smiapp_binning_subtype binning_subtypes[SMIAPP_BINNING_SUBTYPES];
 195        u32 mbus_frame_fmts;
 196        const struct smiapp_csi_data_format *csi_format;
 197        const struct smiapp_csi_data_format *internal_csi_format;
 198        u32 default_mbus_frame_fmts;
 199        int default_pixel_order;
 200
 201        u8 binning_horizontal;
 202        u8 binning_vertical;
 203
 204        u8 scale_m;
 205        u8 scaling_mode;
 206
 207        u8 hvflip_inv_mask; /* H/VFLIP inversion due to sensor orientation */
 208        u8 frame_skip;
 209        u16 embedded_start; /* embedded data start line */
 210        u16 embedded_end;
 211        u16 image_start; /* image data start line */
 212        u16 visible_pixel_start; /* start pixel of the visible image */
 213
 214        bool streaming;
 215        bool dev_init_done;
 216        u8 compressed_min_bpp;
 217
 218        u8 *nvm;                /* nvm memory buffer */
 219        unsigned int nvm_size;  /* bytes */
 220
 221        struct smiapp_module_info minfo;
 222
 223        struct smiapp_pll pll;
 224
 225        /* Is a default format supported for a given BPP? */
 226        unsigned long *valid_link_freqs;
 227
 228        /* Pixel array controls */
 229        struct v4l2_ctrl *analog_gain;
 230        struct v4l2_ctrl *exposure;
 231        struct v4l2_ctrl *hflip;
 232        struct v4l2_ctrl *vflip;
 233        struct v4l2_ctrl *vblank;
 234        struct v4l2_ctrl *hblank;
 235        struct v4l2_ctrl *pixel_rate_parray;
 236        /* src controls */
 237        struct v4l2_ctrl *link_freq;
 238        struct v4l2_ctrl *pixel_rate_csi;
 239        /* test pattern colour components */
 240        struct v4l2_ctrl *test_data[SMIAPP_COLOUR_COMPONENTS];
 241};
 242
 243#define to_smiapp_subdev(_sd)                           \
 244        container_of(_sd, struct smiapp_subdev, sd)
 245
 246#define to_smiapp_sensor(_sd)   \
 247        (to_smiapp_subdev(_sd)->sensor)
 248
 249#endif /* __SMIAPP_PRIV_H_ */
 250