.. | .. |
---|
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); |
---|