Blame view

include/media/v4l2-flash-led-class.h 4.7 KB
42bd6f59a   Jacek Anaszewski   media: Add regist...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  /*
   * V4L2 flash LED sub-device registration helpers.
   *
   *	Copyright (C) 2015 Samsung Electronics Co., Ltd
   *	Author: Jacek Anaszewski <j.anaszewski@samsung.com>
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   */
  
  #ifndef _V4L2_FLASH_H
  #define _V4L2_FLASH_H
  
  #include <media/v4l2-ctrls.h>
  #include <media/v4l2-subdev.h>
  
  struct led_classdev_flash;
  struct led_classdev;
  struct v4l2_flash;
  enum led_brightness;
0d56015d8   Mauro Carvalho Chehab   [media] v4l2-flas...
22
  /**
42bd6f59a   Jacek Anaszewski   media: Add regist...
23
24
25
26
27
28
29
30
31
32
33
   * struct v4l2_flash_ctrl_data - flash control initialization data, filled
   *				basing on the features declared by the LED flash
   *				class driver in the v4l2_flash_config
   * @config:	initialization data for a control
   * @cid:	contains v4l2 flash control id if the config
   *		field was initialized, 0 otherwise
   */
  struct v4l2_flash_ctrl_data {
  	struct v4l2_ctrl_config config;
  	u32 cid;
  };
0d56015d8   Mauro Carvalho Chehab   [media] v4l2-flas...
34
35
36
37
38
39
40
41
42
43
  /**
   * struct v4l2_flash_ops - V4L2 flash operations
   *
   * @external_strobe_set: Setup strobing the flash by hardware pin state
   *	assertion.
   * @intensity_to_led_brightness: Convert intensity to brightness in a device
   *	specific manner
   * @led_brightness_to_intensity: convert brightness to intensity in a device
   *	specific manner.
   */
42bd6f59a   Jacek Anaszewski   media: Add regist...
44
  struct v4l2_flash_ops {
42bd6f59a   Jacek Anaszewski   media: Add regist...
45
46
  	int (*external_strobe_set)(struct v4l2_flash *v4l2_flash,
  					bool enable);
42bd6f59a   Jacek Anaszewski   media: Add regist...
47
48
  	enum led_brightness (*intensity_to_led_brightness)
  		(struct v4l2_flash *v4l2_flash, s32 intensity);
42bd6f59a   Jacek Anaszewski   media: Add regist...
49
50
51
52
53
54
55
  	s32 (*led_brightness_to_intensity)
  		(struct v4l2_flash *v4l2_flash, enum led_brightness);
  };
  
  /**
   * struct v4l2_flash_config - V4L2 Flash sub-device initialization data
   * @dev_name:			the name of the media entity,
62ba6b22f   Mauro Carvalho Chehab   [media] Docbook: ...
56
   *				unique in the system
42bd6f59a   Jacek Anaszewski   media: Add regist...
57
58
59
   * @torch_intensity:		constraints for the LED in torch mode
   * @indicator_intensity:	constraints for the indicator LED
   * @flash_faults:		bitmask of flash faults that the LED flash class
62ba6b22f   Mauro Carvalho Chehab   [media] Docbook: ...
60
61
62
   *				device can report; corresponding LED_FAULT* bit
   *				definitions are available in the header file
   *				<linux/led-class-flash.h>
42bd6f59a   Jacek Anaszewski   media: Add regist...
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
   * @has_external_strobe:	external strobe capability
   */
  struct v4l2_flash_config {
  	char dev_name[32];
  	struct led_flash_setting torch_intensity;
  	struct led_flash_setting indicator_intensity;
  	u32 flash_faults;
  	unsigned int has_external_strobe:1;
  };
  
  /**
   * struct v4l2_flash - Flash sub-device context
   * @fled_cdev:		LED flash class device controlled by this sub-device
   * @iled_cdev:		LED class device representing indicator LED associated
   *			with the LED flash class device
   * @ops:		V4L2 specific flash ops
   * @sd:			V4L2 sub-device
   * @hdl:		flash controls handler
   * @ctrls:		array of pointers to controls, whose values define
   *			the sub-device state
   */
  struct v4l2_flash {
  	struct led_classdev_flash *fled_cdev;
  	struct led_classdev_flash *iled_cdev;
  	const struct v4l2_flash_ops *ops;
  
  	struct v4l2_subdev sd;
  	struct v4l2_ctrl_handler hdl;
  	struct v4l2_ctrl **ctrls;
  };
  
  static inline struct v4l2_flash *v4l2_subdev_to_v4l2_flash(
  							struct v4l2_subdev *sd)
  {
  	return container_of(sd, struct v4l2_flash, sd);
  }
  
  static inline struct v4l2_flash *v4l2_ctrl_to_v4l2_flash(struct v4l2_ctrl *c)
  {
  	return container_of(c->handler, struct v4l2_flash, hdl);
  }
  
  #if IS_ENABLED(CONFIG_V4L2_FLASH_LED_CLASS)
  /**
   * v4l2_flash_init - initialize V4L2 flash led sub-device
   * @dev:	flash device, e.g. an I2C device
   * @of_node:	of_node of the LED, may be NULL if the same as device's
   * @fled_cdev:	LED flash class device to wrap
   * @iled_cdev:	LED flash class device representing indicator LED associated
   *		with fled_cdev, may be NULL
62ba6b22f   Mauro Carvalho Chehab   [media] Docbook: ...
113
   * @ops:	V4L2 Flash device ops
42bd6f59a   Jacek Anaszewski   media: Add regist...
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
   * @config:	initialization data for V4L2 Flash sub-device
   *
   * Create V4L2 Flash sub-device wrapping given LED subsystem device.
   *
   * Returns: A valid pointer, or, when an error occurs, the return
   * value is encoded using ERR_PTR(). Use IS_ERR() to check and
   * PTR_ERR() to obtain the numeric return value.
   */
  struct v4l2_flash *v4l2_flash_init(
  	struct device *dev, struct device_node *of_node,
  	struct led_classdev_flash *fled_cdev,
  	struct led_classdev_flash *iled_cdev,
  	const struct v4l2_flash_ops *ops,
  	struct v4l2_flash_config *config);
  
  /**
   * v4l2_flash_release - release V4L2 Flash sub-device
62ba6b22f   Mauro Carvalho Chehab   [media] Docbook: ...
131
   * @v4l2_flash: the V4L2 Flash sub-device to release
42bd6f59a   Jacek Anaszewski   media: Add regist...
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
   *
   * Release V4L2 Flash sub-device.
   */
  void v4l2_flash_release(struct v4l2_flash *v4l2_flash);
  
  #else
  static inline struct v4l2_flash *v4l2_flash_init(
  	struct device *dev, struct device_node *of_node,
  	struct led_classdev_flash *fled_cdev,
  	struct led_classdev_flash *iled_cdev,
  	const struct v4l2_flash_ops *ops,
  	struct v4l2_flash_config *config)
  {
  	return NULL;
  }
  
  static inline void v4l2_flash_release(struct v4l2_flash *v4l2_flash)
  {
  }
  #endif /* CONFIG_V4L2_FLASH_LED_CLASS */
  
  #endif /* _V4L2_FLASH_H */