M7350v1_en_gpl

This commit is contained in:
T
2024-09-09 08:52:07 +00:00
commit f9cc65cfda
65988 changed files with 26357421 additions and 0 deletions

View File

@ -0,0 +1,10 @@
GCC_VERSION := $(shell $(CONFIG_SHELL) $(PWD)/scripts/gcc-version.sh $(CROSS_COMPILE)gcc)
ccflags-y += -Idrivers/media/platform/msm/camera_v1
ccflags-y += -Idrivers/media/platform/msm/camera_v1/io
obj-$(CONFIG_MSM_CAMERA_FLASH) += msm_flash.o
obj-$(CONFIG_MSM_CAMERA_FLASH_SC628A) += sc628a.o
obj-$(CONFIG_MSM_CAMERA_FLASH_TPS61310) += tps61310.o
obj-$(CONFIG_MSM_CAMERA_FLASH_PMIC_FLASH) += pmic8058_flash.o
obj-$(CONFIG_MSM_CAMERA_FLASH_SGM3141) += sgm3141.o
obj-$(CONFIG_MSM_CAMERA_FLASH_PMIC8058_PWM) += pmic8058_pwm.o
obj-$(CONFIG_MSM_CAMERA_LED_TRIGGER_FLASH) += led_trigger_flash.o

View File

