All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH linux dev-5.4 v2 0/2] fsi: Disable link when slave init fails
@ 2020-06-09 21:39 Eddie James
  2020-06-09 21:39 ` [PATCH linux dev-5.4 v2 1/2] fsi: master: Add boolean parameter to link_enable function Eddie James
  2020-06-09 21:39 ` [PATCH linux dev-5.4 v2 2/2] fsi: core: Disable link when slave init fails Eddie James
  0 siblings, 2 replies; 3+ messages in thread
From: Eddie James @ 2020-06-09 21:39 UTC (permalink / raw)
  To: openbmc; +Cc: joel, andrew, Eddie James

This series modifies the link_enable function to accept a boolean parameter to
indicate whether to enable or disable the link. Then, it disables the link when
initialization of the slave fails or if there is no slave on the link.

Changes since v1:
 - Drop the change to remove the read-back after link enable
 - Rework the layout of the boolean handling.
 - Add some detail to commit messages.

Eddie James (2):
  fsi: master: Add boolean parameter to link_enable function
  fsi: core: Disable link when slave init fails

 drivers/fsi/fsi-core.c          | 15 +++++++++++++--
 drivers/fsi/fsi-master-aspeed.c |  7 ++++++-
 drivers/fsi/fsi-master-ast-cf.c |  5 +++--
 drivers/fsi/fsi-master-gpio.c   |  5 +++--
 drivers/fsi/fsi-master-hub.c    |  7 ++++++-
 drivers/fsi/fsi-master.h        |  3 ++-
 6 files changed, 33 insertions(+), 9 deletions(-)

-- 
2.24.0

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH linux dev-5.4 v2 1/2] fsi: master: Add boolean parameter to link_enable function
  2020-06-09 21:39 [PATCH linux dev-5.4 v2 0/2] fsi: Disable link when slave init fails Eddie James
@ 2020-06-09 21:39 ` Eddie James
  2020-06-09 21:39 ` [PATCH linux dev-5.4 v2 2/2] fsi: core: Disable link when slave init fails Eddie James
  1 sibling, 0 replies; 3+ messages in thread
From: Eddie James @ 2020-06-09 21:39 UTC (permalink / raw)
  To: openbmc; +Cc: joel, andrew, Eddie James

Add the ability to disable a link with a boolean parameter to the
link_enable function. This is necessary so that the master can disable
links that it isn't using; for example, links to slaves that fail
initialization.

Signed-off-by: Eddie James <eajames@linux.ibm.com>
---
 drivers/fsi/fsi-core.c          | 2 +-
 drivers/fsi/fsi-master-aspeed.c | 7 ++++++-
 drivers/fsi/fsi-master-ast-cf.c | 5 +++--
 drivers/fsi/fsi-master-gpio.c   | 5 +++--
 drivers/fsi/fsi-master-hub.c    | 7 ++++++-
 drivers/fsi/fsi-master.h        | 3 ++-
 6 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/drivers/fsi/fsi-core.c b/drivers/fsi/fsi-core.c
