devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Eddie James <eajames@linux.ibm.com>
To: linux-fsi@lists.ozlabs.org
Cc: linux-kernel@vger.kernel.org, linux-i2c@vger.kernel.org,
	devicetree@vger.kernel.org, andi.shyti@kernel.org,
	eajames@linux.ibm.com, alistair@popple.id.au, joel@jms.id.au,
	jk@ozlabs.org, robh@kernel.org,
	krzysztof.kozlowski+dt@linaro.org, conor+dt@kernel.org,
	lakshmiy@us.ibmcom
Subject: [PATCH v2 04/31] fsi: Expose master-specific local bus clock divider
Date: Mon, 26 Feb 2024 10:52:54 -0600	[thread overview]
Message-ID: <20240226165321.91976-5-eajames@linux.ibm.com> (raw)
In-Reply-To: <20240226165321.91976-1-eajames@linux.ibm.com>

Instead of a hardcoded local bus clock divider, allow master drivers
to select their local bus clock divider. Also expose master clock
frequencies in the structure. This will allow FSI engine drivers
to set and calculate their bus (I2C, SPI, etc) frequencies.

Signed-off-by: Eddie James <eajames@linux.ibm.com>
---
 drivers/fsi/fsi-core.c       | 27 ++++++++++++++++++++-------
 drivers/fsi/fsi-master-hub.c |  1 +
 drivers/fsi/fsi-master.h     |  2 ++
 drivers/fsi/fsi-slave.h      |  1 +
 include/linux/fsi.h          |  1 +
 5 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/drivers/fsi/fsi-core.c b/drivers/fsi/fsi-core.c
index 8823e8e56dab..9610b5948550 100644
--- a/drivers/fsi/fsi-core.c
+++ b/drivers/fsi/fsi-core.c
@@ -109,6 +109,12 @@ int fsi_device_peek(struct fsi_device *dev, void *val)
 	return fsi_slave_read(dev->slave, addr, val, sizeof(uint32_t));
 }
 
+unsigned long fsi_device_local_bus_frequency(struct fsi_device *dev)
+{
+	return dev->slave->master->clock_frequency / dev->slave->master->lbus_divider;
+}
+EXPORT_SYMBOL_GPL(fsi_device_local_bus_frequency);
+
 static void fsi_device_release(struct device *_device)
 {
 	struct fsi_device *device = to_fsi_dev(_device);
@@ -209,15 +215,15 @@ static inline uint32_t fsi_smode_sid(int x)
 	return (x & FSI_SMODE_SID_MASK) << FSI_SMODE_SID_SHIFT;
 }
 
-static uint32_t fsi_slave_smode(int id, u8 t_senddly, u8 t_echodly)
+static uint32_t fsi_slave_smode(int id, int div, u8 t_senddly, u8 t_echodly)
 {
 	return FSI_SMODE_WSC | FSI_SMODE_ECRC
 		| fsi_smode_sid(id)
 		| fsi_smode_echodly(t_echodly - 1) | fsi_smode_senddly(t_senddly - 1)
-		| fsi_smode_lbcrr(0x8);
+		| fsi_smode_lbcrr(div - 1);
 }
 
