^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * include/media/i2c/adp1653.h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2008--2011 Nokia Corporation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Contact: Sakari Ailus <sakari.ailus@iki.fi>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * Contributors:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * Sakari Ailus <sakari.ailus@iki.fi>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * Tuukka Toivonen <tuukkat76@gmail.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #ifndef ADP1653_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #define ADP1653_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/i2c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/mutex.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/videodev2.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <media/v4l2-ctrls.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <media/v4l2-subdev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define ADP1653_NAME "adp1653"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define ADP1653_I2C_ADDR (0x60 >> 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) /* Register definitions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define ADP1653_REG_OUT_SEL 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define ADP1653_REG_OUT_SEL_HPLED_TORCH_MIN 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define ADP1653_REG_OUT_SEL_HPLED_TORCH_MAX 0x0b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define ADP1653_REG_OUT_SEL_HPLED_FLASH_MIN 0x0c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define ADP1653_REG_OUT_SEL_HPLED_FLASH_MAX 0x1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define ADP1653_REG_OUT_SEL_HPLED_SHIFT 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define ADP1653_REG_OUT_SEL_ILED_MAX 0x07
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define ADP1653_REG_OUT_SEL_ILED_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define ADP1653_REG_CONFIG 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define ADP1653_REG_CONFIG_TMR_CFG (1 << 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define ADP1653_REG_CONFIG_TMR_SET_MAX 0x0f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define ADP1653_REG_CONFIG_TMR_SET_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define ADP1653_REG_SW_STROBE 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define ADP1653_REG_SW_STROBE_SW_STROBE (1 << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define ADP1653_REG_FAULT 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define ADP1653_REG_FAULT_FLT_SCP (1 << 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define ADP1653_REG_FAULT_FLT_OT (1 << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define ADP1653_REG_FAULT_FLT_TMR (1 << 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define ADP1653_REG_FAULT_FLT_OV (1 << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define ADP1653_INDICATOR_INTENSITY_MIN 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define ADP1653_INDICATOR_INTENSITY_STEP 2500
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define ADP1653_INDICATOR_INTENSITY_MAX \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) (ADP1653_REG_OUT_SEL_ILED_MAX * ADP1653_INDICATOR_INTENSITY_STEP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define ADP1653_INDICATOR_INTENSITY_uA_TO_REG(a) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) ((a) / ADP1653_INDICATOR_INTENSITY_STEP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define ADP1653_INDICATOR_INTENSITY_REG_TO_uA(a) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) ((a) * ADP1653_INDICATOR_INTENSITY_STEP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define ADP1653_FLASH_INTENSITY_BASE 35
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define ADP1653_FLASH_INTENSITY_STEP 15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define ADP1653_FLASH_INTENSITY_MIN \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) (ADP1653_FLASH_INTENSITY_BASE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) + ADP1653_REG_OUT_SEL_HPLED_FLASH_MIN * ADP1653_FLASH_INTENSITY_STEP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define ADP1653_FLASH_INTENSITY_MAX \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) (ADP1653_FLASH_INTENSITY_MIN + \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) (ADP1653_REG_OUT_SEL_HPLED_FLASH_MAX - \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) ADP1653_REG_OUT_SEL_HPLED_FLASH_MIN + 1) * \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) ADP1653_FLASH_INTENSITY_STEP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #define ADP1653_FLASH_INTENSITY_mA_TO_REG(a) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) ((a) < ADP1653_FLASH_INTENSITY_BASE ? 0 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) (((a) - ADP1653_FLASH_INTENSITY_BASE) / ADP1653_FLASH_INTENSITY_STEP))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #define ADP1653_FLASH_INTENSITY_REG_TO_mA(a) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) ((a) * ADP1653_FLASH_INTENSITY_STEP + ADP1653_FLASH_INTENSITY_BASE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #define ADP1653_TORCH_INTENSITY_MIN \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) (ADP1653_FLASH_INTENSITY_BASE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) + ADP1653_REG_OUT_SEL_HPLED_TORCH_MIN * ADP1653_FLASH_INTENSITY_STEP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #define ADP1653_TORCH_INTENSITY_MAX \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) (ADP1653_TORCH_INTENSITY_MIN + \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) (ADP1653_REG_OUT_SEL_HPLED_TORCH_MAX - \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) ADP1653_REG_OUT_SEL_HPLED_TORCH_MIN + 1) * \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) ADP1653_FLASH_INTENSITY_STEP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) struct adp1653_platform_data {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) int (*power)(struct v4l2_subdev *sd, int on);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) u32 max_flash_timeout; /* flash light timeout in us */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) u32 max_flash_intensity; /* led intensity, flash mode, mA */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) u32 max_torch_intensity; /* led intensity, torch mode, mA */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) u32 max_indicator_intensity; /* indicator led intensity, uA */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) struct gpio_desc *enable_gpio; /* for device-tree based boot */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #define to_adp1653_flash(sd) container_of(sd, struct adp1653_flash, subdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) struct adp1653_flash {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) struct v4l2_subdev subdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) struct adp1653_platform_data *platform_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) struct v4l2_ctrl_handler ctrls;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) struct v4l2_ctrl *led_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) struct v4l2_ctrl *flash_timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) struct v4l2_ctrl *flash_intensity;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) struct v4l2_ctrl *torch_intensity;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) struct v4l2_ctrl *indicator_intensity;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) struct mutex power_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) int power_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) int fault;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #endif /* ADP1653_H */