Commit 04635a30 authored by Eddie James's avatar Eddie James Committed by Joel Stanley
Browse files

fsi: master: Add boolean parameter to link_enable function



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: default avatarEddie James <eajames@linux.ibm.com>
Signed-off-by: default avatarJoel Stanley <joel@jms.id.au>
parent 3c3c4848
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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;
}
+6 −1
Original line number Diff line number Diff line
@@ -301,7 +301,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;
@@ -312,6 +313,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;
+3 −2
Original line number Diff line number Diff line
@@ -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);
+3 −2
Original line number Diff line number Diff line
@@ -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);
+6 −1
Original line number Diff line number Diff line
@@ -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);
Loading