public inbox for linux-media@vger.kernel.org
 help / color / mirror / Atom feed
* Kworld 315U and SAA7113?
@ 2010-01-08  3:48 Franklin Meng
  0 siblings, 0 replies; 15+ messages in thread
From: Franklin Meng @ 2010-01-08  3:48 UTC (permalink / raw)
  To: linux-media

[-- Attachment #1: Type: text/plain, Size: 1583 bytes --]

After some work I have finally gotten the analog inputs to work with the Kworld 315U device.  I have attached the changes/updates to the em28xx driver. Note: I still don't have analog sound working yet..

I am hoping someone can comment on the changes in saa7115.c.  I added a s_power routine to reinitialize the device.  The reason I am reinitializing this device is because

1. I cannot keep both the LG demod and the SAA powered on at the same time for my device

2. The SAA datasheet seems to suggest that after a reset/power-on the chip needs to be reinitialized.  

3. Reinitializing causes the analog inputs to work correctly. 

Here's what is says in the SAA7113 datasheet.. 
....
Status after power-on
control sequence

VPO7 to VPO0, RTCO, RTS0 and RTS1
are held in high-impedance state

after power-on (reset
sequence) a complete
I2C-bus transmission is
required
...
The above is really suppose to be arranged horizontally in 3 columns.  Anyways, the last part describes that "a complete I2C bus transmission is required"  This is why I think the chip needs to be reinitialized.  


Last thing is that the initialization routing uses these defaults:

       state->bright = 128;
       state->contrast = 64;
       state->hue = 0;
       state->sat = 64;

I was wondering if we should just read the back the values that were initialized by the initialization routine and use those values instead.The reason is because it seems like the different SAA's use slightly different values when initializing.  

Thanks,
Franklin Meng


      

[-- Attachment #2: mydiff1 --]
[-- Type: application/octet-stream, Size: 5523 bytes --]

diff -r b6b82258cf5e linux/drivers/media/video/em28xx/em28xx-cards.c
--- a/linux/drivers/media/video/em28xx/em28xx-cards.c	Thu Dec 31 19:14:54 2009 -0200
+++ b/linux/drivers/media/video/em28xx/em28xx-cards.c	Tue Jan 05 22:56:08 2010 -0800
@@ -122,9 +122,15 @@
 };
 #endif
 
+/* Kworld 315U
+   GPIO0 - Enable digital power (lgdt3303) - low to enable
+   GPIO1 - Enable analog power (saa7113/emp202) - low to enable
+   GPIO7 - enables tuner?
+   GOP2  - ?? some sort of reset ?
+   GOP3  - lgdt3303 reset
+ */
 /* Board - EM2882 Kworld 315U digital */
 static struct em28xx_reg_seq em2882_kworld_315u_digital[] = {
-	{EM28XX_R08_GPIO,	0xff,	0xff,		10},
 	{EM28XX_R08_GPIO,	0xfe,	0xff,		10},
 	{EM2880_R04_GPO,	0x04,	0xff,		10},
 	{EM2880_R04_GPO,	0x0c,	0xff,		10},
@@ -132,6 +138,19 @@
 	{  -1,			-1,	-1,		-1},
 };
 
+/* Board - EM2882 Kworld 315U analog1 analog tv */
+static struct em28xx_reg_seq em2882_kworld_315u_analog1[] = {
+	{EM28XX_R08_GPIO,	0xfd,	0xff,		10},
+	{EM28XX_R08_GPIO,	0x7d,	0xff,		10},
+	{  -1,			-1,	-1,		-1},
+};
+
+/* Board - EM2882 Kworld 315U analog2 component/svideo */
+static struct em28xx_reg_seq em2882_kworld_315u_analog2[] = {
+	{EM28XX_R08_GPIO,	0xfd,	0xff,		10},
+	{  -1,			-1,	-1,		-1},
+};
+
 static struct em28xx_reg_seq em2882_kworld_315u_tuner_gpio[] = {
 	{EM2880_R04_GPO,	0x08,	0xff,		10},
 	{EM2880_R04_GPO,	0x0c,	0xff,		10},
@@ -140,6 +159,16 @@
 	{  -1,			-1,	-1,		-1},
 };
 
+/* Board - EM2882 Kworld 315U suspend */
+static struct em28xx_reg_seq em2882_kworld_315u_suspend[] = {
+	{EM28XX_R08_GPIO,	0x7f,	0xff,		10},
+	{EM28XX_R08_GPIO,	0xfd,	0xff,		10},
+	{EM28XX_R08_GPIO,	0xff,	0xff,		10},
+	{EM2880_R04_GPO,	0x08,	0xff,		10},
+	{EM2880_R04_GPO,	0x0c,	0xff,		10},
+	{  -1,			-1,	-1,		-1},
+};
+
 static struct em28xx_reg_seq kworld_330u_analog[] = {
 	{EM28XX_R08_GPIO,	0x6d,	~EM_GPIO_4,	10},
 	{EM2880_R04_GPO,	0x00,	0xff,		10},
@@ -1314,28 +1343,28 @@
 		.decoder	= EM28XX_SAA711X,
 		.has_dvb	= 1,
 		.dvb_gpio	= em2882_kworld_315u_digital,
+		.suspend_gpio	= em2882_kworld_315u_suspend,
 		.xclk		= EM28XX_XCLK_FREQUENCY_12MHZ,
 		.i2c_speed	= EM28XX_I2C_CLK_WAIT_ENABLE,
-		/* Analog mode - still not ready */
-		/*.input        = { {
+		.input        = { {
 			.type = EM28XX_VMUX_TELEVISION,
 			.vmux = SAA7115_COMPOSITE2,
 			.amux = EM28XX_AMUX_VIDEO,
-			.gpio = em2882_kworld_315u_analog,
+			.gpio = em2882_kworld_315u_analog1,
 			.aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
 		}, {
 			.type = EM28XX_VMUX_COMPOSITE1,
 			.vmux = SAA7115_COMPOSITE0,
 			.amux = EM28XX_AMUX_LINE_IN,
-			.gpio = em2882_kworld_315u_analog1,
+			.gpio = em2882_kworld_315u_analog2,
 			.aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
 		}, {
 			.type = EM28XX_VMUX_SVIDEO,
 			.vmux = SAA7115_SVIDEO3,
 			.amux = EM28XX_AMUX_LINE_IN,
-			.gpio = em2882_kworld_315u_analog1,
+			.gpio = em2882_kworld_315u_analog2,
 			.aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
-		} }, */
+		} }, 
 	},
 	[EM2880_BOARD_EMPIRE_DUAL_TV] = {
 		.name = "Empire dual TV",
diff -r b6b82258cf5e linux/drivers/media/video/em28xx/em28xx-core.c
--- a/linux/drivers/media/video/em28xx/em28xx-core.c	Thu Dec 31 19:14:54 2009 -0200
+++ b/linux/drivers/media/video/em28xx/em28xx-core.c	Tue Jan 05 22:56:08 2010 -0800
@@ -1132,6 +1132,7 @@
  */
 void em28xx_wake_i2c(struct em28xx *dev)
 {
+	v4l2_device_call_all(&dev->v4l2_dev, 0, core,  s_power, 1);
 	v4l2_device_call_all(&dev->v4l2_dev, 0, core,  reset, 0);
 	v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_routing,
 			INPUT(dev->ctl_input)->vmux, 0, 0);
diff -r b6b82258cf5e linux/drivers/media/video/saa7115.c
--- a/linux/drivers/media/video/saa7115.c	Thu Dec 31 19:14:54 2009 -0200
+++ b/linux/drivers/media/video/saa7115.c	Tue Jan 05 22:56:08 2010 -0800
@@ -1338,6 +1338,59 @@
 	return 0;
 }
 
