linux/drivers/usb/musb/musbhsdma.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * MUSB OTG driver - support for Mentor's DMA controller
   4 *
   5 * Copyright 2005 Mentor Graphics Corporation
   6 * Copyright (C) 2005-2007 by Texas Instruments
   7 */
   8#include <linux/device.h>
   9#include <linux/interrupt.h>
  10#include <linux/platform_device.h>
  11#include <linux/slab.h>
  12#include "musb_core.h"
  13
  14#define MUSB_HSDMA_BASE         0x200
  15#define MUSB_HSDMA_INTR         (MUSB_HSDMA_BASE + 0)
  16#define MUSB_HSDMA_CONTROL              0x4
  17#define MUSB_HSDMA_ADDRESS              0x8
  18#define MUSB_HSDMA_COUNT                0xc
  19
  20#define MUSB_HSDMA_CHANNEL_OFFSET(_bchannel, _offset)           \
  21                (MUSB_HSDMA_BASE + (_bchannel << 4) + _offset)
  22
  23#define musb_read_hsdma_addr(mbase, bchannel)   \
  24        musb_readl(mbase,       \
  25                   MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_ADDRESS))
  26
  27#define musb_write_hsdma_addr(mbase, bchannel, addr) \
  28        musb_writel(mbase, \
  29                    MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_ADDRESS), \
  30                    addr)
  31
  32#define musb_read_hsdma_count(mbase, bchannel)  \
  33        musb_readl(mbase,       \
  34                   MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_COUNT))
  35
  36#define musb_write_hsdma_count(mbase, bchannel, len) \
  37        musb_writel(mbase, \
  38                    MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_COUNT), \
  39                    len)
  40/* control register (16-bit): */
  41#define MUSB_HSDMA_ENABLE_SHIFT         0
  42#define MUSB_HSDMA_TRANSMIT_SHIFT       1
  43#define MUSB_HSDMA_MODE1_SHIFT          2
  44#define MUSB_HSDMA_IRQENABLE_SHIFT      3
  45#define MUSB_HSDMA_ENDPOINT_SHIFT       4
  46#define MUSB_HSDMA_BUSERROR_SHIFT       8
  47#define MUSB_HSDMA_BURSTMODE_SHIFT      9
  48#define MUSB_HSDMA_BURSTMODE            (3 << MUSB_HSDMA_BURSTMODE_SHIFT)
  49#define MUSB_HSDMA_BURSTMODE_UNSPEC     0
  50#define MUSB_HSDMA_BURSTMODE_INCR4      1
  51#define MUSB_HSDMA_BURSTMODE_INCR8      2
  52#define MUSB_HSDMA_BURSTMODE_INCR16     3
  53
  54#define MUSB_HSDMA_CHANNELS             8
  55
  56struct musb_dma_controller;
  57
  58struct musb_dma_channel {
  59        struct dma_channel              channel;
  60        struct musb_dma_controller      *controller;
  61        u32                             start_addr;
  62        u32                             len;
  63        u16                             max_packet_sz;
  64        u8                              idx;
  65        u8                              epnum;
  66        u8                              transmit;
  67};
  68
  69struct musb_dma_controller {
  70        struct dma_controller           controller;
  71        struct musb_dma_channel         channel[MUSB_HSDMA_CHANNELS];
  72        void                            *private_data;
  73        void __iomem                    *base;
  74        u8                              channel_count;
  75        u8                              used_channels;
  76        int                             irq;
  77};
  78
  79static void dma_channel_release(struct dma_channel *channel);
  80
  81static void dma_controller_stop(struct musb_dma_controller *controller)
  82{
  83        struct musb *musb = controller->private_data;
  84        struct dma_channel *channel;
  85        u8 bit;
  86
  87        if (controller->used_channels != 0) {
  88                dev_err(musb->controller,
  89                        "Stopping DMA controller while channel active\n");
  90
  91                for (bit = 0; bit < MUSB_HSDMA_CHANNELS; bit++) {
  92                        if (controller->used_channels & (1 << bit)) {
  93                                channel = &controller->channel[bit].channel;
  94                                dma_channel_release(channel);
  95
  96                                if (!controller->used_channels)
  97                                        break;
  98                        }
  99                }
 100        }
 101}
 102
 103static struct dma_channel *dma_channel_allocate(struct dma_controller *c,
 104                                struct musb_hw_ep *hw_ep, u8 transmit)
 105{
 106        struct musb_dma_controller *controller = container_of(c,
 107                        struct musb_dma_controller, controller);
 108        struct musb_dma_channel *musb_channel = NULL;
 109        struct dma_channel *channel = NULL;
 110        u8 bit;
 111
 112        for (bit = 0; bit < MUSB_HSDMA_CHANNELS; bit++) {
 113                if (!(controller->used_channels & (1 << bit))) {
 114                        controller->used_channels |= (1 << bit);
 115                        musb_channel = &(controller->channel[bit]);
 116                        musb_channel->controller = controller;
 117                        musb_channel->idx = bit;
 118                        musb_channel->epnum = hw_ep->epnum;
 119                        musb_channel->transmit = transmit;
 120                        channel = &(musb_channel->channel);
 121                        channel->private_data = musb_channel;
 122                        channel->status = MUSB_DMA_STATUS_FREE;
 123                        channel->max_len = 0x100000;
 124                        /* Tx => mode 1; Rx => mode 0 */
 125                        channel->desired_mode = transmit;
 126                        channel->actual_len = 0;
 127                        break;
 128                }
 129        }
 130
 131        return channel;
 132}
 133
 134static void dma_channel_release(struct dma_channel *channel)
 135{
 136        struct musb_dma_channel *musb_channel = channel->private_data;
 137
 138        channel->actual_len = 0;
 139        musb_channel->start_addr = 0;
 140        musb_channel->len = 0;
 141
 142        musb_channel->controller->used_channels &=
 143                ~(1 << musb_channel->idx);
 144
 145        channel->status = MUSB_DMA_STATUS_UNKNOWN;
 146}
 147
 148static void configure_channel(struct dma_channel *channel,
 149                                u16 packet_sz, u8 mode,
 150                                dma_addr_t dma_addr, u32 len)
 151{
 152        struct musb_dma_channel *musb_channel = channel->private_data;
 153        struct musb_dma_controller *controller = musb_channel->controller;
 154        struct musb *musb = controller->private_data;
 155        void __iomem *mbase = controller->base;
 156        u8 bchannel = musb_channel->idx;
 157        u16 csr = 0;
 158
 159        musb_dbg(musb, "%p, pkt_sz %d, addr %pad, len %d, mode %d",
 160                        channel, packet_sz, &dma_addr, len, mode);
 161
 162        if (mode) {
 163                csr |= 1 << MUSB_HSDMA_MODE1_SHIFT;
 164                BUG_ON(len < packet_sz);
 165        }
 166        csr |= MUSB_HSDMA_BURSTMODE_INCR16
 167                                << MUSB_HSDMA_BURSTMODE_SHIFT;
 168
 169        csr |= (musb_channel->epnum << MUSB_HSDMA_ENDPOINT_SHIFT)
 170                | (1 << MUSB_HSDMA_ENABLE_SHIFT)
 171                | (1 << MUSB_HSDMA_IRQENABLE_SHIFT)
 172                | (musb_channel->transmit
 173                                ? (1 << MUSB_HSDMA_TRANSMIT_SHIFT)
 174                                : 0);
 175
 176        /* address/count */
 177        musb_write_hsdma_addr(mbase, bchannel, dma_addr);
 178        musb_write_hsdma_count(mbase, bchannel, len);
 179
 180        /* control (this should start things) */
 181        musb_writew(mbase,
 182                MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_CONTROL),
 183                csr);
 184}
 185
 186static int dma_channel_program(struct dma_channel *channel,
 187                                u16 packet_sz, u8 mode,
 188                                dma_addr_t dma_addr, u32 len)
 189{
 190        struct musb_dma_channel *musb_channel = channel->private_data;
 191        struct musb_dma_controller *controller = musb_channel->controller;
 192        struct musb *musb = controller->private_data;
 193
 194        musb_dbg(musb, "ep%d-%s pkt_sz %d, dma_addr %pad length %d, mode %d",
 195                musb_channel->epnum,
 196                musb_channel->transmit ? "Tx" : "Rx",
 197                packet_sz, &dma_addr, len, mode);
 198
 199        BUG_ON(channel->status == MUSB_DMA_STATUS_UNKNOWN ||
 200                channel->status == MUSB_DMA_STATUS_BUSY);
 201
 202        /*
 203         * The DMA engine in RTL1.8 and above cannot handle
 204         * DMA addresses that are not aligned to a 4 byte boundary.
 205         * It ends up masking the last two bits of the address
 206         * programmed in DMA_ADDR.
 207         *
 208         * Fail such DMA transfers, so that the backup PIO mode
 209         * can carry out the transfer
 210         */
 211        if ((musb->hwvers >= MUSB_HWVERS_1800) && (dma_addr % 4))
 212                return false;
 213
 214        channel->actual_len = 0;
 215        musb_channel->start_addr = dma_addr;
 216        musb_channel->len = len;
 217        musb_channel->max_packet_sz = packet_sz;
 218        channel->status = MUSB_DMA_STATUS_BUSY;
 219
 220        configure_channel(channel, packet_sz, mode, dma_addr, len);
 221
 222        return true;
 223}
 224
 225static int dma_channel_abort(struct dma_channel *channel)
 226{
 227        struct musb_dma_channel *musb_channel = channel->private_data;
 228        void __iomem *mbase = musb_channel->controller->base;
 229        struct musb *musb = musb_channel->controller->private_data;
 230
 231        u8 bchannel = musb_channel->idx;
 232        int offset;
 233        u16 csr;
 234
 235        if (channel->status == MUSB_DMA_STATUS_BUSY) {
 236                if (musb_channel->transmit) {
 237                        offset = musb->io.ep_offset(musb_channel->epnum,
 238                                                MUSB_TXCSR);
 239
 240                        /*
 241                         * The programming guide says that we must clear
 242                         * the DMAENAB bit before the DMAMODE bit...
 243                         */
 244                        csr = musb_readw(mbase, offset);
 245                        csr &= ~(MUSB_TXCSR_AUTOSET | MUSB_TXCSR_DMAENAB);
 246                        musb_writew(mbase, offset, csr);
 247                        csr &= ~MUSB_TXCSR_DMAMODE;
 248                        musb_writew(mbase, offset, csr);
 249                } else {
 250                        offset = musb->io.ep_offset(musb_channel->epnum,
 251                                                MUSB_RXCSR);
 252
 253                        csr = musb_readw(mbase, offset);
 254                        csr &= ~(MUSB_RXCSR_AUTOCLEAR |
 255                                 MUSB_RXCSR_DMAENAB |
 256                                 MUSB_RXCSR_DMAMODE);
 257                        musb_writew(mbase, offset, csr);
 258                }
 259
 260                musb_writew(mbase,
 261                        MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_CONTROL),
 262                        0);
 263                musb_write_hsdma_addr(mbase, bchannel, 0);
 264                musb_write_hsdma_count(mbase, bchannel, 0);
 265                channel->status = MUSB_DMA_STATUS_FREE;
 266        }
 267
 268        return 0;
 269}
 270
 271static irqreturn_t dma_controller_irq(int irq, void *private_data)
 272{
 273        struct musb_dma_controller *controller = private_data;
 274        struct musb *musb = controller->private_data;
 275        struct musb_dma_channel *musb_channel;
 276        struct dma_channel *channel;
 277
 278        void __iomem *mbase = controller->base;
 279
 280        irqreturn_t retval = IRQ_NONE;
 281
 282        unsigned long flags;
 283
 284        u8 bchannel;
 285        u8 int_hsdma;
 286
 287        u32 addr, count;
 288        u16 csr;
 289
 290        spin_lock_irqsave(&musb->lock, flags);
 291
 292        int_hsdma = musb_readb(mbase, MUSB_HSDMA_INTR);
 293
 294        if (!int_hsdma) {
 295                musb_dbg(musb, "spurious DMA irq");
 296
 297                for (bchannel = 0; bchannel < MUSB_HSDMA_CHANNELS; bchannel++) {
 298                        musb_channel = (struct musb_dma_channel *)
 299                                        &(controller->channel[bchannel]);
 300                        channel = &musb_channel->channel;
 301                        if (channel->status == MUSB_DMA_STATUS_BUSY) {
 302                                count = musb_read_hsdma_count(mbase, bchannel);
 303
 304                                if (count == 0)
 305                                        int_hsdma |= (1 << bchannel);
 306                        }
 307                }
 308
 309                musb_dbg(musb, "int_hsdma = 0x%x", int_hsdma);
 310
 311                if (!int_hsdma)
 312                        goto done;
 313        }
 314
 315        for (bchannel = 0; bchannel < MUSB_HSDMA_CHANNELS; bchannel++) {
 316                if (int_hsdma & (1 << bchannel)) {
 317                        musb_channel = (struct musb_dma_channel *)
 318                                        &(controller->channel[bchannel]);
 319                        channel = &musb_channel->channel;
 320
 321                        csr = musb_readw(mbase,
 322                                        MUSB_HSDMA_CHANNEL_OFFSET(bchannel,
 323                                                        MUSB_HSDMA_CONTROL));
 324
 325                        if (csr & (1 << MUSB_HSDMA_BUSERROR_SHIFT)) {
 326                                musb_channel->channel.status =
 327                                        MUSB_DMA_STATUS_BUS_ABORT;
 328                        } else {
 329                                u8 devctl;
 330
 331                                addr = musb_read_hsdma_addr(mbase,
 332                                                bchannel);
 333                                channel->actual_len = addr
 334                                        - musb_channel->start_addr;
 335
 336                                musb_dbg(musb, "ch %p, 0x%x -> 0x%x (%zu / %d) %s",
 337                                        channel, musb_channel->start_addr,
 338                                        addr, channel->actual_len,
 339                                        musb_channel->len,
 340                                        (channel->actual_len
 341                                                < musb_channel->len) ?
 342                                        "=> reconfig 0" : "=> complete");
 343
 344                                devctl = musb_readb(mbase, MUSB_DEVCTL);
 345
 346                                channel->status = MUSB_DMA_STATUS_FREE;
 347
 348                                /* completed */
 349                                if (musb_channel->transmit &&
 350                                        (!channel->desired_mode ||
 351                                        (channel->actual_len %
 352                                            musb_channel->max_packet_sz))) {
 353                                        u8  epnum  = musb_channel->epnum;
 354                                        int offset = musb->io.ep_offset(epnum,
 355                                                                    MUSB_TXCSR);
 356                                        u16 txcsr;
 357
 358                                        /*
 359                                         * The programming guide says that we
 360                                         * must clear DMAENAB before DMAMODE.
 361                                         */
 362                                        musb_ep_select(mbase, epnum);
 363                                        txcsr = musb_readw(mbase, offset);
 364                                        if (channel->desired_mode == 1) {
 365                                                txcsr &= ~(MUSB_TXCSR_DMAENAB
 366                                                        | MUSB_TXCSR_AUTOSET);
 367                                                musb_writew(mbase, offset, txcsr);
 368                                                /* Send out the packet */
 369                                                txcsr &= ~MUSB_TXCSR_DMAMODE;
 370                                                txcsr |= MUSB_TXCSR_DMAENAB;
 371                                        }
 372                                        txcsr |=  MUSB_TXCSR_TXPKTRDY;
 373                                        musb_writew(mbase, offset, txcsr);
 374                                }
 375                                musb_dma_completion(musb, musb_channel->epnum,
 376                                                    musb_channel->transmit);
 377                        }
 378                }
 379        }
 380
 381        retval = IRQ_HANDLED;
 382done:
 383        spin_unlock_irqrestore(&musb->lock, flags);
 384        return retval;
 385}
 386
 387void musbhs_dma_controller_destroy(struct dma_controller *c)
 388{
 389        struct musb_dma_controller *controller = container_of(c,
 390                        struct musb_dma_controller, controller);
 391
 392        dma_controller_stop(controller);
 393
 394        if (controller->irq)
 395                free_irq(controller->irq, c);
 396
 397        kfree(controller);
 398}
 399EXPORT_SYMBOL_GPL(musbhs_dma_controller_destroy);
 400
 401struct dma_controller *musbhs_dma_controller_create(struct musb *musb,
 402                                                    void __iomem *base)
 403{
 404        struct musb_dma_controller *controller;
 405        struct device *dev = musb->controller;
 406        struct platform_device *pdev = to_platform_device(dev);
 407        int irq = platform_get_irq_byname(pdev, "dma");
 408
 409        if (irq <= 0) {
 410                dev_err(dev, "No DMA interrupt line!\n");
 411                return NULL;
 412        }
 413
 414        controller = kzalloc(sizeof(*controller), GFP_KERNEL);
 415        if (!controller)
 416                return NULL;
 417
 418        controller->channel_count = MUSB_HSDMA_CHANNELS;
 419        controller->private_data = musb;
 420        controller->base = base;
 421
 422        controller->controller.channel_alloc = dma_channel_allocate;
 423        controller->controller.channel_release = dma_channel_release;
 424        controller->controller.channel_program = dma_channel_program;
 425        controller->controller.channel_abort = dma_channel_abort;
 426
 427        if (request_irq(irq, dma_controller_irq, 0,
 428                        dev_name(musb->controller), &controller->controller)) {
 429                dev_err(dev, "request_irq %d failed!\n", irq);
 430                musb_dma_controller_destroy(&controller->controller);
 431
 432                return NULL;
 433        }
 434
 435        controller->irq = irq;
 436
 437        return &controller->controller;
 438}
 439EXPORT_SYMBOL_GPL(musbhs_dma_controller_create);
 440