From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from web32701.mail.mud.yahoo.com ([68.142.207.245]:32220 "HELO web32701.mail.mud.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1752738Ab0ANSRE convert rfc822-to-8bit (ORCPT ); Thu, 14 Jan 2010 13:17:04 -0500 Message-ID: <728581.74188.qm@web32701.mail.mud.yahoo.com> Date: Thu, 14 Jan 2010 10:17:02 -0800 (PST) From: Franklin Meng Subject: Re: Kworld 315U and SAA7113? To: Mauro Carvalho Chehab Cc: linux-media@vger.kernel.org In-Reply-To: <4B4E36AC.7090503@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8BIT Sender: linux-media-owner@vger.kernel.org List-ID: Mario, Thank you for taking a look at this.. I'll resubmit the patches. Thanks, Franklin Meng --- On Wed, 1/13/10, Mauro Carvalho Chehab wrote: > From: Mauro Carvalho Chehab > Subject: Re: Kworld 315U and SAA7113? > To: "Franklin Meng" > Cc: linux-media@vger.kernel.org > Date: Wednesday, January 13, 2010, 1:10 PM > 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 > wrote: > > > >> From: Franklin Meng > >> 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 > >> > >> > >>      > > > > > >        > > > > -- > To unsubscribe from this list: send the line "unsubscribe > linux-media" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at  http://vger.kernel.org/majordomo-info.html >