diff options
| -rw-r--r-- | drivers/char/tpm/tpm_infineon.c | 58 | 
1 files changed, 29 insertions, 29 deletions
| diff --git a/drivers/char/tpm/tpm_infineon.c b/drivers/char/tpm/tpm_infineon.c index 24095f6ee6da..90cae8f9fe21 100644 --- a/drivers/char/tpm/tpm_infineon.c +++ b/drivers/char/tpm/tpm_infineon.c | |||
| @@ -104,7 +104,7 @@ static int empty_fifo(struct tpm_chip *chip, int clear_wrfifo) | |||
| 104 | 104 | ||
| 105 | if (clear_wrfifo) { | 105 | if (clear_wrfifo) { | 
| 106 | for (i = 0; i < 4096; i++) { | 106 | for (i = 0; i < 4096; i++) { | 
| 107 | status = inb(chip->vendor->base + WRFIFO); | 107 | status = inb(chip->vendor.base + WRFIFO); | 
| 108 | if (status == 0xff) { | 108 | if (status == 0xff) { | 
| 109 | if (check == 5) | 109 | if (check == 5) | 
| 110 | break; | 110 | break; | 
| @@ -124,8 +124,8 @@ static int empty_fifo(struct tpm_chip *chip, int clear_wrfifo) | |||
| 124 | */ | 124 | */ | 
| 125 | i = 0; | 125 | i = 0; | 
| 126 | do { | 126 | do { | 
| 127 | status = inb(chip->vendor->base + RDFIFO); | 127 | status = inb(chip->vendor.base + RDFIFO); | 
| 128 | status = inb(chip->vendor->base + STAT); | 128 | status = inb(chip->vendor.base + STAT); | 
| 129 | i++; | 129 | i++; | 
| 130 | if (i == TPM_MAX_TRIES) | 130 | if (i == TPM_MAX_TRIES) | 
| 131 | return -EIO; | 131 | return -EIO; | 
| @@ -138,7 +138,7 @@ static int wait(struct tpm_chip *chip, int wait_for_bit) | |||
| 138 | int status; | 138 | int status; | 
| 139 | int i; | 139 | int i; | 
| 140 | for (i = 0; i < TPM_MAX_TRIES; i++) { | 140 | for (i = 0; i < TPM_MAX_TRIES; i++) { | 
| 141 | status = inb(chip->vendor->base + STAT); | 141 | status = inb(chip->vendor.base + STAT); | 
| 142 | /* check the status-register if wait_for_bit is set */ | 142 | /* check the status-register if wait_for_bit is set */ | 
| 143 | if (status & 1 << wait_for_bit) | 143 | if (status & 1 << wait_for_bit) | 
| 144 | break; | 144 | break; | 
| @@ -157,7 +157,7 @@ static int wait(struct tpm_chip *chip, int wait_for_bit) | |||
| 157 | static void wait_and_send(struct tpm_chip *chip, u8 sendbyte) | 157 | static void wait_and_send(struct tpm_chip *chip, u8 sendbyte) | 
| 158 | { | 158 | { | 
| 159 | wait(chip, STAT_XFE); | 159 | wait(chip, STAT_XFE); | 
| 160 | outb(sendbyte, chip->vendor->base + WRFIFO); | 160 | outb(sendbyte, chip->vendor.base + WRFIFO); | 
| 161 | } | 161 | } | 
| 162 | 162 | ||
| 163 | /* Note: WTX means Waiting-Time-Extension. Whenever the TPM needs more | 163 | /* Note: WTX means Waiting-Time-Extension. Whenever the TPM needs more | 
| @@ -204,7 +204,7 @@ recv_begin: | |||
| 204 | ret = wait(chip, STAT_RDA); | 204 | ret = wait(chip, STAT_RDA); | 
| 205 | if (ret) | 205 | if (ret) | 
| 206 | return -EIO; | 206 | return -EIO; | 
| 207 | buf[i] = inb(chip->vendor->base + RDFIFO); | 207 | buf[i] = inb(chip->vendor.base + RDFIFO); | 
| 208 | } | 208 | } | 
| 209 | 209 | ||
| 210 | if (buf[0] != TPM_VL_VER) { | 210 | if (buf[0] != TPM_VL_VER) { | 
| @@ -219,7 +219,7 @@ recv_begin: | |||
| 219 | 219 | ||
| 220 | for (i = 0; i < size; i++) { | 220 | for (i = 0; i < size; i++) { | 
| 221 | wait(chip, STAT_RDA); | 221 | wait(chip, STAT_RDA); | 
| 222 | buf[i] = inb(chip->vendor->base + RDFIFO); | 222 | buf[i] = inb(chip->vendor.base + RDFIFO); | 
| 223 | } | 223 | } | 
| 224 | 224 | ||
| 225 | if ((size == 0x6D00) && (buf[1] == 0x80)) { | 225 | if ((size == 0x6D00) && (buf[1] == 0x80)) { | 
| @@ -268,7 +268,7 @@ static int tpm_inf_send(struct tpm_chip *chip, u8 * buf, size_t count) | |||
| 268 | u8 count_high, count_low, count_4, count_3, count_2, count_1; | 268 | u8 count_high, count_low, count_4, count_3, count_2, count_1; | 
| 269 | 269 | ||
| 270 | /* Disabling Reset, LP and IRQC */ | 270 | /* Disabling Reset, LP and IRQC */ | 
| 271 | outb(RESET_LP_IRQC_DISABLE, chip->vendor->base + CMD); | 271 | outb(RESET_LP_IRQC_DISABLE, chip->vendor.base + CMD); | 
| 272 | 272 | ||
| 273 | ret = empty_fifo(chip, 1); | 273 | ret = empty_fifo(chip, 1); | 
| 274 | if (ret) { | 274 | if (ret) { | 
| @@ -319,7 +319,7 @@ static void tpm_inf_cancel(struct tpm_chip *chip) | |||
| 319 | 319 | ||
| 320 | static u8 tpm_inf_status(struct tpm_chip *chip) | 320 | static u8 tpm_inf_status(struct tpm_chip *chip) | 
| 321 | { | 321 | { | 
| 322 | return inb(chip->vendor->base + STAT); | 322 | return inb(chip->vendor.base + STAT); | 
| 323 | } | 323 | } | 
| 324 | 324 | ||
| 325 | static DEVICE_ATTR(pubek, S_IRUGO, tpm_show_pubek, NULL); | 325 | static DEVICE_ATTR(pubek, S_IRUGO, tpm_show_pubek, NULL); | 
| @@ -346,7 +346,7 @@ static struct file_operations inf_ops = { | |||
| 346 | .release = tpm_release, | 346 | .release = tpm_release, | 
| 347 | }; | 347 | }; | 
| 348 | 348 | ||
| 349 | static struct tpm_vendor_specific tpm_inf = { | 349 | static const struct tpm_vendor_specific tpm_inf = { | 
| 350 | .recv = tpm_inf_recv, | 350 | .recv = tpm_inf_recv, | 
| 351 | .send = tpm_inf_send, | 351 | .send = tpm_inf_send, | 
| 352 | .cancel = tpm_inf_cancel, | 352 | .cancel = tpm_inf_cancel, | 
| @@ -375,6 +375,7 @@ static int __devinit tpm_inf_pnp_probe(struct pnp_dev *dev, | |||
| 375 | int version[2]; | 375 | int version[2]; | 
| 376 | int productid[2]; | 376 | int productid[2]; | 
| 377 | char chipname[20]; | 377 | char chipname[20]; | 
| 378 | struct tpm_chip *chip; | ||
| 378 | 379 | ||
| 379 | /* read IO-ports through PnP */ | 380 | /* read IO-ports through PnP */ | 
| 380 | if (pnp_port_valid(dev, 0) && pnp_port_valid(dev, 1) && | 381 | if (pnp_port_valid(dev, 0) && pnp_port_valid(dev, 1) && | 
| @@ -395,14 +396,13 @@ static int __devinit tpm_inf_pnp_probe(struct pnp_dev *dev, | |||
| 395 | goto err_last; | 396 | goto err_last; | 
| 396 | } | 397 | } | 
| 397 | /* publish my base address and request region */ | 398 | /* publish my base address and request region */ | 
| 398 | tpm_inf.base = TPM_INF_BASE; | ||
| 399 | if (request_region | 399 | if (request_region | 
| 400 | (tpm_inf.base, TPM_INF_PORT_LEN, "tpm_infineon0") == NULL) { | 400 | (TPM_INF_BASE, TPM_INF_PORT_LEN, "tpm_infineon0") == NULL) { | 
| 401 | rc = -EINVAL; | 401 | rc = -EINVAL; | 
| 402 | goto err_last; | 402 | goto err_last; | 
| 403 | } | 403 | } | 
| 404 | if (request_region(TPM_INF_ADDR, TPM_INF_ADDR_LEN, | 404 | if (request_region | 
| 405 | "tpm_infineon0") == NULL) { | 405 | (TPM_INF_ADDR, TPM_INF_ADDR_LEN, "tpm_infineon0") == NULL) { | 
| 406 | rc = -EINVAL; | 406 | rc = -EINVAL; | 
| 407 | goto err_last; | 407 | goto err_last; | 
| 408 | } | 408 | } | 
| @@ -442,9 +442,9 @@ static int __devinit tpm_inf_pnp_probe(struct pnp_dev *dev, | |||
| 442 | 442 | ||
| 443 | /* configure TPM with IO-ports */ | 443 | /* configure TPM with IO-ports */ | 
| 444 | outb(IOLIMH, TPM_INF_ADDR); | 444 | outb(IOLIMH, TPM_INF_ADDR); | 
| 445 | outb(((tpm_inf.base >> 8) & 0xff), TPM_INF_DATA); | 445 | outb(((TPM_INF_BASE >> 8) & 0xff), TPM_INF_DATA); | 
| 446 | outb(IOLIML, TPM_INF_ADDR); | 446 | outb(IOLIML, TPM_INF_ADDR); | 
| 447 | outb((tpm_inf.base & 0xff), TPM_INF_DATA); | 447 | outb((TPM_INF_BASE & 0xff), TPM_INF_DATA); | 
| 448 | 448 | ||
| 449 | /* control if IO-ports are set correctly */ | 449 | /* control if IO-ports are set correctly */ | 
| 450 | outb(IOLIMH, TPM_INF_ADDR); | 450 | outb(IOLIMH, TPM_INF_ADDR); | 
| @@ -452,10 +452,10 @@ static int __devinit tpm_inf_pnp_probe(struct pnp_dev *dev, | |||
| 452 | outb(IOLIML, TPM_INF_ADDR); | 452 | outb(IOLIML, TPM_INF_ADDR); | 
| 453 | iol = inb(TPM_INF_DATA); | 453 | iol = inb(TPM_INF_DATA); | 
| 454 | 454 | ||
| 455 | if ((ioh << 8 | iol) != tpm_inf.base) { | 455 | if ((ioh << 8 | iol) != TPM_INF_BASE) { | 
| 456 | dev_err(&dev->dev, | 456 | dev_err(&dev->dev, | 
| 457 | "Could not set IO-ports to 0x%lx\n", | 457 | "Could not set IO-ports to 0x%x\n", | 
| 458 | tpm_inf.base); | 458 | TPM_INF_BASE); | 
| 459 | rc = -EIO; | 459 | rc = -EIO; | 
| 460 | goto err_release_region; | 460 | goto err_release_region; | 
| 461 | } | 461 | } | 
| @@ -466,15 +466,15 @@ static int __devinit tpm_inf_pnp_probe(struct pnp_dev *dev, | |||
| 466 | outb(DISABLE_REGISTER_PAIR, TPM_INF_ADDR); | 466 | outb(DISABLE_REGISTER_PAIR, TPM_INF_ADDR); | 
| 467 | 467 | ||
| 468 | /* disable RESET, LP and IRQC */ | 468 | /* disable RESET, LP and IRQC */ | 
| 469 | outb(RESET_LP_IRQC_DISABLE, tpm_inf.base + CMD); | 469 | outb(RESET_LP_IRQC_DISABLE, TPM_INF_BASE + CMD); | 
| 470 | 470 | ||
| 471 | /* Finally, we're done, print some infos */ | 471 | /* Finally, we're done, print some infos */ | 
| 472 | dev_info(&dev->dev, "TPM found: " | 472 | dev_info(&dev->dev, "TPM found: " | 
| 473 | "config base 0x%x, " | 473 | "config base 0x%x, " | 
| 474 | "io base 0x%x, " | 474 | "io base 0x%x, " | 
| 475 | "chip version %02x%02x, " | 475 | "chip version 0x%02x%02x, " | 
| 476 | "vendor id %x%x (Infineon), " | 476 | "vendor id 0x%x%x (Infineon), " | 
| 477 | "product id %02x%02x" | 477 | "product id 0x%02x%02x" | 
| 478 | "%s\n", | 478 | "%s\n", | 
| 479 | TPM_INF_ADDR, | 479 | TPM_INF_ADDR, | 
| 480 | TPM_INF_BASE, | 480 | TPM_INF_BASE, | 
| @@ -482,11 +482,10 @@ static int __devinit tpm_inf_pnp_probe(struct pnp_dev *dev, | |||
| 482 | vendorid[0], vendorid[1], | 482 | vendorid[0], vendorid[1], | 
| 483 | productid[0], productid[1], chipname); | 483 | productid[0], productid[1], chipname); | 
| 484 | 484 | ||
| 485 | rc = tpm_register_hardware(&dev->dev, &tpm_inf); | 485 | if (!(chip = tpm_register_hardware(&dev->dev, &tpm_inf))) { | 
| 486 | if (rc < 0) { | ||
| 487 | rc = -ENODEV; | ||
| 488 | goto err_release_region; | 486 | goto err_release_region; | 
| 489 | } | 487 | } | 
| 488 | chip->vendor.base = TPM_INF_BASE; | ||
| 490 | return 0; | 489 | return 0; | 
| 491 | } else { | 490 | } else { | 
| 492 | rc = -ENODEV; | 491 | rc = -ENODEV; | 
| @@ -494,7 +493,7 @@ static int __devinit tpm_inf_pnp_probe(struct pnp_dev *dev, | |||
| 494 | } | 493 | } | 
| 495 | 494 | ||
| 496 | err_release_region: | 495 | err_release_region: | 
| 497 | release_region(tpm_inf.base, TPM_INF_PORT_LEN); | 496 | release_region(TPM_INF_BASE, TPM_INF_PORT_LEN); | 
| 498 | release_region(TPM_INF_ADDR, TPM_INF_ADDR_LEN); | 497 | release_region(TPM_INF_ADDR, TPM_INF_ADDR_LEN); | 
| 499 | 498 | ||
| 500 | err_last: | 499 | err_last: | 
| @@ -506,7 +505,8 @@ static __devexit void tpm_inf_pnp_remove(struct pnp_dev *dev) | |||
| 506 | struct tpm_chip *chip = pnp_get_drvdata(dev); | 505 | struct tpm_chip *chip = pnp_get_drvdata(dev); | 
| 507 | 506 | ||
| 508 | if (chip) { | 507 | if (chip) { | 
| 509 | release_region(chip->vendor->base, TPM_INF_PORT_LEN); | 508 | release_region(TPM_INF_BASE, TPM_INF_PORT_LEN); | 
| 509 | release_region(TPM_INF_ADDR, TPM_INF_ADDR_LEN); | ||
| 510 | tpm_remove_hardware(chip->dev); | 510 | tpm_remove_hardware(chip->dev); | 
| 511 | } | 511 | } | 
| 512 | } | 512 | } | 
| @@ -538,5 +538,5 @@ module_exit(cleanup_inf); | |||
| 538 | 538 | ||
| 539 | MODULE_AUTHOR("Marcel Selhorst <selhorst@crypto.rub.de>"); | 539 | MODULE_AUTHOR("Marcel Selhorst <selhorst@crypto.rub.de>"); | 
| 540 | MODULE_DESCRIPTION("Driver for Infineon TPM SLD 9630 TT 1.1 / SLB 9635 TT 1.2"); | 540 | MODULE_DESCRIPTION("Driver for Infineon TPM SLD 9630 TT 1.1 / SLB 9635 TT 1.2"); | 
| 541 | MODULE_VERSION("1.7"); | 541 | MODULE_VERSION("1.8"); | 
| 542 | MODULE_LICENSE("GPL"); | 542 | MODULE_LICENSE("GPL"); | 