+static int saa711x_s_power(struct v4l2_subdev *sd, int val)
+{
+	struct saa711x_state *state = to_state(sd);
+
+	if(val > 1 || val < 0)
+		return -EINVAL;
+
+	/* There really isn't a way to put the chip into power saving 
+		other than by pulling CE to ground so all we do is return
+		out of this function
+	*/
+	if(val == 0)
+		return 0;
+
+	/* When enabling the chip again we need to reinitialize the 
+		all the values
+	*/
+	state->input = -1;
+	state->output = SAA7115_IPORT_ON;
+	state->enable = 1;
+	state->radio = 0;
+	state->bright = 128;
+	state->contrast = 64;
+	state->hue = 0;
+	state->sat = 64;
+
+	state->audclk_freq = 48000;
+
+	v4l2_dbg(1, debug, sd, "writing init values s_power\n");
+
+	/* init to 60hz/48khz */
+	state->crystal_freq = SAA7115_FREQ_24_576_MHZ;
+	switch (state->ident) {
+	case V4L2_IDENT_SAA7111:
+		saa711x_writeregs(sd, saa7111_init);
+		break;
+	case V4L2_IDENT_SAA7113:
+		saa711x_writeregs(sd, saa7113_init);
+		break;
+	default:
+		state->crystal_freq = SAA7115_FREQ_32_11_MHZ;
+		saa711x_writeregs(sd, saa7115_init_auto_input);
+	}
+	if (state->ident != V4L2_IDENT_SAA7111)
+		saa711x_writeregs(sd, saa7115_init_misc);
+	saa711x_set_v4lstd(sd, V4L2_STD_NTSC);
+
+	v4l2_dbg(1, debug, sd, "status: (1E) 0x%02x, (1F) 0x%02x\n",
+		saa711x_read(sd, R_1E_STATUS_BYTE_1_VD_DEC),
+		saa711x_read(sd, R_1F_STATUS_BYTE_2_VD_DEC));
+	return 0;
+}
+
 static int saa711x_reset(struct v4l2_subdev *sd, u32 val)
 {
 	v4l2_dbg(1, debug, sd, "decoder RESET\n");
@@ -1513,6 +1566,7 @@
 	.s_std = saa711x_s_std,
 	.reset = saa711x_reset,
 	.s_gpio = saa711x_s_gpio,
+	.s_power = saa711x_s_power,
 #ifdef CONFIG_VIDEO_ADV_DEBUG
 	.g_register = saa711x_g_register,
 	.s_register = saa711x_s_register,

^ permalink raw reply	[flat|nested] 15+ messages in thread
* Re: Kworld 315U and SAA7113?
@ 2010-01-09  8:30 Franklin Meng
  0 siblings, 0 replies; 15+ messages in thread
From: Franklin Meng @ 2010-01-09  8:30 UTC (permalink / raw)
  To: linux-media; +Cc: Douglas Schilling

[-- Attachment #1: Type: text/plain, Size: 2537 bytes --]

Attached is an updated diff for the Kworld 315U TV.  I believe all the bugs have been worked out.  I haven't figured out the remote control stuff and hopefully I will be able to get around to it some time. 

The sound issue was because I didn't have the right mplayer config so that is fixed as well.  

Other than that, the LED light on the front of the box doesn't shut off after I start and stop the stream.  It's probably a GPIO setting that I need to tweak.  

And I wanted to say thank you to Douglas and Devin for the tips they provided me.  

Thanks,
Franklin Meng

--- On Thu, 1/7/10, Franklin Meng <fmeng2002@yahoo.com> wrote:

> From: Franklin Meng <fmeng2002@yahoo.com>
> Subject: Kworld 315U and SAA7113?
> To: linux-media@vger.kernel.org
> Date: Thursday, January 7, 2010, 7:48 PM
> After some work I have finally gotten
> the analog inputs to work with the Kworld 315U device.  I
> have attached the changes/updates to the em28xx driver.
> Note: I still don't have analog sound working yet..
> 
> I am hoping someone can comment on the changes in
> saa7115.c.  I added a s_power routine to reinitialize the
> device.  The reason I am reinitializing this device is
> because
> 
> 1. I cannot keep both the LG demod and the SAA powered on
> at the same time for my device
> 
> 2. The SAA datasheet seems to suggest that after a
> reset/power-on the chip needs to be reinitialized.  
> 
> 3. Reinitializing causes the analog inputs to work
> correctly. 
> 
> Here's what is says in the SAA7113 datasheet.. 
> ....
> Status after power-on
> control sequence
> 
> VPO7 to VPO0, RTCO, RTS0 and RTS1
> are held in high-impedance state
> 
> after power-on (reset
> sequence) a complete
> I2C-bus transmission is
> required
> ...
> The above is really suppose to be arranged horizontally in
> 3 columns.  Anyways, the last part describes that "a
> complete I2C bus transmission is required"  This is why
> I think the chip needs to be reinitialized.  
> 
> 
> Last thing is that the initialization routing uses these
> defaults:
> 
>        state->bright = 128;
>        state->contrast = 64;
>        state->hue = 0;
>        state->sat = 64;
> 
> I was wondering if we should just read the back the values
> that were initialized by the initialization routine and use
> those values instead.The reason is because it seems like the
> different SAA's use slightly different values when
> initializing.  
> 
> Thanks,
> Franklin Meng
> 
> 
>      


      

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: curdiff.diff --]
[-- Type: text/x-diff; name="curdiff.diff", Size: 5256 bytes --]

diff -r b6b82258cf5e linux/drivers/media/video/em28xx/em28xx-cards.c
--- a/linux/drivers/media/video/em28xx/em28xx-cards.c	Thu Dec 31 19:14:54 2009 -0200
+++ b/linux/drivers/media/video/em28xx/em28xx-cards.c	Sat Jan 09 00:21:39 2010 -0800
@@ -122,13 +122,31 @@
 };
 #endif
 
