@@ -130,6 +130,7 @@ do { \
130130 * structure & variable declare
131131 * *********************************************/
132132typedef struct pci_fpga_device_s {
133+ void __iomem * data_base_addr0 ;
133134 void __iomem * data_base_addr1 ;
134135 void __iomem * data_base_addr2 ;
135136 resource_size_t data_region1 ;
@@ -149,6 +150,7 @@ struct as9817_64_fpga_data {
149150static struct platform_device * pdev = NULL ;
150151extern spinlock_t cpld_access_lock ;
151152extern int wait_spi (u32 mask , unsigned long timeout );
153+ extern void __iomem * spi_busy_reg ;
152154
153155/***********************************************
154156 * enum define
@@ -595,7 +597,7 @@ static struct attribute_mapping attribute_mappings[] = {
595597 [MODULE_RX_LOS_65 ... MODULE_RX_LOS_66 ] = {MODULE_RX_LOS_65 , SFP_RXLOSS_REG , 0 },
596598};
597599
598- static inline unsigned int fpga_read (void __iomem * addr , u32 spi_mask )
600+ static inline unsigned int fpga_read (const void __iomem * addr , u32 spi_mask )
599601{
600602 wait_spi (spi_mask , usecs_to_jiffies (20 ));
601603 return ioread8 (addr );
@@ -714,7 +716,7 @@ static ssize_t status_read(struct device *dev, struct device_attribute *da, char
714716 struct as9817_64_fpga_data * fpga_ctl = dev_get_drvdata (dev );
715717 ssize_t ret = - EINVAL ;
716718 u16 reg ;
717- u8 major , minor , reg_val = 0 ;
719+ u8 major , minor , reg_val ;
718720 u8 bits_shift ;
719721
720722 switch (attr -> index )
@@ -778,12 +780,12 @@ static ssize_t status_write(struct device *dev, struct device_attribute *da,
778780{
779781 struct sensor_device_attribute * attr = to_sensor_dev_attr (da );
780782 struct as9817_64_fpga_data * fpga_ctl = dev_get_drvdata (dev );
781- void __iomem * addr = 0 ;
783+ void __iomem * addr ;
782784 int status ;
783785 u16 reg ;
784786 u8 input ;
785787 u8 reg_val , bit_mask , should_set_bit ;
786- u32 spi_mask = 0 ;
788+ u32 spi_mask ;
787789
788790 status = kstrtou8 (buf , 10 , & input );
789791 if (status ) {
@@ -956,7 +958,6 @@ static int as9817_64_pcie_fpga_stat_probe(struct platform_device *pdev)
956958 int i ;
957959 int status = 0 , err = 0 ;
958960 unsigned long bar_base ;
959- void __iomem * data_base_addr0 ;
960961 unsigned int val ;
961962
962963 fpga_ctl = devm_kzalloc (dev , sizeof (struct as9817_64_fpga_data ), GFP_KERNEL );
@@ -986,14 +987,14 @@ static int as9817_64_pcie_fpga_stat_probe(struct platform_device *pdev)
986987 /*
987988 * Detect platform for changing the setting behavior of LP mode.
988989 */
989- data_base_addr0 = pci_iomap (pcidev , BAR0_NUM , 0 );
990- if (data_base_addr0 == NULL ) {
990+ fpga_ctl -> pci_fpga_dev . data_base_addr0 = pci_iomap (pcidev , BAR0_NUM , 0 );
991+ if (fpga_ctl -> pci_fpga_dev . data_base_addr0 == NULL ) {
991992 dev_err (dev , "Failed to map BAR0\n" );
992993 status = - EIO ;
993994 goto exit_pci_disable ;
994995 }
995996
996- val = ioread8 (data_base_addr0 + FPGA_BOARD_INFO_REG );
997+ val = ioread8 (fpga_ctl -> pci_fpga_dev . data_base_addr0 + FPGA_BOARD_INFO_REG );
997998 switch (val & 0x0C )
998999 {
9991000 case 0x00 : /* OSFP */
@@ -1013,7 +1014,15 @@ static int as9817_64_pcie_fpga_stat_probe(struct platform_device *pdev)
10131014 dev_warn (dev , "Unknown platform detected\n" );
10141015 break ;
10151016 }
1016- pci_iounmap (pcidev , data_base_addr0 );
1017+
1018+ /*
1019+ * The register address of SPI Busy is 0x33.
1020+ * It can not only read one byte. It needs to read four bytes from 0x30.
1021+ * The value is obtained by '(ioread32(spi_busy_reg) >> 24) & 0xFF'.
1022+ */
1023+ spi_busy_reg = fpga_ctl -> pci_fpga_dev .data_base_addr0 + 0x30 ;
1024+
1025+
10171026
10181027 /*
10191028 * Cannot use 'pci_request_regions(pcidev, DRVNAME)'
@@ -1024,7 +1033,7 @@ static int as9817_64_pcie_fpga_stat_probe(struct platform_device *pdev)
10241033 if (fpga_ctl -> pci_fpga_dev .data_base_addr1 == NULL ) {
10251034 dev_err (dev , "Failed to map BAR1\n" );
10261035 status = - EIO ;
1027- goto exit_pci_disable ;
1036+ goto exit_pci_iounmap0 ;
10281037 }
10291038 fpga_ctl -> pci_fpga_dev .data_region1 = pci_resource_start (pcidev , BAR1_NUM ) + CPLD1_PCIE_START_OFFSET ;
10301039 ret = request_mem_region (fpga_ctl -> pci_fpga_dev .data_region1 , REGION_LEN , DRVNAME "_cpld1" );
@@ -1104,6 +1113,9 @@ static int as9817_64_pcie_fpga_stat_probe(struct platform_device *pdev)
11041113 release_mem_region (fpga_ctl -> pci_fpga_dev .data_region1 , REGION_LEN );
11051114exit_pci_iounmap1 :
11061115 pci_iounmap (fpga_ctl -> pci_fpga_dev .pci_dev , fpga_ctl -> pci_fpga_dev .data_base_addr1 );
1116+ exit_pci_iounmap0 :
1117+ spi_busy_reg = NULL ;
1118+ pci_iounmap (fpga_ctl -> pci_fpga_dev .pci_dev , fpga_ctl -> pci_fpga_dev .data_base_addr0 );
11071119exit_pci_disable :
11081120 pci_disable_device (fpga_ctl -> pci_fpga_dev .pci_dev );
11091121
@@ -1122,6 +1134,8 @@ static int as9817_64_pcie_fpga_stat_remove(struct platform_device *pdev)
11221134 for (i = 0 ; i < PORT_NUM ; i ++ ) {
11231135 platform_device_unregister (fpga_ctl -> pci_fpga_dev .fpga_i2c [i ]);
11241136 }
1137+ spi_busy_reg = NULL ;
1138+ pci_iounmap (fpga_ctl -> pci_fpga_dev .pci_dev , fpga_ctl -> pci_fpga_dev .data_base_addr0 );
11251139 pci_iounmap (fpga_ctl -> pci_fpga_dev .pci_dev , fpga_ctl -> pci_fpga_dev .data_base_addr1 );
11261140 pci_iounmap (fpga_ctl -> pci_fpga_dev .pci_dev , fpga_ctl -> pci_fpga_dev .data_base_addr2 );
11271141 release_mem_region (fpga_ctl -> pci_fpga_dev .data_region1 , REGION_LEN );
0 commit comments