public inbox for linux-media@vger.kernel.org
 help / color / mirror / Atom feed
From: Antti Palosaari <crope@iki.fi>
To: linux-media@vger.kernel.org, Jean Delvare <khali@linux-fr.org>
Subject: Re: cannot ret error from probe - switch tuner to I2C driver model
Date: Tue, 15 Oct 2013 18:13:39 +0300	[thread overview]
Message-ID: <525D5BA3.5080406@iki.fi> (raw)
In-Reply-To: <525B577D.2050105@iki.fi>

Jean
could you look that and comment how I should implement it properly.
I saw you also added i2c_new_probed_device() [1] that these TV drivers 
could be ported properly I2C model.

[1] http://lists.lm-sensors.org/pipermail/i2c/2007-March/000990.html

I am pretty sure I have looked and tested all the I2C pieces quite 
carefully. There is .detect() callback which looks just what I need, but 
unfortunately it is nor called in case of i2c_new_probed_device() and 
i2c_new_device().



On 14.10.2013 05:31, Antti Palosaari wrote:
> On 14.10.2013 03:10, Antti Palosaari wrote:
>> kernel: usb 1-2: rtl2832u_tuner_attach:
>> kernel: e4000 5-0064: e4000_probe:
>> kernel: usb 1-2: rtl2832u_tuner_attach: client ptr ffff88030a849000
>>
>> See attached patch.
>>
>> Is there any way to return error to caller?
>>
>> Abuse platform data ptr from struct i2c_board_info and call
>> i2c_unregister_device() ?
>
> Answer to myself: best option seems to be check i2c_get_clientdata()
> pointer after i2c_new_device().
>
> client = i2c_new_device(&d->i2c_adap, &info);
> if (client)
>      if (i2c_get_clientdata(client) == NULL)
>          // OOPS, I2C probe fails
>
> That is because it is set NULL in error case by really_probe() in
> drivers/base/dd.c. Error status is also cleared there with comment:
> /*
>   * Ignore errors returned by ->probe so that the next driver can try
>   * its luck.
>   */
>
> That is told in I2C documentation too:
> Note that starting with kernel 2.6.34, you don't have to set the `data'
> field
> to NULL in remove() or if probe() failed anymore. The i2c-core does this
> automatically on these occasions. Those are also the only times the core
> will
> touch this field.
>
>
>
> But maybe the comment for actual function, i2c_new_device, is still a
> bit misleading as it says NULL is returned for the error. All the other
> errors yes, but not for the I2C .probe() as it is reseted by device core.
>
> * This returns the new i2c client, which may be saved for later use with
>   * i2c_unregister_device(); or NULL to indicate an error.
>   */
> struct i2c_client *
> i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info)
>
>
> regards
> Antti
>
>
>>
>> regards
>> Antti
>>
>> ---
>>   drivers/media/tuners/e4000.c            | 31
>> +++++++++++++++++++++++++++++++
>>   drivers/media/usb/dvb-usb-v2/rtl28xxu.c | 18 ++++++++++++++++--
>>   2 files changed, 47 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/media/tuners/e4000.c b/drivers/media/tuners/e4000.c
>> index 54e2d8a..f4e0567 100644
>> --- a/drivers/media/tuners/e4000.c
>> +++ b/drivers/media/tuners/e4000.c
>> @@ -442,6 +442,37 @@ err:
>>   }
>>   EXPORT_SYMBOL(e4000_attach);
>>
>> +static int e4000_probe(struct i2c_client *client, const struct
>> i2c_device_id *did)
>> +{
>> +    dev_info(&client->dev, "%s:\n", __func__);
>> +    return -ENODEV;
>> +}
>> +
>> +static int e4000_remove(struct i2c_client *client)
>> +{
>> +    dev_info(&client->dev, "%s:\n", __func__);
>> +    return 0;
>> +}
>> +
>> +static const struct i2c_device_id e4000_id[] = {
>> +    {"e4000", 0},
>> +    {}
>> +};
>> +
>> +MODULE_DEVICE_TABLE(i2c, e4000_id);
>> +
>> +static struct i2c_driver e4000_driver = {
>> +    .driver = {
>> +        .owner    = THIS_MODULE,
>> +        .name    = "e4000",
>> +    },
>> +    .probe        = e4000_probe,
>> +    .remove        = e4000_remove,
>> +    .id_table    = e4000_id,
>> +};
>> +
>> +module_i2c_driver(e4000_driver);
>> +
>>   MODULE_DESCRIPTION("Elonics E4000 silicon tuner driver");
>>   MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
>>   MODULE_LICENSE("GPL");
>> diff --git a/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
>> b/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
>> index defc491..fbbe867 100644
>> --- a/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
>> +++ b/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
>> @@ -898,8 +898,22 @@ static int rtl2832u_tuner_attach(struct
>> dvb_usb_adapter *adap)
>>                   adap->fe[0]->ops.tuner_ops.get_rf_strength;
>>           return 0;
>>       case TUNER_RTL2832_E4000:
>> -        fe = dvb_attach(e4000_attach, adap->fe[0], &d->i2c_adap,
>> -                &rtl2832u_e4000_config);
>> +//        fe = dvb_attach(e4000_attach, adap->fe[0], &d->i2c_adap,
>> +//                &rtl2832u_e4000_config);
>> +        {
>> +            static const struct i2c_board_info info = {
>> +                .type = "e4000",
>> +                .addr = 0x64,
>> +            };
>> +            struct i2c_client *client;
>> +
>> +            fe = NULL;
>> +            client = i2c_new_device(&d->i2c_adap, &info);
>> +            if (IS_ERR_OR_NULL(client))
>> +                dev_err(&d->udev->dev, "e4000 probe failed\n");
>> +
>> +            dev_dbg(&d->udev->dev, "%s: client ptr %p\n", __func__,
>> client);
>> +        }
>>           break;
>>       case TUNER_RTL2832_FC2580:
>>           fe = dvb_attach(fc2580_attach, adap->fe[0], &d->i2c_adap,
>>
>
>

Antti


-- 
http://palosaari.fi/

  reply	other threads:[~2013-10-15 15:13 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-10-14  0:10 cannot ret error from probe - switch tuner to I2C driver model Antti Palosaari
2013-10-14  2:31 ` Antti Palosaari
2013-10-15 15:13   ` Antti Palosaari [this message]
2013-10-15 17:11     ` Jean Delvare

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=525D5BA3.5080406@iki.fi \
    --to=crope@iki.fi \
    --cc=khali@linux-fr.org \
    --cc=linux-media@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox