Skip to content

Commit

Permalink
V4L/DVB (9764): em28xx: Add support for suspend the device when not used
Browse files Browse the repository at this point in the history
Several chips may be turned off when the device is not used, like audio,
video and dvb demods. This patch adds a gpio callback at the core
structs to allow turning off such devices.

Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
  • Loading branch information
Mauro Carvalho Chehab committed Dec 29, 2008
1 parent f502e86 commit 2fe3e2e
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 15 deletions.
2 changes: 1 addition & 1 deletion drivers/media/video/em28xx/em28xx-cards.c
Original file line number Diff line number Diff line change
Expand Up @@ -1456,7 +1456,7 @@ void em28xx_pre_card_setup(struct em28xx *dev)
em28xx_set_mode(dev, EM28XX_ANALOG_MODE);

/* Unlock device */
em28xx_set_mode(dev, EM28XX_MODE_UNDEFINED);
em28xx_set_mode(dev, EM28XX_SUSPEND);
}

static void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl)
Expand Down
21 changes: 13 additions & 8 deletions drivers/media/video/em28xx/em28xx-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -737,12 +737,14 @@ int em28xx_gpio_set(struct em28xx *dev, struct em28xx_reg_seq *gpio)
if (!gpio)
return rc;

em28xx_write_reg(dev, 0x48, 0x00);
if (dev->mode == EM28XX_ANALOG_MODE)
em28xx_write_reg(dev, EM28XX_R12_VINENABLE, 0x67);
else
em28xx_write_reg(dev, EM28XX_R12_VINENABLE, 0x37);
msleep(6);
if (dev->mode != EM28XX_SUSPEND) {
em28xx_write_reg(dev, 0x48, 0x00);
if (dev->mode == EM28XX_ANALOG_MODE)
em28xx_write_reg(dev, EM28XX_R12_VINENABLE, 0x67);
else
em28xx_write_reg(dev, EM28XX_R12_VINENABLE, 0x37);
msleep(6);
}

/* Send GPIO reset sequences specified at board entry */
while (gpio->sleep >= 0) {
Expand All @@ -767,9 +769,12 @@ int em28xx_set_mode(struct em28xx *dev, enum em28xx_mode set_mode)
if (dev->mode == set_mode)
return 0;

if (set_mode == EM28XX_MODE_UNDEFINED) {
if (set_mode == EM28XX_SUSPEND) {
dev->mode = set_mode;
return 0;

/* FIXME: add suspend support for ac97 */

return em28xx_gpio_set(dev, dev->board.suspend_gpio);
}

dev->mode = set_mode;
Expand Down
8 changes: 4 additions & 4 deletions drivers/media/video/em28xx/em28xx-dvb.c
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ static int stop_streaming(struct em28xx_dvb *dvb)

em28xx_uninit_isoc(dev);

em28xx_set_mode(dev, EM28XX_MODE_UNDEFINED);
em28xx_set_mode(dev, EM28XX_SUSPEND);

return 0;
}
Expand Down Expand Up @@ -215,7 +215,7 @@ static int em28xx_dvb_bus_ctrl(struct dvb_frontend *fe, int acquire)
if (acquire)
return em28xx_set_mode(dev, EM28XX_DIGITAL_MODE);
else
return em28xx_set_mode(dev, EM28XX_MODE_UNDEFINED);
return em28xx_set_mode(dev, EM28XX_SUSPEND);
}

/* ------------------------------------------------------------------ */
Expand Down Expand Up @@ -466,12 +466,12 @@ static int dvb_init(struct em28xx *dev)
if (result < 0)
goto out_free;

em28xx_set_mode(dev, EM28XX_MODE_UNDEFINED);
em28xx_set_mode(dev, EM28XX_SUSPEND);
printk(KERN_INFO "Successfully loaded em28xx-dvb\n");
return 0;

out_free:
em28xx_set_mode(dev, EM28XX_MODE_UNDEFINED);
em28xx_set_mode(dev, EM28XX_SUSPEND);
kfree(dvb);
dev->dvb = NULL;
return result;
Expand Down
2 changes: 1 addition & 1 deletion drivers/media/video/em28xx/em28xx-video.c
Original file line number Diff line number Diff line change
Expand Up @@ -1697,7 +1697,7 @@ static int em28xx_v4l2_close(struct inode *inode, struct file *filp)

/* do this before setting alternate! */
em28xx_uninit_isoc(dev);
em28xx_set_mode(dev, EM28XX_MODE_UNDEFINED);
em28xx_set_mode(dev, EM28XX_SUSPEND);

/* set alternate 0 */
dev->alt = 0;
Expand Down
3 changes: 2 additions & 1 deletion drivers/media/video/em28xx/em28xx.h
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@
#define EM2800_I2C_WRITE_TIMEOUT 20

enum em28xx_mode {
EM28XX_MODE_UNDEFINED,
EM28XX_SUSPEND,
EM28XX_ANALOG_MODE,
EM28XX_DIGITAL_MODE,
};
Expand Down Expand Up @@ -336,6 +336,7 @@ struct em28xx_board {
unsigned int tda9887_conf;

struct em28xx_reg_seq *dvb_gpio;
struct em28xx_reg_seq *suspend_gpio;

unsigned int is_em2800:1;
unsigned int has_msp34xx:1;
Expand Down

0 comments on commit 2fe3e2e

Please sign in to comment.