How to make actuator(focuser) driver as v4l2 sub-device

Hello. I have question about making actuator driver in jetson xavier.
Refering to lc898212 driver, I have made my actuator driver and device tree to register v4l2 sub-device. But when booting, failed to probe nvcsi and couldn’t make sub-device.
I’m working on L4T version of 32.2.1.
I think there’s a problem with device tree. So I added device tree below and probe function in driver.(The other codes in driver are similar to lc898212.)
Could you help me make actuator driver as v4l2 sub-device ?

  1. Device tree
    / {
    host1x {
    vi@15c10000 {
    //num-channels = <1>;
    num-channels = <4>;
    ports {
    #address-cells = <1>;
    #size-cells = <0>;
    port@2 {
    reg = <2>;
    dw9806_vi_in0: endpoint {
    port-index = <2>;
    bus-width = <4>;
    remote-endpoint = <&dw9806_csi_out0>;
    };
    };
    };
    };

     nvcsi@15a00000 {
     	num-channels = <4>;
     	#address-cells = <1>;
     	#size-cells = <0>;
     	channel@2 {
     		reg = <2>;
     		ports {
     			#address-cells = <1>;
     			#size-cells = <0>;
     			port@0 {
     				reg = <0>;
     				dw9806_csi_in0: endpoint@4 {
     					port-index = <2>;
     					bus-width = <4>;
     					remote-endpoint = <&actuator_dw9806_out0>;
     				};
     			};
     			port@1 {
     				reg = <1>;
     				dw9806_csi_out0: endpoint@5 {
     					remote-endpoint = <&dw9806_vi_in0>;
     				};
     			};
     		};
     	};
     };
    

    };

    i2c@3180000 {
    dw9806@0c {
    compatible = “nvidia,dw9806”;
    reg = <0x0c>;
    //devnode = “video1”;

     	//vvcm-supply = <&p2822_avdd_cam_2v8>;
     	//support_mfi = "true";
    
     			
     	// Type specifies the control features supported by
     	// the focuser driver.
     	// default type means only position control setting
     	// supported by the focuser
     	
     	//type = "default";
     	//min_focus_distance = "10.0"; // 1.0f/0.1f
     	//hyper_focal = "0.2"; // 1.0f/5.0f
     	//focal_length = "4.73";
     	//f_number = "2.2";
     	//aperture = "2.2";	
     	
     	status = "ok";
     	
     	ports {
     		#address-cells = <1>;
     		#size-cells = <0>;
     		port@0 {
     			reg = <0>;
     			actuator_dw9806_out0: endpoint {
     				remote-endpoint = <&dw9806_csi_in0>;
     			};
     		};
     	};
     };
    

    };

    tegra-camera-platform {
    modules {
    module0 {
    drivernode1 {
    status = “okay”;
    /* Declare PCL support driver (classically known as guid) /
    pcl_id = “v4l2_focuser”;
    /
    Driver v4l2 device name /
    devname = “dw9806 2-000c”;
    /
    Declare the device-tree hierarchy to driver instance */
    proc-device-tree = “/proc/device-tree/i2c@3180000/dw9806@0c”;
    };
    };
    };
    };
    };

  2. Probe function in driver
    static int dw9806_probe(struct i2c_client *client, const struct i2c_device_id *id)
    {
    int err;
    struct dw9806 *priv;
    struct camera_common_focuser_data *common_data;

    static struct regmap_config dw9806_regmap_config8 = {
    .reg_bits = 8,
    .val_bits = 8,
    .name = “8bit”,
    };
    static struct regmap_config dw9806_regmap_config16 = {
    .reg_bits = 8,
    .val_bits = 16,
    .name = “16bit”,
    };

    dev_info(&client->dev, “%s\n”, func);

    common_data = devm_kzalloc(&client->dev, sizeof(struct camera_common_focuser_data), GFP_KERNEL);
    if (!common_data)
    return -ENOMEM;

    priv = devm_kzalloc(&client->dev, (sizeof(struct dw9806) + sizeof(struct v4l2_ctrl *) * NUM_FOCUS_CTRLS), GFP_KERNEL);
    if (!priv)
    return -ENOMEM;

    priv->regmap8 = devm_regmap_init_i2c(client, &dw9806_regmap_config8);
    if (IS_ERR(priv->regmap8)) {
    err = PTR_ERR(priv->regmap8);
    dev_err(&client->dev,
    “Failed to allocate register map 8: %d\n”, err);
    goto ERROR_RET;
    }
    priv->regmap16 = devm_regmap_init_i2c(client, &dw9806_regmap_config16);
    if (IS_ERR(priv->regmap16)) {
    err = PTR_ERR(priv->regmap16);
    dev_err(&client->dev,
    “Failed to allocate register map 16: %d\n”, err);
    goto ERROR_RET;
    }

    common_data->ops = &dw9806_ops;
    common_data->dev = &client->dev;
    common_data->priv = (void *)priv;
    common_data->ctrls = priv->ctrls;
    common_data->ctrl_handler = &priv->ctrl_handler;
    priv->s_data = common_data;
    priv->i2c_client = client;
    priv->subdev = &common_data->subdev;
    priv->subdev->dev = &client->dev;
    priv->numctrls = NUM_FOCUS_CTRLS;

    v4l2_i2c_subdev_init(priv->subdev, client, &dw9806_subdev_ops);

    err = camera_common_focuser_init(common_data);

    if (err) {
    dev_err(&client->dev, “unable to initialize focuser\n”);
    goto ERROR_RET;
    }

    priv->subdev->internal_ops = &dw9806_subdev_internal_ops;
    priv->subdev->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
    V4L2_SUBDEV_FL_HAS_EVENTS;

#if defined(CONFIG_MEDIA_CONTROLLER)
priv->pad.flags = MEDIA_PAD_FL_SOURCE;
priv->subdev->entity.ops = &dw9806_media_ops;
err = tegra_media_entity_init(&priv->subdev->entity, 1,
&priv->pad, true, false);
if (err < 0) {
dev_err(&client->dev, “unable to init media entity\n”);
goto ERROR_RET;
}
#endif

err = v4l2_async_register_subdev(priv->subdev);
if (err)
	goto ERROR_RET;

dev_info(&client->dev, "Detected dw9806 actuator\n");
return 0;

ERROR_RET:
dev_err(&client->dev, “dw9806: probing sensor failed !\n”);
return err;
}

Hi
Current not support focuser yet.