linux/arch/arm/plat-mxc/devices.c
<<
>>
Prefs
   1/*
   2 * Copyright 2008 Sascha Hauer, kernel@pengutronix.de
   3 *
   4 * This program is free software; you can redistribute it and/or
   5 * modify it under the terms of the GNU General Public License
   6 * as published by the Free Software Foundation; either version 2
   7 * of the License, or (at your option) any later version.
   8 * This program is distributed in the hope that it will be useful,
   9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11 * GNU General Public License for more details.
  12 *
  13 * You should have received a copy of the GNU General Public License
  14 * along with this program; if not, write to the Free Software
  15 * Foundation, Inc., 51 Franklin Street, Fifth Floor,
  16 * Boston, MA  02110-1301, USA.
  17 */
  18
  19#include <linux/kernel.h>
  20#include <linux/slab.h>
  21#include <linux/init.h>
  22#include <linux/err.h>
  23#include <linux/platform_device.h>
  24#include <mach/common.h>
  25
  26int __init mxc_register_device(struct platform_device *pdev, void *data)
  27{
  28        int ret;
  29
  30        pdev->dev.platform_data = data;
  31
  32        ret = platform_device_register(pdev);
  33        if (ret)
  34                pr_debug("Unable to register platform device '%s': %d\n",
  35                         pdev->name, ret);
  36
  37        return ret;
  38}
  39
  40struct platform_device *__init imx_add_platform_device_dmamask(
  41                const char *name, int id,
  42                const struct resource *res, unsigned int num_resources,
  43                const void *data, size_t size_data, u64 dmamask)
  44{
  45        int ret = -ENOMEM;
  46        struct platform_device *pdev;
  47
  48        pdev = platform_device_alloc(name, id);
  49        if (!pdev)
  50                goto err;
  51
  52        if (dmamask) {
  53                /*
  54                 * This memory isn't freed when the device is put,
  55                 * I don't have a nice idea for that though.  Conceptually
  56                 * dma_mask in struct device should not be a pointer.
  57                 * See http://thread.gmane.org/gmane.linux.kernel.pci/9081
  58                 */
  59                pdev->dev.dma_mask =
  60                        kmalloc(sizeof(*pdev->dev.dma_mask), GFP_KERNEL);
  61                if (!pdev->dev.dma_mask)
  62                        /* ret is still -ENOMEM; */
  63                        goto err;
  64
  65                *pdev->dev.dma_mask = dmamask;
  66                pdev->dev.coherent_dma_mask = dmamask;
  67        }
  68
  69        if (res) {
  70                ret = platform_device_add_resources(pdev, res, num_resources);
  71                if (ret)
  72                        goto err;
  73        }
  74
  75        if (data) {
  76                ret = platform_device_add_data(pdev, data, size_data);
  77                if (ret)
  78                        goto err;
  79        }
  80
  81        ret = platform_device_add(pdev);
  82        if (ret) {
  83err:
  84                platform_device_put(pdev);
  85                return ERR_PTR(ret);
  86        }
  87
  88        return pdev;
  89}
  90