msm: sensor: Add support for querying flash max current

Add support for querying maximum available system current
for the flash.

Change-Id: I63e40a5dc33e783951c0e946e85c7ca4a970cab4
Signed-off-by: Sureshnaidu Laveti <lsuresh@codeaurora.org>
This commit is contained in:
Sureshnaidu Laveti 2016-07-28 09:21:07 -07:00
parent ecea159153
commit b6e7fa2ab5
3 changed files with 139 additions and 5 deletions

View file

@ -15,6 +15,7 @@
#include <linux/module.h>
#include <linux/of_gpio.h>
#include <linux/leds-qpnp-flash.h>
#include "msm_flash.h"
#include "msm_camera_dt_util.h"
#include "msm_cci.h"
@ -491,6 +492,45 @@ static int32_t msm_flash_init(
return 0;
}
static int32_t msm_flash_prepare(
struct msm_flash_ctrl_t *flash_ctrl)
{
int32_t ret = 0;
CDBG("%s:%d: State : %d\n",
__func__, __LINE__, flash_ctrl->flash_state);
if (flash_ctrl->switch_trigger == NULL) {
pr_err("%s:%d Invalid argument\n",
__func__, __LINE__);
return -EINVAL;
}
if (flash_ctrl->flash_state == MSM_CAMERA_FLASH_INIT &&
flash_ctrl->is_regulator_enabled == 0) {
ret = qpnp_flash_led_prepare(flash_ctrl->switch_trigger,
ENABLE_REGULATOR, NULL);
if (ret < 0) {
pr_err("%s:%d regulator enable failed ret = %d\n",
__func__, __LINE__, ret);
return ret;
}
flash_ctrl->is_regulator_enabled = 1;
} else if (flash_ctrl->flash_state == MSM_CAMERA_FLASH_RELEASE &&
flash_ctrl->is_regulator_enabled) {
ret = qpnp_flash_led_prepare(flash_ctrl->switch_trigger,
DISABLE_REGULATOR, NULL);
if (ret < 0) {
pr_err("%s:%d regulator disable failed ret = %d\n",
__func__, __LINE__, ret);
return ret;
}
flash_ctrl->is_regulator_enabled = 0;
}
CDBG("%s:%d:Exit\n", __func__, __LINE__);
return ret;
}
static int32_t msm_flash_low(
struct msm_flash_ctrl_t *flash_ctrl,
struct msm_flash_cfg_data_t *flash_data)
@ -564,6 +604,29 @@ static int32_t msm_flash_high(
return 0;
}
static int32_t msm_flash_query_current(
struct msm_flash_ctrl_t *flash_ctrl,
struct msm_flash_query_data_t *flash_query_data)
{
int32_t ret = -EINVAL;
int32_t max_current = -EINVAL;
if (flash_ctrl->switch_trigger) {
ret = qpnp_flash_led_prepare(flash_ctrl->switch_trigger,
QUERY_MAX_CURRENT, &max_current);
if (ret < 0) {
pr_err("%s:%d Query max_avail_curr failed ret = %d\n",
__func__, __LINE__, ret);
return ret;
}
}
flash_query_data->max_avail_curr = max_current;
CDBG("%s: %d: max_avail_curr : %d\n", __func__, __LINE__,
flash_query_data->max_avail_curr);
return 0;
}
static int32_t msm_flash_release(
struct msm_flash_ctrl_t *flash_ctrl)
{
@ -626,11 +689,55 @@ static int32_t msm_flash_config(struct msm_flash_ctrl_t *flash_ctrl,
mutex_unlock(flash_ctrl->flash_mutex);
rc = msm_flash_prepare(flash_ctrl);
if (rc < 0) {
pr_err("%s:%d Enable/Disable Regulator failed ret = %d",
__func__, __LINE__, rc);
return rc;
}
CDBG("Exit %s type %d\n", __func__, flash_data->cfg_type);
return rc;
}
static int32_t msm_flash_query_data(struct msm_flash_ctrl_t *flash_ctrl,
void __user *argp)
{
int32_t rc = -EINVAL, i = 0;
struct msm_flash_query_data_t *flash_query =
(struct msm_flash_query_data_t *) argp;
CDBG("Enter %s type %d\n", __func__, flash_query->query_type);
switch (flash_query->query_type) {
case FLASH_QUERY_CURRENT:
if (flash_ctrl->func_tbl && flash_ctrl->func_tbl->
camera_flash_query_current != NULL)
rc = flash_ctrl->func_tbl->
camera_flash_query_current(
flash_ctrl, flash_query);
else {
flash_query->max_avail_curr = 0;
for (i = 0; i < flash_ctrl->flash_num_sources; i++) {
flash_query->max_avail_curr +=
flash_ctrl->flash_op_current[i];
}
rc = 0;
CDBG("%s: max_avail_curr: %d\n", __func__,
flash_query->max_avail_curr);
}
break;
default:
rc = -EFAULT;
break;
}
CDBG("Exit %s type %d\n", __func__, flash_query->query_type);
return rc;
}
static long msm_flash_subdev_ioctl(struct v4l2_subdev *sd,
unsigned int cmd, void *arg)
{
@ -662,8 +769,11 @@ static long msm_flash_subdev_ioctl(struct v4l2_subdev *sd,
pr_err("fctrl->func_tbl NULL\n");
return -EINVAL;
} else {
return fctrl->func_tbl->camera_flash_release(fctrl);
fctrl->func_tbl->camera_flash_release(fctrl);
return msm_flash_prepare(fctrl);
}
case VIDIOC_MSM_FLASH_QUERY_DATA:
return msm_flash_query_data(fctrl, argp);
default:
pr_err_ratelimited("invalid cmd %d\n", cmd);
return -ENOIOCTLCMD;
@ -846,9 +956,14 @@ static int32_t msm_flash_get_pmic_source_info(
"qcom,current",
&fctrl->torch_op_current[i]);
if (rc < 0) {
pr_err("current: read failed\n");
of_node_put(torch_src_node);
continue;
rc = of_property_read_u32(torch_src_node,
"qcom,current-ma",
&fctrl->torch_op_current[i]);
if (rc < 0) {
pr_err("current: read failed\n");
of_node_put(torch_src_node);
continue;
}
}
/* Read max-current */
@ -1134,6 +1249,7 @@ static struct msm_flash_table msm_pmic_flash_table = {
.camera_flash_off = msm_flash_off,
.camera_flash_low = msm_flash_low,
.camera_flash_high = msm_flash_high,
.camera_flash_query_current = msm_flash_query_current,
},
};
@ -1145,6 +1261,7 @@ static struct msm_flash_table msm_gpio_flash_table = {
.camera_flash_off = msm_flash_off,
.camera_flash_low = msm_flash_low,
.camera_flash_high = msm_flash_high,
.camera_flash_query_current = NULL,
},
};
@ -1156,6 +1273,7 @@ static struct msm_flash_table msm_i2c_flash_table = {
.camera_flash_off = msm_flash_i2c_write_setting_array,
.camera_flash_low = msm_flash_i2c_write_setting_array,
.camera_flash_high = msm_flash_i2c_write_setting_array,
.camera_flash_query_current = NULL,
},
};

