| .. | .. |
|---|
| 76 | 76 | struct device_node *node = pdev->dev.of_node; |
|---|
| 77 | 77 | struct hwspinlock_device *bank; |
|---|
| 78 | 78 | struct hwspinlock *hwlock; |
|---|
| 79 | | - struct resource *res; |
|---|
| 80 | 79 | void __iomem *io_base; |
|---|
| 81 | 80 | int num_locks, i, ret; |
|---|
| 82 | 81 | /* Only a single hwspinlock block device is supported */ |
|---|
| .. | .. |
|---|
| 85 | 84 | if (!node) |
|---|
| 86 | 85 | return -ENODEV; |
|---|
| 87 | 86 | |
|---|
| 88 | | - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
|---|
| 89 | | - if (!res) |
|---|
| 90 | | - return -ENODEV; |
|---|
| 91 | | - |
|---|
| 92 | | - io_base = ioremap(res->start, resource_size(res)); |
|---|
| 93 | | - if (!io_base) |
|---|
| 94 | | - return -ENOMEM; |
|---|
| 87 | + io_base = devm_platform_ioremap_resource(pdev, 0); |
|---|
| 88 | + if (IS_ERR(io_base)) |
|---|
| 89 | + return PTR_ERR(io_base); |
|---|
| 95 | 90 | |
|---|
| 96 | 91 | /* |
|---|
| 97 | 92 | * make sure the module is enabled and clocked before reading |
|---|
| .. | .. |
|---|
| 101 | 96 | ret = pm_runtime_get_sync(&pdev->dev); |
|---|
| 102 | 97 | if (ret < 0) { |
|---|
| 103 | 98 | pm_runtime_put_noidle(&pdev->dev); |
|---|
| 104 | | - goto iounmap_base; |
|---|
| 99 | + goto runtime_err; |
|---|
| 105 | 100 | } |
|---|
| 106 | 101 | |
|---|
| 107 | 102 | /* Determine number of locks */ |
|---|
| .. | .. |
|---|
| 114 | 109 | */ |
|---|
| 115 | 110 | ret = pm_runtime_put(&pdev->dev); |
|---|
| 116 | 111 | if (ret < 0) |
|---|
| 117 | | - goto iounmap_base; |
|---|
| 112 | + goto runtime_err; |
|---|
| 118 | 113 | |
|---|
| 119 | 114 | /* one of the four lsb's must be set, and nothing else */ |
|---|
| 120 | 115 | if (hweight_long(i & 0xf) != 1 || i > 8) { |
|---|
| 121 | 116 | ret = -EINVAL; |
|---|
| 122 | | - goto iounmap_base; |
|---|
| 117 | + goto runtime_err; |
|---|
| 123 | 118 | } |
|---|
| 124 | 119 | |
|---|
| 125 | 120 | num_locks = i * 32; /* actual number of locks in this device */ |
|---|
| 126 | 121 | |
|---|
| 127 | | - bank = kzalloc(struct_size(bank, lock, num_locks), GFP_KERNEL); |
|---|
| 122 | + bank = devm_kzalloc(&pdev->dev, struct_size(bank, lock, num_locks), |
|---|
| 123 | + GFP_KERNEL); |
|---|
| 128 | 124 | if (!bank) { |
|---|
| 129 | 125 | ret = -ENOMEM; |
|---|
| 130 | | - goto iounmap_base; |
|---|
| 126 | + goto runtime_err; |
|---|
| 131 | 127 | } |
|---|
| 132 | 128 | |
|---|
| 133 | 129 | platform_set_drvdata(pdev, bank); |
|---|
| .. | .. |
|---|
| 138 | 134 | ret = hwspin_lock_register(bank, &pdev->dev, &omap_hwspinlock_ops, |
|---|
| 139 | 135 | base_id, num_locks); |
|---|
| 140 | 136 | if (ret) |
|---|
| 141 | | - goto reg_fail; |
|---|
| 137 | + goto runtime_err; |
|---|
| 138 | + |
|---|
| 139 | + dev_dbg(&pdev->dev, "Registered %d locks with HwSpinlock core\n", |
|---|
| 140 | + num_locks); |
|---|
| 142 | 141 | |
|---|
| 143 | 142 | return 0; |
|---|
| 144 | 143 | |
|---|
| 145 | | -reg_fail: |
|---|
| 146 | | - kfree(bank); |
|---|
| 147 | | -iounmap_base: |
|---|
| 144 | +runtime_err: |
|---|
| 148 | 145 | pm_runtime_disable(&pdev->dev); |
|---|
| 149 | | - iounmap(io_base); |
|---|
| 150 | 146 | return ret; |
|---|
| 151 | 147 | } |
|---|
| 152 | 148 | |
|---|
| 153 | 149 | static int omap_hwspinlock_remove(struct platform_device *pdev) |
|---|
| 154 | 150 | { |
|---|
| 155 | 151 | struct hwspinlock_device *bank = platform_get_drvdata(pdev); |
|---|
| 156 | | - void __iomem *io_base = bank->lock[0].priv - LOCK_BASE_OFFSET; |
|---|
| 157 | 152 | int ret; |
|---|
| 158 | 153 | |
|---|
| 159 | 154 | ret = hwspin_lock_unregister(bank); |
|---|
| .. | .. |
|---|
| 163 | 158 | } |
|---|
| 164 | 159 | |
|---|
| 165 | 160 | pm_runtime_disable(&pdev->dev); |
|---|
| 166 | | - iounmap(io_base); |
|---|
| 167 | | - kfree(bank); |
|---|
| 168 | 161 | |
|---|
| 169 | 162 | return 0; |
|---|
| 170 | 163 | } |
|---|
| 171 | 164 | |
|---|
| 172 | 165 | static const struct of_device_id omap_hwspinlock_of_match[] = { |
|---|
| 173 | 166 | { .compatible = "ti,omap4-hwspinlock", }, |
|---|
| 167 | + { .compatible = "ti,am654-hwspinlock", }, |
|---|
| 174 | 168 | { /* end */ }, |
|---|
| 175 | 169 | }; |
|---|
| 176 | 170 | MODULE_DEVICE_TABLE(of, omap_hwspinlock_of_match); |
|---|