mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 02:32:09 -04:00
Merge branch 'next/dt' into next/multiplatform
* next/dt: (182 commits) ARM: tegra: Add Avionic Design Tamonten Evaluation Carrier support ARM: tegra: Add Avionic Design Medcom-Wide support ARM: tegra: Add Avionic Design Plutux support ARM: tegra: Add Avionic Design Tamonten support ARM: tegra: dts: Add pwm label ARM: dt: tegra: whistler: configure power off ARM: mxs: m28evk: Disable OCOTP OUI loading ARM: imx6q: use pll2_pfd2_396m as the enfc_sel's parent ARM: dts: imx6q-sabrelite: add usbotg pinctrl support ARM: dts: imx23-olinuxino: Add USB host support ARM: dts: imx6q-sabrelite: add usbmisc device ARM: dts: mx23: Add USB resources ARM: dts: mxs: Add ethernetX to macX aliases ARM: msm: Remove non-DT targets from 8960 ARM: msm: Add DT support for 8960 ARM: msm: Move io mapping prototypes to common.h ARM: msm: Rename board-msm8x60 to signify its DT only status ARM: msm: Make 8660 a DT only target ARM: msm: Move 8660 to DT timer ARM: msm: Add DT support to msm_timer ...
This commit is contained in:
commit
ea832c41da
237 changed files with 10923 additions and 10469 deletions
|
|
@ -26,6 +26,8 @@
|
|||
#include <linux/syscore_ops.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <asm/mach/irq.h>
|
||||
|
||||
#include <mach/irqs.h>
|
||||
|
||||
/*
|
||||
|
|
@ -59,6 +61,7 @@
|
|||
#define BANK_OFF(n) (((n) < 3) ? (n) << 2 : 0x100 + (((n) - 3) << 2))
|
||||
|
||||
int pxa_last_gpio;
|
||||
static int irq_base;
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static struct irq_domain *domain;
|
||||
|
|
@ -167,63 +170,14 @@ static inline int __gpio_is_occupied(unsigned gpio)
|
|||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ARCH_PXA
|
||||
static inline int __pxa_gpio_to_irq(int gpio)
|
||||
{
|
||||
if (gpio_is_pxa_type(gpio_type))
|
||||
return PXA_GPIO_TO_IRQ(gpio);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static inline int __pxa_irq_to_gpio(int irq)
|
||||
{
|
||||
if (gpio_is_pxa_type(gpio_type))
|
||||
return irq - PXA_GPIO_TO_IRQ(0);
|
||||
return -1;
|
||||
}
|
||||
#else
|
||||
static inline int __pxa_gpio_to_irq(int gpio) { return -1; }
|
||||
static inline int __pxa_irq_to_gpio(int irq) { return -1; }
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ARCH_MMP
|
||||
static inline int __mmp_gpio_to_irq(int gpio)
|
||||
{
|
||||
if (gpio_is_mmp_type(gpio_type))
|
||||
return MMP_GPIO_TO_IRQ(gpio);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static inline int __mmp_irq_to_gpio(int irq)
|
||||
{
|
||||
if (gpio_is_mmp_type(gpio_type))
|
||||
return irq - MMP_GPIO_TO_IRQ(0);
|
||||
return -1;
|
||||
}
|
||||
#else
|
||||
static inline int __mmp_gpio_to_irq(int gpio) { return -1; }
|
||||
static inline int __mmp_irq_to_gpio(int irq) { return -1; }
|
||||
#endif
|
||||
|
||||
static int pxa_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
int gpio, ret;
|
||||
|
||||
gpio = chip->base + offset;
|
||||
ret = __pxa_gpio_to_irq(gpio);
|
||||
if (ret >= 0)
|
||||
return ret;
|
||||
return __mmp_gpio_to_irq(gpio);
|
||||
return chip->base + offset + irq_base;
|
||||
}
|
||||
|
||||
int pxa_irq_to_gpio(int irq)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = __pxa_irq_to_gpio(irq);
|
||||
if (ret >= 0)
|
||||
return ret;
|
||||
return __mmp_irq_to_gpio(irq);
|
||||
return irq - irq_base;
|
||||
}
|
||||
|
||||
static int pxa_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
|
||||
|
|
@ -403,6 +357,9 @@ static void pxa_gpio_demux_handler(unsigned int irq, struct irq_desc *desc)
|
|||
struct pxa_gpio_chip *c;
|
||||
int loop, gpio, gpio_base, n;
|
||||
unsigned long gedr;
|
||||
struct irq_chip *chip = irq_desc_get_chip(desc);
|
||||
|
||||
chained_irq_enter(chip, desc);
|
||||
|
||||
do {
|
||||
loop = 0;
|
||||
|
|
@ -422,6 +379,8 @@ static void pxa_gpio_demux_handler(unsigned int irq, struct irq_desc *desc)
|
|||
}
|
||||
}
|
||||
} while (loop);
|
||||
|
||||
chained_irq_exit(chip, desc);
|
||||
}
|
||||
|
||||
static void pxa_ack_muxed_gpio(struct irq_data *d)
|
||||
|
|
@ -535,7 +494,7 @@ const struct irq_domain_ops pxa_irq_domain_ops = {
|
|||
|
||||
static int __devinit pxa_gpio_probe_dt(struct platform_device *pdev)
|
||||
{
|
||||
int ret, nr_banks, nr_gpios, irq_base;
|
||||
int ret, nr_banks, nr_gpios;
|
||||
struct device_node *prev, *next, *np = pdev->dev.of_node;
|
||||
const struct of_device_id *of_id =
|
||||
of_match_device(pxa_gpio_dt_ids, &pdev->dev);
|
||||
|
|
@ -590,10 +549,20 @@ static int __devinit pxa_gpio_probe(struct platform_device *pdev)
|
|||
int irq0 = 0, irq1 = 0, irq_mux, gpio_offset = 0;
|
||||
|
||||
ret = pxa_gpio_probe_dt(pdev);
|
||||
if (ret < 0)
|
||||
if (ret < 0) {
|
||||
pxa_last_gpio = pxa_gpio_nums();
|
||||
else
|
||||
#ifdef CONFIG_ARCH_PXA
|
||||
if (gpio_is_pxa_type(gpio_type))
|
||||
irq_base = PXA_GPIO_TO_IRQ(0);
|
||||
#endif
|
||||
#ifdef CONFIG_ARCH_MMP
|
||||
if (gpio_is_mmp_type(gpio_type))
|
||||
irq_base = MMP_GPIO_TO_IRQ(0);
|
||||
#endif
|
||||
} else {
|
||||
use_of = 1;
|
||||
}
|
||||
|
||||
if (!pxa_last_gpio)
|
||||
return -EINVAL;
|
||||
|
||||
|
|
|
|||
|
|
@ -938,6 +938,67 @@ static void __init samsung_gpiolib_add(struct samsung_gpio_chip *chip)
|
|||
s3c_gpiolib_track(chip);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_PLAT_S3C24XX) && defined(CONFIG_OF)
|
||||
static int s3c24xx_gpio_xlate(struct gpio_chip *gc,
|
||||
const struct of_phandle_args *gpiospec, u32 *flags)
|
||||
{
|
||||
unsigned int pin;
|
||||
|
||||
if (WARN_ON(gc->of_gpio_n_cells < 3))
|
||||
return -EINVAL;
|
||||
|
||||
if (WARN_ON(gpiospec->args_count < gc->of_gpio_n_cells))
|
||||
return -EINVAL;
|
||||
|
||||
if (gpiospec->args[0] > gc->ngpio)
|
||||
return -EINVAL;
|
||||
|
||||
pin = gc->base + gpiospec->args[0];
|
||||
|
||||
if (s3c_gpio_cfgpin(pin, S3C_GPIO_SFN(gpiospec->args[1])))
|
||||
pr_warn("gpio_xlate: failed to set pin function\n");
|
||||
if (s3c_gpio_setpull(pin, gpiospec->args[2] & 0xffff))
|
||||
pr_warn("gpio_xlate: failed to set pin pull up/down\n");
|
||||
|
||||
if (flags)
|
||||
*flags = gpiospec->args[2] >> 16;
|
||||
|
||||
return gpiospec->args[0];
|
||||
}
|
||||
|
||||
static const struct of_device_id s3c24xx_gpio_dt_match[] __initdata = {
|
||||
{ .compatible = "samsung,s3c24xx-gpio", },
|
||||
{}
|
||||
};
|
||||
|
||||
static __init void s3c24xx_gpiolib_attach_ofnode(struct samsung_gpio_chip *chip,
|
||||
u64 base, u64 offset)
|
||||
{
|
||||
struct gpio_chip *gc = &chip->chip;
|
||||
u64 address;
|
||||
|
||||
if (!of_have_populated_dt())
|
||||
return;
|
||||
|
||||
address = chip->base ? base + ((u32)chip->base & 0xfff) : base + offset;
|
||||
gc->of_node = of_find_matching_node_by_address(NULL,
|
||||
s3c24xx_gpio_dt_match, address);
|
||||
if (!gc->of_node) {
|
||||
pr_info("gpio: device tree node not found for gpio controller"
|
||||
" with base address %08llx\n", address);
|
||||
return;
|
||||
}
|
||||
gc->of_gpio_n_cells = 3;
|
||||
gc->of_xlate = s3c24xx_gpio_xlate;
|
||||
}
|
||||
#else
|
||||
static __init void s3c24xx_gpiolib_attach_ofnode(struct samsung_gpio_chip *chip,
|
||||
u64 base, u64 offset)
|
||||
{
|
||||
return;
|
||||
}
|
||||
#endif /* defined(CONFIG_PLAT_S3C24XX) && defined(CONFIG_OF) */
|
||||
|
||||
static void __init s3c24xx_gpiolib_add_chips(struct samsung_gpio_chip *chip,
|
||||
int nr_chips, void __iomem *base)
|
||||
{
|
||||
|
|
@ -962,6 +1023,8 @@ static void __init s3c24xx_gpiolib_add_chips(struct samsung_gpio_chip *chip,
|
|||
gc->direction_output = samsung_gpiolib_2bit_output;
|
||||
|
||||
samsung_gpiolib_add(chip);
|
||||
|
||||
s3c24xx_gpiolib_attach_ofnode(chip, S3C24XX_PA_GPIO, i * 0x10);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -396,6 +396,29 @@ static int __devinit gpio_twl4030_debounce(u32 debounce, u8 mmc_cd)
|
|||
|
||||
static int gpio_twl4030_remove(struct platform_device *pdev);
|
||||
|
||||
static struct twl4030_gpio_platform_data *of_gpio_twl4030(struct device *dev)
|
||||
{
|
||||
struct twl4030_gpio_platform_data *omap_twl_info;
|
||||
|
||||
omap_twl_info = devm_kzalloc(dev, sizeof(*omap_twl_info), GFP_KERNEL);
|
||||
if (!omap_twl_info)
|
||||
return NULL;
|
||||
|
||||
omap_twl_info->use_leds = of_property_read_bool(dev->of_node,
|
||||
"ti,use-leds");
|
||||
|
||||
of_property_read_u32(dev->of_node, "ti,debounce",
|
||||
&omap_twl_info->debounce);
|
||||
of_property_read_u32(dev->of_node, "ti,mmc-cd",
|
||||
(u32 *)&omap_twl_info->mmc_cd);
|
||||
of_property_read_u32(dev->of_node, "ti,pullups",
|
||||
&omap_twl_info->pullups);
|
||||
of_property_read_u32(dev->of_node, "ti,pulldowns",
|
||||
&omap_twl_info->pulldowns);
|
||||
|
||||
return omap_twl_info;
|
||||
}
|
||||
|
||||
static int __devinit gpio_twl4030_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct twl4030_gpio_platform_data *pdata = pdev->dev.platform_data;
|
||||
|
|
@ -428,33 +451,37 @@ no_irqs:
|
|||
twl_gpiochip.ngpio = TWL4030_GPIO_MAX;
|
||||
twl_gpiochip.dev = &pdev->dev;
|
||||
|
||||
if (pdata) {
|
||||
/*
|
||||
* NOTE: boards may waste power if they don't set pullups
|
||||
* and pulldowns correctly ... default for non-ULPI pins is
|
||||
* pulldown, and some other pins may have external pullups
|
||||
* or pulldowns. Careful!
|
||||
*/
|
||||
ret = gpio_twl4030_pulls(pdata->pullups, pdata->pulldowns);
|
||||
if (ret)
|
||||
dev_dbg(&pdev->dev, "pullups %.05x %.05x --> %d\n",
|
||||
pdata->pullups, pdata->pulldowns,
|
||||
ret);
|
||||
if (node)
|
||||
pdata = of_gpio_twl4030(&pdev->dev);
|
||||
|
||||
ret = gpio_twl4030_debounce(pdata->debounce, pdata->mmc_cd);
|
||||
if (ret)
|
||||
dev_dbg(&pdev->dev, "debounce %.03x %.01x --> %d\n",
|
||||
pdata->debounce, pdata->mmc_cd,
|
||||
ret);
|
||||
|
||||
/*
|
||||
* NOTE: we assume VIBRA_CTL.VIBRA_EN, in MODULE_AUDIO_VOICE,
|
||||
* is (still) clear if use_leds is set.
|
||||
*/
|
||||
if (pdata->use_leds)
|
||||
twl_gpiochip.ngpio += 2;
|
||||
if (pdata == NULL) {
|
||||
dev_err(&pdev->dev, "Platform data is missing\n");
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
/*
|
||||
* NOTE: boards may waste power if they don't set pullups
|
||||
* and pulldowns correctly ... default for non-ULPI pins is
|
||||
* pulldown, and some other pins may have external pullups
|
||||
* or pulldowns. Careful!
|
||||
*/
|
||||
ret = gpio_twl4030_pulls(pdata->pullups, pdata->pulldowns);
|
||||
if (ret)
|
||||
dev_dbg(&pdev->dev, "pullups %.05x %.05x --> %d\n",
|
||||
pdata->pullups, pdata->pulldowns, ret);
|
||||
|
||||
ret = gpio_twl4030_debounce(pdata->debounce, pdata->mmc_cd);
|
||||
if (ret)
|
||||
dev_dbg(&pdev->dev, "debounce %.03x %.01x --> %d\n",
|
||||
pdata->debounce, pdata->mmc_cd, ret);
|
||||
|
||||
/*
|
||||
* NOTE: we assume VIBRA_CTL.VIBRA_EN, in MODULE_AUDIO_VOICE,
|
||||
* is (still) clear if use_leds is set.
|
||||
*/
|
||||
if (pdata->use_leds)
|
||||
twl_gpiochip.ngpio += 2;
|
||||
|
||||
ret = gpiochip_add(&twl_gpiochip);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "could not register gpiochip, %d\n", ret);
|
||||
|
|
|
|||
Loading…
Reference in a new issue