<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: custom image sensor driver in i.MX Processors</title>
    <link>https://community.nxp.com/t5/i-MX-Processors/custom-image-sensor-driver/m-p/1860270#M223380</link>
    <description>&lt;P&gt;What is the camera?&lt;/P&gt;
&lt;P&gt;Do you mean the camera driver cannot control the camera? Is there any error message when you use the camera to capture?&lt;/P&gt;</description>
    <pubDate>Tue, 07 May 2024 07:12:44 GMT</pubDate>
    <dc:creator>jimmychan</dc:creator>
    <dc:date>2024-05-07T07:12:44Z</dc:date>
    <item>
      <title>custom image sensor driver</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/custom-image-sensor-driver/m-p/1854212#M222947</link>
      <description>&lt;P&gt;&lt;SPAN&gt;Hello NXP community,&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;I am trying to write a driver for our custom MIPI camera for IMX8MP device. The camera is acting as the master on the MIPI bus, and is generating the MIPI clock by itself. I am using Yocto Mickledore. I could not find anywhere information if this mode of operation is supported. I did see that all the drivers I was looking at have the clock generated as part of the driver. Is this mode supported and what do I need to do in the driver to disable the host MIPI clock and only use the sensor clock&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;Any suggestion will be appreciated&lt;/P&gt;&lt;P&gt;Thank you,&lt;/P&gt;&lt;P&gt;Zohar&lt;/P&gt;</description>
      <pubDate>Thu, 25 Apr 2024 02:54:12 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/custom-image-sensor-driver/m-p/1854212#M222947</guid>
      <dc:creator>zohargolan</dc:creator>
      <dc:date>2024-04-25T02:54:12Z</dc:date>
    </item>
    <item>
      <title>Re: custom image sensor driver</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/custom-image-sensor-driver/m-p/1855494#M223035</link>
      <description>&lt;P&gt;Could you show me how you connect the camera to i.MX8MP?&lt;/P&gt;</description>
      <pubDate>Fri, 26 Apr 2024 08:54:15 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/custom-image-sensor-driver/m-p/1855494#M223035</guid>
      <dc:creator>jimmychan</dc:creator>
      <dc:date>2024-04-26T08:54:15Z</dc:date>
    </item>
    <item>
      <title>Re: custom image sensor driver</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/custom-image-sensor-driver/m-p/1856956#M223127</link>
      <description>&lt;P&gt;Hi Jimmy,&lt;/P&gt;&lt;P&gt;I connected the camera on the MIPI bus using 4 lanes with a clock of 504MHz.&lt;/P&gt;&lt;P&gt;I also connected GPIOs and I2C, but the camera at this moment does not use any of those signals and start streaming MIPI data on power on&lt;/P&gt;</description>
      <pubDate>Mon, 29 Apr 2024 19:11:16 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/custom-image-sensor-driver/m-p/1856956#M223127</guid>
      <dc:creator>zohargolan</dc:creator>
      <dc:date>2024-04-29T19:11:16Z</dc:date>
    </item>
    <item>
      <title>Re: custom image sensor driver</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/custom-image-sensor-driver/m-p/1860270#M223380</link>
      <description>&lt;P&gt;What is the camera?&lt;/P&gt;
