Source
105
105
ret = amba_request_regions(dev, NULL);
106
106
if (ret)
107
107
goto err_req;
108
108
109
109
rtc = devm_kzalloc(&dev->dev, sizeof(*rtc), GFP_KERNEL);
110
110
if (!rtc) {
111
111
ret = -ENOMEM;
112
112
goto err_rtc;
113
113
}
114
114
115
+
rtc->rtc = devm_rtc_allocate_device(&dev->dev);
116
+
if (IS_ERR(rtc->rtc)) {
117
+
ret = PTR_ERR(rtc->rtc);
118
+
goto err_rtc;
119
+
}
120
+
121
+
rtc->rtc->ops = &pl030_ops;
115
122
rtc->base = ioremap(dev->res.start, resource_size(&dev->res));
116
123
if (!rtc->base) {
117
124
ret = -ENOMEM;
118
125
goto err_rtc;
119
126
}
120
127
121
128
__raw_writel(0, rtc->base + RTC_CR);
122
129
__raw_writel(0, rtc->base + RTC_EOI);
123
130
124
131
amba_set_drvdata(dev, rtc);
125
132
126
133
ret = request_irq(dev->irq[0], pl030_interrupt, 0,
127
134
"rtc-pl030", rtc);
128
135
if (ret)
129
136
goto err_irq;
130
137
131
-
rtc->rtc = rtc_device_register("pl030", &dev->dev, &pl030_ops,
132
-
THIS_MODULE);
133
-
if (IS_ERR(rtc->rtc)) {
134
-
ret = PTR_ERR(rtc->rtc);
138
+
ret = rtc_register_device(rtc->rtc);
139
+
if (ret)
135
140
goto err_reg;
136
-
}
137
141
138
142
return 0;
139
143
140
144
err_reg:
141
145
free_irq(dev->irq[0], rtc);
142
146
err_irq:
143
147
iounmap(rtc->base);
144
148
err_rtc:
145
149
amba_release_regions(dev);
146
150
err_req:
147
151
return ret;
148
152
}
149
153
150
154
static int pl030_remove(struct amba_device *dev)
151
155
{
152
156
struct pl030_rtc *rtc = amba_get_drvdata(dev);
153
157
154
158
writel(0, rtc->base + RTC_CR);
155
159
156
160
free_irq(dev->irq[0], rtc);
157
-
rtc_device_unregister(rtc->rtc);
158
161
iounmap(rtc->base);
159
162
amba_release_regions(dev);
160
163
161
164
return 0;
162
165
}
163
166
164
167
static struct amba_id pl030_ids[] = {
165
168
{
166
169
.id = 0x00041030,
167
170
.mask = 0x000fffff,