Linux Audio

Check our new training course

Linux debugging, profiling, tracing and performance analysis training

Mar 24-27, 2025, special US time zones
Register
Loading...
v5.9
  1// SPDX-License-Identifier: GPL-2.0-or-later
  2// Copyright (C) IBM Corporation 2020
  3
  4#include <linux/bitfield.h>
  5#include <linux/bits.h>
  6#include <linux/fsi.h>
  7#include <linux/jiffies.h>
  8#include <linux/kernel.h>
  9#include <linux/module.h>
 10#include <linux/of.h>
 11#include <linux/spi/spi.h>
 12
 13#define FSI_ENGID_SPI			0x23
 14#define FSI_MBOX_ROOT_CTRL_8		0x2860
 
 15
 16#define FSI2SPI_DATA0			0x00
 17#define FSI2SPI_DATA1			0x04
 18#define FSI2SPI_CMD			0x08
 19#define  FSI2SPI_CMD_WRITE		 BIT(31)
 20#define FSI2SPI_RESET			0x18
 21#define FSI2SPI_STATUS			0x1c
 22#define  FSI2SPI_STATUS_ANY_ERROR	 BIT(31)
 23#define FSI2SPI_IRQ			0x20
 24
 25#define SPI_FSI_BASE			0x70000
 26#define SPI_FSI_INIT_TIMEOUT_MS		1000
 27#define SPI_FSI_MAX_TRANSFER_SIZE	2048
 
 28
 29#define SPI_FSI_ERROR			0x0
 30#define SPI_FSI_COUNTER_CFG		0x1
 31#define  SPI_FSI_COUNTER_CFG_LOOPS(x)	 (((u64)(x) & 0xffULL) << 32)
 32#define SPI_FSI_CFG1			0x2
 33#define SPI_FSI_CLOCK_CFG		0x3
 34#define  SPI_FSI_CLOCK_CFG_MM_ENABLE	 BIT_ULL(32)
 35#define  SPI_FSI_CLOCK_CFG_ECC_DISABLE	 (BIT_ULL(35) | BIT_ULL(33))
 36#define  SPI_FSI_CLOCK_CFG_RESET1	 (BIT_ULL(36) | BIT_ULL(38))
 37#define  SPI_FSI_CLOCK_CFG_RESET2	 (BIT_ULL(37) | BIT_ULL(39))
 38#define  SPI_FSI_CLOCK_CFG_MODE		 (BIT_ULL(41) | BIT_ULL(42))
 39#define  SPI_FSI_CLOCK_CFG_SCK_RECV_DEL	 GENMASK_ULL(51, 44)
 40#define   SPI_FSI_CLOCK_CFG_SCK_NO_DEL	  BIT_ULL(51)
 41#define  SPI_FSI_CLOCK_CFG_SCK_DIV	 GENMASK_ULL(63, 52)
 42#define SPI_FSI_MMAP			0x4
 43#define SPI_FSI_DATA_TX			0x5
 44#define SPI_FSI_DATA_RX			0x6
 45#define SPI_FSI_SEQUENCE		0x7
 46#define  SPI_FSI_SEQUENCE_STOP		 0x00
 47#define  SPI_FSI_SEQUENCE_SEL_SLAVE(x)	 (0x10 | ((x) & 0xf))
 48#define  SPI_FSI_SEQUENCE_SHIFT_OUT(x)	 (0x30 | ((x) & 0xf))
 49#define  SPI_FSI_SEQUENCE_SHIFT_IN(x)	 (0x40 | ((x) & 0xf))
 50#define  SPI_FSI_SEQUENCE_COPY_DATA_TX	 0xc0
 51#define  SPI_FSI_SEQUENCE_BRANCH(x)	 (0xe0 | ((x) & 0xf))
 52#define SPI_FSI_STATUS			0x8
 53#define  SPI_FSI_STATUS_ERROR		 \
 54	(GENMASK_ULL(31, 21) | GENMASK_ULL(15, 12))
 55#define  SPI_FSI_STATUS_SEQ_STATE	 GENMASK_ULL(55, 48)
 56#define   SPI_FSI_STATUS_SEQ_STATE_IDLE	  BIT_ULL(48)
 57#define  SPI_FSI_STATUS_TDR_UNDERRUN	 BIT_ULL(57)
 58#define  SPI_FSI_STATUS_TDR_OVERRUN	 BIT_ULL(58)
 59#define  SPI_FSI_STATUS_TDR_FULL	 BIT_ULL(59)
 60#define  SPI_FSI_STATUS_RDR_UNDERRUN	 BIT_ULL(61)
 61#define  SPI_FSI_STATUS_RDR_OVERRUN	 BIT_ULL(62)
 62#define  SPI_FSI_STATUS_RDR_FULL	 BIT_ULL(63)
 63#define  SPI_FSI_STATUS_ANY_ERROR	 \
 64	(SPI_FSI_STATUS_ERROR | SPI_FSI_STATUS_TDR_UNDERRUN | \
 65	 SPI_FSI_STATUS_TDR_OVERRUN | SPI_FSI_STATUS_RDR_UNDERRUN | \
 66	 SPI_FSI_STATUS_RDR_OVERRUN)
 67#define SPI_FSI_PORT_CTRL		0x9
 68
 69struct fsi_spi {
 70	struct device *dev;	/* SPI controller device */
 71	struct fsi_device *fsi;	/* FSI2SPI CFAM engine device */
 72	u32 base;
 73};
 74
 75struct fsi_spi_sequence {
 76	int bit;
 77	u64 data;
 78};
 79
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 80static int fsi_spi_check_status(struct fsi_spi *ctx)
 81{
 82	int rc;
 83	u32 sts;
 84	__be32 sts_be;
 85
 86	rc = fsi_device_read(ctx->fsi, FSI2SPI_STATUS, &sts_be,
 87			     sizeof(sts_be));
 88	if (rc)
 89		return rc;
 90
 91	sts = be32_to_cpu(sts_be);
 92	if (sts & FSI2SPI_STATUS_ANY_ERROR) {
 93		dev_err(ctx->dev, "Error with FSI2SPI interface: %08x.\n", sts);
 94		return -EIO;
 95	}
 96
 97	return 0;
 98}
 99
