hc
2023-11-06 e3e12f52b214121840b44c91de5b3e5af5d3eb84
kernel/drivers/media/i2c/gc2145.c
....@@ -2583,8 +2583,11 @@
25832583 }
25842584
25852585 ret = gc2145_ioctl(sd, cmd, inf);
2586
- if (!ret)
2586
+ if (!ret) {
25872587 ret = copy_to_user(up, inf, sizeof(*inf));
2588
+ if (ret)
2589
+ ret = -EFAULT;
2590
+ }
25882591 kfree(inf);
25892592 break;
25902593 case RKMODULE_AWB_CFG:
....@@ -2597,12 +2600,16 @@
25972600 ret = copy_from_user(cfg, up, sizeof(*cfg));
25982601 if (!ret)
25992602 ret = gc2145_ioctl(sd, cmd, cfg);
2603
+ else
2604
+ ret = -EFAULT;
26002605 kfree(cfg);
26012606 break;
26022607 case RKMODULE_SET_QUICK_STREAM:
26032608 ret = copy_from_user(&stream, up, sizeof(u32));
26042609 if (!ret)
26052610 ret = gc2145_ioctl(sd, cmd, &stream);
2611
+ else
2612
+ ret = -EFAULT;
26062613 break;
26072614 default:
26082615 ret = -ENOIOCTLCMD;
....@@ -2871,7 +2878,7 @@
28712878 if (ret)
28722879 dev_info(dev, "Failed to get power regulators\n");
28732880
2874
- return __gc2145_power_on(gc2145);
2881
+ return ret;
28752882 }
28762883
28772884 static int gc2145_probe(struct i2c_client *client,
....@@ -2915,11 +2922,6 @@
29152922
29162923 ret = gc2145_parse_of(gc2145);
29172924 if (ret != 0)
2918
- return -EINVAL;
2919
-
2920
- gc2145->xvclk_frequency = clk_get_rate(gc2145->xvclk);
2921
- if (gc2145->xvclk_frequency < 6000000 ||
2922
- gc2145->xvclk_frequency > 27000000)
29232925 return -EINVAL;
29242926
29252927 v4l2_ctrl_handler_init(&gc2145->ctrls, 3);
....@@ -2972,6 +2974,12 @@
29722974 gc2145->fps = DIV_ROUND_CLOSEST(gc2145->framesize_cfg[0].max_fps.denominator,
29732975 gc2145->framesize_cfg[0].max_fps.numerator);
29742976
2977
+ __gc2145_power_on(gc2145);
2978
+ gc2145->xvclk_frequency = clk_get_rate(gc2145->xvclk);
2979
+ if (gc2145->xvclk_frequency < 6000000 ||
2980
+ gc2145->xvclk_frequency > 27000000)
2981
+ goto error;
2982
+
29752983 ret = gc2145_detect(gc2145);
29762984 if (ret < 0) {
29772985 dev_info(&client->dev, "Check id failed:\n"