Blame sim/bfin/dv-bfin_dmac.c

Packit Service 706eca
/* Blackfin Direct Memory Access (DMA) Controller model.
Packit Service 706eca
Packit Service 706eca
   Copyright (C) 2010-2018 Free Software Foundation, Inc.
Packit Service 706eca
   Contributed by Analog Devices, Inc.
Packit Service 706eca
Packit Service 706eca
   This file is part of simulators.
Packit Service 706eca
Packit Service 706eca
   This program is free software; you can redistribute it and/or modify
Packit Service 706eca
   it under the terms of the GNU General Public License as published by
Packit Service 706eca
   the Free Software Foundation; either version 3 of the License, or
Packit Service 706eca
   (at your option) any later version.
Packit Service 706eca
Packit Service 706eca
   This program is distributed in the hope that it will be useful,
Packit Service 706eca
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 706eca
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 706eca
   GNU General Public License for more details.
Packit Service 706eca
Packit Service 706eca
   You should have received a copy of the GNU General Public License
Packit Service 706eca
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit Service 706eca
Packit Service 706eca
#include "config.h"
Packit Service 706eca
Packit Service 706eca
#include "sim-main.h"
Packit Service 706eca
#include "sim-hw.h"
Packit Service 706eca
#include "devices.h"
Packit Service 706eca
#include "hw-device.h"
Packit Service 706eca
#include "dv-bfin_dma.h"
Packit Service 706eca
#include "dv-bfin_dmac.h"
Packit Service 706eca
Packit Service 706eca
struct bfin_dmac
Packit Service 706eca
{
Packit Service 706eca
  /* This top portion matches common dv_bfin struct.  */
Packit Service 706eca
  bu32 base;
Packit Service 706eca
  struct hw *dma_master;
Packit Service 706eca
  bool acked;
Packit Service 706eca
Packit Service 706eca
  const char * const *pmap;
Packit Service 706eca
  unsigned int pmap_count;
Packit Service 706eca
};
Packit Service 706eca
Packit Service 706eca
struct hw *
Packit Service 706eca
bfin_dmac_get_peer (struct hw *dma, bu16 pmap)
Packit Service 706eca
{
Packit Service 706eca
  struct hw *ret, *me;
Packit Service 706eca
  struct bfin_dmac *dmac;
Packit Service 706eca
  char peer[100];
Packit Service 706eca
Packit Service 706eca
  me = hw_parent (dma);
Packit Service 706eca
  dmac = hw_data (me);
Packit Service 706eca
  if (pmap & CTYPE)
Packit Service 706eca
    {
Packit Service 706eca
      /* MDMA channel.  */
Packit Service 706eca
      unsigned int chan_num = dv_get_bus_num (dma);
Packit Service 706eca
      if (chan_num & 1)
Packit Service 706eca
	chan_num &= ~1;
Packit Service 706eca
      else
Packit Service 706eca
	chan_num |= 1;
Packit Service 706eca
      sprintf (peer, "%s/bfin_dma@%u", hw_path (me), chan_num);
Packit Service 706eca
    }
Packit Service 706eca
  else
Packit Service 706eca
    {
Packit Service 706eca
      unsigned int idx = pmap >> 12;
Packit Service 706eca
      if (idx >= dmac->pmap_count)
Packit Service 706eca
	hw_abort (me, "Invalid DMA peripheral_map %#x", pmap);
Packit Service 706eca
      else
Packit Service 706eca
	sprintf (peer, "/core/bfin_%s", dmac->pmap[idx]);
Packit Service 706eca
    }
Packit Service 706eca
Packit Service 706eca
  ret = hw_tree_find_device (me, peer);
Packit Service 706eca
  if (!ret)
Packit Service 706eca
    hw_abort (me, "Unable to locate peer for %s (pmap:%#x %s)",
Packit Service 706eca
	      hw_name (dma), pmap, peer);
Packit Service 706eca
  return ret;
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
bu16
Packit Service 706eca
bfin_dmac_default_pmap (struct hw *dma)
Packit Service 706eca
{
Packit Service 706eca
  unsigned int chan_num = dv_get_bus_num (dma);
Packit Service 706eca
Packit Service 706eca
  if (chan_num < BFIN_DMAC_MDMA_BASE)
Packit Service 706eca
    return (chan_num % 12) << 12;
Packit Service 706eca
  else
Packit Service 706eca
    return CTYPE;	/* MDMA */
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
static const char * const bfin_dmac_50x_pmap[] =
Packit Service 706eca
{
Packit Service 706eca
  "ppi@0", "rsi", "sport@0", "sport@0", "sport@1", "sport@1",
Packit Service 706eca
  "spi@0", "spi@1", "uart2@0", "uart2@0", "uart2@1", "uart2@1",
Packit Service 706eca
};
Packit Service 706eca
Packit Service 706eca
/* XXX: Need to figure out how to handle portmuxed DMA channels.  */
Packit Service 706eca
static const struct hw_port_descriptor bfin_dmac_50x_ports[] =
Packit Service 706eca
{
Packit Service 706eca
  { "ppi@0",       0, 0, input_port, },
Packit Service 706eca
  { "rsi",         1, 0, input_port, },
Packit Service 706eca
  { "sport@0_rx",  2, 0, input_port, },
Packit Service 706eca
  { "sport@0_tx",  3, 0, input_port, },
Packit Service 706eca
  { "sport@1_tx",  4, 0, input_port, },
Packit Service 706eca
  { "sport@1_rx",  5, 0, input_port, },
Packit Service 706eca
  { "spi@0",       6, 0, input_port, },
Packit Service 706eca
  { "spi@1",       7, 0, input_port, },
Packit Service 706eca
  { "uart2@0_rx",  8, 0, input_port, },
Packit Service 706eca
  { "uart2@0_tx",  9, 0, input_port, },
Packit Service 706eca
  { "uart2@1_rx", 10, 0, input_port, },
Packit Service 706eca
  { "uart2@1_tx", 11, 0, input_port, },
Packit Service 706eca
  { NULL, 0, 0, 0, },
Packit Service 706eca
};
Packit Service 706eca
Packit Service 706eca
static const char * const bfin_dmac_51x_pmap[] =
Packit Service 706eca
{
Packit Service 706eca
  "ppi@0", "emac", "emac", "sport@0", "sport@0", "sport@1",
Packit Service 706eca
  "sport@1", "spi@0", "uart@0", "uart@0", "uart@1", "uart@1",
Packit Service 706eca
};
Packit Service 706eca
Packit Service 706eca
/* XXX: Need to figure out how to handle portmuxed DMA channels.  */
Packit Service 706eca
static const struct hw_port_descriptor bfin_dmac_51x_ports[] =
Packit Service 706eca
{
Packit Service 706eca
  { "ppi@0",       0, 0, input_port, },
Packit Service 706eca
  { "emac_rx",     1, 0, input_port, },
Packit Service 706eca
  { "emac_tx",     2, 0, input_port, },
Packit Service 706eca
  { "sport@0_rx",  3, 0, input_port, },
Packit Service 706eca
  { "sport@0_tx",  4, 0, input_port, },
Packit Service 706eca
/*{ "rsi",         4, 0, input_port, },*/
Packit Service 706eca
  { "sport@1_tx",  5, 0, input_port, },
Packit Service 706eca
/*{ "spi@1",       5, 0, input_port, },*/
Packit Service 706eca
  { "sport@1_rx",  6, 0, input_port, },
Packit Service 706eca
  { "spi@0",       7, 0, input_port, },
Packit Service 706eca
  { "uart@0_rx",   8, 0, input_port, },
Packit Service 706eca
  { "uart@0_tx",   9, 0, input_port, },
Packit Service 706eca
  { "uart@1_rx",  10, 0, input_port, },
Packit Service 706eca
  { "uart@1_tx",  11, 0, input_port, },
Packit Service 706eca
  { NULL, 0, 0, 0, },
Packit Service 706eca
};
Packit Service 706eca
Packit Service 706eca
static const char * const bfin_dmac_52x_pmap[] =
Packit Service 706eca
{
Packit Service 706eca
  "ppi@0", "emac", "emac", "sport@0", "sport@0", "sport@1",
Packit Service 706eca
  "sport@1", "spi", "uart@0", "uart@0", "uart@1", "uart@1",
Packit Service 706eca
};
Packit Service 706eca
Packit Service 706eca
/* XXX: Need to figure out how to handle portmuxed DMA channels
Packit Service 706eca
        like PPI/NFC here which share DMA0.  */
Packit Service 706eca
static const struct hw_port_descriptor bfin_dmac_52x_ports[] =
Packit Service 706eca
{
Packit Service 706eca
  { "ppi@0",       0, 0, input_port, },
Packit Service 706eca
/*{ "nfc",         0, 0, input_port, },*/
Packit Service 706eca
  { "emac_rx",     1, 0, input_port, },
Packit Service 706eca
/*{ "hostdp",      1, 0, input_port, },*/
Packit Service 706eca
  { "emac_tx",     2, 0, input_port, },
Packit Service 706eca
/*{ "nfc",         2, 0, input_port, },*/
Packit Service 706eca
  { "sport@0_tx",  3, 0, input_port, },
Packit Service 706eca
  { "sport@0_rx",  4, 0, input_port, },
Packit Service 706eca
  { "sport@1_tx",  5, 0, input_port, },
Packit Service 706eca
  { "sport@1_rx",  6, 0, input_port, },
Packit Service 706eca
  { "spi",         7, 0, input_port, },
Packit Service 706eca
  { "uart@0_tx",   8, 0, input_port, },
Packit Service 706eca
  { "uart@0_rx",   9, 0, input_port, },
Packit Service 706eca
  { "uart@1_tx",  10, 0, input_port, },
Packit Service 706eca
  { "uart@1_rx",  11, 0, input_port, },
Packit Service 706eca
  { NULL, 0, 0, 0, },
Packit Service 706eca
};
Packit Service 706eca
Packit Service 706eca
static const char * const bfin_dmac_533_pmap[] =
Packit Service 706eca
{
Packit Service 706eca
  "ppi@0", "sport@0", "sport@0", "sport@1", "sport@1", "spi",
Packit Service 706eca
  "uart@0", "uart@0",
Packit Service 706eca
};
Packit Service 706eca
Packit Service 706eca
static const struct hw_port_descriptor bfin_dmac_533_ports[] =
Packit Service 706eca
{
Packit Service 706eca
  { "ppi@0",       0, 0, input_port, },
Packit Service 706eca
  { "sport@0_tx",  1, 0, input_port, },
Packit Service 706eca
  { "sport@0_rx",  2, 0, input_port, },
Packit Service 706eca
  { "sport@1_tx",  3, 0, input_port, },
Packit Service 706eca
  { "sport@1_rx",  4, 0, input_port, },
Packit Service 706eca
  { "spi",         5, 0, input_port, },
Packit Service 706eca
  { "uart@0_tx",   6, 0, input_port, },
Packit Service 706eca
  { "uart@0_rx",   7, 0, input_port, },
Packit Service 706eca
  { NULL, 0, 0, 0, },
Packit Service 706eca
};
Packit Service 706eca
Packit Service 706eca
static const char * const bfin_dmac_537_pmap[] =
Packit Service 706eca
{
Packit Service 706eca
  "ppi@0", "emac", "emac", "sport@0", "sport@0", "sport@1",
Packit Service 706eca
  "sport@1", "spi", "uart@0", "uart@0", "uart@1", "uart@1",
Packit Service 706eca
};
Packit Service 706eca
Packit Service 706eca
static const struct hw_port_descriptor bfin_dmac_537_ports[] =
Packit Service 706eca
{
Packit Service 706eca
  { "ppi@0",       0, 0, input_port, },
Packit Service 706eca
  { "emac_rx",     1, 0, input_port, },
Packit Service 706eca
  { "emac_tx",     2, 0, input_port, },
Packit Service 706eca
  { "sport@0_tx",  3, 0, input_port, },
Packit Service 706eca
  { "sport@0_rx",  4, 0, input_port, },
Packit Service 706eca
  { "sport@1_tx",  5, 0, input_port, },
Packit Service 706eca
  { "sport@1_rx",  6, 0, input_port, },
Packit Service 706eca
  { "spi",         7, 0, input_port, },
Packit Service 706eca
  { "uart@0_tx",   8, 0, input_port, },
Packit Service 706eca
  { "uart@0_rx",   9, 0, input_port, },
Packit Service 706eca
  { "uart@1_tx",  10, 0, input_port, },
Packit Service 706eca
  { "uart@1_rx",  11, 0, input_port, },
Packit Service 706eca
  { NULL, 0, 0, 0, },
Packit Service 706eca
};
Packit Service 706eca
Packit Service 706eca
static const char * const bfin_dmac0_538_pmap[] =
Packit Service 706eca
{
Packit Service 706eca
  "ppi@0", "sport@0", "sport@0", "sport@1", "sport@1", "spi@0",
Packit Service 706eca
  "uart@0", "uart@0",
Packit Service 706eca
};
Packit Service 706eca
Packit Service 706eca
static const struct hw_port_descriptor bfin_dmac0_538_ports[] =
Packit Service 706eca
{
Packit Service 706eca
  { "ppi@0",       0, 0, input_port, },
Packit Service 706eca
  { "sport@0_rx",  1, 0, input_port, },
Packit Service 706eca
  { "sport@0_tx",  2, 0, input_port, },
Packit Service 706eca
  { "sport@1_rx",  3, 0, input_port, },
Packit Service 706eca
  { "sport@1_tx",  4, 0, input_port, },
Packit Service 706eca
  { "spi@0",       5, 0, input_port, },
Packit Service 706eca
  { "uart@0_rx",   6, 0, input_port, },
Packit Service 706eca
  { "uart@0_tx",   7, 0, input_port, },
Packit Service 706eca
  { NULL, 0, 0, 0, },
Packit Service 706eca
};
Packit Service 706eca
Packit Service 706eca
static const char * const bfin_dmac1_538_pmap[] =
Packit Service 706eca
{
Packit Service 706eca
  "sport@2", "sport@2", "sport@3", "sport@3", NULL, NULL,
Packit Service 706eca
  "spi@1", "spi@2", "uart@1", "uart@1", "uart@2", "uart@2",
Packit Service 706eca
};
Packit Service 706eca
Packit Service 706eca
static const struct hw_port_descriptor bfin_dmac1_538_ports[] =
Packit Service 706eca
{
Packit Service 706eca
  { "sport@2_rx",  0, 0, input_port, },
Packit Service 706eca
  { "sport@2_tx",  1, 0, input_port, },
Packit Service 706eca
  { "sport@3_rx",  2, 0, input_port, },
Packit Service 706eca
  { "sport@3_tx",  3, 0, input_port, },
Packit Service 706eca
  { "spi@1",       6, 0, input_port, },
Packit Service 706eca
  { "spi@2",       7, 0, input_port, },
Packit Service 706eca
  { "uart@1_rx",   8, 0, input_port, },
Packit Service 706eca
  { "uart@1_tx",   9, 0, input_port, },
Packit Service 706eca
  { "uart@2_rx",  10, 0, input_port, },
Packit Service 706eca
  { "uart@2_tx",  11, 0, input_port, },
Packit Service 706eca
  { NULL, 0, 0, 0, },
Packit Service 706eca
};
Packit Service 706eca
Packit Service 706eca
static const char * const bfin_dmac0_54x_pmap[] =
Packit Service 706eca
{
Packit Service 706eca
  "sport@0", "sport@0", "sport@1", "sport@1", "spi@0", "spi@1",
Packit Service 706eca
  "uart2@0", "uart2@0", "uart2@1", "uart2@1", "atapi", "atapi",
Packit Service 706eca
};
Packit Service 706eca
Packit Service 706eca
static const struct hw_port_descriptor bfin_dmac0_54x_ports[] =
Packit Service 706eca
{
Packit Service 706eca
  { "sport@0_rx",  0, 0, input_port, },
Packit Service 706eca
  { "sport@0_tx",  1, 0, input_port, },
Packit Service 706eca
  { "sport@1_rx",  2, 0, input_port, },
Packit Service 706eca
  { "sport@1_tx",  3, 0, input_port, },
Packit Service 706eca
  { "spi@0",       4, 0, input_port, },
Packit Service 706eca
  { "spi@1",       5, 0, input_port, },
Packit Service 706eca
  { "uart2@0_rx",  6, 0, input_port, },
Packit Service 706eca
  { "uart2@0_tx",  7, 0, input_port, },
Packit Service 706eca
  { "uart2@1_rx",  8, 0, input_port, },
Packit Service 706eca
  { "uart2@1_tx",  9, 0, input_port, },
Packit Service 706eca
  { "atapi",      10, 0, input_port, },
Packit Service 706eca
  { "atapi",      11, 0, input_port, },
Packit Service 706eca
  { NULL, 0, 0, 0, },
Packit Service 706eca
};
Packit Service 706eca
Packit Service 706eca
static const char * const bfin_dmac1_54x_pmap[] =
Packit Service 706eca
{
Packit Service 706eca
  "eppi@0", "eppi@1", "eppi@2", "pixc", "pixc", "pixc",
Packit Service 706eca
  "sport@2", "sport@2", "sport@3", "sport@3", "sdh",
Packit Service 706eca
  "spi@2", "uart2@2", "uart2@2", "uart2@3", "uart2@3",
Packit Service 706eca
};
Packit Service 706eca
Packit Service 706eca
static const struct hw_port_descriptor bfin_dmac1_54x_ports[] =
Packit Service 706eca
{
Packit Service 706eca
  { "eppi@0",      0, 0, input_port, },
Packit Service 706eca
  { "eppi@1",      1, 0, input_port, },
Packit Service 706eca
  { "eppi@2",      2, 0, input_port, },
Packit Service 706eca
  { "pixc",        3, 0, input_port, },
Packit Service 706eca
  { "pixc",        4, 0, input_port, },
Packit Service 706eca
  { "pixc",        5, 0, input_port, },
Packit Service 706eca
  { "sport@2_rx",  6, 0, input_port, },
Packit Service 706eca
  { "sport@2_tx",  7, 0, input_port, },
Packit Service 706eca
  { "sport@3_rx",  8, 0, input_port, },
Packit Service 706eca
  { "sport@3_tx",  9, 0, input_port, },
Packit Service 706eca
  { "sdh",        10, 0, input_port, },
Packit Service 706eca
/*{ "nfc",        10, 0, input_port, },*/
Packit Service 706eca
  { "spi@2",      11, 0, input_port, },
Packit Service 706eca
  { "uart2@2_rx", 12, 0, input_port, },
Packit Service 706eca
  { "uart2@2_tx", 13, 0, input_port, },
Packit Service 706eca
  { "uart2@3_rx", 14, 0, input_port, },
Packit Service 706eca
  { "uart2@3_tx", 15, 0, input_port, },
Packit Service 706eca
  { NULL, 0, 0, 0, },
Packit Service 706eca
};
Packit Service 706eca
Packit Service 706eca
static const char * const bfin_dmac0_561_pmap[] =
Packit Service 706eca
{
Packit Service 706eca
  "sport@0", "sport@0", "sport@1", "sport@1", "spi", "uart@0", "uart@0",
Packit Service 706eca
};
Packit Service 706eca
Packit Service 706eca
static const struct hw_port_descriptor bfin_dmac0_561_ports[] =
Packit Service 706eca
{
Packit Service 706eca
  { "sport@0_rx",  0, 0, input_port, },
Packit Service 706eca
  { "sport@0_tx",  1, 0, input_port, },
Packit Service 706eca
  { "sport@1_rx",  2, 0, input_port, },
Packit Service 706eca
  { "sport@1_tx",  3, 0, input_port, },
Packit Service 706eca
  { "spi@0",       4, 0, input_port, },
Packit Service 706eca
  { "uart@0_rx",   5, 0, input_port, },
Packit Service 706eca
  { "uart@0_tx",   6, 0, input_port, },
Packit Service 706eca
  { NULL, 0, 0, 0, },
Packit Service 706eca
};
Packit Service 706eca
Packit Service 706eca
static const char * const bfin_dmac1_561_pmap[] =
Packit Service 706eca
{
Packit Service 706eca
  "ppi@0", "ppi@1",
Packit Service 706eca
};
Packit Service 706eca
Packit Service 706eca
static const struct hw_port_descriptor bfin_dmac1_561_ports[] =
Packit Service 706eca
{
Packit Service 706eca
  { "ppi@0",       0, 0, input_port, },
Packit Service 706eca
  { "ppi@1",       1, 0, input_port, },
Packit Service 706eca
  { NULL, 0, 0, 0, },
Packit Service 706eca
};
Packit Service 706eca
Packit Service 706eca
static const char * const bfin_dmac_59x_pmap[] =
Packit Service 706eca
{
Packit Service 706eca
  "ppi@0", "sport@0", "sport@0", "sport@1", "sport@1", "spi@0",
Packit Service 706eca
  "spi@1", "uart@0", "uart@0",
Packit Service 706eca
};
Packit Service 706eca
Packit Service 706eca
static const struct hw_port_descriptor bfin_dmac_59x_ports[] =
Packit Service 706eca
{
Packit Service 706eca
  { "ppi@0",       0, 0, input_port, },
Packit Service 706eca
  { "sport@0_tx",  1, 0, input_port, },
Packit Service 706eca
  { "sport@0_rx",  2, 0, input_port, },
Packit Service 706eca
  { "sport@1_tx",  3, 0, input_port, },
Packit Service 706eca
  { "sport@1_rx",  4, 0, input_port, },
Packit Service 706eca
  { "spi@0",       5, 0, input_port, },
Packit Service 706eca
  { "spi@1",       6, 0, input_port, },
Packit Service 706eca
  { "uart@0_rx",   7, 0, input_port, },
Packit Service 706eca
  { "uart@0_tx",   8, 0, input_port, },
Packit Service 706eca
  { NULL, 0, 0, 0, },
Packit Service 706eca
};
Packit Service 706eca
Packit Service 706eca
static void
Packit Service 706eca
bfin_dmac_port_event (struct hw *me, int my_port, struct hw *source,
Packit Service 706eca
		      int source_port, int level)
Packit Service 706eca
{
Packit Service 706eca
  SIM_DESC sd = hw_system (me);
Packit Service 706eca
  struct bfin_dmac *dmac = hw_data (me);
Packit Service 706eca
  struct hw *dma = hw_child (me);
Packit Service 706eca
Packit Service 706eca
  while (dma)
Packit Service 706eca
    {
Packit Service 706eca
      bu16 pmap;
Packit Service 706eca
      sim_hw_io_read_buffer (sd, dma, &pmap, 0, 0x2c, sizeof (pmap));
Packit Service 706eca
      pmap >>= 12;
Packit Service 706eca
      if (pmap == my_port)
Packit Service 706eca
	break;
Packit Service 706eca
      dma = hw_sibling (dma);
Packit Service 706eca
    }
Packit Service 706eca
Packit Service 706eca
  if (!dma)
Packit Service 706eca
    hw_abort (me, "no valid dma mapping found for %s", dmac->pmap[my_port]);
Packit Service 706eca
Packit Service 706eca
  /* Have the DMA channel raise its interrupt to the SIC.  */
Packit Service 706eca
  hw_port_event (dma, 0, 1);
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
static void
Packit Service 706eca
bfin_dmac_finish (struct hw *me)
Packit Service 706eca
{
Packit Service 706eca
  struct bfin_dmac *dmac;
Packit Service 706eca
  unsigned int dmac_num = dv_get_bus_num (me);
Packit Service 706eca
Packit Service 706eca
  dmac = HW_ZALLOC (me, struct bfin_dmac);
Packit Service 706eca
Packit Service 706eca
  set_hw_data (me, dmac);
Packit Service 706eca
  set_hw_port_event (me, bfin_dmac_port_event);
Packit Service 706eca
Packit Service 706eca
  /* Initialize the DMA Controller.  */
Packit Service 706eca
  if (hw_find_property (me, "type") == NULL)
Packit Service 706eca
    hw_abort (me, "Missing \"type\" property");
Packit Service 706eca
Packit Service 706eca
  switch (hw_find_integer_property (me, "type"))
Packit Service 706eca
    {
Packit Service 706eca
    case 500 ... 509:
Packit Service 706eca
      if (dmac_num != 0)
Packit Service 706eca
	hw_abort (me, "this Blackfin only has a DMAC0");
Packit Service 706eca
      dmac->pmap = bfin_dmac_50x_pmap;
Packit Service 706eca
      dmac->pmap_count = ARRAY_SIZE (bfin_dmac_50x_pmap);
Packit Service 706eca
      set_hw_ports (me, bfin_dmac_50x_ports);
Packit Service 706eca
      break;
Packit Service 706eca
    case 510 ... 519:
Packit Service 706eca
      if (dmac_num != 0)
Packit Service 706eca
	hw_abort (me, "this Blackfin only has a DMAC0");
Packit Service 706eca
      dmac->pmap = bfin_dmac_51x_pmap;
Packit Service 706eca
      dmac->pmap_count = ARRAY_SIZE (bfin_dmac_51x_pmap);
Packit Service 706eca
      set_hw_ports (me, bfin_dmac_51x_ports);
Packit Service 706eca
      break;
Packit Service 706eca
    case 522 ... 527:
Packit Service 706eca
      if (dmac_num != 0)
Packit Service 706eca
	hw_abort (me, "this Blackfin only has a DMAC0");
Packit Service 706eca
      dmac->pmap = bfin_dmac_52x_pmap;
Packit Service 706eca
      dmac->pmap_count = ARRAY_SIZE (bfin_dmac_52x_pmap);
Packit Service 706eca
      set_hw_ports (me, bfin_dmac_52x_ports);
Packit Service 706eca
      break;
Packit Service 706eca
    case 531 ... 533:
Packit Service 706eca
      if (dmac_num != 0)
Packit Service 706eca
	hw_abort (me, "this Blackfin only has a DMAC0");
Packit Service 706eca
      dmac->pmap = bfin_dmac_533_pmap;
Packit Service 706eca
      dmac->pmap_count = ARRAY_SIZE (bfin_dmac_533_pmap);
Packit Service 706eca
      set_hw_ports (me, bfin_dmac_533_ports);
Packit Service 706eca
      break;
Packit Service 706eca
    case 534:
Packit Service 706eca
    case 536:
Packit Service 706eca
    case 537:
Packit Service 706eca
      if (dmac_num != 0)
Packit Service 706eca
	hw_abort (me, "this Blackfin only has a DMAC0");
Packit Service 706eca
      dmac->pmap = bfin_dmac_537_pmap;
Packit Service 706eca
      dmac->pmap_count = ARRAY_SIZE (bfin_dmac_537_pmap);
Packit Service 706eca
      set_hw_ports (me, bfin_dmac_537_ports);
Packit Service 706eca
      break;
Packit Service 706eca
    case 538 ... 539:
Packit Service 706eca
      switch (dmac_num)
Packit Service 706eca
	{
Packit Service 706eca
	case 0:
Packit Service 706eca
	  dmac->pmap = bfin_dmac0_538_pmap;
Packit Service 706eca
	  dmac->pmap_count = ARRAY_SIZE (bfin_dmac0_538_pmap);
Packit Service 706eca
	  set_hw_ports (me, bfin_dmac0_538_ports);
Packit Service 706eca
	  break;
Packit Service 706eca
	case 1:
Packit Service 706eca
	  dmac->pmap = bfin_dmac1_538_pmap;
Packit Service 706eca
	  dmac->pmap_count = ARRAY_SIZE (bfin_dmac1_538_pmap);
Packit Service 706eca
	  set_hw_ports (me, bfin_dmac1_538_ports);
Packit Service 706eca
	  break;
Packit Service 706eca
	default:
Packit Service 706eca
	  hw_abort (me, "this Blackfin only has a DMAC0 & DMAC1");
Packit Service 706eca
	}
Packit Service 706eca
      break;
Packit Service 706eca
    case 540 ... 549:
Packit Service 706eca
      switch (dmac_num)
Packit Service 706eca
	{
Packit Service 706eca
	case 0:
Packit Service 706eca
	  dmac->pmap = bfin_dmac0_54x_pmap;
Packit Service 706eca
	  dmac->pmap_count = ARRAY_SIZE (bfin_dmac0_54x_pmap);
Packit Service 706eca
	  set_hw_ports (me, bfin_dmac0_54x_ports);
Packit Service 706eca
	  break;
Packit Service 706eca
	case 1:
Packit Service 706eca
	  dmac->pmap = bfin_dmac1_54x_pmap;
Packit Service 706eca
	  dmac->pmap_count = ARRAY_SIZE (bfin_dmac1_54x_pmap);
Packit Service 706eca
	  set_hw_ports (me, bfin_dmac1_54x_ports);
Packit Service 706eca
	  break;
Packit Service 706eca
	default:
Packit Service 706eca
	  hw_abort (me, "this Blackfin only has a DMAC0 & DMAC1");
Packit Service 706eca
	}
Packit Service 706eca
      break;
Packit Service 706eca
    case 561:
Packit Service 706eca
      switch (dmac_num)
Packit Service 706eca
	{
Packit Service 706eca
	case 0:
Packit Service 706eca
	  dmac->pmap = bfin_dmac0_561_pmap;
Packit Service 706eca
	  dmac->pmap_count = ARRAY_SIZE (bfin_dmac0_561_pmap);
Packit Service 706eca
	  set_hw_ports (me, bfin_dmac0_561_ports);
Packit Service 706eca
	  break;
Packit Service 706eca
	case 1:
Packit Service 706eca
	  dmac->pmap = bfin_dmac1_561_pmap;
Packit Service 706eca
	  dmac->pmap_count = ARRAY_SIZE (bfin_dmac1_561_pmap);
Packit Service 706eca
	  set_hw_ports (me, bfin_dmac1_561_ports);
Packit Service 706eca
	  break;
Packit Service 706eca
	default:
Packit Service 706eca
	  hw_abort (me, "this Blackfin only has a DMAC0 & DMAC1");
Packit Service 706eca
	}
Packit Service 706eca
      break;
Packit Service 706eca
    case 590 ... 599:
Packit Service 706eca
      if (dmac_num != 0)
Packit Service 706eca
	hw_abort (me, "this Blackfin only has a DMAC0");
Packit Service 706eca
      dmac->pmap = bfin_dmac_59x_pmap;
Packit Service 706eca
      dmac->pmap_count = ARRAY_SIZE (bfin_dmac_59x_pmap);
Packit Service 706eca
      set_hw_ports (me, bfin_dmac_59x_ports);
Packit Service 706eca
      break;
Packit Service 706eca
    default:
Packit Service 706eca
      hw_abort (me, "no support for DMAC on this Blackfin model yet");
Packit Service 706eca
    }
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
const struct hw_descriptor dv_bfin_dmac_descriptor[] =
Packit Service 706eca
{
Packit Service 706eca
  {"bfin_dmac", bfin_dmac_finish,},
Packit Service 706eca
  {NULL, NULL},
Packit Service 706eca
};