|
15 | 15 | */
|
16 | 16 |
|
17 | 17 | #include "tpm.h"
|
18 |
| -#include "tpm_atmel.h" |
| 18 | + |
| 19 | +struct tpm_atmel_priv { |
| 20 | + int region_size; |
| 21 | + int have_region; |
| 22 | + unsigned long base; |
| 23 | + void __iomem *iobase; |
| 24 | +}; |
| 25 | + |
| 26 | +#define atmel_getb(chip, offset) inb(atmel_get_priv(chip)->base + (offset)) |
| 27 | +#define atmel_putb(val, chip, offset) \ |
| 28 | + outb(val, atmel_get_priv(chip)->base + (offset)) |
| 29 | +#define atmel_request_region request_region |
| 30 | +#define atmel_release_region release_region |
| 31 | +/* Atmel definitions */ |
| 32 | +enum tpm_atmel_addr { |
| 33 | + TPM_ATMEL_BASE_ADDR_LO = 0x08, |
| 34 | + TPM_ATMEL_BASE_ADDR_HI = 0x09 |
| 35 | +}; |
| 36 | + |
| 37 | +static inline int tpm_read_index(int base, int index) |
| 38 | +{ |
| 39 | + outb(index, base); |
| 40 | + return inb(base + 1) & 0xFF; |
| 41 | +} |
| 42 | + |
| 43 | +/* Verify this is a 1.1 Atmel TPM */ |
| 44 | +static int atmel_verify_tpm11(void) |
| 45 | +{ |
| 46 | + /* verify that it is an Atmel part */ |
| 47 | + if (tpm_read_index(TPM_ADDR, 4) != 'A' || |
| 48 | + tpm_read_index(TPM_ADDR, 5) != 'T' || |
| 49 | + tpm_read_index(TPM_ADDR, 6) != 'M' || |
| 50 | + tpm_read_index(TPM_ADDR, 7) != 'L') |
| 51 | + return 1; |
| 52 | + |
| 53 | + /* query chip for its version number */ |
| 54 | + if (tpm_read_index(TPM_ADDR, 0x00) != 1 || |
| 55 | + tpm_read_index(TPM_ADDR, 0x01) != 1) |
| 56 | + return 1; |
| 57 | + |
| 58 | + /* This is an atmel supported part */ |
| 59 | + return 0; |
| 60 | +} |
| 61 | + |
| 62 | +/* Determine where to talk to device */ |
| 63 | +static void __iomem *atmel_get_base_addr(unsigned long *base, int *region_size) |
| 64 | +{ |
| 65 | + int lo, hi; |
| 66 | + |
| 67 | + if (atmel_verify_tpm11() != 0) |
| 68 | + return NULL; |
| 69 | + |
| 70 | + lo = tpm_read_index(TPM_ADDR, TPM_ATMEL_BASE_ADDR_LO); |
| 71 | + hi = tpm_read_index(TPM_ADDR, TPM_ATMEL_BASE_ADDR_HI); |
| 72 | + |
| 73 | + *base = (hi << 8) | lo; |
| 74 | + *region_size = 2; |
| 75 | + |
| 76 | + return ioport_map(*base, *region_size); |
| 77 | +} |
19 | 78 |
|
20 | 79 | /* write status bits */
|
21 | 80 | enum tpm_atmel_write_status {
|
@@ -142,7 +201,6 @@ static void atml_plat_remove(void)
|
142 | 201 | tpm_chip_unregister(chip);
|
143 | 202 | if (priv->have_region)
|
144 | 203 | atmel_release_region(priv->base, priv->region_size);
|
145 |
| - atmel_put_base_addr(priv->iobase); |
146 | 204 | platform_device_unregister(pdev);
|
147 | 205 | }
|
148 | 206 |
|
@@ -211,7 +269,6 @@ static int __init init_atmel(void)
|
211 | 269 | err_unreg_dev:
|
212 | 270 | platform_device_unregister(pdev);
|
213 | 271 | err_rel_reg:
|
214 |
| - atmel_put_base_addr(iobase); |
215 | 272 | if (have_region)
|
216 | 273 | atmel_release_region(base,
|
217 | 274 | region_size);
|
|
0 commit comments