Commit b9b667a0 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman
Browse files

Merge tag 'fsi-for-5.3' of...

Merge tag 'fsi-for-5.3' of git://git.kernel.org/pub/scm/linux/kernel/git/joel/fsi into char-misc-next

Joel writes:

FSI changes for 5.3

 - Add MAINTAINERS entry. There is now a git tree and a mailing
 list/patchwork for collecting FSI patches

 - Bug fix for error driver registration error paths

 - Correction for the OCC hwmon driver to meet the spec

* tag 'fsi-for-5.3' of git://git.kernel.org/pub/scm/linux/kernel/git/joel/fsi:
  fsi/core: Fix error paths on CFAM init
  OCC: FSI and hwmon: Add sequence numbering
  MAINTAINERS: Add FSI subsystem
parents c1829ace 371975b0
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -6488,6 +6488,19 @@ F: fs/crypto/
F:	include/linux/fscrypt*.h
F:	Documentation/filesystems/fscrypt.rst

FSI SUBSYSTEM
M:	Jeremy Kerr <jk@ozlabs.org>
M:	Joel Stanley <joel@jms.id.au>
R:	Alistar Popple <alistair@popple.id.au>
R:	Eddie James <eajames@linux.ibm.com>
L:	linux-fsi@lists.ozlabs.org
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/joel/fsi.git
Q:	http://patchwork.ozlabs.org/project/linux-fsi/list/
S:	Supported
F:	drivers/fsi/
F:	include/linux/fsi*.h
F:	include/trace/events/fsi*.h

FSI-ATTACHED I2C DRIVER
M:	Eddie James <eajames@linux.ibm.com>
L:	linux-i2c@vger.kernel.org
+20 −12
Original line number Diff line number Diff line
@@ -1029,6 +1029,14 @@ static int fsi_slave_init(struct fsi_master *master, int link, uint8_t id)

	}

	rc = fsi_slave_set_smode(slave);
	if (rc) {
		dev_warn(&master->dev,
				"can't set smode on slave:%02x:%02x %d\n",
				link, id, rc);
		goto err_free;
	}

	/* Allocate a minor in the FSI space */
	rc = __fsi_get_new_minor(slave, fsi_dev_cfam, &slave->dev.devt,
				 &slave->cdev_idx);
@@ -1040,17 +1048,14 @@ static int fsi_slave_init(struct fsi_master *master, int link, uint8_t id)
	rc = cdev_device_add(&slave->cdev, &slave->dev);
	if (rc) {
		dev_err(&slave->dev, "Error %d creating slave device\n", rc);
		goto err_free;
		goto err_free_ida;
	}

	rc = fsi_slave_set_smode(slave);
	if (rc) {
		dev_warn(&master->dev,
				"can't set smode on slave:%02x:%02x %d\n",
				link, id, rc);
		kfree(slave);
		return -ENODEV;
	}
	/* Now that we have the cdev registered with the core, any fatal
	 * failures beyond this point will need to clean up through
	 * cdev_device_del(). Fortunately though, nothing past here is fatal.
	 */

	if (master->link_config)
		master->link_config(master, link,
				    slave->t_send_delay,
@@ -1067,10 +1072,13 @@ static int fsi_slave_init(struct fsi_master *master, int link, uint8_t id)
		dev_dbg(&master->dev, "failed during slave scan with: %d\n",
				rc);

	return rc;
	return 0;

err_free_ida:
	fsi_free_minor(slave->dev.devt);
err_free:
	put_device(&slave->dev);
	of_node_put(slave->dev.of_node);
	kfree(slave);
	return rc;
}

+12 −3
Original line number Diff line number Diff line
@@ -412,6 +412,7 @@ int fsi_occ_submit(struct device *dev, const void *request, size_t req_len,
		msecs_to_jiffies(OCC_CMD_IN_PRG_WAIT_MS);
	struct occ *occ = dev_get_drvdata(dev);
	struct occ_response *resp = response;
	u8 seq_no;
	u16 resp_data_length;
	unsigned long start;
	int rc;
@@ -426,6 +427,8 @@ int fsi_occ_submit(struct device *dev, const void *request, size_t req_len,

	mutex_lock(&occ->occ_lock);

	/* Extract the seq_no from the command (first byte) */
	seq_no = *(const u8 *)request;
	rc = occ_putsram(occ, OCC_SRAM_CMD_ADDR, request, req_len);
	if (rc)
		goto done;
@@ -441,11 +444,17 @@ int fsi_occ_submit(struct device *dev, const void *request, size_t req_len,
		if (rc)
			goto done;

		if (resp->return_status == OCC_RESP_CMD_IN_PRG) {
		if (resp->return_status == OCC_RESP_CMD_IN_PRG ||
		    resp->seq_no != seq_no) {
			rc = -ETIMEDOUT;

			if (time_after(jiffies, start + timeout))
				break;
			if (time_after(jiffies, start + timeout)) {
				dev_err(occ->dev, "resp timeout status=%02x "
					"resp seq_no=%d our seq_no=%d\n",
					resp->return_status, resp->seq_no,
					seq_no);
				goto done;
			}

			set_current_state(TASK_UNINTERRUPTIBLE);
			schedule_timeout(wait_time);
+2 −2
Original line number Diff line number Diff line
@@ -124,12 +124,12 @@ struct extended_sensor {
static int occ_poll(struct occ *occ)
{
	int rc;
	u16 checksum = occ->poll_cmd_data + 1;
	u16 checksum = occ->poll_cmd_data + occ->seq_no + 1;
	u8 cmd[8];
	struct occ_poll_response_header *header;

	/* big endian */
	cmd[0] = 0;			/* sequence number */
	cmd[0] = occ->seq_no++;		/* sequence number */
	cmd[1] = 0;			/* cmd type */
	cmd[2] = 0;			/* data length msb */
	cmd[3] = 1;			/* data length lsb */
+1 −0
Original line number Diff line number Diff line
@@ -95,6 +95,7 @@ struct occ {
	struct occ_sensors sensors;

	int powr_sample_time_us;	/* average power sample time */
	u8 seq_no;
	u8 poll_cmd_data;		/* to perform OCC poll command */
	int (*send_cmd)(struct occ *occ, u8 *cmd);