|
@@ -441,11 +441,18 @@ access to other devices. Example of buses include SPI and I2C. Typically
|
|
|
the bus provides some sort of transport or translation that makes it
|
|
|
possible to talk to the devices on the bus.
|
|
|
|
|
|
-Driver model provides a few useful features to help with implementing
|
|
|
-buses. Firstly, a bus can request that its children store some 'parent
|
|
|
-data' which can be used to keep track of child state. Secondly, the bus can
|
|
|
-define methods which are called when a child is probed or removed. This is
|
|
|
-similar to the methods the uclass driver provides.
|
|
|
+Driver model provides some useful features to help with implementing buses.
|
|
|
+Firstly, a bus can request that its children store some 'parent data' which
|
|
|
+can be used to keep track of child state. Secondly, the bus can define
|
|
|
+methods which are called when a child is probed or removed. This is similar
|
|
|
+to the methods the uclass driver provides. Thirdly, per-child platform data
|
|
|
+can be provided to specify things like the child's address on the bus. This
|
|
|
+persists across child probe()/remove() cycles.
|
|
|
+
|
|
|
+For consistency and ease of implementation, the bus uclass can specify the
|
|
|
+per-child platform data, so that it can be the same for all children of buses
|
|
|
+in that uclass. There are also uclass methods which can be called when
|
|
|
+children are bound and probed.
|
|
|
|
|
|
Here an explanation of how a bus fits with a uclass may be useful. Consider
|
|
|
a USB bus with several devices attached to it, each from a different (made
|
|
@@ -460,15 +467,23 @@ Each of the devices is connected to a different address on the USB bus.
|
|
|
The bus device wants to store this address and some other information such
|
|
|
as the bus speed for each device.
|
|
|
|
|
|
-To achieve this, the bus device can use dev->parent_priv in each of its
|
|
|
-three children. This can be auto-allocated if the bus driver has a non-zero
|
|
|
-value for per_child_auto_alloc_size. If not, then the bus device can
|
|
|
-allocate the space itself before the child device is probed.
|
|
|
+To achieve this, the bus device can use dev->parent_platdata in each of its
|
|
|
+three children. This can be auto-allocated if the bus driver (or bus uclass)
|
|
|
+has a non-zero value for per_child_platdata_auto_alloc_size. If not, then
|
|
|
+the bus device or uclass can allocate the space itself before the child
|
|
|
+device is probed.
|
|
|
|
|
|
Also the bus driver can define the child_pre_probe() and child_post_remove()
|
|
|
methods to allow it to do some processing before the child is activated or
|
|
|
after it is deactivated.
|
|
|
|
|
|
+Similarly the bus uclass can define the child_post_bind() method to obtain
|
|
|
+the per-child platform data from the device tree and set it up for the child.
|
|
|
+The bus uclass can also provide a child_pre_probe() method. Very often it is
|
|
|
+the bus uclass that controls these features, since it avoids each driver
|
|
|
+having to do the same processing. Of course the driver can still tweak and
|
|
|
+override these activities.
|
|
|
+
|
|
|
Note that the information that controls this behaviour is in the bus's
|
|
|
driver, not the child's. In fact it is possible that child has no knowledge
|
|
|
that it is connected to a bus. The same child device may even be used on two
|
|
@@ -495,7 +510,8 @@ bus device, regardless of its own views on the matter.
|
|
|
The uclass for the device can also contain data private to that uclass.
|
|
|
But note that each device on the bus may be a memeber of a different
|
|
|
uclass, and this data has nothing to do with the child data for each child
|
|
|
-on the bus.
|
|
|
+on the bus. It is the bus' uclass that controls the child with respect to
|
|
|
+the bus.
|
|
|
|
|
|
|
|
|
Driver Lifecycle
|