All of lore.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.