1fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent/*
2fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent * Copyright (C) ST-Ericsson SA 2010
3fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent *
4fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson
5fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent * License terms: GNU General Public License (GPL), version 2.
6fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent */
7fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent
8fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent#include <linux/kernel.h>
9fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent#include <linux/dma-mapping.h>
10fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent#include <linux/err.h>
11fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent#include <linux/irq.h>
12fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent#include <linux/slab.h>
13fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent#include <linux/platform_device.h>
14fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent#include <linux/amba/bus.h>
15fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent
160f33286190634eeb3ec7638045980c39c98380f4Linus Walleij#include <plat/gpio-nomadik.h>
1701afdd1353ca83904f430be4f6202d1a20912f4dRabin Vincent
18fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent#include <mach/hardware.h>
19fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent
20fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent#include "devices-common.h"
21fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent
22fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincentstruct amba_device *
2318403424c4fe5bac509bf52343f5d5407d45ee3aLee Jonesdbx500_add_amba_device(struct device *parent, const char *name,
2418403424c4fe5bac509bf52343f5d5407d45ee3aLee Jones		       resource_size_t base, int irq, void *pdata,
2518403424c4fe5bac509bf52343f5d5407d45ee3aLee Jones		       unsigned int periphid)
26fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent{
27fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent	struct amba_device *dev;
28fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent	int ret;
29fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent
3046d4bb9b52829c7d94c528201f27f6288be3f45eRussell King	dev = amba_device_alloc(name, base, SZ_4K);
31fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent	if (!dev)
32fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent		return ERR_PTR(-ENOMEM);
33fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent
34fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent	dev->dma_mask = DMA_BIT_MASK(32);
35fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent	dev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
36fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent
37fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent	dev->irq[0] = irq;
38fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent
39fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent	dev->periphid = periphid;
40fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent
41fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent	dev->dev.platform_data = pdata;
42fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent
43b024a0c804356d90b13c072c8bbb444d9e745a66Lee Jones	dev->dev.parent = parent;
44b024a0c804356d90b13c072c8bbb444d9e745a66Lee Jones
4546d4bb9b52829c7d94c528201f27f6288be3f45eRussell King	ret = amba_device_add(dev, &iomem_resource);
46fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent	if (ret) {
4746d4bb9b52829c7d94c528201f27f6288be3f45eRussell King		amba_device_put(dev);
48fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent		return ERR_PTR(ret);
49fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent	}
50fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent
51fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent	return dev;
52fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent}
53fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincent
54fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebeRabin Vincentstatic struct platform_device *
5518403424c4fe5bac509bf52343f5d5407d45ee3aLee Jonesdbx500_add_gpio(struct device *parent, int id, resource_size_t addr, int irq,
5601afdd1353ca83904f430be4f6202d1a20912f4dRabin Vincent		struct nmk_gpio_platform_data *pdata)
5701afdd1353ca83904f430be4f6202d1a20912f4dRabin Vincent{
5801afdd1353ca83904f430be4f6202d1a20912f4dRabin Vincent	struct resource resources[] = {
5901afdd1353ca83904f430be4f6202d1a20912f4dRabin Vincent		{
6001afdd1353ca83904f430be4f6202d1a20912f4dRabin Vincent			.start	= addr,
6101afdd1353ca83904f430be4f6202d1a20912f4dRabin Vincent			.end	= addr + 127,
6201afdd1353ca83904f430be4f6202d1a20912f4dRabin Vincent			.flags	= IORESOURCE_MEM,
6301afdd1353ca83904f430be4f6202d1a20912f4dRabin Vincent		},
6401afdd1353ca83904f430be4f6202d1a20912f4dRabin Vincent		{
6501afdd1353ca83904f430be4f6202d1a20912f4dRabin Vincent			.start	= irq,
6601afdd1353ca83904f430be4f6202d1a20912f4dRabin Vincent			.end	= irq,
6701afdd1353ca83904f430be4f6202d1a20912f4dRabin Vincent			.flags	= IORESOURCE_IRQ,
6801afdd1353ca83904f430be4f6202d1a20912f4dRabin Vincent		}
6901afdd1353ca83904f430be4f6202d1a20912f4dRabin Vincent	};
7001afdd1353ca83904f430be4f6202d1a20912f4dRabin Vincent
71b024a0c804356d90b13c072c8bbb444d9e745a66Lee Jones	return platform_device_register_resndata(
72b024a0c804356d90b13c072c8bbb444d9e745a66Lee Jones		parent,
73b024a0c804356d90b13c072c8bbb444d9e745a66Lee Jones		"gpio",
74b024a0c804356d90b13c072c8bbb444d9e745a66Lee Jones		id,
75b024a0c804356d90b13c072c8bbb444d9e745a66Lee Jones		resources,
76b024a0c804356d90b13c072c8bbb444d9e745a66Lee Jones		ARRAY_SIZE(resources),
77b024a0c804356d90b13c072c8bbb444d9e745a66Lee Jones		pdata,
78b024a0c804356d90b13c072c8bbb444d9e745a66Lee Jones		sizeof(*pdata));
7901afdd1353ca83904f430be4f6202d1a20912f4dRabin Vincent}
8001afdd1353ca83904f430be4f6202d1a20912f4dRabin Vincent
8118403424c4fe5bac509bf52343f5d5407d45ee3aLee Jonesvoid dbx500_add_gpios(struct device *parent, resource_size_t *base, int num,
8218403424c4fe5bac509bf52343f5d5407d45ee3aLee Jones		      int irq, struct nmk_gpio_platform_data *pdata)
8301afdd1353ca83904f430be4f6202d1a20912f4dRabin Vincent{
8401afdd1353ca83904f430be4f6202d1a20912f4dRabin Vincent	int first = 0;
8501afdd1353ca83904f430be4f6202d1a20912f4dRabin Vincent	int i;
8601afdd1353ca83904f430be4f6202d1a20912f4dRabin Vincent
8701afdd1353ca83904f430be4f6202d1a20912f4dRabin Vincent	for (i = 0; i < num; i++, first += 32, irq++) {
8801afdd1353ca83904f430be4f6202d1a20912f4dRabin Vincent		pdata->first_gpio = first;
8901afdd1353ca83904f430be4f6202d1a20912f4dRabin Vincent		pdata->first_irq = NOMADIK_GPIO_TO_IRQ(first);
90e493e06fedd86b484d172f961234f105f295d4d4Rabin Vincent		pdata->num_gpio = 32;
9101afdd1353ca83904f430be4f6202d1a20912f4dRabin Vincent
9218403424c4fe5bac509bf52343f5d5407d45ee3aLee Jones		dbx500_add_gpio(parent, i, base[i], irq, pdata);
9301afdd1353ca83904f430be4f6202d1a20912f4dRabin Vincent	}
9401afdd1353ca83904f430be4f6202d1a20912f4dRabin Vincent}
95