@@ -608,6 +608,22 @@ static void spi_dev_set_name(struct spi_device *spi)
608
608
spi_get_chipselect (spi , 0 ));
609
609
}
610
610
611
+ /*
612
+ * Zero(0) is a valid physical CS value and can be located at any
613
+ * logical CS in the spi->chip_select[]. If all the physical CS
614
+ * are initialized to 0 then It would be difficult to differentiate
615
+ * between a valid physical CS 0 & an unused logical CS whose physical
616
+ * CS can be 0. As a solution to this issue initialize all the CS to -1.
617
+ * Now all the unused logical CS will have -1 physical CS value & can be
618
+ * ignored while performing physical CS validity checks.
619
+ */
620
+ #define SPI_INVALID_CS ((s8)-1)
621
+
622
+ static inline bool is_valid_cs (s8 chip_select )
623
+ {
624
+ return chip_select != SPI_INVALID_CS ;
625
+ }
626
+
611
627
static inline int spi_dev_check_cs (struct device * dev ,
612
628
struct spi_device * spi , u8 idx ,
613
629
struct spi_device * new_spi , u8 new_idx )
@@ -618,7 +634,7 @@ static inline int spi_dev_check_cs(struct device *dev,
618
634
cs = spi_get_chipselect (spi , idx );
619
635
for (idx_new = new_idx ; idx_new < SPI_CS_CNT_MAX ; idx_new ++ ) {
620
636
cs_new = spi_get_chipselect (new_spi , idx_new );
621
- if (cs != 0xFF && cs_new != 0xFF && cs == cs_new ) {
637
+ if (is_valid_cs ( cs ) && is_valid_cs ( cs_new ) && cs == cs_new ) {
622
638
dev_err (dev , "chipselect %u already in use\n" , cs_new );
623
639
return - EBUSY ;
624
640
}
@@ -658,7 +674,7 @@ static int __spi_add_device(struct spi_device *spi)
658
674
for (idx = 0 ; idx < SPI_CS_CNT_MAX ; idx ++ ) {
659
675
/* Chipselects are numbered 0..max; validate. */
660
676
cs = spi_get_chipselect (spi , idx );
661
- if (cs != 0xFF && cs >= ctlr -> num_chipselect ) {
677
+ if (is_valid_cs ( cs ) && cs >= ctlr -> num_chipselect ) {
662
678
dev_err (dev , "cs%d >= max %d\n" , spi_get_chipselect (spi , idx ),
663
679
ctlr -> num_chipselect );
664
680
return - EINVAL ;
@@ -698,7 +714,7 @@ static int __spi_add_device(struct spi_device *spi)
698
714
699
715
for (idx = 0 ; idx < SPI_CS_CNT_MAX ; idx ++ ) {
700
716
cs = spi_get_chipselect (spi , idx );
701
- if (cs != 0xFF )
717
+ if (is_valid_cs ( cs ) )
702
718
spi_set_csgpiod (spi , idx , ctlr -> cs_gpiods [cs ]);
703
719
}
704
720
}
@@ -756,17 +772,8 @@ static void spi_set_all_cs_unused(struct spi_device *spi)
756
772
{
757
773
u8 idx ;
758
774
759
- /*
760
- * Zero(0) is a valid physical CS value and can be located at any
761
- * logical CS in the spi->chip_select[]. If all the physical CS
762
- * are initialized to 0 then It would be difficult to differentiate
763
- * between a valid physical CS 0 & an unused logical CS whose physical
764
- * CS can be 0. As a solution to this issue initialize all the CS to 0xFF.
765
- * Now all the unused logical CS will have 0xFF physical CS value & can be
766
- * ignore while performing physical CS validity checks.
767
- */
768
775
for (idx = 0 ; idx < SPI_CS_CNT_MAX ; idx ++ )
769
- spi_set_chipselect (spi , idx , 0xFF );
776
+ spi_set_chipselect (spi , idx , SPI_INVALID_CS );
770
777
}
771
778
772
779
/**
@@ -1050,7 +1057,7 @@ static void spi_set_cs(struct spi_device *spi, bool enable, bool force)
1050
1057
1051
1058
spi -> controller -> last_cs_index_mask = spi -> cs_index_mask ;
1052
1059
for (idx = 0 ; idx < SPI_CS_CNT_MAX ; idx ++ )
1053
- spi -> controller -> last_cs [idx ] = enable ? spi_get_chipselect (spi , 0 ) : -1 ;
1060
+ spi -> controller -> last_cs [idx ] = enable ? spi_get_chipselect (spi , 0 ) : SPI_INVALID_CS ;
1054
1061
spi -> controller -> last_cs_mode_high = spi -> mode & SPI_CS_HIGH ;
1055
1062
1056
1063
if (spi -> mode & SPI_CS_HIGH )
@@ -3333,9 +3340,9 @@ int spi_register_controller(struct spi_controller *ctlr)
3333
3340
goto free_bus_id ;
3334
3341
}
3335
3342
3336
- /* Setting last_cs to -1 means no chip selected */
3343
+ /* Setting last_cs to SPI_INVALID_CS means no chip selected */
3337
3344
for (idx = 0 ; idx < SPI_CS_CNT_MAX ; idx ++ )
3338
- ctlr -> last_cs [idx ] = -1 ;
3345
+ ctlr -> last_cs [idx ] = SPI_INVALID_CS ;
3339
3346
3340
3347
status = device_add (& ctlr -> dev );
3341
3348
if (status < 0 )
0 commit comments