@ -0,0 +1,162 @@
/* Copyright (c) 2012, 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
* only version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#include <linux/module.h>
#include <linux/export.h>
#include "msm_flash.h"
#define FLASH_NAME "camera-led-flash"
static struct msm_flash_ctrl_t fctrl;
static int msm_camera_led_trigger_flash(struct msm_flash_ctrl_t *fctrl,
uint8_t led_state)
{
int rc = 0;
CDBG("%s:%d called led_state %d\n", __func__, __LINE__, led_state);
if (!fctrl->led_trigger[0]) {
pr_err("%s:%d failed\n", __func__, __LINE__);
return -EINVAL;
}
switch (led_state) {
case MSM_CAMERA_LED_OFF:
led_trigger_event(fctrl->led_trigger[0], 0);
break;
case MSM_CAMERA_LED_LOW:
led_trigger_event(fctrl->led_trigger[0],
fctrl->max_current[0] / 2);
break;
case MSM_CAMERA_LED_HIGH:
led_trigger_event(fctrl->led_trigger[0], fctrl->max_current[0]);
break;
case MSM_CAMERA_LED_INIT:
case MSM_CAMERA_LED_RELEASE:
led_trigger_event(fctrl->led_trigger[0], 0);
break;
default:
rc = -EFAULT;
break;
}
CDBG("flash_set_led_state: return %d\n", rc);
return rc;
}
static const struct of_device_id msm_camera_flash_dt_match[] = {
{.compatible = "qcom,camera-led-flash"},
{}
};
MODULE_DEVICE_TABLE(of, msm_camera_flash_dt_match);
static struct platform_driver msm_led_trigger_flash_driver = {
.driver = {
.name = FLASH_NAME,
.owner = THIS_MODULE,
.of_match_table = msm_camera_flash_dt_match,
},
};
static int32_t msm_led_trigger_flash_probe(struct platform_device *pdev)
{
int32_t rc = 0, i = 0;
struct device_node *of_node = pdev->dev.of_node;
struct device_node *flash_src_node = NULL;
uint32_t count = 0;
CDBG("%s called\n", __func__);
if (!of_node) {
pr_err("%s of_node NULL\n", __func__);
return -EINVAL;
}
fctrl.pdev = pdev;
rc = of_property_read_u32(of_node, "cell-index", &pdev->id);
if (rc < 0) {
pr_err("%s:%d failed\n", __func__, __LINE__);
return -EINVAL;
}
CDBG("%s:%d pdev id %d\n", __func__, __LINE__, pdev->id);
if (of_get_property(of_node, "qcom,flash-source", &count)) {
count /= sizeof(uint32_t);
CDBG("%s count %d\n", __func__, count);
if (count > MAX_LED_TRIGGERS) {
pr_err("%s:%d failed\n", __func__, __LINE__);
return -EINVAL;
}
for (i = 0; i < count; i++) {
flash_src_node = of_parse_phandle(of_node,
"qcom,flash-source", i);
if (!flash_src_node) {
pr_err("%s:%d flash_src_node NULL\n", __func__,
__LINE__);
continue;
}
rc = of_property_read_string(flash_src_node,
"linux,default-trigger",
&fctrl.led_trigger_name[i]);
if (rc < 0) {
pr_err("%s:%d failed\n", __func__, __LINE__);
of_node_put(flash_src_node);
continue;
}
CDBG("%s default trigger %s\n", __func__,
fctrl.led_trigger_name[i]);
rc = of_property_read_u32(flash_src_node,
"qcom,max-current", &fctrl.max_current[i]);
if (rc < 0) {
pr_err("%s:%d failed rc %d\n", __func__,
__LINE__, rc);
of_node_put(flash_src_node);
continue;
}
of_node_put(flash_src_node);
CDBG("%s max_current[%d] %d\n", __func__, i,
fctrl.max_current[i]);
led_trigger_register_simple(fctrl.led_trigger_name[i],
&fctrl.led_trigger[i]);
}
}
rc = msm_flash_platform_probe(pdev, &fctrl);
return rc;
}
static int __init msm_flash_add_driver(void)
{
CDBG("%s called\n", __func__);
return platform_driver_probe(&msm_led_trigger_flash_driver,
msm_led_trigger_flash_probe);
}
static struct msm_flash_fn_t msm_led_trigger_flash_func_tbl = {
.flash_led_config = msm_camera_led_trigger_flash,
};
static struct msm_flash_ctrl_t fctrl = {
.func_tbl = &msm_led_trigger_flash_func_tbl,
};
module_init(msm_flash_add_driver);
MODULE_DESCRIPTION("LED TRIGGER FLASH");
MODULE_LICENSE("GPL v2");

View File

@ -0,0 +1,514 @@
/* Copyright (c) 2009-2012, 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
* only version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/hrtimer.h>
#include <linux/export.h>
#include <linux/of.h>
#include <mach/pmic.h>
#include <mach/camera.h>
#include <mach/gpio.h>
#include "msm_flash.h"
#include "msm.h"
static struct timer_list timer_flash;
enum msm_cam_flash_stat {
MSM_CAM_FLASH_OFF,
MSM_CAM_FLASH_ON,
};
static int config_flash_gpio_table(enum msm_cam_flash_stat stat,
struct msm_camera_sensor_strobe_flash_data *sfdata)
{
int rc = 0, i = 0;
int msm_cam_flash_gpio_tbl[][2] = {
{sfdata->flash_trigger, 1},
{sfdata->flash_charge, 1},
{sfdata->flash_charge_done, 0}
};
if (stat == MSM_CAM_FLASH_ON) {
for (i = 0; i < ARRAY_SIZE(msm_cam_flash_gpio_tbl); i++) {
rc = gpio_request(msm_cam_flash_gpio_tbl[i][0],
"CAM_FLASH_GPIO");
if (unlikely(rc < 0)) {
pr_err("%s not able to get gpio\n", __func__);
for (i--; i >= 0; i--)
gpio_free(msm_cam_flash_gpio_tbl[i][0]);
break;
}
if (msm_cam_flash_gpio_tbl[i][1])
gpio_direction_output(
msm_cam_flash_gpio_tbl[i][0], 0);
else
gpio_direction_input(
msm_cam_flash_gpio_tbl[i][0]);
}
} else {
for (i = 0; i < ARRAY_SIZE(msm_cam_flash_gpio_tbl); i++) {
gpio_direction_input(msm_cam_flash_gpio_tbl[i][0]);
gpio_free(msm_cam_flash_gpio_tbl[i][0]);
}
}
return rc;
}
static int msm_strobe_flash_xenon_charge(int32_t flash_charge,
int32_t charge_enable, uint32_t flash_recharge_duration)
{
gpio_set_value_cansleep(flash_charge, charge_enable);
if (charge_enable) {
timer_flash.expires = jiffies +
msecs_to_jiffies(flash_recharge_duration);
/* add timer for the recharge */
if (!timer_pending(&timer_flash))
add_timer(&timer_flash);
} else
del_timer_sync(&timer_flash);
return 0;
}
static void strobe_flash_xenon_recharge_handler(unsigned long data)
{
unsigned long flags;
struct msm_camera_sensor_strobe_flash_data *sfdata =
(struct msm_camera_sensor_strobe_flash_data *)data;
spin_lock_irqsave(&sfdata->timer_lock, flags);
msm_strobe_flash_xenon_charge(sfdata->flash_charge, 1,
sfdata->flash_recharge_duration);
spin_unlock_irqrestore(&sfdata->timer_lock, flags);
return;
}
static irqreturn_t strobe_flash_charge_ready_irq(int irq_num, void *data)
{
struct msm_camera_sensor_strobe_flash_data *sfdata =
(struct msm_camera_sensor_strobe_flash_data *)data;
/* put the charge signal to low */
gpio_set_value_cansleep(sfdata->flash_charge, 0);
return IRQ_HANDLED;
}
static int msm_strobe_flash_xenon_init(
struct msm_camera_sensor_strobe_flash_data *sfdata)
{
unsigned long flags;
int rc = 0;
spin_lock_irqsave(&sfdata->spin_lock, flags);
if (!sfdata->state) {
rc = config_flash_gpio_table(MSM_CAM_FLASH_ON, sfdata);
if (rc < 0) {
pr_err("%s: gpio_request failed\n", __func__);
goto go_out;
}
rc = request_irq(sfdata->irq, strobe_flash_charge_ready_irq,
IRQF_TRIGGER_RISING, "charge_ready", sfdata);
if (rc < 0) {
pr_err("%s: request_irq failed %d\n", __func__, rc);
goto go_out;
}
spin_lock_init(&sfdata->timer_lock);
/* setup timer */
init_timer(&timer_flash);
timer_flash.function = strobe_flash_xenon_recharge_handler;
timer_flash.data = (unsigned long)sfdata;
}
sfdata->state++;
go_out:
spin_unlock_irqrestore(&sfdata->spin_lock, flags);
return rc;
}
static int msm_strobe_flash_xenon_release
(struct msm_camera_sensor_strobe_flash_data *sfdata, int32_t final_release)
{
unsigned long flags;
spin_lock_irqsave(&sfdata->spin_lock, flags);
if (sfdata->state > 0) {
if (final_release)
sfdata->state = 0;
else
sfdata->state--;
if (!sfdata->state) {
free_irq(sfdata->irq, sfdata);
config_flash_gpio_table(MSM_CAM_FLASH_OFF, sfdata);
if (timer_pending(&timer_flash))
del_timer_sync(&timer_flash);
}
}
spin_unlock_irqrestore(&sfdata->spin_lock, flags);
return 0;
}
static int msm_strobe_flash_ctrl(
struct msm_camera_sensor_strobe_flash_data *sfdata,
struct strobe_flash_ctrl_data *strobe_ctrl)
{
int rc = 0;
switch (strobe_ctrl->type) {
case STROBE_FLASH_CTRL_INIT:
if (!sfdata)
return -ENODEV;
rc = msm_strobe_flash_xenon_init(sfdata);
break;
case STROBE_FLASH_CTRL_CHARGE:
rc = msm_strobe_flash_xenon_charge(sfdata->flash_charge,
strobe_ctrl->charge_en,
sfdata->flash_recharge_duration);
break;
case STROBE_FLASH_CTRL_RELEASE:
if (sfdata)
rc = msm_strobe_flash_xenon_release(sfdata, 0);
break;
default:
pr_err("Invalid Strobe Flash State\n");
rc = -EINVAL;
}
return rc;
}
int msm_flash_led_init(struct msm_flash_ctrl_t *fctrl)
{
int rc = 0;
struct msm_camera_sensor_flash_external *external = NULL;
CDBG("%s:%d called\n", __func__, __LINE__);
if (!fctrl) {
pr_err("%s:%d fctrl NULL\n", __func__, __LINE__);
return -EINVAL;
}
external = &fctrl->flash_data->flash_src->_fsrc.ext_driver_src;
if (external->expander_info && !fctrl->expander_client) {
struct i2c_adapter *adapter =
i2c_get_adapter(external->expander_info->bus_id);
if (adapter)
fctrl->expander_client = i2c_new_device(adapter,
external->expander_info->board_info);
if (!fctrl->expander_client || !adapter) {
pr_err("fctrl->expander_client is not available\n");
rc = -ENOTSUPP;
return rc;
}
i2c_put_adapter(adapter);
}
rc = msm_camera_init_gpio_table(
fctrl->flash_data->flash_src->init_gpio_tbl,
fctrl->flash_data->flash_src->init_gpio_tbl_size, 1);
if (rc < 0)
pr_err("%s:%d failed\n", __func__, __LINE__);
return rc;
}
int msm_flash_led_release(struct msm_flash_ctrl_t *fctrl)
{
struct msm_camera_sensor_flash_external *external = NULL;
CDBG("%s:%d called\n", __func__, __LINE__);
if (!fctrl) {
pr_err("%s:%d fctrl NULL\n", __func__, __LINE__);
return -EINVAL;
}
external = &fctrl->flash_data->flash_src->_fsrc.ext_driver_src;
msm_camera_set_gpio_table(
fctrl->flash_data->flash_src->set_gpio_tbl,
fctrl->flash_data->flash_src->set_gpio_tbl_size, 0);
msm_camera_init_gpio_table(
fctrl->flash_data->flash_src->init_gpio_tbl,
fctrl->flash_data->flash_src->init_gpio_tbl_size, 0);
if (external->expander_info && fctrl->expander_client) {
i2c_unregister_device(fctrl->expander_client);
fctrl->expander_client = NULL;
}
return 0;
}
int msm_flash_led_off(struct msm_flash_ctrl_t *fctrl)
{
int rc = 0;
struct msm_camera_sensor_flash_external *external = NULL;
CDBG("%s:%d called\n", __func__, __LINE__);
if (!fctrl) {
pr_err("%s:%d fctrl NULL\n", __func__, __LINE__);
return -EINVAL;
}
external = &fctrl->flash_data->flash_src->_fsrc.ext_driver_src;
if (fctrl->flash_i2c_client && fctrl->reg_setting) {
rc = msm_camera_i2c_write_tbl(
fctrl->flash_i2c_client,
fctrl->reg_setting->off_setting,
fctrl->reg_setting->off_setting_size,
fctrl->reg_setting->default_data_type);
if (rc < 0)
pr_err("%s:%d failed\n", __func__, __LINE__);
}
msm_camera_set_gpio_table(
fctrl->flash_data->flash_src->set_gpio_tbl,
fctrl->flash_data->flash_src->set_gpio_tbl_size, 0);
return rc;
}
int msm_flash_led_low(struct msm_flash_ctrl_t *fctrl)
{
int rc = 0;
struct msm_camera_sensor_flash_external *external = NULL;
CDBG("%s:%d called\n", __func__, __LINE__);
if (!fctrl) {
pr_err("%s:%d fctrl NULL\n", __func__, __LINE__);
return -EINVAL;
}
external = &fctrl->flash_data->flash_src->_fsrc.ext_driver_src;
msm_camera_set_gpio_table(
fctrl->flash_data->flash_src->set_gpio_tbl,
fctrl->flash_data->flash_src->set_gpio_tbl_size, 1);
if (fctrl->flash_i2c_client && fctrl->reg_setting) {
rc = msm_camera_i2c_write_tbl(
fctrl->flash_i2c_client,
fctrl->reg_setting->low_setting,
fctrl->reg_setting->low_setting_size,
fctrl->reg_setting->default_data_type);
if (rc < 0)
pr_err("%s:%d failed\n", __func__, __LINE__);
}
return rc;
}
int msm_flash_led_high(struct msm_flash_ctrl_t *fctrl)
{
int rc = 0;
struct msm_camera_sensor_flash_external *external = NULL;
CDBG("%s:%d called\n", __func__, __LINE__);
if (!fctrl) {
pr_err("%s:%d fctrl NULL\n", __func__, __LINE__);
return -EINVAL;
}
external = &fctrl->flash_data->flash_src->_fsrc.ext_driver_src;
msm_camera_set_gpio_table(
fctrl->flash_data->flash_src->set_gpio_tbl,
fctrl->flash_data->flash_src->set_gpio_tbl_size, 1);
if (fctrl->flash_i2c_client && fctrl->reg_setting) {
rc = msm_camera_i2c_write_tbl(
fctrl->flash_i2c_client,
fctrl->reg_setting->high_setting,
fctrl->reg_setting->high_setting_size,
fctrl->reg_setting->default_data_type);
if (rc < 0)
pr_err("%s:%d failed\n", __func__, __LINE__);
}
return rc;
}
int msm_camera_flash_led_config(struct msm_flash_ctrl_t *fctrl,
uint8_t led_state)
{
int rc = 0;
CDBG("%s:%d called\n", __func__, __LINE__);
if (!fctrl->func_tbl) {
pr_err("%s flash func tbl NULL\n", __func__);
return 0;
}
switch (led_state) {
case MSM_CAMERA_LED_INIT:
if (fctrl->func_tbl->flash_led_init)
rc = fctrl->func_tbl->flash_led_init(fctrl);
break;
case MSM_CAMERA_LED_RELEASE:
if (fctrl->func_tbl->flash_led_release)
rc = fctrl->func_tbl->
flash_led_release(fctrl);
break;
case MSM_CAMERA_LED_OFF:
if (fctrl->func_tbl->flash_led_off)
rc = fctrl->func_tbl->flash_led_off(fctrl);
break;
case MSM_CAMERA_LED_LOW:
if (fctrl->func_tbl->flash_led_low)
rc = fctrl->func_tbl->flash_led_low(fctrl);
break;
case MSM_CAMERA_LED_HIGH:
if (fctrl->func_tbl->flash_led_high)
rc = fctrl->func_tbl->flash_led_high(fctrl);
break;
default:
rc = -EFAULT;
break;
}
return rc;
}
static struct msm_flash_ctrl_t *get_fctrl(struct v4l2_subdev *sd)
{
return container_of(sd, struct msm_flash_ctrl_t, v4l2_sdev);
}
static long msm_flash_config(struct msm_flash_ctrl_t *fctrl, void __user *argp)
{
long rc = 0;
struct flash_ctrl_data flash_info;
if (!argp) {
pr_err("%s argp NULL\n", __func__);
return -EINVAL;
}
if (copy_from_user(&flash_info, argp, sizeof(flash_info))) {
pr_err("%s:%d failed\n", __func__, __LINE__);
return -EFAULT;
}
switch (flash_info.flashtype) {
case LED_FLASH:
if (fctrl->func_tbl->flash_led_config)
rc = fctrl->func_tbl->flash_led_config(fctrl,
flash_info.ctrl_data.led_state);
if (rc < 0)
pr_err("%s:%d failed\n", __func__, __LINE__);
break;
case STROBE_FLASH:
rc = msm_strobe_flash_ctrl(fctrl->strobe_flash_data,
&(flash_info.ctrl_data.strobe_ctrl));
break;
default:
pr_err("Invalid Flash MODE\n");
rc = -EINVAL;
}
return rc;
}
static long msm_flash_subdev_ioctl(struct v4l2_subdev *sd,
unsigned int cmd, void *arg)
{
struct msm_flash_ctrl_t *fctrl = NULL;
void __user *argp = (void __user *)arg;
if (!sd) {
pr_err("%s:%d sd NULL\n", __func__, __LINE__);
return -EINVAL;
}
fctrl = get_fctrl(sd);
if (!fctrl) {
pr_err("%s:%d fctrl NULL\n", __func__, __LINE__);
return -EINVAL;
}
switch (cmd) {
case VIDIOC_MSM_FLASH_LED_DATA_CFG:
fctrl->flash_data = (struct msm_camera_sensor_flash_data *)argp;
return 0;
case VIDIOC_MSM_FLASH_STROBE_DATA_CFG:
fctrl->strobe_flash_data =
(struct msm_camera_sensor_strobe_flash_data *)argp;
return 0;
case VIDIOC_MSM_FLASH_CFG:
return msm_flash_config(fctrl, argp);
default:
return -ENOIOCTLCMD;
}
}
static struct v4l2_subdev_core_ops msm_flash_subdev_core_ops = {
.ioctl = msm_flash_subdev_ioctl,
};
static struct v4l2_subdev_ops msm_flash_subdev_ops = {
.core = &msm_flash_subdev_core_ops,
};
int msm_flash_i2c_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
int rc = 0;
struct msm_flash_ctrl_t *fctrl = NULL;
CDBG("%s:%d called\n", __func__, __LINE__);
if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
pr_err("i2c_check_functionality failed\n");
goto probe_failure;
}
fctrl = (struct msm_flash_ctrl_t *)(id->driver_data);
if (fctrl->flash_i2c_client)
fctrl->flash_i2c_client->client = client;
/* Assign name for sub device */
snprintf(fctrl->v4l2_sdev.name, sizeof(fctrl->v4l2_sdev.name),
"%s", id->name);
/* Initialize sub device */
v4l2_i2c_subdev_init(&fctrl->v4l2_sdev, client, &msm_flash_subdev_ops);
CDBG("%s:%d probe success\n", __func__, __LINE__);
return 0;
probe_failure:
CDBG("%s:%d probe failed\n", __func__, __LINE__);
return rc;
}
int msm_flash_platform_probe(struct platform_device *pdev, void *data)
{
struct msm_flash_ctrl_t *fctrl = (struct msm_flash_ctrl_t *)data;
struct msm_cam_subdev_info sd_info;
CDBG("%s:%d called\n", __func__, __LINE__);
if (!fctrl) {
pr_err("%s fctrl NULL\n", __func__);
return -EINVAL;
}
/* Initialize sub device */
v4l2_subdev_init(&fctrl->v4l2_sdev, &msm_flash_subdev_ops);
/* Assign name for sub device */
snprintf(fctrl->v4l2_sdev.name, sizeof(fctrl->v4l2_sdev.name),
"%s", "msm_flash");
fctrl->pdev = pdev;
sd_info.sdev_type = FLASH_DEV;
sd_info.sd_index = pdev->id;
msm_cam_register_subdev_node(&fctrl->v4l2_sdev, &sd_info);
CDBG("%s:%d probe success\n", __func__, __LINE__);
return 0;
}
int msm_flash_create_v4l2_subdev(void *data, uint8_t sd_index)
{
struct msm_flash_ctrl_t *fctrl = (struct msm_flash_ctrl_t *)data;
struct msm_cam_subdev_info sd_info;
CDBG("%s:%d called\n", __func__, __LINE__);
/* Initialize sub device */
v4l2_subdev_init(&fctrl->v4l2_sdev, &msm_flash_subdev_ops);
/* Assign name for sub device */
snprintf(fctrl->v4l2_sdev.name, sizeof(fctrl->v4l2_sdev.name),
"%s", "msm_flash");
sd_info.sdev_type = FLASH_DEV;
sd_info.sd_index = sd_index;
msm_cam_register_subdev_node(&fctrl->v4l2_sdev, &sd_info);
CDBG("%s:%d probe success\n", __func__, __LINE__);
return 0;
}

