Re: [PATCH 3/3] radio-tea5761: Update driver

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Balbi,

On Mon, Jun 9, 2008 at 7:40 PM, Felipe Balbi <me@xxxxxxxxxxxxxxx> wrote:
> On Mon, Jun 09, 2008 at 04:05:43PM -0400, Eduardo Valentin wrote:
>> +static void tea5761_set_audout_mode(struct tea5761_device *tea, int audmode)
>>  {
>> -     struct tea5761_regs *r = &tea->regs;
>> -
>> -     if (!(r->tnctrl & TEA5761_TNCTRL_PUPD0)) {
>> -             r->tnctrl &= ~(TEA5761_TNCTRL_AFM | TEA5761_TNCTRL_MU |
>> -                            TEA5761_TNCTRL_HLSI);
>> -             r->testreg |= TEA5761_TESTREG_TRIGFR;
>> -             r->tnctrl |= TEA5761_TNCTRL_PUPD0;
>> -             return tea5761_write_regs(tea);
>> +     struct dvb_frontend *fe = &tea->fe;
>> +     struct dvb_tuner_ops *fe_tuner_ops = &fe->ops.tuner_ops;
>> +     struct analog_parameters params = {
>> +             .mode           = V4L2_TUNER_RADIO,
>> +             .frequency      = tea->freq,
>> +             .audmode        = audmode,
>> +     };
>> +
>> +     if (NULL == fe_tuner_ops->set_analog_params) {
>> +             dev_warn(tea->dev,
>> +                     "Tuner frontend module has no way to set frequency\n");
>> +             return;
>>       }
>> +     if (!fe_tuner_ops->set_analog_params(fe, &params))
>> +             tea->audmode = audmode;
>
> instead of both ifs, how about:
>
>        if (fe_tuner_ops->set_analog_params) {
>                tea->audmode =
>                fe_tuner_ops->set_analog_params(fe, &params) ?
>                        audmode : 0;
>        }
>>  }

I don't know. I personally do not like "silent fail" style. The way you
proposed it will say nothing if set_anolog_params is not set. And that
is a very important part of this code.
>
>> +static void tea5761_mute(struct tea5761_device *tea, int on)
>> +{
>> +     struct dvb_frontend *fe = &tea->fe;
>> +     struct dvb_tuner_ops *fe_tuner_ops = &fe->ops.tuner_ops;
>> +     struct analog_parameters params = {
>> +             .mode           = on ? T_STANDBY : V4L2_TUNER_RADIO,
>> +             .frequency      = tea->freq,
>> +             .audmode        = tea->audmode,
>> +     };
>> +
>> +     if (NULL == fe_tuner_ops->set_analog_params) {
>> +             dev_warn(tea->dev,
>> +                     "Tuner frontend module has no way to set frequency\n");
>> +             return;
>>       }
>> +     if (!fe_tuner_ops->set_analog_params(fe, &params))
>> +             tea->mute = on;
>
> samething here.
same here.
>
>>  }
>
>>  static int tea5761_i2c_driver_probe(struct i2c_client *client,
>> @@ -422,12 +407,24 @@ static int tea5761_i2c_driver_probe(struct i2c_client *client,
>>
>>       mutex_init(&tea->mutex);
>>
>> -     tea->i2c_dev = client;
>> +     /* Tuner attach */
>> +     if (!dvb_attach(tea5761_attach, &tea->fe, client->adapter,
>> +                     client->addr)) {
>> +             dev_err(&client->dev, "Could not attach tuner\n");
>> +             err = -ENODEV;
>> +             goto exit;
>> +     }
>> +
>> +     /* initialize and power off the chip */
>> +     tea5761_power_up(tea);
>> +     tea5761_set_audout_mode(tea, V4L2_TUNER_MODE_STEREO);
>> +     tea5761_mute(tea, 0);
>> +     tea5761_power_down(tea);
>>
>>       /* V4L initialization */
>>       video_dev = video_device_alloc();
>>       if (video_dev == NULL) {
>
>        if (!video_dev)
>
>> -             dev_err(&client->dev, "couldn't allocate memory\n");
>> +             dev_err(&client->dev, "Could not allocate memory\n");
>>               err = -ENOMEM;
>>               goto exit;
>>       }
>> @@ -436,25 +433,15 @@ static int tea5761_i2c_driver_probe(struct i2c_client *client,
>>       *video_dev = tea5761_video_device;
>>       video_dev->dev = &client->dev;
>>       i2c_set_clientdata(client, video_dev);
>> -
>> -     /* initialize and power off the chip */
>> -     tea5761_read_regs(tea);
>> -     tea5761_set_audout_mode(tea, V4L2_TUNER_MODE_STEREO);
>> -     tea5761_mute(tea, 0);
>> -     tea5761_power_down(tea);
>> -
>> -     tea5761.video_dev = video_dev;
>> -     tea5761.i2c_dev = client;
>> +     tea->video_dev = video_dev;
>> +     tea->dev = &client->dev;
>>
>>       err = video_register_device(video_dev, VFL_TYPE_RADIO, radio_nr);
>>       if (err) {
>> -             dev_err(&client->dev, "couldn't register video device\n");
>> +             dev_err(&client->dev, "Could not register video device\n");
>>               goto err_video_alloc;
>>       }
>>
>> -     dev_info(&client->dev, "tea5761 (version %d) detected\n",
>> -             (tea->regs.manid >> 12) & 0xf);
>> -
>>       return 0;
>>
>>  err_video_alloc:
>> @@ -492,7 +479,8 @@ static int __init tea5761_init(void)
>>  {
>>       int res;
>>
>> -     if ((res = i2c_add_driver(&tea5761_driver))) {
>> +     res = i2c_add_driver(&tea5761_driver);
>> +     if (res) {
>>               printk(KERN_ERR DRIVER_NAME ": driver registration failed\n");
>>               return res;
>
> not needed, return i2c_add_driver(&tea5761_driver); is enough as i2c
> subsystem already prints out error messages in case of failed probe.

If I understood correctly what you said, the same comment I said
before also applies here.
Eventhough it prints that the probe
failed, this way I sent it says: The probe failed and "The driver
registration failed". More easy
to debug the code when in a error situation.

>
>>       }
>
> --
> Best Regards,
>
> Felipe Balbi
> me@xxxxxxxxxxxxxxx
> http://blog.felipebalbi.com
>



-- 
Eduardo Bezerra Valentin
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux