tpm: two-phase chip management functions
[firefly-linux-kernel-4.4.55.git] / drivers / char / tpm / tpm_ibmvtpm.c
index 96f5d448b84c530f77e2435cff250a5089d3bb4b..0840347e251c384af3fa198dfc3bc7e36f7cdbc6 100644 (file)
@@ -270,8 +270,11 @@ static int ibmvtpm_crq_send_init(struct ibmvtpm_dev *ibmvtpm)
 static int tpm_ibmvtpm_remove(struct vio_dev *vdev)
 {
        struct ibmvtpm_dev *ibmvtpm = ibmvtpm_get_data(&vdev->dev);
+       struct tpm_chip *chip = dev_get_drvdata(ibmvtpm->dev);
        int rc = 0;
 
+       tpm_chip_unregister(chip);
+
        free_irq(vdev->irq, ibmvtpm);
 
        do {
@@ -290,8 +293,6 @@ static int tpm_ibmvtpm_remove(struct vio_dev *vdev)
                kfree(ibmvtpm->rtce_buf);
        }
 
-       tpm_remove_hardware(ibmvtpm->dev);
-
        kfree(ibmvtpm);
 
        return 0;
@@ -563,11 +564,9 @@ static int tpm_ibmvtpm_probe(struct vio_dev *vio_dev,
        struct tpm_chip *chip;
        int rc = -ENOMEM, rc1;
 
-       chip = tpm_register_hardware(dev, &tpm_ibmvtpm);
-       if (!chip) {
-               dev_err(dev, "tpm_register_hardware failed\n");
-               return -ENODEV;
-       }
+       chip = tpmm_chip_alloc(dev, &tpm_ibmvtpm);
+       if (IS_ERR(chip))
+               return PTR_ERR(chip);
 
        ibmvtpm = kzalloc(sizeof(struct ibmvtpm_dev), GFP_KERNEL);
        if (!ibmvtpm) {
@@ -637,7 +636,7 @@ static int tpm_ibmvtpm_probe(struct vio_dev *vio_dev,
        if (rc)
                goto init_irq_cleanup;
 
-       return rc;
+       return tpm_chip_register(chip);
 init_irq_cleanup:
        do {
                rc1 = plpar_hcall_norets(H_FREE_CRQ, vio_dev->unit_address);
@@ -652,8 +651,6 @@ cleanup:
                kfree(ibmvtpm);
        }
 
-       tpm_remove_hardware(dev);
-
        return rc;
 }