Commit 196964a3 authored by Eddie James's avatar Eddie James Committed by Joel Stanley
Browse files

fsi: core: Set slave local bus ownership during init



The driver ought to claim local bus ownership of the slave it's
communicating with.

This is for multi-master setups. The slave (in theory) will deny access
to masters who try to access the CFAM address space but who don't "own"
the bus.

As driver doesn't seem to perform any other teardown there is no need to
"un-claim" ownership at teardown. Also I'm not aware of any multi-master
setup using this driver so it shouldn't actually matter. Also, the
hardware doesn't seem to enforce this despite being required in the
specification...

Signed-off-by: default avatarEddie James <eajames@linux.ibm.com>
Signed-off-by: default avatarJoel Stanley <joel@jms.id.au>
parent b36875a4
Loading
Loading
Loading
Loading
+15 −1
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ static const int engine_page_size = 0x400;
#define FSI_SMODE		0x0	/* R/W: Mode register */
#define FSI_SISC		0x8	/* R/W: Interrupt condition */
#define FSI_SSTAT		0x14	/* R  : Slave status */
#define FSI_SLBUS		0x30	/* W  : LBUS Ownership */
#define FSI_LLMODE		0x100	/* R/W: Link layer mode register */

/*
@@ -66,6 +67,11 @@ static const int engine_page_size = 0x400;
#define FSI_SMODE_LBCRR_SHIFT	8		/* Clk ratio shift */
#define FSI_SMODE_LBCRR_MASK	0xf		/* Clk ratio mask */

/*
 * SLBUS fields
 */
#define FSI_SLBUS_FORCE		0x80000000	/* Force LBUS ownership */

/*
 * LLMODE fields
 */
@@ -981,7 +987,7 @@ static int fsi_slave_init(struct fsi_master *master, int link, uint8_t id)
	uint32_t cfam_id;
	struct fsi_slave *slave;
	uint8_t crc;
	__be32 data, llmode;
	__be32 data, llmode, slbus;
	int rc;

	/* Currently, we only support single slaves on a link, and use the
@@ -1052,6 +1058,14 @@ static int fsi_slave_init(struct fsi_master *master, int link, uint8_t id)

	}

	slbus = cpu_to_be32(FSI_SLBUS_FORCE);
	rc = fsi_master_write(master, link, id, FSI_SLAVE_BASE + FSI_SLBUS,
			      &slbus, sizeof(slbus));
	if (rc)
		dev_warn(&master->dev,
			 "can't set slbus on slave:%02x:%02x %d\n", link, id,
			 rc);

	rc = fsi_slave_set_smode(slave);
	if (rc) {
		dev_warn(&master->dev,