index 8244da8a7241..0743bba42757 100644
--- a/drivers/fsi/fsi-core.c
+++ b/drivers/fsi/fsi-core.c
@@ -1157,7 +1157,7 @@ static int fsi_master_write(struct fsi_master *master, int link,
 static int fsi_master_link_enable(struct fsi_master *master, int link)
 {
 	if (master->link_enable)
-		return master->link_enable(master, link);
+		return master->link_enable(master, link, true);
 
 	return 0;
 }
diff --git a/drivers/fsi/fsi-master-aspeed.c b/drivers/fsi/fsi-master-aspeed.c
index b44f71f1f0a8..07660dc2bdab 100644
--- a/drivers/fsi/fsi-master-aspeed.c
+++ b/drivers/fsi/fsi-master-aspeed.c
@@ -307,7 +307,8 @@ static int aspeed_master_write(struct fsi_master *master, int link,
 	return 0;
 }
 
-static int aspeed_master_link_enable(struct fsi_master *master, int link)
+static int aspeed_master_link_enable(struct fsi_master *master, int link,
+				     bool enable)
 {
 	struct fsi_master_aspeed *aspeed = to_fsi_master_aspeed(master);
 	int idx, bit, ret;
@@ -318,6 +319,10 @@ static int aspeed_master_link_enable(struct fsi_master *master, int link)
 
 	reg = cpu_to_be32(0x80000000 >> bit);
 
+	if (!enable)
+		return opb_writel(aspeed, ctrl_base + FSI_MCENP0 + (4 * idx),
+				  reg);
+
 	ret = opb_writel(aspeed, ctrl_base + FSI_MSENP0 + (4 * idx), reg);
 	if (ret)
 		return ret;
diff --git a/drivers/fsi/fsi-master-ast-cf.c b/drivers/fsi/fsi-master-ast-cf.c
index 04d10ea8d343..62dcc71a30e6 100644
--- a/drivers/fsi/fsi-master-ast-cf.c
+++ b/drivers/fsi/fsi-master-ast-cf.c
@@ -1039,7 +1039,8 @@ static void fsi_master_acf_setup_external(struct fsi_master_acf *master)
 	gpiod_direction_input(master->gpio_data);
 }
 
-static int fsi_master_acf_link_enable(struct fsi_master *_master, int link)
+static int fsi_master_acf_link_enable(struct fsi_master *_master, int link,
+				      bool enable)
 {
 	struct fsi_master_acf *master = to_fsi_master_acf(_master);
 	int rc = -EBUSY;
@@ -1049,7 +1050,7 @@ static int fsi_master_acf_link_enable(struct fsi_master *_master, int link)
 
 	mutex_lock(&master->lock);
 	if (!master->external_mode) {
-		gpiod_set_value(master->gpio_enable, 1);
+		gpiod_set_value(master->gpio_enable, enable ? 1 : 0);
 		rc = 0;
 	}
 	mutex_unlock(&master->lock);
diff --git a/drivers/fsi/fsi-master-gpio.c b/drivers/fsi/fsi-master-gpio.c
index 4dcce17f243f..aa97c4a250cb 100644
--- a/drivers/fsi/fsi-master-gpio.c
+++ b/drivers/fsi/fsi-master-gpio.c
@@ -678,7 +678,8 @@ static void fsi_master_gpio_init_external(struct fsi_master_gpio *master)
 	gpiod_direction_input(master->gpio_data);
 }
 
-static int fsi_master_gpio_link_enable(struct fsi_master *_master, int link)
+static int fsi_master_gpio_link_enable(struct fsi_master *_master, int link,
+				       bool enable)
 {
 	struct fsi_master_gpio *master = to_fsi_master_gpio(_master);
 	int rc = -EBUSY;
@@ -688,7 +689,7 @@ static int fsi_master_gpio_link_enable(struct fsi_master *_master, int link)
 
 	mutex_lock(&master->cmd_lock);
 	if (!master->external_mode) {
-		gpiod_set_value(master->gpio_enable, 1);
+		gpiod_set_value(master->gpio_enable, enable ? 1 : 0);
 		rc = 0;
 	}
 	mutex_unlock(&master->cmd_lock);
diff --git a/drivers/fsi/fsi-master-hub.c b/drivers/fsi/fsi-master-hub.c
index def35cf92571..1d3cf2da6a16 100644
--- a/drivers/fsi/fsi-master-hub.c
+++ b/drivers/fsi/fsi-master-hub.c
@@ -77,7 +77,8 @@ static int hub_master_break(struct fsi_master *master, int link)
 	return hub_master_write(master, link, 0, addr, &cmd, sizeof(cmd));
 }
 
-static int hub_master_link_enable(struct fsi_master *master, int link)
+static int hub_master_link_enable(struct fsi_master *master, int link,
+				  bool enable)
 {
 	struct fsi_master_hub *hub = to_fsi_master_hub(master);
 	int idx, bit;
@@ -89,6 +90,10 @@ static int hub_master_link_enable(struct fsi_master *master, int link)
 
 	reg = cpu_to_be32(0x80000000 >> bit);
 
+	if (!enable)
+		return fsi_device_write(hub->upstream, FSI_MCENP0 + (4 * idx),
+					&reg, 4);
+
 	rc = fsi_device_write(hub->upstream, FSI_MSENP0 + (4 * idx), &reg, 4);
 
 	mdelay(FSI_LINK_ENABLE_SETUP_TIME);
diff --git a/drivers/fsi/fsi-master.h b/drivers/fsi/fsi-master.h
index 6e8d4d4d5149..cd6bee5e12a7 100644
--- a/drivers/fsi/fsi-master.h
+++ b/drivers/fsi/fsi-master.h
@@ -130,7 +130,8 @@ struct fsi_master {
 				uint32_t addr, const void *val, size_t size);
 	int		(*term)(struct fsi_master *, int link, uint8_t id);
 	int		(*send_break)(struct fsi_master *, int link);
-	int		(*link_enable)(struct fsi_master *, int link);
+	int		(*link_enable)(struct fsi_master *, int link,
+				       bool enable);
 	int		(*link_config)(struct fsi_master *, int link,
 				       u8 t_send_delay, u8 t_echo_delay);
 };
-- 
2.24.0

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH linux dev-5.4 v2 2/2] fsi: core: Disable link when slave init fails
  2020-06-09 21:39 [PATCH linux dev-5.4 v2 0/2] fsi: Disable link when slave init fails Eddie James
  2020-06-09 21:39 ` [PATCH linux dev-5.4 v2 1/2] fsi: master: Add boolean parameter to link_enable function Eddie James
@ 2020-06-09 21:39 ` Eddie James
  1 sibling, 0 replies; 3+ messages in thread