+/* Kworld 315U
+   GPIO0 - Enable digital power (lgdt3303) - low to enable
+   GPIO1 - Enable analog power (saa7113/emp202) - low to enable
+   GPIO7 - enables something ?
+   GOP2  - ?? some sort of reset ?
+   GOP3  - lgdt3303 reset
+ */
 /* Board - EM2882 Kworld 315U digital */
 static struct em28xx_reg_seq em2882_kworld_315u_digital[] = {
-	{EM28XX_R08_GPIO,	0xff,	0xff,		10},
 	{EM28XX_R08_GPIO,	0xfe,	0xff,		10},
 	{EM2880_R04_GPO,	0x04,	0xff,		10},
 	{EM2880_R04_GPO,	0x0c,	0xff,		10},
-	{EM28XX_R08_GPIO,	0x7e,	0xff,		10},
+	{  -1,			-1,	-1,		-1},
+};
+
+/* Board - EM2882 Kworld 315U analog1 analog tv */
+static struct em28xx_reg_seq em2882_kworld_315u_analog1[] = {
+	{EM28XX_R08_GPIO,	0xfd,	0xff,		10},
+	{EM28XX_R08_GPIO,	0x7d,	0xff,		10},
+	{  -1,			-1,	-1,		-1},
+};
+
+/* Board - EM2882 Kworld 315U analog2 component/svideo */
+static struct em28xx_reg_seq em2882_kworld_315u_analog2[] = {
+	{EM28XX_R08_GPIO,	0xfd,	0xff,		10},
 	{  -1,			-1,	-1,		-1},
 };
 
@@ -140,6 +158,12 @@
 	{  -1,			-1,	-1,		-1},
 };
 