-static int fsi_slave_set_smode(struct fsi_slave *slave)
+static int fsi_slave_set_smode(struct fsi_slave *slave, int lbus_divider)
 {
 	uint32_t smode;
 	__be32 data;
@@ -225,7 +231,8 @@ static int fsi_slave_set_smode(struct fsi_slave *slave)
 	/* set our smode register with the slave ID field to 0; this enables
 	 * extended slave addressing
 	 */
-	smode = fsi_slave_smode(slave->id, slave->t_send_delay, slave->t_echo_delay);
+	smode = fsi_slave_smode(slave->id, lbus_divider, slave->t_send_delay,
+				slave->t_echo_delay);
 	data = cpu_to_be32(smode);
 
 	return fsi_master_write(slave->master, slave->link, slave->id,
@@ -281,7 +288,7 @@ static int fsi_slave_handle_error(struct fsi_slave *slave, bool write,
 	slave->t_send_delay = send_delay;
 	slave->t_echo_delay = echo_delay;
 
-	rc = fsi_slave_set_smode(slave);
+	rc = fsi_slave_set_smode(slave, master->lbus_divider);
 	if (rc)
 		return rc;
 
@@ -773,7 +780,7 @@ static ssize_t slave_send_echo_store(struct device *dev,
 	slave->t_send_delay = val;
 	slave->t_echo_delay = val;
 
-	rc = fsi_slave_set_smode(slave);
+	rc = fsi_slave_set_smode(slave, master->lbus_divider);
 	if (rc < 0)
 		return rc;
 	if (master->link_config)
@@ -1028,7 +1035,7 @@ static int fsi_slave_init(struct fsi_master *master, int link, uint8_t id)
 			 "can't set slbus on slave:%02x:%02x %d\n", link, id,
 			 rc);
 
-	rc = fsi_slave_set_smode(slave);
+	rc = fsi_slave_set_smode(slave, master->lbus_divider);
 	if (rc) {
 		dev_warn(&master->dev,
 				"can't set smode on slave:%02x:%02x %d\n",
@@ -1288,6 +1295,12 @@ int fsi_master_register(struct fsi_master *master)
 	if (!dev_name(&master->dev))
 		dev_set_name(&master->dev, "fsi%d", master->idx);
 
+	if (master->flags & FSI_MASTER_FLAG_SWCLOCK)
+		master->clock_frequency = 100000000; // POWER reference clock
+
+	if (!master->lbus_divider)
+		master->lbus_divider = FSI_SMODE_LBCRR_DEFAULT;
+
 	master->dev.class = &fsi_master_class;
 
 	mutex_lock(&master->scan_lock);
diff --git a/drivers/fsi/fsi-master-hub.c b/drivers/fsi/fsi-master-hub.c
index 36da643b3201..111bf7a11458 100644
--- a/drivers/fsi/fsi-master-hub.c
+++ b/drivers/fsi/fsi-master-hub.c
@@ -230,6 +230,7 @@ static int hub_master_probe(struct device *dev)
 	hub->master.dev.release = hub_master_release;
 	hub->master.dev.of_node = of_node_get(dev_of_node(dev));
 
+	hub->master.lbus_divider = 1;
 	hub->master.idx = fsi_dev->slave->link + 1;
 	hub->master.n_links = links;
 	hub->master.read = hub_master_read;
diff --git a/drivers/fsi/fsi-master.h b/drivers/fsi/fsi-master.h
index 967622c1cabf..26e636ad9ef6 100644
--- a/drivers/fsi/fsi-master.h
+++ b/drivers/fsi/fsi-master.h
@@ -120,6 +120,8 @@
 
 struct fsi_master {
 	struct device	dev;
+	unsigned long	clock_frequency;
+	int		lbus_divider;
 	int		idx;
 	int		n_links;
 	int		flags;
diff --git a/drivers/fsi/fsi-slave.h b/drivers/fsi/fsi-slave.h
index dca9db0a42e5..42af2fae0329 100644
--- a/drivers/fsi/fsi-slave.h
+++ b/drivers/fsi/fsi-slave.h
@@ -47,6 +47,7 @@
 #define FSI_SMODE_SD_DEFAULT	 16		/* Default send delay */
 #define FSI_SMODE_LBCRR_SHIFT	8		/* Clk ratio shift */
 #define FSI_SMODE_LBCRR_MASK	0xf		/* Clk ratio mask */
+#define FSI_SMODE_LBCRR_DEFAULT	 8		/* Default clk ratio */
 
 /*
  * SISS fields
diff --git a/include/linux/fsi.h b/include/linux/fsi.h
index 3df8c54868df..e0309bf0ae07 100644
--- a/include/linux/fsi.h
+++ b/include/linux/fsi.h
@@ -24,6 +24,7 @@ extern int fsi_device_read(struct fsi_device *dev, uint32_t addr,
 extern int fsi_device_write(struct fsi_device *dev, uint32_t addr,
 		const void *val, size_t size);
 extern int fsi_device_peek(struct fsi_device *dev, void *val);
+extern unsigned long fsi_device_local_bus_frequency(struct fsi_device *dev);
 
 struct fsi_device_id {
 	u8	engine_type;
-- 
2.39.3


  parent reply	other threads:[~2024-02-26 16:53 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-26 16:52 [PATCH v2 00/31] fsi: Interrupt support Eddie James
2024-02-26 16:52 ` [PATCH v2 01/31] fsi: Move slave definitions to fsi-slave.h Eddie James
2024-02-26 16:52 ` [PATCH v2 02/31] fsi: Improve master indexing Eddie James
2024-02-26 16:52 ` [PATCH v2 03/31] fsi: Use a defined value for default echo delay Eddie James
2024-02-26 16:52 ` Eddie James [this message]
2024-02-26 16:52 ` [PATCH v2 05/31] ARM: dts: aspeed: p10 and tacoma: Set FSI clock frequency Eddie James
2024-02-26 16:52 ` [PATCH v2 06/31] fsi: core: Improve master read/write/error traces Eddie James
2024-02-26 16:52 ` [PATCH v2 07/31] fsi: core: Add slave error trace Eddie James
2024-02-26 16:52 ` [PATCH v2 08/31] dt-bindings: fsi: Add AST2700 compatible Eddie James
2024-02-27  7:14   ` Krzysztof Kozlowski
2024-02-28 15:47   ` Rob Herring
2024-02-26 16:52 ` [PATCH v2 09/31] fsi: aspeed: Add AST2700 support Eddie James
2024-02-26 16:53 ` [PATCH v2 10/31] fsi: core: Add slave spinlock Eddie James
2024-02-26 16:53 ` [PATCH v2 11/31] fsi: core: Allow cfam device type aliases Eddie James
2024-02-26 16:53 ` [PATCH v2 12/31] fsi: core: Add common regmap master functions Eddie James
2024-02-26 16:53 ` [PATCH v2 13/31] fsi: hub: Use common initialization and link enable Eddie James
2024-02-26 16:53 ` [PATCH v2 14/31] fsi: aspeed: " Eddie James
2024-02-26 16:53 ` [PATCH v2 15/31] fsi: aspeed: Remove cfam reset sysfs file in error path and remove Eddie James
2024-02-26 16:53 ` [PATCH v2 16/31] fsi: aspeed: Refactor trace functions Eddie James
2024-02-26 16:53 ` [PATCH v2 17/31] fsi: aspeed: Don't clear all IRQs during OPB transfers Eddie James
2024-02-26 16:53 ` [PATCH v2 18/31] fsi: aspeed: Only read result register for successful read Eddie James
2024-02-26 16:53 ` [PATCH v2 19/31] fsi: aspeed: Switch to spinlock Eddie James
2024-02-26 16:53 ` [PATCH v2 20/31] fsi: aspeed: Disable relative addressing and IPOLL for cfam reset Eddie James
2024-02-26 16:53 ` [PATCH v2 21/31] fsi: aspeed: Use common master error handler Eddie James
2024-02-26 16:53 ` [PATCH v2 22/31] fsi: core: Add interrupt support Eddie James
2024-02-26 16:53 ` [PATCH v2 23/31] fsi: aspeed: " Eddie James
2024-02-26 16:53 ` [PATCH v2 24/31] fsi: hub: " Eddie James
2024-02-26 16:53 ` [PATCH v2 25/31] i2c: fsi: Calculate clock divider from local bus frequency Eddie James
2024-04-15 22:11   ` Andi Shyti
2024-04-16 18:09     ` Eddie James
2024-04-16 21:20       ` Guenter Roeck
2024-04-17 13:50         ` Eddie James
2024-02-26 16:53 ` [PATCH v2 26/31] i2c: fsi: Improve formatting Eddie James
2024-04-15 22:13   ` Andi Shyti
2024-02-26 16:53 ` [PATCH v2 27/31] i2c: fsi: Change fsi_i2c_write_reg to accept data instead of a pointer Eddie James
2024-02-26 16:53 ` [PATCH v2 28/31] i2c: fsi: Remove list structure of ports Eddie James
2024-02-26 16:53 ` [PATCH v2 29/31] i2c: fsi: Define a function to check status error bits Eddie James
2024-02-26 16:53 ` [PATCH v2 30/31] i2c: fsi: Add boolean for skip stop command on abort Eddie James
2024-02-26 16:53 ` [PATCH v2 31/31] i2c: fsi: Add interrupt support Eddie James
2024-02-27 13:44 ` [PATCH v2 00/31] fsi: Interrupt support Rob Herring

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=20240226165321.91976-5-eajames@linux.ibm.com \
    --to=eajames@linux.ibm.com \
    --cc=alistair@popple.id.au \
    --cc=andi.shyti@kernel.org \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=jk@ozlabs.org \
    --cc=joel@jms.id.au \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=lakshmiy@us.ibmcom \
    --cc=linux-fsi@lists.ozlabs.org \
    --cc=linux-i2c@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=robh@kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).