Release 4.11 arch/arm/common/scoop.c
/*
* Support code for the SCOOP interface found on various Sharp PDAs
*
* Copyright (c) 2004 Richard Purdie
*
* Based on code written by Sharp/Lineo for 2.4 kernels
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
*/
#include <linux/device.h>
#include <linux/gpio.h>
#include <linux/string.h>
#include <linux/slab.h>
#include <linux/platform_device.h>
#include <linux/export.h>
#include <linux/io.h>
#include <asm/hardware/scoop.h>
/* PCMCIA to Scoop linkage
There is no easy way to link multiple scoop devices into one
single entity for the pxa2xx_pcmcia device so this structure
is used which is setup by the platform code.
This file is never modular so this symbol is always
accessile to the board support files.
*/
struct scoop_pcmcia_config *platform_scoop_config;
EXPORT_SYMBOL(platform_scoop_config);
struct scoop_dev {
void __iomem *base;
struct gpio_chip gpio;
spinlock_t scoop_lock;
unsigned short suspend_clr;
unsigned short suspend_set;
u32 scoop_gpwr;
};
void reset_scoop(struct device *dev)
{
struct scoop_dev *sdev = dev_get_drvdata(dev);
iowrite16(0x0100, sdev->base + SCOOP_MCR); /* 00 */
iowrite16(0x0000, sdev->base + SCOOP_CDR); /* 04 */
iowrite16(0x0000, sdev->base + SCOOP_CCR); /* 10 */
iowrite16(0x0000, sdev->base + SCOOP_IMR); /* 18 */
iowrite16(0x00FF, sdev->base + SCOOP_IRM); /* 14 */
iowrite16(0x0000, sdev->base + SCOOP_ISR); /* 1C */
iowrite16(0x0000, sdev->base + SCOOP_IRM);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Richard Purdie | 69 | 66.99% | 2 | 50.00% |
Dmitry Baryshkov | 28 | 27.18% | 1 | 25.00% |
H Hartley Sweeten | 6 | 5.83% | 1 | 25.00% |
Total | 103 | 100.00% | 4 | 100.00% |
static void __scoop_gpio_set(struct scoop_dev *sdev,
unsigned offset, int value)
{
unsigned short gpwr;
gpwr = ioread16(sdev->base + SCOOP_GPWR);
if (value)
gpwr |= 1 << (offset + 1);
else
gpwr &= ~(1 << (offset + 1));
iowrite16(gpwr, sdev->base + SCOOP_GPWR);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Dmitry Baryshkov | 71 | 100.00% | 1 | 100.00% |
Total | 71 | 100.00% | 1 | 100.00% |
static void scoop_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
{
struct scoop_dev *sdev = gpiochip_get_data(chip);
unsigned long flags;
spin_lock_irqsave(&sdev->scoop_lock, flags);
__scoop_gpio_set(sdev, offset, value);
spin_unlock_irqrestore(&sdev->scoop_lock, flags);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Dmitry Baryshkov | 59 | 98.33% | 1 | 50.00% |
Linus Walleij | 1 | 1.67% | 1 | 50.00% |
Total | 60 | 100.00% | 2 | 100.00% |
static int scoop_gpio_get(struct gpio_chip *chip, unsigned offset)
{
struct scoop_dev *sdev = gpiochip_get_data(chip);
/* XXX: I'm unsure, but it seems so */
return !!(ioread16(sdev->base + SCOOP_GPRR) & (1 << (offset + 1)));
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Dmitry Baryshkov | 43 | 87.76% | 1 | 25.00% |
Linus Walleij | 5 | 10.20% | 2 | 50.00% |
André Goddard Rosa | 1 | 2.04% | 1 | 25.00% |
Total | 49 | 100.00% | 4 | 100.00% |
static int scoop_gpio_direction_input(struct gpio_chip *chip,
unsigned offset)
{
struct scoop_dev *sdev = gpiochip_get_data(chip);
unsigned long flags;
unsigned short gpcr;
spin_lock_irqsave(&sdev->scoop_lock, flags);
gpcr = ioread16(sdev->base + SCOOP_GPCR);
gpcr &= ~(1 << (offset + 1));
iowrite16(gpcr, sdev->base + SCOOP_GPCR);
spin_unlock_irqrestore(&sdev->scoop_lock, flags);
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Dmitry Baryshkov | 89 | 98.89% | 1 | 50.00% |
Linus Walleij | 1 | 1.11% | 1 | 50.00% |
Total | 90 | 100.00% | 2 | 100.00% |
static int scoop_gpio_direction_output(struct gpio_chip *chip,
unsigned offset, int value)
{
struct scoop_dev *sdev = gpiochip_get_data(chip);
unsigned long flags;
unsigned short gpcr;
spin_lock_irqsave(&sdev->scoop_lock, flags);
__scoop_gpio_set(sdev, offset, value);
gpcr = ioread16(sdev->base + SCOOP_GPCR);
gpcr |= 1 << (offset + 1);
iowrite16(gpcr, sdev->base + SCOOP_GPCR);
spin_unlock_irqrestore(&sdev->scoop_lock, flags);
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Dmitry Baryshkov | 98 | 98.99% | 1 | 50.00% |
Linus Walleij | 1 | 1.01% | 1 | 50.00% |
Total | 99 | 100.00% | 2 | 100.00% |
unsigned short read_scoop_reg(struct device *dev, unsigned short reg)
{
struct scoop_dev *sdev = dev_get_drvdata(dev);
return ioread16(sdev->base + reg);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Richard Purdie | 33 | 94.29% | 2 | 66.67% |
Dmitry Baryshkov | 2 | 5.71% | 1 | 33.33% |
Total | 35 | 100.00% | 3 | 100.00% |
void write_scoop_reg(struct device *dev, unsigned short reg, unsigned short data)
{
struct scoop_dev *sdev = dev_get_drvdata(dev);
iowrite16(data, sdev->base + reg);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Richard Purdie | 35 | 89.74% | 2 | 66.67% |
Dmitry Baryshkov | 4 | 10.26% | 1 | 33.33% |
Total | 39 | 100.00% | 3 | 100.00% |
EXPORT_SYMBOL(reset_scoop);
EXPORT_SYMBOL(read_scoop_reg);
EXPORT_SYMBOL(write_scoop_reg);
#ifdef CONFIG_PM
static void check_scoop_reg(struct scoop_dev *sdev)
{
unsigned short mcr;
mcr = ioread16(sdev->base + SCOOP_MCR);
if ((mcr & 0x100) == 0)
iowrite16(0x0101, sdev->base + SCOOP_MCR);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Richard Purdie | 41 | 87.23% | 1 | 50.00% |
Dmitry Baryshkov | 6 | 12.77% | 1 | 50.00% |
Total | 47 | 100.00% | 2 | 100.00% |
static int scoop_suspend(struct platform_device *dev, pm_message_t state)
{
struct scoop_dev *sdev = platform_get_drvdata(dev);
check_scoop_reg(sdev);
sdev->scoop_gpwr = ioread16(sdev->base + SCOOP_GPWR);
iowrite16((sdev->scoop_gpwr & ~sdev->suspend_clr) | sdev->suspend_set, sdev->base + SCOOP_GPWR);
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Richard Purdie | 57 | 82.61% | 4 | 66.67% |
Dmitry Baryshkov | 10 | 14.49% | 1 | 16.67% |
Russell King | 2 | 2.90% | 1 | 16.67% |
Total | 69 | 100.00% | 6 | 100.00% |
static int scoop_resume(struct platform_device *dev)
{
struct scoop_dev *sdev = platform_get_drvdata(dev);
check_scoop_reg(sdev);
iowrite16(sdev->scoop_gpwr, sdev->base + SCOOP_GPWR);
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Richard Purdie | 34 | 80.95% | 3 | 60.00% |
Dmitry Baryshkov | 6 | 14.29% | 1 | 20.00% |
Russell King | 2 | 4.76% | 1 | 20.00% |
Total | 42 | 100.00% | 5 | 100.00% |
#else
#define scoop_suspend NULL
#define scoop_resume NULL
#endif
static int scoop_probe(struct platform_device *pdev)
{
struct scoop_dev *devptr;
struct scoop_config *inf;
struct resource *mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
int ret;
if (!mem)
return -EINVAL;
devptr = kzalloc(sizeof(struct scoop_dev), GFP_KERNEL);
if (!devptr)
return -ENOMEM;
spin_lock_init(&devptr->scoop_lock);
inf = pdev->dev.platform_data;
devptr->base = ioremap(mem->start, resource_size(mem));
if (!devptr->base) {
ret = -ENOMEM;
goto err_ioremap;
}
platform_set_drvdata(pdev, devptr);
printk("Sharp Scoop Device found at 0x%08x -> 0x%8p\n",(unsigned int)mem->start, devptr->base);
iowrite16(0x0140, devptr->base + SCOOP_MCR);
reset_scoop(&pdev->dev);
iowrite16(0x0000, devptr->base + SCOOP_CPR);
iowrite16(inf->io_dir & 0xffff, devptr->base + SCOOP_GPCR);
iowrite16(inf->io_out & 0xffff, devptr->base + SCOOP_GPWR);
devptr->suspend_clr = inf->suspend_clr;
devptr->suspend_set = inf->suspend_set;
devptr->gpio.base = -1;
if (inf->gpio_base != 0) {
devptr->gpio.label = dev_name(&pdev->dev);
devptr->gpio.base = inf->gpio_base;
devptr->gpio.ngpio = 12; /* PA11 = 0, PA12 = 1, etc. up to PA22 = 11 */
devptr->gpio.set = scoop_gpio_set;
devptr->gpio.get = scoop_gpio_get;
devptr->gpio.direction_input = scoop_gpio_direction_input;
devptr->gpio.direction_output = scoop_gpio_direction_output;
ret = gpiochip_add_data(&devptr->gpio, devptr);
if (ret)
goto err_gpio;
}
return 0;
err_gpio:
platform_set_drvdata(pdev, NULL);
err_ioremap:
iounmap(devptr->base);
kfree(devptr);
return ret;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Richard Purdie | 174 | 49.71% | 4 | 30.77% |
Dmitry Baryshkov | 155 | 44.29% | 3 | 23.08% |
Russell King | 8 | 2.29% | 2 | 15.38% |
Kay Sievers | 4 | 1.14% | 1 | 7.69% |
Joe Perches | 3 | 0.86% | 1 | 7.69% |
Pavel Machek | 3 | 0.86% | 1 | 7.69% |
Linus Walleij | 3 | 0.86% | 1 | 7.69% |
Total | 350 | 100.00% | 13 | 100.00% |
static int scoop_remove(struct platform_device *pdev)
{
struct scoop_dev *sdev = platform_get_drvdata(pdev);
if (!sdev)
return -EINVAL;
if (sdev->gpio.base != -1)
gpiochip_remove(&sdev->gpio);
platform_set_drvdata(pdev, NULL);
iounmap(sdev->base);
kfree(sdev);
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Richard Purdie | 34 | 47.89% | 1 | 33.33% |
Dmitry Baryshkov | 31 | 43.66% | 1 | 33.33% |
Russell King | 6 | 8.45% | 1 | 33.33% |
Total | 71 | 100.00% | 3 | 100.00% |
static struct platform_driver scoop_driver = {
.probe = scoop_probe,
.remove = scoop_remove,
.suspend = scoop_suspend,
.resume = scoop_resume,
.driver = {
.name = "sharp-scoop",
},
};
static int __init scoop_init(void)
{
return platform_driver_register(&scoop_driver);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Richard Purdie | 14 | 87.50% | 1 | 33.33% |
Russell King | 1 | 6.25% | 1 | 33.33% |
Dmitry Baryshkov | 1 | 6.25% | 1 | 33.33% |
Total | 16 | 100.00% | 3 | 100.00% |
subsys_initcall(scoop_init);
Overall Contributors
Person | Tokens | Prop | Commits | CommitProp |
Dmitry Baryshkov | 610 | 47.77% | 3 | 13.04% |
Richard Purdie | 592 | 46.36% | 6 | 26.09% |
Russell King | 35 | 2.74% | 3 | 13.04% |
Linus Walleij | 11 | 0.86% | 2 | 8.70% |
H Hartley Sweeten | 6 | 0.47% | 1 | 4.35% |
Tim Schmielau | 6 | 0.47% | 2 | 8.70% |
Kay Sievers | 4 | 0.31% | 1 | 4.35% |
Joe Perches | 3 | 0.23% | 1 | 4.35% |
Stefan Schmidt | 3 | 0.23% | 1 | 4.35% |
Paul Gortmaker | 3 | 0.23% | 1 | 4.35% |
Pavel Machek | 3 | 0.23% | 1 | 4.35% |
André Goddard Rosa | 1 | 0.08% | 1 | 4.35% |
Total | 1277 | 100.00% | 23 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.