+/* Board - EM2882 Kworld 315U suspend */
+static struct em28xx_reg_seq em2882_kworld_315u_suspend[] = {
+	{EM28XX_R08_GPIO,	0xff,	0xff,		10},
+	{  -1,			-1,	-1,		-1},
+};
+
 static struct em28xx_reg_seq kworld_330u_analog[] = {
 	{EM28XX_R08_GPIO,	0x6d,	~EM_GPIO_4,	10},
 	{EM2880_R04_GPO,	0x00,	0xff,		10},
@@ -1314,28 +1338,28 @@
 		.decoder	= EM28XX_SAA711X,
 		.has_dvb	= 1,
 		.dvb_gpio	= em2882_kworld_315u_digital,
+		.suspend_gpio	= em2882_kworld_315u_suspend,
 		.xclk		= EM28XX_XCLK_FREQUENCY_12MHZ,
 		.i2c_speed	= EM28XX_I2C_CLK_WAIT_ENABLE,
-		/* Analog mode - still not ready */
-		/*.input        = { {
+		.input        = { {
 			.type = EM28XX_VMUX_TELEVISION,
 			.vmux = SAA7115_COMPOSITE2,
 			.amux = EM28XX_AMUX_VIDEO,
-			.gpio = em2882_kworld_315u_analog,
+			.gpio = em2882_kworld_315u_analog1,
 			.aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
 		}, {
 			.type = EM28XX_VMUX_COMPOSITE1,
 			.vmux = SAA7115_COMPOSITE0,
 			.amux = EM28XX_AMUX_LINE_IN,
-			.gpio = em2882_kworld_315u_analog1,
+			.gpio = em2882_kworld_315u_analog2,
 			.aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
 		}, {
 			.type = EM28XX_VMUX_SVIDEO,
 			.vmux = SAA7115_SVIDEO3,
 			.amux = EM28XX_AMUX_LINE_IN,
-			.gpio = em2882_kworld_315u_analog1,
+			.gpio = em2882_kworld_315u_analog2,
 			.aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
-		} }, */
+		} }, 
 	},
 	[EM2880_BOARD_EMPIRE_DUAL_TV] = {
 		.name = "Empire dual TV",
diff -r b6b82258cf5e linux/drivers/media/video/em28xx/em28xx-core.c
--- a/linux/drivers/media/video/em28xx/em28xx-core.c	Thu Dec 31 19:14:54 2009 -0200
+++ b/linux/drivers/media/video/em28xx/em28xx-core.c	Sat Jan 09 00:21:39 2010 -0800
@@ -1132,6 +1132,7 @@
  */
 void em28xx_wake_i2c(struct em28xx *dev)
 {
+	v4l2_device_call_all(&dev->v4l2_dev, 0, core,  s_power, 1);
 	v4l2_device_call_all(&dev->v4l2_dev, 0, core,  reset, 0);
 	v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_routing,
 			INPUT(dev->ctl_input)->vmux, 0, 0);
diff -r b6b82258cf5e linux/drivers/media/video/saa7115.c
--- a/linux/drivers/media/video/saa7115.c	Thu Dec 31 19:14:54 2009 -0200
+++ b/linux/drivers/media/video/saa7115.c	Sat Jan 09 00:21:39 2010 -0800
@@ -1338,6 +1338,59 @@
 	return 0;
 }
 
