Lines Matching +full:chip +full:- +full:to +full:- +full:chip
1 // SPDX-License-Identifier: GPL-2.0
10 * - Use an interrupt for transaction status instead of hardcoded delays.
11 * - Must use write+wait+read read protocol.
12 * - All 4 bytes of status register must be read/written at once.
13 * - Burst count max is 63 bytes, and burst count behaves slightly differently
15 * - When reading from FIFO the full burstcnt must be read instead of just
37 #define TPM_CR50_I2C_MAX_RETRIES 3 /* Max retries due to I2C errors */
48 * struct tpm_i2c_cr50_priv_data - Driver private data.
49 * @irq: Irq number used for this chip.
51 * @tpm_ready: Struct used by irq handler to signal R/W readiness.
52 * @buf: Buffer used for i2c writes, with i2c address prepended to content.
63 * tpm_cr50_i2c_int_handler() - cr50 interrupt handler.
65 * @tpm_info: TPM chip information.
69 * processing but is instead used to avoid fixed delays.
76 struct tpm_chip *chip = tpm_info; in tpm_cr50_i2c_int_handler() local
77 struct tpm_i2c_cr50_priv_data *priv = dev_get_drvdata(&chip->dev); in tpm_cr50_i2c_int_handler()
79 complete(&priv->tpm_ready); in tpm_cr50_i2c_int_handler()
85 * tpm_cr50_i2c_wait_tpm_ready() - Wait for tpm to signal ready.
86 * @chip: A TPM chip.
89 * delay for the TPM to be ready.
92 * - 0: Success.
93 * - -errno: A POSIX error code.
95 static int tpm_cr50_i2c_wait_tpm_ready(struct tpm_chip *chip) in tpm_cr50_i2c_wait_tpm_ready() argument
97 struct tpm_i2c_cr50_priv_data *priv = dev_get_drvdata(&chip->dev); in tpm_cr50_i2c_wait_tpm_ready()
100 if (priv->irq <= 0) { in tpm_cr50_i2c_wait_tpm_ready()
105 /* Wait for interrupt to indicate TPM is ready to respond */ in tpm_cr50_i2c_wait_tpm_ready()
106 if (!wait_for_completion_timeout(&priv->tpm_ready, chip->timeout_a)) { in tpm_cr50_i2c_wait_tpm_ready()
107 dev_warn(&chip->dev, "Timeout waiting for TPM ready\n"); in tpm_cr50_i2c_wait_tpm_ready()
108 return -ETIMEDOUT; in tpm_cr50_i2c_wait_tpm_ready()
115 * tpm_cr50_i2c_enable_tpm_irq() - Enable TPM irq.
116 * @chip: A TPM chip.
118 static void tpm_cr50_i2c_enable_tpm_irq(struct tpm_chip *chip) in tpm_cr50_i2c_enable_tpm_irq() argument
120 struct tpm_i2c_cr50_priv_data *priv = dev_get_drvdata(&chip->dev); in tpm_cr50_i2c_enable_tpm_irq()
122 if (priv->irq > 0) { in tpm_cr50_i2c_enable_tpm_irq()
123 reinit_completion(&priv->tpm_ready); in tpm_cr50_i2c_enable_tpm_irq()
124 enable_irq(priv->irq); in tpm_cr50_i2c_enable_tpm_irq()
129 * tpm_cr50_i2c_disable_tpm_irq() - Disable TPM irq.
130 * @chip: A TPM chip.
132 static void tpm_cr50_i2c_disable_tpm_irq(struct tpm_chip *chip) in tpm_cr50_i2c_disable_tpm_irq() argument
134 struct tpm_i2c_cr50_priv_data *priv = dev_get_drvdata(&chip->dev); in tpm_cr50_i2c_disable_tpm_irq()
136 if (priv->irq > 0) in tpm_cr50_i2c_disable_tpm_irq()
137 disable_irq(priv->irq); in tpm_cr50_i2c_disable_tpm_irq()
141 * tpm_cr50_i2c_transfer_message() - Transfer a message over i2c.
144 * @msg: Message to transfer.
150 * - 0: Success.
151 * - -errno: A POSIX error code.
171 return -EIO; in tpm_cr50_i2c_transfer_message()
175 * tpm_cr50_i2c_read() - Read from TPM register.
176 * @chip: A TPM chip.
177 * @addr: Register address to read from.
179 * @len: Number of bytes to read.
181 * Sends the register address byte to the TPM, then waits until TPM
186 * - 0: Success.
187 * - -errno: A POSIX error code.
189 static int tpm_cr50_i2c_read(struct tpm_chip *chip, u8 addr, u8 *buffer, size_t len) in tpm_cr50_i2c_read() argument
191 struct i2c_client *client = to_i2c_client(chip->dev.parent); in tpm_cr50_i2c_read()
193 .addr = client->addr, in tpm_cr50_i2c_read()
198 .addr = client->addr, in tpm_cr50_i2c_read()
206 tpm_cr50_i2c_enable_tpm_irq(chip); in tpm_cr50_i2c_read()
208 /* Send the register address byte to the TPM */ in tpm_cr50_i2c_read()
209 rc = tpm_cr50_i2c_transfer_message(&chip->dev, client->adapter, &msg_reg_addr); in tpm_cr50_i2c_read()
213 /* Wait for TPM to be ready with response data */ in tpm_cr50_i2c_read()
214 rc = tpm_cr50_i2c_wait_tpm_ready(chip); in tpm_cr50_i2c_read()
219 rc = tpm_cr50_i2c_transfer_message(&chip->dev, client->adapter, &msg_response); in tpm_cr50_i2c_read()
222 tpm_cr50_i2c_disable_tpm_irq(chip); in tpm_cr50_i2c_read()
231 * tpm_cr50_i2c_write()- Write to TPM register.
232 * @chip: A TPM chip.
233 * @addr: Register address to write to.
234 * @buffer: Data to write.
235 * @len: Number of bytes to write.
237 * The provided address is prepended to the data in 'buffer', the
238 * combined address+data is sent to the TPM, then wait for TPM to
242 * - 0: Success.
243 * - -errno: A POSIX error code.
245 static int tpm_cr50_i2c_write(struct tpm_chip *chip, u8 addr, u8 *buffer, in tpm_cr50_i2c_write() argument
248 struct tpm_i2c_cr50_priv_data *priv = dev_get_drvdata(&chip->dev); in tpm_cr50_i2c_write()
249 struct i2c_client *client = to_i2c_client(chip->dev.parent); in tpm_cr50_i2c_write()
251 .addr = client->addr, in tpm_cr50_i2c_write()
253 .buf = priv->buf in tpm_cr50_i2c_write()
257 if (len > TPM_CR50_MAX_BUFSIZE - 1) in tpm_cr50_i2c_write()
258 return -EINVAL; in tpm_cr50_i2c_write()
260 /* Prepend the 'register address' to the buffer */ in tpm_cr50_i2c_write()
261 priv->buf[0] = addr; in tpm_cr50_i2c_write()
262 memcpy(priv->buf + 1, buffer, len); in tpm_cr50_i2c_write()
265 tpm_cr50_i2c_enable_tpm_irq(chip); in tpm_cr50_i2c_write()
268 rc = tpm_cr50_i2c_transfer_message(&chip->dev, client->adapter, &msg); in tpm_cr50_i2c_write()
272 /* Wait for TPM to be ready, ignore timeout */ in tpm_cr50_i2c_write()
273 tpm_cr50_i2c_wait_tpm_ready(chip); in tpm_cr50_i2c_write()
276 tpm_cr50_i2c_disable_tpm_irq(chip); in tpm_cr50_i2c_write()
285 * tpm_cr50_check_locality() - Verify if required TPM locality is active.
286 * @chip: A TPM chip.
287 * @loc: Locality to be verified
290 * - loc: Success.
291 * - -errno: A POSIX error code.
293 static int tpm_cr50_check_locality(struct tpm_chip *chip, int loc) in tpm_cr50_check_locality() argument
299 rc = tpm_cr50_i2c_read(chip, TPM_I2C_ACCESS(loc), &buf, sizeof(buf)); in tpm_cr50_check_locality()
306 return -EIO; in tpm_cr50_check_locality()
310 * tpm_cr50_release_locality() - Release TPM locality.
311 * @chip: A TPM chip.
312 * @loc: Locality to be released
315 * - 0: Success.
316 * - -errno: A POSIX error code.
318 static int tpm_cr50_release_locality(struct tpm_chip *chip, int loc) in tpm_cr50_release_locality() argument
320 struct i2c_client *client = to_i2c_client(chip->dev.parent); in tpm_cr50_release_locality()
326 rc = tpm_cr50_i2c_read(chip, addr, &buf, sizeof(buf)); in tpm_cr50_release_locality()
332 rc = tpm_cr50_i2c_write(chip, addr, &buf, sizeof(buf)); in tpm_cr50_release_locality()
336 i2c_unlock_bus(client->adapter, I2C_LOCK_SEGMENT); in tpm_cr50_release_locality()
341 * tpm_cr50_request_locality() - Request TPM locality.
342 * @chip: A TPM chip.
343 * @loc: Locality to be requested.
346 * - loc: Success.
347 * - -errno: A POSIX error code.
349 static int tpm_cr50_request_locality(struct tpm_chip *chip, int loc) in tpm_cr50_request_locality() argument
351 struct i2c_client *client = to_i2c_client(chip->dev.parent); in tpm_cr50_request_locality()
356 i2c_lock_bus(client->adapter, I2C_LOCK_SEGMENT); in tpm_cr50_request_locality()
358 if (tpm_cr50_check_locality(chip, loc) == loc) in tpm_cr50_request_locality()
361 rc = tpm_cr50_i2c_write(chip, TPM_I2C_ACCESS(loc), &buf, sizeof(buf)); in tpm_cr50_request_locality()
365 stop = jiffies + chip->timeout_a; in tpm_cr50_request_locality()
367 if (tpm_cr50_check_locality(chip, loc) == loc) in tpm_cr50_request_locality()
373 rc = -ETIMEDOUT; in tpm_cr50_request_locality()
376 i2c_unlock_bus(client->adapter, I2C_LOCK_SEGMENT); in tpm_cr50_request_locality()
381 * tpm_cr50_i2c_tis_status() - Read cr50 tis status.
382 * @chip: A TPM chip.
384 * cr50 requires all 4 bytes of status register to be read.
389 static u8 tpm_cr50_i2c_tis_status(struct tpm_chip *chip) in tpm_cr50_i2c_tis_status() argument
393 if (tpm_cr50_i2c_read(chip, TPM_I2C_STS(chip->locality), buf, sizeof(buf)) < 0) in tpm_cr50_i2c_tis_status()
400 * tpm_cr50_i2c_tis_set_ready() - Set status register to ready.
401 * @chip: A TPM chip.
403 * cr50 requires all 4 bytes of status register to be written.
405 static void tpm_cr50_i2c_tis_set_ready(struct tpm_chip *chip) in tpm_cr50_i2c_tis_set_ready() argument
409 tpm_cr50_i2c_write(chip, TPM_I2C_STS(chip->locality), buf, sizeof(buf)); in tpm_cr50_i2c_tis_set_ready()
414 * tpm_cr50_i2c_get_burst_and_status() - Get burst count and status.
415 * @chip: A TPM chip.
424 * - 0: Success.
425 * - -errno: A POSIX error code.
427 static int tpm_cr50_i2c_get_burst_and_status(struct tpm_chip *chip, u8 mask, in tpm_cr50_i2c_get_burst_and_status() argument
436 stop = jiffies + chip->timeout_b; in tpm_cr50_i2c_get_burst_and_status()
439 if (tpm_cr50_i2c_read(chip, TPM_I2C_STS(chip->locality), buf, sizeof(buf)) < 0) { in tpm_cr50_i2c_get_burst_and_status()
448 *burst > 0 && *burst <= TPM_CR50_MAX_BUFSIZE - 1) in tpm_cr50_i2c_get_burst_and_status()
454 dev_err(&chip->dev, "Timeout reading burst and status\n"); in tpm_cr50_i2c_get_burst_and_status()
455 return -ETIMEDOUT; in tpm_cr50_i2c_get_burst_and_status()
459 * tpm_cr50_i2c_tis_recv() - TPM reception callback.
460 * @chip: A TPM chip.
462 * @buf_len: Buffer length to read.
465 * - >= 0: Number of read bytes.
466 * - -errno: A POSIX error code.
468 static int tpm_cr50_i2c_tis_recv(struct tpm_chip *chip, u8 *buf, size_t buf_len) in tpm_cr50_i2c_tis_recv() argument
473 u8 addr = TPM_I2C_DATA_FIFO(chip->locality); in tpm_cr50_i2c_tis_recv()
478 return -EINVAL; in tpm_cr50_i2c_tis_recv()
480 rc = tpm_cr50_i2c_get_burst_and_status(chip, mask, &burstcnt, &status); in tpm_cr50_i2c_tis_recv()
485 dev_err(&chip->dev, in tpm_cr50_i2c_tis_recv()
488 rc = -EIO; in tpm_cr50_i2c_tis_recv()
493 rc = tpm_cr50_i2c_read(chip, addr, buf, burstcnt); in tpm_cr50_i2c_tis_recv()
495 dev_err(&chip->dev, "Read of first chunk failed\n"); in tpm_cr50_i2c_tis_recv()
502 dev_err(&chip->dev, "Buffer too small to receive i2c data\n"); in tpm_cr50_i2c_tis_recv()
503 rc = -E2BIG; in tpm_cr50_i2c_tis_recv()
511 rc = tpm_cr50_i2c_get_burst_and_status(chip, mask, &burstcnt, &status); in tpm_cr50_i2c_tis_recv()
515 len = min_t(size_t, burstcnt, expected - cur); in tpm_cr50_i2c_tis_recv()
516 rc = tpm_cr50_i2c_read(chip, addr, buf + cur, len); in tpm_cr50_i2c_tis_recv()
518 dev_err(&chip->dev, "Read failed\n"); in tpm_cr50_i2c_tis_recv()
526 rc = tpm_cr50_i2c_get_burst_and_status(chip, TPM_STS_VALID, &burstcnt, &status); in tpm_cr50_i2c_tis_recv()
530 dev_err(&chip->dev, "Data still available\n"); in tpm_cr50_i2c_tis_recv()
531 rc = -EIO; in tpm_cr50_i2c_tis_recv()
539 if (tpm_cr50_i2c_tis_status(chip) & TPM_STS_COMMAND_READY) in tpm_cr50_i2c_tis_recv()
540 tpm_cr50_i2c_tis_set_ready(chip); in tpm_cr50_i2c_tis_recv()
546 * tpm_cr50_i2c_tis_send() - TPM transmission callback.
547 * @chip: A TPM chip.
548 * @buf: Buffer to send.
552 * - 0: Success.
553 * - -errno: A POSIX error code.
555 static int tpm_cr50_i2c_tis_send(struct tpm_chip *chip, u8 *buf, size_t len) in tpm_cr50_i2c_tis_send() argument
564 stop = jiffies + chip->timeout_b; in tpm_cr50_i2c_tis_send()
565 while (!(tpm_cr50_i2c_tis_status(chip) & TPM_STS_COMMAND_READY)) { in tpm_cr50_i2c_tis_send()
567 rc = -ETIMEDOUT; in tpm_cr50_i2c_tis_send()
571 tpm_cr50_i2c_tis_set_ready(chip); in tpm_cr50_i2c_tis_send()
582 rc = tpm_cr50_i2c_get_burst_and_status(chip, mask, &burstcnt, &status); in tpm_cr50_i2c_tis_send()
587 * Use burstcnt - 1 to account for the address byte in tpm_cr50_i2c_tis_send()
590 limit = min_t(size_t, burstcnt - 1, len); in tpm_cr50_i2c_tis_send()
591 rc = tpm_cr50_i2c_write(chip, TPM_I2C_DATA_FIFO(chip->locality), in tpm_cr50_i2c_tis_send()
594 dev_err(&chip->dev, "Write failed\n"); in tpm_cr50_i2c_tis_send()
599 len -= limit; in tpm_cr50_i2c_tis_send()
603 rc = tpm_cr50_i2c_get_burst_and_status(chip, TPM_STS_VALID, &burstcnt, &status); in tpm_cr50_i2c_tis_send()
607 dev_err(&chip->dev, "Data still expected\n"); in tpm_cr50_i2c_tis_send()
608 rc = -EIO; in tpm_cr50_i2c_tis_send()
613 rc = tpm_cr50_i2c_write(chip, TPM_I2C_STS(chip->locality), tpm_go, in tpm_cr50_i2c_tis_send()
616 dev_err(&chip->dev, "Start command failed\n"); in tpm_cr50_i2c_tis_send()
623 if (tpm_cr50_i2c_tis_status(chip) & TPM_STS_COMMAND_READY) in tpm_cr50_i2c_tis_send()
624 tpm_cr50_i2c_tis_set_ready(chip); in tpm_cr50_i2c_tis_send()
630 * tpm_cr50_i2c_req_canceled() - Callback to notify a request cancel.
631 * @chip: A TPM chip.
637 static bool tpm_cr50_i2c_req_canceled(struct tpm_chip *chip, u8 status) in tpm_cr50_i2c_req_canceled() argument
648 ret = device_property_read_u8(dev, "firmware-power-managed", &val); in tpm_cr50_i2c_is_firmware_power_managed()
685 * tpm_cr50_vid_to_name() - Maps VID to name.
686 * @vendor: Vendor identifier to map to name
706 * tpm_cr50_i2c_probe() - Driver probe function.
710 * - 0: Success.
711 * - -errno: A POSIX error code.
716 struct device *dev = &client->dev; in tpm_cr50_i2c_probe()
717 struct tpm_chip *chip; in tpm_cr50_i2c_probe() local
723 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) in tpm_cr50_i2c_probe()
724 return -ENODEV; in tpm_cr50_i2c_probe()
726 chip = tpmm_chip_alloc(dev, &cr50_i2c); in tpm_cr50_i2c_probe()
727 if (IS_ERR(chip)) in tpm_cr50_i2c_probe()
728 return PTR_ERR(chip); in tpm_cr50_i2c_probe()
732 return -ENOMEM; in tpm_cr50_i2c_probe()
734 /* cr50 is a TPM 2.0 chip */ in tpm_cr50_i2c_probe()
735 chip->flags |= TPM_CHIP_FLAG_TPM2; in tpm_cr50_i2c_probe()
737 chip->flags |= TPM_CHIP_FLAG_FIRMWARE_POWER_MANAGED; in tpm_cr50_i2c_probe()
740 chip->timeout_a = msecs_to_jiffies(TIS_SHORT_TIMEOUT); in tpm_cr50_i2c_probe()
741 chip->timeout_b = msecs_to_jiffies(TIS_LONG_TIMEOUT); in tpm_cr50_i2c_probe()
742 chip->timeout_c = msecs_to_jiffies(TIS_SHORT_TIMEOUT); in tpm_cr50_i2c_probe()
743 chip->timeout_d = msecs_to_jiffies(TIS_SHORT_TIMEOUT); in tpm_cr50_i2c_probe()
745 dev_set_drvdata(&chip->dev, priv); in tpm_cr50_i2c_probe()
746 init_completion(&priv->tpm_ready); in tpm_cr50_i2c_probe()
748 if (client->irq > 0) { in tpm_cr50_i2c_probe()
749 rc = devm_request_irq(dev, client->irq, tpm_cr50_i2c_int_handler, in tpm_cr50_i2c_probe()
752 dev->driver->name, chip); in tpm_cr50_i2c_probe()
754 dev_err(dev, "Failed to probe IRQ %d\n", client->irq); in tpm_cr50_i2c_probe()
758 priv->irq = client->irq; in tpm_cr50_i2c_probe()
764 loc = tpm_cr50_request_locality(chip, TPM_CR50_I2C_DEFAULT_LOC); in tpm_cr50_i2c_probe()
771 rc = tpm_cr50_i2c_read(chip, TPM_I2C_DID_VID(loc), buf, sizeof(buf)); in tpm_cr50_i2c_probe()
774 if (tpm_cr50_release_locality(chip, loc)) in tpm_cr50_i2c_probe()
779 rc = tpm_cr50_release_locality(chip, loc); in tpm_cr50_i2c_probe()
790 return -ENODEV; in tpm_cr50_i2c_probe()
795 client->addr, client->irq, vendor >> 16); in tpm_cr50_i2c_probe()
796 return tpm_chip_register(chip); in tpm_cr50_i2c_probe()
800 * tpm_cr50_i2c_remove() - Driver remove function.
804 * - 0: Success.
805 * - -errno: A POSIX error code.
809 struct tpm_chip *chip = i2c_get_clientdata(client); in tpm_cr50_i2c_remove() local
810 struct device *dev = &client->dev; in tpm_cr50_i2c_remove()
812 if (!chip) { in tpm_cr50_i2c_remove()
817 tpm_chip_unregister(chip); in tpm_cr50_i2c_remove()