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
This commit is contained in:
+13
@@ -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
@@ -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:
|
||||
put_device(&slave->dev);
|
||||
err_free_ida:
|
||||
fsi_free_minor(slave->dev.devt);
|
||||
err_free:
|
||||
of_node_put(slave->dev.of_node);
|
||||
kfree(slave);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
+12
-3
@@ -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);
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user