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 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.