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
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEE+nHMAt9PCBDH63wBa3ZZB4FHcJ4FAl0cIIIACgkQa3ZZB4FH
 cJ6z0A//Qy3eu/+s01kq8BAThP77QRyoQP+D7oMoGpr2KxK+82MtFwsuX/vLpcsu
 rYTLn+2xPzY+dWCQx6nWaIij/dkPDWikVarW2+fdMrLhk76XwwkVXPD4J4lUHtVx
 juTWPxLmo7ZAxtwMHyE86hjLR1oTmwZ/arnXYojQ2dka1CZxqpEo7YkRPBLkGjU7
 EcXuCcIGl5ETB9drVsdA8lArLFdgfL/ZFYyEF0epc9KgYrGvJdu1ZdT6bzJkn6C3
 rkCKzQF6fZdszNpo92mjUhkyP3MnnrSVdQPRb/D5wfY9EApfj1YRWS5ikts2lrEf
 tNBat9KJ5nn2AX8FUEKuJazks5ddQk5GOLw6U4vgVayQ0gL8HqofiqybvzKvpX0S
 B0ey0u2d+GeMwiNR+QUNgrnqbbbqy9rLaW8p4zfB70v5qOP8BfWQqnSq+utSqIWZ
 M7xKcial5vQqnBTz0pw+CXVZc0SPD0O7DaK1BmCVOumMAO746eNCPQEwIQVl3Fjt
 FW00qPDWrLnRfdusBWB5mky8b79cnfLht+hLh82gFEeSXpHsRx6rG5luT7moasSK
 EmbXcMM13iVznQk+2IVWWeAXdSDo0yA0eW1SBNBHdrUrdp6jW5pLbDb/F8s+jwQK
 rNYE4IwZYM34L+E/CsFQZw3o5XQy0fsEv6/0tFjjiQPwLeZJZzI=
 =3yOz
 -----END PGP SIGNATURE-----

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:
Greg Kroah-Hartman 2019-07-03 09:21:25 +02:00
commit b9b667a0c7
5 changed files with 48 additions and 17 deletions

View File

@ -6488,6 +6488,19 @@ F: fs/crypto/
F: include/linux/fscrypt*.h F: include/linux/fscrypt*.h
F: Documentation/filesystems/fscrypt.rst 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 FSI-ATTACHED I2C DRIVER
M: Eddie James <eajames@linux.ibm.com> M: Eddie James <eajames@linux.ibm.com>
L: linux-i2c@vger.kernel.org L: linux-i2c@vger.kernel.org

View File

@ -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 */ /* Allocate a minor in the FSI space */
rc = __fsi_get_new_minor(slave, fsi_dev_cfam, &slave->dev.devt, rc = __fsi_get_new_minor(slave, fsi_dev_cfam, &slave->dev.devt,
&slave->cdev_idx); &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); rc = cdev_device_add(&slave->cdev, &slave->dev);
if (rc) { if (rc) {
dev_err(&slave->dev, "Error %d creating slave device\n", 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); /* Now that we have the cdev registered with the core, any fatal
if (rc) { * failures beyond this point will need to clean up through
dev_warn(&master->dev, * cdev_device_del(). Fortunately though, nothing past here is fatal.
"can't set smode on slave:%02x:%02x %d\n", */
link, id, rc);
kfree(slave);
return -ENODEV;
}
if (master->link_config) if (master->link_config)
master->link_config(master, link, master->link_config(master, link,
slave->t_send_delay, 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", dev_dbg(&master->dev, "failed during slave scan with: %d\n",
rc); rc);
return rc; return 0;
err_free: err_free_ida:
put_device(&slave->dev); fsi_free_minor(slave->dev.devt);
err_free:
of_node_put(slave->dev.of_node);
kfree(slave);
return rc; return rc;
} }

View File

@ -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); msecs_to_jiffies(OCC_CMD_IN_PRG_WAIT_MS);
struct occ *occ = dev_get_drvdata(dev); struct occ *occ = dev_get_drvdata(dev);
struct occ_response *resp = response; struct occ_response *resp = response;
u8 seq_no;
u16 resp_data_length; u16 resp_data_length;
unsigned long start; unsigned long start;
int rc; 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); 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); rc = occ_putsram(occ, OCC_SRAM_CMD_ADDR, request, req_len);
if (rc) if (rc)
goto done; goto done;
@ -441,11 +444,17 @@ int fsi_occ_submit(struct device *dev, const void *request, size_t req_len,
if (rc) if (rc)
goto done; 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; rc = -ETIMEDOUT;
if (time_after(jiffies, start + timeout)) if (time_after(jiffies, start + timeout)) {
break; 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); set_current_state(TASK_UNINTERRUPTIBLE);
schedule_timeout(wait_time); schedule_timeout(wait_time);

View File

@ -124,12 +124,12 @@ struct extended_sensor {
static int occ_poll(struct occ *occ) static int occ_poll(struct occ *occ)
{ {
int rc; int rc;
u16 checksum = occ->poll_cmd_data + 1; u16 checksum = occ->poll_cmd_data + occ->seq_no + 1;
u8 cmd[8]; u8 cmd[8];
struct occ_poll_response_header *header; struct occ_poll_response_header *header;
/* big endian */ /* big endian */
cmd[0] = 0; /* sequence number */ cmd[0] = occ->seq_no++; /* sequence number */
cmd[1] = 0; /* cmd type */ cmd[1] = 0; /* cmd type */
cmd[2] = 0; /* data length msb */ cmd[2] = 0; /* data length msb */
cmd[3] = 1; /* data length lsb */ cmd[3] = 1; /* data length lsb */

View File

@ -95,6 +95,7 @@ struct occ {
struct occ_sensors sensors; struct occ_sensors sensors;
int powr_sample_time_us; /* average power sample time */ int powr_sample_time_us; /* average power sample time */
u8 seq_no;
u8 poll_cmd_data; /* to perform OCC poll command */ u8 poll_cmd_data; /* to perform OCC poll command */
int (*send_cmd)(struct occ *occ, u8 *cmd); int (*send_cmd)(struct occ *occ, u8 *cmd);