Logo Search packages:      
Sourcecode: linux version File versions  Download package

devices.c

/*
 * linux/arch/arm/mach-mmp/devices.c
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/dma-mapping.h>

#include <asm/irq.h>
#include <mach/devices.h>

int __init pxa_register_device(struct pxa_device_desc *desc,
                        void *data, size_t size)
{
      struct platform_device *pdev;
      struct resource res[2 + MAX_RESOURCE_DMA];
      int i, ret = 0, nres = 0;

      pdev = platform_device_alloc(desc->drv_name, desc->id);
      if (pdev == NULL)
            return -ENOMEM;

      pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);

      memset(res, 0, sizeof(res));

      if (desc->start != -1ul && desc->size > 0) {
            res[nres].start   = desc->start;
            res[nres].end     = desc->start + desc->size - 1;
            res[nres].flags   = IORESOURCE_MEM;
            nres++;
      }

      if (desc->irq != NO_IRQ) {
            res[nres].start   = desc->irq;
            res[nres].end     = desc->irq;
            res[nres].flags   = IORESOURCE_IRQ;
            nres++;
      }

      for (i = 0; i < MAX_RESOURCE_DMA; i++, nres++) {
            if (desc->dma[i] == 0)
                  break;

            res[nres].start   = desc->dma[i];
            res[nres].end     = desc->dma[i];
            res[nres].flags   = IORESOURCE_DMA;
      }

      ret = platform_device_add_resources(pdev, res, nres);
      if (ret) {
            platform_device_put(pdev);
            return ret;
      }

      if (data && size) {
            ret = platform_device_add_data(pdev, data, size);
            if (ret) {
                  platform_device_put(pdev);
                  return ret;
            }
      }

      return platform_device_add(pdev);
}

Generated by  Doxygen 1.6.0   Back to index