From: christopher.lee.bostic@gmail.com (Chris Bostic)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 14/16] drivers/fsi: Add master unscan
Date: Tue, 6 Dec 2016 18:14:35 -0600 [thread overview]
Message-ID: <1481069677-53660-15-git-send-email-christopher.lee.bostic@gmail.com> (raw)
In-Reply-To: <1481069677-53660-1-git-send-email-christopher.lee.bostic@gmail.com>
From: Chris Bostic <cbostic@us.ibm.com>
Allow a master to undo a previous scan. Should a master scan a bus
twice it will need to ensure it doesn't double register any
previously detected device.
Signed-off-by: Chris Bostic <cbostic@us.ibm.com>
---
drivers/fsi/fsi-core.c | 36 +++++++++++++++++++++++++++++++++++-
drivers/fsi/fsi-master.h | 2 ++
include/linux/fsi.h | 1 +
3 files changed, 38 insertions(+), 1 deletion(-)
diff --git a/drivers/fsi/fsi-core.c b/drivers/fsi/fsi-core.c
index a28434b..8ccfe50 100644
--- a/drivers/fsi/fsi-core.c
+++ b/drivers/fsi/fsi-core.c
@@ -41,6 +41,8 @@
static atomic_t master_idx = ATOMIC_INIT(-1);
struct fsi_slave {
+ struct list_head list_link; /* Master's list of slaves */
+ struct list_head my_engines;
struct device dev;
struct fsi_master *master;
int link;
@@ -196,6 +198,8 @@ static int fsi_slave_scan(struct fsi_slave *slave)
uint32_t conf;
int rc, i;
+ INIT_LIST_HEAD(&slave->my_engines);
+
/*
* scan engines
*
@@ -264,7 +268,9 @@ static int fsi_slave_scan(struct fsi_slave *slave)
if (rc) {
dev_warn(&slave->dev, "add failed: %d\n", rc);
put_device(&dev->dev);
+ continue;
}
+ list_add(&dev->link, &slave->my_engines);
}
engine_addr += slots * engine_page_size;
@@ -357,7 +363,7 @@ static int fsi_slave_init(struct fsi_master *master,
put_device(&slave->dev);
return rc;
}
-
+ list_add(&slave->list_link, &master->my_slaves);
fsi_slave_scan(slave);
return 0;
}
@@ -388,6 +394,11 @@ static int fsi_master_scan(struct fsi_master *master)
int link, slave_id, rc;
uint32_t smode;
+ if (!master->slave_list) {
+ INIT_LIST_HEAD(&master->my_slaves);
+ master->slave_list = true;
+ }
+
for (link = 0; link < master->n_links; link++) {
rc = fsi_master_link_enable(master, link);
if (rc) {
@@ -423,9 +434,31 @@ static int fsi_master_scan(struct fsi_master *master)
return 0;
}
+static void fsi_master_unscan(struct fsi_master *master)
+{
+ struct fsi_slave *slave, *slave_tmp;
+ struct fsi_device *fsi_dev, *fsi_dev_tmp;
+
+ if (!master->slave_list)
+ return;
+
+ list_for_each_entry_safe(slave, slave_tmp, &master->my_slaves,
+ list_link) {
+ list_del(&slave->list_link);
+ list_for_each_entry_safe(fsi_dev, fsi_dev_tmp,
+ &slave->my_engines, link) {
+ list_del(&fsi_dev->link);
+ put_device(&fsi_dev->dev);
+ }
+ device_unregister(&slave->dev);
+ }
+ master->slave_list = false;
+}
+
int fsi_master_register(struct fsi_master *master)
{
master->idx = atomic_inc_return(&master_idx);
+ master->slave_list = false;
get_device(master->dev);
fsi_master_scan(master);
return 0;
@@ -434,6 +467,7 @@ int fsi_master_register(struct fsi_master *master)
void fsi_master_unregister(struct fsi_master *master)
{
+ fsi_master_unscan(master);
put_device(master->dev);
}
EXPORT_SYMBOL_GPL(fsi_master_unregister);
diff --git a/drivers/fsi/fsi-master.h b/drivers/fsi/fsi-master.h
index 56aad0e..454af2b 100644
--- a/drivers/fsi/fsi-master.h
+++ b/drivers/fsi/fsi-master.h
@@ -20,6 +20,8 @@
#include <linux/device.h>
struct fsi_master {
+ struct list_head my_slaves;
+ bool slave_list;
struct device *dev;
int idx;
int n_links;
diff --git a/include/linux/fsi.h b/include/linux/fsi.h
index 66bce48..924502b 100644
--- a/include/linux/fsi.h
+++ b/include/linux/fsi.h
@@ -18,6 +18,7 @@
#include <linux/device.h>
struct fsi_device {
+ struct list_head link; /* for slave's list */
struct device dev;
u8 engine_type;
u8 version;
--
1.8.2.2
WARNING: multiple messages have this Message-ID (diff)
From: Chris Bostic <christopher.lee.bostic@gmail.com>
To: robh+dt@kernel.org, mark.rutland@arm.com, linux@armlinux.org.uk,
gregkh@linuxfoundation.org, sre@kernel.org,
mturquette@baylibre.com, geert+renesas@glider.be,
devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org
Cc: Chris Bostic <cbostic@us.ibm.com>,
joel@jms.id.au, jk@ozlabs.org, linux-kernel@vger.kernel.org,
andrew@aj.id.au, alistair@popple.id.au, benh@kernel.crashing.org
Subject: [PATCH 14/16] drivers/fsi: Add master unscan
Date: Tue, 6 Dec 2016 18:14:35 -0600 [thread overview]
Message-ID: <1481069677-53660-15-git-send-email-christopher.lee.bostic@gmail.com> (raw)
In-Reply-To: <1481069677-53660-1-git-send-email-christopher.lee.bostic@gmail.com>
From: Chris Bostic <cbostic@us.ibm.com>
Allow a master to undo a previous scan. Should a master scan a bus
twice it will need to ensure it doesn't double register any
previously detected device.
Signed-off-by: Chris Bostic <cbostic@us.ibm.com>
---
drivers/fsi/fsi-core.c | 36 +++++++++++++++++++++++++++++++++++-
drivers/fsi/fsi-master.h | 2 ++
include/linux/fsi.h | 1 +
3 files changed, 38 insertions(+), 1 deletion(-)
diff --git a/drivers/fsi/fsi-core.c b/drivers/fsi/fsi-core.c
index a28434b..8ccfe50 100644
--- a/drivers/fsi/fsi-core.c
+++ b/drivers/fsi/fsi-core.c
@@ -41,6 +41,8 @@
static atomic_t master_idx = ATOMIC_INIT(-1);
struct fsi_slave {
+ struct list_head list_link; /* Master's list of slaves */
+ struct list_head my_engines;
struct device dev;
struct fsi_master *master;
int link;
@@ -196,6 +198,8 @@ static int fsi_slave_scan(struct fsi_slave *slave)
uint32_t conf;
int rc, i;
+ INIT_LIST_HEAD(&slave->my_engines);
+
/*
* scan engines
*
@@ -264,7 +268,9 @@ static int fsi_slave_scan(struct fsi_slave *slave)
if (rc) {
dev_warn(&slave->dev, "add failed: %d\n", rc);
put_device(&dev->dev);
+ continue;
}
+ list_add(&dev->link, &slave->my_engines);
}
engine_addr += slots * engine_page_size;
@@ -357,7 +363,7 @@ static int fsi_slave_init(struct fsi_master *master,
put_device(&slave->dev);
return rc;
}
-
+ list_add(&slave->list_link, &master->my_slaves);
fsi_slave_scan(slave);
return 0;
}
@@ -388,6 +394,11 @@ static int fsi_master_scan(struct fsi_master *master)
int link, slave_id, rc;
uint32_t smode;
+ if (!master->slave_list) {
+ INIT_LIST_HEAD(&master->my_slaves);
+ master->slave_list = true;
+ }
+
for (link = 0; link < master->n_links; link++) {
rc = fsi_master_link_enable(master, link);
if (rc) {
@@ -423,9 +434,31 @@ static int fsi_master_scan(struct fsi_master *master)
return 0;
}
+static void fsi_master_unscan(struct fsi_master *master)
+{
+ struct fsi_slave *slave, *slave_tmp;
+ struct fsi_device *fsi_dev, *fsi_dev_tmp;
+
+ if (!master->slave_list)
+ return;
+
+ list_for_each_entry_safe(slave, slave_tmp, &master->my_slaves,
+ list_link) {
+ list_del(&slave->list_link);
+ list_for_each_entry_safe(fsi_dev, fsi_dev_tmp,
+ &slave->my_engines, link) {
+ list_del(&fsi_dev->link);
+ put_device(&fsi_dev->dev);
+ }
+ device_unregister(&slave->dev);
+ }
+ master->slave_list = false;
+}
+
int fsi_master_register(struct fsi_master *master)
{
master->idx = atomic_inc_return(&master_idx);
+ master->slave_list = false;
get_device(master->dev);
fsi_master_scan(master);
return 0;
@@ -434,6 +467,7 @@ int fsi_master_register(struct fsi_master *master)
void fsi_master_unregister(struct fsi_master *master)
{
+ fsi_master_unscan(master);
put_device(master->dev);
}
EXPORT_SYMBOL_GPL(fsi_master_unregister);
diff --git a/drivers/fsi/fsi-master.h b/drivers/fsi/fsi-master.h
index 56aad0e..454af2b 100644
--- a/drivers/fsi/fsi-master.h
+++ b/drivers/fsi/fsi-master.h
@@ -20,6 +20,8 @@
#include <linux/device.h>
struct fsi_master {
+ struct list_head my_slaves;
+ bool slave_list;
struct device *dev;
int idx;
int n_links;
diff --git a/include/linux/fsi.h b/include/linux/fsi.h
index 66bce48..924502b 100644
--- a/include/linux/fsi.h
+++ b/include/linux/fsi.h
@@ -18,6 +18,7 @@
#include <linux/device.h>
struct fsi_device {
+ struct list_head link; /* for slave's list */
struct device dev;
u8 engine_type;
u8 version;
--
1.8.2.2
next prev parent reply other threads:[~2016-12-07 0:14 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-07 0:14 [PATCH 00/16] FSI device driver introduction Chris Bostic
2016-12-07 0:14 ` Chris Bostic
2016-12-07 0:14 ` Chris Bostic
2016-12-07 0:14 ` [PATCH 01/16] drivers/fsi: Add empty fsi bus definitions Chris Bostic
2016-12-07 0:14 ` Chris Bostic
2016-12-07 0:14 ` Chris Bostic
2016-12-07 0:14 ` [PATCH 02/16] drivers/fsi: Add device & driver definitions Chris Bostic
2016-12-07 0:14 ` Chris Bostic
2016-12-07 0:14 ` Chris Bostic
2016-12-07 0:14 ` [PATCH 03/16] drivers/fsi: add driver to device matches Chris Bostic
2016-12-07 0:14 ` Chris Bostic
2016-12-07 0:14 ` Chris Bostic
2016-12-07 0:14 ` [PATCH 05/16] drivers/fsi: Add fake master driver Chris Bostic
2016-12-07 0:14 ` Chris Bostic
2016-12-07 12:09 ` Mark Rutland
2016-12-07 12:09 ` Mark Rutland
2016-12-07 12:09 ` Mark Rutland
2016-12-07 23:27 ` Jeremy Kerr
2016-12-07 23:27 ` Jeremy Kerr
2016-12-07 23:27 ` Jeremy Kerr
2016-12-07 0:14 ` [PATCH 06/16] drivers/fsi: Add slave definition Chris Bostic
2016-12-07 0:14 ` Chris Bostic
2016-12-07 0:14 ` [PATCH 07/16] drivers/fsi: Add empty master scan Chris Bostic
2016-12-07 0:14 ` Chris Bostic
2016-12-07 0:14 ` [PATCH 10/16] drivers/fsi: scan slaves & register devices Chris Bostic
2016-12-07 0:14 ` Chris Bostic
2016-12-07 0:14 ` Chris Bostic
2016-12-07 0:14 ` [PATCH 13/16] drivers/fsi: Set slave SMODE to init communication Chris Bostic
2016-12-07 0:14 ` Chris Bostic
2016-12-07 0:14 ` Chris Bostic [this message]
2016-12-07 0:14 ` [PATCH 14/16] drivers/fsi: Add master unscan Chris Bostic
2016-12-07 9:31 ` Greg KH
2016-12-07 9:31 ` Greg KH
2016-12-07 9:31 ` Greg KH
2016-12-07 0:14 ` [PATCH 15/16] drivers/fsi: Add documentation for GPIO bindings Chris Bostic
2016-12-07 0:14 ` Chris Bostic
2016-12-07 12:02 ` Mark Rutland
2016-12-07 12:02 ` Mark Rutland
2016-12-07 0:14 ` [PATCH 16/16] drivers/fsi: Add GPIO based FSI master Chris Bostic
2016-12-07 0:14 ` Chris Bostic
2016-12-09 4:12 ` Jeremy Kerr
2016-12-09 4:12 ` Jeremy Kerr
2016-12-09 4:12 ` Jeremy Kerr
2016-12-12 19:49 ` Christopher Bostic
2016-12-12 19:49 ` Christopher Bostic
2016-12-12 19:49 ` Christopher Bostic
2016-12-07 1:52 ` [PATCH 00/16] FSI device driver introduction Sebastian Reichel
2016-12-07 1:52 ` Sebastian Reichel
2016-12-07 1:52 ` Sebastian Reichel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1481069677-53660-15-git-send-email-christopher.lee.bostic@gmail.com \
--to=christopher.lee.bostic@gmail.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.