lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20240423-sc18is606-v1-3-094ef37d5a59@bang-olufsen.dk>
Date: Tue, 23 Apr 2024 13:35:32 +0200
From: Alvin Šipraga <alvin@...s.dk>
To: Mark Brown <broonie@...nel.org>, Rob Herring <robh@...nel.org>, 
 Krzysztof Kozlowski <krzysztof.kozlowski+dt@...aro.org>, 
 Conor Dooley <conor+dt@...nel.org>
Cc: linux-spi@...r.kernel.org, devicetree@...r.kernel.org, 
 linux-kernel@...r.kernel.org, 
 Alvin Šipraga <alsi@...g-olufsen.dk>
Subject: [PATCH 3/3] spi: sc18is602: add support for SC18IS606

From: Alvin Šipraga <alsi@...g-olufsen.dk>

Per its datasheet, the SC18IS606 is a functional replacement of the
currently supported SC18IS602B, with the only relevant exceptions to
this driver being an increased data buffer size (1024 vs 200 bytes) and
three (rather than four) chip selects. It also lacks support for
quasi-directional GPIO, but the driver does not use this feature anyway,
so this is not reflected in the changes.

To that end, update the driver to support variable data buffer sizes and
add populate the relevant driver private data fields for this new chip.

Signed-off-by: Alvin Šipraga <alsi@...g-olufsen.dk>
---
 drivers/spi/spi-sc18is602.c | 29 +++++++++++++++++++++++------
 1 file changed, 23 insertions(+), 6 deletions(-)

diff --git a/drivers/spi/spi-sc18is602.c b/drivers/spi/spi-sc18is602.c
index eecf9ea95ae3..c4adfd4af804 100644
--- a/drivers/spi/spi-sc18is602.c
+++ b/drivers/spi/spi-sc18is602.c
@@ -16,9 +16,9 @@
 #include <linux/platform_data/sc18is602.h>
 #include <linux/gpio/consumer.h>
 
-enum chips { sc18is602, sc18is602b, sc18is603 };
+enum chips { sc18is602, sc18is602b, sc18is603, sc18is606 };
 
-#define SC18IS602_BUFSIZ		200
+#define SC18IS602_MAX_BUFSIZ		1024
 #define SC18IS602_CLOCK			7372000
 
 #define SC18IS602_MODE_CPHA		BIT(2)
@@ -35,11 +35,12 @@ struct sc18is602 {
 	u8			ctrl;
 	u32			freq;
 	u32			speed;
+	size_t			bufsiz; /* Data buffer size */
 
 	/* I2C data */
 	struct i2c_client	*client;
 	enum chips		id;
-	u8			buffer[SC18IS602_BUFSIZ + 1];
+	u8			buffer[SC18IS602_MAX_BUFSIZ + 1];
 	int			tlen;	/* Data queued for tx in buffer */
 	int			rindex;	/* Receive data index in buffer */
 
@@ -99,7 +100,7 @@ static int sc18is602_txrx(struct sc18is602 *hw, struct spi_message *msg,
 	}
 
 	if (do_transfer && hw->tlen > 1) {
-		ret = sc18is602_wait_ready(hw, SC18IS602_BUFSIZ);
+		ret = sc18is602_wait_ready(hw, hw->bufsiz);
 		if (ret < 0)
 			return ret;
 		ret = i2c_master_send(hw->client, hw->buffer, hw->tlen);
@@ -173,7 +174,9 @@ static int sc18is602_setup_transfer(struct sc18is602 *hw, u32 hz, u8 mode)
 static int sc18is602_check_transfer(struct spi_device *spi,
 				    struct spi_transfer *t, int tlen)
 {
-	if (t && t->len + tlen > SC18IS602_BUFSIZ + 1)
+	struct sc18is602 *hw = spi_controller_get_devdata(spi->controller);
+
+	if (t && t->len + tlen > hw->bufsiz + 1)
 		return -EINVAL;
 
 	return 0;
@@ -220,7 +223,9 @@ static int sc18is602_transfer_one(struct spi_controller *host,
 
 static size_t sc18is602_max_transfer_size(struct spi_device *spi)
 {
-	return SC18IS602_BUFSIZ;
+	struct sc18is602 *hw = spi_controller_get_devdata(spi->controller);
+
+	return hw->bufsiz;
 }
 
 static int sc18is602_setup(struct spi_device *spi)
@@ -274,10 +279,12 @@ static int sc18is602_probe(struct i2c_client *client)
 	case sc18is602:
 	case sc18is602b:
 		host->num_chipselect = 4;
+		hw->bufsiz = 200;
 		hw->freq = SC18IS602_CLOCK;
 		break;
 	case sc18is603:
 		host->num_chipselect = 2;
+		hw->bufsiz = 200;
 		if (pdata) {
 			hw->freq = pdata->clock_frequency;
 		} else {
@@ -291,6 +298,11 @@ static int sc18is602_probe(struct i2c_client *client)
 		if (!hw->freq)
 			hw->freq = SC18IS602_CLOCK;
 		break;
+	case sc18is606:
+		host->num_chipselect = 3;
+		hw->bufsiz = 1024;
+		hw->freq = SC18IS602_CLOCK;
+		break;
 	}
 	host->bus_num = np ? -1 : client->adapter->nr;
 	host->mode_bits = SPI_CPHA | SPI_CPOL | SPI_LSB_FIRST;
@@ -310,6 +322,7 @@ static const struct i2c_device_id sc18is602_id[] = {
 	{ "sc18is602", sc18is602 },
 	{ "sc18is602b", sc18is602b },
 	{ "sc18is603", sc18is603 },
+	{ "sc18is606", sc18is606 },
 	{ }
 };
 MODULE_DEVICE_TABLE(i2c, sc18is602_id);
@@ -327,6 +340,10 @@ static const struct of_device_id sc18is602_of_match[] __maybe_unused = {
 		.compatible = "nxp,sc18is603",
 		.data = (void *)sc18is603
 	},
+	{
+		.compatible = "nxp,sc18is606",
+		.data = (void *)sc18is606
+	},
 	{ },
 };
 MODULE_DEVICE_TABLE(of, sc18is602_of_match);

-- 
2.44.0


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