drivers/spi/spi-pl022.c
1000
dev_dbg(&pl022->adev->dev, "no RX DMA channel!\n");
drivers/spi/spi-pl022.c
1004
pl022->dma_tx_channel = dma_request_channel(mask,
drivers/spi/spi-pl022.c
1005
pl022->host_info->dma_filter,
drivers/spi/spi-pl022.c
1006
pl022->host_info->dma_tx_param);
drivers/spi/spi-pl022.c
1007
if (!pl022->dma_tx_channel) {
drivers/spi/spi-pl022.c
1008
dev_dbg(&pl022->adev->dev, "no TX DMA channel!\n");
drivers/spi/spi-pl022.c
1012
pl022->dummypage = kmalloc(PAGE_SIZE, GFP_KERNEL);
drivers/spi/spi-pl022.c
1013
if (!pl022->dummypage)
drivers/spi/spi-pl022.c
1016
dev_info(&pl022->adev->dev, "setup for DMA on RX %s, TX %s\n",
drivers/spi/spi-pl022.c
1017
dma_chan_name(pl022->dma_rx_channel),
drivers/spi/spi-pl022.c
1018
dma_chan_name(pl022->dma_tx_channel));
drivers/spi/spi-pl022.c
1023
dma_release_channel(pl022->dma_tx_channel);
drivers/spi/spi-pl022.c
1025
dma_release_channel(pl022->dma_rx_channel);
drivers/spi/spi-pl022.c
1026
pl022->dma_rx_channel = NULL;
drivers/spi/spi-pl022.c
1028
dev_err(&pl022->adev->dev,
drivers/spi/spi-pl022.c
1033
static int pl022_dma_autoprobe(struct pl022 *pl022)
drivers/spi/spi-pl022.c
1035
struct device *dev = &pl022->adev->dev;
drivers/spi/spi-pl022.c
1046
pl022->dma_rx_channel = chan;
drivers/spi/spi-pl022.c
1054
pl022->dma_tx_channel = chan;
drivers/spi/spi-pl022.c
1056
pl022->dummypage = kmalloc(PAGE_SIZE, GFP_KERNEL);
drivers/spi/spi-pl022.c
1057
if (!pl022->dummypage) {
drivers/spi/spi-pl022.c
1065
dma_release_channel(pl022->dma_tx_channel);
drivers/spi/spi-pl022.c
1066
pl022->dma_tx_channel = NULL;
drivers/spi/spi-pl022.c
1068
dma_release_channel(pl022->dma_rx_channel);
drivers/spi/spi-pl022.c
1069
pl022->dma_rx_channel = NULL;
drivers/spi/spi-pl022.c
1074
static void terminate_dma(struct pl022 *pl022)
drivers/spi/spi-pl022.c
1076
if (!pl022->dma_running)
drivers/spi/spi-pl022.c
1079
struct dma_chan *rxchan = pl022->dma_rx_channel;
drivers/spi/spi-pl022.c
1080
struct dma_chan *txchan = pl022->dma_tx_channel;
drivers/spi/spi-pl022.c
1084
unmap_free_dma_scatter(pl022);
drivers/spi/spi-pl022.c
1085
pl022->dma_running = false;
drivers/spi/spi-pl022.c
1088
static void pl022_dma_remove(struct pl022 *pl022)
drivers/spi/spi-pl022.c
1090
terminate_dma(pl022);
drivers/spi/spi-pl022.c
1091
if (pl022->dma_tx_channel)
drivers/spi/spi-pl022.c
1092
dma_release_channel(pl022->dma_tx_channel);
drivers/spi/spi-pl022.c
1093
if (pl022->dma_rx_channel)
drivers/spi/spi-pl022.c
1094
dma_release_channel(pl022->dma_rx_channel);
drivers/spi/spi-pl022.c
1095
kfree(pl022->dummypage);
drivers/spi/spi-pl022.c
1099
static inline int configure_dma(struct pl022 *pl022)
drivers/spi/spi-pl022.c
1104
static inline int pl022_dma_autoprobe(struct pl022 *pl022)
drivers/spi/spi-pl022.c
1109
static inline int pl022_dma_probe(struct pl022 *pl022)
drivers/spi/spi-pl022.c
1114
static inline void terminate_dma(struct pl022 *pl022)
drivers/spi/spi-pl022.c
1118
static inline void pl022_dma_remove(struct pl022 *pl022)
drivers/spi/spi-pl022.c
1138
struct pl022 *pl022 = dev_id;
drivers/spi/spi-pl022.c
1141
irq_status = readw(SSP_MIS(pl022->virtbase));
drivers/spi/spi-pl022.c
1156
dev_err(&pl022->adev->dev, "FIFO overrun\n");
drivers/spi/spi-pl022.c
1157
if (readw(SSP_SR(pl022->virtbase)) & SSP_SR_MASK_RFF)
drivers/spi/spi-pl022.c
1158
dev_err(&pl022->adev->dev,
drivers/spi/spi-pl022.c
1167
SSP_IMSC(pl022->virtbase));
drivers/spi/spi-pl022.c
1168
writew(CLEAR_ALL_INTERRUPTS, SSP_ICR(pl022->virtbase));
drivers/spi/spi-pl022.c
1169
writew((readw(SSP_CR1(pl022->virtbase)) &
drivers/spi/spi-pl022.c
1170
(~SSP_CR1_MASK_SSE)), SSP_CR1(pl022->virtbase));
drivers/spi/spi-pl022.c
1171
pl022->cur_transfer->error |= SPI_TRANS_FAIL_IO;
drivers/spi/spi-pl022.c
1172
spi_finalize_current_transfer(pl022->host);
drivers/spi/spi-pl022.c
1176
readwriter(pl022);
drivers/spi/spi-pl022.c
1178
if (pl022->tx == pl022->tx_end) {
drivers/spi/spi-pl022.c
1180
writew((readw(SSP_IMSC(pl022->virtbase)) &
drivers/spi/spi-pl022.c
1182
SSP_IMSC(pl022->virtbase));
drivers/spi/spi-pl022.c
1190
if (pl022->rx >= pl022->rx_end) {
drivers/spi/spi-pl022.c
1192
SSP_IMSC(pl022->virtbase));
drivers/spi/spi-pl022.c
1193
writew(CLEAR_ALL_INTERRUPTS, SSP_ICR(pl022->virtbase));
drivers/spi/spi-pl022.c
1194
if (unlikely(pl022->rx > pl022->rx_end)) {
drivers/spi/spi-pl022.c
1195
dev_warn(&pl022->adev->dev, "read %u surplus "
drivers/spi/spi-pl022.c
1198
(u32) (pl022->rx - pl022->rx_end));
drivers/spi/spi-pl022.c
1200
spi_finalize_current_transfer(pl022->host);
drivers/spi/spi-pl022.c
1211
static int set_up_next_transfer(struct pl022 *pl022,
drivers/spi/spi-pl022.c
1217
residue = pl022->cur_transfer->len % pl022->cur_chip->n_bytes;
drivers/spi/spi-pl022.c
1219
dev_err(&pl022->adev->dev,
drivers/spi/spi-pl022.c
1222
pl022->cur_transfer->len,
drivers/spi/spi-pl022.c
1223
pl022->cur_chip->n_bytes);
drivers/spi/spi-pl022.c
1224
dev_err(&pl022->adev->dev, "skipping this message\n");
drivers/spi/spi-pl022.c
1227
pl022->tx = (void *)transfer->tx_buf;
drivers/spi/spi-pl022.c
1228
pl022->tx_end = pl022->tx + pl022->cur_transfer->len;
drivers/spi/spi-pl022.c
1229
pl022->rx = (void *)transfer->rx_buf;
drivers/spi/spi-pl022.c
1230
pl022->rx_end = pl022->rx + pl022->cur_transfer->len;
drivers/spi/spi-pl022.c
1231
pl022->write =
drivers/spi/spi-pl022.c
1232
pl022->tx ? pl022->cur_chip->write : WRITING_NULL;
drivers/spi/spi-pl022.c
1233
pl022->read = pl022->rx ? pl022->cur_chip->read : READING_NULL;
drivers/spi/spi-pl022.c
1237
static int do_interrupt_dma_transfer(struct pl022 *pl022)
drivers/spi/spi-pl022.c
1247
ret = set_up_next_transfer(pl022, pl022->cur_transfer);
drivers/spi/spi-pl022.c
1252
if (pl022->cur_chip->enable_dma) {
drivers/spi/spi-pl022.c
1254
if (configure_dma(pl022)) {
drivers/spi/spi-pl022.c
1255
dev_dbg(&pl022->adev->dev,
drivers/spi/spi-pl022.c
1264
writew((readw(SSP_CR1(pl022->virtbase)) | SSP_CR1_MASK_SSE),
drivers/spi/spi-pl022.c
1265
SSP_CR1(pl022->virtbase));
drivers/spi/spi-pl022.c
1266
writew(irqflags, SSP_IMSC(pl022->virtbase));
drivers/spi/spi-pl022.c
1270
static void print_current_status(struct pl022 *pl022)
drivers/spi/spi-pl022.c
1275
if (pl022->vendor->extended_cr)
drivers/spi/spi-pl022.c
1276
read_cr0 = readl(SSP_CR0(pl022->virtbase));
drivers/spi/spi-pl022.c
1278
read_cr0 = readw(SSP_CR0(pl022->virtbase));
drivers/spi/spi-pl022.c
1279
read_cr1 = readw(SSP_CR1(pl022->virtbase));
drivers/spi/spi-pl022.c
1280
read_dmacr = readw(SSP_DMACR(pl022->virtbase));
drivers/spi/spi-pl022.c
1281
read_sr = readw(SSP_SR(pl022->virtbase));
drivers/spi/spi-pl022.c
1283
dev_warn(&pl022->adev->dev, "spi-pl022 CR0: %x\n", read_cr0);
drivers/spi/spi-pl022.c
1284
dev_warn(&pl022->adev->dev, "spi-pl022 CR1: %x\n", read_cr1);
drivers/spi/spi-pl022.c
1285
dev_warn(&pl022->adev->dev, "spi-pl022 DMACR: %x\n", read_dmacr);
drivers/spi/spi-pl022.c
1286
dev_warn(&pl022->adev->dev, "spi-pl022 SR: %x\n", read_sr);
drivers/spi/spi-pl022.c
1287
dev_warn(&pl022->adev->dev,
drivers/spi/spi-pl022.c
1289
pl022->exp_fifo_level,
drivers/spi/spi-pl022.c
1290
pl022->vendor->fifodepth);
drivers/spi/spi-pl022.c
1294
static int do_polling_transfer(struct pl022 *pl022)
drivers/spi/spi-pl022.c
1300
ret = set_up_next_transfer(pl022, pl022->cur_transfer);
drivers/spi/spi-pl022.c
1304
flush(pl022);
drivers/spi/spi-pl022.c
1305
writew((readw(SSP_CR1(pl022->virtbase)) | SSP_CR1_MASK_SSE),
drivers/spi/spi-pl022.c
1306
SSP_CR1(pl022->virtbase));
drivers/spi/spi-pl022.c
1308
dev_dbg(&pl022->adev->dev, "polling transfer ongoing ...\n");
drivers/spi/spi-pl022.c
1311
while (pl022->tx < pl022->tx_end || pl022->rx < pl022->rx_end) {
drivers/spi/spi-pl022.c
1313
readwriter(pl022);
drivers/spi/spi-pl022.c
1315
dev_warn(&pl022->adev->dev,
drivers/spi/spi-pl022.c
1317
print_current_status(pl022);
drivers/spi/spi-pl022.c
1329
struct pl022 *pl022 = spi_controller_get_devdata(host);
drivers/spi/spi-pl022.c
1331
pl022->cur_transfer = transfer;
drivers/spi/spi-pl022.c
1334
pl022->cur_chip = spi_get_ctldata(spi);
drivers/spi/spi-pl022.c
1335
pl022->cur_cs = spi_get_chipselect(spi, 0);
drivers/spi/spi-pl022.c
1337
restore_state(pl022);
drivers/spi/spi-pl022.c
1338
flush(pl022);
drivers/spi/spi-pl022.c
1340
if (pl022->cur_chip->xfer_type == POLLING_TRANSFER)
drivers/spi/spi-pl022.c
1341
return do_polling_transfer(pl022);
drivers/spi/spi-pl022.c
1343
return do_interrupt_dma_transfer(pl022);
drivers/spi/spi-pl022.c
1348
struct pl022 *pl022 = spi_controller_get_devdata(ctlr);
drivers/spi/spi-pl022.c
1350
terminate_dma(pl022);
drivers/spi/spi-pl022.c
1351
writew(DISABLE_ALL_INTERRUPTS, SSP_IMSC(pl022->virtbase));
drivers/spi/spi-pl022.c
1352
writew(CLEAR_ALL_INTERRUPTS, SSP_ICR(pl022->virtbase));
drivers/spi/spi-pl022.c
1357
struct pl022 *pl022 = spi_controller_get_devdata(host);
drivers/spi/spi-pl022.c
1360
writew((readw(SSP_CR1(pl022->virtbase)) &
drivers/spi/spi-pl022.c
1361
(~SSP_CR1_MASK_SSE)), SSP_CR1(pl022->virtbase));
drivers/spi/spi-pl022.c
1366
static int verify_controller_parameters(struct pl022 *pl022,
drivers/spi/spi-pl022.c
1371
dev_err(&pl022->adev->dev,
drivers/spi/spi-pl022.c
1376
(!pl022->vendor->unidir)) {
drivers/spi/spi-pl022.c
1377
dev_err(&pl022->adev->dev,
drivers/spi/spi-pl022.c
1384
dev_err(&pl022->adev->dev,
drivers/spi/spi-pl022.c
1391
dev_err(&pl022->adev->dev,
drivers/spi/spi-pl022.c
1402
if (pl022->vendor->fifodepth < 16) {
drivers/spi/spi-pl022.c
1403
dev_err(&pl022->adev->dev,
drivers/spi/spi-pl022.c
1409
if (pl022->vendor->fifodepth < 32) {
drivers/spi/spi-pl022.c
1410
dev_err(&pl022->adev->dev,
drivers/spi/spi-pl022.c
1416
dev_err(&pl022->adev->dev,
drivers/spi/spi-pl022.c
1427
if (pl022->vendor->fifodepth < 16) {
drivers/spi/spi-pl022.c
1428
dev_err(&pl022->adev->dev,
drivers/spi/spi-pl022.c
1434
if (pl022->vendor->fifodepth < 32) {
drivers/spi/spi-pl022.c
1435
dev_err(&pl022->adev->dev,
drivers/spi/spi-pl022.c
1441
dev_err(&pl022->adev->dev,
drivers/spi/spi-pl022.c
1448
dev_err(&pl022->adev->dev,
drivers/spi/spi-pl022.c
1454
dev_err(&pl022->adev->dev,
drivers/spi/spi-pl022.c
1459
if (pl022->vendor->extended_cr) {
drivers/spi/spi-pl022.c
1464
dev_err(&pl022->adev->dev,
drivers/spi/spi-pl022.c
1470
dev_err(&pl022->adev->dev,
drivers/spi/spi-pl022.c
1486
static int calculate_effective_freq(struct pl022 *pl022, int freq, struct
drivers/spi/spi-pl022.c
1494
rate = clk_get_rate(pl022->clk);
drivers/spi/spi-pl022.c
1501
dev_warn(&pl022->adev->dev,
drivers/spi/spi-pl022.c
1506
dev_err(&pl022->adev->dev,
drivers/spi/spi-pl022.c
1553
dev_dbg(&pl022->adev->dev,
drivers/spi/spi-pl022.c
1556
dev_dbg(&pl022->adev->dev, "SSP cpsdvsr = %d, scr = %d\n",
drivers/spi/spi-pl022.c
1597
struct pl022 *pl022 = spi_controller_get_devdata(spi->controller);
drivers/spi/spi-pl022.c
1656
status = calculate_effective_freq(pl022,
drivers/spi/spi-pl022.c
1675
status = verify_controller_parameters(pl022, chip_info);
drivers/spi/spi-pl022.c
1681
pl022->rx_lev_trig = chip_info->rx_lev_trig;
drivers/spi/spi-pl022.c
1682
pl022->tx_lev_trig = chip_info->tx_lev_trig;
drivers/spi/spi-pl022.c
1688
if ((bits <= 3) || (bits > pl022->vendor->max_bpw)) {
drivers/spi/spi-pl022.c
1692
pl022->vendor->max_bpw);
drivers/spi/spi-pl022.c
1717
&& ((pl022->host_info)->enable_dma)) {
drivers/spi/spi-pl022.c
1736
if (pl022->vendor->extended_cr) {
drivers/spi/spi-pl022.c
1739
if (pl022->vendor->pl023) {
drivers/spi/spi-pl022.c
1792
if (pl022->vendor->loopback) {
drivers/spi/spi-pl022.c
1857
struct pl022 *pl022 = NULL; /*Data for this driver */
drivers/spi/spi-pl022.c
1871
host = devm_spi_alloc_host(dev, sizeof(struct pl022));
drivers/spi/spi-pl022.c
1877
pl022 = spi_controller_get_devdata(host);
drivers/spi/spi-pl022.c
1878
pl022->host = host;
drivers/spi/spi-pl022.c
1879
pl022->host_info = platform_info;
drivers/spi/spi-pl022.c
1880
pl022->adev = adev;
drivers/spi/spi-pl022.c
1881
pl022->vendor = id->data;
drivers/spi/spi-pl022.c
1903
if (pl022->vendor->extended_cr)
drivers/spi/spi-pl022.c
1912
pl022->phybase = adev->res.start;
drivers/spi/spi-pl022.c
1913
pl022->virtbase = devm_ioremap(dev, adev->res.start,
drivers/spi/spi-pl022.c
1915
if (pl022->virtbase == NULL) {
drivers/spi/spi-pl022.c
1920
&adev->res.start, pl022->virtbase);
drivers/spi/spi-pl022.c
1922
pl022->clk = devm_clk_get_enabled(&adev->dev, NULL);
drivers/spi/spi-pl022.c
1923
if (IS_ERR(pl022->clk)) {
drivers/spi/spi-pl022.c
1924
status = PTR_ERR(pl022->clk);
drivers/spi/spi-pl022.c
1930
writew((readw(SSP_CR1(pl022->virtbase)) & (~SSP_CR1_MASK_SSE)),
drivers/spi/spi-pl022.c
1931
SSP_CR1(pl022->virtbase));
drivers/spi/spi-pl022.c
1932
load_ssp_default_config(pl022);
drivers/spi/spi-pl022.c
1935
0, "pl022", pl022);
drivers/spi/spi-pl022.c
1942
status = pl022_dma_autoprobe(pl022);
drivers/spi/spi-pl022.c
1952
status = pl022_dma_probe(pl022);
drivers/spi/spi-pl022.c
1958
amba_set_drvdata(adev, pl022);
drivers/spi/spi-pl022.c
1982
pl022_dma_remove(pl022);
drivers/spi/spi-pl022.c
1994
struct pl022 *pl022 = amba_get_drvdata(adev);
drivers/spi/spi-pl022.c
1996
if (!pl022)
drivers/spi/spi-pl022.c
1999
spi_unregister_controller(pl022->host);
drivers/spi/spi-pl022.c
2007
load_ssp_default_config(pl022);
drivers/spi/spi-pl022.c
2008
if (pl022->host_info->enable_dma)
drivers/spi/spi-pl022.c
2009
pl022_dma_remove(pl022);
drivers/spi/spi-pl022.c
2017
struct pl022 *pl022 = dev_get_drvdata(dev);
drivers/spi/spi-pl022.c
2020
ret = spi_controller_suspend(pl022->host);
drivers/spi/spi-pl022.c
2026
spi_controller_resume(pl022->host);
drivers/spi/spi-pl022.c
2038
struct pl022 *pl022 = dev_get_drvdata(dev);
drivers/spi/spi-pl022.c
2046
ret = spi_controller_resume(pl022->host);
drivers/spi/spi-pl022.c
2057
struct pl022 *pl022 = dev_get_drvdata(dev);
drivers/spi/spi-pl022.c
2059
clk_disable_unprepare(pl022->clk);
drivers/spi/spi-pl022.c
2067
struct pl022 *pl022 = dev_get_drvdata(dev);
drivers/spi/spi-pl022.c
2070
clk_prepare_enable(pl022->clk);
drivers/spi/spi-pl022.c
429
static void internal_cs_control(struct pl022 *pl022, bool enable)
drivers/spi/spi-pl022.c
433
tmp = readw(SSP_CSR(pl022->virtbase));
drivers/spi/spi-pl022.c
435
tmp &= ~BIT(pl022->cur_cs);
drivers/spi/spi-pl022.c
437
tmp |= BIT(pl022->cur_cs);
drivers/spi/spi-pl022.c
438
writew(tmp, SSP_CSR(pl022->virtbase));
drivers/spi/spi-pl022.c
443
struct pl022 *pl022 = spi_controller_get_devdata(spi->controller);
drivers/spi/spi-pl022.c
444
if (pl022->vendor->internal_cs_ctrl)
drivers/spi/spi-pl022.c
445
internal_cs_control(pl022, enable);
drivers/spi/spi-pl022.c
452
static int flush(struct pl022 *pl022)
drivers/spi/spi-pl022.c
456
dev_dbg(&pl022->adev->dev, "flush\n");
drivers/spi/spi-pl022.c
458
while (readw(SSP_SR(pl022->virtbase)) & SSP_SR_MASK_RNE)
drivers/spi/spi-pl022.c
459
readw(SSP_DR(pl022->virtbase));
drivers/spi/spi-pl022.c
460
} while ((readw(SSP_SR(pl022->virtbase)) & SSP_SR_MASK_BSY) && limit--);
drivers/spi/spi-pl022.c
462
pl022->exp_fifo_level = 0;
drivers/spi/spi-pl022.c
471
static void restore_state(struct pl022 *pl022)
drivers/spi/spi-pl022.c
473
struct chip_data *chip = pl022->cur_chip;
drivers/spi/spi-pl022.c
475
if (pl022->vendor->extended_cr)
drivers/spi/spi-pl022.c
476
writel(chip->cr0, SSP_CR0(pl022->virtbase));
drivers/spi/spi-pl022.c
478
writew(chip->cr0, SSP_CR0(pl022->virtbase));
drivers/spi/spi-pl022.c
479
writew(chip->cr1, SSP_CR1(pl022->virtbase));
drivers/spi/spi-pl022.c
480
writew(chip->dmacr, SSP_DMACR(pl022->virtbase));
drivers/spi/spi-pl022.c
481
writew(chip->cpsr, SSP_CPSR(pl022->virtbase));
drivers/spi/spi-pl022.c
482
writew(DISABLE_ALL_INTERRUPTS, SSP_IMSC(pl022->virtbase));
drivers/spi/spi-pl022.c
483
writew(CLEAR_ALL_INTERRUPTS, SSP_ICR(pl022->virtbase));
drivers/spi/spi-pl022.c
561
static void load_ssp_default_config(struct pl022 *pl022)
drivers/spi/spi-pl022.c
563
if (pl022->vendor->pl023) {
drivers/spi/spi-pl022.c
564
writel(DEFAULT_SSP_REG_CR0_ST_PL023, SSP_CR0(pl022->virtbase));
drivers/spi/spi-pl022.c
565
writew(DEFAULT_SSP_REG_CR1_ST_PL023, SSP_CR1(pl022->virtbase));
drivers/spi/spi-pl022.c
566
} else if (pl022->vendor->extended_cr) {
drivers/spi/spi-pl022.c
567
writel(DEFAULT_SSP_REG_CR0_ST, SSP_CR0(pl022->virtbase));
drivers/spi/spi-pl022.c
568
writew(DEFAULT_SSP_REG_CR1_ST, SSP_CR1(pl022->virtbase));
drivers/spi/spi-pl022.c
570
writew(DEFAULT_SSP_REG_CR0, SSP_CR0(pl022->virtbase));
drivers/spi/spi-pl022.c
571
writew(DEFAULT_SSP_REG_CR1, SSP_CR1(pl022->virtbase));
drivers/spi/spi-pl022.c
573
writew(DEFAULT_SSP_REG_DMACR, SSP_DMACR(pl022->virtbase));
drivers/spi/spi-pl022.c
574
writew(DEFAULT_SSP_REG_CPSR, SSP_CPSR(pl022->virtbase));
drivers/spi/spi-pl022.c
575
writew(DISABLE_ALL_INTERRUPTS, SSP_IMSC(pl022->virtbase));
drivers/spi/spi-pl022.c
576
writew(CLEAR_ALL_INTERRUPTS, SSP_ICR(pl022->virtbase));
drivers/spi/spi-pl022.c
583
static void readwriter(struct pl022 *pl022)
drivers/spi/spi-pl022.c
596
dev_dbg(&pl022->adev->dev,
drivers/spi/spi-pl022.c
598
__func__, pl022->rx, pl022->rx_end, pl022->tx, pl022->tx_end);
drivers/spi/spi-pl022.c
601
while ((readw(SSP_SR(pl022->virtbase)) & SSP_SR_MASK_RNE)
drivers/spi/spi-pl022.c
602
&& (pl022->rx < pl022->rx_end)) {
drivers/spi/spi-pl022.c
603
switch (pl022->read) {
drivers/spi/spi-pl022.c
605
readw(SSP_DR(pl022->virtbase));
drivers/spi/spi-pl022.c
608
*(u8 *) (pl022->rx) =
drivers/spi/spi-pl022.c
609
readw(SSP_DR(pl022->virtbase)) & 0xFFU;
drivers/spi/spi-pl022.c
612
*(u16 *) (pl022->rx) =
drivers/spi/spi-pl022.c
613
(u16) readw(SSP_DR(pl022->virtbase));
drivers/spi/spi-pl022.c
616
*(u32 *) (pl022->rx) =
drivers/spi/spi-pl022.c
617
readl(SSP_DR(pl022->virtbase));
drivers/spi/spi-pl022.c
620
pl022->rx += (pl022->cur_chip->n_bytes);
drivers/spi/spi-pl022.c
621
pl022->exp_fifo_level--;
drivers/spi/spi-pl022.c
626
while ((pl022->exp_fifo_level < pl022->vendor->fifodepth)
drivers/spi/spi-pl022.c
627
&& (pl022->tx < pl022->tx_end)) {
drivers/spi/spi-pl022.c
628
switch (pl022->write) {
drivers/spi/spi-pl022.c
630
writew(0x0, SSP_DR(pl022->virtbase));
drivers/spi/spi-pl022.c
633
writew(*(u8 *) (pl022->tx), SSP_DR(pl022->virtbase));
drivers/spi/spi-pl022.c
636
writew((*(u16 *) (pl022->tx)), SSP_DR(pl022->virtbase));
drivers/spi/spi-pl022.c
639
writel(*(u32 *) (pl022->tx), SSP_DR(pl022->virtbase));
drivers/spi/spi-pl022.c
642
pl022->tx += (pl022->cur_chip->n_bytes);
drivers/spi/spi-pl022.c
643
pl022->exp_fifo_level++;
drivers/spi/spi-pl022.c
650
while ((readw(SSP_SR(pl022->virtbase)) & SSP_SR_MASK_RNE)
drivers/spi/spi-pl022.c
651
&& (pl022->rx < pl022->rx_end)) {
drivers/spi/spi-pl022.c
652
switch (pl022->read) {
drivers/spi/spi-pl022.c
654
readw(SSP_DR(pl022->virtbase));
drivers/spi/spi-pl022.c
657
*(u8 *) (pl022->rx) =
drivers/spi/spi-pl022.c
658
readw(SSP_DR(pl022->virtbase)) & 0xFFU;
drivers/spi/spi-pl022.c
661
*(u16 *) (pl022->rx) =
drivers/spi/spi-pl022.c
662
(u16) readw(SSP_DR(pl022->virtbase));
drivers/spi/spi-pl022.c
665
*(u32 *) (pl022->rx) =
drivers/spi/spi-pl022.c
666
readl(SSP_DR(pl022->virtbase));
drivers/spi/spi-pl022.c
669
pl022->rx += (pl022->cur_chip->n_bytes);
drivers/spi/spi-pl022.c
670
pl022->exp_fifo_level--;
drivers/spi/spi-pl022.c
684
static void unmap_free_dma_scatter(struct pl022 *pl022)
drivers/spi/spi-pl022.c
687
dma_unmap_sg(pl022->dma_tx_channel->device->dev, pl022->sgt_tx.sgl,
drivers/spi/spi-pl022.c
688
pl022->sgt_tx.nents, DMA_TO_DEVICE);
drivers/spi/spi-pl022.c
689
dma_unmap_sg(pl022->dma_rx_channel->device->dev, pl022->sgt_rx.sgl,
drivers/spi/spi-pl022.c
690
pl022->sgt_rx.nents, DMA_FROM_DEVICE);
drivers/spi/spi-pl022.c
691
sg_free_table(&pl022->sgt_rx);
drivers/spi/spi-pl022.c
692
sg_free_table(&pl022->sgt_tx);
drivers/spi/spi-pl022.c
697
struct pl022 *pl022 = data;
drivers/spi/spi-pl022.c
699
BUG_ON(!pl022->sgt_rx.sgl);
drivers/spi/spi-pl022.c
712
dma_sync_sg_for_cpu(&pl022->adev->dev,
drivers/spi/spi-pl022.c
713
pl022->sgt_rx.sgl,
drivers/spi/spi-pl022.c
714
pl022->sgt_rx.nents,
drivers/spi/spi-pl022.c
717
for_each_sg(pl022->sgt_rx.sgl, sg, pl022->sgt_rx.nents, i) {
drivers/spi/spi-pl022.c
718
dev_dbg(&pl022->adev->dev, "SPI RX SG ENTRY: %d", i);
drivers/spi/spi-pl022.c
727
for_each_sg(pl022->sgt_tx.sgl, sg, pl022->sgt_tx.nents, i) {
drivers/spi/spi-pl022.c
728
dev_dbg(&pl022->adev->dev, "SPI TX SG ENTRY: %d", i);
drivers/spi/spi-pl022.c
740
unmap_free_dma_scatter(pl022);
drivers/spi/spi-pl022.c
742
spi_finalize_current_transfer(pl022->host);
drivers/spi/spi-pl022.c
745
static void setup_dma_scatter(struct pl022 *pl022,
drivers/spi/spi-pl022.c
771
dev_dbg(&pl022->adev->dev,
drivers/spi/spi-pl022.c
779
sg_set_page(sg, virt_to_page(pl022->dummypage),
drivers/spi/spi-pl022.c
782
dev_dbg(&pl022->adev->dev,
drivers/spi/spi-pl022.c
795
static int configure_dma(struct pl022 *pl022)
drivers/spi/spi-pl022.c
798
.src_addr = SSP_DR(pl022->phybase),
drivers/spi/spi-pl022.c
803
.dst_addr = SSP_DR(pl022->phybase),
drivers/spi/spi-pl022.c
810
struct dma_chan *rxchan = pl022->dma_rx_channel;
drivers/spi/spi-pl022.c
811
struct dma_chan *txchan = pl022->dma_tx_channel;
drivers/spi/spi-pl022.c
825
switch (pl022->rx_lev_trig) {
drivers/spi/spi-pl022.c
842
rx_conf.src_maxburst = pl022->vendor->fifodepth >> 1;
drivers/spi/spi-pl022.c
846
switch (pl022->tx_lev_trig) {
drivers/spi/spi-pl022.c
863
tx_conf.dst_maxburst = pl022->vendor->fifodepth >> 1;
drivers/spi/spi-pl022.c
867
switch (pl022->read) {
drivers/spi/spi-pl022.c
883
switch (pl022->write) {
drivers/spi/spi-pl022.c
910
pages = DIV_ROUND_UP(pl022->cur_transfer->len, PAGE_SIZE);
drivers/spi/spi-pl022.c
911
dev_dbg(&pl022->adev->dev, "using %d pages for transfer\n", pages);
drivers/spi/spi-pl022.c
913
ret = sg_alloc_table(&pl022->sgt_rx, pages, GFP_ATOMIC);
drivers/spi/spi-pl022.c
917
ret = sg_alloc_table(&pl022->sgt_tx, pages, GFP_ATOMIC);
drivers/spi/spi-pl022.c
922
setup_dma_scatter(pl022, pl022->rx,
drivers/spi/spi-pl022.c
923
pl022->cur_transfer->len, &pl022->sgt_rx);
drivers/spi/spi-pl022.c
924
setup_dma_scatter(pl022, pl022->tx,
drivers/spi/spi-pl022.c
925
pl022->cur_transfer->len, &pl022->sgt_tx);
drivers/spi/spi-pl022.c
928
rx_sglen = dma_map_sg(rxchan->device->dev, pl022->sgt_rx.sgl,
drivers/spi/spi-pl022.c
929
pl022->sgt_rx.nents, DMA_FROM_DEVICE);
drivers/spi/spi-pl022.c
933
tx_sglen = dma_map_sg(txchan->device->dev, pl022->sgt_tx.sgl,
drivers/spi/spi-pl022.c
934
pl022->sgt_tx.nents, DMA_TO_DEVICE);
drivers/spi/spi-pl022.c
940
pl022->sgt_rx.sgl,
drivers/spi/spi-pl022.c
948
pl022->sgt_tx.sgl,
drivers/spi/spi-pl022.c
957
rxdesc->callback_param = pl022;
drivers/spi/spi-pl022.c
964
pl022->dma_running = true;
drivers/spi/spi-pl022.c
972
dma_unmap_sg(txchan->device->dev, pl022->sgt_tx.sgl,
drivers/spi/spi-pl022.c
973
pl022->sgt_tx.nents, DMA_TO_DEVICE);
drivers/spi/spi-pl022.c
975
dma_unmap_sg(rxchan->device->dev, pl022->sgt_rx.sgl,
drivers/spi/spi-pl022.c
976
pl022->sgt_rx.nents, DMA_FROM_DEVICE);
drivers/spi/spi-pl022.c
978
sg_free_table(&pl022->sgt_tx);
drivers/spi/spi-pl022.c
980
sg_free_table(&pl022->sgt_rx);
drivers/spi/spi-pl022.c
985
static int pl022_dma_probe(struct pl022 *pl022)
drivers/spi/spi-pl022.c
996
pl022->dma_rx_channel = dma_request_channel(mask,
drivers/spi/spi-pl022.c
997
pl022->host_info->dma_filter,
drivers/spi/spi-pl022.c
998
pl022->host_info->dma_rx_param);
drivers/spi/spi-pl022.c
999
if (!pl022->dma_rx_channel) {