diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2018-12-10 16:45:50 -0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2018-12-10 16:45:49 -0800 |
commit | f33b549360fadf58bfd2ee4e2f33bdbc17a5c383 (patch) | |
tree | b2e7e729c888802dffe7efc37b66bea5b51adbf9 /drivers | |
parent | 982f5648ef062fbb28ff47b0e3fdaef1138da621 (diff) | |
parent | ab6810fe8b62eca257927100fdbdda391827ffd1 (diff) |
Merge "msm: camera: Fix invalid type conversion"
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/media/platform/msm/camera_v2/sensor/laser_led/msm_laser_led.c | 67 |
1 files changed, 58 insertions, 9 deletions
diff --git a/drivers/media/platform/msm/camera_v2/sensor/laser_led/msm_laser_led.c b/drivers/media/platform/msm/camera_v2/sensor/laser_led/msm_laser_led.c index c368f081f97b..68d3c71601eb 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/laser_led/msm_laser_led.c +++ b/drivers/media/platform/msm/camera_v2/sensor/laser_led/msm_laser_led.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2017, The Linux Foundation. All rights reserved. +/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -70,18 +70,15 @@ static struct msm_camera_i2c_fn_t msm_sensor_cci_func_tbl = { .i2c_util = msm_sensor_cci_i2c_util, .i2c_poll = msm_camera_cci_i2c_poll, }; -#ifdef CONFIG_COMPAT -static int32_t msm_laser_led_init( - struct msm_laser_led_ctrl_t *laser_led_ctrl, - struct msm_laser_led_cfg_data_t32 __user *laser_led_data) -#else + static int32_t msm_laser_led_init( struct msm_laser_led_ctrl_t *laser_led_ctrl, - struct msm_laser_led_cfg_data_t __user *laser_led_data) -#endif + void __user *argp) { int32_t rc = -EFAULT; struct msm_camera_cci_client *cci_client = NULL; + struct msm_laser_led_cfg_data_t __user *laser_led_data = + (struct msm_laser_led_cfg_data_t __user *) argp; CDBG("Enter\n"); @@ -263,6 +260,53 @@ static int32_t msm_laser_led_control32( return rc; } + +static int32_t msm_laser_led_init32( + struct msm_laser_led_ctrl_t *laser_led_ctrl, + void __user *argp) +{ + int32_t rc = -EFAULT; + struct msm_laser_led_cfg_data_t32 __user *laser_led_data = + (struct msm_laser_led_cfg_data_t32 __user *) argp; + struct msm_camera_cci_client *cci_client = NULL; + + CDBG("Enter\n"); + + if (laser_led_ctrl->laser_led_state == MSM_CAMERA_LASER_LED_INIT) { + pr_err("Invalid laser_led state = %d\n", + laser_led_ctrl->laser_led_state); + return 0; + } + + rc = laser_led_ctrl->i2c_client.i2c_func_tbl->i2c_util( + &laser_led_ctrl->i2c_client, MSM_CCI_INIT); + if (rc < 0) + pr_err("cci_init failed\n"); + + cci_client = laser_led_ctrl->i2c_client.cci_client; + + if (copy_from_user(&(cci_client->sid), + &(laser_led_data->i2c_addr), + sizeof(uint16_t))) { + pr_err("%s:%d failed\n", __func__, __LINE__); + return -EFAULT; + } + cci_client->sid = cci_client->sid >> 1; + cci_client->retries = 3; + cci_client->id_map = 0; + + if (copy_from_user(&(cci_client->i2c_freq_mode), + &(laser_led_data->i2c_freq_mode), + sizeof(enum i2c_freq_mode_t))) { + pr_err("%s:%d failed\n", __func__, __LINE__); + return -EFAULT; + } + + laser_led_ctrl->laser_led_state = MSM_CAMERA_LASER_LED_INIT; + + CDBG("Exit\n"); + return 0; +} #endif static int32_t msm_laser_led_control( @@ -381,7 +425,12 @@ static int32_t msm_laser_led_config(struct msm_laser_led_ctrl_t *laser_led_ctrl, switch (cfg_type) { case CFG_LASER_LED_INIT: - rc = msm_laser_led_init(laser_led_ctrl, laser_led_data); +#ifdef CONFIG_COMPAT + if (is_compat_task()) + rc = msm_laser_led_init32(laser_led_ctrl, argp); + else +#endif + rc = msm_laser_led_init(laser_led_ctrl, argp); break; case CFG_LASER_LED_CONTROL: #ifdef CONFIG_COMPAT |