@@ -586,6 +586,7 @@ struct spi_device *spi_alloc_device(struct spi_controller *ctlr)
586586 spi -> dev .bus = & spi_bus_type ;
587587 spi -> dev .release = spidev_release ;
588588 spi -> mode = ctlr -> buswidth_override_bits ;
589+ spi -> num_chipselect = 1 ;
589590
590591 device_initialize (& spi -> dev );
591592 return spi ;
@@ -635,7 +636,7 @@ static inline int spi_dev_check_cs(struct device *dev,
635636 u8 idx_new ;
636637
637638 cs = spi_get_chipselect (spi , idx );
638- for (idx_new = new_idx ; idx_new < SPI_CS_CNT_MAX ; idx_new ++ ) {
639+ for (idx_new = new_idx ; idx_new < new_spi -> num_chipselect ; idx_new ++ ) {
639640 cs_new = spi_get_chipselect (new_spi , idx_new );
640641 if (is_valid_cs (cs ) && is_valid_cs (cs_new ) && cs == cs_new ) {
641642 dev_err (dev , "chipselect %u already in use\n" , cs_new );
@@ -652,7 +653,7 @@ static int spi_dev_check(struct device *dev, void *data)
652653 int status , idx ;
653654
654655 if (spi -> controller == new_spi -> controller ) {
655- for (idx = 0 ; idx < SPI_CS_CNT_MAX ; idx ++ ) {
656+ for (idx = 0 ; idx < spi -> num_chipselect ; idx ++ ) {
656657 status = spi_dev_check_cs (dev , spi , idx , new_spi , 0 );
657658 if (status )
658659 return status ;
@@ -674,7 +675,13 @@ static int __spi_add_device(struct spi_device *spi)
674675 int status , idx ;
675676 u8 cs ;
676677
677- for (idx = 0 ; idx < SPI_CS_CNT_MAX ; idx ++ ) {
678+ if (spi -> num_chipselect > SPI_CS_CNT_MAX ) {
679+ dev_err (dev , "num_cs %d > max %d\n" , spi -> num_chipselect ,
680+ SPI_CS_CNT_MAX );
681+ return - EOVERFLOW ;
682+ }
683+
684+ for (idx = 0 ; idx < spi -> num_chipselect ; idx ++ ) {
678685 /* Chipselects are numbered 0..max; validate. */
679686 cs = spi_get_chipselect (spi , idx );
680687 if (is_valid_cs (cs ) && cs >= ctlr -> num_chipselect ) {
@@ -689,7 +696,7 @@ static int __spi_add_device(struct spi_device *spi)
689696 * For example, spi->chip_select[0] != spi->chip_select[1] and so on.
690697 */
691698 if (!spi_controller_is_target (ctlr )) {
692- for (idx = 0 ; idx < SPI_CS_CNT_MAX ; idx ++ ) {
699+ for (idx = 0 ; idx < spi -> num_chipselect ; idx ++ ) {
693700 status = spi_dev_check_cs (dev , spi , idx , spi , idx + 1 );
694701 if (status )
695702 return status ;
@@ -717,7 +724,7 @@ static int __spi_add_device(struct spi_device *spi)
717724 if (ctlr -> cs_gpiods ) {
718725 u8 cs ;
719726
720- for (idx = 0 ; idx < SPI_CS_CNT_MAX ; idx ++ ) {
727+ for (idx = 0 ; idx < spi -> num_chipselect ; idx ++ ) {
721728 cs = spi_get_chipselect (spi , idx );
722729 if (is_valid_cs (cs ))
723730 spi_set_csgpiod (spi , idx , ctlr -> cs_gpiods [cs ]);
@@ -1024,7 +1031,7 @@ static void spi_res_release(struct spi_controller *ctlr, struct spi_message *mes
10241031
10251032/*-------------------------------------------------------------------------*/
10261033#define spi_for_each_valid_cs (spi , idx ) \
1027- for (idx = 0; idx < SPI_CS_CNT_MAX ; idx++) \
1034+ for (idx = 0; idx < spi->num_chipselect ; idx++) \
10281035 if (!(spi->cs_index_mask & BIT(idx))) {} else
10291036
10301037static inline bool spi_is_last_cs (struct spi_device * spi )
@@ -1080,8 +1087,12 @@ static void spi_set_cs(struct spi_device *spi, bool enable, bool force)
10801087 trace_spi_set_cs (spi , activate );
10811088
10821089 spi -> controller -> last_cs_index_mask = spi -> cs_index_mask ;
1083- for (idx = 0 ; idx < SPI_CS_CNT_MAX ; idx ++ )
1084- spi -> controller -> last_cs [idx ] = enable ? spi_get_chipselect (spi , 0 ) : SPI_INVALID_CS ;
1090+ for (idx = 0 ; idx < SPI_CS_CNT_MAX ; idx ++ ) {
1091+ if (enable && idx < spi -> num_chipselect )
1092+ spi -> controller -> last_cs [idx ] = spi_get_chipselect (spi , 0 );
1093+ else
1094+ spi -> controller -> last_cs [idx ] = SPI_INVALID_CS ;
1095+ }
10851096
10861097 spi -> controller -> last_cs_mode_high = spi -> mode & SPI_CS_HIGH ;
10871098 if (spi -> controller -> last_cs_mode_high )
@@ -2452,6 +2463,8 @@ static int of_spi_parse_dt(struct spi_controller *ctlr, struct spi_device *spi,
24522463 dev_err (& ctlr -> dev , "SPI controller doesn't support multi CS\n" );
24532464 return - EINVAL ;
24542465 }
2466+
2467+ spi -> num_chipselect = rc ;
24552468 for (idx = 0 ; idx < rc ; idx ++ )
24562469 spi_set_chipselect (spi , idx , cs [idx ]);
24572470
0 commit comments