The patch number 9764 was added via Mauro Carvalho Chehab <[EMAIL PROTECTED]>
to http://linuxtv.org/hg/v4l-dvb master development tree.
Kernel patches in this development tree may be modified to be backward
compatible with older kernels. Compatibility modifications will be
removed before inclusion into the mainstream Kernel
If anyone has any objections, please let us know by sending a message to:
[EMAIL PROTECTED]
------
From: Mauro Carvalho Chehab <[EMAIL PROTECTED]>
em28xx: Add support for suspend the device when not used
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.
Priority: normal
Signed-off-by: Mauro Carvalho Chehab <[EMAIL PROTECTED]>
---
linux/drivers/media/video/em28xx/em28xx-cards.c | 2 -
linux/drivers/media/video/em28xx/em28xx-core.c | 23 +++++++++-------
linux/drivers/media/video/em28xx/em28xx-dvb.c | 8 ++---
linux/drivers/media/video/em28xx/em28xx-video.c | 2 -
linux/drivers/media/video/em28xx/em28xx.h | 3 +-
5 files changed, 22 insertions(+), 16 deletions(-)
diff -r 86a23dda5b87 -r bdf1741d91e1
linux/drivers/media/video/em28xx/em28xx-cards.c
--- a/linux/drivers/media/video/em28xx/em28xx-cards.c Thu Nov 27 10:00:00
2008 -0200
+++ b/linux/drivers/media/video/em28xx/em28xx-cards.c Thu Nov 27 10:10:40
2008 -0200
@@ -1529,7 +1529,7 @@ void em28xx_pre_card_setup(struct em28xx
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)
diff -r 86a23dda5b87 -r bdf1741d91e1
linux/drivers/media/video/em28xx/em28xx-core.c
--- a/linux/drivers/media/video/em28xx/em28xx-core.c Thu Nov 27 10:00:00
2008 -0200
+++ b/linux/drivers/media/video/em28xx/em28xx-core.c Thu Nov 27 10:10:40
2008 -0200
@@ -741,12 +741,14 @@ int em28xx_gpio_set(struct em28xx *dev,
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) {
@@ -771,14 +773,17 @@ int em28xx_set_mode(struct em28xx *dev,
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);
}
#if 0
/* Resource is locked */
- if (dev->mode != EM28XX_MODE_UNDEFINED)
+ if (dev->mode != EM28XX_SUSPEND)
return -EINVAL;
#endif
dev->mode = set_mode;
diff -r 86a23dda5b87 -r bdf1741d91e1
linux/drivers/media/video/em28xx/em28xx-dvb.c
--- a/linux/drivers/media/video/em28xx/em28xx-dvb.c Thu Nov 27 10:00:00
2008 -0200
+++ b/linux/drivers/media/video/em28xx/em28xx-dvb.c Thu Nov 27 10:10:40
2008 -0200
@@ -162,7 +162,7 @@ static int stop_streaming(struct em28xx_
em28xx_uninit_isoc(dev);
- em28xx_set_mode(dev, EM28XX_MODE_UNDEFINED);
+ em28xx_set_mode(dev, EM28XX_SUSPEND);
return 0;
}
@@ -216,7 +216,7 @@ static int em28xx_dvb_bus_ctrl(struct dv
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);
}
/* ------------------------------------------------------------------ */
@@ -467,12 +467,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;
diff -r 86a23dda5b87 -r bdf1741d91e1
linux/drivers/media/video/em28xx/em28xx-video.c
--- a/linux/drivers/media/video/em28xx/em28xx-video.c Thu Nov 27 10:00:00
2008 -0200
+++ b/linux/drivers/media/video/em28xx/em28xx-video.c Thu Nov 27 10:10:40
2008 -0200
@@ -1760,7 +1760,7 @@ static int em28xx_v4l2_close(struct inod
/* 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;
diff -r 86a23dda5b87 -r bdf1741d91e1 linux/drivers/media/video/em28xx/em28xx.h
--- a/linux/drivers/media/video/em28xx/em28xx.h Thu Nov 27 10:00:00 2008 -0200
+++ b/linux/drivers/media/video/em28xx/em28xx.h Thu Nov 27 10:10:40 2008 -0200
@@ -161,7 +161,7 @@
#define EM2800_I2C_WRITE_TIMEOUT 20
enum em28xx_mode {
- EM28XX_MODE_UNDEFINED,
+ EM28XX_SUSPEND,
EM28XX_ANALOG_MODE,
EM28XX_DIGITAL_MODE,
};
@@ -337,6 +337,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;
---
Patch is available at:
http://linuxtv.org/hg/v4l-dvb/rev/bdf1741d91e10701374786edd949ea9a0c2b7212
_______________________________________________
linuxtv-commits mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits