| .. | .. |
|---|
| 2583 | 2583 | } |
|---|
| 2584 | 2584 | |
|---|
| 2585 | 2585 | ret = gc2145_ioctl(sd, cmd, inf); |
|---|
| 2586 | | - if (!ret) |
|---|
| 2586 | + if (!ret) { |
|---|
| 2587 | 2587 | ret = copy_to_user(up, inf, sizeof(*inf)); |
|---|
| 2588 | + if (ret) |
|---|
| 2589 | + ret = -EFAULT; |
|---|
| 2590 | + } |
|---|
| 2588 | 2591 | kfree(inf); |
|---|
| 2589 | 2592 | break; |
|---|
| 2590 | 2593 | case RKMODULE_AWB_CFG: |
|---|
| .. | .. |
|---|
| 2597 | 2600 | ret = copy_from_user(cfg, up, sizeof(*cfg)); |
|---|
| 2598 | 2601 | if (!ret) |
|---|
| 2599 | 2602 | ret = gc2145_ioctl(sd, cmd, cfg); |
|---|
| 2603 | + else |
|---|
| 2604 | + ret = -EFAULT; |
|---|
| 2600 | 2605 | kfree(cfg); |
|---|
| 2601 | 2606 | break; |
|---|
| 2602 | 2607 | case RKMODULE_SET_QUICK_STREAM: |
|---|
| 2603 | 2608 | ret = copy_from_user(&stream, up, sizeof(u32)); |
|---|
| 2604 | 2609 | if (!ret) |
|---|
| 2605 | 2610 | ret = gc2145_ioctl(sd, cmd, &stream); |
|---|
| 2611 | + else |
|---|
| 2612 | + ret = -EFAULT; |
|---|
| 2606 | 2613 | break; |
|---|
| 2607 | 2614 | default: |
|---|
| 2608 | 2615 | ret = -ENOIOCTLCMD; |
|---|
| .. | .. |
|---|
| 2871 | 2878 | if (ret) |
|---|
| 2872 | 2879 | dev_info(dev, "Failed to get power regulators\n"); |
|---|
| 2873 | 2880 | |
|---|
| 2874 | | - return __gc2145_power_on(gc2145); |
|---|
| 2881 | + return ret; |
|---|
| 2875 | 2882 | } |
|---|
| 2876 | 2883 | |
|---|
| 2877 | 2884 | static int gc2145_probe(struct i2c_client *client, |
|---|
| .. | .. |
|---|
| 2915 | 2922 | |
|---|
| 2916 | 2923 | ret = gc2145_parse_of(gc2145); |
|---|
| 2917 | 2924 | 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) |
|---|
| 2923 | 2925 | return -EINVAL; |
|---|
| 2924 | 2926 | |
|---|
| 2925 | 2927 | v4l2_ctrl_handler_init(&gc2145->ctrls, 3); |
|---|
| .. | .. |
|---|
| 2972 | 2974 | gc2145->fps = DIV_ROUND_CLOSEST(gc2145->framesize_cfg[0].max_fps.denominator, |
|---|
| 2973 | 2975 | gc2145->framesize_cfg[0].max_fps.numerator); |
|---|
| 2974 | 2976 | |
|---|
| 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 | + |
|---|
| 2975 | 2983 | ret = gc2145_detect(gc2145); |
|---|
| 2976 | 2984 | if (ret < 0) { |
|---|
| 2977 | 2985 | dev_info(&client->dev, "Check id failed:\n" |
|---|