/* SPDX-License-Identifier: GPL-2.0-only */ /* * ispresizer.h * * TI OMAP3 ISP - Resizer module * * Copyright (C) 2010 Nokia Corporation * Copyright (C) 2009 Texas Instruments, Inc * * Contacts: Laurent Pinchart <laurent.pinchart@ideasonboard.com> * Sakari Ailus <sakari.ailus@iki.fi> */ #ifndef OMAP3_ISP_RESIZER_H #define OMAP3_ISP_RESIZER_H #include <linux/spinlock.h> #include <linux/types.h> /* * Constants for filter coefficients count */ #define COEFF_CNT 32 /* * struct isprsz_coef - Structure for resizer filter coefficients. * @h_filter_coef_4tap: Horizontal filter coefficients for 8-phase/4-tap * mode (.5x-4x) * @v_filter_coef_4tap: Vertical filter coefficients for 8-phase/4-tap * mode (.5x-4x) * @h_filter_coef_7tap: Horizontal filter coefficients for 4-phase/7-tap * mode (.25x-.5x) * @v_filter_coef_7tap: Vertical filter coefficients for 4-phase/7-tap * mode (.25x-.5x) */ struct isprsz_coef { u16 h_filter_coef_4tap[32]; u16 v_filter_coef_4tap[32]; /* Every 8th value is a dummy value in the following arrays: */ u16 h_filter_coef_7tap[32]; u16 v_filter_coef_7tap[32]; }; /* Chrominance horizontal algorithm */ enum resizer_chroma_algo { RSZ_THE_SAME = 0, /* Chrominance the same as Luminance */ RSZ_BILINEAR = 1, /* Chrominance uses bilinear interpolation */ }; /* Resizer input type select */ enum resizer_colors_type { RSZ_YUV422 = 0, /* YUV422 color is interleaved */ RSZ_COLOR8 = 1, /* Color separate data on 8 bits */ }; /* * Structure for horizontal and vertical resizing value */ struct resizer_ratio { u32 horz; u32 vert; }; /* * Structure for luminance enhancer parameters. */ struct resizer_luma_yenh { u8 algo; /* algorithm select. */ u8 gain; /* maximum gain. */ u8 slope; /* slope. */ u8 core; /* core offset. */ }; enum resizer_input_entity { RESIZER_INPUT_NONE, RESIZER_INPUT_VP, /* input video port - prev or ccdc */ RESIZER_INPUT_MEMORY, }; /* Sink and source resizer pads */ #define RESZ_PAD_SINK 0 #define RESZ_PAD_SOURCE 1 #define RESZ_PADS_NUM 2 /* * struct isp_res_device - OMAP3 ISP resizer module * @lock: Protects formats and crop rectangles between set_selection and IRQ * @crop.request: Crop rectangle requested by the user * @crop.active: Active crop rectangle (based on hardware requirements) */ struct isp_res_device { struct v4l2_subdev subdev; struct media_pad pads[RESZ_PADS_NUM]; struct v4l2_mbus_framefmt formats[RESZ_PADS_NUM]; enum resizer_input_entity input; struct isp_video video_in; struct isp_video video_out; u32 addr_base; /* stored source buffer address in memory mode */ u32 crop_offset; /* additional offset for crop in memory mode */ struct resizer_ratio ratio; int pm_state; unsigned int applycrop:1; enum isp_pipeline_stream_state state; wait_queue_head_t wait; atomic_t stopping; spinlock_t lock; struct { struct v4l2_rect request; struct v4l2_rect active; } crop; }; struct isp_device; int omap3isp_resizer_init(struct isp_device *isp); void omap3isp_resizer_cleanup(struct isp_device *isp); int omap3isp_resizer_register_entities(struct isp_res_device *res, struct v4l2_device *vdev); void omap3isp_resizer_unregister_entities(struct isp_res_device *res); void omap3isp_resizer_isr_frame_sync(struct isp_res_device *res); void omap3isp_resizer_isr(struct isp_res_device *isp_res); void omap3isp_resizer_max_rate(struct isp_res_device *res, unsigned int *max_rate); void omap3isp_resizer_suspend(struct isp_res_device *isp_res); void omap3isp_resizer_resume(struct isp_res_device *isp_res); int omap3isp_resizer_busy(struct isp_res_device *isp_res); #endif /* OMAP3_ISP_RESIZER_H */