linux/drivers/staging/media/atomisp/include/linux/atomisp_platform.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * Support for Medifield PNW Camera Imaging ISP subsystem.
   4 *
   5 * Copyright (c) 2010 Intel Corporation. All Rights Reserved.
   6 *
   7 * This program is free software; you can redistribute it and/or
   8 * modify it under the terms of the GNU General Public License version
   9 * 2 as published by the Free Software Foundation.
  10 *
  11 * This program is distributed in the hope that it will be useful,
  12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14 * GNU General Public License for more details.
  15 *
  16 *
  17 */
  18#ifndef ATOMISP_PLATFORM_H_
  19#define ATOMISP_PLATFORM_H_
  20
  21#include <asm/intel-family.h>
  22#include <asm/processor.h>
  23
  24#include <linux/i2c.h>
  25#include <linux/sfi.h>
  26#include <media/v4l2-subdev.h>
  27#include "atomisp.h"
  28
  29#define MAX_SENSORS_PER_PORT 4
  30#define MAX_STREAMS_PER_CHANNEL 2
  31
  32#define CAMERA_MODULE_ID_LEN 64
  33
  34enum atomisp_bayer_order {
  35        atomisp_bayer_order_grbg,
  36        atomisp_bayer_order_rggb,
  37        atomisp_bayer_order_bggr,
  38        atomisp_bayer_order_gbrg
  39};
  40
  41enum atomisp_input_stream_id {
  42        ATOMISP_INPUT_STREAM_GENERAL = 0,
  43        ATOMISP_INPUT_STREAM_CAPTURE = 0,
  44        ATOMISP_INPUT_STREAM_POSTVIEW,
  45        ATOMISP_INPUT_STREAM_PREVIEW,
  46        ATOMISP_INPUT_STREAM_VIDEO,
  47        ATOMISP_INPUT_STREAM_NUM
  48};
  49
  50enum atomisp_input_format {
  51        ATOMISP_INPUT_FORMAT_YUV420_8_LEGACY,/* 8 bits per subpixel (legacy) */
  52        ATOMISP_INPUT_FORMAT_YUV420_8, /* 8 bits per subpixel */
  53        ATOMISP_INPUT_FORMAT_YUV420_10,/* 10 bits per subpixel */
  54        ATOMISP_INPUT_FORMAT_YUV420_16,/* 16 bits per subpixel */
  55        ATOMISP_INPUT_FORMAT_YUV422_8, /* UYVY..UVYV, 8 bits per subpixel */
  56        ATOMISP_INPUT_FORMAT_YUV422_10,/* UYVY..UVYV, 10 bits per subpixel */
  57        ATOMISP_INPUT_FORMAT_YUV422_16,/* UYVY..UVYV, 16 bits per subpixel */
  58        ATOMISP_INPUT_FORMAT_RGB_444,  /* BGR..BGR, 4 bits per subpixel */
  59        ATOMISP_INPUT_FORMAT_RGB_555,  /* BGR..BGR, 5 bits per subpixel */
  60        ATOMISP_INPUT_FORMAT_RGB_565,  /* BGR..BGR, 5 bits B and R, 6 bits G */
  61        ATOMISP_INPUT_FORMAT_RGB_666,  /* BGR..BGR, 6 bits per subpixel */
  62        ATOMISP_INPUT_FORMAT_RGB_888,  /* BGR..BGR, 8 bits per subpixel */
  63        ATOMISP_INPUT_FORMAT_RAW_6,    /* RAW data, 6 bits per pixel */
  64        ATOMISP_INPUT_FORMAT_RAW_7,    /* RAW data, 7 bits per pixel */
  65        ATOMISP_INPUT_FORMAT_RAW_8,    /* RAW data, 8 bits per pixel */
  66        ATOMISP_INPUT_FORMAT_RAW_10,   /* RAW data, 10 bits per pixel */
  67        ATOMISP_INPUT_FORMAT_RAW_12,   /* RAW data, 12 bits per pixel */
  68        ATOMISP_INPUT_FORMAT_RAW_14,   /* RAW data, 14 bits per pixel */
  69        ATOMISP_INPUT_FORMAT_RAW_16,   /* RAW data, 16 bits per pixel */
  70        ATOMISP_INPUT_FORMAT_BINARY_8, /* Binary byte stream. */
  71
  72        /* CSI2-MIPI specific format: Generic short packet data. It is used to
  73         * keep the timing information for the opening/closing of shutters,
  74         * triggering of flashes and etc.
  75         */
  76        ATOMISP_INPUT_FORMAT_GENERIC_SHORT1,  /* Generic Short Packet Code 1 */
  77        ATOMISP_INPUT_FORMAT_GENERIC_SHORT2,  /* Generic Short Packet Code 2 */
  78        ATOMISP_INPUT_FORMAT_GENERIC_SHORT3,  /* Generic Short Packet Code 3 */
  79        ATOMISP_INPUT_FORMAT_GENERIC_SHORT4,  /* Generic Short Packet Code 4 */
  80        ATOMISP_INPUT_FORMAT_GENERIC_SHORT5,  /* Generic Short Packet Code 5 */
  81        ATOMISP_INPUT_FORMAT_GENERIC_SHORT6,  /* Generic Short Packet Code 6 */
  82        ATOMISP_INPUT_FORMAT_GENERIC_SHORT7,  /* Generic Short Packet Code 7 */
  83        ATOMISP_INPUT_FORMAT_GENERIC_SHORT8,  /* Generic Short Packet Code 8 */
  84
  85        /* CSI2-MIPI specific format: YUV data.
  86         */
  87        ATOMISP_INPUT_FORMAT_YUV420_8_SHIFT,  /* YUV420 8-bit (Chroma Shifted
  88                                                 Pixel Sampling) */
  89        ATOMISP_INPUT_FORMAT_YUV420_10_SHIFT, /* YUV420 8-bit (Chroma Shifted
  90                                                 Pixel Sampling) */
  91
  92        /* CSI2-MIPI specific format: Generic long packet data
  93         */
  94        ATOMISP_INPUT_FORMAT_EMBEDDED, /* Embedded 8-bit non Image Data */
  95
  96        /* CSI2-MIPI specific format: User defined byte-based data. For example,
  97         * the data transmitter (e.g. the SoC sensor) can keep the JPEG data as
  98         * the User Defined Data Type 4 and the MPEG data as the
  99         * User Defined Data Type 7.
 100         */
 101        ATOMISP_INPUT_FORMAT_USER_DEF1,  /* User defined 8-bit data type 1 */
 102        ATOMISP_INPUT_FORMAT_USER_DEF2,  /* User defined 8-bit data type 2 */
 103        ATOMISP_INPUT_FORMAT_USER_DEF3,  /* User defined 8-bit data type 3 */
 104        ATOMISP_INPUT_FORMAT_USER_DEF4,  /* User defined 8-bit data type 4 */
 105        ATOMISP_INPUT_FORMAT_USER_DEF5,  /* User defined 8-bit data type 5 */
 106        ATOMISP_INPUT_FORMAT_USER_DEF6,  /* User defined 8-bit data type 6 */
 107        ATOMISP_INPUT_FORMAT_USER_DEF7,  /* User defined 8-bit data type 7 */
 108        ATOMISP_INPUT_FORMAT_USER_DEF8,  /* User defined 8-bit data type 8 */
 109};
 110
 111#define N_ATOMISP_INPUT_FORMAT (ATOMISP_INPUT_FORMAT_USER_DEF8 + 1)
 112
 113enum intel_v4l2_subdev_type {
 114        RAW_CAMERA = 1,
 115        SOC_CAMERA = 2,
 116        CAMERA_MOTOR = 3,
 117        LED_FLASH = 4,
 118        XENON_FLASH = 5,
 119        FILE_INPUT = 6,
 120        TEST_PATTERN = 7,
 121};
 122
 123struct intel_v4l2_subdev_id {
 124        char name[17];
 125        enum intel_v4l2_subdev_type type;
 126        enum atomisp_camera_port    port;
 127};
 128
 129struct intel_v4l2_subdev_i2c_board_info {
 130        struct i2c_board_info board_info;
 131        int i2c_adapter_id;
 132};
 133
 134struct intel_v4l2_subdev_table {
 135        struct intel_v4l2_subdev_i2c_board_info v4l2_subdev;
 136        enum intel_v4l2_subdev_type type;
 137        enum atomisp_camera_port port;
 138        struct v4l2_subdev *subdev;
 139};
 140
 141struct atomisp_platform_data {
 142        struct intel_v4l2_subdev_table *subdevs;
 143};
 144
 145/* Describe the capacities of one single sensor. */
 146struct atomisp_sensor_caps {
 147        /* The number of streams this sensor can output. */
 148        int stream_num;
 149        bool is_slave;
 150};
 151
 152/* Describe the capacities of sensors connected to one camera port. */
 153struct atomisp_camera_caps {
 154        /* The number of sensors connected to this camera port. */
 155        int sensor_num;
 156        /* The capacities of each sensor. */
 157        struct atomisp_sensor_caps sensor[MAX_SENSORS_PER_PORT];
 158        /* Define whether stream control is required for multiple streams. */
 159        bool multi_stream_ctrl;
 160};
 161
 162/*
 163 *  Sensor of external ISP can send multiple steams with different mipi data
 164 * type in the same virtual channel. This information needs to come from the
 165 * sensor or external ISP
 166 */
 167struct atomisp_isys_config_info {
 168        u8 input_format;
 169        u16 width;
 170        u16 height;
 171};
 172
 173struct atomisp_input_stream_info {
 174        enum atomisp_input_stream_id stream;
 175        u8 enable;
 176        /* Sensor driver fills ch_id with the id
 177           of the virtual channel. */
 178        u8 ch_id;
 179        /* Tells how many streams in this virtual channel. If 0 ignore rest
 180         * and the input format will be from mipi_info */
 181        u8 isys_configs;
 182        /*
 183         * if more isys_configs is more than 0, sensor needs to configure the
 184         * input format differently. width and height can be 0. If width and
 185         * height is not zero, then the corresponsing data needs to be set
 186         */
 187        struct atomisp_isys_config_info isys_info[MAX_STREAMS_PER_CHANNEL];
 188};
 189
 190struct camera_vcm_control;
 191struct camera_vcm_ops {
 192        int (*power_up)(struct v4l2_subdev *sd, struct camera_vcm_control *vcm);
 193        int (*power_down)(struct v4l2_subdev *sd,
 194                          struct camera_vcm_control *vcm);
 195        int (*queryctrl)(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc,
 196                         struct camera_vcm_control *vcm);
 197        int (*g_ctrl)(struct v4l2_subdev *sd, struct v4l2_control *ctrl,
 198                      struct camera_vcm_control *vcm);
 199        int (*s_ctrl)(struct v4l2_subdev *sd, struct v4l2_control *ctrl,
 200                      struct camera_vcm_control *vcm);
 201};
 202
 203struct camera_vcm_control {
 204        char camera_module[CAMERA_MODULE_ID_LEN];
 205        struct camera_vcm_ops *ops;
 206        struct list_head list;
 207};
 208
 209struct camera_sensor_platform_data {
 210        int (*flisclk_ctrl)(struct v4l2_subdev *subdev, int flag);
 211        int (*csi_cfg)(struct v4l2_subdev *subdev, int flag);
 212
 213        /*
 214         * New G-Min power and GPIO interface to control individual
 215         * lines as implemented on all known camera modules.
 216         */
 217        int (*gpio0_ctrl)(struct v4l2_subdev *subdev, int on);
 218        int (*gpio1_ctrl)(struct v4l2_subdev *subdev, int on);
 219        int (*v1p8_ctrl)(struct v4l2_subdev *subdev, int on);
 220        int (*v2p8_ctrl)(struct v4l2_subdev *subdev, int on);
 221        int (*v1p2_ctrl)(struct v4l2_subdev *subdev, int on);
 222        struct camera_vcm_control *(*get_vcm_ctrl)(struct v4l2_subdev *subdev,
 223                char *module_id);
 224};
 225
 226struct camera_mipi_info {
 227        enum atomisp_camera_port        port;
 228        unsigned int                    num_lanes;
 229        enum atomisp_input_format       input_format;
 230        enum atomisp_bayer_order        raw_bayer_order;
 231        struct atomisp_sensor_mode_data data;
 232        enum atomisp_input_format       metadata_format;
 233        u32                             metadata_width;
 234        u32                             metadata_height;
 235        const u32                       *metadata_effective_width;
 236};
 237
 238const struct atomisp_platform_data *atomisp_get_platform_data(void);
 239const struct atomisp_camera_caps *atomisp_get_default_camera_caps(void);
 240
 241/* API from old platform_camera.h, new CPUID implementation */
 242#define __IS_SOC(x) (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL && \
 243                     boot_cpu_data.x86 == 6 &&                       \
 244                     boot_cpu_data.x86_model == (x))
 245#define __IS_SOCS(x,y) (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL && \
 246                        boot_cpu_data.x86 == 6 &&                       \
 247                        (boot_cpu_data.x86_model == (x) || \
 248                         boot_cpu_data.x86_model == (y)))
 249
 250#define IS_MFLD __IS_SOC(INTEL_FAM6_ATOM_SALTWELL_MID)
 251#define IS_BYT  __IS_SOC(INTEL_FAM6_ATOM_SILVERMONT)
 252#define IS_CHT  __IS_SOC(INTEL_FAM6_ATOM_AIRMONT)
 253#define IS_MRFD __IS_SOC(INTEL_FAM6_ATOM_SILVERMONT_MID)
 254#define IS_MOFD __IS_SOC(INTEL_FAM6_ATOM_AIRMONT_MID)
 255
 256/* Both CHT and MOFD come with ISP2401 */
 257#define IS_ISP2401 __IS_SOCS(INTEL_FAM6_ATOM_AIRMONT, \
 258                             INTEL_FAM6_ATOM_AIRMONT_MID)
 259
 260#endif /* ATOMISP_PLATFORM_H_ */
 261