+static int saa711x_s_power(struct v4l2_subdev *sd, int val)
+{
+	struct saa711x_state *state = to_state(sd);
+
+	if(val > 1 || val < 0)
+		return -EINVAL;
+
+	/* There really isn't a way to put the chip into power saving 
+		other than by pulling CE to ground so all we do is return
+		out of this function
+	*/
+	if(val == 0)
+		return 0;
+
+	/* When enabling the chip again we need to reinitialize the 
+		all the values
+	*/
+	state->input = -1;
+	state->output = SAA7115_IPORT_ON;
+	state->enable = 1;
+	state->radio = 0;
+	state->bright = 128;
+	state->contrast = 64;
+	state->hue = 0;
+	state->sat = 64;
+
+	state->audclk_freq = 48000;
+
+	v4l2_dbg(1, debug, sd, "writing init values s_power\n");
+
+	/* init to 60hz/48khz */
+	state->crystal_freq = SAA7115_FREQ_24_576_MHZ;
+	switch (state->ident) {
+	case V4L2_IDENT_SAA7111:
+		saa711x_writeregs(sd, saa7111_init);
+		break;
+	case V4L2_IDENT_SAA7113:
+		saa711x_writeregs(sd, saa7113_init);
+		break;
+	default:
+		state->crystal_freq = SAA7115_FREQ_32_11_MHZ;
+		saa711x_writeregs(sd, saa7115_init_auto_input);
+	}
+	if (state->ident != V4L2_IDENT_SAA7111)
+		saa711x_writeregs(sd, saa7115_init_misc);
+	saa711x_set_v4lstd(sd, V4L2_STD_NTSC);
+
+	v4l2_dbg(1, debug, sd, "status: (1E) 0x%02x, (1F) 0x%02x\n",
+		saa711x_read(sd, R_1E_STATUS_BYTE_1_VD_DEC),
+		saa711x_read(sd, R_1F_STATUS_BYTE_2_VD_DEC));
+	return 0;
+}
+
 static int saa711x_reset(struct v4l2_subdev *sd, u32 val)
 {
 	v4l2_dbg(1, debug, sd, "decoder RESET\n");
@@ -1513,6 +1566,7 @@
 	.s_std = saa711x_s_std,
 	.reset = saa711x_reset,
 	.s_gpio = saa711x_s_gpio,
+	.s_power = saa711x_s_power,
 #ifdef CONFIG_VIDEO_ADV_DEBUG
 	.g_register = saa711x_g_register,
 	.s_register = saa711x_s_register,

^ permalink raw reply	[flat|nested] 15+ messages in thread
* Re: Kworld 315U and SAA7113?
@ 2010-01-09 19:30 Franklin Meng
  2010-01-13 21:10 ` Mauro Carvalho Chehab
  2010-01-13 22:04 ` Devin Heitmueller
  0 siblings, 2 replies; 15+ messages in thread
From: Franklin Meng @ 2010-01-09 19:30 UTC (permalink / raw)
  To: linux-media

[-- Attachment #1: Type: text/plain, Size: 15716 bytes --]

I tweaked the GPIO's a bit more for the Kworld 315U and switching between analog and digital signals is more reliable now.  Attached is an updated diff.  

diff -r b6b82258cf5e linux/drivers/media/video/em28xx/em28xx-cards.c
--- a/linux/drivers/media/video/em28xx/em28xx-cards.c   Thu Dec 31 19:14:54 2009 -0200
+++ b/linux/drivers/media/video/em28xx/em28xx-cards.c   Sat Jan 09 11:29:27 2010 -0800
@@ -122,13 +122,31 @@                                                                 
 };                                                                                   
 #endif                                                                               
                                                                                      
+/* Kworld 315U                                                                       
+   GPIO0 - Enable digital power (lgdt3303) - low to enable                           
+   GPIO1 - Enable analog power (saa7113/emp202) - low to enable                      
+   GPIO7 - enables something ?                                                       
+   GOP2  - ?? some sort of reset ?                                                   
+   GOP3  - lgdt3303 reset                                                            
+ */                                                                                  
 /* Board - EM2882 Kworld 315U digital */                                             
 static struct em28xx_reg_seq em2882_kworld_315u_digital[] = {                        
-       {EM28XX_R08_GPIO,       0xff,   0xff,           10},                          
-       {EM28XX_R08_GPIO,       0xfe,   0xff,           10},                          
+       {EM28XX_R08_GPIO,       0x7e,   0xff,           10},                          
        {EM2880_R04_GPO,        0x04,   0xff,           10},                          
        {EM2880_R04_GPO,        0x0c,   0xff,           10},                          
-       {EM28XX_R08_GPIO,       0x7e,   0xff,           10},                          
+       {  -1,                  -1,     -1,             -1},                          
+};                                                                                   
+                                                                                     
+/* Board - EM2882 Kworld 315U analog1 analog tv */                                   
+static struct em28xx_reg_seq em2882_kworld_315u_analog1[] = {                        
+       {EM28XX_R08_GPIO,       0xfd,   0xff,           10},                          
+       {EM28XX_R08_GPIO,       0x7d,   0xff,           10},                          
+       {  -1,                  -1,     -1,             -1},                          
+};                                                                                   
+                                                                                     
+/* Board - EM2882 Kworld 315U analog2 component/svideo */                            
+static struct em28xx_reg_seq em2882_kworld_315u_analog2[] = {                        
+       {EM28XX_R08_GPIO,       0xfd,   0xff,           10},                          
        {  -1,                  -1,     -1,             -1},                          
 };                                                                                   
                                                                                      
@@ -140,6 +158,14 @@                                                                  
        {  -1,                  -1,     -1,             -1},                          
 };                                                                                   
                                                                                      
+/* Board - EM2882 Kworld 315U suspend */                                             
+static struct em28xx_reg_seq em2882_kworld_315u_suspend[] = {                        
+       {EM28XX_R08_GPIO,       0xff,   0xff,           10},                          
+       {EM2880_R04_GPO,        0x08,   0xff,           10},                          
+       {EM2880_R04_GPO,        0x0c,   0xff,           10},                          
+       {  -1,                  -1,     -1,             -1},                          
+};                                                                                   
+                                                                                     
 static struct em28xx_reg_seq kworld_330u_analog[] = {                                
        {EM28XX_R08_GPIO,       0x6d,   ~EM_GPIO_4,     10},                          
        {EM2880_R04_GPO,        0x00,   0xff,           10},                          
@@ -1314,28 +1340,28 @@                                                               
                .decoder        = EM28XX_SAA711X,                                     
                .has_dvb        = 1,                                                  
                .dvb_gpio       = em2882_kworld_315u_digital,                         
+               .suspend_gpio   = em2882_kworld_315u_suspend,                         
                .xclk           = EM28XX_XCLK_FREQUENCY_12MHZ,                        
                .i2c_speed      = EM28XX_I2C_CLK_WAIT_ENABLE,                         
-               /* Analog mode - still not ready */                                   
-               /*.input        = { {                                                 
+               .input        = { {                                                   
                        .type = EM28XX_VMUX_TELEVISION,                               
                        .vmux = SAA7115_COMPOSITE2,                                   
                        .amux = EM28XX_AMUX_VIDEO,                                    
-                       .gpio = em2882_kworld_315u_analog,                            
+                       .gpio = em2882_kworld_315u_analog1,                           
                        .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,          
                }, {                                                                  
                        .type = EM28XX_VMUX_COMPOSITE1,                               
                        .vmux = SAA7115_COMPOSITE0,                                   
                        .amux = EM28XX_AMUX_LINE_IN,                                  
-                       .gpio = em2882_kworld_315u_analog1,                           
+                       .gpio = em2882_kworld_315u_analog2,                           
                        .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,          
                }, {                                                                  
                        .type = EM28XX_VMUX_SVIDEO,                                   
                        .vmux = SAA7115_SVIDEO3,                                      
                        .amux = EM28XX_AMUX_LINE_IN,                                  
-                       .gpio = em2882_kworld_315u_analog1,                           
+                       .gpio = em2882_kworld_315u_analog2,                           
                        .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,          
-               } }, */                                                               
+               } },                                                                  
        },                                                                            
        [EM2880_BOARD_EMPIRE_DUAL_TV] = {                                             
                .name = "Empire dual TV",                                             
diff -r b6b82258cf5e linux/drivers/media/video/em28xx/em28xx-core.c                   
--- a/linux/drivers/media/video/em28xx/em28xx-core.c    Thu Dec 31 19:14:54 2009 -0200
+++ b/linux/drivers/media/video/em28xx/em28xx-core.c    Sat Jan 09 11:29:27 2010 -0800
@@ -1132,6 +1132,7 @@                                                                 
  */                                                                                  
 void em28xx_wake_i2c(struct em28xx *dev)                                             
 {                                                                                    
+       v4l2_device_call_all(&dev->v4l2_dev, 0, core,  s_power, 1);                   
        v4l2_device_call_all(&dev->v4l2_dev, 0, core,  reset, 0);                     
        v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_routing,                     
                        INPUT(dev->ctl_input)->vmux, 0, 0);                           
diff -r b6b82258cf5e linux/drivers/media/video/saa7115.c                              
--- a/linux/drivers/media/video/saa7115.c       Thu Dec 31 19:14:54 2009 -0200        
+++ b/linux/drivers/media/video/saa7115.c       Sat Jan 09 11:29:27 2010 -0800        
@@ -1338,6 +1338,59 @@                                                                
        return 0;                                                                     
 }                                                                                    
                                                                                      
