 bab588fcfb
			
		
	
	
	bab588fcfb
	
	
	
		
			
			This is a larger set of new functionality for the existing SoC families,
 including:
 
 * vt8500 gains support for new CPU cores, notably the Cortex-A9 based wm8850
 * prima2 gains support for the "marco" SoC family, its SMP based cousin
 * tegra gains support for the new Tegra4 (Tegra114) family
 * socfpga now supports a newer version of the hardware including SMP
 * i.mx31 and bcm2835 are now using DT probing for their clocks
 * lots of updates for sh-mobile
 * OMAP updates for clocks, power management and USB
 * i.mx6q and tegra now support cpuidle
 * kirkwood now supports PCIe hot plugging
 * tegra clock support is updated
 * tegra USB PHY probing gets implemented diffently
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1.4.12 (GNU/Linux)
 
 iQIVAwUAUSUyPGCrR//JCVInAQI4YA/+Nb0FaA7qMmTPuJhm7aZNfnwBcGxZ7IZp
 s2xByEl3r5zbLKlKGNGE0x7Q7ETHV4y9tohzi9ZduH2b60dMRYgII06CEmDPu6/h
 4vBap2oLzfWfs9hwpCIh7N9wNzxSj/R42vlXHhNmspHlw7cFk1yw5EeJ+ocxmZPq
 H9lyjAxsGErkZyM/xstNQ1Uvhc8XHAFSUzWrg8hvf6AVVR8hwpIqVzfIizv6Vpk6
 ryBoUBHfdTztAOrafK54CdRc7l6kVMomRodKGzMyasnBK3ZfFca3IR7elnxLyEFJ
 uPDu5DKOdYrjXC8X2dPM6kYiE41YFuqOV2ahBt9HqRe6liNBLHQ6NAH7f7+jBWSI
 eeWe84c2vFaqhAGlci/xm4GaP0ud5ZLudtiVPlDY5tYIADqLygNcx1HIt/5sT7QI
 h34LMjc4+/TGVWTVf5yRmIzTrCXZv5YoAak3UWFoM4nVBo/eYVyNLEt5g9YsfjrC
 P/GWrXJJvOCB3gAi31pgGYJzZg8K7kTTAh/dgxjqzU4f6nGRm5PBydiJe18/lWkH
 qtfNE0RbhxCi3JEBnxW48AIEndVSRbd7jf8upC/s9rPURtFSVXp4APTHVyNUKCip
 gojBxcRYtesyG/53nrwdTyiyHx6GocmWnMNZJoDo0UQEkog2dOef+StdC3zhc2Vm
 9EttcFqWJ+E=
 =PRrg
 -----END PGP SIGNATURE-----
Merge tag 'soc' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
Pull ARM SoC-specific updates from Arnd Bergmann:
 "This is a larger set of new functionality for the existing SoC
  families, including:
   - vt8500 gains support for new CPU cores, notably the Cortex-A9 based
     wm8850
   - prima2 gains support for the "marco" SoC family, its SMP based
     cousin
   - tegra gains support for the new Tegra4 (Tegra114) family
   - socfpga now supports a newer version of the hardware including SMP
   - i.mx31 and bcm2835 are now using DT probing for their clocks
   - lots of updates for sh-mobile
   - OMAP updates for clocks, power management and USB
   - i.mx6q and tegra now support cpuidle
   - kirkwood now supports PCIe hot plugging
   - tegra clock support is updated
   - tegra USB PHY probing gets implemented diffently"
* tag 'soc' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (148 commits)
  ARM: prima2: remove duplicate v7_invalidate_l1
  ARM: shmobile: r8a7779: Correct TMU clock support again
  ARM: prima2: fix __init section for cpu hotplug
  ARM: OMAP: Consolidate OMAP USB-HS platform data (part 3/3)
  ARM: OMAP: Consolidate OMAP USB-HS platform data (part 1/3)
  arm: socfpga: Add SMP support for actual socfpga harware
  arm: Add v7_invalidate_l1 to cache-v7.S
  arm: socfpga: Add entries to enable make dtbs socfpga
  arm: socfpga: Add new device tree source for actual socfpga HW
  ARM: tegra: sort Kconfig selects for Tegra114
  ARM: tegra: enable ARCH_REQUIRE_GPIOLIB for Tegra114
  ARM: tegra: Fix build error w/ ARCH_TEGRA_114_SOC w/o ARCH_TEGRA_3x_SOC
  ARM: tegra: Fix build error for gic update
  ARM: tegra: remove empty tegra_smp_init_cpus()
  ARM: shmobile: Register ARM architected timer
  ARM: MARCO: fix the build issue due to gic-vic-to-irqchip move
  ARM: shmobile: r8a7779: Correct TMU clock support
  ARM: mxs_defconfig: Select CONFIG_DEVTMPFS_MOUNT
  ARM: mxs: decrease mxs_clockevent_device.min_delta_ns to 2 clock cycles
  ARM: mxs: use apbx bus clock to drive the timers on timrotv2
  ...
		
	
			
		
			
				
	
	
		
			160 lines
		
	
	
	
		
			5.3 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			160 lines
		
	
	
	
		
			5.3 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * OMAP2+ specific gpio initialization
 | |
