@@ -126,8 +126,9 @@ static struct cp500_devs cp520_devices = {
126
126
};
127
127
128
128
struct cp500_nvmem {
129
- struct nvmem_device * nvmem ;
129
+ struct nvmem_device * base_nvmem ;
130
130
unsigned int offset ;
131
+ struct nvmem_device * nvmem ;
131
132
};
132
133
133
134
struct cp500 {
@@ -581,8 +582,8 @@ static int cp500_nvmem_read(void *priv, unsigned int offset, void *val,
581
582
struct cp500_nvmem * nvmem = priv ;
582
583
int ret ;
583
584
584
- ret = nvmem_device_read (nvmem -> nvmem , nvmem -> offset + offset , bytes ,
585
- val );
585
+ ret = nvmem_device_read (nvmem -> base_nvmem , nvmem -> offset + offset ,
586
+ bytes , val );
586
587
if (ret != bytes )
587
588
return ret ;
588
589
@@ -595,15 +596,16 @@ static int cp500_nvmem_write(void *priv, unsigned int offset, void *val,
595
596
struct cp500_nvmem * nvmem = priv ;
596
597
int ret ;
597
598
598
- ret = nvmem_device_write (nvmem -> nvmem , nvmem -> offset + offset , bytes ,
599
- val );
599
+ ret = nvmem_device_write (nvmem -> base_nvmem , nvmem -> offset + offset ,
600
+ bytes , val );
600
601
if (ret != bytes )
601
602
return ret ;
602
603
603
604
return 0 ;
604
605
}
605
606
606
- static int cp500_nvmem_register (struct cp500 * cp500 , struct nvmem_device * nvmem )
607
+ static int cp500_nvmem_register (struct cp500 * cp500 ,
608
+ struct nvmem_device * base_nvmem )
607
609
{
608
610
struct device * dev = & cp500 -> pci_dev -> dev ;
609
611
struct nvmem_config nvmem_config = {};
@@ -625,27 +627,52 @@ static int cp500_nvmem_register(struct cp500 *cp500, struct nvmem_device *nvmem)
625
627
nvmem_config .reg_read = cp500_nvmem_read ;
626
628
nvmem_config .reg_write = cp500_nvmem_write ;
627
629
628
- cp500 -> nvmem_cpu .nvmem = nvmem ;
630
+ cp500 -> nvmem_cpu .base_nvmem = base_nvmem ;
629
631
cp500 -> nvmem_cpu .offset = CP500_EEPROM_CPU_OFFSET ;
630
632
nvmem_config .name = CP500_EEPROM_CPU_NAME ;
631
633
nvmem_config .size = CP500_EEPROM_CPU_SIZE ;
632
634
nvmem_config .priv = & cp500 -> nvmem_cpu ;
633
- tmp = devm_nvmem_register ( dev , & nvmem_config );
635
+ tmp = nvmem_register ( & nvmem_config );
634
636
if (IS_ERR (tmp ))
635
637
return PTR_ERR (tmp );
638
+ cp500 -> nvmem_cpu .nvmem = tmp ;
636
639
637
- cp500 -> nvmem_user .nvmem = nvmem ;
640
+ cp500 -> nvmem_user .base_nvmem = base_nvmem ;
638
641
cp500 -> nvmem_user .offset = CP500_EEPROM_USER_OFFSET ;
639
642
nvmem_config .name = CP500_EEPROM_USER_NAME ;
640
643
nvmem_config .size = CP500_EEPROM_USER_SIZE ;
641
644
nvmem_config .priv = & cp500 -> nvmem_user ;
642
- tmp = devm_nvmem_register (dev , & nvmem_config );
643
- if (IS_ERR (tmp ))
645
+ tmp = nvmem_register (& nvmem_config );
646
+ if (IS_ERR (tmp )) {
647
+ nvmem_unregister (cp500 -> nvmem_cpu .nvmem );
648
+ cp500 -> nvmem_cpu .nvmem = NULL ;
649
+
644
650
return PTR_ERR (tmp );
651
+ }
652
+ cp500 -> nvmem_user .nvmem = tmp ;
645
653
646
654
return 0 ;
647
655
}
648
656
657
+ static void cp500_nvmem_unregister (struct cp500 * cp500 )
658
+ {
659
+ int notified ;
660
+
661
+ if (cp500 -> nvmem_user .nvmem ) {
662
+ nvmem_unregister (cp500 -> nvmem_user .nvmem );
663
+ cp500 -> nvmem_user .nvmem = NULL ;
664
+ }
665
+ if (cp500 -> nvmem_cpu .nvmem ) {
666
+ nvmem_unregister (cp500 -> nvmem_cpu .nvmem );
667
+ cp500 -> nvmem_cpu .nvmem = NULL ;
668
+ }
669
+
670
+ /* CPU and user nvmem use the same base_nvmem, put only once */
671
+ notified = atomic_read (& cp500 -> nvmem_notified );
672
+ if (notified )
673
+ nvmem_device_put (cp500 -> nvmem_cpu .base_nvmem );
674
+ }
675
+
649
676
static int cp500_nvmem_match (struct device * dev , const void * data )
650
677
{
651
678
const struct cp500 * cp500 = data ;
@@ -663,13 +690,6 @@ static int cp500_nvmem_match(struct device *dev, const void *data)
663
690
return 0 ;
664
691
}
665
692
666
- static void cp500_devm_nvmem_put (void * data )
667
- {
668
- struct nvmem_device * nvmem = data ;
669
-
670
- nvmem_device_put (nvmem );
671
- }
672
-
673
693
static int cp500_nvmem (struct notifier_block * nb , unsigned long action ,
674
694
void * data )
675
695
{
@@ -698,10 +718,6 @@ static int cp500_nvmem(struct notifier_block *nb, unsigned long action,
698
718
return NOTIFY_DONE ;
699
719
}
700
720
701
- ret = devm_add_action_or_reset (dev , cp500_devm_nvmem_put , nvmem );
702
- if (ret )
703
- return ret ;
704
-
705
721
ret = cp500_nvmem_register (cp500 , nvmem );
706
722
if (ret )
707
723
return ret ;
@@ -932,12 +948,17 @@ static void cp500_remove(struct pci_dev *pci_dev)
932
948
{
933
949
struct cp500 * cp500 = pci_get_drvdata (pci_dev );
934
950
951
+ /*
952
+ * unregister CPU and user nvmem and put base_nvmem before parent
953
+ * auxiliary device of base_nvmem is unregistered
954
+ */
955
+ nvmem_unregister_notifier (& cp500 -> nvmem_notifier );
956
+ cp500_nvmem_unregister (cp500 );
957
+
935
958
cp500_unregister_auxiliary_devs (cp500 );
936
959
937
960
cp500_disable (cp500 );
938
961
939
- nvmem_unregister_notifier (& cp500 -> nvmem_notifier );
940
-
941
962
pci_set_drvdata (pci_dev , 0 );
942
963
943
964
pci_free_irq_vectors (pci_dev );
0 commit comments