1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * SoC-camera Media Bus API extensions 4 * 5 * Copyright (C) 2009, Guennadi Liakhovetski <g.liakhovetski@gmx.de> 6 */ 7 8 #ifndef SOC_MEDIABUS_H 9 #define SOC_MEDIABUS_H 10 11 #include <linux/videodev2.h> 12 #include <linux/v4l2-mediabus.h> 13 14 /** 15 * enum soc_mbus_packing - data packing types on the media-bus 16 * @SOC_MBUS_PACKING_NONE: no packing, bit-for-bit transfer to RAM, one 17 * sample represents one pixel 18 * @SOC_MBUS_PACKING_2X8_PADHI: 16 bits transferred in 2 8-bit samples, in the 19 * possibly incomplete byte high bits are padding 20 * @SOC_MBUS_PACKING_2X8_PADLO: as above, but low bits are padding 21 * @SOC_MBUS_PACKING_EXTEND16: sample width (e.g., 10 bits) has to be extended 22 * to 16 bits 23 * @SOC_MBUS_PACKING_VARIABLE: compressed formats with variable packing 24 * @SOC_MBUS_PACKING_1_5X8: used for packed YUV 4:2:0 formats, where 4 25 * pixels occupy 6 bytes in RAM 26 * @SOC_MBUS_PACKING_EXTEND32: sample width (e.g., 24 bits) has to be extended 27 * to 32 bits 28 */ 29 enum soc_mbus_packing { 30 SOC_MBUS_PACKING_NONE, 31 SOC_MBUS_PACKING_2X8_PADHI, 32 SOC_MBUS_PACKING_2X8_PADLO, 33 SOC_MBUS_PACKING_EXTEND16, 34 SOC_MBUS_PACKING_VARIABLE, 35 SOC_MBUS_PACKING_1_5X8, 36 SOC_MBUS_PACKING_EXTEND32, 37 }; 38 39 /** 40 * enum soc_mbus_order - sample order on the media bus 41 * @SOC_MBUS_ORDER_LE: least significant sample first 42 * @SOC_MBUS_ORDER_BE: most significant sample first 43 */ 44 enum soc_mbus_order { 45 SOC_MBUS_ORDER_LE, 46 SOC_MBUS_ORDER_BE, 47 }; 48 49 /** 50 * enum soc_mbus_layout - planes layout in memory 51 * @SOC_MBUS_LAYOUT_PACKED: color components packed 52 * @SOC_MBUS_LAYOUT_PLANAR_2Y_U_V: YUV components stored in 3 planes (4:2:2) 53 * @SOC_MBUS_LAYOUT_PLANAR_2Y_C: YUV components stored in a luma and a 54 * chroma plane (C plane is half the size 55 * of Y plane) 56 * @SOC_MBUS_LAYOUT_PLANAR_Y_C: YUV components stored in a luma and a 57 * chroma plane (C plane is the same size 58 * as Y plane) 59 */ 60 enum soc_mbus_layout { 61 SOC_MBUS_LAYOUT_PACKED = 0, 62 SOC_MBUS_LAYOUT_PLANAR_2Y_U_V, 63 SOC_MBUS_LAYOUT_PLANAR_2Y_C, 64 SOC_MBUS_LAYOUT_PLANAR_Y_C, 65 }; 66 67 /** 68 * struct soc_mbus_pixelfmt - Data format on the media bus 69 * @fourcc: Fourcc code, that will be obtained if the data is 70 * stored in memory in the following way: 71 * @packing: Type of sample-packing, that has to be used 72 * @order: Sample order when storing in memory 73 * @bits_per_sample: How many bits the bridge has to sample 74 */ 75 struct soc_mbus_pixelfmt { 76 u32 fourcc; 77 enum soc_mbus_packing packing; 78 enum soc_mbus_order order; 79 enum soc_mbus_layout layout; 80 u8 bits_per_sample; 81 }; 82 83 /** 84 * struct soc_mbus_lookup - Lookup FOURCC IDs by mediabus codes for pass-through 85 * @code: mediabus pixel-code 86 * @fmt: pixel format description 87 */ 88 struct soc_mbus_lookup { 89 u32 code; 90 struct soc_mbus_pixelfmt fmt; 91 }; 92 93 const struct soc_mbus_pixelfmt *soc_mbus_find_fmtdesc( 94 u32 code, 95 const struct soc_mbus_lookup *lookup, 96 int n); 97 const struct soc_mbus_pixelfmt *soc_mbus_get_fmtdesc( 98 u32 code); 99 s32 soc_mbus_bytes_per_line(u32 width, const struct soc_mbus_pixelfmt *mf); 100 s32 soc_mbus_image_size(const struct soc_mbus_pixelfmt *mf, 101 u32 bytes_per_line, u32 height); 102 int soc_mbus_samples_per_pixel(const struct soc_mbus_pixelfmt *mf, 103 unsigned int *numerator, unsigned int *denominator); 104 unsigned int soc_mbus_config_compatible(const struct v4l2_mbus_config *cfg, 105 unsigned int flags); 106 107 #endif 108