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 2342bd6f59SJacek Anaszewski /* 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 3642bd6f59SJacek Anaszewski struct v4l2_flash_ops { 3742bd6f59SJacek Anaszewski /* setup strobing the flash by hardware pin state assertion */ 3842bd6f59SJacek Anaszewski int (*external_strobe_set)(struct v4l2_flash *v4l2_flash, 3942bd6f59SJacek Anaszewski bool enable); 4042bd6f59SJacek Anaszewski /* convert intensity to brightness in a device specific manner */ 4142bd6f59SJacek Anaszewski enum led_brightness (*intensity_to_led_brightness) 4242bd6f59SJacek Anaszewski (struct v4l2_flash *v4l2_flash, s32 intensity); 4342bd6f59SJacek Anaszewski /* convert brightness to intensity in a device specific manner */ 4442bd6f59SJacek Anaszewski s32 (*led_brightness_to_intensity) 4542bd6f59SJacek Anaszewski (struct v4l2_flash *v4l2_flash, enum led_brightness); 4642bd6f59SJacek Anaszewski }; 4742bd6f59SJacek Anaszewski 4842bd6f59SJacek Anaszewski /** 4942bd6f59SJacek Anaszewski * struct v4l2_flash_config - V4L2 Flash sub-device initialization data 5042bd6f59SJacek Anaszewski * @dev_name: the name of the media entity, 5142bd6f59SJacek Anaszewski unique in the system 5242bd6f59SJacek Anaszewski * @torch_intensity: constraints for the LED in torch mode 5342bd6f59SJacek Anaszewski * @indicator_intensity: constraints for the indicator LED 5442bd6f59SJacek Anaszewski * @flash_faults: bitmask of flash faults that the LED flash class 5542bd6f59SJacek Anaszewski device can report; corresponding LED_FAULT* bit 5642bd6f59SJacek Anaszewski definitions are available in the header file 5742bd6f59SJacek Anaszewski <linux/led-class-flash.h> 5842bd6f59SJacek Anaszewski * @has_external_strobe: external strobe capability 5942bd6f59SJacek Anaszewski */ 6042bd6f59SJacek Anaszewski struct v4l2_flash_config { 6142bd6f59SJacek Anaszewski char dev_name[32]; 6242bd6f59SJacek Anaszewski struct led_flash_setting torch_intensity; 6342bd6f59SJacek Anaszewski struct led_flash_setting indicator_intensity; 6442bd6f59SJacek Anaszewski u32 flash_faults; 6542bd6f59SJacek Anaszewski unsigned int has_external_strobe:1; 6642bd6f59SJacek Anaszewski }; 6742bd6f59SJacek Anaszewski 6842bd6f59SJacek Anaszewski /** 6942bd6f59SJacek Anaszewski * struct v4l2_flash - Flash sub-device context 7042bd6f59SJacek Anaszewski * @fled_cdev: LED flash class device controlled by this sub-device 7142bd6f59SJacek Anaszewski * @iled_cdev: LED class device representing indicator LED associated 7242bd6f59SJacek Anaszewski * with the LED flash class device 7342bd6f59SJacek Anaszewski * @ops: V4L2 specific flash ops 7442bd6f59SJacek Anaszewski * @sd: V4L2 sub-device 7542bd6f59SJacek Anaszewski * @hdl: flash controls handler 7642bd6f59SJacek Anaszewski * @ctrls: array of pointers to controls, whose values define 7742bd6f59SJacek Anaszewski * the sub-device state 7842bd6f59SJacek Anaszewski */ 7942bd6f59SJacek Anaszewski struct v4l2_flash { 8042bd6f59SJacek Anaszewski struct led_classdev_flash *fled_cdev; 8142bd6f59SJacek Anaszewski struct led_classdev_flash *iled_cdev; 8242bd6f59SJacek Anaszewski const struct v4l2_flash_ops *ops; 8342bd6f59SJacek Anaszewski 8442bd6f59SJacek Anaszewski struct v4l2_subdev sd; 8542bd6f59SJacek Anaszewski struct v4l2_ctrl_handler hdl; 8642bd6f59SJacek Anaszewski struct v4l2_ctrl **ctrls; 8742bd6f59SJacek Anaszewski }; 8842bd6f59SJacek Anaszewski 8942bd6f59SJacek Anaszewski static inline struct v4l2_flash *v4l2_subdev_to_v4l2_flash( 9042bd6f59SJacek Anaszewski struct v4l2_subdev *sd) 9142bd6f59SJacek Anaszewski { 9242bd6f59SJacek Anaszewski return container_of(sd, struct v4l2_flash, sd); 9342bd6f59SJacek Anaszewski } 9442bd6f59SJacek Anaszewski 9542bd6f59SJacek Anaszewski static inline struct v4l2_flash *v4l2_ctrl_to_v4l2_flash(struct v4l2_ctrl *c) 9642bd6f59SJacek Anaszewski { 9742bd6f59SJacek Anaszewski return container_of(c->handler, struct v4l2_flash, hdl); 9842bd6f59SJacek Anaszewski } 9942bd6f59SJacek Anaszewski 10042bd6f59SJacek Anaszewski #if IS_ENABLED(CONFIG_V4L2_FLASH_LED_CLASS) 10142bd6f59SJacek Anaszewski /** 10242bd6f59SJacek Anaszewski * v4l2_flash_init - initialize V4L2 flash led sub-device 10342bd6f59SJacek Anaszewski * @dev: flash device, e.g. an I2C device 10442bd6f59SJacek Anaszewski * @of_node: of_node of the LED, may be NULL if the same as device's 10542bd6f59SJacek Anaszewski * @fled_cdev: LED flash class device to wrap 10642bd6f59SJacek Anaszewski * @iled_cdev: LED flash class device representing indicator LED associated 10742bd6f59SJacek Anaszewski * with fled_cdev, may be NULL 10842bd6f59SJacek Anaszewski * @flash_ops: V4L2 Flash device ops 10942bd6f59SJacek Anaszewski * @config: initialization data for V4L2 Flash sub-device 11042bd6f59SJacek Anaszewski * 11142bd6f59SJacek Anaszewski * Create V4L2 Flash sub-device wrapping given LED subsystem device. 11242bd6f59SJacek Anaszewski * 11342bd6f59SJacek Anaszewski * Returns: A valid pointer, or, when an error occurs, the return 11442bd6f59SJacek Anaszewski * value is encoded using ERR_PTR(). Use IS_ERR() to check and 11542bd6f59SJacek Anaszewski * PTR_ERR() to obtain the numeric return value. 11642bd6f59SJacek Anaszewski */ 11742bd6f59SJacek Anaszewski struct v4l2_flash *v4l2_flash_init( 11842bd6f59SJacek Anaszewski struct device *dev, struct device_node *of_node, 11942bd6f59SJacek Anaszewski struct led_classdev_flash *fled_cdev, 12042bd6f59SJacek Anaszewski struct led_classdev_flash *iled_cdev, 12142bd6f59SJacek Anaszewski const struct v4l2_flash_ops *ops, 12242bd6f59SJacek Anaszewski struct v4l2_flash_config *config); 12342bd6f59SJacek Anaszewski 12442bd6f59SJacek Anaszewski /** 12542bd6f59SJacek Anaszewski * v4l2_flash_release - release V4L2 Flash sub-device 12642bd6f59SJacek Anaszewski * @flash: the V4L2 Flash sub-device to release 12742bd6f59SJacek Anaszewski * 12842bd6f59SJacek Anaszewski * Release V4L2 Flash sub-device. 12942bd6f59SJacek Anaszewski */ 13042bd6f59SJacek Anaszewski void v4l2_flash_release(struct v4l2_flash *v4l2_flash); 13142bd6f59SJacek Anaszewski 13242bd6f59SJacek Anaszewski #else 13342bd6f59SJacek Anaszewski static inline struct v4l2_flash *v4l2_flash_init( 13442bd6f59SJacek Anaszewski struct device *dev, struct device_node *of_node, 13542bd6f59SJacek Anaszewski struct led_classdev_flash *fled_cdev, 13642bd6f59SJacek Anaszewski struct led_classdev_flash *iled_cdev, 13742bd6f59SJacek Anaszewski const struct v4l2_flash_ops *ops, 13842bd6f59SJacek Anaszewski struct v4l2_flash_config *config) 13942bd6f59SJacek Anaszewski { 14042bd6f59SJacek Anaszewski return NULL; 14142bd6f59SJacek Anaszewski } 14242bd6f59SJacek Anaszewski 14342bd6f59SJacek Anaszewski static inline void v4l2_flash_release(struct v4l2_flash *v4l2_flash) 14442bd6f59SJacek Anaszewski { 14542bd6f59SJacek Anaszewski } 14642bd6f59SJacek Anaszewski #endif /* CONFIG_V4L2_FLASH_LED_CLASS */ 14742bd6f59SJacek Anaszewski 14842bd6f59SJacek Anaszewski #endif /* _V4L2_FLASH_H */ 149