&lt;P&gt;Do you mean the camera driver cannot control the camera? Is there any error message when you use the camera to capture?&lt;/P&gt;</description>
      <pubDate>Tue, 07 May 2024 07:12:44 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/custom-image-sensor-driver/m-p/1860270#M223380</guid>
      <dc:creator>jimmychan</dc:creator>
      <dc:date>2024-05-07T07:12:44Z</dc:date>
    </item>
    <item>
      <title>Re: custom image sensor driver</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/custom-image-sensor-driver/m-p/1860640#M223405</link>
      <description>&lt;P&gt;Hi Jimmy,&lt;/P&gt;&lt;P&gt;Thank you for coming back to me. Here is what I have. I am working on a custom driver for my MIPI CSI2 camera. The camera (at current configuration) does not have any power control, reset control, and I2C control. It just start sending data on the 4 lanes MIPI port at power on.&lt;/P&gt;&lt;P&gt;This is the strip down simplistic driver I am trying&lt;/P&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#include &amp;lt;asm/unaligned.h&amp;gt;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#include &amp;lt;linux/acpi.h&amp;gt;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#include &amp;lt;linux/delay.h&amp;gt;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#include &amp;lt;linux/i2c.h&amp;gt;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#include &amp;lt;linux/module.h&amp;gt;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#include &amp;lt;media/v4l2-ctrls.h&amp;gt;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#include &amp;lt;media/v4l2-device.h&amp;gt;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#include &amp;lt;media/v4l2-fwnode.h&amp;gt;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#define xxxxxx_LINK_FREQ 504000000ULL&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#define xxxxxx_VIDEO_WIDTH 1280&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#define xxxxxx_VIDEO_HEIGHT 960&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#define xxxxxx_DATA_LANES 4&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#define xxxxxx_RGB_DEPTH 8&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#define xxxxxx_CSI_PIXEL_RATE (xxxxxx_LINK_FREQ * 2 * xxxxxx_DATA_LANES / \&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;xxxxxx_RGB_DEPTH)&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#define xxxxxx_FLL_90FPS 0x0500&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#define xxxxxx_FLL_90FPS_MIN 0x0500&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#define xxxxxx_FLL_MAX 0x7fff&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;/* Exposure controls from sensor */&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#define xxxxxx_REG_EXPOSURE 0x0074&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#define xxxxxx_EXPOSURE_MIN 6&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#define xxxxxx_EXPOSURE_MAX_MARGIN 2&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#define xxxxxx_EXPOSURE_STEP 1&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;/* Analog gain controls from sensor */&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#define xxxxxx_REG_ANALOG_GAIN 0x0077&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#define xxxxxx_ANAL_GAIN_MIN 0&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#define xxxxxx_ANAL_GAIN_MAX 240&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#define xxxxxx_ANAL_GAIN_STEP 1&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;/* Digital gain controls from sensor */&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#define xxxxxx_DGTL_GAIN_MIN 0&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#define xxxxxx_DGTL_GAIN_MAX 2048&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#define xxxxxx_DGTL_GAIN_STEP 1&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#define xxxxxx_DGTL_GAIN_DEFAULT 256&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;enum {&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;xxxxxx_LINK_FREQ_INDEX,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;};&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;struct xxxxxx_reg {&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;u16 address;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;u16 val;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;};&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;struct xxxxxx_reg_list {&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;u32 num_of_regs;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;const struct xxxxxx_reg *regs;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;};&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;struct xxxxxx_link_freq_config {&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;const struct xxxxxx_reg_list reg_list;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;};&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;struct xxxxxx_mode {&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;/* Frame width in pixels */&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;u32 width;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;/* Frame height in pixels */&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;u32 height;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;/* Horizontal timining size */&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;u32 llp;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;/* Default vertical timining size */&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;u32 fll_def;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;/* Min vertical timining size */&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;u32 fll_min;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;/* Link frequency needed for this resolution */&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;u32 link_freq_index;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;/* Sensor register settings for this resolution */&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;const struct xxxxxx_reg_list reg_list;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;};&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;#define to_xxxxxx(_sd) container_of(_sd, struct xxxxxx, sd)&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;static const char * const xxxxxx_test_pattern_menu[] = {&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;"Disabled",&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;"Solid Colour",&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;"100% Colour Bars",&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;"Fade To Grey Colour Bars",&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;"PN9",&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;"Gradient Horizontal",&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;"Gradient Vertical",&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;"Check Board",&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;"Slant Pattern",&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;};&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;static const s64 link_freq_menu_items[] = {&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;xxxxxx_LINK_FREQ,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;};&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;static const struct xxxxxx_mode supported_modes[] = {&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;{&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;.width = xxxxxx_VIDEO_WIDTH,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;.height = xxxxxx_VIDEO_HEIGHT,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;.fll_def = xxxxxx_FLL_90FPS,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;.fll_min = xxxxxx_FLL_90FPS_MIN,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;.llp = 0x0b00,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;.link_freq_index = xxxxxx_LINK_FREQ_INDEX,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;}&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;};&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;struct xxxxxx {&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;struct v4l2_subdev sd;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;struct media_pad pad;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;struct v4l2_ctrl_handler ctrl_handler;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;/* V4L2 Controls */&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;struct v4l2_ctrl *link_freq;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;struct v4l2_ctrl *pixel_rate;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;struct v4l2_ctrl *vblank;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;struct v4l2_ctrl *hblank;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;struct v4l2_ctrl *exposure;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;/* Current mode */&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;const struct xxxxxx_mode *cur_mode;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;/* To serialize asynchronus callbacks */&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;struct mutex mutex;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;/* Streaming on/off */&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;bool streaming;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;/* True if the device has been identified */&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;bool identified;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;};&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;static int xxxxxx_s_power(struct v4l2_subdev *sd, int on)&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;{&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;struct xxxxxx *sensor = to_xxxxxx(sd);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;int ret = 0;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;mutex_lock(&amp;amp;sensor-&amp;gt;mutex);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;mutex_unlock(&amp;amp;sensor-&amp;gt;mutex);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;return ret;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;}&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;static int xxxxxx_set_ctrl(struct v4l2_ctrl *ctrl)&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;{&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;struct xxxxxx *xxxxxx = container_of(ctrl-&amp;gt;handler,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;struct xxxxxx, ctrl_handler);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;struct i2c_client *client = v4l2_get_subdevdata(&amp;amp;xxxxxx-&amp;gt;sd);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;s64 exposure_max;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;int ret = 0;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;/* Propagate change of current control to all related controls */&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;if (ctrl-&amp;gt;id == V4L2_CID_VBLANK) {&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;/* Update max exposure while meeting expected vblanking */&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;exposure_max = xxxxxx-&amp;gt;cur_mode-&amp;gt;height + ctrl-&amp;gt;val -&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xxxxxx_EXPOSURE_MAX_MARGIN;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;__v4l2_ctrl_modify_range(xxxxxx-&amp;gt;exposure,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;xxxxxx-&amp;gt;exposure-&amp;gt;minimum,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;exposure_max, xxxxxx-&amp;gt;exposure-&amp;gt;step,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;exposure_max);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;}&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;switch (ctrl-&amp;gt;id) {&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;case V4L2_CID_ANALOGUE_GAIN:&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;break;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;case V4L2_CID_DIGITAL_GAIN:&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;break;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;case V4L2_CID_EXPOSURE:&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;break;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;case V4L2_CID_VBLANK:&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;/* Update FLL that meets expected vertical blanking */&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;break;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;case V4L2_CID_TEST_PATTERN:&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;break;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;default:&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;ret = -EINVAL;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;break;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;}&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;return ret;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;}&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;static const struct v4l2_ctrl_ops xxxxxx_ctrl_ops = {&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;.s_ctrl = xxxxxx_set_ctrl,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;};&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;static int xxxxxx_init_controls(struct xxxxxx *xxxxxx)&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;{&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;struct v4l2_ctrl_handler *ctrl_hdlr;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;s64 exposure_max, h_blank;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;int ret;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;ctrl_hdlr = &amp;amp;xxxxxx-&amp;gt;ctrl_handler;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;ret = v4l2_ctrl_handler_init(ctrl_hdlr, 4);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;if (ret)&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;return ret;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;ctrl_hdlr-&amp;gt;lock = &amp;amp;xxxxxx-&amp;gt;mutex;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;xxxxxx-&amp;gt;link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, &amp;amp;xxxxxx_ctrl_ops,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;V4L2_CID_LINK_FREQ, ARRAY_SIZE(link_freq_menu_items) - 1, 0,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;link_freq_menu_items);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;if (xxxxxx-&amp;gt;link_freq)&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;xxxxxx-&amp;gt;link_freq-&amp;gt;flags |= V4L2_CTRL_FLAG_READ_ONLY;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;xxxxxx-&amp;gt;pixel_rate = v4l2_ctrl_new_std&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; (ctrl_hdlr, &amp;amp;xxxxxx_ctrl_ops,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;V4L2_CID_PIXEL_RATE, 0,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;xxxxxx_CSI_PIXEL_RATE,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;1,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;xxxxxx_CSI_PIXEL_RATE);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;xxxxxx-&amp;gt;vblank = v4l2_ctrl_new_std(ctrl_hdlr, &amp;amp;xxxxxx_ctrl_ops,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; V4L2_CID_VBLANK,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; xxxxxx_FLL_90FPS_MIN -&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; xxxxxx-&amp;gt;cur_mode-&amp;gt;height,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; xxxxxx_FLL_MAX -&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; xxxxxx-&amp;gt;cur_mode-&amp;gt;height, 1,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; xxxxxx-&amp;gt;cur_mode-&amp;gt;fll_def -&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; xxxxxx-&amp;gt;cur_mode-&amp;gt;height);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;h_blank = xxxxxx-&amp;gt;cur_mode-&amp;gt;llp - xxxxxx-&amp;gt;cur_mode-&amp;gt;width;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;xxxxxx-&amp;gt;hblank = v4l2_ctrl_new_std(ctrl_hdlr, &amp;amp;xxxxxx_ctrl_ops,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; V4L2_CID_HBLANK, h_blank, h_blank, 1,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; h_blank);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;if (xxxxxx-&amp;gt;hblank)&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;xxxxxx-&amp;gt;hblank-&amp;gt;flags |= V4L2_CTRL_FLAG_READ_ONLY;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;xxxxxx-&amp;gt;sd.ctrl_handler = ctrl_hdlr;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;return 0;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;}&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;static void xxxxxx_assign_pad_format(const struct xxxxxx_mode *mode,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; struct v4l2_mbus_framefmt *fmt)&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;{&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;fmt-&amp;gt;width = mode-&amp;gt;width;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;fmt-&amp;gt;height = mode-&amp;gt;height;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;fmt-&amp;gt;code = MEDIA_BUS_FMT_Y8_1X8;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;fmt-&amp;gt;field = V4L2_FIELD_NONE;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;}&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;static int xxxxxx_set_stream(struct v4l2_subdev *sd, int enable)&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;{&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;/*&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;* Don't need to do anything here, just assume the source is streaming&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;* already.&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;*/&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;return 0;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;}&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;static int xxxxxx_set_format(struct v4l2_subdev *sd,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; struct v4l2_subdev_state *sd_state,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; struct v4l2_subdev_format *fmt)&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;{&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;struct xxxxxx *xxxxxx = to_xxxxxx(sd);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;const struct xxxxxx_mode *mode;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;s32 vblank_def, h_blank;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;mode = v4l2_find_nearest_size(supported_modes,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; ARRAY_SIZE(supported_modes), width,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; height, fmt-&amp;gt;format.width,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; fmt-&amp;gt;format.height);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;mutex_lock(&amp;amp;xxxxxx-&amp;gt;mutex);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;xxxxxx_assign_pad_format(mode, &amp;amp;fmt-&amp;gt;format);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;if (fmt-&amp;gt;which == V4L2_SUBDEV_FORMAT_TRY) {&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;*v4l2_subdev_get_try_format(sd, sd_state, fmt-&amp;gt;pad) = fmt-&amp;gt;format;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;} else {&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;xxxxxx-&amp;gt;cur_mode = mode;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;__v4l2_ctrl_s_ctrl(xxxxxx-&amp;gt;link_freq, mode-&amp;gt;link_freq_index);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;__v4l2_ctrl_s_ctrl_int64(xxxxxx-&amp;gt;pixel_rate, xxxxxx_CSI_PIXEL_RATE);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;/* Update limits and set FPS to default */&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;vblank_def = mode-&amp;gt;fll_def - mode-&amp;gt;height;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;__v4l2_ctrl_modify_range(xxxxxx-&amp;gt;vblank,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;mode-&amp;gt;fll_min - mode-&amp;gt;height,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;xxxxxx_FLL_MAX - mode-&amp;gt;height, 1,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;vblank_def);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;__v4l2_ctrl_s_ctrl(xxxxxx-&amp;gt;vblank, vblank_def);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;h_blank = xxxxxx-&amp;gt;cur_mode-&amp;gt;llp - xxxxxx-&amp;gt;cur_mode-&amp;gt;width;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;__v4l2_ctrl_modify_range(xxxxxx-&amp;gt;hblank, h_blank, h_blank, 1,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;h_blank);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;}&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;mutex_unlock(&amp;amp;xxxxxx-&amp;gt;mutex);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;return 0;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;}&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;static int xxxxxx_get_format(struct v4l2_subdev *sd,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; struct v4l2_subdev_state *sd_state,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; struct v4l2_subdev_format *fmt)&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;{&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;struct xxxxxx *xxxxxx = to_xxxxxx(sd);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;mutex_lock(&amp;amp;xxxxxx-&amp;gt;mutex);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;if (fmt-&amp;gt;which == V4L2_SUBDEV_FORMAT_TRY)&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;fmt-&amp;gt;format = *v4l2_subdev_get_try_format(&amp;amp;xxxxxx-&amp;gt;sd,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; sd_state,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; fmt-&amp;gt;pad);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;else&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;xxxxxx_assign_pad_format(xxxxxx-&amp;gt;cur_mode, &amp;amp;fmt-&amp;gt;format);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;mutex_unlock(&amp;amp;xxxxxx-&amp;gt;mutex);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;return 0;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;}&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;static int xxxxxx_enum_mbus_code(struct v4l2_subdev *sd,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;struct v4l2_subdev_state *sd_state,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;struct v4l2_subdev_mbus_code_enum *code)&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;{&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;if (code-&amp;gt;index &amp;gt; 0)&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;return -EINVAL;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;code-&amp;gt;code = MEDIA_BUS_FMT_Y8_1X8;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;return 0;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;}&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;static int xxxxxx_enum_frame_size(struct v4l2_subdev *sd,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;struct v4l2_subdev_state *sd_state,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;struct v4l2_subdev_frame_size_enum *fse)&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;{&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;if (fse-&amp;gt;index &amp;gt;= ARRAY_SIZE(supported_modes))&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;return -EINVAL;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;if (fse-&amp;gt;code != MEDIA_BUS_FMT_Y8_1X8)&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;return -EINVAL;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;fse-&amp;gt;min_width = supported_modes[fse-&amp;gt;index].width;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;fse-&amp;gt;max_width = supported_modes[fse-&amp;gt;index].width;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;fse-&amp;gt;min_height = supported_modes[fse-&amp;gt;index].height;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;fse-&amp;gt;max_height = supported_modes[fse-&amp;gt;index].height;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;return 0;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;}&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;static const struct v4l2_subdev_core_ops sensor_core_ops = {&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;.subscribe_event = v4l2_ctrl_subdev_subscribe_event,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;.s_power = xxxxxx_s_power,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;};&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;static int xxxxxx_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;{&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;struct xxxxxx *xxxxxx = to_xxxxxx(sd);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;mutex_lock(&amp;amp;xxxxxx-&amp;gt;mutex);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;xxxxxx_assign_pad_format(&amp;amp;supported_modes[0],&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;v4l2_subdev_get_try_format(sd, fh-&amp;gt;state, 0));&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;mutex_unlock(&amp;amp;xxxxxx-&amp;gt;mutex);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;return 0;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;}&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;static const struct v4l2_subdev_video_ops xxxxxx_video_ops = {&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;.s_stream = xxxxxx_set_stream,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;};&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;static const struct v4l2_subdev_pad_ops xxxxxx_pad_ops = {&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;.set_fmt = xxxxxx_set_format,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;.get_fmt = xxxxxx_get_format,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;.enum_mbus_code = xxxxxx_enum_mbus_code,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;.enum_frame_size = xxxxxx_enum_frame_size,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;};&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;static const struct v4l2_subdev_ops xxxxxx_subdev_ops = {&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;.video = &amp;amp;xxxxxx_video_ops,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;.core = &amp;amp;sensor_core_ops,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;.pad = &amp;amp;xxxxxx_pad_ops,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;};&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;static int xxxxxx_link_setup(struct media_entity *entity,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp;const struct media_pad *local,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp;const struct media_pad *remote, u32 flags)&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;{&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;printk("xxxxxx - link setup");&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;return 0;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;}&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;static const struct media_entity_operations xxxxxx_sd_entity_ops = {&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;.link_setup = xxxxxx_link_setup,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;};&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;static const struct v4l2_subdev_internal_ops xxxxxx_internal_ops = {&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;.open = xxxxxx_open,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;};&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;static void xxxxxx_remove(struct i2c_client *client)&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;{&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;struct v4l2_subdev *sd = i2c_get_clientdata(client);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;struct xxxxxx *xxxxxx = to_xxxxxx(sd);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;media_entity_cleanup(&amp;amp;sd-&amp;gt;entity);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;v4l2_ctrl_handler_free(sd-&amp;gt;ctrl_handler);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;mutex_destroy(&amp;amp;xxxxxx-&amp;gt;mutex);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;}&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;static int xxxxxx_probe(struct i2c_client *client)&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;{&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;struct xxxxxx *xxxxxx;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;int ret;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;xxxxxx = devm_kzalloc(&amp;amp;client-&amp;gt;dev, sizeof(*xxxxxx), GFP_KERNEL);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;printk("xxxxxx - kzalloc %d", xxxxxx);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;if (!xxxxxx)&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;return -ENOMEM;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;v4l2_i2c_subdev_init(&amp;amp;xxxxxx-&amp;gt;sd, client, &amp;amp;xxxxxx_subdev_ops);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;mutex_init(&amp;amp;xxxxxx-&amp;gt;mutex);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;xxxxxx-&amp;gt;cur_mode = &amp;amp;supported_modes[0];&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;ret = xxxxxx_init_controls(xxxxxx);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;printk("xxxxxx - xxxxxx_init_controls %d", ret);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;if (ret) {&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;dev_err(&amp;amp;client-&amp;gt;dev, "failed to init controls: %d", ret);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;goto probe_error_v4l2_ctrl_handler_free;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;}&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;xxxxxx-&amp;gt;sd.internal_ops = &amp;amp;xxxxxx_internal_ops;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;xxxxxx-&amp;gt;sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;xxxxxx-&amp;gt;sd.entity.ops = &amp;amp;xxxxxx_sd_entity_ops;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;xxxxxx-&amp;gt;sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;xxxxxx-&amp;gt;pad.flags = MEDIA_PAD_FL_SOURCE;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;ret = media_entity_pads_init(&amp;amp;xxxxxx-&amp;gt;sd.entity, 1, &amp;amp;xxxxxx-&amp;gt;pad);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;printk("xxxxxx - media_entity_pads_init %d", (int)ret);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;if (ret) {&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;dev_err(&amp;amp;client-&amp;gt;dev, "failed to init entity pads: %d", ret);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;goto probe_error_v4l2_ctrl_handler_free;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;}&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;ret = v4l2_async_register_subdev_sensor(&amp;amp;xxxxxx-&amp;gt;sd);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;printk("xxxxxx - v4l2_async_register_subdev_sensor %d", ret);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;if (ret &amp;lt; 0) {&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;dev_err(&amp;amp;client-&amp;gt;dev, "failed to register V4L2 subdev: %d",&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;ret);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;goto probe_error_media_entity_cleanup;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;}&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;printk("xxxxxx - finish probing");&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;return 0;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;probe_error_media_entity_cleanup:&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;media_entity_cleanup(&amp;amp;xxxxxx-&amp;gt;sd.entity);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;probe_error_v4l2_ctrl_handler_free:&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;v4l2_ctrl_handler_free(xxxxxx-&amp;gt;sd.ctrl_handler);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;mutex_destroy(&amp;amp;xxxxxx-&amp;gt;mutex);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;return ret;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;}&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;static const struct of_device_id xxxxxx_dt_ids[] = {&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;{ .compatible = "yyyyyy,xxxxxx" },&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;{},&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;};&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;MODULE_DEVICE_TABLE(of, xxxxxx_dt_ids);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;static struct i2c_driver xxxxxx_i2c_driver = {&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;.driver = {&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;.name = "xxxxxx",&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;.of_match_table = xxxxxx_dt_ids,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;},&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;.probe_new = xxxxxx_probe,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;.remove = xxxxxx_remove,&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;};&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;module_i2c_driver(xxxxxx_i2c_driver);&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;MODULE_AUTHOR("Zohar Golan");&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;MODULE_DESCRIPTION("yyyyyy xxxxxx sensor driver");&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;MODULE_LICENSE("GPL v2");&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;at boot time, I can see in dmesg that the driver is loading with no errors (I have some printk that I removed from the code above).&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;I can see there are some new entries in v4l2-ctl&lt;/DIV&gt;&lt;DIV&gt;&lt;P&gt;&lt;STRONG&gt;root@imx8mp-var-dart:~# v4l2-ctl --list-devices&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;[ 102.334469] mxc_isi.1: is_entity_link_setup, No remote pad found!&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;():&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;/dev/v4l-subdev0&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;FSL Capture Media Device (platform:32c00000.bus:camera):&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;/dev/media0&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;mxc-isi-cap (platform:32e00000.isi:cap_devic):&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;/dev/video3&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;mxc-isi-m2m (platform:32e00000.isi:m2m_devic):&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;/dev/video2&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;mxc-isi-cap (platform:32e02000.isi:cap_devic):&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;/dev/video4&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;vsi_v4l2dec (platform:vsi_v4l2dec):&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;/dev/video1&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;vsi_v4l2enc (platform:vsi_v4l2enc):&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;/dev/video0&lt;/STRONG&gt;&lt;/P&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;however when I am checking the formats of the different drivers, I don't see what I am expecting&lt;/DIV&gt;&lt;DIV&gt;&lt;P&gt;&lt;STRONG&gt;root@imx8mp-var-dart:~# v4l2-ctl -d /dev/video3 --list-formats&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;ioctl: VIDIOC_ENUM_FMT&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;Type: Video Capture Multiplanar&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;[0]: 'RGBP' (16-bit RGB 5-6-5)&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;[1]: 'RGB3' (24-bit RGB 8-8-8)&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;[2]: 'BGR3' (24-bit BGR 8-8-8)&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;[3]: 'YUYV' (YUYV 4:2:2)&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;[4]: 'YUV4' (32-bit A/XYUV 8-8-8-8)&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;[5]: 'NV12' (Y/UV 4:2:0)&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;[6]: 'NM12' (Y/UV 4:2:0 (N-C))&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;[7]: 'YM24' (Planar YUV 4:4:4 (N-C))&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;[8]: 'XR24' (32-bit BGRX 8-8-8-8)&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;[9]: 'AR24' (32-bit BGRA 8-8-8-8)&lt;/STRONG&gt;&lt;/P&gt;&lt;/DIV&gt;&lt;DIV&gt;I expected to see&amp;nbsp;GRAY8 or Y8&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Also when I am trying the following gstreamer command&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;root@imx8mp-var-dart:~# gst-launch-1.0 v4l2src device=/dev/video3 ! waylandsink&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;[ 359.543456] mxc_isi.1: is_entity_link_setup, No remote pad found!&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;[ 359.948288] mxc_isi.1: is_entity_link_setup, No remote pad found!&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;Setting pipeline to PAUSED ...&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;Pipeline is live and does not need PREROLL ...&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;Pipeline is PREROLLED ...&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;Setting pipeline to PLAYING ...&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;New clock: GstSystemClock&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;[ 359.989811] isi-capture 32e00000.isi:cap_device: mxc_isi_source_fmt_init: src:(1280,960), dst:(3840,2160) Not support upscale&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;ERROR: from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Failed to allocate required memory.&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;Additional debug info:&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;/usr/src/debug/gstreamer1.0-plugins-good/1.22.0.imx-r0/sys/v4l2/gstv4l2src.c(977): gst_v4l2src_decide_allocation (): /GstPipeline:pipeline0/GstV4l2Src:v4l2src0:&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;Buffer pool activation failed&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;Execution ended after 0:00:00.027122983&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;Setting pipeline to NULL ...&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;ERROR: from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Internal data stream error.&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;Additional debug info:&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;/usr/src/debug/gstreamer1.0/1.22.0.imx-r0/libs/gst/base/gstbasesrc.c(3132): gst_base_src_loop (): /GstPipeline:pipeline0/GstV4l2Src:v4l2src0:&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;streaming stopped, reason not-negotiated (-4)&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;Freeing pipeline ...&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Zohar&lt;/DIV&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;</description>
      <pubDate>Tue, 07 May 2024 15:10:58 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/custom-image-sensor-driver/m-p/1860640#M223405</guid>
      <dc:creator>zohargolan</dc:creator>
      <dc:date>2024-05-07T15:10:58Z</dc:date>
    </item>
    <item>
      <title>Re: custom image sensor driver</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/custom-image-sensor-driver/m-p/1860646#M223407</link>
      <description>&lt;P&gt;also if I am sending the following command&amp;nbsp;&lt;STRONG&gt;GST_DEBUG=3 gst-launch-1.0 -v v4l2src device=/dev/video3 ! video/x-raw,width=1280,height=960,framerate=90/1 ! waylandsink&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;I don't get an error, and the GStreamer is not stopping, but no video is shown&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;root@imx8mp-var-dart:~# GST_DEBUG=3 gst-launch-1.0 -v v4l2src device=/dev/video3 ! video/x-raw,width=1280,height=960,framerate=90/1 ! waylandsink&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;Setting pipeline to PAUSED ...&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;Pipeline is live and does not need PREROLL ...&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;0:00:00.086316000 1809 0xaaaad3a1de40 WARN v4l2 gstv4l2object.c:4726:gst_v4l2_object_get_crop_rect:&amp;lt;v4l2src0:src&amp;gt; Failed to get default crop rectangle with VIDIOC_G_SELECTION: Invalid argument&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;0:00:00.086430500 1809 0xaaaad3a1de40 WARN v4l2 gstv4l2object.c:4927:gst_v4l2_object_probe_caps:&amp;lt;v4l2src0:src&amp;gt; Failed to probe pixel aspect ratio with VIDIOC_CROPCAP: Invalid argument&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;Pipeline is PREROLLED ...&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;Setting pipeline to PLAYING ...&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;New clock: GstSystemClock&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;/GstPipeline:pipeline0/GstV4l2Src:v4l2src0.GstPad:src: caps = video/x-raw, width=(int)1280, height=(int)960, framerate=(fraction)90/1, format=(string)YUY2, interlace-mode=(string)progressive, colorimetry=(string)1:4:5:1&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps = video/x-raw, width=(int)1280, height=(int)960, framerate=(fraction)90/1, format=(string)YUY2, interlace-mode=(string)progressive, colorimetry=(string)1:4:5:1&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;/GstPipeline:pipeline0/GstWaylandSink:waylandsink0.GstPad:sink: caps = video/x-raw, width=(int)1280, height=(int)960, framerate=(fraction)90/1, format=(string)YUY2, interlace-mode=(string)progressive, colorimetry=(string)1:4:5:1&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;0:00:00.088664375 1809 0xaaaad3a1de40 WARN v4l2 gstv4l2object.c:4726:gst_v4l2_object_get_crop_rect:&amp;lt;v4l2src0:src&amp;gt; Failed to get default crop rectangle with VIDIOC_G_SELECTION: Invalid argument&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:sink: caps = video/x-raw, width=(int)1280, height=(int)960, framerate=(fraction)90/1, format=(string)YUY2, interlace-mode=(string)progressive, colorimetry=(string)1:4:5:1&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;0:00:00.088779000 1809 0xaaaad3a1de40 WARN v4l2 gstv4l2object.c:3440:gst_v4l2_object_reset_compose_region:&amp;lt;v4l2src0:src&amp;gt; Failed to get default compose rectangle with VIDIOC_G_SELECTION: Invalid argument&lt;/STRONG&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 07 May 2024 15:26:53 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/custom-image-sensor-driver/m-p/1860646#M223407</guid>
      <dc:creator>zohargolan</dc:creator>
      <dc:date>2024-05-07T15:26:53Z</dc:date>
    </item>
    <item>
      <title>Re: custom image sensor driver</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/custom-image-sensor-driver/m-p/1878254#M224363</link>
      <description>&lt;P&gt;Hi &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/39586"&gt;@joanxie&lt;/a&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I know this is an old thread, but I have a similar problema and I cannot find a solution for it. I am trying to connect to a custom 8 bit grayscale sensor using V4l2, Currently I can get the gray image, using the ISI with code&amp;nbsp;MEDIA_BUS_FMT_Y8_1X8 and the colorspace is V4L2_COLORSPACE_RAW, but the size is incorrect. I see 2 images side by side and the vertical size is also incorrect.&lt;/P&gt;&lt;P&gt;1. in your comment for the following post&amp;nbsp;&lt;A href="https://community.nxp.com/t5/i-MX-Processors/i-MX8-ISI-for-RAW8-and-RAW10-formats-grayscale-image-sensors/m-p/1293070#M175584" target="_blank"&gt;https://community.nxp.com/t5/i-MX-Processors/i-MX8-ISI-for-RAW8-and-RAW10-formats-grayscale-image-sensors/m-p/1293070#M175584&lt;/A&gt;&amp;nbsp;you mentioned to use the ISP instead of the ISI. Is there an example of how to do that?&lt;/P&gt;&lt;P&gt;2. Do you have other suggestions on how to implement the grayscale sensor?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thank you,&lt;/P&gt;&lt;P&gt;Zohar&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 30 May 2024 14:34:55 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/custom-image-sensor-driver/m-p/1878254#M224363</guid>
      <dc:creator>zohargolan</dc:creator>
      <dc:date>2024-05-30T14:34:55Z</dc:date>
    </item>
    <item>
      <title>Re: custom image sensor driver</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/custom-image-sensor-driver/m-p/1891523#M225300</link>
      <description>&lt;P&gt;Hello Zohargolan,&lt;BR /&gt;&lt;BR /&gt;I am also writing adv7480 driverv for imx8MPlus with Mickledore . I am facing same issue "&lt;STRONG&gt;Failed to get default compose rectangle with VIDIOC_G_SELECTION: Invalid argument&lt;/STRONG&gt; ".&lt;BR /&gt;I have tried same driver with imx8Mmini , its working fine.&lt;BR /&gt;But having issue with imx8Mplus. adv7480 is using external clock generator as clock source.&lt;BR /&gt;&lt;BR /&gt;Have your issue resolved??&lt;BR /&gt;if yes then Can you please give me some inputs to resolve??&lt;BR /&gt;i have attached my log file. please look into this.&lt;BR /&gt;&lt;BR /&gt;Thanks,&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 20 Jun 2024 15:40:55 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/custom-image-sensor-driver/m-p/1891523#M225300</guid>
      <dc:creator>Ohm86</dc:creator>
      <dc:date>2024-06-20T15:40:55Z</dc:date>
    </item>
  </channel>
</rss>

