root/drivers/media/pci/netup_unidvb/netup_unidvb_spi.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. netup_spi_interrupt
  2. netup_spi_transfer
  3. netup_spi_setup
  4. netup_spi_init
  5. netup_spi_release

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /*
   3  * netup_unidvb_spi.c
   4  *
   5  * Internal SPI driver for NetUP Universal Dual DVB-CI
   6  *
   7  * Copyright (C) 2014 NetUP Inc.
   8  * Copyright (C) 2014 Sergey Kozlov <serjk@netup.ru>
   9  * Copyright (C) 2014 Abylay Ospan <aospan@netup.ru>
  10  */
  11 
  12 #include "netup_unidvb.h"
  13 #include <linux/spi/spi.h>
  14 #include <linux/spi/flash.h>
  15 #include <linux/mtd/partitions.h>
  16 #include <mtd/mtd-abi.h>
  17 
  18 #define NETUP_SPI_CTRL_IRQ      0x1000
  19 #define NETUP_SPI_CTRL_IMASK    0x2000
  20 #define NETUP_SPI_CTRL_START    0x8000
  21 #define NETUP_SPI_CTRL_LAST_CS  0x4000
  22 
  23 #define NETUP_SPI_TIMEOUT       6000
  24 
  25 enum netup_spi_state {
  26         SPI_STATE_START,
  27         SPI_STATE_DONE,
  28 };
  29 
  30 struct netup_spi_regs {
  31         __u8    data[1024];
  32         __le16  control_stat;
  33         __le16  clock_divider;
  34 } __packed __aligned(1);
  35 
  36 struct netup_spi {
  37         struct device                   *dev;
  38         struct spi_master               *master;
  39         struct netup_spi_regs __iomem   *regs;
  40         u8 __iomem                      *mmio;
  41         spinlock_t                      lock;
  42         wait_queue_head_t               waitq;
  43         enum netup_spi_state            state;
  44 };
  45 
  46 static char netup_spi_name[64] = "fpga";
  47 
  48 static struct mtd_partition netup_spi_flash_partitions = {
  49         .name = netup_spi_name,
  50         .size = 0x1000000, /* 16MB */
  51         .offset = 0,
  52         .mask_flags = MTD_CAP_ROM
  53 };
  54 
  55 static struct flash_platform_data spi_flash_data = {
  56         .name = "netup0_m25p128",
  57         .parts = &netup_spi_flash_partitions,
  58         .nr_parts = 1,
  59 };
  60 
  61 static struct spi_board_info netup_spi_board = {
  62         .modalias = "m25p128",
  63         .max_speed_hz = 11000000,
  64         .chip_select = 0,
  65         .mode = SPI_MODE_0,
  66         .platform_data = &spi_flash_data,
  67 };
  68 
  69 irqreturn_t netup_spi_interrupt(struct netup_spi *spi)
  70 {
  71         u16 reg;
  72         unsigned long flags;
  73 
  74         if (!spi)
  75                 return IRQ_NONE;
  76 
  77         spin_lock_irqsave(&spi->lock, flags);
  78         reg = readw(&spi->regs->control_stat);
  79         if (!(reg & NETUP_SPI_CTRL_IRQ)) {
  80                 spin_unlock_irqrestore(&spi->lock, flags);
  81                 dev_dbg(&spi->master->dev,
  82                         "%s(): not mine interrupt\n", __func__);
  83                 return IRQ_NONE;
  84         }
  85         writew(reg | NETUP_SPI_CTRL_IRQ, &spi->regs->control_stat);
  86         reg = readw(&spi->regs->control_stat);
  87         writew(reg & ~NETUP_SPI_CTRL_IMASK, &spi->regs->control_stat);
  88         spi->state = SPI_STATE_DONE;
  89         wake_up(&spi->waitq);
  90         spin_unlock_irqrestore(&spi->lock, flags);
  91         dev_dbg(&spi->master->dev,
  92                 "%s(): SPI interrupt handled\n", __func__);
  93         return IRQ_HANDLED;
  94 }
  95 
  96 static int netup_spi_transfer(struct spi_master *master,
  97                               struct spi_message *msg)
  98 {
  99         struct netup_spi *spi = spi_master_get_devdata(master);
 100         struct spi_transfer *t;
 101         int result = 0;
 102         u32 tr_size;
 103 
 104         /* reset CS */
 105         writew(NETUP_SPI_CTRL_LAST_CS, &spi->regs->control_stat);
 106         writew(0, &spi->regs->control_stat);
 107         list_for_each_entry(t, &msg->transfers, transfer_list) {
 108                 tr_size = t->len;
 109                 while (tr_size) {
 110                         u32 frag_offset = t->len - tr_size;
 111                         u32 frag_size = (tr_size > sizeof(spi->regs->data)) ?
 112                                         sizeof(spi->regs->data) : tr_size;
 113                         int frag_last = 0;
 114 
 115                         if (list_is_last(&t->transfer_list,
 116                                         &msg->transfers) &&
 117                                         frag_offset + frag_size == t->len) {
 118                                 frag_last = 1;
 119                         }
 120                         if (t->tx_buf) {
 121                                 memcpy_toio(spi->regs->data,
 122                                         t->tx_buf + frag_offset,
 123                                         frag_size);
 124                         } else {
 125                                 memset_io(spi->regs->data,
 126                                         0, frag_size);
 127                         }
 128                         spi->state = SPI_STATE_START;
 129                         writew((frag_size & 0x3ff) |
 130                                 NETUP_SPI_CTRL_IMASK |
 131                                 NETUP_SPI_CTRL_START |
 132                                 (frag_last ? NETUP_SPI_CTRL_LAST_CS : 0),
 133                                 &spi->regs->control_stat);
 134                         dev_dbg(&spi->master->dev,
 135                                 "%s(): control_stat 0x%04x\n",
 136                                 __func__, readw(&spi->regs->control_stat));
 137                         wait_event_timeout(spi->waitq,
 138                                 spi->state != SPI_STATE_START,
 139                                 msecs_to_jiffies(NETUP_SPI_TIMEOUT));
 140                         if (spi->state == SPI_STATE_DONE) {
 141                                 if (t->rx_buf) {
 142                                         memcpy_fromio(t->rx_buf + frag_offset,
 143                                                 spi->regs->data, frag_size);
 144                                 }
 145                         } else {
 146                                 if (spi->state == SPI_STATE_START) {
 147                                         dev_dbg(&spi->master->dev,
 148                                                 "%s(): transfer timeout\n",
 149                                                 __func__);
 150                                 } else {
 151                                         dev_dbg(&spi->master->dev,
 152                                                 "%s(): invalid state %d\n",
 153                                                 __func__, spi->state);
 154                                 }
 155                                 result = -EIO;
 156                                 goto done;
 157                         }
 158                         tr_size -= frag_size;
 159                         msg->actual_length += frag_size;
 160                 }
 161         }
 162 done:
 163         msg->status = result;
 164         spi_finalize_current_message(master);
 165         return result;
 166 }
 167 
 168 static int netup_spi_setup(struct spi_device *spi)
 169 {
 170         return 0;
 171 }
 172 
 173 int netup_spi_init(struct netup_unidvb_dev *ndev)
 174 {
 175         struct spi_master *master;
 176         struct netup_spi *nspi;
 177 
 178         master = spi_alloc_master(&ndev->pci_dev->dev,
 179                 sizeof(struct netup_spi));
 180         if (!master) {
 181                 dev_err(&ndev->pci_dev->dev,
 182                         "%s(): unable to alloc SPI master\n", __func__);
 183                 return -EINVAL;
 184         }
 185         nspi = spi_master_get_devdata(master);
 186         master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_LSB_FIRST;
 187         master->bus_num = -1;
 188         master->num_chipselect = 1;
 189         master->transfer_one_message = netup_spi_transfer;
 190         master->setup = netup_spi_setup;
 191         spin_lock_init(&nspi->lock);
 192         init_waitqueue_head(&nspi->waitq);
 193         nspi->master = master;
 194         nspi->regs = (struct netup_spi_regs __iomem *)(ndev->bmmio0 + 0x4000);
 195         writew(2, &nspi->regs->clock_divider);
 196         writew(NETUP_UNIDVB_IRQ_SPI, ndev->bmmio0 + REG_IMASK_SET);
 197         ndev->spi = nspi;
 198         if (spi_register_master(master)) {
 199                 ndev->spi = NULL;
 200                 dev_err(&ndev->pci_dev->dev,
 201                         "%s(): unable to register SPI bus\n", __func__);
 202                 return -EINVAL;
 203         }
 204         snprintf(netup_spi_name,
 205                 sizeof(netup_spi_name),
 206                 "fpga_%02x:%02x.%01x",
 207                 ndev->pci_bus,
 208                 ndev->pci_slot,
 209                 ndev->pci_func);
 210         if (!spi_new_device(master, &netup_spi_board)) {
 211                 ndev->spi = NULL;
 212                 dev_err(&ndev->pci_dev->dev,
 213                         "%s(): unable to create SPI device\n", __func__);
 214                 return -EINVAL;
 215         }
 216         dev_dbg(&ndev->pci_dev->dev, "%s(): SPI init OK\n", __func__);
 217         return 0;
 218 }
 219 
 220 void netup_spi_release(struct netup_unidvb_dev *ndev)
 221 {
 222         u16 reg;
 223         unsigned long flags;
 224         struct netup_spi *spi = ndev->spi;
 225 
 226         if (!spi)
 227                 return;
 228 
 229         spin_lock_irqsave(&spi->lock, flags);
 230         reg = readw(&spi->regs->control_stat);
 231         writew(reg | NETUP_SPI_CTRL_IRQ, &spi->regs->control_stat);
 232         reg = readw(&spi->regs->control_stat);
 233         writew(reg & ~NETUP_SPI_CTRL_IMASK, &spi->regs->control_stat);
 234         spin_unlock_irqrestore(&spi->lock, flags);
 235         spi_unregister_master(spi->master);
 236         ndev->spi = NULL;
 237 }
 238 
 239 

/* [<][>][^][v][top][bottom][index][help] */