From: Chris Bostic <cbos...@linux.vnet.ibm.com>

Enable each link and send a break command, and try to detect a slave by
reading from the SMODE register.

Signed-off-by: Chris Bostic <cbos...@linux.vnet.ibm.com>
Signed-off-by: Joel Stanley <j...@jms.id.au>
---
 drivers/fsi/fsi-core.c | 37 +++++++++++++++++++++++++++++++++++--
 1 file changed, 35 insertions(+), 2 deletions(-)

diff --git a/drivers/fsi/fsi-core.c b/drivers/fsi/fsi-core.c
index 32698ed..6e1cfdf 100644
--- a/drivers/fsi/fsi-core.c
+++ b/drivers/fsi/fsi-core.c
@@ -157,12 +157,45 @@ static int fsi_master_write(struct fsi_master *master, 
int link,
        return master->write(master, link, slave_id, addr, val, size);
 }
 
+static int fsi_master_link_enable(struct fsi_master *master, int link)
+{
+       if (master->link_enable)
+               return master->link_enable(master, link);
+
+       return 0;
+}
+
+/*
+ * Issue a break command on this link
+ */
+static int fsi_master_break(struct fsi_master *master, int link)
+{
+       if (master->send_break)
+               return master->send_break(master, link);
+
+       return 0;
+}
+
 static int fsi_master_scan(struct fsi_master *master)
 {
-       int link;
+       int link, rc;
+
+       for (link = 0; link < master->n_links; link++) {
+               rc = fsi_master_link_enable(master, link);
+               if (rc) {
+                       dev_dbg(&master->dev,
+                               "enable link %d failed: %d\n", link, rc);
+                       continue;
+               }
+               rc = fsi_master_break(master, link);
+               if (rc) {
+                       dev_dbg(&master->dev,
+                               "break to link %d failed: %d\n", link, rc);
+                       continue;
+               }
 
-       for (link = 0; link < master->n_links; link++)
                fsi_slave_init(master, link, 0);
+       }
 
        return 0;
 }
-- 
1.8.2.2

Reply via email to