100static int fsi_spi_read_reg(struct fsi_spi *ctx, u32 offset, u64 *value)
101{
102	int rc;
103	__be32 cmd_be;
104	__be32 data_be;
105	u32 cmd = offset + ctx->base;
106
107	*value = 0ULL;
108
109	if (cmd & FSI2SPI_CMD_WRITE)
110		return -EINVAL;
111
112	cmd_be = cpu_to_be32(cmd);
113	rc = fsi_device_write(ctx->fsi, FSI2SPI_CMD, &cmd_be, sizeof(cmd_be));
114	if (rc)
115		return rc;
116
117	rc = fsi_spi_check_status(ctx);
118	if (rc)
119		return rc;
120
121	rc = fsi_device_read(ctx->fsi, FSI2SPI_DATA0, &data_be,
122			     sizeof(data_be));
123	if (rc)
124		return rc;
125
126	*value |= (u64)be32_to_cpu(data_be) << 32;
127
128	rc = fsi_device_read(ctx->fsi, FSI2SPI_DATA1, &data_be,
129			     sizeof(data_be));
130	if (rc)
131		return rc;
132
133	*value |= (u64)be32_to_cpu(data_be);
134	dev_dbg(ctx->dev, "Read %02x[%016llx].\n", offset, *value);
135
136	return 0;
137}
138
139static int fsi_spi_write_reg(struct fsi_spi *ctx, u32 offset, u64 value)
140{
141	int rc;
142	__be32 cmd_be;
143	__be32 data_be;
144	u32 cmd = offset + ctx->base;
145
146	if (cmd & FSI2SPI_CMD_WRITE)
147		return -EINVAL;
148
149	dev_dbg(ctx->dev, "Write %02x[%016llx].\n", offset, value);
150
151	data_be = cpu_to_be32(upper_32_bits(value));
152	rc = fsi_device_write(ctx->fsi, FSI2SPI_DATA0, &data_be,
153			      sizeof(data_be));
154	if (rc)
155		return rc;
156
157	data_be = cpu_to_be32(lower_32_bits(value));
158	rc = fsi_device_write(ctx->fsi, FSI2SPI_DATA1, &data_be,
159			      sizeof(data_be));
160	if (rc)
161		return rc;
162
163	cmd_be = cpu_to_be32(cmd | FSI2SPI_CMD_WRITE);
164	rc = fsi_device_write(ctx->fsi, FSI2SPI_CMD, &cmd_be, sizeof(cmd_be));
165	if (rc)
166		return rc;
167
168	return fsi_spi_check_status(ctx);
169}
170
171static int fsi_spi_data_in(u64 in, u8 *rx, int len)
172{
173	int i;
174	int num_bytes = min(len, 8);
175
176	for (i = 0; i < num_bytes; ++i)
177		rx[i] = (u8)(in >> (8 * ((num_bytes - 1) - i)));
178
179	return num_bytes;
180}
181
182static int fsi_spi_data_out(u64 *out, const u8 *tx, int len)
183{
184	int i;
185	int num_bytes = min(len, 8);
186	u8 *out_bytes = (u8 *)out;
187
188	/* Unused bytes of the tx data should be 0. */
189	*out = 0ULL;
190
191	for (i = 0; i < num_bytes; ++i)
192		out_bytes[8 - (i + 1)] = tx[i];
193
194	return num_bytes;
195}
196
197static int fsi_spi_reset(struct fsi_spi *ctx)
198{
199	int rc;
200
201	dev_dbg(ctx->dev, "Resetting SPI controller.\n");
202
203	rc = fsi_spi_write_reg(ctx, SPI_FSI_CLOCK_CFG,
204			       SPI_FSI_CLOCK_CFG_RESET1);
205	if (rc)
206		return rc;
207
208	return fsi_spi_write_reg(ctx, SPI_FSI_CLOCK_CFG,
209				 SPI_FSI_CLOCK_CFG_RESET2);
 
 
 
 
210}
211
212static int fsi_spi_sequence_add(struct fsi_spi_sequence *seq, u8 val)
213{
214	/*
215	 * Add the next byte of instruction to the 8-byte sequence register.
216	 * Then decrement the counter so that the next instruction will go in
217	 * the right place. Return the number of "slots" left in the sequence
218	 * register.
219	 */
220	seq->data |= (u64)val << seq->bit;
221	seq->bit -= 8;
222
223	return ((64 - seq->bit) / 8) - 2;
224}
225
226static void fsi_spi_sequence_init(struct fsi_spi_sequence *seq)
227{
228	seq->bit = 56;
229	seq->data = 0ULL;
230}
231
232static int fsi_spi_sequence_transfer(struct fsi_spi *ctx,
233				     struct fsi_spi_sequence *seq,
234				     struct spi_transfer *transfer)
235{
236	int loops;
237	int idx;
238	int rc;
239	u8 len = min(transfer->len, 8U);
240	u8 rem = transfer->len % len;
241
242	loops = transfer->len / len;
243
244	if (transfer->tx_buf) {
245		idx = fsi_spi_sequence_add(seq,
246					   SPI_FSI_SEQUENCE_SHIFT_OUT(len));
247		if (rem)
248			rem = SPI_FSI_SEQUENCE_SHIFT_OUT(rem);
249	} else if (transfer->rx_buf) {
250		idx = fsi_spi_sequence_add(seq,
251					   SPI_FSI_SEQUENCE_SHIFT_IN(len));
252		if (rem)
253			rem = SPI_FSI_SEQUENCE_SHIFT_IN(rem);
254	} else {
255		return -EINVAL;
256	}
257
258	if (loops > 1) {
259		fsi_spi_sequence_add(seq, SPI_FSI_SEQUENCE_BRANCH(idx));
260
261		if (rem)
262			fsi_spi_sequence_add(seq, rem);
263
264		rc = fsi_spi_write_reg(ctx, SPI_FSI_COUNTER_CFG,
265				       SPI_FSI_COUNTER_CFG_LOOPS(loops - 1));
266		if (rc)
267			return rc;
268	}
269
270	return 0;
271}
272
273static int fsi_spi_transfer_data(struct fsi_spi *ctx,
274				 struct spi_transfer *transfer)
275{
276	int rc = 0;
277	u64 status = 0ULL;
278
279	if (transfer->tx_buf) {
280		int nb;
281		int sent = 0;
282		u64 out = 0ULL;
283		const u8 *tx = transfer->tx_buf;
284
285		while (transfer->len > sent) {
286			nb = fsi_spi_data_out(&out, &tx[sent],
287					      (int)transfer->len - sent);
288
289			rc = fsi_spi_write_reg(ctx, SPI_FSI_DATA_TX, out);
290			if (rc)
291				return rc;
292
293			do {
294				rc = fsi_spi_read_reg(ctx, SPI_FSI_STATUS,
295						      &status);
296				if (rc)
297					return rc;
298
299				if (status & SPI_FSI_STATUS_ANY_ERROR) {
300					rc = fsi_spi_reset(ctx);
301					if (rc)
302						return rc;
303
304					return -EREMOTEIO;
305				}
306			} while (status & SPI_FSI_STATUS_TDR_FULL);
307
308			sent += nb;
309		}
310	} else if (transfer->rx_buf) {
311		int recv = 0;
312		u64 in = 0ULL;
313		u8 *rx = transfer->rx_buf;
314
315		while (transfer->len > recv) {
316			do {
317				rc = fsi_spi_read_reg(ctx, SPI_FSI_STATUS,
318						      &status);
319				if (rc)
320					return rc;
321
322				if (status & SPI_FSI_STATUS_ANY_ERROR) {
323					rc = fsi_spi_reset(ctx);
324					if (rc)
325						return rc;
326
327					return -EREMOTEIO;
328				}
329			} while (!(status & SPI_FSI_STATUS_RDR_FULL));
330
331			rc = fsi_spi_read_reg(ctx, SPI_FSI_DATA_RX, &in);
332			if (rc)
333				return rc;
334
335			recv += fsi_spi_data_in(in, &rx[recv],
336						(int)transfer->len - recv);
337		}
338	}
339
340	return 0;
341}
342
343static int fsi_spi_transfer_init(struct fsi_spi *ctx)
344{
345	int rc;
346	bool reset = false;
347	unsigned long end;
348	u64 seq_state;
349	u64 clock_cfg = 0ULL;
350	u64 status = 0ULL;
351	u64 wanted_clock_cfg = SPI_FSI_CLOCK_CFG_ECC_DISABLE |
352		SPI_FSI_CLOCK_CFG_SCK_NO_DEL |
353		FIELD_PREP(SPI_FSI_CLOCK_CFG_SCK_DIV, 4);
354
355	end = jiffies + msecs_to_jiffies(SPI_FSI_INIT_TIMEOUT_MS);
356	do {
357		if (time_after(jiffies, end))
358			return -ETIMEDOUT;
359
360		rc = fsi_spi_read_reg(ctx, SPI_FSI_STATUS, &status);
361		if (rc)
362			return rc;
363
364		seq_state = status & SPI_FSI_STATUS_SEQ_STATE;
365
366		if (status & (SPI_FSI_STATUS_ANY_ERROR |
367			      SPI_FSI_STATUS_TDR_FULL |
368			      SPI_FSI_STATUS_RDR_FULL)) {
369			if (reset)
370				return -EIO;
371
372			rc = fsi_spi_reset(ctx);
373			if (rc)
374				return rc;
375
376			reset = true;
377			continue;
378		}
379	} while (seq_state && (seq_state != SPI_FSI_STATUS_SEQ_STATE_IDLE));
380
 
 
 
 
381	rc = fsi_spi_read_reg(ctx, SPI_FSI_CLOCK_CFG, &clock_cfg);
382	if (rc)
383		return rc;
384
385	if ((clock_cfg & (SPI_FSI_CLOCK_CFG_MM_ENABLE |
386			  SPI_FSI_CLOCK_CFG_ECC_DISABLE |
387			  SPI_FSI_CLOCK_CFG_MODE |
388			  SPI_FSI_CLOCK_CFG_SCK_RECV_DEL |
389			  SPI_FSI_CLOCK_CFG_SCK_DIV)) != wanted_clock_cfg)
390		rc = fsi_spi_write_reg(ctx, SPI_FSI_CLOCK_CFG,
391				       wanted_clock_cfg);
392
393	return rc;
394}
395
396static int fsi_spi_transfer_one_message(struct spi_controller *ctlr,
397					struct spi_message *mesg)
398{
399	int rc = 0;
400	u8 seq_slave = SPI_FSI_SEQUENCE_SEL_SLAVE(mesg->spi->chip_select + 1);
 
401	struct spi_transfer *transfer;
402	struct fsi_spi *ctx = spi_controller_get_devdata(ctlr);
403
 
 
 
 
404	list_for_each_entry(transfer, &mesg->transfers, transfer_list) {
405		struct fsi_spi_sequence seq;
406		struct spi_transfer *next = NULL;
407
408		/* Sequencer must do shift out (tx) first. */
409		if (!transfer->tx_buf ||
410		    transfer->len > SPI_FSI_MAX_TRANSFER_SIZE) {
411			rc = -EINVAL;
412			goto error;
413		}
414
415		dev_dbg(ctx->dev, "Start tx of %d bytes.\n", transfer->len);
416
417		rc = fsi_spi_transfer_init(ctx);
418		if (rc < 0)
419			goto error;
420
421		fsi_spi_sequence_init(&seq);
422		fsi_spi_sequence_add(&seq, seq_slave);
423
424		rc = fsi_spi_sequence_transfer(ctx, &seq, transfer);
425		if (rc)
426			goto error;
 
 
 
 
427
428		if (!list_is_last(&transfer->transfer_list,
429				  &mesg->transfers)) {
430			next = list_next_entry(transfer, transfer_list);
431
432			/* Sequencer can only do shift in (rx) after tx. */
433			if (next->rx_buf) {
434				if (next->len > SPI_FSI_MAX_TRANSFER_SIZE) {
 
 
435					rc = -EINVAL;
436					goto error;
437				}
438
439				dev_dbg(ctx->dev, "Sequence rx of %d bytes.\n",
440					next->len);
441
442				rc = fsi_spi_sequence_transfer(ctx, &seq,
443							       next);
444				if (rc)
445					goto error;
446			} else {
447				next = NULL;
448			}
449		}
450
451		fsi_spi_sequence_add(&seq, SPI_FSI_SEQUENCE_SEL_SLAVE(0));
452
453		rc = fsi_spi_write_reg(ctx, SPI_FSI_SEQUENCE, seq.data);
454		if (rc)
455			goto error;
456
457		rc = fsi_spi_transfer_data(ctx, transfer);
458		if (rc)
459			goto error;
460
461		if (next) {
462			rc = fsi_spi_transfer_data(ctx, next);
463			if (rc)
464				goto error;
465
466			transfer = next;
467		}
468	}
469
470error:
471	mesg->status = rc;
472	spi_finalize_current_message(ctlr);
473
474	return rc;
475}
476
477static size_t fsi_spi_max_transfer_size(struct spi_device *spi)
478{
479	return SPI_FSI_MAX_TRANSFER_SIZE;
480}
481
482static int fsi_spi_probe(struct device *dev)
483{
484	int rc;
485	u32 root_ctrl_8;
486	struct device_node *np;
487	int num_controllers_registered = 0;
488	struct fsi_device *fsi = to_fsi_dev(dev);
489
490	/*
491	 * Check the SPI mux before attempting to probe. If the mux isn't set
492	 * then the SPI controllers can't access their slave devices.
493	 */
494	rc = fsi_slave_read(fsi->slave, FSI_MBOX_ROOT_CTRL_8, &root_ctrl_8,
495			    sizeof(root_ctrl_8));
496	if (rc)
497		return rc;
498
499	if (!root_ctrl_8) {
500		dev_dbg(dev, "SPI mux not set, aborting probe.\n");
501		return -ENODEV;
502	}
503
504	for_each_available_child_of_node(dev->of_node, np) {
505		u32 base;
506		struct fsi_spi *ctx;
507		struct spi_controller *ctlr;
508
509		if (of_property_read_u32(np, "reg", &base))
510			continue;
511
512		ctlr = spi_alloc_master(dev, sizeof(*ctx));
513		if (!ctlr)
 
514			break;
 
515
516		ctlr->dev.of_node = np;
517		ctlr->num_chipselect = of_get_available_child_count(np) ?: 1;
518		ctlr->flags = SPI_CONTROLLER_HALF_DUPLEX;
519		ctlr->max_transfer_size = fsi_spi_max_transfer_size;
520		ctlr->transfer_one_message = fsi_spi_transfer_one_message;
521
522		ctx = spi_controller_get_devdata(ctlr);
523		ctx->dev = &ctlr->dev;
524		ctx->fsi = fsi;
525		ctx->base = base + SPI_FSI_BASE;
526
527		rc = devm_spi_register_controller(dev, ctlr);
528		if (rc)
529			spi_controller_put(ctlr);
530		else
531			num_controllers_registered++;
532	}
533
534	if (!num_controllers_registered)
535		return -ENODEV;
536
537	return 0;
538}
539
540static const struct fsi_device_id fsi_spi_ids[] = {
541	{ FSI_ENGID_SPI, FSI_VERSION_ANY },
542	{ }
543};
544MODULE_DEVICE_TABLE(fsi, fsi_spi_ids);
545
546static struct fsi_driver fsi_spi_driver = {
547	.id_table = fsi_spi_ids,
548	.drv = {
549		.name = "spi-fsi",
550		.bus = &fsi_bus_type,
551		.probe = fsi_spi_probe,
552	},
553};
554module_fsi_driver(fsi_spi_driver);
555
556MODULE_AUTHOR("Eddie James <eajames@linux.ibm.com>");
557MODULE_DESCRIPTION("FSI attached SPI controller");
558MODULE_LICENSE("GPL");
v5.14.15
  1// SPDX-License-Identifier: GPL-2.0-or-later
  2// Copyright (C) IBM Corporation 2020
  3
  4#include <linux/bitfield.h>
  5#include <linux/bits.h>
  6#include <linux/fsi.h>
  7#include <linux/jiffies.h>
  8#include <linux/kernel.h>
  9#include <linux/module.h>
 10#include <linux/of.h>
 11#include <linux/spi/spi.h>
 12
 13#define FSI_ENGID_SPI			0x23
 14#define FSI_MBOX_ROOT_CTRL_8		0x2860
 15#define  FSI_MBOX_ROOT_CTRL_8_SPI_MUX	 0xf0000000
 16
 17#define FSI2SPI_DATA0			0x00
 18#define FSI2SPI_DATA1			0x04
 19#define FSI2SPI_CMD			0x08
 20#define  FSI2SPI_CMD_WRITE		 BIT(31)
 21#define FSI2SPI_RESET			0x18
 22#define FSI2SPI_STATUS			0x1c
 23#define  FSI2SPI_STATUS_ANY_ERROR	 BIT(31)
 24#define FSI2SPI_IRQ			0x20
 25
 26#define SPI_FSI_BASE			0x70000
 27#define SPI_FSI_INIT_TIMEOUT_MS		1000
 28#define SPI_FSI_MAX_RX_SIZE		8
 29#define SPI_FSI_MAX_TX_SIZE		40
 30
 31#define SPI_FSI_ERROR			0x0
 32#define SPI_FSI_COUNTER_CFG		0x1
 
 33#define SPI_FSI_CFG1			0x2
 34#define SPI_FSI_CLOCK_CFG		0x3
 35#define  SPI_FSI_CLOCK_CFG_MM_ENABLE	 BIT_ULL(32)
 36#define  SPI_FSI_CLOCK_CFG_ECC_DISABLE	 (BIT_ULL(35) | BIT_ULL(33))
 37#define  SPI_FSI_CLOCK_CFG_RESET1	 (BIT_ULL(36) | BIT_ULL(38))
 38#define  SPI_FSI_CLOCK_CFG_RESET2	 (BIT_ULL(37) | BIT_ULL(39))
 39#define  SPI_FSI_CLOCK_CFG_MODE		 (BIT_ULL(41) | BIT_ULL(42))
 40#define  SPI_FSI_CLOCK_CFG_SCK_RECV_DEL	 GENMASK_ULL(51, 44)
 41#define   SPI_FSI_CLOCK_CFG_SCK_NO_DEL	  BIT_ULL(51)
 42#define  SPI_FSI_CLOCK_CFG_SCK_DIV	 GENMASK_ULL(63, 52)
 43#define SPI_FSI_MMAP			0x4
 44#define SPI_FSI_DATA_TX			0x5
 45#define SPI_FSI_DATA_RX			0x6
 46#define SPI_FSI_SEQUENCE		0x7
 47#define  SPI_FSI_SEQUENCE_STOP		 0x00
 48#define  SPI_FSI_SEQUENCE_SEL_SLAVE(x)	 (0x10 | ((x) & 0xf))
 49#define  SPI_FSI_SEQUENCE_SHIFT_OUT(x)	 (0x30 | ((x) & 0xf))
 50#define  SPI_FSI_SEQUENCE_SHIFT_IN(x)	 (0x40 | ((x) & 0xf))
 51#define  SPI_FSI_SEQUENCE_COPY_DATA_TX	 0xc0
 52#define  SPI_FSI_SEQUENCE_BRANCH(x)	 (0xe0 | ((x) & 0xf))
 53#define SPI_FSI_STATUS			0x8
 54#define  SPI_FSI_STATUS_ERROR		 \
 55	(GENMASK_ULL(31, 21) | GENMASK_ULL(15, 12))
 56#define  SPI_FSI_STATUS_SEQ_STATE	 GENMASK_ULL(55, 48)
 57#define   SPI_FSI_STATUS_SEQ_STATE_IDLE	  BIT_ULL(48)
 58#define  SPI_FSI_STATUS_TDR_UNDERRUN	 BIT_ULL(57)
 59#define  SPI_FSI_STATUS_TDR_OVERRUN	 BIT_ULL(58)
 60#define  SPI_FSI_STATUS_TDR_FULL	 BIT_ULL(59)
 61#define  SPI_FSI_STATUS_RDR_UNDERRUN	 BIT_ULL(61)
 62#define  SPI_FSI_STATUS_RDR_OVERRUN	 BIT_ULL(62)
 63#define  SPI_FSI_STATUS_RDR_FULL	 BIT_ULL(63)
 64#define  SPI_FSI_STATUS_ANY_ERROR	 \
 65	(SPI_FSI_STATUS_ERROR | \
 66	 SPI_FSI_STATUS_TDR_OVERRUN | SPI_FSI_STATUS_RDR_UNDERRUN | \
 67	 SPI_FSI_STATUS_RDR_OVERRUN)
 68#define SPI_FSI_PORT_CTRL		0x9
 69
 70struct fsi_spi {
 71	struct device *dev;	/* SPI controller device */
 72	struct fsi_device *fsi;	/* FSI2SPI CFAM engine device */
 73	u32 base;
 74};
 75
 76struct fsi_spi_sequence {
 77	int bit;
 78	u64 data;
 79};
 80
 81static int fsi_spi_check_mux(struct fsi_device *fsi, struct device *dev)
 82{
 83	int rc;
 84	u32 root_ctrl_8;
 85	__be32 root_ctrl_8_be;
 86
 87	rc = fsi_slave_read(fsi->slave, FSI_MBOX_ROOT_CTRL_8, &root_ctrl_8_be,
 88			    sizeof(root_ctrl_8_be));
 89	if (rc)
 90		return rc;
 91
 92	root_ctrl_8 = be32_to_cpu(root_ctrl_8_be);
 93	dev_dbg(dev, "Root control register 8: %08x\n", root_ctrl_8);
 94	if ((root_ctrl_8 & FSI_MBOX_ROOT_CTRL_8_SPI_MUX) ==
 95	     FSI_MBOX_ROOT_CTRL_8_SPI_MUX)
 96		return 0;
 97
 98	return -ENOLINK;
 99}
