diff options
-rw-r--r-- | drivers/spi/spi_imx.c | 50 |
1 files changed, 17 insertions, 33 deletions
diff --git a/drivers/spi/spi_imx.c b/drivers/spi/spi_imx.c index 2fec1170b6c0..89c22efedfb0 100644 --- a/drivers/spi/spi_imx.c +++ b/drivers/spi/spi_imx.c | |||
@@ -354,43 +354,14 @@ static int mx1_rx_available(struct spi_imx_data *spi_imx) | |||
354 | static void spi_imx_chipselect(struct spi_device *spi, int is_active) | 354 | static void spi_imx_chipselect(struct spi_device *spi, int is_active) |
355 | { | 355 | { |
356 | struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master); | 356 | struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master); |
357 | unsigned int cs = 0; | ||
358 | int gpio = spi_imx->chipselect[spi->chip_select]; | 357 | int gpio = spi_imx->chipselect[spi->chip_select]; |
359 | struct spi_imx_config config; | 358 | int active = is_active != BITBANG_CS_INACTIVE; |
360 | 359 | int dev_is_lowactive = !(spi->mode & SPI_CS_HIGH); | |
361 | if (spi->mode & SPI_CS_HIGH) | ||
362 | cs = 1; | ||
363 | 360 | ||
364 | if (is_active == BITBANG_CS_INACTIVE) { | 361 | if (gpio < 0) |
365 | if (gpio >= 0) | ||
366 | gpio_set_value(gpio, !cs); | ||
367 | return; | 362 | return; |
368 | } | ||
369 | |||
370 | config.bpw = spi->bits_per_word; | ||
371 | config.speed_hz = spi->max_speed_hz; | ||
372 | config.mode = spi->mode; | ||
373 | config.cs = spi_imx->chipselect[spi->chip_select]; | ||
374 | |||
375 | spi_imx->config(spi_imx, &config); | ||
376 | |||
377 | /* Initialize the functions for transfer */ | ||
378 | if (config.bpw <= 8) { | ||
379 | spi_imx->rx = spi_imx_buf_rx_u8; | ||
380 | spi_imx->tx = spi_imx_buf_tx_u8; | ||
381 | } else if (config.bpw <= 16) { | ||
382 | spi_imx->rx = spi_imx_buf_rx_u16; | ||
383 | spi_imx->tx = spi_imx_buf_tx_u16; | ||
384 | } else if (config.bpw <= 32) { | ||
385 | spi_imx->rx = spi_imx_buf_rx_u32; | ||
386 | spi_imx->tx = spi_imx_buf_tx_u32; | ||
387 | } else | ||
388 | BUG(); | ||
389 | |||
390 | if (gpio >= 0) | ||
391 | gpio_set_value(gpio, cs); | ||
392 | 363 | ||
393 | return; | 364 | gpio_set_value(gpio, dev_is_lowactive ^ active); |
394 | } | 365 | } |
395 | 366 | ||
396 | static void spi_imx_push(struct spi_imx_data *spi_imx) | 367 | static void spi_imx_push(struct spi_imx_data *spi_imx) |
@@ -451,6 +422,19 @@ static int spi_imx_setupxfer(struct spi_device *spi, | |||
451 | if (!config.speed_hz) | 422 | if (!config.speed_hz) |
452 | config.speed_hz = spi->max_speed_hz; | 423 | config.speed_hz = spi->max_speed_hz; |
453 | 424 | ||
425 | /* Initialize the functions for transfer */ | ||
426 | if (config.bpw <= 8) { | ||
427 | spi_imx->rx = spi_imx_buf_rx_u8; | ||
428 | spi_imx->tx = spi_imx_buf_tx_u8; | ||
429 | } else if (config.bpw <= 16) { | ||
430 | spi_imx->rx = spi_imx_buf_rx_u16; | ||
431 | spi_imx->tx = spi_imx_buf_tx_u16; | ||
432 | } else if (config.bpw <= 32) { | ||
433 | spi_imx->rx = spi_imx_buf_rx_u32; | ||
434 | spi_imx->tx = spi_imx_buf_tx_u32; | ||
435 | } else | ||
436 | BUG(); | ||
437 | |||
454 | spi_imx->config(spi_imx, &config); | 438 | spi_imx->config(spi_imx, &config); |
455 | 439 | ||
456 | return 0; | 440 | return 0; |