Hi Franklin, I have no Kworld 315U here for testing, but your patch looked sane on my eyes. In order to merge this upstream, it would be better if you could submit it as two separate patches: the first one with the saa7115 changes to support re-energizing the device, and the second one with the em28xx changes. Please send your Signed-off-by: on the patches. Cheers, Mauro. Franklin Meng wrote: > 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@xxxxxxxxx> wrote: > >> From: Franklin Meng <fmeng2002@xxxxxxxxx> >> Subject: Kworld 315U and SAA7113? >> To: linux-media@xxxxxxxxxxxxxxx >> 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 >> >> >> > > > > -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html