"Sensor is preferred to output the specified format (1-on 0-off), default 1");
 
 /* This is a list of the formats that the ISC can *output* */
-struct isc_format controller_formats[] = {
+const struct isc_format controller_formats[] = {
        {
                .fourcc         = V4L2_PIX_FMT_ARGB444,
        },
 
 static inline void isc_reset_awb_ctrls(struct isc_device *isc)
 {
-       int c;
+       unsigned int c;
 
        for (c = ISC_HIS_CFG_MODE_GR; c <= ISC_HIS_CFG_MODE_B; c++) {
                /* gains have a fixed point at 9 decimals */
                .which = V4L2_SUBDEV_FORMAT_ACTIVE,
        };
        int ret = -EINVAL;
-       int i;
+       unsigned int i;
 
        for (i = 0; i < isc->num_user_formats; i++)
                if (isc->user_formats[i]->fourcc == fival->pixel_format)
        isc->do_wb_ctrl = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_DO_WHITE_BALANCE,
                                            0, 0, 0, 0);
 
+       if (!isc->do_wb_ctrl) {
+               ret = hdl->error;
+               v4l2_ctrl_handler_free(hdl);
+               return ret;
+       }
+
        v4l2_ctrl_activate(isc->do_wb_ctrl, false);
 
        v4l2_ctrl_handler_setup(hdl);
                                              struct isc_device, v4l2_dev);
        struct video_device *vdev = &isc->video_dev;
        struct vb2_queue *q = &isc->vb2_vidq;
-       int ret;
+       int ret = 0;
 
        INIT_WORK(&isc->awb_work, isc_awb_work);
 
        if (ret < 0) {
                v4l2_err(&isc->v4l2_dev,
                         "vb2_queue_init() failed: %d\n", ret);
-               return ret;
+               goto isc_async_complete_err;
        }
 
        /* Init video dma queues */
        if (ret < 0) {
                v4l2_err(&isc->v4l2_dev,
                         "Init format failed: %d\n", ret);
-               return ret;
+               goto isc_async_complete_err;
        }
 
        ret = isc_set_default_fmt(isc);
        if (ret) {
                v4l2_err(&isc->v4l2_dev, "Could not set default format\n");
-               return ret;
+               goto isc_async_complete_err;
        }
 
        ret = isc_ctrl_init(isc);
        if (ret) {
                v4l2_err(&isc->v4l2_dev, "Init isc ctrols failed: %d\n", ret);
-               return ret;
+               goto isc_async_complete_err;
        }
 
        /* Register video device */
        if (ret < 0) {
                v4l2_err(&isc->v4l2_dev,
                         "video_register_device failed: %d\n", ret);
-               return ret;
+               goto isc_async_complete_err;
        }
 
        return 0;
+
+isc_async_complete_err:
+       mutex_destroy(&isc->lock);
+       return ret;
 }
 
 const struct v4l2_async_notifier_operations isc_async_ops = {
 
                                        ISC_PFE_CFG0_CCIR656;
 
                subdev_entity->asd->match_type = V4L2_ASYNC_MATCH_FWNODE;
-               subdev_entity->asd->match.fwnode =
-                       of_fwnode_handle(rem);
+               subdev_entity->asd->match.fwnode = of_fwnode_handle(rem);
                list_add_tail(&subdev_entity->list, &isc->subdev_entities);
        }
 
        struct isc_device *isc = platform_get_drvdata(pdev);
 
        pm_runtime_disable(&pdev->dev);
-       clk_disable_unprepare(isc->ispck);
-       clk_disable_unprepare(isc->hclock);
 
        isc_subdev_cleanup(isc);
 
        v4l2_device_unregister(&isc->v4l2_dev);
 
+       clk_disable_unprepare(isc->ispck);
+       clk_disable_unprepare(isc->hclock);
+
        isc_clk_cleanup(isc);
 
        return 0;
        if (ret)
                return ret;
 
-       return clk_prepare_enable(isc->ispck);
+       ret = clk_prepare_enable(isc->ispck);
+       if (ret)
+               clk_disable_unprepare(isc->hclock);
+
+       return ret;
 }
 
 static const struct dev_pm_ops atmel_isc_dev_pm_ops = {