From: Eddie James @ 2020-06-09 21:39 UTC (permalink / raw)
  To: openbmc; +Cc: joel, andrew, Eddie James

In the case that links don't have slaves or fail to be accessed, the
master should disable the link during the scan since it won't be using
the slave.

Signed-off-by: Eddie James <eajames@linux.ibm.com>
---
 drivers/fsi/fsi-core.c | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/drivers/fsi/fsi-core.c b/drivers/fsi/fsi-core.c
index 0743bba42757..c9c3842f6e62 100644
--- a/drivers/fsi/fsi-core.c
+++ b/drivers/fsi/fsi-core.c
@@ -1154,6 +1154,14 @@ static int fsi_master_write(struct fsi_master *master, int link,
 	return rc;
 }
 
+static int fsi_master_link_disable(struct fsi_master *master, int link)
+{
+	if (master->link_enable)
+		return master->link_enable(master, link, false);
+
+	return 0;
+}
+
 static int fsi_master_link_enable(struct fsi_master *master, int link)
 {
 	if (master->link_enable)
@@ -1192,12 +1200,15 @@ static int fsi_master_scan(struct fsi_master *master)
 		}
 		rc = fsi_master_break(master, link);
 		if (rc) {
+			fsi_master_link_disable(master, link);
 			dev_dbg(&master->dev,
 				"break to link %d failed: %d\n", link, rc);
 			continue;
 		}
 
-		fsi_slave_init(master, link, 0);
+		rc = fsi_slave_init(master, link, 0);
+		if (rc)
+			fsi_master_link_disable(master, link);
 	}
 
 	return 0;
-- 
2.24.0

^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-06-09 21:39 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-09 21:39 [PATCH linux dev-5.4 v2 0/2] fsi: Disable link when slave init fails Eddie James
2020-06-09 21:39 ` [PATCH linux dev-5.4 v2 1/2] fsi: master: Add boolean parameter to link_enable function Eddie James
2020-06-09 21:39 ` [PATCH linux dev-5.4 v2 2/2] fsi: core: Disable link when slave init fails Eddie James

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.