mirror of
https://github.com/AetherDroid/android_kernel_samsung_on5xelte.git
synced 2025-09-08 09:08:05 -04:00
Fixed MTP to work with TWRP
This commit is contained in:
commit
f6dfaef42e
50820 changed files with 20846062 additions and 0 deletions
5
arch/sh/boards/mach-landisk/Makefile
Normal file
5
arch/sh/boards/mach-landisk/Makefile
Normal file
|
@ -0,0 +1,5 @@
|
|||
#
|
||||
# Makefile for I-O DATA DEVICE, INC. "LANDISK Series"
|
||||
#
|
||||
|
||||
obj-y := setup.o irq.o psw.o gio.o
|
170
arch/sh/boards/mach-landisk/gio.c
Normal file
170
arch/sh/boards/mach-landisk/gio.c
Normal file
|
@ -0,0 +1,170 @@
|
|||
/*
|
||||
* arch/sh/boards/landisk/gio.c - driver for landisk
|
||||
*
|
||||
* This driver will also support the I-O DATA Device, Inc. LANDISK Board.
|
||||
* LANDISK and USL-5P Button, LED and GIO driver drive function.
|
||||
*
|
||||
* Copylight (C) 2006 kogiidena
|
||||
* Copylight (C) 2002 Atom Create Engineering Co., Ltd. *
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*
|
||||
*/
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kdev_t.h>
|
||||
#include <linux/cdev.h>
|
||||
#include <linux/fs.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <mach-landisk/mach/gio.h>
|
||||
#include <mach-landisk/mach/iodata_landisk.h>
|
||||
|
||||
#define DEVCOUNT 4
|
||||
#define GIO_MINOR 2 /* GIO minor no. */
|
||||
|
||||
static dev_t dev;
|
||||
static struct cdev *cdev_p;
|
||||
static int openCnt;
|
||||
|
||||
static int gio_open(struct inode *inode, struct file *filp)
|
||||
{
|
||||
int minor;
|
||||
int ret = -ENOENT;
|
||||
|
||||
preempt_disable();
|
||||
minor = MINOR(inode->i_rdev);
|
||||
if (minor < DEVCOUNT) {
|
||||
if (openCnt > 0) {
|
||||
ret = -EALREADY;
|
||||
} else {
|
||||
openCnt++;
|
||||
ret = 0;
|
||||
}
|
||||
}
|
||||
preempt_enable();
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int gio_close(struct inode *inode, struct file *filp)
|
||||
{
|
||||
int minor;
|
||||
|
||||
minor = MINOR(inode->i_rdev);
|
||||
if (minor < DEVCOUNT) {
|
||||
openCnt--;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static long gio_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
unsigned int data;
|
||||
static unsigned int addr = 0;
|
||||
|
||||
if (cmd & 0x01) { /* write */
|
||||
if (copy_from_user(&data, (int *)arg, sizeof(int))) {
|
||||
return -EFAULT;
|
||||
}
|
||||
}
|
||||
|
||||
switch (cmd) {
|
||||
case GIODRV_IOCSGIOSETADDR: /* address set */
|
||||
addr = data;
|
||||
break;
|
||||
|
||||
case GIODRV_IOCSGIODATA1: /* write byte */
|
||||
__raw_writeb((unsigned char)(0x0ff & data), addr);
|
||||
break;
|
||||
|
||||
case GIODRV_IOCSGIODATA2: /* write word */
|
||||
if (addr & 0x01) {
|
||||
return -EFAULT;
|
||||
}
|
||||
__raw_writew((unsigned short int)(0x0ffff & data), addr);
|
||||
break;
|
||||
|
||||
case GIODRV_IOCSGIODATA4: /* write long */
|
||||
if (addr & 0x03) {
|
||||
return -EFAULT;
|
||||
}
|
||||
__raw_writel(data, addr);
|
||||
break;
|
||||
|
||||
case GIODRV_IOCGGIODATA1: /* read byte */
|
||||
data = __raw_readb(addr);
|
||||
break;
|
||||
|
||||
case GIODRV_IOCGGIODATA2: /* read word */
|
||||
if (addr & 0x01) {
|
||||
return -EFAULT;
|
||||
}
|
||||
data = __raw_readw(addr);
|
||||
break;
|
||||
|
||||
case GIODRV_IOCGGIODATA4: /* read long */
|
||||
if (addr & 0x03) {
|
||||
return -EFAULT;
|
||||
}
|
||||
data = __raw_readl(addr);
|
||||
break;
|
||||
default:
|
||||
return -EFAULT;
|
||||
break;
|
||||
}
|
||||
|
||||
if ((cmd & 0x01) == 0) { /* read */
|
||||
if (copy_to_user((int *)arg, &data, sizeof(int))) {
|
||||
return -EFAULT;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct file_operations gio_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = gio_open, /* open */
|
||||
.release = gio_close, /* release */
|
||||
.unlocked_ioctl = gio_ioctl,
|
||||
.llseek = noop_llseek,
|
||||
};
|
||||
|
||||
static int __init gio_init(void)
|
||||
{
|
||||
int error;
|
||||
|
||||
printk(KERN_INFO "gio: driver initialized\n");
|
||||
|
||||
openCnt = 0;
|
||||
|
||||
if ((error = alloc_chrdev_region(&dev, 0, DEVCOUNT, "gio")) < 0) {
|
||||
printk(KERN_ERR
|
||||
"gio: Couldn't alloc_chrdev_region, error=%d\n",
|
||||
error);
|
||||
return 1;
|
||||
}
|
||||
|
||||
cdev_p = cdev_alloc();
|
||||
cdev_p->ops = &gio_fops;
|
||||
error = cdev_add(cdev_p, dev, DEVCOUNT);
|
||||
if (error) {
|
||||
printk(KERN_ERR
|
||||
"gio: Couldn't cdev_add, error=%d\n", error);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit gio_exit(void)
|
||||
{
|
||||
cdev_del(cdev_p);
|
||||
unregister_chrdev_region(dev, DEVCOUNT);
|
||||
}
|
||||
|
||||
module_init(gio_init);
|
||||
module_exit(gio_exit);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
66
arch/sh/boards/mach-landisk/irq.c
Normal file
66
arch/sh/boards/mach-landisk/irq.c
Normal file
|
@ -0,0 +1,66 @@
|
|||
/*
|
||||
* arch/sh/boards/mach-landisk/irq.c
|
||||
*
|
||||
* I-O DATA Device, Inc. LANDISK Support
|
||||
*
|
||||
* Copyright (C) 2005-2007 kogiidena
|
||||
* Copyright (C) 2011 Nobuhiro Iwamatsu
|
||||
*
|
||||
* Copyright (C) 2001 Ian da Silva, Jeremy Siegel
|
||||
* Based largely on io_se.c.
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/io.h>
|
||||
#include <mach-landisk/mach/iodata_landisk.h>
|
||||
|
||||
enum {
|
||||
UNUSED = 0,
|
||||
|
||||
PCI_INTA, /* PCI int A */
|
||||
PCI_INTB, /* PCI int B */
|
||||
PCI_INTC, /* PCI int C */
|
||||
PCI_INTD, /* PCI int D */
|
||||
ATA, /* ATA */
|
||||
FATA, /* CF */
|
||||
POWER, /* Power swtich */
|
||||
BUTTON, /* Button swtich */
|
||||
};
|
||||
|
||||
/* Vectors for LANDISK */
|
||||
static struct intc_vect vectors_landisk[] __initdata = {
|
||||
INTC_IRQ(PCI_INTA, IRQ_PCIINTA),
|
||||
INTC_IRQ(PCI_INTB, IRQ_PCIINTB),
|
||||
INTC_IRQ(PCI_INTC, IRQ_PCIINTC),
|
||||
INTC_IRQ(PCI_INTD, IRQ_PCIINTD),
|
||||
INTC_IRQ(ATA, IRQ_ATA),
|
||||
INTC_IRQ(FATA, IRQ_FATA),
|
||||
INTC_IRQ(POWER, IRQ_POWER),
|
||||
INTC_IRQ(BUTTON, IRQ_BUTTON),
|
||||
};
|
||||
|
||||
/* IRLMSK mask register layout for LANDISK */
|
||||
static struct intc_mask_reg mask_registers_landisk[] __initdata = {
|
||||
{ PA_IMASK, 0, 8, /* IRLMSK */
|
||||
{ BUTTON, POWER, FATA, ATA,
|
||||
PCI_INTD, PCI_INTC, PCI_INTB, PCI_INTA,
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
static DECLARE_INTC_DESC(intc_desc_landisk, "landisk", vectors_landisk, NULL,
|
||||
mask_registers_landisk, NULL, NULL);
|
||||
/*
|
||||
* Initialize IRQ setting
|
||||
*/
|
||||
void __init init_landisk_IRQ(void)
|
||||
{
|
||||
register_intc_controller(&intc_desc_landisk);
|
||||
__raw_writeb(0x00, PA_PWRINT_CLR);
|
||||
}
|
143
arch/sh/boards/mach-landisk/psw.c
Normal file
143
arch/sh/boards/mach-landisk/psw.c
Normal file
|
@ -0,0 +1,143 @@
|
|||
/*
|
||||
* arch/sh/boards/landisk/psw.c
|
||||
*
|
||||
* push switch support for LANDISK and USL-5P
|
||||
*
|
||||
* Copyright (C) 2006-2007 Paul Mundt
|
||||
* Copyright (C) 2007 kogiidena
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*/
|
||||
#include <linux/io.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <mach-landisk/mach/iodata_landisk.h>
|
||||
#include <asm/push-switch.h>
|
||||
|
||||
static irqreturn_t psw_irq_handler(int irq, void *arg)
|
||||
{
|
||||
struct platform_device *pdev = arg;
|
||||
struct push_switch *psw = platform_get_drvdata(pdev);
|
||||
struct push_switch_platform_info *psw_info = pdev->dev.platform_data;
|
||||
unsigned int sw_value;
|
||||
int ret = 0;
|
||||
|
||||
sw_value = (0x0ff & (~__raw_readb(PA_STATUS)));
|
||||
|
||||
/* Nothing to do if there's no state change */
|
||||
if (psw->state) {
|
||||
ret = 1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Figure out who raised it */
|
||||
if (sw_value & (1 << psw_info->bit)) {
|
||||
psw->state = 1;
|
||||
mod_timer(&psw->debounce, jiffies + 50);
|
||||
ret = 1;
|
||||
}
|
||||
|
||||
out:
|
||||
/* Clear the switch IRQs */
|
||||
__raw_writeb(0x00, PA_PWRINT_CLR);
|
||||
|
||||
return IRQ_RETVAL(ret);
|
||||
}
|
||||
|
||||
static struct resource psw_power_resources[] = {
|
||||
[0] = {
|
||||
.start = IRQ_POWER,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct resource psw_usl5p_resources[] = {
|
||||
[0] = {
|
||||
.start = IRQ_BUTTON,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct push_switch_platform_info psw_power_platform_data = {
|
||||
.name = "psw_power",
|
||||
.bit = 4,
|
||||
.irq_flags = IRQF_SHARED,
|
||||
.irq_handler = psw_irq_handler,
|
||||
};
|
||||
|
||||
static struct push_switch_platform_info psw1_platform_data = {
|
||||
.name = "psw1",
|
||||
.bit = 0,
|
||||
.irq_flags = IRQF_SHARED,
|
||||
.irq_handler = psw_irq_handler,
|
||||
};
|
||||
|
||||
static struct push_switch_platform_info psw2_platform_data = {
|
||||
.name = "psw2",
|
||||
.bit = 2,
|
||||
.irq_flags = IRQF_SHARED,
|
||||
.irq_handler = psw_irq_handler,
|
||||
};
|
||||
|
||||
static struct push_switch_platform_info psw3_platform_data = {
|
||||
.name = "psw3",
|
||||
.bit = 1,
|
||||
.irq_flags = IRQF_SHARED,
|
||||
.irq_handler = psw_irq_handler,
|
||||
};
|
||||
|
||||
static struct platform_device psw_power_switch_device = {
|
||||
.name = "push-switch",
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(psw_power_resources),
|
||||
.resource = psw_power_resources,
|
||||
.dev = {
|
||||
.platform_data = &psw_power_platform_data,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device psw1_switch_device = {
|
||||
.name = "push-switch",
|
||||
.id = 1,
|
||||
.num_resources = ARRAY_SIZE(psw_usl5p_resources),
|
||||
.resource = psw_usl5p_resources,
|
||||
.dev = {
|
||||
.platform_data = &psw1_platform_data,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device psw2_switch_device = {
|
||||
.name = "push-switch",
|
||||
.id = 2,
|
||||
.num_resources = ARRAY_SIZE(psw_usl5p_resources),
|
||||
.resource = psw_usl5p_resources,
|
||||
.dev = {
|
||||
.platform_data = &psw2_platform_data,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device psw3_switch_device = {
|
||||
.name = "push-switch",
|
||||
.id = 3,
|
||||
.num_resources = ARRAY_SIZE(psw_usl5p_resources),
|
||||
.resource = psw_usl5p_resources,
|
||||
.dev = {
|
||||
.platform_data = &psw3_platform_data,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device *psw_devices[] = {
|
||||
&psw_power_switch_device,
|
||||
&psw1_switch_device,
|
||||
&psw2_switch_device,
|
||||
&psw3_switch_device,
|
||||
};
|
||||
|
||||
static int __init psw_init(void)
|
||||
{
|
||||
return platform_add_devices(psw_devices, ARRAY_SIZE(psw_devices));
|
||||
}
|
||||
module_init(psw_init);
|
102
arch/sh/boards/mach-landisk/setup.c
Normal file
102
arch/sh/boards/mach-landisk/setup.c
Normal file
|
@ -0,0 +1,102 @@
|
|||
/*
|
||||
* arch/sh/boards/landisk/setup.c
|
||||
*
|
||||
* I-O DATA Device, Inc. LANDISK Support.
|
||||
*
|
||||
* Copyright (C) 2000 Kazumoto Kojima
|
||||
* Copyright (C) 2002 Paul Mundt
|
||||
* Copylight (C) 2002 Atom Create Engineering Co., Ltd.
|
||||
* Copyright (C) 2005-2007 kogiidena
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/ata_platform.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/mm.h>
|
||||
#include <asm/machvec.h>
|
||||
#include <mach-landisk/mach/iodata_landisk.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
static void landisk_power_off(void)
|
||||
{
|
||||
__raw_writeb(0x01, PA_SHUTDOWN);
|
||||
}
|
||||
|
||||
static struct resource cf_ide_resources[3];
|
||||
|
||||
static struct pata_platform_info pata_info = {
|
||||
.ioport_shift = 1,
|
||||
};
|
||||
|
||||
static struct platform_device cf_ide_device = {
|
||||
.name = "pata_platform",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(cf_ide_resources),
|
||||
.resource = cf_ide_resources,
|
||||
.dev = {
|
||||
.platform_data = &pata_info,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device rtc_device = {
|
||||
.name = "rs5c313",
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
static struct platform_device *landisk_devices[] __initdata = {
|
||||
&cf_ide_device,
|
||||
&rtc_device,
|
||||
};
|
||||
|
||||
static int __init landisk_devices_setup(void)
|
||||
{
|
||||
pgprot_t prot;
|
||||
unsigned long paddrbase;
|
||||
void *cf_ide_base;
|
||||
|
||||
/* open I/O area window */
|
||||
paddrbase = virt_to_phys((void *)PA_AREA5_IO);
|
||||
prot = PAGE_KERNEL_PCC(1, _PAGE_PCC_IO16);
|
||||
cf_ide_base = ioremap_prot(paddrbase, PAGE_SIZE, pgprot_val(prot));
|
||||
if (!cf_ide_base) {
|
||||
printk("allocate_cf_area : can't open CF I/O window!\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* IDE cmd address : 0x1f0-0x1f7 and 0x3f6 */
|
||||
cf_ide_resources[0].start = (unsigned long)cf_ide_base + 0x40;
|
||||
cf_ide_resources[0].end = (unsigned long)cf_ide_base + 0x40 + 0x0f;
|
||||
cf_ide_resources[0].flags = IORESOURCE_IO;
|
||||
cf_ide_resources[1].start = (unsigned long)cf_ide_base + 0x2c;
|
||||
cf_ide_resources[1].end = (unsigned long)cf_ide_base + 0x2c + 0x03;
|
||||
cf_ide_resources[1].flags = IORESOURCE_IO;
|
||||
cf_ide_resources[2].start = IRQ_FATA;
|
||||
cf_ide_resources[2].flags = IORESOURCE_IRQ;
|
||||
|
||||
return platform_add_devices(landisk_devices,
|
||||
ARRAY_SIZE(landisk_devices));
|
||||
}
|
||||
|
||||
device_initcall(landisk_devices_setup);
|
||||
|
||||
static void __init landisk_setup(char **cmdline_p)
|
||||
{
|
||||
/* LED ON */
|
||||
__raw_writeb(__raw_readb(PA_LED) | 0x03, PA_LED);
|
||||
|
||||
printk(KERN_INFO "I-O DATA DEVICE, INC. \"LANDISK Series\" support.\n");
|
||||
pm_power_off = landisk_power_off;
|
||||
}
|
||||
|
||||
/*
|
||||
* The Machine Vector
|
||||
*/
|
||||
static struct sh_machine_vector mv_landisk __initmv = {
|
||||
.mv_name = "LANDISK",
|
||||
.mv_setup = landisk_setup,
|
||||
.mv_init_irq = init_landisk_IRQ,
|
||||
};
|
Loading…
Add table
Add a link
Reference in a new issue