From: Sonic Zhang Move pin muxing to setup and cleanup methods. Signed-off-by: Sonic Zhang Signed-off-by: Bryan Wu Signed-off-by: David Brownell Signed-off-by: Andrew Morton --- drivers/spi/spi_bfin5xx.c | 53 +++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 25 deletions(-) diff -puN drivers/spi/spi_bfin5xx.c~spi-spi_bfin-rearrange-portmux-calls drivers/spi/spi_bfin5xx.c --- a/drivers/spi/spi_bfin5xx.c~spi-spi_bfin-rearrange-portmux-calls +++ a/drivers/spi/spi_bfin5xx.c @@ -136,7 +136,6 @@ struct chip_data { u16 flag; u8 chip_select_num; - u8 chip_select_requested; u8 n_bytes; u8 width; /* 0 or 1 */ u8 enable_dma; @@ -216,19 +215,7 @@ static int restore_state(struct driver_d { struct chip_data *chip = drv_data->cur_chip; int ret = 0; - u16 ssel[3][MAX_SPI_SSEL] = { - {P_SPI0_SSEL1, P_SPI0_SSEL2, P_SPI0_SSEL3, - P_SPI0_SSEL4, P_SPI0_SSEL5, - P_SPI0_SSEL6, P_SPI0_SSEL7}, - - {P_SPI1_SSEL1, P_SPI1_SSEL2, P_SPI1_SSEL3, - P_SPI1_SSEL4, P_SPI1_SSEL5, - P_SPI1_SSEL6, P_SPI1_SSEL7}, - - {P_SPI2_SSEL1, P_SPI2_SSEL2, P_SPI2_SSEL3, - P_SPI2_SSEL4, P_SPI2_SSEL5, - P_SPI2_SSEL6, P_SPI2_SSEL7}, - }; + /* Clear status and disable clock */ write_STAT(BIT_STAT_CLR); bfin_spi_disable(drv_data); @@ -239,17 +226,6 @@ static int restore_state(struct driver_d write_BAUD(chip->baud); cs_active(chip); - if (!chip->chip_select_requested) { - int i = chip->chip_select_num; - - dev_dbg(&drv_data->pdev->dev, "chip select number is %d\n", i); - if ((i > 0) && (i <= MAX_SPI_SSEL)) - ret = peripheral_request( - ssel[drv_data->master->bus_num][i-1], DRV_NAME); - - chip->chip_select_requested = 1; - } - if (ret) dev_dbg(&drv_data->pdev->dev, ": request chip select number %d failed\n", @@ -983,6 +959,22 @@ static int transfer(struct spi_device *s return 0; } +#define MAX_SPI_SSEL 7 + +static u16 ssel[3][MAX_SPI_SSEL] = { + {P_SPI0_SSEL1, P_SPI0_SSEL2, P_SPI0_SSEL3, + P_SPI0_SSEL4, P_SPI0_SSEL5, + P_SPI0_SSEL6, P_SPI0_SSEL7}, + + {P_SPI1_SSEL1, P_SPI1_SSEL2, P_SPI1_SSEL3, + P_SPI1_SSEL4, P_SPI1_SSEL5, + P_SPI1_SSEL6, P_SPI1_SSEL7}, + + {P_SPI2_SSEL1, P_SPI2_SSEL2, P_SPI2_SSEL3, + P_SPI2_SSEL4, P_SPI2_SSEL5, + P_SPI2_SSEL6, P_SPI2_SSEL7}, +}; + /* first setup for new devices */ static int setup(struct spi_device *spi) { @@ -1113,6 +1105,12 @@ static int setup(struct spi_device *spi) spi_set_ctldata(spi, chip); + dev_dbg(&spi->dev, "chip select number is %d\n", chip->chip_select_num); + if ((chip->chip_select_num > 0) + && (chip->chip_select_num <= spi->master->num_chipselect)) + peripheral_request(ssel[spi->master->bus_num] + [chip->chip_select_num-1], DRV_NAME); + return 0; } @@ -1124,6 +1122,11 @@ static void cleanup(struct spi_device *s { struct chip_data *chip = spi_get_ctldata(spi); + if ((chip->chip_select_num > 0) + && (chip->chip_select_num <= spi->master->num_chipselect)) + peripheral_free(ssel[spi->master->bus_num] + [chip->chip_select_num-1]); + kfree(chip); } _