[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: Frank Schäfer <fschaefer.oss@googlemail.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
This commit is contained in:
Frank Schaefer 2013-12-01 18:06:55 -03:00 committed by Mauro Carvalho Chehab
parent 7763481a97
commit 6b8a3170c9
2 changed files with 33 additions and 8 deletions

View File

@ -600,6 +600,22 @@ int em28xx_colorlevels_set_default(struct em28xx *dev)
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 rc;
@ -645,13 +661,14 @@ int em28xx_capture_start(struct em28xx *dev, int start)
return rc;
/* Switch (explicitly controlled) analog capturing LED on/off */
if ((dev->mode == EM28XX_ANALOG_MODE)
&& dev->board.analog_capturing_led) {
struct em28xx_led *led = dev->board.analog_capturing_led;
em28xx_write_reg_bits(dev, led->gpio_reg,
(!start ^ led->inverted) ?
~led->gpio_mask : led->gpio_mask,
led->gpio_mask);
if (dev->mode == EM28XX_ANALOG_MODE) {
const struct em28xx_led *led;
led = em28xx_find_led(dev, EM28XX_LED_ANALOG_CAPTURING);
if (led)
em28xx_write_reg_bits(dev, led->gpio_reg,
(!start ^ led->inverted) ?
~led->gpio_mask : led->gpio_mask,
led->gpio_mask);
}
return rc;

View File

@ -377,7 +377,13 @@ enum em28xx_adecoder {
EM28XX_TVAUDIO,
};
enum em28xx_led_role {
EM28XX_LED_ANALOG_CAPTURING = 0,
EM28XX_NUM_LED_ROLES, /* must be the last */
};
struct em28xx_led {
enum em28xx_led_role role;
u8 gpio_reg;
u8 gpio_mask;
bool inverted;
@ -433,7 +439,7 @@ struct em28xx_board {
char *ir_codes;
/* LEDs that need to be controlled explicitly */
struct em28xx_led *analog_capturing_led;
struct em28xx_led *leds;
/* Buttons */
struct em28xx_button *buttons;
@ -711,6 +717,8 @@ int em28xx_audio_analog_set(struct em28xx *dev);
int em28xx_audio_setup(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_vbi_supported(struct em28xx *dev);
int em28xx_set_outfmt(struct em28xx *dev);