Commit 6b8a3170 authored by Frank Schaefer's avatar Frank Schaefer Committed by Mauro Carvalho Chehab

[media] em28xx: prepare for supporting multiple LEDs

Introduce a LED role and store all LEDs in an array.
Also provide a helper function to retrieve a specific LED.
Signed-off-by: default avatarFrank Schäfer <fschaefer.oss@googlemail.com>
Signed-off-by: default avatarMauro Carvalho Chehab <m.chehab@samsung.com>
parent 7763481a
...@@ -600,6 +600,22 @@ int em28xx_colorlevels_set_default(struct em28xx *dev) ...@@ -600,6 +600,22 @@ int em28xx_colorlevels_set_default(struct em28xx *dev)
return em28xx_write_reg(dev, EM28XX_R1A_BOFFSET, 0x00); return em28xx_write_reg(dev, EM28XX_R1A_BOFFSET, 0x00);
} }
const struct em28xx_led *em28xx_find_led(struct em28xx *dev,
enum em28xx_led_role role)
{
if (dev->board.leds) {
u8 k = 0;
while (dev->board.leds[k].role >= 0 &&
dev->board.leds[k].role < EM28XX_NUM_LED_ROLES) {
if (dev->board.leds[k].role == role)
return &dev->board.leds[k];
k++;
}
}
return NULL;
}
EXPORT_SYMBOL_GPL(em28xx_find_led);
int em28xx_capture_start(struct em28xx *dev, int start) int em28xx_capture_start(struct em28xx *dev, int start)
{ {
int rc; int rc;
...@@ -645,9 +661,10 @@ int em28xx_capture_start(struct em28xx *dev, int start) ...@@ -645,9 +661,10 @@ int em28xx_capture_start(struct em28xx *dev, int start)
return rc; return rc;
/* Switch (explicitly controlled) analog capturing LED on/off */ /* Switch (explicitly controlled) analog capturing LED on/off */
if ((dev->mode == EM28XX_ANALOG_MODE) if (dev->mode == EM28XX_ANALOG_MODE) {
&& dev->board.analog_capturing_led) { const struct em28xx_led *led;
struct em28xx_led *led = dev->board.analog_capturing_led; led = em28xx_find_led(dev, EM28XX_LED_ANALOG_CAPTURING);
if (led)
em28xx_write_reg_bits(dev, led->gpio_reg, em28xx_write_reg_bits(dev, led->gpio_reg,
(!start ^ led->inverted) ? (!start ^ led->inverted) ?
~led->gpio_mask : led->gpio_mask, ~led->gpio_mask : led->gpio_mask,
......
...@@ -377,7 +377,13 @@ enum em28xx_adecoder { ...@@ -377,7 +377,13 @@ enum em28xx_adecoder {
EM28XX_TVAUDIO, EM28XX_TVAUDIO,
}; };
enum em28xx_led_role {
EM28XX_LED_ANALOG_CAPTURING = 0,
EM28XX_NUM_LED_ROLES, /* must be the last */
};
struct em28xx_led { struct em28xx_led {
enum em28xx_led_role role;
u8 gpio_reg; u8 gpio_reg;
u8 gpio_mask; u8 gpio_mask;
bool inverted; bool inverted;
...@@ -433,7 +439,7 @@ struct em28xx_board { ...@@ -433,7 +439,7 @@ struct em28xx_board {
char *ir_codes; char *ir_codes;
/* LEDs that need to be controlled explicitly */ /* LEDs that need to be controlled explicitly */
struct em28xx_led *analog_capturing_led; struct em28xx_led *leds;
/* Buttons */ /* Buttons */
struct em28xx_button *buttons; struct em28xx_button *buttons;
...@@ -711,6 +717,8 @@ int em28xx_audio_analog_set(struct em28xx *dev); ...@@ -711,6 +717,8 @@ int em28xx_audio_analog_set(struct em28xx *dev);
int em28xx_audio_setup(struct em28xx *dev); int em28xx_audio_setup(struct em28xx *dev);
int em28xx_colorlevels_set_default(struct em28xx *dev); int em28xx_colorlevels_set_default(struct em28xx *dev);
const struct em28xx_led *em28xx_find_led(struct em28xx *dev,
enum em28xx_led_role role);
int em28xx_capture_start(struct em28xx *dev, int start); int em28xx_capture_start(struct em28xx *dev, int start);
int em28xx_vbi_supported(struct em28xx *dev); int em28xx_vbi_supported(struct em28xx *dev);
int em28xx_set_outfmt(struct em28xx *dev); int em28xx_set_outfmt(struct em28xx *dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment