Thread (14 messages) 14 messages, 6 authors, 2008-06-30

Re: [i2c] [PATCH] Convert i2c-mpc from a platform driver to an of_platform one

From: Grant Likely <hidden>
Date: 2008-06-29 04:49:40
Also in: linux-i2c

On Sat, Jun 28, 2008 at 10:05:28PM -0400, Jon Smirl wrote:
On 6/25/08, Jean Delvare [off-list ref] wrote:
quoted
 >
 >       i2c->adap = mpc_ops;
 > -     i2c->adap.nr = pdev->id;
 >       i2c_set_adapdata(&i2c->adap, i2c);
 > -     i2c->adap.dev.parent = &pdev->dev;
 > -     if ((result = i2c_add_numbered_adapter(&i2c->adap)) < 0) {
 > +     i2c->adap.dev.parent = &op->dev;
 > +
 > +     result = i2c_add_adapter(&i2c->adap);


The driver was previously using i2c_add_numbered_adapter(), giving MPC
 platform the possibility to use new-style i2c drivers:
 http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=1469fa263870acd890a4b9f6ef557acc5d673b44
 You're breaking this, I doubt it's on purpose?
Grant, what do you want here? You're the one who converted it to
i2c_add_numbered_adapter. But in other posts you've said that the
device tree should have nothing to do with bus numbering.
Yes, I did make that change, but that was when it was a platform bus
driver.  Converting it to an of_platform bus driver entirely changes the
situation and it should go back to using i2c_add_adapter() with a parse
of the device tree for child nodes.
Once this driver is converted to an OF one it shouldn't need bus ids
since all of the i2c devices will be children of the bus node. We can
just let the i2c subsystem assign a bus number.
Exactly.
Timur has some issues with the i2c bus number in his ALSA driver. The
problem is locating the i2c device when the i2s driver loads. Parsing
the device tree to extract an i2c bus and device number is not a good
solution.
The trick here is to store the pointer to the device node inside the
i2c device.  I do this with SPI devices like this:

	/* Store a pointer to the node in the device structure */
	of_node_get(nc);
	spi->dev.archdata.of_node = nc;

Then, when you've got a device_node pointer, you can parse through the
set of registered SPI devices and match against the one that has the
same device node pointer.
codec-handle should give you the i2c device node. But then we can't
use of_find_device_by_node because the i2c device is not an of_device,
it's a cross platform i2c_device. Should of_find_device_by_node()
return a 'struct device' instead of a 'struct of_device' and leave it
as a user exercise to cast up? It is used nine times in the kernel,
mostly sparc.
No, this doesn't work because I2C and SPI devices are not of_platform
devices.  They aren't even platform devices.  of_find_device_by_node()
only works for the of_platform bus.

Using archdata.of_node is part of the device structure and works for
every bus type (platform, of_platform, SPI, I2C, PCI, etc.)

g.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help