+static int saa711x_s_power(struct v4l2_subdev *sd, int val)                          
+{                                                                                    
+       struct saa711x_state *state = to_state(sd);                                   
+                                                                                     
+       if(val > 1 || val < 0)                                                        
+               return -EINVAL;                                                       
+                                                                                     
+       /* There really isn't a way to put the chip into power saving                 
+               other than by pulling CE to ground so all we do is return             
+               out of this function                                                  
+       */                                                                            
+       if(val == 0)                                                                  
+               return 0;                                                             
+                                                                                     
+       /* When enabling the chip again we need to reinitialize the                   
+               all the values                                                        
+       */                                                                            
+       state->input = -1;                                                            
+       state->output = SAA7115_IPORT_ON;                                             
+       state->enable = 1;                                                            
+       state->radio = 0;                                                             
+       state->bright = 128;                                                          
+       state->contrast = 64;                                                         
+       state->hue = 0;                                                               
+       state->sat = 64;                                                              
+                                                                                     
+       state->audclk_freq = 48000;                                                   
+                                                                                     
+       v4l2_dbg(1, debug, sd, "writing init values s_power\n");                      
+                                                                                     
+       /* init to 60hz/48khz */                                                      
+       state->crystal_freq = SAA7115_FREQ_24_576_MHZ;                                
+       switch (state->ident) {                                                       
+       case V4L2_IDENT_SAA7111:                                                      
+               saa711x_writeregs(sd, saa7111_init);                                  
+               break;                                                                
+       case V4L2_IDENT_SAA7113:                                                      
+               saa711x_writeregs(sd, saa7113_init);
+               break;
+       default:
+               state->crystal_freq = SAA7115_FREQ_32_11_MHZ;
+               saa711x_writeregs(sd, saa7115_init_auto_input);
+       }
+       if (state->ident != V4L2_IDENT_SAA7111)
+               saa711x_writeregs(sd, saa7115_init_misc);
+       saa711x_set_v4lstd(sd, V4L2_STD_NTSC);
+
+       v4l2_dbg(1, debug, sd, "status: (1E) 0x%02x, (1F) 0x%02x\n",
+               saa711x_read(sd, R_1E_STATUS_BYTE_1_VD_DEC),
+               saa711x_read(sd, R_1F_STATUS_BYTE_2_VD_DEC));
+       return 0;
+}
+
 static int saa711x_reset(struct v4l2_subdev *sd, u32 val)
 {
        v4l2_dbg(1, debug, sd, "decoder RESET\n");
@@ -1513,6 +1566,7 @@
        .s_std = saa711x_s_std,
        .reset = saa711x_reset,
        .s_gpio = saa711x_s_gpio,
+       .s_power = saa711x_s_power,
 #ifdef CONFIG_VIDEO_ADV_DEBUG
        .g_register = saa711x_g_register,
        .s_register = saa711x_s_register,


Thanks,
Franklin Meng

--- On Thu, 1/7/10, Franklin Meng <fmeng2002@yahoo.com> wrote:

> From: Franklin Meng <fmeng2002@yahoo.com>
> Subject: Kworld 315U and SAA7113?
> To: linux-media@vger.kernel.org
> Date: Thursday, January 7, 2010, 7:48 PM
> After some work I have finally gotten
> the analog inputs to work with the Kworld 315U device.  I
> have attached the changes/updates to the em28xx driver.
> Note: I still don't have analog sound working yet..
> 
> I am hoping someone can comment on the changes in
> saa7115.c.  I added a s_power routine to reinitialize the
> device.  The reason I am reinitializing this device is
> because
> 
> 1. I cannot keep both the LG demod and the SAA powered on
> at the same time for my device
> 
> 2. The SAA datasheet seems to suggest that after a
> reset/power-on the chip needs to be reinitialized.  
> 
> 3. Reinitializing causes the analog inputs to work
> correctly. 
> 
> Here's what is says in the SAA7113 datasheet.. 
> ....
> Status after power-on
> control sequence
> 
> VPO7 to VPO0, RTCO, RTS0 and RTS1
> are held in high-impedance state
> 
> after power-on (reset
> sequence) a complete
> I2C-bus transmission is
> required
> ...
> The above is really suppose to be arranged horizontally in
> 3 columns.  Anyways, the last part describes that "a
> complete I2C bus transmission is required"  This is why
> I think the chip needs to be reinitialized.  
> 
> 
> Last thing is that the initialization routing uses these
> defaults:
> 
>        state->bright = 128;
>        state->contrast = 64;
>        state->hue = 0;
>        state->sat = 64;
> 
> I was wondering if we should just read the back the values
> that were initialized by the initialization routine and use
> those values instead.The reason is because it seems like the
> different SAA's use slightly different values when
> initializing.  
> 
> Thanks,
> Franklin Meng
> 
> 
>      


      

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: curdiff1.diff --]
[-- Type: text/x-diff; name="curdiff1.diff", Size: 5368 bytes --]

