diff options
Diffstat (limited to 'drivers/rtc/rtc-stmp3xxx.c')
| -rw-r--r-- | drivers/rtc/rtc-stmp3xxx.c | 51 |
1 files changed, 19 insertions, 32 deletions
diff --git a/drivers/rtc/rtc-stmp3xxx.c b/drivers/rtc/rtc-stmp3xxx.c index 98f0d3c30738..a9cd26a26dc0 100644 --- a/drivers/rtc/rtc-stmp3xxx.c +++ b/drivers/rtc/rtc-stmp3xxx.c | |||
| @@ -227,11 +227,7 @@ static int stmp3xxx_rtc_remove(struct platform_device *pdev) | |||
| 227 | 227 | ||
| 228 | writel(STMP3XXX_RTC_CTRL_ALARM_IRQ_EN, | 228 | writel(STMP3XXX_RTC_CTRL_ALARM_IRQ_EN, |
| 229 | rtc_data->io + STMP3XXX_RTC_CTRL_CLR); | 229 | rtc_data->io + STMP3XXX_RTC_CTRL_CLR); |
| 230 | free_irq(rtc_data->irq_alarm, &pdev->dev); | ||
| 231 | rtc_device_unregister(rtc_data->rtc); | ||
| 232 | platform_set_drvdata(pdev, NULL); | 230 | platform_set_drvdata(pdev, NULL); |
| 233 | iounmap(rtc_data->io); | ||
| 234 | kfree(rtc_data); | ||
| 235 | 231 | ||
| 236 | return 0; | 232 | return 0; |
| 237 | } | 233 | } |
| @@ -242,22 +238,20 @@ static int stmp3xxx_rtc_probe(struct platform_device *pdev) | |||
| 242 | struct resource *r; | 238 | struct resource *r; |
| 243 | int err; | 239 | int err; |
| 244 | 240 | ||
| 245 | rtc_data = kzalloc(sizeof *rtc_data, GFP_KERNEL); | 241 | rtc_data = devm_kzalloc(&pdev->dev, sizeof(*rtc_data), GFP_KERNEL); |
| 246 | if (!rtc_data) | 242 | if (!rtc_data) |
| 247 | return -ENOMEM; | 243 | return -ENOMEM; |
| 248 | 244 | ||
| 249 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 245 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 250 | if (!r) { | 246 | if (!r) { |
| 251 | dev_err(&pdev->dev, "failed to get resource\n"); | 247 | dev_err(&pdev->dev, "failed to get resource\n"); |
| 252 | err = -ENXIO; | 248 | return -ENXIO; |
| 253 | goto out_free; | ||
| 254 | } | 249 | } |
| 255 | 250 | ||
| 256 | rtc_data->io = ioremap(r->start, resource_size(r)); | 251 | rtc_data->io = devm_ioremap(&pdev->dev, r->start, resource_size(r)); |
| 257 | if (!rtc_data->io) { | 252 | if (!rtc_data->io) { |
| 258 | dev_err(&pdev->dev, "ioremap failed\n"); | 253 | dev_err(&pdev->dev, "ioremap failed\n"); |
| 259 | err = -EIO; | 254 | return -EIO; |
| 260 | goto out_free; | ||
| 261 | } | 255 | } |
| 262 | 256 | ||
| 263 | rtc_data->irq_alarm = platform_get_irq(pdev, 0); | 257 | rtc_data->irq_alarm = platform_get_irq(pdev, 0); |
| @@ -265,8 +259,7 @@ static int stmp3xxx_rtc_probe(struct platform_device *pdev) | |||
| 265 | if (!(readl(STMP3XXX_RTC_STAT + rtc_data->io) & | 259 | if (!(readl(STMP3XXX_RTC_STAT + rtc_data->io) & |
| 266 | STMP3XXX_RTC_STAT_RTC_PRESENT)) { | 260 | STMP3XXX_RTC_STAT_RTC_PRESENT)) { |
| 267 | dev_err(&pdev->dev, "no device onboard\n"); | 261 | dev_err(&pdev->dev, "no device onboard\n"); |
| 268 | err = -ENODEV; | 262 | return -ENODEV; |
| 269 | goto out_remap; | ||
| 270 | } | 263 | } |
| 271 | 264 | ||
| 272 | platform_set_drvdata(pdev, rtc_data); | 265 | platform_set_drvdata(pdev, rtc_data); |
| @@ -281,43 +274,38 @@ static int stmp3xxx_rtc_probe(struct platform_device *pdev) | |||
| 281 | STMP3XXX_RTC_CTRL_ALARM_IRQ_EN, | 274 | STMP3XXX_RTC_CTRL_ALARM_IRQ_EN, |
| 282 | rtc_data->io + STMP3XXX_RTC_CTRL_CLR); | 275 | rtc_data->io + STMP3XXX_RTC_CTRL_CLR); |
| 283 | 276 | ||
| 284 | rtc_data->rtc = rtc_device_register(pdev->name, &pdev->dev, | 277 | rtc_data->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, |
| 285 | &stmp3xxx_rtc_ops, THIS_MODULE); | 278 | &stmp3xxx_rtc_ops, THIS_MODULE); |
| 286 | if (IS_ERR(rtc_data->rtc)) { | 279 | if (IS_ERR(rtc_data->rtc)) { |
| 287 | err = PTR_ERR(rtc_data->rtc); | 280 | err = PTR_ERR(rtc_data->rtc); |
| 288 | goto out_remap; | 281 | goto out; |
| 289 | } | 282 | } |
| 290 | 283 | ||
| 291 | err = request_irq(rtc_data->irq_alarm, stmp3xxx_rtc_interrupt, 0, | 284 | err = devm_request_irq(&pdev->dev, rtc_data->irq_alarm, |
| 292 | "RTC alarm", &pdev->dev); | 285 | stmp3xxx_rtc_interrupt, 0, "RTC alarm", &pdev->dev); |
| 293 | if (err) { | 286 | if (err) { |
| 294 | dev_err(&pdev->dev, "Cannot claim IRQ%d\n", | 287 | dev_err(&pdev->dev, "Cannot claim IRQ%d\n", |
| 295 | rtc_data->irq_alarm); | 288 | rtc_data->irq_alarm); |
| 296 | goto out_irq_alarm; | 289 | goto out; |
| 297 | } | 290 | } |
| 298 | 291 | ||
| 299 | stmp3xxx_wdt_register(pdev); | 292 | stmp3xxx_wdt_register(pdev); |
| 300 | return 0; | 293 | return 0; |
| 301 | 294 | ||
| 302 | out_irq_alarm: | 295 | out: |
| 303 | rtc_device_unregister(rtc_data->rtc); | ||
| 304 | out_remap: | ||
| 305 | platform_set_drvdata(pdev, NULL); | 296 | platform_set_drvdata(pdev, NULL); |
| 306 | iounmap(rtc_data->io); | ||
| 307 | out_free: | ||
| 308 | kfree(rtc_data); | ||
| 309 | return err; | 297 | return err; |
| 310 | } | 298 | } |
| 311 | 299 | ||
| 312 | #ifdef CONFIG_PM | 300 | #ifdef CONFIG_PM_SLEEP |
| 313 | static int stmp3xxx_rtc_suspend(struct platform_device *dev, pm_message_t state) | 301 | static int stmp3xxx_rtc_suspend(struct device *dev) |
| 314 | { | 302 | { |
| 315 | return 0; | 303 | return 0; |
| 316 | } | 304 | } |
| 317 | 305 | ||
| 318 | static int stmp3xxx_rtc_resume(struct platform_device *dev) | 306 | static int stmp3xxx_rtc_resume(struct device *dev) |
| 319 | { | 307 | { |
| 320 | struct stmp3xxx_rtc_data *rtc_data = platform_get_drvdata(dev); | 308 | struct stmp3xxx_rtc_data *rtc_data = dev_get_drvdata(dev); |
| 321 | 309 | ||
| 322 | mxs_reset_block(rtc_data->io); | 310 | mxs_reset_block(rtc_data->io); |
| 323 | writel(STMP3XXX_RTC_PERSISTENT0_ALARM_EN | | 311 | writel(STMP3XXX_RTC_PERSISTENT0_ALARM_EN | |
| @@ -326,11 +314,11 @@ static int stmp3xxx_rtc_resume(struct platform_device *dev) | |||
| 326 | rtc_data->io + STMP3XXX_RTC_PERSISTENT0_CLR); | 314 | rtc_data->io + STMP3XXX_RTC_PERSISTENT0_CLR); |
| 327 | return 0; | 315 | return 0; |
| 328 | } | 316 | } |
| 329 | #else | ||
| 330 | #define stmp3xxx_rtc_suspend NULL | ||
| 331 | #define stmp3xxx_rtc_resume NULL | ||
| 332 | #endif | 317 | #endif |
| 333 | 318 | ||
| 319 | static SIMPLE_DEV_PM_OPS(stmp3xxx_rtc_pm_ops, stmp3xxx_rtc_suspend, | ||
| 320 | stmp3xxx_rtc_resume); | ||
| 321 | |||
| 334 | static const struct of_device_id rtc_dt_ids[] = { | 322 | static const struct of_device_id rtc_dt_ids[] = { |
| 335 | { .compatible = "fsl,stmp3xxx-rtc", }, | 323 | { .compatible = "fsl,stmp3xxx-rtc", }, |
| 336 | { /* sentinel */ } | 324 | { /* sentinel */ } |
| @@ -340,11 +328,10 @@ MODULE_DEVICE_TABLE(of, rtc_dt_ids); | |||
| 340 | static struct platform_driver stmp3xxx_rtcdrv = { | 328 | static struct platform_driver stmp3xxx_rtcdrv = { |
| 341 | .probe = stmp3xxx_rtc_probe, | 329 | .probe = stmp3xxx_rtc_probe, |
| 342 | .remove = stmp3xxx_rtc_remove, | 330 | .remove = stmp3xxx_rtc_remove, |
| 343 | .suspend = stmp3xxx_rtc_suspend, | ||
| 344 | .resume = stmp3xxx_rtc_resume, | ||
| 345 | .driver = { | 331 | .driver = { |
| 346 | .name = "stmp3xxx-rtc", | 332 | .name = "stmp3xxx-rtc", |
| 347 | .owner = THIS_MODULE, | 333 | .owner = THIS_MODULE, |
| 334 | .pm = &stmp3xxx_rtc_pm_ops, | ||
| 348 | .of_match_table = of_match_ptr(rtc_dt_ids), | 335 | .of_match_table = of_match_ptr(rtc_dt_ids), |
| 349 | }, | 336 | }, |
| 350 | }; | 337 | }; |