|  *
 | |
|  * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/
 | |
|  *
 | |
|  * Author:
 | |
|  *	Charulatha V <charu@ti.com>
 | |
|  *
 | |
|  * This program is free software; you can redistribute it and/or
 | |
|  * modify it under the terms of the GNU General Public License as
 | |
|  * published by the Free Software Foundation version 2.
 | |
|  *
 | |
|  * This program is distributed "as is" WITHOUT ANY WARRANTY of any
 | |
|  * kind, whether express or implied; without even the implied warranty
 | |
|  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|  * GNU General Public License for more details.
 | |
|  */
 | |
| 
 | |
| #include <linux/gpio.h>
 | |
| #include <linux/err.h>
 | |
| #include <linux/slab.h>
 | |
| #include <linux/interrupt.h>
 | |
| #include <linux/of.h>
 | |
| #include <linux/platform_data/gpio-omap.h>
 | |
| 
 | |
| #include "soc.h"
 | |
| #include "omap_hwmod.h"
 | |
| #include "omap_device.h"
 | |
| #include "omap-pm.h"
 | |
| 
 | |
| #include "powerdomain.h"
 | |
| 
 | |
| static int __init omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused)
 | |
| {
 | |
| 	struct platform_device *pdev;
 | |
| 	struct omap_gpio_platform_data *pdata;
 | |
| 	struct omap_gpio_dev_attr *dev_attr;
 | |
| 	char *name = "omap_gpio";
 | |
| 	int id;
 | |
| 	struct powerdomain *pwrdm;
 | |
| 
 | |
| 	/*
 | |
| 	 * extract the device id from name field available in the
 | |
| 	 * hwmod database and use the same for constructing ids for
 | |
| 	 * gpio devices.
 | |
| 	 * CAUTION: Make sure the name in the hwmod database does
 | |
| 	 * not change. If changed, make corresponding change here
 | |
| 	 * or make use of static variable mechanism to handle this.
 | |
| 	 */
 | |
| 	sscanf(oh->name, "gpio%d", &id);
 | |
| 
 | |
| 	pdata = kzalloc(sizeof(struct omap_gpio_platform_data), GFP_KERNEL);
 | |
| 	if (!pdata) {
 | |
| 		pr_err("gpio%d: Memory allocation failed\n", id);
 | |
| 		return -ENOMEM;
 | |
| 	}
 | |
| 
 | |
| 	dev_attr = (struct omap_gpio_dev_attr *)oh->dev_attr;
 | |
| 	pdata->bank_width = dev_attr->bank_width;
 | |
| 	pdata->dbck_flag = dev_attr->dbck_flag;
 | |
| 	pdata->get_context_loss_count = omap_pm_get_dev_context_loss_count;
 | |
| 	pdata->regs = kzalloc(sizeof(struct omap_gpio_reg_offs), GFP_KERNEL);
 | |
| 	if (!pdata->regs) {
 | |
| 		pr_err("gpio%d: Memory allocation failed\n", id);
 | |
| 		kfree(pdata);
 | |
| 		return -ENOMEM;
 | |
| 	}
 | |
| 
 | |
| 	switch (oh->class->rev) {
 | |
| 	case 0:
 | |
| 		if (id == 1)
 | |
| 			/* non-wakeup GPIO pins for OMAP2 Bank1 */
 | |
| 			pdata->non_wakeup_gpios = 0xe203ffc0;
 | |
| 		else if (id == 2)
 | |
| 			/* non-wakeup GPIO pins for OMAP2 Bank2 */
 | |
| 			pdata->non_wakeup_gpios = 0x08700040;
 | |
| 		/* fall through */
 | |
| 
 | |
| 	case 1:
 | |
| 		pdata->regs->revision = OMAP24XX_GPIO_REVISION;
 | |
| 		pdata->regs->direction = OMAP24XX_GPIO_OE;
 | |
| 		pdata->regs->datain = OMAP24XX_GPIO_DATAIN;
 | |
| 		pdata->regs->dataout = OMAP24XX_GPIO_DATAOUT;
 | |
| 		pdata->regs->set_dataout = OMAP24XX_GPIO_SETDATAOUT;
 | |
| 		pdata->regs->clr_dataout = OMAP24XX_GPIO_CLEARDATAOUT;
 | |
| 		pdata->regs->irqstatus = OMAP24XX_GPIO_IRQSTATUS1;
 | |
| 		pdata->regs->irqstatus2 = OMAP24XX_GPIO_IRQSTATUS2;
 | |
| 		pdata->regs->irqenable = OMAP24XX_GPIO_IRQENABLE1;
 | |
| 		pdata->regs->irqenable2 = OMAP24XX_GPIO_IRQENABLE2;
 | |
| 		pdata->regs->set_irqenable = OMAP24XX_GPIO_SETIRQENABLE1;
 | |
| 		pdata->regs->clr_irqenable = OMAP24XX_GPIO_CLEARIRQENABLE1;
 | |
| 		pdata->regs->debounce = OMAP24XX_GPIO_DEBOUNCE_VAL;
 | |
| 		pdata->regs->debounce_en = OMAP24XX_GPIO_DEBOUNCE_EN;
 | |
| 		pdata->regs->ctrl = OMAP24XX_GPIO_CTRL;
 | |
| 		pdata->regs->wkup_en = OMAP24XX_GPIO_WAKE_EN;
 | |
| 		pdata->regs->leveldetect0 = OMAP24XX_GPIO_LEVELDETECT0;
 | |
| 		pdata->regs->leveldetect1 = OMAP24XX_GPIO_LEVELDETECT1;
 | |
| 		pdata->regs->risingdetect = OMAP24XX_GPIO_RISINGDETECT;
 | |
| 		pdata->regs->fallingdetect = OMAP24XX_GPIO_FALLINGDETECT;
 | |
| 		break;
 | |
| 	case 2:
 | |
| 		pdata->regs->revision = OMAP4_GPIO_REVISION;
 | |
| 		pdata->regs->direction = OMAP4_GPIO_OE;
 | |
| 		pdata->regs->datain = OMAP4_GPIO_DATAIN;
 | |
| 		pdata->regs->dataout = OMAP4_GPIO_DATAOUT;
 | |
| 		pdata->regs->set_dataout = OMAP4_GPIO_SETDATAOUT;
 | |
| 		pdata->regs->clr_dataout = OMAP4_GPIO_CLEARDATAOUT;
 | |
| 		pdata->regs->irqstatus_raw0 = OMAP4_GPIO_IRQSTATUSRAW0;
 | |
| 		pdata->regs->irqstatus_raw1 = OMAP4_GPIO_IRQSTATUSRAW1;
 | |
| 		pdata->regs->irqstatus = OMAP4_GPIO_IRQSTATUS0;
 | |
| 		pdata->regs->irqstatus2 = OMAP4_GPIO_IRQSTATUS1;
 | |
| 		pdata->regs->irqenable = OMAP4_GPIO_IRQSTATUSSET0;
 | |
| 		pdata->regs->irqenable2 = OMAP4_GPIO_IRQSTATUSSET1;
 | |
| 		pdata->regs->set_irqenable = OMAP4_GPIO_IRQSTATUSSET0;
 | |
| 		pdata->regs->clr_irqenable = OMAP4_GPIO_IRQSTATUSCLR0;
 | |
| 		pdata->regs->debounce = OMAP4_GPIO_DEBOUNCINGTIME;
 | |
| 		pdata->regs->debounce_en = OMAP4_GPIO_DEBOUNCENABLE;
 | |
| 		pdata->regs->ctrl = OMAP4_GPIO_CTRL;
 | |
| 		pdata->regs->wkup_en = OMAP4_GPIO_IRQWAKEN0;
 | |
| 		pdata->regs->leveldetect0 = OMAP4_GPIO_LEVELDETECT0;
 | |
| 		pdata->regs->leveldetect1 = OMAP4_GPIO_LEVELDETECT1;
 | |
| 		pdata->regs->risingdetect = OMAP4_GPIO_RISINGDETECT;
 | |
| 		pdata->regs->fallingdetect = OMAP4_GPIO_FALLINGDETECT;
 | |
| 		break;
 | |
| 	default:
 | |
| 		WARN(1, "Invalid gpio bank_type\n");
 | |
| 		kfree(pdata->regs);
 | |
| 		kfree(pdata);
 | |
| 		return -EINVAL;
 | |
| 	}
 | |
| 
 | |
| 	pwrdm = omap_hwmod_get_pwrdm(oh);
 | |
| 	pdata->loses_context = pwrdm_can_ever_lose_context(pwrdm);
 | |
| 
 | |
| 	pdev = omap_device_build(name, id - 1, oh, pdata, sizeof(*pdata));
 | |
| 	kfree(pdata);
 | |
| 
 | |
| 	if (IS_ERR(pdev)) {
 | |
| 		WARN(1, "Can't build omap_device for %s:%s.\n",
 | |
| 					name, oh->name);
 | |
| 		return PTR_ERR(pdev);
 | |
| 	}
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| /*
 | |
|  * gpio_init needs to be done before
 | |
|  * machine_init functions access gpio APIs.
 | |
|  * Hence gpio_init is a omap_postcore_initcall.
 | |
|  */
 | |
| static int __init omap2_gpio_init(void)
 | |
| {
 | |
| 	/* If dtb is there, the devices will be created dynamically */
 | |
| 	if (of_have_populated_dt())
 | |
| 		return -ENODEV;
 | |
| 
 | |
| 	return omap_hwmod_for_each_by_class("gpio", omap2_gpio_dev_init, NULL);
 | |
| }
 | |
| omap_postcore_initcall(omap2_gpio_init);
 |