Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.14-rc4 845 lines 22 kB view raw
1/* 2 * STMicroelectronics TPM I2C Linux driver for TPM ST33ZP24 3 * Copyright (C) 2009, 2010 STMicroelectronics 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License along 16 * with this program; if not, write to the Free Software Foundation, Inc., 17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * STMicroelectronics version 1.2.0, Copyright (C) 2010 20 * STMicroelectronics comes with ABSOLUTELY NO WARRANTY. 21 * This is free software, and you are welcome to redistribute it 22 * under certain conditions. 23 * 24 * @Author: Christophe RICARD tpmsupport@st.com 25 * 26 * @File: tpm_stm_st33_i2c.c 27 * 28 * @Synopsis: 29 * 09/15/2010: First shot driver tpm_tis driver for 30 lpc is used as model. 31 */ 32 33#include <linux/pci.h> 34#include <linux/module.h> 35#include <linux/platform_device.h> 36#include <linux/i2c.h> 37#include <linux/fs.h> 38#include <linux/miscdevice.h> 39#include <linux/kernel.h> 40#include <linux/delay.h> 41#include <linux/init.h> 42#include <linux/wait.h> 43#include <linux/string.h> 44#include <linux/interrupt.h> 45#include <linux/spinlock.h> 46#include <linux/sysfs.h> 47#include <linux/gpio.h> 48#include <linux/sched.h> 49#include <linux/uaccess.h> 50#include <linux/io.h> 51#include <linux/slab.h> 52 53#include "tpm.h" 54#include "tpm_i2c_stm_st33.h" 55 56enum stm33zp24_access { 57 TPM_ACCESS_VALID = 0x80, 58 TPM_ACCESS_ACTIVE_LOCALITY = 0x20, 59 TPM_ACCESS_REQUEST_PENDING = 0x04, 60 TPM_ACCESS_REQUEST_USE = 0x02, 61}; 62 63enum stm33zp24_status { 64 TPM_STS_VALID = 0x80, 65 TPM_STS_COMMAND_READY = 0x40, 66 TPM_STS_GO = 0x20, 67 TPM_STS_DATA_AVAIL = 0x10, 68 TPM_STS_DATA_EXPECT = 0x08, 69}; 70 71enum stm33zp24_int_flags { 72 TPM_GLOBAL_INT_ENABLE = 0x80, 73 TPM_INTF_CMD_READY_INT = 0x080, 74 TPM_INTF_FIFO_AVALAIBLE_INT = 0x040, 75 TPM_INTF_WAKE_UP_READY_INT = 0x020, 76 TPM_INTF_LOCALITY_CHANGE_INT = 0x004, 77 TPM_INTF_STS_VALID_INT = 0x002, 78 TPM_INTF_DATA_AVAIL_INT = 0x001, 79}; 80 81enum tis_defaults { 82 TIS_SHORT_TIMEOUT = 750, 83 TIS_LONG_TIMEOUT = 2000, 84}; 85 86/* 87 * write8_reg 88 * Send byte to the TIS register according to the ST33ZP24 I2C protocol. 89 * @param: tpm_register, the tpm tis register where the data should be written 90 * @param: tpm_data, the tpm_data to write inside the tpm_register 91 * @param: tpm_size, The length of the data 92 * @return: Returns negative errno, or else the number of bytes written. 93 */ 94static int write8_reg(struct i2c_client *client, u8 tpm_register, 95 u8 *tpm_data, u16 tpm_size) 96{ 97 struct st33zp24_platform_data *pin_infos; 98 99 pin_infos = client->dev.platform_data; 100 101 pin_infos->tpm_i2c_buffer[0][0] = tpm_register; 102 memcpy(&pin_infos->tpm_i2c_buffer[0][1], tpm_data, tpm_size); 103 return i2c_master_send(client, pin_infos->tpm_i2c_buffer[0], 104 tpm_size + 1); 105} /* write8_reg() */ 106 107/* 108 * read8_reg 109 * Recv byte from the TIS register according to the ST33ZP24 I2C protocol. 110 * @param: tpm_register, the tpm tis register where the data should be read 111 * @param: tpm_data, the TPM response 112 * @param: tpm_size, tpm TPM response size to read. 113 * @return: number of byte read successfully: should be one if success. 114 */ 115static int read8_reg(struct i2c_client *client, u8 tpm_register, 116 u8 *tpm_data, int tpm_size) 117{ 118 u8 status = 0; 119 u8 data; 120 121 data = TPM_DUMMY_BYTE; 122 status = write8_reg(client, tpm_register, &data, 1); 123 if (status == 2) 124 status = i2c_master_recv(client, tpm_data, tpm_size); 125 return status; 126} /* read8_reg() */ 127 128/* 129 * I2C_WRITE_DATA 130 * Send byte to the TIS register according to the ST33ZP24 I2C protocol. 131 * @param: client, the chip description 132 * @param: tpm_register, the tpm tis register where the data should be written 133 * @param: tpm_data, the tpm_data to write inside the tpm_register 134 * @param: tpm_size, The length of the data 135 * @return: number of byte written successfully: should be one if success. 136 */ 137#define I2C_WRITE_DATA(client, tpm_register, tpm_data, tpm_size) \ 138 (write8_reg(client, tpm_register | \ 139 TPM_WRITE_DIRECTION, tpm_data, tpm_size)) 140 141/* 142 * I2C_READ_DATA 143 * Recv byte from the TIS register according to the ST33ZP24 I2C protocol. 144 * @param: tpm, the chip description 145 * @param: tpm_register, the tpm tis register where the data should be read 146 * @param: tpm_data, the TPM response 147 * @param: tpm_size, tpm TPM response size to read. 148 * @return: number of byte read successfully: should be one if success. 149 */ 150#define I2C_READ_DATA(client, tpm_register, tpm_data, tpm_size) \ 151 (read8_reg(client, tpm_register, tpm_data, tpm_size)) 152 153/* 154 * clear_interruption 155 * clear the TPM interrupt register. 156 * @param: tpm, the chip description 157 */ 158static void clear_interruption(struct i2c_client *client) 159{ 160 u8 interrupt; 161 I2C_READ_DATA(client, TPM_INT_STATUS, &interrupt, 1); 162 I2C_WRITE_DATA(client, TPM_INT_STATUS, &interrupt, 1); 163 I2C_READ_DATA(client, TPM_INT_STATUS, &interrupt, 1); 164} /* clear_interruption() */ 165 166/* 167 * _wait_for_interrupt_serirq_timeout 168 * @param: tpm, the chip description 169 * @param: timeout, the timeout of the interrupt 170 * @return: the status of the interruption. 171 */ 172static long _wait_for_interrupt_serirq_timeout(struct tpm_chip *chip, 173 unsigned long timeout) 174{ 175 long status; 176 struct i2c_client *client; 177 struct st33zp24_platform_data *pin_infos; 178 179 client = (struct i2c_client *)TPM_VPRIV(chip); 180 pin_infos = client->dev.platform_data; 181 182 status = wait_for_completion_interruptible_timeout( 183 &pin_infos->irq_detection, 184 timeout); 185 if (status > 0) 186 enable_irq(gpio_to_irq(pin_infos->io_serirq)); 187 gpio_direction_input(pin_infos->io_serirq); 188 189 return status; 190} /* wait_for_interrupt_serirq_timeout() */ 191 192static int wait_for_serirq_timeout(struct tpm_chip *chip, bool condition, 193 unsigned long timeout) 194{ 195 int status = 2; 196 struct i2c_client *client; 197 198 client = (struct i2c_client *)TPM_VPRIV(chip); 199 200 status = _wait_for_interrupt_serirq_timeout(chip, timeout); 201 if (!status) { 202 status = -EBUSY; 203 } else { 204 clear_interruption(client); 205 if (condition) 206 status = 1; 207 } 208 return status; 209} 210 211/* 212 * tpm_stm_i2c_cancel, cancel is not implemented. 213 * @param: chip, the tpm_chip description as specified in driver/char/tpm/tpm.h 214 */ 215static void tpm_stm_i2c_cancel(struct tpm_chip *chip) 216{ 217 struct i2c_client *client; 218 u8 data; 219 220 client = (struct i2c_client *)TPM_VPRIV(chip); 221 222 data = TPM_STS_COMMAND_READY; 223 I2C_WRITE_DATA(client, TPM_STS, &data, 1); 224 if (chip->vendor.irq) 225 wait_for_serirq_timeout(chip, 1, chip->vendor.timeout_a); 226} /* tpm_stm_i2c_cancel() */ 227 228/* 229 * tpm_stm_spi_status return the TPM_STS register 230 * @param: chip, the tpm chip description 231 * @return: the TPM_STS register value. 232 */ 233static u8 tpm_stm_i2c_status(struct tpm_chip *chip) 234{ 235 struct i2c_client *client; 236 u8 data; 237 client = (struct i2c_client *)TPM_VPRIV(chip); 238 239 I2C_READ_DATA(client, TPM_STS, &data, 1); 240 return data; 241} /* tpm_stm_i2c_status() */ 242 243 244/* 245 * check_locality if the locality is active 246 * @param: chip, the tpm chip description 247 * @return: the active locality or -EACCESS. 248 */ 249static int check_locality(struct tpm_chip *chip) 250{ 251 struct i2c_client *client; 252 u8 data; 253 u8 status; 254 255 client = (struct i2c_client *)TPM_VPRIV(chip); 256 257 status = I2C_READ_DATA(client, TPM_ACCESS, &data, 1); 258 if (status && (data & 259 (TPM_ACCESS_ACTIVE_LOCALITY | TPM_ACCESS_VALID)) == 260 (TPM_ACCESS_ACTIVE_LOCALITY | TPM_ACCESS_VALID)) 261 return chip->vendor.locality; 262 263 return -EACCES; 264 265} /* check_locality() */ 266 267/* 268 * request_locality request the TPM locality 269 * @param: chip, the chip description 270 * @return: the active locality or EACCESS. 271 */ 272static int request_locality(struct tpm_chip *chip) 273{ 274 unsigned long stop; 275 long rc; 276 struct i2c_client *client; 277 u8 data; 278 279 client = (struct i2c_client *)TPM_VPRIV(chip); 280 281 if (check_locality(chip) == chip->vendor.locality) 282 return chip->vendor.locality; 283 284 data = TPM_ACCESS_REQUEST_USE; 285 rc = I2C_WRITE_DATA(client, TPM_ACCESS, &data, 1); 286 if (rc < 0) 287 goto end; 288 289 if (chip->vendor.irq) { 290 rc = wait_for_serirq_timeout(chip, (check_locality 291 (chip) >= 0), 292 chip->vendor.timeout_a); 293 if (rc > 0) 294 return chip->vendor.locality; 295 } else { 296 stop = jiffies + chip->vendor.timeout_a; 297 do { 298 if (check_locality(chip) >= 0) 299 return chip->vendor.locality; 300 msleep(TPM_TIMEOUT); 301 } while (time_before(jiffies, stop)); 302 } 303 rc = -EACCES; 304end: 305 return rc; 306} /* request_locality() */ 307 308/* 309 * release_locality release the active locality 310 * @param: chip, the tpm chip description. 311 */ 312static void release_locality(struct tpm_chip *chip) 313{ 314 struct i2c_client *client; 315 u8 data; 316 317 client = (struct i2c_client *)TPM_VPRIV(chip); 318 data = TPM_ACCESS_ACTIVE_LOCALITY; 319 320 I2C_WRITE_DATA(client, TPM_ACCESS, &data, 1); 321} 322 323/* 324 * get_burstcount return the burstcount address 0x19 0x1A 325 * @param: chip, the chip description 326 * return: the burstcount. 327 */ 328static int get_burstcount(struct tpm_chip *chip) 329{ 330 unsigned long stop; 331 int burstcnt, status; 332 u8 tpm_reg, temp; 333 334 struct i2c_client *client = (struct i2c_client *)TPM_VPRIV(chip); 335 336 stop = jiffies + chip->vendor.timeout_d; 337 do { 338 tpm_reg = TPM_STS + 1; 339 status = I2C_READ_DATA(client, tpm_reg, &temp, 1); 340 if (status < 0) 341 goto end; 342 343 tpm_reg = tpm_reg + 1; 344 burstcnt = temp; 345 status = I2C_READ_DATA(client, tpm_reg, &temp, 1); 346 if (status < 0) 347 goto end; 348 349 burstcnt |= temp << 8; 350 if (burstcnt) 351 return burstcnt; 352 msleep(TPM_TIMEOUT); 353 } while (time_before(jiffies, stop)); 354 355end: 356 return -EBUSY; 357} /* get_burstcount() */ 358 359/* 360 * wait_for_stat wait for a TPM_STS value 361 * @param: chip, the tpm chip description 362 * @param: mask, the value mask to wait 363 * @param: timeout, the timeout 364 * @param: queue, the wait queue. 365 * @return: the tpm status, 0 if success, -ETIME if timeout is reached. 366 */ 367static int wait_for_stat(struct tpm_chip *chip, u8 mask, unsigned long timeout, 368 wait_queue_head_t *queue) 369{ 370 unsigned long stop; 371 long rc; 372 u8 status; 373 374 if (chip->vendor.irq) { 375 rc = wait_for_serirq_timeout(chip, ((tpm_stm_i2c_status 376 (chip) & mask) == 377 mask), timeout); 378 if (rc > 0) 379 return 0; 380 } else { 381 stop = jiffies + timeout; 382 do { 383 msleep(TPM_TIMEOUT); 384 status = tpm_stm_i2c_status(chip); 385 if ((status & mask) == mask) 386 return 0; 387 } while (time_before(jiffies, stop)); 388 } 389 return -ETIME; 390} /* wait_for_stat() */ 391 392/* 393 * recv_data receive data 394 * @param: chip, the tpm chip description 395 * @param: buf, the buffer where the data are received 396 * @param: count, the number of data to receive 397 * @return: the number of bytes read from TPM FIFO. 398 */ 399static int recv_data(struct tpm_chip *chip, u8 *buf, size_t count) 400{ 401 int size = 0, burstcnt, len; 402 struct i2c_client *client; 403 404 client = (struct i2c_client *)TPM_VPRIV(chip); 405 406 while (size < count && 407 wait_for_stat(chip, 408 TPM_STS_DATA_AVAIL | TPM_STS_VALID, 409 chip->vendor.timeout_c, 410 &chip->vendor.read_queue) 411 == 0) { 412 burstcnt = get_burstcount(chip); 413 if (burstcnt < 0) 414 return burstcnt; 415 len = min_t(int, burstcnt, count - size); 416 I2C_READ_DATA(client, TPM_DATA_FIFO, buf + size, len); 417 size += len; 418 } 419 return size; 420} 421 422/* 423 * tpm_ioserirq_handler the serirq irq handler 424 * @param: irq, the tpm chip description 425 * @param: dev_id, the description of the chip 426 * @return: the status of the handler. 427 */ 428static irqreturn_t tpm_ioserirq_handler(int irq, void *dev_id) 429{ 430 struct tpm_chip *chip = dev_id; 431 struct i2c_client *client; 432 struct st33zp24_platform_data *pin_infos; 433 434 disable_irq_nosync(irq); 435 436 client = (struct i2c_client *)TPM_VPRIV(chip); 437 pin_infos = client->dev.platform_data; 438 439 complete(&pin_infos->irq_detection); 440 return IRQ_HANDLED; 441} /* tpm_ioserirq_handler() */ 442 443 444/* 445 * tpm_stm_i2c_send send TPM commands through the I2C bus. 446 * 447 * @param: chip, the tpm_chip description as specified in driver/char/tpm/tpm.h 448 * @param: buf, the buffer to send. 449 * @param: count, the number of bytes to send. 450 * @return: In case of success the number of bytes sent. 451 * In other case, a < 0 value describing the issue. 452 */ 453static int tpm_stm_i2c_send(struct tpm_chip *chip, unsigned char *buf, 454 size_t len) 455{ 456 u32 status, i, size; 457 int burstcnt = 0; 458 int ret; 459 u8 data; 460 struct i2c_client *client; 461 462 if (chip == NULL) 463 return -EBUSY; 464 if (len < TPM_HEADER_SIZE) 465 return -EBUSY; 466 467 client = (struct i2c_client *)TPM_VPRIV(chip); 468 469 client->flags = 0; 470 471 ret = request_locality(chip); 472 if (ret < 0) 473 return ret; 474 475 status = tpm_stm_i2c_status(chip); 476 if ((status & TPM_STS_COMMAND_READY) == 0) { 477 tpm_stm_i2c_cancel(chip); 478 if (wait_for_stat 479 (chip, TPM_STS_COMMAND_READY, chip->vendor.timeout_b, 480 &chip->vendor.int_queue) < 0) { 481 ret = -ETIME; 482 goto out_err; 483 } 484 } 485 486 for (i = 0; i < len - 1;) { 487 burstcnt = get_burstcount(chip); 488 if (burstcnt < 0) 489 return burstcnt; 490 size = min_t(int, len - i - 1, burstcnt); 491 ret = I2C_WRITE_DATA(client, TPM_DATA_FIFO, buf, size); 492 if (ret < 0) 493 goto out_err; 494 495 i += size; 496 } 497 498 status = tpm_stm_i2c_status(chip); 499 if ((status & TPM_STS_DATA_EXPECT) == 0) { 500 ret = -EIO; 501 goto out_err; 502 } 503 504 ret = I2C_WRITE_DATA(client, TPM_DATA_FIFO, buf + len - 1, 1); 505 if (ret < 0) 506 goto out_err; 507 508 status = tpm_stm_i2c_status(chip); 509 if ((status & TPM_STS_DATA_EXPECT) != 0) { 510 ret = -EIO; 511 goto out_err; 512 } 513 514 data = TPM_STS_GO; 515 I2C_WRITE_DATA(client, TPM_STS, &data, 1); 516 517 return len; 518out_err: 519 tpm_stm_i2c_cancel(chip); 520 release_locality(chip); 521 return ret; 522} 523 524/* 525 * tpm_stm_i2c_recv received TPM response through the I2C bus. 526 * @param: chip, the tpm_chip description as specified in driver/char/tpm/tpm.h. 527 * @param: buf, the buffer to store datas. 528 * @param: count, the number of bytes to send. 529 * @return: In case of success the number of bytes received. 530 * In other case, a < 0 value describing the issue. 531 */ 532static int tpm_stm_i2c_recv(struct tpm_chip *chip, unsigned char *buf, 533 size_t count) 534{ 535 int size = 0; 536 int expected; 537 538 if (chip == NULL) 539 return -EBUSY; 540 541 if (count < TPM_HEADER_SIZE) { 542 size = -EIO; 543 goto out; 544 } 545 546 size = recv_data(chip, buf, TPM_HEADER_SIZE); 547 if (size < TPM_HEADER_SIZE) { 548 dev_err(chip->dev, "Unable to read header\n"); 549 goto out; 550 } 551 552 expected = be32_to_cpu(*(__be32 *)(buf + 2)); 553 if (expected > count) { 554 size = -EIO; 555 goto out; 556 } 557 558 size += recv_data(chip, &buf[TPM_HEADER_SIZE], 559 expected - TPM_HEADER_SIZE); 560 if (size < expected) { 561 dev_err(chip->dev, "Unable to read remainder of result\n"); 562 size = -ETIME; 563 goto out; 564 } 565 566out: 567 chip->ops->cancel(chip); 568 release_locality(chip); 569 return size; 570} 571 572static bool tpm_st33_i2c_req_canceled(struct tpm_chip *chip, u8 status) 573{ 574 return (status == TPM_STS_COMMAND_READY); 575} 576 577static const struct tpm_class_ops st_i2c_tpm = { 578 .send = tpm_stm_i2c_send, 579 .recv = tpm_stm_i2c_recv, 580 .cancel = tpm_stm_i2c_cancel, 581 .status = tpm_stm_i2c_status, 582 .req_complete_mask = TPM_STS_DATA_AVAIL | TPM_STS_VALID, 583 .req_complete_val = TPM_STS_DATA_AVAIL | TPM_STS_VALID, 584 .req_canceled = tpm_st33_i2c_req_canceled, 585}; 586 587static int interrupts; 588module_param(interrupts, int, 0444); 589MODULE_PARM_DESC(interrupts, "Enable interrupts"); 590 591static int power_mgt = 1; 592module_param(power_mgt, int, 0444); 593MODULE_PARM_DESC(power_mgt, "Power Management"); 594 595/* 596 * tpm_st33_i2c_probe initialize the TPM device 597 * @param: client, the i2c_client drescription (TPM I2C description). 598 * @param: id, the i2c_device_id struct. 599 * @return: 0 in case of success. 600 * -1 in other case. 601 */ 602static int 603tpm_st33_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) 604{ 605 int err; 606 u8 intmask; 607 struct tpm_chip *chip; 608 struct st33zp24_platform_data *platform_data; 609 610 if (client == NULL) { 611 pr_info("%s: i2c client is NULL. Device not accessible.\n", 612 __func__); 613 err = -ENODEV; 614 goto end; 615 } 616 617 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { 618 dev_info(&client->dev, "client not i2c capable\n"); 619 err = -ENODEV; 620 goto end; 621 } 622 623 chip = tpm_register_hardware(&client->dev, &st_i2c_tpm); 624 if (!chip) { 625 dev_info(&client->dev, "fail chip\n"); 626 err = -ENODEV; 627 goto end; 628 } 629 630 platform_data = client->dev.platform_data; 631 632 if (!platform_data) { 633 dev_info(&client->dev, "chip not available\n"); 634 err = -ENODEV; 635 goto _tpm_clean_answer; 636 } 637 638 platform_data->tpm_i2c_buffer[0] = 639 kmalloc(TPM_BUFSIZE * sizeof(u8), GFP_KERNEL); 640 if (platform_data->tpm_i2c_buffer[0] == NULL) { 641 err = -ENOMEM; 642 goto _tpm_clean_answer; 643 } 644 platform_data->tpm_i2c_buffer[1] = 645 kmalloc(TPM_BUFSIZE * sizeof(u8), GFP_KERNEL); 646 if (platform_data->tpm_i2c_buffer[1] == NULL) { 647 err = -ENOMEM; 648 goto _tpm_clean_response1; 649 } 650 651 TPM_VPRIV(chip) = client; 652 653 chip->vendor.timeout_a = msecs_to_jiffies(TIS_SHORT_TIMEOUT); 654 chip->vendor.timeout_b = msecs_to_jiffies(TIS_LONG_TIMEOUT); 655 chip->vendor.timeout_c = msecs_to_jiffies(TIS_SHORT_TIMEOUT); 656 chip->vendor.timeout_d = msecs_to_jiffies(TIS_SHORT_TIMEOUT); 657 658 chip->vendor.locality = LOCALITY0; 659 660 if (power_mgt) { 661 err = gpio_request(platform_data->io_lpcpd, "TPM IO_LPCPD"); 662 if (err) 663 goto _gpio_init1; 664 gpio_set_value(platform_data->io_lpcpd, 1); 665 } 666 667 if (interrupts) { 668 init_completion(&platform_data->irq_detection); 669 if (request_locality(chip) != LOCALITY0) { 670 err = -ENODEV; 671 goto _tpm_clean_response2; 672 } 673 err = gpio_request(platform_data->io_serirq, "TPM IO_SERIRQ"); 674 if (err) 675 goto _gpio_init2; 676 677 clear_interruption(client); 678 err = request_irq(gpio_to_irq(platform_data->io_serirq), 679 &tpm_ioserirq_handler, 680 IRQF_TRIGGER_HIGH, 681 "TPM SERIRQ management", chip); 682 if (err < 0) { 683 dev_err(chip->dev , "TPM SERIRQ signals %d not available\n", 684 gpio_to_irq(platform_data->io_serirq)); 685 goto _irq_set; 686 } 687 688 err = I2C_READ_DATA(client, TPM_INT_ENABLE, &intmask, 1); 689 if (err < 0) 690 goto _irq_set; 691 692 intmask |= TPM_INTF_CMD_READY_INT 693 | TPM_INTF_FIFO_AVALAIBLE_INT 694 | TPM_INTF_WAKE_UP_READY_INT 695 | TPM_INTF_LOCALITY_CHANGE_INT 696 | TPM_INTF_STS_VALID_INT 697 | TPM_INTF_DATA_AVAIL_INT; 698 699 err = I2C_WRITE_DATA(client, TPM_INT_ENABLE, &intmask, 1); 700 if (err < 0) 701 goto _irq_set; 702 703 intmask = TPM_GLOBAL_INT_ENABLE; 704 err = I2C_WRITE_DATA(client, (TPM_INT_ENABLE + 3), &intmask, 1); 705 if (err < 0) 706 goto _irq_set; 707 708 err = I2C_READ_DATA(client, TPM_INT_STATUS, &intmask, 1); 709 if (err < 0) 710 goto _irq_set; 711 712 chip->vendor.irq = interrupts; 713 714 tpm_gen_interrupt(chip); 715 } 716 717 tpm_get_timeouts(chip); 718 719 dev_info(chip->dev, "TPM I2C Initialized\n"); 720 return 0; 721_irq_set: 722 free_irq(gpio_to_irq(platform_data->io_serirq), (void *)chip); 723_gpio_init2: 724 if (interrupts) 725 gpio_free(platform_data->io_serirq); 726_gpio_init1: 727 if (power_mgt) 728 gpio_free(platform_data->io_lpcpd); 729_tpm_clean_response2: 730 kzfree(platform_data->tpm_i2c_buffer[1]); 731 platform_data->tpm_i2c_buffer[1] = NULL; 732_tpm_clean_response1: 733 kzfree(platform_data->tpm_i2c_buffer[0]); 734 platform_data->tpm_i2c_buffer[0] = NULL; 735_tpm_clean_answer: 736 tpm_remove_hardware(chip->dev); 737end: 738 pr_info("TPM I2C initialisation fail\n"); 739 return err; 740} 741 742/* 743 * tpm_st33_i2c_remove remove the TPM device 744 * @param: client, the i2c_client drescription (TPM I2C description). 745 clear_bit(0, &chip->is_open); 746 * @return: 0 in case of success. 747 */ 748static int tpm_st33_i2c_remove(struct i2c_client *client) 749{ 750 struct tpm_chip *chip = (struct tpm_chip *)i2c_get_clientdata(client); 751 struct st33zp24_platform_data *pin_infos = 752 ((struct i2c_client *)TPM_VPRIV(chip))->dev.platform_data; 753 754 if (pin_infos != NULL) { 755 free_irq(pin_infos->io_serirq, chip); 756 757 gpio_free(pin_infos->io_serirq); 758 gpio_free(pin_infos->io_lpcpd); 759 760 tpm_remove_hardware(chip->dev); 761 762 if (pin_infos->tpm_i2c_buffer[1] != NULL) { 763 kzfree(pin_infos->tpm_i2c_buffer[1]); 764 pin_infos->tpm_i2c_buffer[1] = NULL; 765 } 766 if (pin_infos->tpm_i2c_buffer[0] != NULL) { 767 kzfree(pin_infos->tpm_i2c_buffer[0]); 768 pin_infos->tpm_i2c_buffer[0] = NULL; 769 } 770 } 771 772 return 0; 773} 774 775#ifdef CONFIG_PM_SLEEP 776/* 777 * tpm_st33_i2c_pm_suspend suspend the TPM device 778 * @param: client, the i2c_client drescription (TPM I2C description). 779 * @param: mesg, the power management message. 780 * @return: 0 in case of success. 781 */ 782static int tpm_st33_i2c_pm_suspend(struct device *dev) 783{ 784 struct st33zp24_platform_data *pin_infos = dev->platform_data; 785 int ret = 0; 786 787 if (power_mgt) { 788 gpio_set_value(pin_infos->io_lpcpd, 0); 789 } else { 790 ret = tpm_pm_suspend(dev); 791 } 792 return ret; 793} /* tpm_st33_i2c_suspend() */ 794 795/* 796 * tpm_st33_i2c_pm_resume resume the TPM device 797 * @param: client, the i2c_client drescription (TPM I2C description). 798 * @return: 0 in case of success. 799 */ 800static int tpm_st33_i2c_pm_resume(struct device *dev) 801{ 802 struct tpm_chip *chip = dev_get_drvdata(dev); 803 struct st33zp24_platform_data *pin_infos = dev->platform_data; 804 805 int ret = 0; 806 807 if (power_mgt) { 808 gpio_set_value(pin_infos->io_lpcpd, 1); 809 ret = wait_for_serirq_timeout(chip, 810 (chip->ops->status(chip) & 811 TPM_STS_VALID) == TPM_STS_VALID, 812 chip->vendor.timeout_b); 813 } else { 814 ret = tpm_pm_resume(dev); 815 if (!ret) 816 tpm_do_selftest(chip); 817 } 818 return ret; 819} /* tpm_st33_i2c_pm_resume() */ 820#endif 821 822static const struct i2c_device_id tpm_st33_i2c_id[] = { 823 {TPM_ST33_I2C, 0}, 824 {} 825}; 826MODULE_DEVICE_TABLE(i2c, tpm_st33_i2c_id); 827static SIMPLE_DEV_PM_OPS(tpm_st33_i2c_ops, tpm_st33_i2c_pm_suspend, 828 tpm_st33_i2c_pm_resume); 829static struct i2c_driver tpm_st33_i2c_driver = { 830 .driver = { 831 .owner = THIS_MODULE, 832 .name = TPM_ST33_I2C, 833 .pm = &tpm_st33_i2c_ops, 834 }, 835 .probe = tpm_st33_i2c_probe, 836 .remove = tpm_st33_i2c_remove, 837 .id_table = tpm_st33_i2c_id 838}; 839 840module_i2c_driver(tpm_st33_i2c_driver); 841 842MODULE_AUTHOR("Christophe Ricard (tpmsupport@st.com)"); 843MODULE_DESCRIPTION("STM TPM I2C ST33 Driver"); 844MODULE_VERSION("1.2.0"); 845MODULE_LICENSE("GPL");