From: Antti Palosaari <crope@iki.fi>
To: linux-media@vger.kernel.org
Subject: Re: cannot ret error from probe - switch tuner to I2C driver model
Date: Mon, 14 Oct 2013 05:31:25 +0300 [thread overview]
Message-ID: <525B577D.2050105@iki.fi> (raw)
In-Reply-To: <1381709450-14345-1-git-send-email-crope@iki.fi>
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,
>
--
http://palosaari.fi/
next prev parent reply other threads:[~2013-10-14 2:31 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 [this message]
2013-10-15 15:13 ` Antti Palosaari
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=525B577D.2050105@iki.fi \
--to=crope@iki.fi \
--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