From 5a66a8ff86d923367ca9a1f6168e976fbde27391 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Wed, 23 Jul 2014 06:55:12 -0600 Subject: dm: Introduce device sequence numbering In U-Boot it is pretty common to number devices from 0 and access them on the command line using this numbering. While it may come to pass that we will move away from this numbering, the possibility seems remote at present. Given that devices within a uclass will have an implied numbering, it makes sense to build this into driver model as a core feature. The cost is fairly small in terms of code and data space. With each uclass having numbered devices we can ask for SPI port 0 or serial port 1 and receive a single device. Devices typically request a sequence number using aliases in the device tree. These are resolved when the device is probed, to deal with conflicts. Sequence numbers need not be sequential and holes are permitted. At present there is no support for sequence numbers using static platform data. It could easily be added to 'struct driver_info' if needed, but it seems better to add features as we find a use for them, and the use of -1 to mean 'no sequence' makes the default value somewhat painful. Signed-off-by: Simon Glass --- include/dm/uclass.h | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'include/dm/uclass.h') diff --git a/include/dm/uclass.h b/include/dm/uclass.h index afd9923fb3..48ae2420df 100644 --- a/include/dm/uclass.h +++ b/include/dm/uclass.h @@ -105,6 +105,22 @@ int uclass_get(enum uclass_id key, struct uclass **ucp); */ int uclass_get_device(enum uclass_id id, int index, struct udevice **devp); +/** + * uclass_get_device_by_seq() - Get a uclass device based on an ID and sequence + * + * If an active device has this sequence it will be returned. If there is no + * such device then this will check for a device that is requesting this + * sequence. + * + * The device is probed to activate it ready for use. + * + * @id: ID to look up + * @seq: Sequence number to find (0=first) + * @devp: Returns pointer to device (there is only one for each seq) + * @return 0 if OK, -ve on error + */ +int uclass_get_device_by_seq(enum uclass_id id, int seq, struct udevice **devp); + /** * uclass_first_device() - Get the first device in a uclass * @@ -123,6 +139,21 @@ int uclass_first_device(enum uclass_id id, struct udevice **devp); */ int uclass_next_device(struct udevice **devp); +/** + * uclass_resolve_seq() - Resolve a device's sequence number + * + * On entry dev->seq is -1, and dev->req_seq may be -1 (to allocate a + * sequence number automatically, or >= 0 to select a particular number. + * If the requested sequence number is in use, then this device will + * be allocated another one. + * + * Note that the device's seq value is not changed by this function. + * + * @dev: Device for which to allocate sequence number + * @return sequence number allocated, or -ve on error + */ +int uclass_resolve_seq(struct udevice *dev); + /** * uclass_foreach_dev() - Helper function to iteration through devices * -- cgit From f4cdead24a1a0c39c29c04e107c2f98ba61c5da8 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Wed, 23 Jul 2014 06:55:14 -0600 Subject: dm: Allow a device to be found by its FDT offset Each device that was bound from a device tree has an node that caused it to be bound. Add functions that find and return a device based on a device tree offset. Signed-off-by: Simon Glass --- include/dm/uclass.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'include/dm/uclass.h') diff --git a/include/dm/uclass.h b/include/dm/uclass.h index 48ae2420df..0b5ade6d68 100644 --- a/include/dm/uclass.h +++ b/include/dm/uclass.h @@ -121,6 +121,22 @@ int uclass_get_device(enum uclass_id id, int index, struct udevice **devp); */ int uclass_get_device_by_seq(enum uclass_id id, int seq, struct udevice **devp); +/** + * uclass_get_device_by_of_offset() - Get a uclass device by device tree node + * + * This searches the devices in the uclass for one attached to the given + * device tree node. + * + * The device is probed to activate it ready for use. + * + * @id: ID to look up + * @node: Device tree offset to search for (if -ve then -ENODEV is returned) + * @devp: Returns pointer to device (there is only one for each node) + * @return 0 if OK, -ve on error + */ +int uclass_get_device_by_of_offset(enum uclass_id id, int node, + struct udevice **devp); + /** * uclass_first_device() - Get the first device in a uclass * -- cgit From 0040b9442947d00a540f6e93742384a14453c37e Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Wed, 23 Jul 2014 06:55:17 -0600 Subject: dm: Tidy up some header file comments Fix up the style of a few comments and add/clarify a few others. Signed-off-by: Simon Glass --- include/dm/uclass.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'include/dm/uclass.h') diff --git a/include/dm/uclass.h b/include/dm/uclass.h index 0b5ade6d68..8d09ecff7b 100644 --- a/include/dm/uclass.h +++ b/include/dm/uclass.h @@ -98,7 +98,7 @@ int uclass_get(enum uclass_id key, struct uclass **ucp); * * The device is probed to activate it ready for use. * - * id: ID to look up + * @id: ID to look up * @index: Device number within that uclass (0=first) * @devp: Returns pointer to device (there is only one per for each ID) * @return 0 if OK, -ve on error -- cgit