View File

@ -0,0 +1,91 @@
/* Copyright (c) 2009-2012, 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
* only version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#ifndef MSM_FLASH_H
#define MSM_FLASH_H
#include <linux/i2c.h>
#include <linux/leds.h>
#include <media/v4l2-subdev.h>
#include <mach/board.h>
#include "msm_camera_i2c.h"
#define MAX_LED_TRIGGERS 2
struct msm_flash_ctrl_t;
struct msm_flash_reg_t {
enum msm_camera_i2c_data_type default_data_type;
struct msm_camera_i2c_reg_conf *init_setting;
uint8_t init_setting_size;
struct msm_camera_i2c_reg_conf *off_setting;
uint8_t off_setting_size;
struct msm_camera_i2c_reg_conf *low_setting;
uint8_t low_setting_size;
struct msm_camera_i2c_reg_conf *high_setting;
uint8_t high_setting_size;
};
struct msm_flash_fn_t {
int (*flash_led_config)(struct msm_flash_ctrl_t *, uint8_t);
int (*flash_led_init)(struct msm_flash_ctrl_t *);
int (*flash_led_release)(struct msm_flash_ctrl_t *);
int (*flash_led_off)(struct msm_flash_ctrl_t *);
int (*flash_led_low)(struct msm_flash_ctrl_t *);
int (*flash_led_high)(struct msm_flash_ctrl_t *);
};
struct msm_flash_ctrl_t {
struct msm_camera_i2c_client *flash_i2c_client;
struct platform_device *pdev;
struct i2c_client *expander_client;
struct v4l2_subdev v4l2_sdev;
struct msm_camera_sensor_flash_data *flash_data;
struct msm_camera_sensor_strobe_flash_data *strobe_flash_data;
struct msm_flash_fn_t *func_tbl;
struct msm_flash_reg_t *reg_setting;
const char *led_trigger_name[MAX_LED_TRIGGERS];
struct led_trigger *led_trigger[MAX_LED_TRIGGERS];
uint32_t max_current[MAX_LED_TRIGGERS];
void *data;
};
int msm_flash_i2c_probe(struct i2c_client *client,
const struct i2c_device_id *id);
int msm_flash_platform_probe(struct platform_device *pdev, void *data);
int msm_flash_create_v4l2_subdev(void *data, uint8_t sd_index);
int msm_camera_flash_led_config(struct msm_flash_ctrl_t *fctrl,
uint8_t led_state);
int msm_flash_led_init(struct msm_flash_ctrl_t *fctrl);
int msm_flash_led_release(struct msm_flash_ctrl_t *fctrl);
int msm_flash_led_off(struct msm_flash_ctrl_t *fctrl);
int msm_flash_led_low(struct msm_flash_ctrl_t *fctrl);
int msm_flash_led_high(struct msm_flash_ctrl_t *fctrl);
#define VIDIOC_MSM_FLASH_LED_DATA_CFG \
_IOWR('V', BASE_VIDIOC_PRIVATE + 20, void __user *)
#define VIDIOC_MSM_FLASH_STROBE_DATA_CFG \
_IOWR('V', BASE_VIDIOC_PRIVATE + 21, void __user *)
#define VIDIOC_MSM_FLASH_CFG \
_IOWR('V', BASE_VIDIOC_PRIVATE + 22, void __user *)
#endif

View File

@ -0,0 +1,79 @@
/* Copyright (c) 2009-2012, 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
* only version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#include <linux/module.h>
#include <linux/export.h>
#include "msm_flash.h"
#define SD_INDEX 0
static struct msm_flash_ctrl_t fctrl;
static int msm_camera_pmic_flash(struct msm_flash_ctrl_t *fctrl,
uint8_t led_state)
{
int rc = 0;
struct msm_camera_sensor_flash_pmic *pmic =
&fctrl->flash_data->flash_src->_fsrc.pmic_src;
switch (led_state) {
case MSM_CAMERA_LED_OFF:
rc = pmic->pmic_set_current(pmic->led_src_1, 0);
if (pmic->num_of_src > 1)
rc = pmic->pmic_set_current(pmic->led_src_2, 0);
break;
case MSM_CAMERA_LED_LOW:
rc = pmic->pmic_set_current(pmic->led_src_1,
pmic->low_current);
if (pmic->num_of_src > 1)
rc = pmic->pmic_set_current(pmic->led_src_2, 0);
break;
case MSM_CAMERA_LED_HIGH:
rc = pmic->pmic_set_current(pmic->led_src_1,
pmic->high_current);
if (pmic->num_of_src > 1)
rc = pmic->pmic_set_current(pmic->led_src_2,
pmic->high_current);
break;
case MSM_CAMERA_LED_INIT:
case MSM_CAMERA_LED_RELEASE:
break;
default:
rc = -EFAULT;
break;
}
CDBG("flash_set_led_state: return %d\n", rc);
return rc;
}
static int __init msm_flash_i2c_add_driver(void)
{
CDBG("%s called\n", __func__);
return msm_flash_create_v4l2_subdev(&fctrl, SD_INDEX);
}
static struct msm_flash_fn_t pmic_flash_func_tbl = {
.flash_led_config = msm_camera_pmic_flash,
};
static struct msm_flash_ctrl_t fctrl = {
.func_tbl = &pmic_flash_func_tbl,
};
module_init(msm_flash_i2c_add_driver);
MODULE_DESCRIPTION("PMIC FLASH");
MODULE_LICENSE("GPL v2");

View File

@ -0,0 +1,89 @@
/* Copyright (c) 2009-2012, 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
* only version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#include <linux/module.h>
#include <linux/export.h>
#include <linux/pwm.h>
#include "msm_flash.h"
#define SD_INDEX 0
static struct msm_flash_ctrl_t fctrl;
static int msm_camera_flash_pwm(struct msm_flash_ctrl_t *fctrl,
uint8_t led_state)
{
int rc = 0;
struct msm_camera_sensor_flash_pwm *pwm =
&fctrl->flash_data->flash_src->_fsrc.pwm_src;
int PWM_PERIOD = USEC_PER_SEC / pwm->freq;
struct pwm_device *flash_pwm = (struct pwm_device *)fctrl->data;
if (!flash_pwm) {
flash_pwm = pwm_request(pwm->channel, "camera-flash");
if (flash_pwm == NULL || IS_ERR(flash_pwm)) {
pr_err("%s: FAIL pwm_request(): flash_pwm=%p\n",
__func__, flash_pwm);
flash_pwm = NULL;
return -ENXIO;
}
}
switch (led_state) {
case MSM_CAMERA_LED_LOW:
rc = pwm_config(flash_pwm,
(PWM_PERIOD/pwm->max_load)*pwm->low_load,
PWM_PERIOD);
if (rc >= 0)
rc = pwm_enable(flash_pwm);
break;
case MSM_CAMERA_LED_HIGH:
rc = pwm_config(flash_pwm,
(PWM_PERIOD/pwm->max_load)*pwm->high_load,
PWM_PERIOD);
if (rc >= 0)
rc = pwm_enable(flash_pwm);
break;
case MSM_CAMERA_LED_OFF:
pwm_disable(flash_pwm);
break;
case MSM_CAMERA_LED_INIT:
case MSM_CAMERA_LED_RELEASE:
break;
default:
rc = -EFAULT;
break;
}
return rc;
}
static int __init msm_flash_i2c_add_driver(void)
{
CDBG("%s called\n", __func__);
return msm_flash_create_v4l2_subdev(&fctrl, SD_INDEX);
}
static struct msm_flash_fn_t pmic8058_pwm_func_tbl = {
.flash_led_config = msm_camera_flash_pwm,
};
static struct msm_flash_ctrl_t fctrl = {
.func_tbl = &pmic8058_pwm_func_tbl,
};
module_init(msm_flash_i2c_add_driver);
MODULE_DESCRIPTION("PMIC FLASH");
MODULE_LICENSE("GPL v2");

View File

@ -0,0 +1,91 @@
/* Copyright (c) 2009-2012, 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
* only version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#include <linux/module.h>
#include <linux/export.h>
#include "msm_flash.h"
#define FLASH_NAME "sc628a"
static struct msm_flash_ctrl_t fctrl;
static struct i2c_driver sc628a_i2c_driver;
static struct msm_camera_i2c_reg_conf sc628a_off_setting[] = {
{0x02, 0x00},
};
static struct msm_camera_i2c_reg_conf sc628a_low_setting[] = {
{0x02, 0x06},
};
static struct msm_camera_i2c_reg_conf sc628a_high_setting[] = {
{0x02, 0x49},
};
static int __exit msm_flash_i2c_remove(struct i2c_client *client)
{
i2c_del_driver(&sc628a_i2c_driver);
return 0;
}
static const struct i2c_device_id sc628a_i2c_id[] = {
{FLASH_NAME, (kernel_ulong_t)&fctrl},
{ }
};
static struct i2c_driver sc628a_i2c_driver = {
.id_table = sc628a_i2c_id,
.probe = msm_flash_i2c_probe,
.remove = __exit_p(msm_flash_i2c_remove),
.driver = {
.name = FLASH_NAME,
},
};
static int __init msm_flash_i2c_add_driver(void)
{
CDBG("%s called\n", __func__);
return i2c_add_driver(&sc628a_i2c_driver);
}
static struct msm_camera_i2c_client sc628a_i2c_client = {
.addr_type = MSM_CAMERA_I2C_BYTE_ADDR,
};
static struct msm_flash_reg_t sc628a_regs = {
.default_data_type = MSM_CAMERA_I2C_BYTE_DATA,
.off_setting = sc628a_off_setting,
.off_setting_size = ARRAY_SIZE(sc628a_off_setting),
.low_setting = sc628a_low_setting,
.low_setting_size = ARRAY_SIZE(sc628a_low_setting),
.high_setting = sc628a_high_setting,
.high_setting_size = ARRAY_SIZE(sc628a_high_setting),
};
static struct msm_flash_fn_t sc628a_func_tbl = {
.flash_led_config = msm_camera_flash_led_config,
.flash_led_init = msm_flash_led_init,
.flash_led_release = msm_flash_led_release,
.flash_led_off = msm_flash_led_off,
.flash_led_low = msm_flash_led_low,
.flash_led_high = msm_flash_led_high,
};
static struct msm_flash_ctrl_t fctrl = {
.flash_i2c_client = &sc628a_i2c_client,
.reg_setting = &sc628a_regs,
.func_tbl = &sc628a_func_tbl,
};
subsys_initcall(msm_flash_i2c_add_driver);
MODULE_DESCRIPTION("SC628A FLASH");
MODULE_LICENSE("GPL v2");

View File

@ -0,0 +1,98 @@
/* Copyright (c) 2009-2012, 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
* only version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#include <linux/module.h>
#include <linux/export.h>
#include <mach/gpio.h>
#include "msm_flash.h"
#define SD_INDEX 0
static struct msm_flash_ctrl_t fctrl;
static int msm_camera_flash_led(struct msm_flash_ctrl_t *fctrl,
uint8_t led_state)
{
int rc = 0;
struct msm_camera_sensor_flash_external *external =
&fctrl->flash_data->flash_src->_fsrc.ext_driver_src;
CDBG("msm_camera_flash_led: %d\n", led_state);
switch (led_state) {
case MSM_CAMERA_LED_INIT:
rc = gpio_request(external->led_en, "sgm3141");
CDBG("MSM_CAMERA_LED_INIT: gpio_req: %d %d\n",
external->led_en, rc);
if (!rc)
gpio_direction_output(external->led_en, 0);
else
return 0;
rc = gpio_request(external->led_flash_en, "sgm3141");
CDBG("MSM_CAMERA_LED_INIT: gpio_req: %d %d\n",
external->led_flash_en, rc);
if (!rc)
gpio_direction_output(external->led_flash_en, 0);
break;
case MSM_CAMERA_LED_RELEASE:
CDBG("MSM_CAMERA_LED_RELEASE\n");
gpio_set_value_cansleep(external->led_en, 0);
gpio_free(external->led_en);
gpio_set_value_cansleep(external->led_flash_en, 0);
gpio_free(external->led_flash_en);
break;
case MSM_CAMERA_LED_OFF:
CDBG("MSM_CAMERA_LED_OFF\n");
gpio_set_value_cansleep(external->led_en, 0);
gpio_set_value_cansleep(external->led_flash_en, 0);
break;
case MSM_CAMERA_LED_LOW:
CDBG("MSM_CAMERA_LED_LOW\n");
gpio_set_value_cansleep(external->led_en, 1);
gpio_set_value_cansleep(external->led_flash_en, 1);
break;
case MSM_CAMERA_LED_HIGH:
CDBG("MSM_CAMERA_LED_HIGH\n");
gpio_set_value_cansleep(external->led_en, 1);
gpio_set_value_cansleep(external->led_flash_en, 1);
break;
default:
rc = -EFAULT;
break;
}
return rc;
}
static int __init msm_flash_i2c_add_driver(void)
{
CDBG("%s called\n", __func__);
return msm_flash_create_v4l2_subdev(&fctrl, SD_INDEX);
}
static struct msm_flash_fn_t sgm3141_func_tbl = {
.flash_led_config = msm_camera_flash_led,
};
static struct msm_flash_ctrl_t fctrl = {
.func_tbl = &sgm3141_func_tbl,
};
module_init(msm_flash_i2c_add_driver);
MODULE_DESCRIPTION("SGM3141 FLASH");
MODULE_LICENSE("GPL v2");

View File

@ -0,0 +1,97 @@
/* Copyright (c) 2009-2012, 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
* only version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#include <linux/module.h>
#include <linux/export.h>
#include "msm_flash.h"
#define FLASH_NAME "tps61310"
static struct msm_flash_ctrl_t fctrl;
static struct i2c_driver tps61310_i2c_driver;
static struct msm_camera_i2c_reg_conf tps61310_init_setting[] = {
{0x01, 0x00},
};
static struct msm_camera_i2c_reg_conf tps61310_off_setting[] = {
{0x01, 0x00},
};
static struct msm_camera_i2c_reg_conf tps61310_low_setting[] = {
{0x01, 0x86},
};
static struct msm_camera_i2c_reg_conf tps61310_high_setting[] = {
{0x01, 0x8B},
};
static int __exit msm_flash_i2c_remove(struct i2c_client *client)
{
i2c_del_driver(&tps61310_i2c_driver);
return 0;
}
static const struct i2c_device_id tps61310_i2c_id[] = {
{FLASH_NAME, (kernel_ulong_t)&fctrl},
{ }
};
static struct i2c_driver tps61310_i2c_driver = {
.id_table = tps61310_i2c_id,
.probe = msm_flash_i2c_probe,
.remove = __exit_p(msm_flash_i2c_remove),
.driver = {
.name = FLASH_NAME,
},
};
static int __init msm_flash_i2c_add_driver(void)
{
CDBG("%s called\n", __func__);
return i2c_add_driver(&tps61310_i2c_driver);
}
static struct msm_camera_i2c_client tps61310_i2c_client = {
.addr_type = MSM_CAMERA_I2C_BYTE_ADDR,
};
static struct msm_flash_reg_t tps61310_regs = {
.default_data_type = MSM_CAMERA_I2C_BYTE_DATA,
.init_setting = tps61310_init_setting,
.init_setting_size = ARRAY_SIZE(tps61310_init_setting),
.off_setting = tps61310_off_setting,
.off_setting_size = ARRAY_SIZE(tps61310_off_setting),
.low_setting = tps61310_low_setting,
.low_setting_size = ARRAY_SIZE(tps61310_low_setting),
.high_setting = tps61310_high_setting,
.high_setting_size = ARRAY_SIZE(tps61310_high_setting),
};
static struct msm_flash_fn_t tps61310_func_tbl = {
.flash_led_config = msm_camera_flash_led_config,
.flash_led_init = msm_flash_led_init,
.flash_led_release = msm_flash_led_release,
.flash_led_off = msm_flash_led_off,
.flash_led_low = msm_flash_led_low,
.flash_led_high = msm_flash_led_high,
};
static struct msm_flash_ctrl_t fctrl = {
.flash_i2c_client = &tps61310_i2c_client,
.reg_setting = &tps61310_regs,
.func_tbl = &tps61310_func_tbl,
};
subsys_initcall(msm_flash_i2c_add_driver);
MODULE_DESCRIPTION("TPS61310 FLASH");
MODULE_LICENSE("GPL v2");