| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Freescale eSPI controller driver. |
|---|
| 3 | 4 | * |
|---|
| 4 | 5 | * Copyright 2010 Freescale Semiconductor, Inc. |
|---|
| 5 | | - * |
|---|
| 6 | | - * This program is free software; you can redistribute it and/or modify it |
|---|
| 7 | | - * under the terms of the GNU General Public License as published by the |
|---|
| 8 | | - * Free Software Foundation; either version 2 of the License, or (at your |
|---|
| 9 | | - * option) any later version. |
|---|
| 10 | 6 | */ |
|---|
| 11 | 7 | #include <linux/delay.h> |
|---|
| 12 | 8 | #include <linux/err.h> |
|---|
| .. | .. |
|---|
| 431 | 427 | |
|---|
| 432 | 428 | ret = fsl_espi_bufs(spi, trans); |
|---|
| 433 | 429 | |
|---|
| 434 | | - if (trans->delay_usecs) |
|---|
| 435 | | - udelay(trans->delay_usecs); |
|---|
| 430 | + spi_transfer_delay_exec(trans); |
|---|
| 436 | 431 | |
|---|
| 437 | 432 | return ret; |
|---|
| 438 | 433 | } |
|---|
| .. | .. |
|---|
| 441 | 436 | struct spi_message *m) |
|---|
| 442 | 437 | { |
|---|
| 443 | 438 | unsigned int delay_usecs = 0, rx_nbits = 0; |
|---|
| 439 | + unsigned int delay_nsecs = 0, delay_nsecs1 = 0; |
|---|
| 444 | 440 | struct spi_transfer *t, trans = {}; |
|---|
| 445 | 441 | int ret; |
|---|
| 446 | 442 | |
|---|
| .. | .. |
|---|
| 449 | 445 | goto out; |
|---|
| 450 | 446 | |
|---|
| 451 | 447 | list_for_each_entry(t, &m->transfers, transfer_list) { |
|---|
| 452 | | - if (t->delay_usecs > delay_usecs) |
|---|
| 453 | | - delay_usecs = t->delay_usecs; |
|---|
| 448 | + if (t->delay_usecs) { |
|---|
| 449 | + if (t->delay_usecs > delay_usecs) { |
|---|
| 450 | + delay_usecs = t->delay_usecs; |
|---|
| 451 | + delay_nsecs = delay_usecs * 1000; |
|---|
| 452 | + } |
|---|
| 453 | + } else { |
|---|
| 454 | + delay_nsecs1 = spi_delay_to_ns(&t->delay, t); |
|---|
| 455 | + if (delay_nsecs1 > delay_nsecs) |
|---|
| 456 | + delay_nsecs = delay_nsecs1; |
|---|
| 457 | + } |
|---|
| 454 | 458 | if (t->rx_nbits > rx_nbits) |
|---|
| 455 | 459 | rx_nbits = t->rx_nbits; |
|---|
| 456 | 460 | } |
|---|
| .. | .. |
|---|
| 461 | 465 | trans.len = m->frame_length; |
|---|
| 462 | 466 | trans.speed_hz = t->speed_hz; |
|---|
| 463 | 467 | trans.bits_per_word = t->bits_per_word; |
|---|
| 464 | | - trans.delay_usecs = delay_usecs; |
|---|
| 468 | + trans.delay.value = delay_nsecs; |
|---|
| 469 | + trans.delay.unit = SPI_DELAY_UNIT_NSECS; |
|---|
| 465 | 470 | trans.rx_nbits = rx_nbits; |
|---|
| 466 | 471 | |
|---|
| 467 | 472 | if (trans.len) |
|---|
| .. | .. |
|---|
| 726 | 731 | if (ret < 0) |
|---|
| 727 | 732 | goto err_pm; |
|---|
| 728 | 733 | |
|---|
| 729 | | - dev_info(dev, "at 0x%p (irq = %u)\n", espi->reg_base, irq); |
|---|
| 734 | + dev_info(dev, "irq = %u\n", irq); |
|---|
| 730 | 735 | |
|---|
| 731 | 736 | pm_runtime_mark_last_busy(dev); |
|---|
| 732 | 737 | pm_runtime_put_autosuspend(dev); |
|---|
| .. | .. |
|---|
| 799 | 804 | int ret; |
|---|
| 800 | 805 | |
|---|
| 801 | 806 | ret = spi_master_suspend(master); |
|---|
| 802 | | - if (ret) { |
|---|
| 803 | | - dev_warn(dev, "cannot suspend master\n"); |
|---|
| 807 | + if (ret) |
|---|
| 804 | 808 | return ret; |
|---|
| 805 | | - } |
|---|
| 806 | 809 | |
|---|
| 807 | 810 | return pm_runtime_force_suspend(dev); |
|---|
| 808 | 811 | } |
|---|