diff -r b6b82258cf5e linux/drivers/media/video/em28xx/em28xx-cards.c
--- a/linux/drivers/media/video/em28xx/em28xx-cards.c	Thu Dec 31 19:14:54 2009 -0200
+++ b/linux/drivers/media/video/em28xx/em28xx-cards.c	Sat Jan 09 11:26:13 2010 -0800
@@ -122,13 +122,31 @@
 };
 #endif
 
+/* Kworld 315U
+   GPIO0 - Enable digital power (lgdt3303) - low to enable
+   GPIO1 - Enable analog power (saa7113/emp202) - low to enable
+   GPIO7 - enables something ?
+   GOP2  - ?? some sort of reset ?
+   GOP3  - lgdt3303 reset
+ */
 /* Board - EM2882 Kworld 315U digital */
 static struct em28xx_reg_seq em2882_kworld_315u_digital[] = {
-	{EM28XX_R08_GPIO,	0xff,	0xff,		10},
-	{EM28XX_R08_GPIO,	0xfe,	0xff,		10},
+	{EM28XX_R08_GPIO,	0x7e,	0xff,		10},
 	{EM2880_R04_GPO,	0x04,	0xff,		10},
 	{EM2880_R04_GPO,	0x0c,	0xff,		10},
-	{EM28XX_R08_GPIO,	0x7e,	0xff,		10},
+	{  -1,			-1,	-1,		-1},
+};
+
+/* Board - EM2882 Kworld 315U analog1 analog tv */
+static struct em28xx_reg_seq em2882_kworld_315u_analog1[] = {
+	{EM28XX_R08_GPIO,	0xfd,	0xff,		10},
+	{EM28XX_R08_GPIO,	0x7d,	0xff,		10},
+	{  -1,			-1,	-1,		-1},
+};
+
+/* Board - EM2882 Kworld 315U analog2 component/svideo */
+static struct em28xx_reg_seq em2882_kworld_315u_analog2[] = {
+	{EM28XX_R08_GPIO,	0xfd,	0xff,		10},
 	{  -1,			-1,	-1,		-1},
 };
 
@@ -140,6 +158,14 @@
 	{  -1,			-1,	-1,		-1},
 };
 