View file

@ -1,4 +1,4 @@
/* Copyright (c) 2009-2015, The Linux Foundation. All rights reserved.
/* Copyright (c) 2009-2016, 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
@ -42,6 +42,9 @@ struct msm_flash_func_t {
struct msm_flash_cfg_data_t *);
int32_t (*camera_flash_high)(struct msm_flash_ctrl_t *,
struct msm_flash_cfg_data_t *);
int32_t (*camera_flash_query_current)(struct msm_flash_ctrl_t *,
struct msm_flash_query_data_t *);
};
struct msm_flash_table {
@ -67,6 +70,7 @@ struct msm_flash_ctrl_t {
/* Switch node to trigger led */
const char *switch_trigger_name;
struct led_trigger *switch_trigger;
uint32_t is_regulator_enabled;
/* Flash */
uint32_t flash_num_sources;

View file

@ -34,6 +34,9 @@
#define MAX_NUMBER_OF_STEPS 47
#define MAX_REGULATOR 5
/*msm_flash_query_data_t query types*/
#define FLASH_QUERY_CURRENT 1
#define MSM_V4L2_PIX_FMT_META v4l2_fourcc('M', 'E', 'T', 'A') /* META */
#define MSM_V4L2_PIX_FMT_SBGGR14 v4l2_fourcc('B', 'G', '1', '4')
/* 14 BGBG.. GRGR.. */
@ -530,6 +533,12 @@ struct msm_flash_cfg_data_t {
} cfg;
};
struct msm_flash_query_data_t {
int32_t flags;
int32_t query_type;
int32_t max_avail_curr;
};
/* sensor init structures and enums */
enum msm_sensor_init_cfg_type_t {
CFG_SINIT_PROBE,
@ -585,5 +594,8 @@ struct sensor_init_cfg_data {
#define VIDIOC_MSM_OIS_CFG_DOWNLOAD \
_IOWR('V', BASE_VIDIOC_PRIVATE + 14, struct msm_ois_cfg_download_data)
#define VIDIOC_MSM_FLASH_QUERY_DATA \
_IOWR('V', BASE_VIDIOC_PRIVATE + 15, struct msm_flash_query_data_t)
#endif