root/drivers/staging/media/atomisp/pci/input_system_local.h
/* SPDX-License-Identifier: GPL-2.0 */
// SPDX-License-Identifier: GPL-2.0-or-later
/*
 *    (c) 2020 Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
 */

#include "type_support.h"
#include "input_system_global.h"

typedef enum {
        INPUT_SYSTEM_PORT_A = 0,
        INPUT_SYSTEM_PORT_B,
        INPUT_SYSTEM_PORT_C,
        N_INPUT_SYSTEM_PORTS
} input_system_csi_port_t;

typedef struct ctrl_unit_cfg_s                  ctrl_unit_cfg_t;
typedef struct input_system_network_cfg_s       input_system_network_cfg_t;
typedef struct target_cfg2400_s         target_cfg2400_t;
typedef struct channel_cfg_s                    channel_cfg_t;
typedef struct backend_channel_cfg_s            backend_channel_cfg_t;
typedef struct input_system_cfg2400_s           input_system_cfg2400_t;
typedef struct mipi_port_state_s                mipi_port_state_t;
typedef struct rx_channel_state_s               rx_channel_state_t;
typedef struct input_switch_cfg_channel_s       input_switch_cfg_channel_t;
typedef struct input_switch_cfg_s               input_switch_cfg_t;

struct ctrl_unit_cfg_s {
        isp2400_ib_buffer_t             buffer_mipi[N_CAPTURE_UNIT_ID];
        isp2400_ib_buffer_t             buffer_acquire[N_ACQUISITION_UNIT_ID];
};

struct input_system_network_cfg_s {
        input_system_connection_t       multicast_cfg[N_CAPTURE_UNIT_ID];
        input_system_multiplex_t        mux_cfg;
        ctrl_unit_cfg_t                         ctrl_unit_cfg[N_CTRL_UNIT_ID];
};

typedef struct {
// TBD.
        u32     dummy_parameter;
} target_isp_cfg_t;

typedef struct {
// TBD.
        u32     dummy_parameter;
} target_sp_cfg_t;

typedef struct {
// TBD.
        u32     dummy_parameter;
} target_strm2mem_cfg_t;

struct input_switch_cfg_channel_s {
        u32 hsync_data_reg[2];
        u32 vsync_data_reg;
};

struct backend_channel_cfg_s {
        u32     fmt_control_word_1; // Format config.
        u32     fmt_control_word_2;
        u32     no_side_band;
};

typedef union  {
        csi_cfg_t       csi_cfg;
        tpg_cfg_t       tpg_cfg;
        prbs_cfg_t      prbs_cfg;
        gpfifo_cfg_t    gpfifo_cfg;
} source_cfg_t;

struct input_switch_cfg_s {
        u32 hsync_data_reg[N_RX_CHANNEL_ID * 2];
        u32 vsync_data_reg;
};

/*
 * In 2300 ports can be configured independently and stream
 * formats need to be specified. In 2400, there are only 8
 * supported configurations but the HW is fused to support
 * only a single one.
 *
 * In 2300 the compressed format types are programmed by the
 * user. In 2400 all stream formats are encoded on the stream.
 *
 * Use the enum to check validity of a user configuration
 */
typedef enum {
        MONO_4L_1L_0L = 0,
        MONO_3L_1L_0L,
        MONO_2L_1L_0L,
        MONO_1L_1L_0L,
        STEREO_2L_1L_2L,
        STEREO_3L_1L_1L,
        STEREO_2L_1L_1L,
        STEREO_1L_1L_1L,
        N_RX_MODE
} rx_mode_t;

#define UNCOMPRESSED_BITS_PER_PIXEL_10  10
#define UNCOMPRESSED_BITS_PER_PIXEL_12  12
#define COMPRESSED_BITS_PER_PIXEL_6     6
#define COMPRESSED_BITS_PER_PIXEL_7     7
#define COMPRESSED_BITS_PER_PIXEL_8     8
enum mipi_compressor {
        MIPI_COMPRESSOR_NONE = 0,
        MIPI_COMPRESSOR_10_6_10,
        MIPI_COMPRESSOR_10_7_10,
        MIPI_COMPRESSOR_10_8_10,
        MIPI_COMPRESSOR_12_6_12,
        MIPI_COMPRESSOR_12_7_12,
        MIPI_COMPRESSOR_12_8_12,
        N_MIPI_COMPRESSOR_METHODS
};

typedef enum mipi_compressor mipi_compressor_t;

typedef enum {
        MIPI_PREDICTOR_NONE = 0,
        MIPI_PREDICTOR_TYPE1,
        MIPI_PREDICTOR_TYPE2,
        N_MIPI_PREDICTOR_TYPES
} mipi_predictor_t;

typedef struct rx_cfg_s         rx_cfg_t;

/*
 * Applied per port
 */
struct rx_cfg_s {
        rx_mode_t                       mode;   /* The HW config */
        enum mipi_port_id               port;   /* The port ID to apply the control on */
        unsigned int            timeout;
        unsigned int            initcount;
        unsigned int            synccount;
        unsigned int            rxcount;
        mipi_predictor_t        comp;   /* Just for backward compatibility */
        bool                is_two_ppc;
};

#include "isp2401_input_system_local.h"
#include "isp2400_input_system_local.h"