+/* Board - EM2882 Kworld 315U suspend */
+static struct em28xx_reg_seq em2882_kworld_315u_suspend[] = {
+	{EM28XX_R08_GPIO,	0xff,	0xff,		10},
+	{EM2880_R04_GPO,	0x08,	0xff,		10},
+	{EM2880_R04_GPO,	0x0c,	0xff,		10},
+	{  -1,			-1,	-1,		-1},
+};
+
 static struct em28xx_reg_seq kworld_330u_analog[] = {
 	{EM28XX_R08_GPIO,	0x6d,	~EM_GPIO_4,	10},
 	{EM2880_R04_GPO,	0x00,	0xff,		10},
@@ -1314,28 +1340,28 @@
 		.decoder	= EM28XX_SAA711X,
 		.has_dvb	= 1,
 		.dvb_gpio	= em2882_kworld_315u_digital,
+		.suspend_gpio	= em2882_kworld_315u_suspend,
 		.xclk		= EM28XX_XCLK_FREQUENCY_12MHZ,
 		.i2c_speed	= EM28XX_I2C_CLK_WAIT_ENABLE,
-		/* Analog mode - still not ready */
-		/*.input        = { {
+		.input        = { {
 			.type = EM28XX_VMUX_TELEVISION,
 			.vmux = SAA7115_COMPOSITE2,
 			.amux = EM28XX_AMUX_VIDEO,
-			.gpio = em2882_kworld_315u_analog,
+			.gpio = em2882_kworld_315u_analog1,
 			.aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
 		}, {
 			.type = EM28XX_VMUX_COMPOSITE1,
 			.vmux = SAA7115_COMPOSITE0,
 			.amux = EM28XX_AMUX_LINE_IN,
-			.gpio = em2882_kworld_315u_analog1,
+			.gpio = em2882_kworld_315u_analog2,
 			.aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
 		}, {
 			.type = EM28XX_VMUX_SVIDEO,
 			.vmux = SAA7115_SVIDEO3,
 			.amux = EM28XX_AMUX_LINE_IN,
-			.gpio = em2882_kworld_315u_analog1,
+			.gpio = em2882_kworld_315u_analog2,
 			.aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
-		} }, */
+		} }, 
 	},
 	[EM2880_BOARD_EMPIRE_DUAL_TV] = {
 		.name = "Empire dual TV",
diff -r b6b82258cf5e linux/drivers/media/video/em28xx/em28xx-core.c
--- a/linux/drivers/media/video/em28xx/em28xx-core.c	Thu Dec 31 19:14:54 2009 -0200
+++ b/linux/drivers/media/video/em28xx/em28xx-core.c	Sat Jan 09 11:26:13 2010 -0800
@@ -1132,6 +1132,7 @@
  */
 void em28xx_wake_i2c(struct em28xx *dev)
 {
+	v4l2_device_call_all(&dev->v4l2_dev, 0, core,  s_power, 1);
 	v4l2_device_call_all(&dev->v4l2_dev, 0, core,  reset, 0);
 	v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_routing,
 			INPUT(dev->ctl_input)->vmux, 0, 0);
diff -r b6b82258cf5e linux/drivers/media/video/saa7115.c
--- a/linux/drivers/media/video/saa7115.c	Thu Dec 31 19:14:54 2009 -0200
+++ b/linux/drivers/media/video/saa7115.c	Sat Jan 09 11:26:13 2010 -0800
@@ -1338,6 +1338,59 @@
 	return 0;
 }
 
+static int saa711x_s_power(struct v4l2_subdev *sd, int val)
+{
+	struct saa711x_state *state = to_state(sd);
+
+	if(val > 1 || val < 0)
+		return -EINVAL;
+
+	/* There really isn't a way to put the chip into power saving 
+		other than by pulling CE to ground so all we do is return
+		out of this function
+	*/
+	if(val == 0)
+		return 0;
+
+	/* When enabling the chip again we need to reinitialize the 
+		all the values
+	*/
+	state->input = -1;
+	state->output = SAA7115_IPORT_ON;
+	state->enable = 1;
+	state->radio = 0;
+	state->bright = 128;
+	state->contrast = 64;
+	state->hue = 0;
+	state->sat = 64;
+
+	state->audclk_freq = 48000;
+
+	v4l2_dbg(1, debug, sd, "writing init values s_power\n");
+
+	/* init to 60hz/48khz */
+	state->crystal_freq = SAA7115_FREQ_24_576_MHZ;
+	switch (state->ident) {
+	case V4L2_IDENT_SAA7111:
+		saa711x_writeregs(sd, saa7111_init);
+		break;
+	case V4L2_IDENT_SAA7113:
+		saa711x_writeregs(sd, saa7113_init);
+		break;
+	default:
+		state->crystal_freq = SAA7115_FREQ_32_11_MHZ;
+		saa711x_writeregs(sd, saa7115_init_auto_input);
+	}
+	if (state->ident != V4L2_IDENT_SAA7111)
+		saa711x_writeregs(sd, saa7115_init_misc);
+	saa711x_set_v4lstd(sd, V4L2_STD_NTSC);
+
+	v4l2_dbg(1, debug, sd, "status: (1E) 0x%02x, (1F) 0x%02x\n",
+		saa711x_read(sd, R_1E_STATUS_BYTE_1_VD_DEC),
+		saa711x_read(sd, R_1F_STATUS_BYTE_2_VD_DEC));
+	return 0;
+}
+
 static int saa711x_reset(struct v4l2_subdev *sd, u32 val)
 {
 	v4l2_dbg(1, debug, sd, "decoder RESET\n");
@@ -1513,6 +1566,7 @@
 	.s_std = saa711x_s_std,
 	.reset = saa711x_reset,
 	.s_gpio = saa711x_s_gpio,
+	.s_power = saa711x_s_power,
 #ifdef CONFIG_VIDEO_ADV_DEBUG
 	.g_register = saa711x_g_register,
 	.s_register = saa711x_s_register,

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2010-01-17 19:02 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-01-08  3:48 Kworld 315U and SAA7113? Franklin Meng
  -- strict thread matches above, loose matches on Subject: below --
2010-01-09  8:30 Franklin Meng
2010-01-09 19:30 Franklin Meng
2010-01-13 21:10 ` Mauro Carvalho Chehab
2010-01-14 18:17   ` Franklin Meng
2010-01-13 22:04 ` Devin Heitmueller
2010-01-14 18:54   ` Franklin Meng
2010-01-14 19:13     ` Devin Heitmueller
2010-01-14 22:00     ` CityK
2010-01-14 22:09       ` Devin Heitmueller
2010-01-15  3:03         ` Franklin Meng
2010-01-17  7:05           ` Franklin Meng
2010-01-17 12:28             ` Mauro Carvalho Chehab
2010-01-17 16:28             ` Devin Heitmueller
2010-01-17 19:02               ` Franklin Meng

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox