mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
Rhodep: flash node control
details: control flash enable & brightness Change-Id: I59933ae02344bf167dbc3c775d5c9f08061786c0 Signed-off-by: luozhq15 <[email protected]> Reviewed-on: https://gerrit.mot.com/2145011 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Reviewed-by: <[email protected]> Reviewed-by: Long Cheng <[email protected]> Tested-by: Jira Key Reviewed-by: <[email protected]> Reviewed-by: Wang Liu <[email protected]> Reviewed-by: Xingyun Fu <[email protected]> Reviewed-by: Shuo Wang <[email protected]> Reviewed-by: Zhichao Chen <[email protected]> Submit-Approved: Jira Key
This commit is contained in:
parent
eb14c6118f
commit
a77c5ebdb3
3 changed files with 211 additions and 7 deletions
|
|
@ -9,6 +9,9 @@
|
|||
#include "cam_flash_core.h"
|
||||
#include "cam_common_util.h"
|
||||
#include "camera_main.h"
|
||||
#ifdef CONFIG_CAMERA_FLASH_PWM
|
||||
#include "pm6125_flash_gpio.h"
|
||||
#endif
|
||||
|
||||
static int32_t cam_flash_driver_cmd(struct cam_flash_ctrl *fctrl,
|
||||
void *arg, struct cam_flash_private_soc *soc_private)
|
||||
|
|
@ -444,6 +447,9 @@ static int cam_flash_component_bind(struct device *dev,
|
|||
fctrl->soc_info.dev_name = pdev->name;
|
||||
|
||||
platform_set_drvdata(pdev, fctrl);
|
||||
#ifdef CONFIG_CAMERA_FLASH_PWM
|
||||
dev_set_drvdata(&pdev->dev, fctrl);
|
||||
#endif
|
||||
|
||||
rc = cam_flash_get_dt_data(fctrl, &fctrl->soc_info);
|
||||
if (rc) {
|
||||
|
|
@ -544,6 +550,9 @@ static int cam_flash_component_bind(struct device *dev,
|
|||
|
||||
fctrl->flash_state = CAM_FLASH_STATE_INIT;
|
||||
CAM_DBG(CAM_FLASH, "Component bound successfully");
|
||||
#ifdef CONFIG_CAMERA_FLASH_PWM
|
||||
pm6125_flash_control_create_device(&pdev->dev);
|
||||
#endif
|
||||
return rc;
|
||||
|
||||
free_cci_resource:
|
||||
|
|
@ -566,6 +575,10 @@ static void cam_flash_component_unbind(struct device *dev,
|
|||
struct cam_flash_ctrl *fctrl;
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
|
||||
#ifdef CONFIG_CAMERA_FLASH_PWM
|
||||
pm6125_flash_control_remove_device(&pdev->dev);
|
||||
#endif
|
||||
|
||||
fctrl = platform_get_drvdata(pdev);
|
||||
if (!fctrl) {
|
||||
CAM_ERR(CAM_FLASH, "Flash device is NULL");
|
||||
|
|
@ -578,6 +591,9 @@ static void cam_flash_component_unbind(struct device *dev,
|
|||
cam_unregister_subdev(&(fctrl->v4l2_dev_str));
|
||||
cam_flash_put_source_node_data(fctrl);
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
#ifdef CONFIG_CAMERA_FLASH_PWM
|
||||
dev_set_drvdata(&pdev->dev, NULL);
|
||||
#endif
|
||||
v4l2_set_subdevdata(&fctrl->v4l2_dev_str.sd, NULL);
|
||||
kfree(fctrl);
|
||||
CAM_INFO(CAM_FLASH, "Flash Sensor component unbind");
|
||||
|
|
|
|||
|
|
@ -22,7 +22,13 @@
|
|||
#include <media/rc-core.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include "pm6125_flash_gpio.h"
|
||||
|
||||
#ifdef CONFIG_CAMERA_FLASH_PWM
|
||||
#include "cam_flash_dev.h"
|
||||
#include "cam_flash_soc.h"
|
||||
#include "cam_flash_core.h"
|
||||
#include "cam_common_util.h"
|
||||
#include "cam_res_mgr_api.h"
|
||||
#endif
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
|
|
@ -30,8 +36,10 @@
|
|||
*****************************************************************************/
|
||||
|
||||
struct pwm_device *pwm;
|
||||
|
||||
/*****************************************************************************
|
||||
#ifdef CONFIG_CAMERA_FLASH_PWM
|
||||
static unsigned int flashlight_enable = CAMERA_SENSOR_FLASH_STATUS_OFF;
|
||||
static unsigned int flashlight_brightness = 0;
|
||||
#endif/*****************************************************************************
|
||||
* Function
|
||||
*****************************************************************************/
|
||||
|
||||
|
|
@ -46,10 +54,6 @@ void pm6125_flash_gpio_select_state(PM6125_FLASH_GPIO_STATE s, enum camera_flash
|
|||
pstate.period = PM6125_PWM_PERIOD;
|
||||
switch (s) {
|
||||
case PM6125_FLASH_GPIO_STATE_ACTIVE:
|
||||
pstate.duty_cycle = 0;
|
||||
pstate.enabled = false;
|
||||
rc = pwm_apply_state(pwm, &pstate);
|
||||
PM6125_FLASH_PRINT("[pm6125_flash_gpio]Suspend before Active");
|
||||
|
||||
switch (opcode)
|
||||
{
|
||||
|
|
@ -85,7 +89,178 @@ void pm6125_flash_gpio_select_state(PM6125_FLASH_GPIO_STATE s, enum camera_flash
|
|||
PM6125_FLASH_PRINT("[pm6125_flash_gpio]Apply PWM state fail, rc = %d", rc);
|
||||
}
|
||||
}
|
||||
#ifdef CONFIG_CAMERA_FLASH_PWM
|
||||
static ssize_t flashlight_enable_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
return sprintf(buf, "%u\n", flashlight_enable);
|
||||
}
|
||||
|
||||
static ssize_t flashlight_enable_store(struct device *dev,
|
||||
struct device_attribute *attr, const char *buf, size_t size)
|
||||
{
|
||||
struct cam_flash_ctrl *fctrl = dev_get_drvdata(dev);
|
||||
struct cam_flash_private_soc *soc_private = fctrl->soc_info.soc_private;
|
||||
unsigned long state_to_set;
|
||||
ssize_t ret = -EINVAL;
|
||||
|
||||
CAM_INFO(CAM_FLASH, "Flash Enable Command: %s", buf);
|
||||
ret = kstrtoul(buf, 10, &state_to_set);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (CAMERA_SENSOR_FLASH_STATUS_OFF != state_to_set) {
|
||||
// enable flash
|
||||
if (CAMERA_SENSOR_FLASH_STATUS_OFF == flashlight_enable) {
|
||||
ret = cam_res_mgr_gpio_request(
|
||||
fctrl->soc_info.dev,
|
||||
soc_private->flash_gpio_enable, 0,
|
||||
"CUSTOM_GPIO1");
|
||||
if (ret) {
|
||||
CAM_ERR(CAM_FLASH, "gpio %d request fails",
|
||||
soc_private->flash_gpio_enable);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
flashlight_enable = state_to_set;
|
||||
cam_res_mgr_gpio_set_value(
|
||||
soc_private->flash_gpio_enable,
|
||||
flashlight_enable == CAMERA_SENSOR_FLASH_STATUS_HIGH);
|
||||
if (flashlight_enable == CAMERA_SENSOR_FLASH_STATUS_LOW) {
|
||||
pm6125_flash_gpio_select_state(
|
||||
PM6125_FLASH_GPIO_STATE_ACTIVE,
|
||||
CAMERA_SENSOR_FLASH_OP_FIRELOW,
|
||||
FLASH_FIRE_LOW_MAXCURRENT);
|
||||
usleep_range(5000, 6000);
|
||||
}
|
||||
pm6125_flash_gpio_select_state(
|
||||
PM6125_FLASH_GPIO_STATE_ACTIVE,
|
||||
flashlight_enable == CAMERA_SENSOR_FLASH_STATUS_HIGH ?
|
||||
CAMERA_SENSOR_FLASH_OP_FIREHIGH :
|
||||
CAMERA_SENSOR_FLASH_OP_FIRELOW,
|
||||
(u64)flashlight_brightness);
|
||||
}
|
||||
else {
|
||||
// disable flash
|
||||
if (CAMERA_SENSOR_FLASH_STATUS_OFF != flashlight_enable) {
|
||||
cam_res_mgr_gpio_set_value(
|
||||
soc_private->flash_gpio_enable, 0);
|
||||
cam_res_mgr_gpio_free(fctrl->soc_info.dev,
|
||||
soc_private->flash_gpio_enable);
|
||||
}
|
||||
flashlight_enable = CAMERA_SENSOR_FLASH_STATUS_OFF;
|
||||
pm6125_flash_gpio_select_state(PM6125_FLASH_GPIO_STATE_SUSPEND,
|
||||
CAMERA_SENSOR_FLASH_OP_OFF, 0);
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
static ssize_t flashlight_brightness_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
return sprintf(buf, "%u\n", flashlight_brightness);
|
||||
}
|
||||
|
||||
static ssize_t flashlight_brightness_store(struct device *dev,
|
||||
struct device_attribute *attr, const char *buf, size_t size)
|
||||
{
|
||||
struct cam_flash_ctrl *fctrl = dev_get_drvdata(dev);
|
||||
struct cam_flash_private_soc *soc_private = fctrl->soc_info.soc_private;
|
||||
unsigned long brightness_to_set;
|
||||
ssize_t ret = -EINVAL;
|
||||
|
||||
CAM_INFO(CAM_FLASH, "Flash Brightness Command: %s", buf);
|
||||
ret = kstrtoul(buf, 10, &brightness_to_set);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
flashlight_brightness = brightness_to_set;
|
||||
|
||||
switch (flashlight_enable)
|
||||
{
|
||||
case CAMERA_SENSOR_FLASH_STATUS_LOW: // CAMERA_SENSOR_FLASH_OP_FIRELOW
|
||||
case CAMERA_SENSOR_FLASH_STATUS_HIGH: // CAMERA_SENSOR_FLASH_OP_FIREHIGH
|
||||
|
||||
CAM_INFO(CAM_FLASH, "Flash Mode %s: %d",
|
||||
flashlight_enable == CAMERA_SENSOR_FLASH_STATUS_HIGH ?
|
||||
"High" :
|
||||
"Low",
|
||||
flashlight_brightness);
|
||||
|
||||
// disable first
|
||||
cam_res_mgr_gpio_set_value(
|
||||
soc_private->flash_gpio_enable, 0);
|
||||
cam_res_mgr_gpio_free(fctrl->soc_info.dev,
|
||||
soc_private->flash_gpio_enable);
|
||||
pm6125_flash_gpio_select_state(PM6125_FLASH_GPIO_STATE_SUSPEND, CAMERA_SENSOR_FLASH_OP_OFF, 0);
|
||||
|
||||
// get handle
|
||||
ret = cam_res_mgr_gpio_request(
|
||||
fctrl->soc_info.dev,
|
||||
soc_private->flash_gpio_enable, 0,
|
||||
"CUSTOM_GPIO1");
|
||||
if (ret) {
|
||||
CAM_ERR(CAM_FLASH, "gpio %d request fails",
|
||||
soc_private->flash_gpio_enable);
|
||||
return ret;
|
||||
}
|
||||
|
||||
cam_res_mgr_gpio_set_value(
|
||||
soc_private->flash_gpio_enable,
|
||||
flashlight_enable == CAMERA_SENSOR_FLASH_STATUS_HIGH);
|
||||
if (flashlight_enable == CAMERA_SENSOR_FLASH_STATUS_LOW) {
|
||||
pm6125_flash_gpio_select_state(
|
||||
PM6125_FLASH_GPIO_STATE_ACTIVE,
|
||||
CAMERA_SENSOR_FLASH_OP_FIRELOW,
|
||||
FLASH_FIRE_LOW_MAXCURRENT);
|
||||
usleep_range(5000, 6000);
|
||||
}
|
||||
pm6125_flash_gpio_select_state(
|
||||
PM6125_FLASH_GPIO_STATE_ACTIVE,
|
||||
flashlight_enable == CAMERA_SENSOR_FLASH_STATUS_HIGH ?
|
||||
CAMERA_SENSOR_FLASH_OP_FIREHIGH :
|
||||
CAMERA_SENSOR_FLASH_OP_FIRELOW,
|
||||
(u64)flashlight_brightness);
|
||||
break;
|
||||
default:
|
||||
CAM_INFO(CAM_FLASH, "flashlight had not been enable yet.");
|
||||
break;
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
static DEVICE_ATTR_RW(flashlight_enable);
|
||||
static DEVICE_ATTR_RW(flashlight_brightness);
|
||||
struct device_attribute *flashlight_attributes[] = {
|
||||
&dev_attr_flashlight_enable,
|
||||
&dev_attr_flashlight_brightness,
|
||||
};
|
||||
int pm6125_flash_control_create_device(struct device* dev)
|
||||
{
|
||||
int i, ret = 0;
|
||||
for (i = 0; i < ARRAY_SIZE(flashlight_attributes); i++) {
|
||||
ret = device_create_file(dev,
|
||||
flashlight_attributes[i]);
|
||||
if (ret) {
|
||||
dev_err(dev, "failed: sysfs file %s\n",
|
||||
flashlight_attributes[i]->attr.name);
|
||||
pm6125_flash_control_remove_device(dev);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pm6125_flash_control_remove_device(struct device* dev)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < ARRAY_SIZE(flashlight_attributes); i++) {
|
||||
device_remove_file(dev, flashlight_attributes[i]);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
static int pm6125_flash_pwm_probe(struct platform_device *pdev)
|
||||
{
|
||||
int rc = 0;
|
||||
|
|
|
|||
|
|
@ -12,6 +12,15 @@ typedef enum {
|
|||
PM6125_FLASH_GPIO_STATE_MAX, /* for array size */
|
||||
} PM6125_FLASH_GPIO_STATE;
|
||||
|
||||
#ifdef CONFIG_CAMERA_FLASH_PWM
|
||||
enum{
|
||||
CAMERA_SENSOR_FLASH_STATUS_OFF,
|
||||
CAMERA_SENSOR_FLASH_STATUS_LOW,
|
||||
CAMERA_SENSOR_FLASH_STATUS_HIGH
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
#define PM6125_PWM_PERIOD 50000
|
||||
#define FLASH_FIRE_HIGH_MAXCURRENT 1200
|
||||
#define FLASH_FIRE_LOW_MAXCURRENT 150
|
||||
|
|
@ -20,6 +29,10 @@ typedef enum {
|
|||
* Function Prototype
|
||||
*****************************************************************************/
|
||||
extern void pm6125_flash_gpio_select_state(PM6125_FLASH_GPIO_STATE s, enum camera_flash_opcode opcode, u64 flash_current);
|
||||
#ifdef CONFIG_CAMERA_FLASH_PWM
|
||||
extern int pm6125_flash_control_create_device(struct device* dev);
|
||||
extern int pm6125_flash_control_remove_device(struct device* dev);
|
||||
#endif
|
||||
int pm6125_flash_gpio_init_module(void);
|
||||
void pm6125_flash_gpio_exit_module(void);
|
||||
#endif /* _PM6125_FLASH_GPIO_H_*/
|
||||
|
|
|
|||
Loading…
Reference in a new issue