Em 30-06-2012 19:32, Martin Blumenstingl escreveu:
> Currently there are two different implementations (in the firmware) for
> the QAM demodulator command: one takes 4 and the other takes 2 parameters.
> The driver shows an error in dmesg When using the 4-parameter command with
> firmware that implements the 2-parameter command.
> Unfortunately this happens every time when chaning the frequency (on DVB-C).
> 
> This patch simply makes configurable, how many command parameters will be
> used.
> All existing drxk_config instances using the "drxk_a3.mc" were updated
> because this firmware is the only loadable firmware where the QAM
> demodulator command takes 4 parameters. Some firmwares in the ROM
> might also use it.
> The drxk instances in the em28xx-dvb driver were also updated to
> silence the warnings.
> 
> If no qam_demod_parameter_count is given in the drxk_config struct,
> then the correct number of parameters will be auto-detected.
> 
> Signed-off-by: Martin Blumenstingl <martin.blumensti...@googlemail.com>
> ---
>   drivers/media/dvb/ddbridge/ddbridge-core.c |   1 +
>   drivers/media/dvb/frontends/drxk.h         |  11 ++-
>   drivers/media/dvb/frontends/drxk_hard.c    | 105 
> ++++++++++++++++++++++-------
>   drivers/media/dvb/frontends/drxk_hard.h    |   1 +
>   drivers/media/dvb/ngene/ngene-cards.c      |   1 +
>   drivers/media/video/em28xx/em28xx-dvb.c    |   4 ++
>   6 files changed, 96 insertions(+), 27 deletions(-)
> 
> diff --git a/drivers/media/dvb/ddbridge/ddbridge-core.c 
> b/drivers/media/dvb/ddbridge/ddbridge-core.c
> index 131b938..ebf3f05 100644
> --- a/drivers/media/dvb/ddbridge/ddbridge-core.c
> +++ b/drivers/media/dvb/ddbridge/ddbridge-core.c
> @@ -578,6 +578,7 @@ static int demod_attach_drxk(struct ddb_input *input)
>   
>       memset(&config, 0, sizeof(config));
>       config.microcode_name = "drxk_a3.mc";
> +     config.qam_demod_parameter_count = 4;
>       config.adr = 0x29 + (input->nr & 1);
>   
>       fe = input->fe = dvb_attach(drxk_attach, &config, i2c);
> diff --git a/drivers/media/dvb/frontends/drxk.h 
> b/drivers/media/dvb/frontends/drxk.h
> index 9d64e4f..19a8114 100644
> --- a/drivers/media/dvb/frontends/drxk.h
> +++ b/drivers/media/dvb/frontends/drxk.h
> @@ -20,6 +20,14 @@
>    *                  means that 1=DVBC, 0 = DVBT. Zero means the opposite.
>    * @mpeg_out_clk_strength: DRXK Mpeg output clock drive strength.
>    * @microcode_name: Name of the firmware file with the microcode
> + * @qam_demod_parameter_count:       The number of parameters used for the 
> command
> + *                           to set the demodulator parameters. All
> + *                           firmwares are using the 2-parameter commmand.
> + *                           An exception is the "drxk_a3.mc" firmware,
> + *                           which uses the 4-parameter command.
> + *                           A value of 0 (default) or lower indicates that
> + *                           the correct number of parameters will be
> + *                           automatically detected.
>    *
>    * On the *_gpio vars, bit 0 is UIO-1, bit 1 is UIO-2 and bit 2 is
>    * UIO-3.
> @@ -38,7 +46,8 @@ struct drxk_config {
>       u8      mpeg_out_clk_strength;
>       int     chunk_size;
>   
> -     const char *microcode_name;
> +     const char      *microcode_name;
> +     int              qam_demod_parameter_count;
>   };
>   
>   #if defined(CONFIG_DVB_DRXK) || (defined(CONFIG_DVB_DRXK_MODULE) \
> diff --git a/drivers/media/dvb/frontends/drxk_hard.c 
> b/drivers/media/dvb/frontends/drxk_hard.c
> index 8fa28bb..ef146ca 100644
> --- a/drivers/media/dvb/frontends/drxk_hard.c
> +++ b/drivers/media/dvb/frontends/drxk_hard.c
> @@ -5415,12 +5415,59 @@ static int GetQAMLockStatus(struct drxk_state *state, 
> u32 *pLockStatus)
>   #define QAM_LOCKRANGE__M      0x10
>   #define QAM_LOCKRANGE_NORMAL  0x10
>   
> +static int QAMDemodulatorCommand(struct drxk_state *state, int 
> numberOfParameters)
> +{
> +     int status;
> +     u16 cmdResult;
> +     u16 setParamParameters[4] = { 0, 0, 0, 0 };
> +
> +     setParamParameters[0] = state->m_Constellation; /* modulation     */
> +     setParamParameters[1] = DRXK_QAM_I12_J17;       /* interleave mode   */
> +
> +     if (numberOfParameters == 2) {
> +             u16 setEnvParameters[1] = { 0 };
> +
> +             if (state->m_OperationMode == OM_QAM_ITU_C)
> +                     setEnvParameters[0] = QAM_TOP_ANNEX_C;
> +             else
> +                     setEnvParameters[0] = QAM_TOP_ANNEX_A;
> +
> +             status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | 
> SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV, 1, setEnvParameters, 1, &cmdResult);
> +             if (status < 0)
> +                     goto error;
> +
> +             status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | 
> SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM,
> +                                  numberOfParameters, setParamParameters, 1, 
> &cmdResult);
> +     } else if (numberOfParameters == 4) {
> +             if (state->m_OperationMode == OM_QAM_ITU_C)
> +                     setParamParameters[2] = QAM_TOP_ANNEX_C;
> +             else
> +                     setParamParameters[2] = QAM_TOP_ANNEX_A;
> +
> +             setParamParameters[3] |= (QAM_MIRROR_AUTO_ON);
> +             /* Env parameters */
> +             /* check for LOCKRANGE Extented */
> +             /* setParamParameters[3] |= QAM_LOCKRANGE_NORMAL; */
> +
> +             status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | 
> SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM,
> +                                  numberOfParameters, setParamParameters, 1, 
> &cmdResult);
> +     } else {
> +             printk(KERN_WARNING "drxk: Unknown QAM demodulator parameter "
> +                     "count %d\n", numberOfParameters);
> +     }
> +
> +error:
> +     if (status < 0)
> +             printk(KERN_WARNING "drxk: Warning %d on %s\n", status, 
> __func__);
> +     return status;
> +}
> +
>   static int SetQAM(struct drxk_state *state, u16 IntermediateFreqkHz,
>                 s32 tunerFreqOffset)
>   {
>       int status;
> -     u16 setParamParameters[4] = { 0, 0, 0, 0 };
>       u16 cmdResult;
> +     int qamDemodParamCount = state->qam_demod_parameter_count;
>   
>       dprintk(1, "\n");
>       /*
> @@ -5472,34 +5519,39 @@ static int SetQAM(struct drxk_state *state, u16 
> IntermediateFreqkHz,
>       }
>       if (status < 0)
>               goto error;
> -     setParamParameters[0] = state->m_Constellation; /* modulation     */
> -     setParamParameters[1] = DRXK_QAM_I12_J17;       /* interleave mode   */
> -     if (state->m_OperationMode == OM_QAM_ITU_C)
> -             setParamParameters[2] = QAM_TOP_ANNEX_C;
> -     else
> -             setParamParameters[2] = QAM_TOP_ANNEX_A;
> -     setParamParameters[3] |= (QAM_MIRROR_AUTO_ON);
> -     /* Env parameters */
> -     /* check for LOCKRANGE Extented */
> -     /* setParamParameters[3] |= QAM_LOCKRANGE_NORMAL; */
>   
> -     status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | 
> SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM, 4, setParamParameters, 1, &cmdResult);
> -     if (status < 0) {
> -             /* Fall-back to the simpler call */
> -             if (state->m_OperationMode == OM_QAM_ITU_C)
> -                     setParamParameters[0] = QAM_TOP_ANNEX_C;
> -             else
> -                     setParamParameters[0] = QAM_TOP_ANNEX_A;
> -             status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | 
> SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV, 1, setParamParameters, 1, &cmdResult);
> -             if (status < 0)
> -                     goto error;
> +     // Use the 4-parameter if it's requested or we're probing for
> +     // the correct command.

Please, don't use C99 comments. They're forbidden at the Linux Kernel.

Also, please check your patches using scripts/checkpatch.pl. It helps
to identify issues like that.

Regards,
Mauro
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to