tpm_nsc.c (c203e45f069af47ca7623e4dcd8c00bfba2722e4) tpm_nsc.c (09f50c95425318232c534d931d8c28b96a3ce2c5)
1/*
2 * Copyright (C) 2004 IBM Corporation
3 *
4 * Authors:
5 * Leendert van Doorn <leendert@watson.ibm.com>
6 * Dave Safford <safford@watson.ibm.com>
7 * Reiner Sailer <sailer@watson.ibm.com>
8 * Kylene Hall <kjhall@us.ibm.com>

--- 259 unchanged lines hidden (view full) ---

268{
269 struct tpm_chip *chip = dev_get_drvdata(dev);
270 if ( chip ) {
271 release_region(chip->vendor.base, 2);
272 tpm_remove_hardware(chip->dev);
273 }
274}
275
1/*
2 * Copyright (C) 2004 IBM Corporation
3 *
4 * Authors:
5 * Leendert van Doorn <leendert@watson.ibm.com>
6 * Dave Safford <safford@watson.ibm.com>
7 * Reiner Sailer <sailer@watson.ibm.com>
8 * Kylene Hall <kjhall@us.ibm.com>

--- 259 unchanged lines hidden (view full) ---

268{
269 struct tpm_chip *chip = dev_get_drvdata(dev);
270 if ( chip ) {
271 release_region(chip->vendor.base, 2);
272 tpm_remove_hardware(chip->dev);
273 }
274}
275
276static struct device_driver nsc_drv = {
277 .name = "tpm_nsc",
278 .bus = &platform_bus_type,
279 .owner = THIS_MODULE,
280 .suspend = tpm_pm_suspend,
281 .resume = tpm_pm_resume,
276static int tpm_nsc_suspend(struct platform_device *dev, pm_message_t msg)
277{
278 return tpm_pm_suspend(&dev->dev, msg);
279}
280
281static int tpm_nsc_resume(struct platform_device *dev)
282{
283 return tpm_pm_resume(&dev->dev);
284}
285
286static struct platform_driver nsc_drv = {
287 .suspend = tpm_nsc_suspend,
288 .resume = tpm_nsc_resume,
289 .driver = {
290 .name = "tpm_nsc",
291 .owner = THIS_MODULE,
292 },
282};
283
284static int __init init_nsc(void)
285{
286 int rc = 0;
287 int lo, hi, err;
288 int nscAddrBase = TPM_ADDR;
289 struct tpm_chip *chip;
290 unsigned long base;
291
292 /* verify that it is a National part (SID) */
293 if (tpm_read_index(TPM_ADDR, NSC_SID_INDEX) != 0xEF) {
294 nscAddrBase = (tpm_read_index(TPM_SUPERIO_ADDR, 0x2C)<<8)|
295 (tpm_read_index(TPM_SUPERIO_ADDR, 0x2B)&0xFE);
296 if (tpm_read_index(nscAddrBase, NSC_SID_INDEX) != 0xF6)
297 return -ENODEV;
298 }
299
293};
294
295static int __init init_nsc(void)
296{
297 int rc = 0;
298 int lo, hi, err;
299 int nscAddrBase = TPM_ADDR;
300 struct tpm_chip *chip;
301 unsigned long base;
302
303 /* verify that it is a National part (SID) */
304 if (tpm_read_index(TPM_ADDR, NSC_SID_INDEX) != 0xEF) {
305 nscAddrBase = (tpm_read_index(TPM_SUPERIO_ADDR, 0x2C)<<8)|
306 (tpm_read_index(TPM_SUPERIO_ADDR, 0x2B)&0xFE);
307 if (tpm_read_index(nscAddrBase, NSC_SID_INDEX) != 0xF6)
308 return -ENODEV;
309 }
310
300 err = driver_register(&nsc_drv);
311 err = platform_driver_register(&nsc_drv);
301 if (err)
302 return err;
303
304 hi = tpm_read_index(nscAddrBase, TPM_NSC_BASE0_HI);
305 lo = tpm_read_index(nscAddrBase, TPM_NSC_BASE0_LO);
306 base = (hi<<8) | lo;
307
308 /* enable the DPM module */
309 tpm_write_index(nscAddrBase, NSC_LDC_INDEX, 0x01);
310
312 if (err)
313 return err;
314
315 hi = tpm_read_index(nscAddrBase, TPM_NSC_BASE0_HI);
316 lo = tpm_read_index(nscAddrBase, TPM_NSC_BASE0_LO);
317 base = (hi<<8) | lo;
318
319 /* enable the DPM module */
320 tpm_write_index(nscAddrBase, NSC_LDC_INDEX, 0x01);
321
311 pdev = kzalloc(sizeof(struct platform_device), GFP_KERNEL);
322 pdev = platform_device_alloc("tpm_nscl0", -1);
312 if (!pdev) {
313 rc = -ENOMEM;
314 goto err_unreg_drv;
315 }
316
323 if (!pdev) {
324 rc = -ENOMEM;
325 goto err_unreg_drv;
326 }
327
317 pdev->name = "tpm_nscl0";
318 pdev->id = -1;
319 pdev->num_resources = 0;
328 pdev->num_resources = 0;
329 pdev->dev.driver = &nsc_drv.driver;
320 pdev->dev.release = tpm_nsc_remove;
330 pdev->dev.release = tpm_nsc_remove;
321 pdev->dev.driver = &nsc_drv;
322
323 if ((rc = platform_device_register(pdev)) < 0)
324 goto err_free_dev;
325
326 if (request_region(base, 2, "tpm_nsc0") == NULL ) {
327 rc = -EBUSY;
328 goto err_unreg_dev;
329 }

--- 42 unchanged lines hidden (view full) ---

372
373err_rel_reg:
374 release_region(base, 2);
375err_unreg_dev:
376 platform_device_unregister(pdev);
377err_free_dev:
378 kfree(pdev);
379err_unreg_drv:
331
332 if ((rc = platform_device_register(pdev)) < 0)
333 goto err_free_dev;
334
335 if (request_region(base, 2, "tpm_nsc0") == NULL ) {
336 rc = -EBUSY;
337 goto err_unreg_dev;
338 }

--- 42 unchanged lines hidden (view full) ---

381
382err_rel_reg:
383 release_region(base, 2);
384err_unreg_dev:
385 platform_device_unregister(pdev);
386err_free_dev:
387 kfree(pdev);
388err_unreg_drv:
380 driver_unregister(&nsc_drv);
389 platform_driver_unregister(&nsc_drv);
381 return rc;
382}
383
384static void __exit cleanup_nsc(void)
385{
386 if (pdev) {
387 tpm_nsc_remove(&pdev->dev);
388 platform_device_unregister(pdev);
389 kfree(pdev);
390 pdev = NULL;
391 }
392
390 return rc;
391}
392
393static void __exit cleanup_nsc(void)
394{
395 if (pdev) {
396 tpm_nsc_remove(&pdev->dev);
397 platform_device_unregister(pdev);
398 kfree(pdev);
399 pdev = NULL;
400 }
401
393 driver_unregister(&nsc_drv);
402 platform_driver_unregister(&nsc_drv);
394}
395
396module_init(init_nsc);
397module_exit(cleanup_nsc);
398
399MODULE_AUTHOR("Leendert van Doorn (leendert@watson.ibm.com)");
400MODULE_DESCRIPTION("TPM Driver");
401MODULE_VERSION("2.0");
402MODULE_LICENSE("GPL");
403}
404
405module_init(init_nsc);
406module_exit(cleanup_nsc);
407
408MODULE_AUTHOR("Leendert van Doorn (leendert@watson.ibm.com)");
409MODULE_DESCRIPTION("TPM Driver");
410MODULE_VERSION("2.0");
411MODULE_LICENSE("GPL");