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