Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * include/media/i2c/adp1653.h
0004  *
0005  * Copyright (C) 2008--2011 Nokia Corporation
0006  *
0007  * Contact: Sakari Ailus <sakari.ailus@iki.fi>
0008  *
0009  * Contributors:
0010  *  Sakari Ailus <sakari.ailus@iki.fi>
0011  *  Tuukka Toivonen <tuukkat76@gmail.com>
0012  */
0013 
0014 #ifndef ADP1653_H
0015 #define ADP1653_H
0016 
0017 #include <linux/i2c.h>
0018 #include <linux/mutex.h>
0019 #include <linux/videodev2.h>
0020 #include <media/v4l2-ctrls.h>
0021 #include <media/v4l2-subdev.h>
0022 
0023 #define ADP1653_NAME                "adp1653"
0024 #define ADP1653_I2C_ADDR            (0x60 >> 1)
0025 
0026 /* Register definitions */
0027 #define ADP1653_REG_OUT_SEL         0x00
0028 #define ADP1653_REG_OUT_SEL_HPLED_TORCH_MIN 0x01
0029 #define ADP1653_REG_OUT_SEL_HPLED_TORCH_MAX 0x0b
0030 #define ADP1653_REG_OUT_SEL_HPLED_FLASH_MIN 0x0c
0031 #define ADP1653_REG_OUT_SEL_HPLED_FLASH_MAX 0x1f
0032 #define ADP1653_REG_OUT_SEL_HPLED_SHIFT     3
0033 #define ADP1653_REG_OUT_SEL_ILED_MAX        0x07
0034 #define ADP1653_REG_OUT_SEL_ILED_SHIFT      0
0035 
0036 #define ADP1653_REG_CONFIG          0x01
0037 #define ADP1653_REG_CONFIG_TMR_CFG      (1 << 4)
0038 #define ADP1653_REG_CONFIG_TMR_SET_MAX      0x0f
0039 #define ADP1653_REG_CONFIG_TMR_SET_SHIFT    0
0040 
0041 #define ADP1653_REG_SW_STROBE           0x02
0042 #define ADP1653_REG_SW_STROBE_SW_STROBE     (1 << 0)
0043 
0044 #define ADP1653_REG_FAULT           0x03
0045 #define ADP1653_REG_FAULT_FLT_SCP       (1 << 3)
0046 #define ADP1653_REG_FAULT_FLT_OT        (1 << 2)
0047 #define ADP1653_REG_FAULT_FLT_TMR       (1 << 1)
0048 #define ADP1653_REG_FAULT_FLT_OV        (1 << 0)
0049 
0050 #define ADP1653_INDICATOR_INTENSITY_MIN     0
0051 #define ADP1653_INDICATOR_INTENSITY_STEP    2500
0052 #define ADP1653_INDICATOR_INTENSITY_MAX     \
0053     (ADP1653_REG_OUT_SEL_ILED_MAX * ADP1653_INDICATOR_INTENSITY_STEP)
0054 #define ADP1653_INDICATOR_INTENSITY_uA_TO_REG(a) \
0055     ((a) / ADP1653_INDICATOR_INTENSITY_STEP)
0056 #define ADP1653_INDICATOR_INTENSITY_REG_TO_uA(a) \
0057     ((a) * ADP1653_INDICATOR_INTENSITY_STEP)
0058 
0059 #define ADP1653_FLASH_INTENSITY_BASE        35
0060 #define ADP1653_FLASH_INTENSITY_STEP        15
0061 #define ADP1653_FLASH_INTENSITY_MIN                 \
0062     (ADP1653_FLASH_INTENSITY_BASE                   \
0063      + ADP1653_REG_OUT_SEL_HPLED_FLASH_MIN * ADP1653_FLASH_INTENSITY_STEP)
0064 #define ADP1653_FLASH_INTENSITY_MAX         \
0065     (ADP1653_FLASH_INTENSITY_MIN +          \
0066      (ADP1653_REG_OUT_SEL_HPLED_FLASH_MAX -     \
0067       ADP1653_REG_OUT_SEL_HPLED_FLASH_MIN + 1) *    \
0068      ADP1653_FLASH_INTENSITY_STEP)
0069 
0070 #define ADP1653_FLASH_INTENSITY_mA_TO_REG(a)                \
0071     ((a) < ADP1653_FLASH_INTENSITY_BASE ? 0 :           \
0072      (((a) - ADP1653_FLASH_INTENSITY_BASE) / ADP1653_FLASH_INTENSITY_STEP))
0073 #define ADP1653_FLASH_INTENSITY_REG_TO_mA(a)        \
0074     ((a) * ADP1653_FLASH_INTENSITY_STEP + ADP1653_FLASH_INTENSITY_BASE)
0075 
0076 #define ADP1653_TORCH_INTENSITY_MIN                 \
0077     (ADP1653_FLASH_INTENSITY_BASE                   \
0078      + ADP1653_REG_OUT_SEL_HPLED_TORCH_MIN * ADP1653_FLASH_INTENSITY_STEP)
0079 #define ADP1653_TORCH_INTENSITY_MAX         \
0080     (ADP1653_TORCH_INTENSITY_MIN +          \
0081      (ADP1653_REG_OUT_SEL_HPLED_TORCH_MAX -     \
0082       ADP1653_REG_OUT_SEL_HPLED_TORCH_MIN + 1) *    \
0083      ADP1653_FLASH_INTENSITY_STEP)
0084 
0085 struct adp1653_platform_data {
0086     int (*power)(struct v4l2_subdev *sd, int on);
0087 
0088     u32 max_flash_timeout;      /* flash light timeout in us */
0089     u32 max_flash_intensity;    /* led intensity, flash mode, mA */
0090     u32 max_torch_intensity;    /* led intensity, torch mode, mA */
0091     u32 max_indicator_intensity;    /* indicator led intensity, uA */
0092 
0093     struct gpio_desc *enable_gpio;  /* for device-tree based boot */
0094 };
0095 
0096 #define to_adp1653_flash(sd)    container_of(sd, struct adp1653_flash, subdev)
0097 
0098 struct adp1653_flash {
0099     struct v4l2_subdev subdev;
0100     struct adp1653_platform_data *platform_data;
0101 
0102     struct v4l2_ctrl_handler ctrls;
0103     struct v4l2_ctrl *led_mode;
0104     struct v4l2_ctrl *flash_timeout;
0105     struct v4l2_ctrl *flash_intensity;
0106     struct v4l2_ctrl *torch_intensity;
0107     struct v4l2_ctrl *indicator_intensity;
0108 
0109     struct mutex power_lock;
0110     int power_count;
0111     int fault;
0112 };
0113 
0114 #endif /* ADP1653_H */