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