Re: [U-Boot] [RESEND PATCH v3 03/19] dm: device: Allow using uclass_find_device_by_seq() without OF_CONTROL

2018-12-09 Thread Heiko Schocher

Hello Jean-Jacques,

Am 07.12.2018 um 14:50 schrieb Jean-Jacques Hiblot:

If OF_CONTROL is not enabled and DM_SEQ_ALIAS is enabled, we must
assign an alias (requested sequence number) to devices that belongs to a
class with the DM_UC_FLAG_SEQ_ALIAS flag. Otherwise
uclass_find_device_by_seq() cannot be used to get/probe a device. In
particular i2c_get_chip_for_busnum() cannot be used.

Signed-off-by: Jean-Jacques Hiblot 
Reviewed-by: Simon Glass 

---

Changes in v3: None
Changes in v2:
- don't use the DT to find the req_seq number if SPL_OF_PLATDATA is used.
   Instead do it as if SPL_OF_CONTROL is not defined.

  drivers/core/device.c| 10 ++
  drivers/core/uclass.c| 24 
  include/dm/uclass-internal.h | 13 +
  3 files changed, 43 insertions(+), 4 deletions(-)


Thanks for resending!

Reviewed-by: Heiko Schocher 

bye,
Heiko Schocher
--
DENX Software Engineering GmbH,  Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-52   Fax: +49-8142-66989-80   Email: h...@denx.de
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


[U-Boot] [RESEND PATCH v3 03/19] dm: device: Allow using uclass_find_device_by_seq() without OF_CONTROL

2018-12-07 Thread Jean-Jacques Hiblot
If OF_CONTROL is not enabled and DM_SEQ_ALIAS is enabled, we must
assign an alias (requested sequence number) to devices that belongs to a
class with the DM_UC_FLAG_SEQ_ALIAS flag. Otherwise
uclass_find_device_by_seq() cannot be used to get/probe a device. In
particular i2c_get_chip_for_busnum() cannot be used.

Signed-off-by: Jean-Jacques Hiblot 
Reviewed-by: Simon Glass 

---

Changes in v3: None
Changes in v2:
- don't use the DT to find the req_seq number if SPL_OF_PLATDATA is used.
  Instead do it as if SPL_OF_CONTROL is not defined.

 drivers/core/device.c| 10 ++
 drivers/core/uclass.c| 24 
 include/dm/uclass-internal.h | 13 +
 3 files changed, 43 insertions(+), 4 deletions(-)

diff --git a/drivers/core/device.c b/drivers/core/device.c
index 836bcad..0d15e50 100644
--- a/drivers/core/device.c
+++ b/drivers/core/device.c
@@ -70,7 +70,8 @@ static int device_bind_common(struct udevice *parent, const 
struct driver *drv,
 
dev->seq = -1;
dev->req_seq = -1;
-   if (CONFIG_IS_ENABLED(OF_CONTROL) && CONFIG_IS_ENABLED(DM_SEQ_ALIAS)) {
+   if (CONFIG_IS_ENABLED(DM_SEQ_ALIAS) &&
+   (uc->uc_drv->flags & DM_UC_FLAG_SEQ_ALIAS)) {
/*
 * Some devices, such as a SPI bus, I2C bus and serial ports
 * are numbered using aliases.
@@ -78,10 +79,11 @@ static int device_bind_common(struct udevice *parent, const 
struct driver *drv,
 * This is just a 'requested' sequence, and will be
 * resolved (and ->seq updated) when the device is probed.
 */
-   if (uc->uc_drv->flags & DM_UC_FLAG_SEQ_ALIAS) {
-   if (uc->uc_drv->name && ofnode_valid(node)) {
+   if (CONFIG_IS_ENABLED(OF_CONTROL) && 
!CONFIG_IS_ENABLED(OF_PLATDATA)) {
+   if (uc->uc_drv->name && ofnode_valid(node))
dev_read_alias_seq(dev, >req_seq);
-   }
+   } else {
+   dev->req_seq = uclass_find_next_free_req_seq(drv->id);
}
}
 
diff --git a/drivers/core/uclass.c b/drivers/core/uclass.c
index 9766aea..a622f07 100644
--- a/drivers/core/uclass.c
+++ b/drivers/core/uclass.c
@@ -269,6 +269,30 @@ int uclass_find_device_by_name(enum uclass_id id, const 
char *name,
return -ENODEV;
 }
 
+#if !CONFIG_IS_ENABLED(OF_CONTROL) || CONFIG_IS_ENABLED(OF_PLATDATA)
+int uclass_find_next_free_req_seq(enum uclass_id id)
+{
+   struct uclass *uc;
+   struct udevice *dev;
+   int ret;
+   int max = -1;
+
+   ret = uclass_get(id, );
+   if (ret)
+   return ret;
+
+   list_for_each_entry(dev, >dev_head, uclass_node) {
+   if ((dev->req_seq != -1) && (dev->req_seq > max))
+   max = dev->req_seq;
+   }
+
+   if (max == -1)
+   return 0;
+
+   return max + 1;
+}
+#endif
+
 int uclass_find_device_by_seq(enum uclass_id id, int seq_or_req_seq,
  bool find_req_seq, struct udevice **devp)
 {
diff --git a/include/dm/uclass-internal.h b/include/dm/uclass-internal.h
index 8a4839e..6977995 100644
--- a/include/dm/uclass-internal.h
+++ b/include/dm/uclass-internal.h
@@ -12,6 +12,19 @@
 #include 
 
 /**
+ * uclass_find_next_free_req_seq() - Get the next free req_seq number
+ *
+ * This returns the next free req_seq number. This is useful only if
+ * OF_CONTROL is not used. The next free req_seq number is simply the
+ * maximum req_seq of the uclass + 1.
+ * This allows assiging req_seq number in the binding order.
+ *
+ * @id:Id number of the uclass
+ * @return The next free req_seq number
+ */
+int uclass_find_next_free_req_seq(enum uclass_id id);
+
+/**
  * uclass_get_device_tail() - handle the end of a get_device call
  *
  * This handles returning an error or probing a device as needed.
-- 
2.7.4

___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot