summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/sparc/shared/drvmgr/ambapp_bus.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/sparc/shared/drvmgr/ambapp_bus.c')
-rw-r--r--c/src/lib/libbsp/sparc/shared/drvmgr/ambapp_bus.c840
1 files changed, 0 insertions, 840 deletions
diff --git a/c/src/lib/libbsp/sparc/shared/drvmgr/ambapp_bus.c b/c/src/lib/libbsp/sparc/shared/drvmgr/ambapp_bus.c
deleted file mode 100644
index 3787660a15..0000000000
--- a/c/src/lib/libbsp/sparc/shared/drvmgr/ambapp_bus.c
+++ /dev/null
@@ -1,840 +0,0 @@
-/* General part of a AMBA Plug & Play bus driver.
- *
- * COPYRIGHT (c) 2008.
- * Cobham Gaisler AB.
- *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rtems.org/license/LICENSE.
- *
- * This is the general part of the different AMBA Plug & Play
- * drivers. The drivers are wrappers around this driver, making
- * the code size smaller for systems with multiple AMBA Plug &
- * Play buses.
- *
- * The BSP define APBUART_INFO_AVAIL in order to add the info routine
- * used for debugging.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <drvmgr/drvmgr.h>
-#include <drvmgr/ambapp_bus.h>
-
-#include <bsp.h>
-#include <ambapp.h>
-#include <rtems/bspIo.h>
-
-/*#define DEBUG 1*/
-#define DBG(args...)
-/*#define DBG(args...) printk(args)*/
-
-struct grlib_gptimer_regs {
- volatile unsigned int scaler_value; /* common timer registers */
- volatile unsigned int scaler_reload;
- volatile unsigned int status;
- volatile unsigned int notused;
-};
-
-/* AMBA IMPLEMENTATION */
-
-static int ambapp_bus_init1(struct drvmgr_bus *bus);
-static int ambapp_bus_remove(struct drvmgr_bus *bus);
-static int ambapp_unite(struct drvmgr_drv *drv, struct drvmgr_dev *dev);
-static int ambapp_int_register(
- struct drvmgr_dev *dev,
- int index,
- const char *info,
- drvmgr_isr isr,
- void *arg);
-static int ambapp_int_unregister(
- struct drvmgr_dev *dev,
- int index,
- drvmgr_isr isr,
- void *arg);
-static int ambapp_int_clear(struct drvmgr_dev *dev, int index);
-static int ambapp_int_mask(struct drvmgr_dev *dev, int index);
-static int ambapp_int_unmask(struct drvmgr_dev *dev, int index);
-static int ambapp_get_params(
- struct drvmgr_dev *dev,
- struct drvmgr_bus_params *params);
-static int ambapp_bus_freq_get(
- struct drvmgr_dev *dev,
- int options,
- unsigned int *freq_hz);
-#ifdef AMBAPPBUS_INFO_AVAIL
-static void ambapp_dev_info(
- struct drvmgr_dev *,
- void (*print)(void *p, char *str),
- void *p);
-#endif
-
-#ifdef RTEMS_SMP
-static int ambapp_int_set_affinity(
- struct drvmgr_dev *dev,
- int index,
- const Processor_mask *cpus);
-#endif
-
-static struct drvmgr_bus_ops ambapp_bus_ops =
-{
- .init =
- {
- /* init1 */ ambapp_bus_init1,
- /* init2 */ NULL,
- /* init3 */ NULL,
- /* init4 */ NULL
- },
- .remove = ambapp_bus_remove,
- .unite = ambapp_unite,
- .int_register = ambapp_int_register,
- .int_unregister = ambapp_int_unregister,
- .int_clear = ambapp_int_clear,
- .int_mask = ambapp_int_mask,
-#ifdef RTEMS_SMP
- .int_set_affinity = ambapp_int_set_affinity,
-#endif
- .int_unmask = ambapp_int_unmask,
- .get_params = ambapp_get_params,
- .get_freq = ambapp_bus_freq_get,
-#ifdef AMBAPPBUS_INFO_AVAIL
- .get_info_dev = ambapp_dev_info,
-#endif
-};
-
-struct ambapp_priv {
- struct ambapp_config *config;
-};
-
-static int ambapp_unite(struct drvmgr_drv *drv, struct drvmgr_dev *dev)
-{
- struct amba_drv_info *adrv;
- struct amba_dev_id *id;
- struct amba_dev_info *amba;
-
- if ( !drv || !dev || !dev->parent )
- return 0;
-
- if ( ! (((drv->bus_type == DRVMGR_BUS_TYPE_AMBAPP) && (dev->parent->bus_type == DRVMGR_BUS_TYPE_AMBAPP)) ||
- ((drv->bus_type == DRVMGR_BUS_TYPE_AMBAPP_RMAP) && (dev->parent->bus_type == DRVMGR_BUS_TYPE_AMBAPP_RMAP)) ||
- ((drv->bus_type == DRVMGR_BUS_TYPE_AMBAPP_DIST) && (dev->parent->bus_type == DRVMGR_BUS_TYPE_AMBAPP_DIST)))
- ) {
- return 0;
- }
-
- amba = (struct amba_dev_info *)dev->businfo;
- if ( !amba )
- return 0;
-
- adrv = (struct amba_drv_info *)drv;
- id = adrv->ids;
- if ( !id )
- return 0;
- while( id->vendor != 0 ) {
- if ( (id->vendor == amba->id.vendor) &&
- (id->device == amba->id.device) ) {
- /* Unite device and driver */
- DBG("DRV 0x%x and DEV 0x%x united\n", (unsigned int)drv, (unsigned int)dev);
- return 1;
- }
- id++;
- }
-
- return 0;
-}
-
-static int ambapp_int_get(struct drvmgr_dev *dev, int index)
-{
- int irq;
-
- /* Relative (positive) or absolute (negative) IRQ number */
- if ( index >= 0 ) {
- /* IRQ Index relative to Cores base IRQ */
-
- /* Get Base IRQ */
- irq = ((struct amba_dev_info *)dev->businfo)->info.irq;
- if ( irq < 0 )
- return -1;
- irq += index;
- } else {
- /* Absolute IRQ number */
- irq = -index;
- }
- return irq;
-}
-
-static int ambapp_int_register(
- struct drvmgr_dev *dev,
- int index,
- const char *info,
- drvmgr_isr isr,
- void *arg)
-{
- struct ambapp_priv *priv;
- int irq;
-
- priv = dev->parent->priv;
-
- /* Get IRQ number from index and device information */
- irq = ambapp_int_get(dev, index);
- if ( irq < 0 )
- return DRVMGR_EINVAL;
-
- DBG("Register interrupt on 0x%x for dev 0x%x (IRQ: %d)\n",
- (unsigned int)dev->parent->dev, (unsigned int)dev, irq);
-
- if ( priv->config->ops->int_register ) {
- /* Let device override driver default */
- return priv->config->ops->int_register(dev, irq, info, isr, arg);
- } else {
- return DRVMGR_ENOSYS;
- }
-}
-
-static int ambapp_int_unregister(
- struct drvmgr_dev *dev,
- int index,
- drvmgr_isr isr,
- void *arg)
-{
- struct ambapp_priv *priv;
- int irq;
-
- priv = dev->parent->priv;
-
- /* Get IRQ number from index and device information */
- irq = ambapp_int_get(dev, index);
- if ( irq < 0 )
- return DRVMGR_EINVAL;
-
- DBG("Unregister interrupt on 0x%x for dev 0x%x (IRQ: %d)\n",
- (unsigned int)dev->parent->dev, (unsigned int)dev, irq);
-
- if ( priv->config->ops->int_unregister ) {
- /* Let device override driver default */
- return priv->config->ops->int_unregister(dev, irq, isr, arg);
- } else {
- return DRVMGR_ENOSYS;
- }
-}
-
-static int ambapp_int_clear(
- struct drvmgr_dev *dev,
- int index)
-{
- struct ambapp_priv *priv;
- int irq;
-
- priv = dev->parent->priv;
-
- /* Get IRQ number from index and device information */
- irq = ambapp_int_get(dev, index);
- if ( irq < 0 )
- return -1;
-
- DBG("Clear interrupt on 0x%x for dev 0x%x (IRQ: %d)\n",
- (unsigned int)dev->parent->dev, (unsigned int)dev, irq);
-
- if ( priv->config->ops->int_clear ) {
- /* Let device override driver default */
- return priv->config->ops->int_clear(dev, irq);
- } else {
- return DRVMGR_ENOSYS;
- }
-}
-
-static int ambapp_int_mask(
- struct drvmgr_dev *dev,
- int index)
-{
- struct ambapp_priv *priv;
- int irq;
-
- priv = dev->parent->priv;
-
- /* Get IRQ number from index and device information */
- irq = ambapp_int_get(dev, index);
- if ( irq < 0 )
- return -1;
-
- DBG("MASK interrupt on 0x%x for dev 0x%x (IRQ: %d)\n",
- (unsigned int)dev->parent->dev, (unsigned int)dev, irq);
-
- if ( priv->config->ops->int_mask ) {
- /* Let device override driver default */
- return priv->config->ops->int_mask(dev, irq);
- } else {
- return DRVMGR_ENOSYS;
- }
-}
-
-static int ambapp_int_unmask(
- struct drvmgr_dev *dev,
- int index)
-{
- struct ambapp_priv *priv;
- int irq;
-
- priv = dev->parent->priv;
-
- /* Get IRQ number from index and device information */
- irq = ambapp_int_get(dev, index);
- if ( irq < 0 )
- return DRVMGR_EINVAL;
-
- DBG("UNMASK interrupt on 0x%x for dev 0x%x (IRQ: %d)\n",
- (unsigned int)dev->parent->dev, (unsigned int)dev, irq);
-
- if ( priv->config->ops->int_unmask ) {
- /* Let device override driver default */
- return priv->config->ops->int_unmask(dev, irq);
- } else {
- return DRVMGR_ENOSYS;
- }
-}
-
-/* Assign frequency to an AMBA Bus */
-void ambapp_bus_freq_register(
- struct drvmgr_dev *dev,
- int amba_interface,
- unsigned int freq_hz
- )
-{
- struct ambapp_priv *priv = (struct ambapp_priv *)dev->parent->priv;
- struct ambapp_dev *adev;
- struct amba_dev_info *pnp = dev->businfo;
-
- if ( freq_hz == 0 )
- return;
-
- if ( amba_interface == DEV_AHB_MST ) {
- adev = (struct ambapp_dev *)
- ((unsigned int)pnp->info.ahb_mst -
- sizeof(struct ambapp_dev));
- } else if ( amba_interface == DEV_AHB_SLV ) {
- adev = (struct ambapp_dev *)
- ((unsigned int)pnp->info.ahb_slv -
- sizeof(struct ambapp_dev));
- } else if ( amba_interface == DEV_APB_SLV ) {
- adev = (struct ambapp_dev *)
- ((unsigned int)pnp->info.apb_slv -
- sizeof(struct ambapp_dev));
- } else {
- return;
- }
-
- /* Calculate Top bus frequency from lower part. The frequency comes
- * from some kind of hardware able to report local bus frequency.
- */
- ambapp_freq_init(priv->config->abus, adev, freq_hz);
-}
-
-static int ambapp_bus_freq_get(
- struct drvmgr_dev *dev,
- int options,
- unsigned int *freq_hz)
-{
- struct ambapp_priv *priv = (struct ambapp_priv *)dev->parent->priv;
- struct ambapp_dev *adev;
- struct amba_dev_info *pnp = dev->businfo;
-
- if ( options == DEV_AHB_MST ) {
- adev = (struct ambapp_dev *)
- ((unsigned int)pnp->info.ahb_mst -
- sizeof(struct ambapp_dev));
- } else if ( options == DEV_AHB_SLV ) {
- adev = (struct ambapp_dev *)
- ((unsigned int)pnp->info.ahb_slv -
- sizeof(struct ambapp_dev));
- } else if ( options == DEV_APB_SLV ) {
- adev = (struct ambapp_dev *)
- ((unsigned int)pnp->info.apb_slv -
- sizeof(struct ambapp_dev));
- } else {
- *freq_hz = 0;
- return -1;
- }
-
- /* Calculate core/bus frequency from top most bus frequency. */
- *freq_hz = ambapp_freq_get(priv->config->abus, adev);
- if ( *freq_hz == 0 )
- return -1;
- return 0;
-}
-
-static int ambapp_get_params(
- struct drvmgr_dev *dev,
- struct drvmgr_bus_params *params)
-{
- struct ambapp_priv *priv = dev->parent->priv;
-
- if ( priv->config->ops->get_params ) {
- /* Let device override driver default */
- return priv->config->ops->get_params(dev, params);
- } else {
- return -1;
- }
-}
-
-#ifdef AMBAPPBUS_INFO_AVAIL
-static void ambapp_dev_info(
- struct drvmgr_dev *dev,
- void (*print_line)(void *p, char *str),
- void *p)
-{
- struct amba_dev_info *devinfo;
- struct ambapp_core *core;
- char buf[64];
- int ver, i;
- char *str1, *str2, *str3;
- unsigned int ahbmst_freq, ahbslv_freq, apbslv_freq;
-
- if (!dev)
- return;
-
- devinfo = (struct amba_dev_info *)dev->businfo;
- if (!devinfo)
- return;
- core = &devinfo->info;
-
- print_line(p, "AMBA PnP DEVICE");
-
- str1 = ambapp_vendor_id2str(devinfo->id.vendor);
- if (str1 == NULL)
- str1 = "unknown";
- sprintf(buf, "VENDOR ID: 0x%04x (%s)", devinfo->id.vendor, str1);
- print_line(p, buf);
-
- str1 = ambapp_device_id2str(devinfo->id.vendor, devinfo->id.device);
- if (str1 == NULL)
- str1 = "unknown";
- sprintf(buf, "DEVICE ID: 0x%04x (%s)", devinfo->id.device, str1);
- print_line(p, buf);
-
- ahbmst_freq = ahbslv_freq = apbslv_freq = 0;
- ver = 0;
- str1 = str2 = str3 = "";
- if (core->ahb_mst) {
- str1 = "AHBMST ";
- ver = core->ahb_mst->ver;
- ambapp_bus_freq_get(dev, DEV_AHB_MST, &ahbmst_freq);
- }
- if (core->ahb_slv) {
- str2 = "AHBSLV ";
- ver = core->ahb_slv->ver;
- ambapp_bus_freq_get(dev, DEV_AHB_SLV, &ahbslv_freq);
- }
- if (core->apb_slv) {
- str3 = "APBSLV";
- ver = core->apb_slv->ver;
- ambapp_bus_freq_get(dev, DEV_APB_SLV, &apbslv_freq);
- }
-
- sprintf(buf, "IRQ: %d", ambapp_int_get(dev, 0));
- print_line(p, buf);
-
- sprintf(buf, "VERSION: 0x%x", ver);
- print_line(p, buf);
-
- sprintf(buf, "ambapp_core: %p", core);
- print_line(p, buf);
-
- sprintf(buf, "interfaces: %s%s%s", str1, str2, str3);
- print_line(p, buf);
-
- if (ahbmst_freq != 0) {
- sprintf(buf, "AHBMST FREQ: %dkHz", ahbmst_freq/1000);
- print_line(p, buf);
- }
-
- if (ahbslv_freq != 0) {
- sprintf(buf, "AHBSLV FREQ: %dkHz", ahbslv_freq/1000);
- print_line(p, buf);
- }
-
- if (apbslv_freq != 0) {
- sprintf(buf, "APBSLV FREQ: %dkHz", apbslv_freq/1000);
- print_line(p, buf);
- }
-
- if (core->ahb_slv) {
- for(i=0; i<4; i++) {
- if (core->ahb_slv->type[i] == AMBA_TYPE_AHBIO)
- str1 = " ahbio";
- else if (core->ahb_slv->type[i] == AMBA_TYPE_MEM)
- str1 = "ahbmem";
- else
- continue;
- sprintf(buf, " %s[%d]: 0x%08x-0x%08x", str1, i,
- core->ahb_slv->start[i],
- core->ahb_slv->start[i]+core->ahb_slv->mask[i]-1);
- print_line(p, buf);
- }
- }
- if (core->apb_slv) {
- sprintf(buf, " apb: 0x%08x-0x%08x",
- core->apb_slv->start,
- core->apb_slv->start + core->apb_slv->mask - 1);
- print_line(p, buf);
- }
-}
-#endif
-
-/* Fix device in last stage and/or register additional devices.
- * Function returns:
- * 0 Register device as normal
- * 1 Fixup function handles registration
- */
-static int ambapp_dev_fixup(struct drvmgr_dev *dev, struct amba_dev_info *pnp)
-{
- /* OCCAN speciality:
- * Mulitple cores are supported through the same amba AHB interface.
- * The number of "sub cores" can be detected by decoding the AMBA
- * Plug&Play version information. verion = ncores. A maximum of 8
- * sub cores are supported, each separeated with 0x100 inbetween.
- *
- * Now, lets detect sub cores.
- */
- if ( (pnp->info.device == GAISLER_CANAHB) &&
- (pnp->info.vendor == VENDOR_GAISLER) ) {
- struct drvmgr_dev *newdev, *devs_to_register[8];
- struct amba_dev_info *pnpinfo;
- int subcores;
- int core;
-
- devs_to_register[0] = dev;
- subcores = (pnp->info.ahb_slv->ver & 0x7) + 1;
- for(core = 1; core < subcores; core++) {
- drvmgr_alloc_dev(&newdev, sizeof(*pnpinfo));
- memcpy(newdev, dev, sizeof(*newdev));
- pnpinfo = (struct amba_dev_info *)(newdev+1);
- memcpy(pnpinfo, pnp, sizeof(*pnp));
- pnpinfo->info.index = core;
- pnpinfo->info.irq += core;
- newdev->businfo = (void *)pnpinfo;
-
- devs_to_register[core] = newdev;
- }
- /* Register all CAN devices */
- for(core = 0; core < subcores; core++)
- drvmgr_dev_register(devs_to_register[core]);
- return 1;
- } else if ( (pnp->info.device == GAISLER_GPIO) &&
- (pnp->info.vendor == VENDOR_GAISLER) ) {
- /* PIO[N] is connected to IRQ[N]. */
- pnp->info.irq = 0;
- }
- return 0;
-}
-
-struct ambapp_dev_reg_struct {
- struct ambapp_bus *abus;
- struct drvmgr_bus *bus;
- struct ambapp_dev *ahb_mst;
- struct ambapp_dev *ahb_slv;
- struct ambapp_dev *apb_slv;
-};
-
-static void ambapp_core_register(
- struct ambapp_dev *ahb_mst,
- struct ambapp_dev *ahb_slv,
- struct ambapp_dev *apb_slv,
- struct ambapp_dev_reg_struct *arg
- )
-{
- struct drvmgr_dev *newdev;
- struct amba_dev_info *pnpinfo;
- unsigned short device;
- unsigned char vendor;
- int namelen;
- char buf[64];
-
- if ( ahb_mst ) {
- device = ahb_mst->device;
- vendor = ahb_mst->vendor;
- }else if ( ahb_slv ) {
- device = ahb_slv->device;
- vendor = ahb_slv->vendor;
- }else if( apb_slv ) {
- device = apb_slv->device;
- vendor = apb_slv->vendor;
- } else {
- DBG("NO DEV!\n");
- return;
- }
-
- DBG("CORE REGISTER DEV [%x:%x] MST: 0x%x, SLV: 0x%x, APB: 0x%x\n", vendor, device, (unsigned int)ahb_mst, (unsigned int)ahb_slv, (unsigned int)apb_slv);
-
- /* Get unique device name from AMBA data base by combining VENDOR and
- * DEVICE short names
- */
- namelen = ambapp_vendev_id2str(vendor, device, buf);
-
- /* Allocate a device */
- drvmgr_alloc_dev(&newdev, sizeof(struct amba_dev_info) + namelen);
- pnpinfo = (struct amba_dev_info *)(newdev + 1);
- newdev->parent = arg->bus; /* Ourselfs */
- newdev->minor_drv = 0;
- newdev->minor_bus = 0;
- newdev->priv = NULL;
- newdev->drv = NULL;
- if (namelen > 0) {
- newdev->name = (char *)(pnpinfo + 1);
- strcpy(newdev->name, buf);
- } else {
- newdev->name = NULL;
- }
- newdev->next_in_drv = NULL;
- newdev->bus = NULL;
-
- /* Init PnP information, Assign Core interfaces with this device */
- pnpinfo->id.vendor = vendor;
- pnpinfo->id.device = device;
- pnpinfo->info.vendor = vendor;
- pnpinfo->info.device = device;
- pnpinfo->info.index = 0;
- if ( ahb_mst ) {
- pnpinfo->info.ahb_mst = (struct ambapp_ahb_info *)
- ahb_mst->devinfo;
- ambapp_alloc_dev(ahb_mst, (void *)newdev);
- if ( pnpinfo->info.ahb_mst->irq )
- pnpinfo->info.irq = pnpinfo->info.ahb_mst->irq;
- }
- if ( ahb_slv ) {
- pnpinfo->info.ahb_slv = (struct ambapp_ahb_info *)
- ahb_slv->devinfo;
- ambapp_alloc_dev(ahb_slv, (void *)newdev);
- if ( pnpinfo->info.ahb_slv->irq )
- pnpinfo->info.irq = pnpinfo->info.ahb_slv->irq;
- }
- if ( apb_slv ) {
- pnpinfo->info.apb_slv = (struct ambapp_apb_info *)
- apb_slv->devinfo;
- ambapp_alloc_dev(apb_slv, (void *)newdev);
- if ( pnpinfo->info.apb_slv->irq )
- pnpinfo->info.irq = pnpinfo->info.apb_slv->irq;
- }
- if ( pnpinfo->info.irq == 0 )
- pnpinfo->info.irq = -1; /* indicate no IRQ */
-
- /* Connect device with PnP information */
- newdev->businfo = (void *)pnpinfo;
-
- if ( ambapp_dev_fixup(newdev, pnpinfo) == 0 )
- drvmgr_dev_register(newdev); /* Register New Device */
-}
-
-/* Fix device registration.
- * Function returns:
- * 0 Register device as normal
- * 1 Fixup function handles registration
- */
-static int ambapp_dev_register_fixup(struct ambapp_dev *dev, struct ambapp_dev_reg_struct *p)
-{
- /* GR740 GRPCI2 speciality:
- * - In the GR740 the APB_SLV is detected before the AHB_SLV
- * which makes the registration incorrect. We deal with it in
- * this function. */
- if ( (dev->dev_type == DEV_APB_SLV) &&
- (dev->device == GAISLER_GRPCI2) &&
- (dev->vendor == VENDOR_GAISLER) &&
- (p->ahb_slv == NULL) ) {
- DBG("GRPCI2 APB_SLV detected before AHB_SLV. Skipping APB_SLV registration.\n");
- return 1;
- }
- return 0;
-}
-
-/* Register one AMBA device */
-static int ambapp_dev_register(struct ambapp_dev *dev, int index, void *arg)
-{
- struct ambapp_dev_reg_struct *p = arg;
-
-#ifdef DEBUG
- char *type;
-
- if ( dev->dev_type == DEV_AHB_MST )
- type = "AHB MST";
- else if ( dev->dev_type == DEV_AHB_SLV )
- type = "AHB SLV";
- else if ( dev->dev_type == DEV_APB_SLV )
- type = "APB SLV";
-
- DBG("Found [%d:%x:%x], %s\n", index, dev->vendor, dev->device, type);
-#endif
-
- /* Fixup for device registration */
- if (ambapp_dev_register_fixup(dev, p)){
- return 0;
- }
-
- if ( dev->dev_type == DEV_AHB_MST ) {
- if ( p->ahb_mst ) {
- /* This should not happen */
- printk("ambapp_dev_register: ahb_mst not NULL!\n");
- exit(1);
- }
-
- /* Remember AHB Master */
- p->ahb_mst = dev;
-
- /* Find AHB Slave and APB slave for this Core */
- ambapp_for_each(p->abus, (OPTIONS_AHB_SLVS|OPTIONS_APB_SLVS|OPTIONS_FREE), dev->vendor, dev->device, ambapp_dev_register, p);
-
- ambapp_core_register(p->ahb_mst, p->ahb_slv, p->apb_slv, p);
- p->ahb_mst = p->ahb_slv = p->apb_slv = NULL;
- return 0;
-
- } else if ( dev->dev_type == DEV_AHB_SLV ) {
- if ( p->ahb_slv ) {
- /* Already got our AHB Slave interface */
- return 0;
- }
-
- /* Remember AHB Slave */
- p->ahb_slv = dev;
-
- if ( p->ahb_mst ) {
- /* Continue searching for APB Slave */
- return 0;
- } else {
- /* Find APB Slave interface for this Core */
- ambapp_for_each(p->abus, (OPTIONS_APB_SLVS|OPTIONS_FREE), dev->vendor, dev->device, ambapp_dev_register, p);
-
- ambapp_core_register(p->ahb_mst, p->ahb_slv, p->apb_slv, p);
- p->ahb_mst = p->ahb_slv = p->apb_slv = NULL;
- return 0;
- }
- } else if ( dev->dev_type == DEV_APB_SLV ) {
- if ( p->apb_slv ) {
- /* This should not happen */
- printk("ambapp_dev_register: apb_slv not NULL!\n");
- exit(1);
- }
- /* Remember APB Slave */
- p->apb_slv = dev;
-
- if ( p->ahb_mst || p->ahb_slv ) {
- /* Stop scanning */
- return 1;
- } else {
- ambapp_core_register(p->ahb_mst, p->ahb_slv, p->apb_slv, p);
- p->ahb_mst = p->ahb_slv = p->apb_slv = NULL;
- return 0;
- }
- }
-
- return 0;
-}
-
-/* Register all AMBA devices available on the AMBAPP bus */
-static int ambapp_ids_register(struct drvmgr_bus *bus)
-{
- struct ambapp_priv *priv = bus->priv;
- struct ambapp_bus *abus;
- struct ambapp_dev_reg_struct arg;
-
- DBG("ambapp_ids_register:\n");
-
- memset(&arg, 0, sizeof(arg));
-
- abus = priv->config->abus;
- arg.abus = abus;
- arg.bus = bus;
-
- /* Combine the AHB MST, AHB SLV and APB SLV interfaces of a core. A core has often more than
- * one interface. A core can not have more than one interface of the same type.
- */
- ambapp_for_each(abus, (OPTIONS_ALL_DEVS|OPTIONS_FREE), -1, -1, ambapp_dev_register, &arg);
-
-#ifdef DEBUG
- ambapp_print(abus->root, 1);
-#endif
-
- return DRVMGR_OK;
-}
-
-/*** DEVICE FUNCTIONS ***/
-
-int ambapp_bus_register(struct drvmgr_dev *dev, struct ambapp_config *config)
-{
- struct ambapp_priv *priv;
-
- if ( !config || !config->ops )
- return DRVMGR_OK;
-
- DBG("AMBAPP BUS: initializing\n");
-
- /* Register BUS */
- drvmgr_alloc_bus(&dev->bus, sizeof(struct ambapp_priv));
- priv = (struct ambapp_priv *)(dev->bus + 1);
- priv->config = config;
- if ( priv->config->bus_type == DRVMGR_BUS_TYPE_AMBAPP_DIST )
- dev->bus->bus_type = DRVMGR_BUS_TYPE_AMBAPP_DIST;
- else if ( priv->config->bus_type == DRVMGR_BUS_TYPE_AMBAPP_RMAP )
- dev->bus->bus_type = DRVMGR_BUS_TYPE_AMBAPP_RMAP;
- else
- dev->bus->bus_type = DRVMGR_BUS_TYPE_AMBAPP;
- dev->bus->next = NULL;
- dev->bus->dev = dev;
- dev->bus->priv = priv;
- dev->bus->children = NULL;
- dev->bus->ops = &ambapp_bus_ops;
- dev->bus->funcs = config->funcs;
- dev->bus->dev_cnt = 0;
- dev->bus->reslist = NULL;
- dev->bus->maps_up = config->maps_up;
- dev->bus->maps_down = config->maps_down;
-
- /* Add resource configuration */
- if ( priv->config->resources )
- drvmgr_bus_res_add(dev->bus, priv->config->resources);
-
- drvmgr_bus_register(dev->bus);
-
- return DRVMGR_OK;
-}
-
-/*** BUS INITIALIZE FUNCTIONS ***/
-
-/* Initialize the bus, register devices on this bus */
-static int ambapp_bus_init1(struct drvmgr_bus *bus)
-{
- /* Initialize the bus, register devices on this bus */
- return ambapp_ids_register(bus);
-}
-
-static int ambapp_bus_remove(struct drvmgr_bus *bus)
-{
- return DRVMGR_OK;
-}
-
-#ifdef RTEMS_SMP
-static int ambapp_int_set_affinity(
- struct drvmgr_dev *dev,
- int index,
- const Processor_mask *cpus)
-{
- struct ambapp_priv *priv;
- int irq;
-
- priv = dev->parent->priv;
-
- /* Get IRQ number from index and device information */
- irq = ambapp_int_get(dev, index);
- if (irq < 0)
- return DRVMGR_EINVAL;
-
- DBG("Set interrupt affinity on 0x%x for dev 0x%x (IRQ: %d)\n",
- (unsigned int)dev->parent->dev, (unsigned int)dev, irq);
-
- if (priv->config->ops->int_set_affinity) {
- /* Let device override driver default */
- return priv->config->ops->int_set_affinity(dev, irq, cpus);
- } else {
- return DRVMGR_ENOSYS;
- }
-}
-#endif