From: Jean Delvare <jdelvare@suse.de>
To: Wolfram Sang <wsa@the-dreams.de>
Cc: Yadi Hu <yadi.hu@windriver.com>, linux-i2c@vger.kernel.org
Subject: Re: [PATCH] i2c-eg20t: use dynamically registered adapter number
Date: Mon, 19 Sep 2016 11:02:47 +0200 [thread overview]
Message-ID: <20160919110247.4e0657fb@endymion> (raw)
In-Reply-To: <20160918192250.GA1415@katana>
Hi Wolfram,
On Sun, 18 Sep 2016 21:22:50 +0200, Wolfram Sang wrote:
>
> > If not, it may make sense to add a helper function exposing
> > __i2c_first_dynamic_bus_num to drivers (something like
> > i2c_is_dynamic_bus_num().) After all, i2c_add_numbered_adapter() mostly
> > makes sense if static i2c device definitions exist. If not,
> > i2c_add_adapter() is just as good. So something like:
> >
> > if (i2c_is_dynamic_bus_num(i))
> > ret = i2c_add_adapter(pch_adap);
> > else {
> > pch_adap->nr = i;
> > ret = i2c_add_numbered_adapter(pch_adap);
> > }
> >
> > may make sense. Unless someone has a better idea.
>
> PASEMI does:
>
> smbus->adapter.nr = PCI_FUNC(dev->devfn);
>
> I am unsure if there is any guarantee in what order PCI_FUNCs are
> probed, yet I have the feeling we could try a little harder to get the
> numbered adapter. What about this (untested, just to get the idea)?
>
> static inline int i2c_add_adapter_try_numbered(struct i2c_adapter *new_adap)
> {
> int ret;
> struct i2c_adapter *old_adap = i2c_get_adapter(new_adap->nr);
>
> if (old_adap && new_adap->nr >= __i2c_first_dynamic_bus_num) {
Note that __i2c_first_dynamic_bus_num is not currently available to
device driver, so your function can't actually be inlined. This is the
reason why I proposed to introduce i2c_is_dynamic_bus_num(). If you
prefer to expose __i2c_first_dynamic_bus_num directly instead, that's
fine with me, but then you probably want to rename it.
> i2c_put_adapter(old_adap);
> dev_dbg(&new_adap->dev, "Static bus number occupied, trying dynamic number\n");
> ret = i2c_add_adapter(new_adap);
> } else {
> ret = i2c_add_numbered_adapter(new_adap);
You may be leaking a reference to old_adap here (if old_adap is set but
new_adap->nr < __i2c_first_dynamic_bus_num.)
> }
>
> return ret;
> }
I'm a bit confused by the logic, it seems unnecessarily complex to me
(but please keep in mind I am working in a noisy environment these days
so maybe it's just me.)
If old_adap is set, i2c_add_numbered_adapter() has no chance of
working. So why are you additionally comparing with
__i2c_first_dynamic_bus_num? For me you should check either, not both.
My own proposal was checking __i2c_first_dynamic_bus_num. To be honest
I can't see the added value of relying on i2c_get_adapter() instead.
Would the result not be exactly the same? Plus it seems racy, just
because i2c_get_adapter() returns NULL at one point in time doesn't
mean the bus numbers will not have been assigned by the time you call
i2c_add_numbered_adapter().
> I used 'static inline' because I think the drivers needing this should
> carry the extra weight. But no major objection to put sth like this also
> into the core. The documentation for this function should carry a big
> note that this is only a workaround and it should not be used directly.
I don't care much where it goes, to be honest.
If you consider it a workaround, what would be the "real fix" for you?
I was wondering if selecting one of these drivers could set a Kconfig
option to initialize __i2c_first_dynamic_bus_num to a non-zero value.
Unfortunately there does not seem to be a way to set a numeric value to
a Kconfig option using select. We would have to do it indirectly as
with CONFIG_HZ:
choice
default I2C_RESERVED_BUS_NR_0
config I2C_RESERVED_BUS_NR_0
config I2C_RESERVED_BUS_NR_2
endchoice
config I2C_RESERVED_BUS_NR
int
default 0 if I2C_RESERVED_BUS_NR_0
default 2 if I2C_RESERVED_BUS_NR_2
config I2C_EG20T
tristate "Intel EG20T PCH/LAPIS Semicon IOH(ML7213/ML7223/ML7831) I2C"
depends on PCI && (X86_32 || MIPS || COMPILE_TEST)
select I2C_RESERVED_BUS_NR_2
And in i2c-core.c:
__i2c_first_dynamic_bus_num = I2C_RESERVED_BUS_NR;
If that's possible at all... I'm not sure if select works on choice
config options.
Alternatively we could set the default directly based on driver
selection:
config I2C_RESERVED_BUS_NR
int
default 0
default 2 if I2C_EG20T
This is more simple but a little harder to maintain. One possible
problem is if the number of buses isn't known at build time but could
change depending on the hardware, for example. Also I don't know if
more than one such driver can be included in the same kernel.
Or we can make it a user-visible option and leave it on whoever
configures the kernel to get it right. In all cases it would move the
decision to build-time instead of being set dynamically at run-time.
Note that I am not claiming this is necessarily better than my initial
proposal. I just wanted to mention the possibility.
--
Jean Delvare
SUSE L3 Support
next prev parent reply other threads:[~2016-09-19 9:02 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-08-23 9:05 [PATCH] i2c-eg20t: use dynamically registered adapter number Yadi Hu
2016-08-26 15:30 ` Jean Delvare
2016-09-02 9:44 ` Yadi
2016-09-17 21:49 ` Wolfram Sang
2016-09-19 3:25 ` Yadi
2016-09-19 6:44 ` Wolfram Sang
2016-09-18 19:22 ` Wolfram Sang
2016-09-19 9:02 ` Jean Delvare [this message]
2016-09-20 15:48 ` Jean Delvare
-- strict thread matches above, loose matches on Subject: below --
2016-08-23 8:55 Yadi Hu
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=20160919110247.4e0657fb@endymion \
--to=jdelvare@suse.de \
--cc=linux-i2c@vger.kernel.org \
--cc=wsa@the-dreams.de \
--cc=yadi.hu@windriver.com \
/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.