142bd6f59SJacek Anaszewski /* 242bd6f59SJacek Anaszewski * V4L2 flash LED sub-device registration helpers. 342bd6f59SJacek Anaszewski * 442bd6f59SJacek Anaszewski * Copyright (C) 2015 Samsung Electronics Co., Ltd 542bd6f59SJacek Anaszewski * Author: Jacek Anaszewski <j.anaszewski@samsung.com> 642bd6f59SJacek Anaszewski * 742bd6f59SJacek Anaszewski * This program is free software; you can redistribute it and/or modify 842bd6f59SJacek Anaszewski * it under the terms of the GNU General Public License version 2 as 942bd6f59SJacek Anaszewski * published by the Free Software Foundation. 1042bd6f59SJacek Anaszewski */ 1142bd6f59SJacek Anaszewski 1242bd6f59SJacek Anaszewski #ifndef _V4L2_FLASH_H 1342bd6f59SJacek Anaszewski #define _V4L2_FLASH_H 1442bd6f59SJacek Anaszewski 1542bd6f59SJacek Anaszewski #include <media/v4l2-ctrls.h> 1642bd6f59SJacek Anaszewski #include <media/v4l2-subdev.h> 1742bd6f59SJacek Anaszewski 1842bd6f59SJacek Anaszewski struct led_classdev_flash; 1942bd6f59SJacek Anaszewski struct led_classdev; 2042bd6f59SJacek Anaszewski struct v4l2_flash; 2142bd6f59SJacek Anaszewski enum led_brightness; 2242bd6f59SJacek Anaszewski 230d56015dSMauro Carvalho Chehab /** 2442bd6f59SJacek Anaszewski * struct v4l2_flash_ctrl_data - flash control initialization data, filled 2542bd6f59SJacek Anaszewski * basing on the features declared by the LED flash 2642bd6f59SJacek Anaszewski * class driver in the v4l2_flash_config 2742bd6f59SJacek Anaszewski * @config: initialization data for a control 2842bd6f59SJacek Anaszewski * @cid: contains v4l2 flash control id if the config 2942bd6f59SJacek Anaszewski * field was initialized, 0 otherwise 3042bd6f59SJacek Anaszewski */ 3142bd6f59SJacek Anaszewski struct v4l2_flash_ctrl_data { 3242bd6f59SJacek Anaszewski struct v4l2_ctrl_config config; 3342bd6f59SJacek Anaszewski u32 cid; 3442bd6f59SJacek Anaszewski }; 3542bd6f59SJacek Anaszewski 360d56015dSMauro Carvalho Chehab /** 370d56015dSMauro Carvalho Chehab * struct v4l2_flash_ops - V4L2 flash operations 380d56015dSMauro Carvalho Chehab * 390d56015dSMauro Carvalho Chehab * @external_strobe_set: Setup strobing the flash by hardware pin state 400d56015dSMauro Carvalho Chehab * assertion. 410d56015dSMauro Carvalho Chehab * @intensity_to_led_brightness: Convert intensity to brightness in a device 420d56015dSMauro Carvalho Chehab * specific manner 430d56015dSMauro Carvalho Chehab * @led_brightness_to_intensity: convert brightness to intensity in a device 440d56015dSMauro Carvalho Chehab * specific manner. 450d56015dSMauro Carvalho Chehab */ 4642bd6f59SJacek Anaszewski struct v4l2_flash_ops { 4742bd6f59SJacek Anaszewski int (*external_strobe_set)(struct v4l2_flash *v4l2_flash, 4842bd6f59SJacek Anaszewski bool enable); 4942bd6f59SJacek Anaszewski enum led_brightness (*intensity_to_led_brightness) 5042bd6f59SJacek Anaszewski (struct v4l2_flash *v4l2_flash, s32 intensity); 5142bd6f59SJacek Anaszewski s32 (*led_brightness_to_intensity) 5242bd6f59SJacek Anaszewski (struct v4l2_flash *v4l2_flash, enum led_brightness); 5342bd6f59SJacek Anaszewski }; 5442bd6f59SJacek Anaszewski 5542bd6f59SJacek Anaszewski /** 5642bd6f59SJacek Anaszewski * struct v4l2_flash_config - V4L2 Flash sub-device initialization data 5742bd6f59SJacek Anaszewski * @dev_name: the name of the media entity, 5862ba6b22SMauro Carvalho Chehab * unique in the system 5942bd6f59SJacek Anaszewski * @torch_intensity: constraints for the LED in torch mode 6042bd6f59SJacek Anaszewski * @indicator_intensity: constraints for the indicator LED 6142bd6f59SJacek Anaszewski * @flash_faults: bitmask of flash faults that the LED flash class 6262ba6b22SMauro Carvalho Chehab * device can report; corresponding LED_FAULT* bit 6362ba6b22SMauro Carvalho Chehab * definitions are available in the header file 6462ba6b22SMauro Carvalho Chehab * <linux/led-class-flash.h> 6542bd6f59SJacek Anaszewski * @has_external_strobe: external strobe capability 6642bd6f59SJacek Anaszewski */ 6742bd6f59SJacek Anaszewski struct v4l2_flash_config { 6842bd6f59SJacek Anaszewski char dev_name[32]; 6942bd6f59SJacek Anaszewski struct led_flash_setting torch_intensity; 7042bd6f59SJacek Anaszewski struct led_flash_setting indicator_intensity; 7142bd6f59SJacek Anaszewski u32 flash_faults; 7242bd6f59SJacek Anaszewski unsigned int has_external_strobe:1; 7342bd6f59SJacek Anaszewski }; 7442bd6f59SJacek Anaszewski 7542bd6f59SJacek Anaszewski /** 7642bd6f59SJacek Anaszewski * struct v4l2_flash - Flash sub-device context 7742bd6f59SJacek Anaszewski * @fled_cdev: LED flash class device controlled by this sub-device 7842bd6f59SJacek Anaszewski * @iled_cdev: LED class device representing indicator LED associated 7942bd6f59SJacek Anaszewski * with the LED flash class device 8042bd6f59SJacek Anaszewski * @ops: V4L2 specific flash ops 8142bd6f59SJacek Anaszewski * @sd: V4L2 sub-device 8242bd6f59SJacek Anaszewski * @hdl: flash controls handler 8342bd6f59SJacek Anaszewski * @ctrls: array of pointers to controls, whose values define 8442bd6f59SJacek Anaszewski * the sub-device state 8542bd6f59SJacek Anaszewski */ 8642bd6f59SJacek Anaszewski struct v4l2_flash { 8742bd6f59SJacek Anaszewski struct led_classdev_flash *fled_cdev; 8842bd6f59SJacek Anaszewski struct led_classdev_flash *iled_cdev; 8942bd6f59SJacek Anaszewski const struct v4l2_flash_ops *ops; 9042bd6f59SJacek Anaszewski 9142bd6f59SJacek Anaszewski struct v4l2_subdev sd; 9242bd6f59SJacek Anaszewski struct v4l2_ctrl_handler hdl; 9342bd6f59SJacek Anaszewski struct v4l2_ctrl **ctrls; 9442bd6f59SJacek Anaszewski }; 9542bd6f59SJacek Anaszewski 9642bd6f59SJacek Anaszewski static inline struct v4l2_flash *v4l2_subdev_to_v4l2_flash( 9742bd6f59SJacek Anaszewski struct v4l2_subdev *sd) 9842bd6f59SJacek Anaszewski { 9942bd6f59SJacek Anaszewski return container_of(sd, struct v4l2_flash, sd); 10042bd6f59SJacek Anaszewski } 10142bd6f59SJacek Anaszewski 10242bd6f59SJacek Anaszewski static inline struct v4l2_flash *v4l2_ctrl_to_v4l2_flash(struct v4l2_ctrl *c) 10342bd6f59SJacek Anaszewski { 10442bd6f59SJacek Anaszewski return container_of(c->handler, struct v4l2_flash, hdl); 10542bd6f59SJacek Anaszewski } 10642bd6f59SJacek Anaszewski 10742bd6f59SJacek Anaszewski #if IS_ENABLED(CONFIG_V4L2_FLASH_LED_CLASS) 10842bd6f59SJacek Anaszewski /** 10942bd6f59SJacek Anaszewski * v4l2_flash_init - initialize V4L2 flash led sub-device 11042bd6f59SJacek Anaszewski * @dev: flash device, e.g. an I2C device 11142bd6f59SJacek Anaszewski * @of_node: of_node of the LED, may be NULL if the same as device's 11242bd6f59SJacek Anaszewski * @fled_cdev: LED flash class device to wrap 11342bd6f59SJacek Anaszewski * @iled_cdev: LED flash class device representing indicator LED associated 11442bd6f59SJacek Anaszewski * with fled_cdev, may be NULL 11562ba6b22SMauro Carvalho Chehab * @ops: V4L2 Flash device ops 11642bd6f59SJacek Anaszewski * @config: initialization data for V4L2 Flash sub-device 11742bd6f59SJacek Anaszewski * 11842bd6f59SJacek Anaszewski * Create V4L2 Flash sub-device wrapping given LED subsystem device. 11942bd6f59SJacek Anaszewski * 12042bd6f59SJacek Anaszewski * Returns: A valid pointer, or, when an error occurs, the return 12142bd6f59SJacek Anaszewski * value is encoded using ERR_PTR(). Use IS_ERR() to check and 12242bd6f59SJacek Anaszewski * PTR_ERR() to obtain the numeric return value. 12342bd6f59SJacek Anaszewski */ 12442bd6f59SJacek Anaszewski struct v4l2_flash *v4l2_flash_init( 12542bd6f59SJacek Anaszewski struct device *dev, struct device_node *of_node, 12642bd6f59SJacek Anaszewski struct led_classdev_flash *fled_cdev, 12742bd6f59SJacek Anaszewski struct led_classdev_flash *iled_cdev, 12842bd6f59SJacek Anaszewski const struct v4l2_flash_ops *ops, 12942bd6f59SJacek Anaszewski struct v4l2_flash_config *config); 13042bd6f59SJacek Anaszewski 13142bd6f59SJacek Anaszewski /** 13242bd6f59SJacek Anaszewski * v4l2_flash_release - release V4L2 Flash sub-device 13362ba6b22SMauro Carvalho Chehab * @v4l2_flash: the V4L2 Flash sub-device to release 13442bd6f59SJacek Anaszewski * 13542bd6f59SJacek Anaszewski * Release V4L2 Flash sub-device. 13642bd6f59SJacek Anaszewski */ 13742bd6f59SJacek Anaszewski void v4l2_flash_release(struct v4l2_flash *v4l2_flash); 13842bd6f59SJacek Anaszewski 13942bd6f59SJacek Anaszewski #else 14042bd6f59SJacek Anaszewski static inline struct v4l2_flash *v4l2_flash_init( 14142bd6f59SJacek Anaszewski struct device *dev, struct device_node *of_node, 14242bd6f59SJacek Anaszewski struct led_classdev_flash *fled_cdev, 14342bd6f59SJacek Anaszewski struct led_classdev_flash *iled_cdev, 14442bd6f59SJacek Anaszewski const struct v4l2_flash_ops *ops, 14542bd6f59SJacek Anaszewski struct v4l2_flash_config *config) 14642bd6f59SJacek Anaszewski { 14742bd6f59SJacek Anaszewski return NULL; 14842bd6f59SJacek Anaszewski } 14942bd6f59SJacek Anaszewski 15042bd6f59SJacek Anaszewski static inline void v4l2_flash_release(struct v4l2_flash *v4l2_flash) 15142bd6f59SJacek Anaszewski { 15242bd6f59SJacek Anaszewski } 15342bd6f59SJacek Anaszewski #endif /* CONFIG_V4L2_FLASH_LED_CLASS */ 15442bd6f59SJacek Anaszewski 15542bd6f59SJacek Anaszewski #endif /* _V4L2_FLASH_H */ 156