@@ -414,16 +414,16 @@ static ssize_t vmclock_miscdev_read(struct file *fp, char __user *buf,
414
414
}
415
415
416
416
static const struct file_operations vmclock_miscdev_fops = {
417
+ .owner = THIS_MODULE ,
417
418
.mmap = vmclock_miscdev_mmap ,
418
419
.read = vmclock_miscdev_read ,
419
420
};
420
421
421
422
/* module operations */
422
423
423
- static void vmclock_remove (struct platform_device * pdev )
424
+ static void vmclock_remove (void * data )
424
425
{
425
- struct device * dev = & pdev -> dev ;
426
- struct vmclock_state * st = dev_get_drvdata (dev );
426
+ struct vmclock_state * st = data ;
427
427
428
428
if (st -> ptp_clock )
429
429
ptp_clock_unregister (st -> ptp_clock );
@@ -506,46 +506,48 @@ static int vmclock_probe(struct platform_device *pdev)
506
506
507
507
if (ret ) {
508
508
dev_info (dev , "Failed to obtain physical address: %d\n" , ret );
509
- goto out ;
509
+ return ret ;
510
510
}
511
511
512
512
if (resource_size (& st -> res ) < VMCLOCK_MIN_SIZE ) {
513
513
dev_info (dev , "Region too small (0x%llx)\n" ,
514
514
resource_size (& st -> res ));
515
- ret = - EINVAL ;
516
- goto out ;
515
+ return - EINVAL ;
517
516
}
518
517
st -> clk = devm_memremap (dev , st -> res .start , resource_size (& st -> res ),
519
518
MEMREMAP_WB | MEMREMAP_DEC );
520
519
if (IS_ERR (st -> clk )) {
521
520
ret = PTR_ERR (st -> clk );
522
521
dev_info (dev , "failed to map shared memory\n" );
523
522
st -> clk = NULL ;
524
- goto out ;
523
+ return ret ;
525
524
}
526
525
527
526
if (le32_to_cpu (st -> clk -> magic ) != VMCLOCK_MAGIC ||
528
527
le32_to_cpu (st -> clk -> size ) > resource_size (& st -> res ) ||
529
528
le16_to_cpu (st -> clk -> version ) != 1 ) {
530
529
dev_info (dev , "vmclock magic fields invalid\n" );
531
- ret = - EINVAL ;
532
- goto out ;
530
+ return - EINVAL ;
533
531
}
534
532
535
533
ret = ida_alloc (& vmclock_ida , GFP_KERNEL );
536
534
if (ret < 0 )
537
- goto out ;
535
+ return ret ;
538
536
539
537
st -> index = ret ;
540
538
ret = devm_add_action_or_reset (& pdev -> dev , vmclock_put_idx , st );
541
539
if (ret )
542
- goto out ;
540
+ return ret ;
543
541
544
542
st -> name = devm_kasprintf (& pdev -> dev , GFP_KERNEL , "vmclock%d" , st -> index );
545
- if (!st -> name ) {
546
- ret = - ENOMEM ;
547
- goto out ;
548
- }
543
+ if (!st -> name )
544
+ return - ENOMEM ;
545
+
546
+ st -> miscdev .minor = MISC_DYNAMIC_MINOR ;
547
+
548
+ ret = devm_add_action_or_reset (& pdev -> dev , vmclock_remove , st );
549
+ if (ret )
550
+ return ret ;
549
551
550
552
/*
551
553
* If the structure is big enough, it can be mapped to userspace.
@@ -554,13 +556,12 @@ static int vmclock_probe(struct platform_device *pdev)
554
556
* cross that bridge if/when we come to it.
555
557
*/
556
558
if (le32_to_cpu (st -> clk -> size ) >= PAGE_SIZE ) {
557
- st -> miscdev .minor = MISC_DYNAMIC_MINOR ;
558
559
st -> miscdev .fops = & vmclock_miscdev_fops ;
559
560
st -> miscdev .name = st -> name ;
560
561
561
562
ret = misc_register (& st -> miscdev );
562
563
if (ret )
563
- goto out ;
564
+ return ret ;
564
565
}
565
566
566
567
/* If there is valid clock information, register a PTP clock */
@@ -570,27 +571,22 @@ static int vmclock_probe(struct platform_device *pdev)
570
571
if (IS_ERR (st -> ptp_clock )) {
571
572
ret = PTR_ERR (st -> ptp_clock );
572
573
st -> ptp_clock = NULL ;
573
- vmclock_remove (pdev );
574
- goto out ;
574
+ return ret ;
575
575
}
576
576
}
577
577
578
578
if (!st -> miscdev .minor && !st -> ptp_clock ) {
579
579
/* Neither miscdev nor PTP registered */
580
580
dev_info (dev , "vmclock: Neither miscdev nor PTP available; not registering\n" );
581
- ret = - ENODEV ;
582
- goto out ;
581
+ return - ENODEV ;
583
582
}
584
583
585
584
dev_info (dev , "%s: registered %s%s%s\n" , st -> name ,
586
585
st -> miscdev .minor ? "miscdev" : "" ,
587
586
(st -> miscdev .minor && st -> ptp_clock ) ? ", " : "" ,
588
587
st -> ptp_clock ? "PTP" : "" );
589
588
590
- dev_set_drvdata (dev , st );
591
-
592
- out :
593
- return ret ;
589
+ return 0 ;
594
590
}
595
591
596
592
static const struct acpi_device_id vmclock_acpi_ids [] = {
@@ -601,7 +597,6 @@ MODULE_DEVICE_TABLE(acpi, vmclock_acpi_ids);
601
597
602
598
static struct platform_driver vmclock_platform_driver = {
603
599
.probe = vmclock_probe ,
604
- .remove = vmclock_remove ,
605
600
.driver = {
606
601
.name = "vmclock" ,
607
602
.acpi_match_table = vmclock_acpi_ids ,
0 commit comments