aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/char/tpm/tpm_infineon.c58
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)
157static void wait_and_send(struct tpm_chip *chip, u8 sendbyte) 157static 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
320static u8 tpm_inf_status(struct tpm_chip *chip) 320static 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
325static DEVICE_ATTR(pubek, S_IRUGO, tpm_show_pubek, NULL); 325static 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
349static struct tpm_vendor_specific tpm_inf = { 349static 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
496err_release_region: 495err_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
500err_last: 499err_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
539MODULE_AUTHOR("Marcel Selhorst <selhorst@crypto.rub.de>"); 539MODULE_AUTHOR("Marcel Selhorst <selhorst@crypto.rub.de>");
540MODULE_DESCRIPTION("Driver for Infineon TPM SLD 9630 TT 1.1 / SLB 9635 TT 1.2"); 540MODULE_DESCRIPTION("Driver for Infineon TPM SLD 9630 TT 1.1 / SLB 9635 TT 1.2");
541MODULE_VERSION("1.7"); 541MODULE_VERSION("1.8");
542MODULE_LICENSE("GPL"); 542MODULE_LICENSE("GPL");