100
101static int fsi_spi_check_status(struct fsi_spi *ctx)
102{
103	int rc;
104	u32 sts;
105	__be32 sts_be;
106
107	rc = fsi_device_read(ctx->fsi, FSI2SPI_STATUS, &sts_be,
108			     sizeof(sts_be));
109	if (rc)
110		return rc;
111
112	sts = be32_to_cpu(sts_be);
113	if (sts & FSI2SPI_STATUS_ANY_ERROR) {
114		dev_err(ctx->dev, "Error with FSI2SPI interface: %08x.\n", sts);
115		return -EIO;
116	}
117
118	return 0;
119}
120
121static int fsi_spi_read_reg(struct fsi_spi *ctx, u32 offset, u64 *value)
122{
123	int rc;
124	__be32 cmd_be;
125	__be32 data_be;
126	u32 cmd = offset + ctx->base;
127
128	*value = 0ULL;
129
130	if (cmd & FSI2SPI_CMD_WRITE)
131		return -EINVAL;
132
133	cmd_be = cpu_to_be32(cmd);
134	rc = fsi_device_write(ctx->fsi, FSI2SPI_CMD, &cmd_be, sizeof(cmd_be));
135	if (rc)
136		return rc;
137
138	rc = fsi_spi_check_status(ctx);
139	if (rc)
140		return rc;
141
142	rc = fsi_device_read(ctx->fsi, FSI2SPI_DATA0, &data_be,
143			     sizeof(data_be));
144	if (rc)
145		return rc;
146
147	*value |= (u64)be32_to_cpu(data_be) << 32;
148
149	rc = fsi_device_read(ctx->fsi, FSI2SPI_DATA1, &data_be,
150			     sizeof(data_be));
151	if (rc)
152		return rc;
153
154	*value |= (u64)be32_to_cpu(data_be);
155	dev_dbg(ctx->dev, "Read %02x[%016llx].\n", offset, *value);
156
157	return 0;
158}
159
160static int fsi_spi_write_reg(struct fsi_spi *ctx, u32 offset, u64 value)
161{
162	int rc;
163	__be32 cmd_be;
164	__be32 data_be;
165	u32 cmd = offset + ctx->base;
166
167	if (cmd & FSI2SPI_CMD_WRITE)
168		return -EINVAL;
169
170	dev_dbg(ctx->dev, "Write %02x[%016llx].\n", offset, value);
171
172	data_be = cpu_to_be32(upper_32_bits(value));
173	rc = fsi_device_write(ctx->fsi, FSI2SPI_DATA0, &data_be,
174			      sizeof(data_be));
175	if (rc)
176		return rc;
177
178	data_be = cpu_to_be32(lower_32_bits(value));
179	rc = fsi_device_write(ctx->fsi, FSI2SPI_DATA1, &data_be,
180			      sizeof(data_be));
181	if (rc)
182		return rc;
183
184	cmd_be = cpu_to_be32(cmd | FSI2SPI_CMD_WRITE);
185	rc = fsi_device_write(ctx->fsi, FSI2SPI_CMD, &cmd_be, sizeof(cmd_be));
186	if (rc)
187		return rc;
188
189	return fsi_spi_check_status(ctx);
190}
191
192static int fsi_spi_data_in(u64 in, u8 *rx, int len)
193{
194	int i;
195	int num_bytes = min(len, 8);
196
197	for (i = 0; i < num_bytes; ++i)
198		rx[i] = (u8)(in >> (8 * ((num_bytes - 1) - i)));
199
200	return num_bytes;
201}
202
203static int fsi_spi_data_out(u64 *out, const u8 *tx, int len)
204{
205	int i;
206	int num_bytes = min(len, 8);
207	u8 *out_bytes = (u8 *)out;
208
209	/* Unused bytes of the tx data should be 0. */
210	*out = 0ULL;
211
212	for (i = 0; i < num_bytes; ++i)
213		out_bytes[8 - (i + 1)] = tx[i];
214
215	return num_bytes;
216}
217
218static int fsi_spi_reset(struct fsi_spi *ctx)
219{
220	int rc;
221
222	dev_dbg(ctx->dev, "Resetting SPI controller.\n");
223
224	rc = fsi_spi_write_reg(ctx, SPI_FSI_CLOCK_CFG,
225			       SPI_FSI_CLOCK_CFG_RESET1);
226	if (rc)
227		return rc;
228
229	rc = fsi_spi_write_reg(ctx, SPI_FSI_CLOCK_CFG,
230			       SPI_FSI_CLOCK_CFG_RESET2);
231	if (rc)
232		return rc;
233
234	return fsi_spi_write_reg(ctx, SPI_FSI_STATUS, 0ULL);
235}
236
237static void fsi_spi_sequence_add(struct fsi_spi_sequence *seq, u8 val)
238{
239	/*
240	 * Add the next byte of instruction to the 8-byte sequence register.
241	 * Then decrement the counter so that the next instruction will go in
242	 * the right place. Return the index of the slot we just filled in the
243	 * sequence register.
244	 */
245	seq->data |= (u64)val << seq->bit;
246	seq->bit -= 8;
 
 
247}
248
249static void fsi_spi_sequence_init(struct fsi_spi_sequence *seq)
250{
251	seq->bit = 56;
252	seq->data = 0ULL;
253}
254
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
255static int fsi_spi_transfer_data(struct fsi_spi *ctx,
256				 struct spi_transfer *transfer)
257{
258	int rc = 0;
259	u64 status = 0ULL;
260
261	if (transfer->tx_buf) {
262		int nb;
263		int sent = 0;
264		u64 out = 0ULL;
265		const u8 *tx = transfer->tx_buf;
266
267		while (transfer->len > sent) {
268			nb = fsi_spi_data_out(&out, &tx[sent],
269					      (int)transfer->len - sent);
270
271			rc = fsi_spi_write_reg(ctx, SPI_FSI_DATA_TX, out);
272			if (rc)
273				return rc;
274
275			do {
276				rc = fsi_spi_read_reg(ctx, SPI_FSI_STATUS,
277						      &status);
278				if (rc)
279					return rc;
280
281				if (status & SPI_FSI_STATUS_ANY_ERROR) {
282					rc = fsi_spi_reset(ctx);
283					if (rc)
284						return rc;
285
286					return -EREMOTEIO;
287				}
288			} while (status & SPI_FSI_STATUS_TDR_FULL);
289
290			sent += nb;
291		}
292	} else if (transfer->rx_buf) {
293		int recv = 0;
294		u64 in = 0ULL;
295		u8 *rx = transfer->rx_buf;
296
297		while (transfer->len > recv) {
298			do {
299				rc = fsi_spi_read_reg(ctx, SPI_FSI_STATUS,
300						      &status);
301				if (rc)
302					return rc;
303
304				if (status & SPI_FSI_STATUS_ANY_ERROR) {
305					rc = fsi_spi_reset(ctx);
306					if (rc)
307						return rc;
308
309					return -EREMOTEIO;
310				}
311			} while (!(status & SPI_FSI_STATUS_RDR_FULL));
312
313			rc = fsi_spi_read_reg(ctx, SPI_FSI_DATA_RX, &in);
314			if (rc)
315				return rc;
316
317			recv += fsi_spi_data_in(in, &rx[recv],
318						(int)transfer->len - recv);
319		}
320	}
321
322	return 0;
323}
324
325static int fsi_spi_transfer_init(struct fsi_spi *ctx)
326{
327	int rc;
328	bool reset = false;
329	unsigned long end;
330	u64 seq_state;
331	u64 clock_cfg = 0ULL;
332	u64 status = 0ULL;
333	u64 wanted_clock_cfg = SPI_FSI_CLOCK_CFG_ECC_DISABLE |
334		SPI_FSI_CLOCK_CFG_SCK_NO_DEL |
335		FIELD_PREP(SPI_FSI_CLOCK_CFG_SCK_DIV, 19);
336
337	end = jiffies + msecs_to_jiffies(SPI_FSI_INIT_TIMEOUT_MS);
338	do {
339		if (time_after(jiffies, end))
340			return -ETIMEDOUT;
341
342		rc = fsi_spi_read_reg(ctx, SPI_FSI_STATUS, &status);
343		if (rc)
344			return rc;
345
346		seq_state = status & SPI_FSI_STATUS_SEQ_STATE;
347
348		if (status & (SPI_FSI_STATUS_ANY_ERROR |
349			      SPI_FSI_STATUS_TDR_FULL |
350			      SPI_FSI_STATUS_RDR_FULL)) {
351			if (reset)
352				return -EIO;
353
354			rc = fsi_spi_reset(ctx);
355			if (rc)
356				return rc;
357
358			reset = true;
359			continue;
360		}
361	} while (seq_state && (seq_state != SPI_FSI_STATUS_SEQ_STATE_IDLE));
362
363	rc = fsi_spi_write_reg(ctx, SPI_FSI_COUNTER_CFG, 0ULL);
364	if (rc)
365		return rc;
366
367	rc = fsi_spi_read_reg(ctx, SPI_FSI_CLOCK_CFG, &clock_cfg);
368	if (rc)
369		return rc;
370
371	if ((clock_cfg & (SPI_FSI_CLOCK_CFG_MM_ENABLE |
372			  SPI_FSI_CLOCK_CFG_ECC_DISABLE |
373			  SPI_FSI_CLOCK_CFG_MODE |
374			  SPI_FSI_CLOCK_CFG_SCK_RECV_DEL |
375			  SPI_FSI_CLOCK_CFG_SCK_DIV)) != wanted_clock_cfg)
376		rc = fsi_spi_write_reg(ctx, SPI_FSI_CLOCK_CFG,
377				       wanted_clock_cfg);
378
379	return rc;
380}
381
382static int fsi_spi_transfer_one_message(struct spi_controller *ctlr,
383					struct spi_message *mesg)
384{
385	int rc;
386	u8 seq_slave = SPI_FSI_SEQUENCE_SEL_SLAVE(mesg->spi->chip_select + 1);
387	unsigned int len;
388	struct spi_transfer *transfer;
389	struct fsi_spi *ctx = spi_controller_get_devdata(ctlr);
390
391	rc = fsi_spi_check_mux(ctx->fsi, ctx->dev);
392	if (rc)
393		goto error;
394
395	list_for_each_entry(transfer, &mesg->transfers, transfer_list) {
396		struct fsi_spi_sequence seq;
397		struct spi_transfer *next = NULL;
398
399		/* Sequencer must do shift out (tx) first. */
400		if (!transfer->tx_buf || transfer->len > SPI_FSI_MAX_TX_SIZE) {
 
401			rc = -EINVAL;
402			goto error;
403		}
404
405		dev_dbg(ctx->dev, "Start tx of %d bytes.\n", transfer->len);
406
407		rc = fsi_spi_transfer_init(ctx);
408		if (rc < 0)
409			goto error;
410
411		fsi_spi_sequence_init(&seq);
412		fsi_spi_sequence_add(&seq, seq_slave);
413
414		len = transfer->len;
415		while (len > 8) {
416			fsi_spi_sequence_add(&seq,
417					     SPI_FSI_SEQUENCE_SHIFT_OUT(8));
418			len -= 8;
419		}
420		fsi_spi_sequence_add(&seq, SPI_FSI_SEQUENCE_SHIFT_OUT(len));
421
422		if (!list_is_last(&transfer->transfer_list,
423				  &mesg->transfers)) {
424			next = list_next_entry(transfer, transfer_list);
425
426			/* Sequencer can only do shift in (rx) after tx. */
427			if (next->rx_buf) {
428				u8 shift;
429
430				if (next->len > SPI_FSI_MAX_RX_SIZE) {
431					rc = -EINVAL;
432					goto error;
433				}
434
435				dev_dbg(ctx->dev, "Sequence rx of %d bytes.\n",
436					next->len);
437
438				shift = SPI_FSI_SEQUENCE_SHIFT_IN(next->len);
439				fsi_spi_sequence_add(&seq, shift);
 
 
440			} else {
441				next = NULL;
442			}
443		}
444
445		fsi_spi_sequence_add(&seq, SPI_FSI_SEQUENCE_SEL_SLAVE(0));
446
447		rc = fsi_spi_write_reg(ctx, SPI_FSI_SEQUENCE, seq.data);
448		if (rc)
449			goto error;
450
451		rc = fsi_spi_transfer_data(ctx, transfer);
452		if (rc)
453			goto error;
454
455		if (next) {
456			rc = fsi_spi_transfer_data(ctx, next);
457			if (rc)
458				goto error;
459
460			transfer = next;
461		}
462	}
463
464error:
465	mesg->status = rc;
466	spi_finalize_current_message(ctlr);
467
468	return rc;
469}
470
471static size_t fsi_spi_max_transfer_size(struct spi_device *spi)
472{
473	return SPI_FSI_MAX_RX_SIZE;
474}
475
476static int fsi_spi_probe(struct device *dev)
477{
478	int rc;
 
479	struct device_node *np;
480	int num_controllers_registered = 0;
481	struct fsi_device *fsi = to_fsi_dev(dev);
482
483	rc = fsi_spi_check_mux(fsi, dev);
 
 
 
 
 
484	if (rc)
 
 
 
 
485		return -ENODEV;
 
486
487	for_each_available_child_of_node(dev->of_node, np) {
488		u32 base;
489		struct fsi_spi *ctx;
490		struct spi_controller *ctlr;
491
492		if (of_property_read_u32(np, "reg", &base))
493			continue;
494
495		ctlr = spi_alloc_master(dev, sizeof(*ctx));
496		if (!ctlr) {
497			of_node_put(np);
498			break;
499		}
500
501		ctlr->dev.of_node = np;
502		ctlr->num_chipselect = of_get_available_child_count(np) ?: 1;
503		ctlr->flags = SPI_CONTROLLER_HALF_DUPLEX;
504		ctlr->max_transfer_size = fsi_spi_max_transfer_size;
505		ctlr->transfer_one_message = fsi_spi_transfer_one_message;
506
507		ctx = spi_controller_get_devdata(ctlr);
508		ctx->dev = &ctlr->dev;
509		ctx->fsi = fsi;
510		ctx->base = base + SPI_FSI_BASE;
511
512		rc = devm_spi_register_controller(dev, ctlr);
513		if (rc)
514			spi_controller_put(ctlr);
515		else
516			num_controllers_registered++;
517	}
518
519	if (!num_controllers_registered)
520		return -ENODEV;
521
522	return 0;
523}
524
525static const struct fsi_device_id fsi_spi_ids[] = {
526	{ FSI_ENGID_SPI, FSI_VERSION_ANY },
527	{ }
528};
529MODULE_DEVICE_TABLE(fsi, fsi_spi_ids);
530
531static struct fsi_driver fsi_spi_driver = {
532	.id_table = fsi_spi_ids,
533	.drv = {
534		.name = "spi-fsi",
535		.bus = &fsi_bus_type,
536		.probe = fsi_spi_probe,
537	},
538};
539module_fsi_driver(fsi_spi_driver);
540
541MODULE_AUTHOR("Eddie James <eajames@linux.ibm.com>");
542MODULE_DESCRIPTION("FSI attached SPI controller");
543MODULE_LICENSE("GPL");