/* SPDX-License-Identifier: GPL-2.0+ */ 
 | 
/* 
 | 
 * Copyright (c) 2011-2018 Magewell Electronics Co., Ltd. (Nanjing) 
 | 
 * All rights reserved. 
 | 
 * Author: Yong Deng <yong.deng@magewell.com> 
 | 
 */ 
 | 
  
 | 
#ifndef __SUN6I_CSI_H__ 
 | 
#define __SUN6I_CSI_H__ 
 | 
  
 | 
#include <media/v4l2-ctrls.h> 
 | 
#include <media/v4l2-device.h> 
 | 
#include <media/v4l2-fwnode.h> 
 | 
  
 | 
#include "sun6i_video.h" 
 | 
  
 | 
struct sun6i_csi; 
 | 
  
 | 
/** 
 | 
 * struct sun6i_csi_config - configs for sun6i csi 
 | 
 * @pixelformat: v4l2 pixel format (V4L2_PIX_FMT_*) 
 | 
 * @code:    media bus format code (MEDIA_BUS_FMT_*) 
 | 
 * @field:    used interlacing type (enum v4l2_field) 
 | 
 * @width:    frame width 
 | 
 * @height:    frame height 
 | 
 */ 
 | 
struct sun6i_csi_config { 
 | 
    u32        pixelformat; 
 | 
    u32        code; 
 | 
    u32        field; 
 | 
    u32        width; 
 | 
    u32        height; 
 | 
}; 
 | 
  
 | 
struct sun6i_csi { 
 | 
    struct device            *dev; 
 | 
    struct v4l2_ctrl_handler    ctrl_handler; 
 | 
    struct v4l2_device        v4l2_dev; 
 | 
    struct media_device        media_dev; 
 | 
  
 | 
    struct v4l2_async_notifier    notifier; 
 | 
  
 | 
    /* video port settings */ 
 | 
    struct v4l2_fwnode_endpoint    v4l2_ep; 
 | 
  
 | 
    struct sun6i_csi_config        config; 
 | 
  
 | 
    struct sun6i_video        video; 
 | 
}; 
 | 
  
 | 
/** 
 | 
 * sun6i_csi_is_format_supported() - check if the format supported by csi 
 | 
 * @csi:    pointer to the csi 
 | 
 * @pixformat:    v4l2 pixel format (V4L2_PIX_FMT_*) 
 | 
 * @mbus_code:    media bus format code (MEDIA_BUS_FMT_*) 
 | 
 */ 
 | 
bool sun6i_csi_is_format_supported(struct sun6i_csi *csi, u32 pixformat, 
 | 
                   u32 mbus_code); 
 | 
  
 | 
/** 
 | 
 * sun6i_csi_set_power() - power on/off the csi 
 | 
 * @csi:    pointer to the csi 
 | 
 * @enable:    on/off 
 | 
 */ 
 | 
int sun6i_csi_set_power(struct sun6i_csi *csi, bool enable); 
 | 
  
 | 
/** 
 | 
 * sun6i_csi_update_config() - update the csi register settings 
 | 
 * @csi:    pointer to the csi 
 | 
 * @config:    see struct sun6i_csi_config 
 | 
 */ 
 | 
int sun6i_csi_update_config(struct sun6i_csi *csi, 
 | 
                struct sun6i_csi_config *config); 
 | 
  
 | 
/** 
 | 
 * sun6i_csi_update_buf_addr() - update the csi frame buffer address 
 | 
 * @csi:    pointer to the csi 
 | 
 * @addr:    frame buffer's physical address 
 | 
 */ 
 | 
void sun6i_csi_update_buf_addr(struct sun6i_csi *csi, dma_addr_t addr); 
 | 
  
 | 
/** 
 | 
 * sun6i_csi_set_stream() - start/stop csi streaming 
 | 
 * @csi:    pointer to the csi 
 | 
 * @enable:    start/stop 
 | 
 */ 
 | 
void sun6i_csi_set_stream(struct sun6i_csi *csi, bool enable); 
 | 
  
 | 
/* get bpp form v4l2 pixformat */ 
 | 
static inline int sun6i_csi_get_bpp(unsigned int pixformat) 
 | 
{ 
 | 
    switch (pixformat) { 
 | 
    case V4L2_PIX_FMT_SBGGR8: 
 | 
    case V4L2_PIX_FMT_SGBRG8: 
 | 
    case V4L2_PIX_FMT_SGRBG8: 
 | 
    case V4L2_PIX_FMT_SRGGB8: 
 | 
    case V4L2_PIX_FMT_JPEG: 
 | 
        return 8; 
 | 
    case V4L2_PIX_FMT_SBGGR10: 
 | 
    case V4L2_PIX_FMT_SGBRG10: 
 | 
    case V4L2_PIX_FMT_SGRBG10: 
 | 
    case V4L2_PIX_FMT_SRGGB10: 
 | 
        return 10; 
 | 
    case V4L2_PIX_FMT_SBGGR12: 
 | 
    case V4L2_PIX_FMT_SGBRG12: 
 | 
    case V4L2_PIX_FMT_SGRBG12: 
 | 
    case V4L2_PIX_FMT_SRGGB12: 
 | 
    case V4L2_PIX_FMT_HM12: 
 | 
    case V4L2_PIX_FMT_NV12: 
 | 
    case V4L2_PIX_FMT_NV21: 
 | 
    case V4L2_PIX_FMT_YUV420: 
 | 
    case V4L2_PIX_FMT_YVU420: 
 | 
        return 12; 
 | 
    case V4L2_PIX_FMT_YUYV: 
 | 
    case V4L2_PIX_FMT_YVYU: 
 | 
    case V4L2_PIX_FMT_UYVY: 
 | 
    case V4L2_PIX_FMT_VYUY: 
 | 
    case V4L2_PIX_FMT_NV16: 
 | 
    case V4L2_PIX_FMT_NV61: 
 | 
    case V4L2_PIX_FMT_YUV422P: 
 | 
    case V4L2_PIX_FMT_RGB565: 
 | 
    case V4L2_PIX_FMT_RGB565X: 
 | 
        return 16; 
 | 
    case V4L2_PIX_FMT_RGB24: 
 | 
    case V4L2_PIX_FMT_BGR24: 
 | 
        return 24; 
 | 
    case V4L2_PIX_FMT_RGB32: 
 | 
    case V4L2_PIX_FMT_BGR32: 
 | 
        return 32; 
 | 
    default: 
 | 
        WARN(1, "Unsupported pixformat: 0x%x\n", pixformat); 
 | 
        break; 
 | 
    } 
 | 
  
 | 
    return 0; 
 | 
} 
 | 
  
 | 
#endif /* __SUN6I_CSI_H__ */ 
 |