mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
Merge branch 'master' into for-next
This commit is contained in:
commit
f1bbbb6912
3859 changed files with 293114 additions and 105562 deletions
|
|
@ -633,12 +633,10 @@ static void __init cmd640_init_dev(ide_drive_t *drive)
|
|||
|
||||
static int cmd640_test_irq(ide_hwif_t *hwif)
|
||||
{
|
||||
struct pci_dev *dev = to_pci_dev(hwif->dev);
|
||||
int irq_reg = hwif->channel ? ARTTIM23 : CFR;
|
||||
u8 irq_stat, irq_mask = hwif->channel ? ARTTIM23_IDE23INTR :
|
||||
u8 irq_mask = hwif->channel ? ARTTIM23_IDE23INTR :
|
||||
CFR_IDE01INTR;
|
||||
|
||||
pci_read_config_byte(dev, irq_reg, &irq_stat);
|
||||
u8 irq_stat = get_cmd640_reg(irq_reg);
|
||||
|
||||
return (irq_stat & irq_mask) ? 1 : 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/zorro.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/amigahw.h>
|
||||
|
|
@ -23,15 +24,6 @@
|
|||
#include <asm/amigayle.h>
|
||||
|
||||
|
||||
/*
|
||||
* Bases of the IDE interfaces
|
||||
*/
|
||||
|
||||
#define GAYLE_BASE_4000 0xdd2020 /* A4000/A4000T */
|
||||
#define GAYLE_BASE_1200 0xda0000 /* A1200/A600 and E-Matrix 530 */
|
||||
|
||||
#define GAYLE_IDEREG_SIZE 0x2000
|
||||
|
||||
/*
|
||||
* Offsets from one of the above bases
|
||||
*/
|
||||
|
|
@ -68,20 +60,20 @@ MODULE_PARM_DESC(doubler, "enable support for IDE doublers");
|
|||
|
||||
static int gayle_test_irq(ide_hwif_t *hwif)
|
||||
{
|
||||
unsigned char ch;
|
||||
unsigned char ch;
|
||||
|
||||
ch = z_readb(hwif->io_ports.irq_addr);
|
||||
if (!(ch & GAYLE_IRQ_IDE))
|
||||
return 0;
|
||||
return 1;
|
||||
ch = z_readb(hwif->io_ports.irq_addr);
|
||||
if (!(ch & GAYLE_IRQ_IDE))
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void gayle_a1200_clear_irq(ide_drive_t *drive)
|
||||
{
|
||||
ide_hwif_t *hwif = drive->hwif;
|
||||
ide_hwif_t *hwif = drive->hwif;
|
||||
|
||||
(void)z_readb(hwif->io_ports.status_addr);
|
||||
z_writeb(0x7c, hwif->io_ports.irq_addr);
|
||||
(void)z_readb(hwif->io_ports.status_addr);
|
||||
z_writeb(0x7c, hwif->io_ports.irq_addr);
|
||||
}
|
||||
|
||||
static void __init gayle_setup_ports(struct ide_hw *hw, unsigned long base,
|
||||
|
|
@ -122,64 +114,89 @@ static const struct ide_port_info gayle_port_info = {
|
|||
* Probe for a Gayle IDE interface (and optionally for an IDE doubler)
|
||||
*/
|
||||
|
||||
static int __init gayle_init(void)
|
||||
static int __init amiga_gayle_ide_probe(struct platform_device *pdev)
|
||||
{
|
||||
unsigned long phys_base, res_start, res_n;
|
||||
unsigned long base, ctrlport, irqport;
|
||||
int a4000, i, rc;
|
||||
struct ide_hw hw[GAYLE_NUM_HWIFS], *hws[GAYLE_NUM_HWIFS];
|
||||
struct ide_port_info d = gayle_port_info;
|
||||
struct resource *res;
|
||||
struct gayle_ide_platform_data *pdata;
|
||||
unsigned long base, ctrlport, irqport;
|
||||
unsigned int i;
|
||||
int error;
|
||||
struct ide_hw hw[GAYLE_NUM_HWIFS], *hws[GAYLE_NUM_HWIFS];
|
||||
struct ide_port_info d = gayle_port_info;
|
||||
struct ide_host *host;
|
||||
|
||||
if (!MACH_IS_AMIGA)
|
||||
return -ENODEV;
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (!res)
|
||||
return -ENODEV;
|
||||
|
||||
if ((a4000 = AMIGAHW_PRESENT(A4000_IDE)) || AMIGAHW_PRESENT(A1200_IDE))
|
||||
goto found;
|
||||
|
||||
#ifdef CONFIG_ZORRO
|
||||
if (zorro_find_device(ZORRO_PROD_MTEC_VIPER_MK_V_E_MATRIX_530_SCSI_IDE,
|
||||
NULL))
|
||||
goto found;
|
||||
#endif
|
||||
return -ENODEV;
|
||||
|
||||
found:
|
||||
printk(KERN_INFO "ide: Gayle IDE controller (A%d style%s)\n",
|
||||
a4000 ? 4000 : 1200,
|
||||
ide_doubler ? ", IDE doubler" : "");
|
||||
|
||||
if (a4000) {
|
||||
phys_base = GAYLE_BASE_4000;
|
||||
irqport = (unsigned long)ZTWO_VADDR(GAYLE_IRQ_4000);
|
||||
d.port_ops = &gayle_a4000_port_ops;
|
||||
} else {
|
||||
phys_base = GAYLE_BASE_1200;
|
||||
irqport = (unsigned long)ZTWO_VADDR(GAYLE_IRQ_1200);
|
||||
d.port_ops = &gayle_a1200_port_ops;
|
||||
}
|
||||
|
||||
res_start = ((unsigned long)phys_base) & ~(GAYLE_NEXT_PORT-1);
|
||||
res_n = GAYLE_IDEREG_SIZE;
|
||||
|
||||
if (!request_mem_region(res_start, res_n, "IDE"))
|
||||
if (!request_mem_region(res->start, resource_size(res), "IDE"))
|
||||
return -EBUSY;
|
||||
|
||||
for (i = 0; i < GAYLE_NUM_PROBE_HWIFS; i++) {
|
||||
base = (unsigned long)ZTWO_VADDR(phys_base + i * GAYLE_NEXT_PORT);
|
||||
ctrlport = GAYLE_HAS_CONTROL_REG ? (base + GAYLE_CONTROL) : 0;
|
||||
pdata = pdev->dev.platform_data;
|
||||
pr_info("ide: Gayle IDE controller (A%u style%s)\n",
|
||||
pdata->explicit_ack ? 1200 : 4000,
|
||||
ide_doubler ? ", IDE doubler" : "");
|
||||
|
||||
gayle_setup_ports(&hw[i], base, ctrlport, irqport);
|
||||
base = (unsigned long)ZTWO_VADDR(pdata->base);
|
||||
ctrlport = 0;
|
||||
irqport = (unsigned long)ZTWO_VADDR(pdata->irqport);
|
||||
if (pdata->explicit_ack)
|
||||
d.port_ops = &gayle_a1200_port_ops;
|
||||
else
|
||||
d.port_ops = &gayle_a4000_port_ops;
|
||||
|
||||
hws[i] = &hw[i];
|
||||
}
|
||||
for (i = 0; i < GAYLE_NUM_PROBE_HWIFS; i++, base += GAYLE_NEXT_PORT) {
|
||||
if (GAYLE_HAS_CONTROL_REG)
|
||||
ctrlport = base + GAYLE_CONTROL;
|
||||
|
||||
rc = ide_host_add(&d, hws, i, NULL);
|
||||
if (rc)
|
||||
release_mem_region(res_start, res_n);
|
||||
gayle_setup_ports(&hw[i], base, ctrlport, irqport);
|
||||
hws[i] = &hw[i];
|
||||
}
|
||||
|
||||
return rc;
|
||||
error = ide_host_add(&d, hws, i, &host);
|
||||
if (error)
|
||||
goto out;
|
||||
|
||||
platform_set_drvdata(pdev, host);
|
||||
return 0;
|
||||
|
||||
out:
|
||||
release_mem_region(res->start, resource_size(res));
|
||||
return error;
|
||||
}
|
||||
|
||||
module_init(gayle_init);
|
||||
static int __exit amiga_gayle_ide_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct ide_host *host = platform_get_drvdata(pdev);
|
||||
struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
|
||||
ide_host_remove(host);
|
||||
release_mem_region(res->start, resource_size(res));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver amiga_gayle_ide_driver = {
|
||||
.remove = __exit_p(amiga_gayle_ide_remove),
|
||||
.driver = {
|
||||
.name = "amiga-gayle-ide",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init amiga_gayle_ide_init(void)
|
||||
{
|
||||
return platform_driver_probe(&amiga_gayle_ide_driver,
|
||||
amiga_gayle_ide_probe);
|
||||
}
|
||||
|
||||
module_init(amiga_gayle_ide_init);
|
||||
|
||||
static void __exit amiga_gayle_ide_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&amiga_gayle_ide_driver);
|
||||
}
|
||||
|
||||
module_exit(amiga_gayle_ide_exit);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:amiga-gayle-ide");
|
||||
|
|
|
|||
|
|
@ -407,32 +407,24 @@ static int ide_disk_get_capacity(ide_drive_t *drive)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static u64 ide_disk_set_capacity(ide_drive_t *drive, u64 capacity)
|
||||
static void ide_disk_unlock_native_capacity(ide_drive_t *drive)
|
||||
{
|
||||
u64 set = min(capacity, drive->probed_capacity);
|
||||
u16 *id = drive->id;
|
||||
int lba48 = ata_id_lba48_enabled(id);
|
||||
|
||||
if ((drive->dev_flags & IDE_DFLAG_LBA) == 0 ||
|
||||
ata_id_hpa_enabled(id) == 0)
|
||||
goto out;
|
||||
return;
|
||||
|
||||
/*
|
||||
* according to the spec the SET MAX ADDRESS command shall be
|
||||
* immediately preceded by a READ NATIVE MAX ADDRESS command
|
||||
*/
|
||||
capacity = ide_disk_hpa_get_native_capacity(drive, lba48);
|
||||
if (capacity == 0)
|
||||
goto out;
|
||||
if (!ide_disk_hpa_get_native_capacity(drive, lba48))
|
||||
return;
|
||||
|
||||
set = ide_disk_hpa_set_capacity(drive, set, lba48);
|
||||
if (set) {
|
||||
/* needed for ->resume to disable HPA */
|
||||
drive->dev_flags |= IDE_DFLAG_NOHPA;
|
||||
return set;
|
||||
}
|
||||
out:
|
||||
return drive->capacity64;
|
||||
if (ide_disk_hpa_set_capacity(drive, drive->probed_capacity, lba48))
|
||||
drive->dev_flags |= IDE_DFLAG_NOHPA; /* disable HPA on resume */
|
||||
}
|
||||
|
||||
static void idedisk_prepare_flush(struct request_queue *q, struct request *rq)
|
||||
|
|
@ -783,13 +775,13 @@ static int ide_disk_set_doorlock(ide_drive_t *drive, struct gendisk *disk,
|
|||
}
|
||||
|
||||
const struct ide_disk_ops ide_ata_disk_ops = {
|
||||
.check = ide_disk_check,
|
||||
.set_capacity = ide_disk_set_capacity,
|
||||
.get_capacity = ide_disk_get_capacity,
|
||||
.setup = ide_disk_setup,
|
||||
.flush = ide_disk_flush,
|
||||
.init_media = ide_disk_init_media,
|
||||
.set_doorlock = ide_disk_set_doorlock,
|
||||
.do_request = ide_do_rw_disk,
|
||||
.ioctl = ide_disk_ioctl,
|
||||
.check = ide_disk_check,
|
||||
.unlock_native_capacity = ide_disk_unlock_native_capacity,
|
||||
.get_capacity = ide_disk_get_capacity,
|
||||
.setup = ide_disk_setup,
|
||||
.flush = ide_disk_flush,
|
||||
.init_media = ide_disk_init_media,
|
||||
.set_doorlock = ide_disk_set_doorlock,
|
||||
.do_request = ide_do_rw_disk,
|
||||
.ioctl = ide_disk_ioctl,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -288,17 +288,14 @@ static int ide_gd_media_changed(struct gendisk *disk)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static unsigned long long ide_gd_set_capacity(struct gendisk *disk,
|
||||
unsigned long long capacity)
|
||||
static void ide_gd_unlock_native_capacity(struct gendisk *disk)
|
||||
{
|
||||
struct ide_disk_obj *idkp = ide_drv_g(disk, ide_disk_obj);
|
||||
ide_drive_t *drive = idkp->drive;
|
||||
const struct ide_disk_ops *disk_ops = drive->disk_ops;
|
||||
|
||||
if (disk_ops->set_capacity)
|
||||
return disk_ops->set_capacity(drive, capacity);
|
||||
|
||||
return drive->capacity64;
|
||||
if (disk_ops->unlock_native_capacity)
|
||||
disk_ops->unlock_native_capacity(drive);
|
||||
}
|
||||
|
||||
static int ide_gd_revalidate_disk(struct gendisk *disk)
|
||||
|
|
@ -329,7 +326,7 @@ static const struct block_device_operations ide_gd_ops = {
|
|||
.locked_ioctl = ide_gd_ioctl,
|
||||
.getgeo = ide_gd_getgeo,
|
||||
.media_changed = ide_gd_media_changed,
|
||||
.set_capacity = ide_gd_set_capacity,
|
||||
.unlock_native_capacity = ide_gd_unlock_native_capacity,
|
||||
.revalidate_disk = ide_gd_revalidate_disk
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -95,6 +95,7 @@ static int __devinit plat_ide_probe(struct platform_device *pdev)
|
|||
plat_ide_setup_ports(&hw, base, alt_base, pdata, res_irq->start);
|
||||
hw.dev = &pdev->dev;
|
||||
|
||||
d.irq_flags = res_irq->flags;
|
||||
if (mmio)
|
||||
d.host_flags |= IDE_HFLAG_MMIO;
|
||||
|
||||
|
|
|
|||
|
|
@ -93,13 +93,13 @@ static int pdc202xx_test_irq(ide_hwif_t *hwif)
|
|||
* bit 7: error, bit 6: interrupting,
|
||||
* bit 5: FIFO full, bit 4: FIFO empty
|
||||
*/
|
||||
return ((sc1d & 0x50) == 0x50) ? 1 : 0;
|
||||
return (sc1d & 0x40) ? 1 : 0;
|
||||
} else {
|
||||
/*
|
||||
* bit 3: error, bit 2: interrupting,
|
||||
* bit 1: FIFO full, bit 0: FIFO empty
|
||||
*/
|
||||
return ((sc1d & 0x05) == 0x05) ? 1 : 0;
|
||||
return (sc1d & 0x04) ? 1 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -241,6 +241,7 @@ static const struct ide_port_ops pdc20246_port_ops = {
|
|||
static const struct ide_port_ops pdc2026x_port_ops = {
|
||||
.set_pio_mode = pdc202xx_set_pio_mode,
|
||||
.set_dma_mode = pdc202xx_set_mode,
|
||||
.test_irq = pdc202xx_test_irq,
|
||||
.cable_detect = pdc2026x_cable_detect,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1153,7 +1153,7 @@ pmac_ide_macio_attach(struct macio_dev *mdev, const struct of_device_id *match)
|
|||
|
||||
if (macio_resource_count(mdev) == 0) {
|
||||
printk(KERN_WARNING "ide-pmac: no address for %s\n",
|
||||
mdev->ofdev.node->full_name);
|
||||
mdev->ofdev.dev.of_node->full_name);
|
||||
rc = -ENXIO;
|
||||
goto out_free_pmif;
|
||||
}
|
||||
|
|
@ -1161,7 +1161,7 @@ pmac_ide_macio_attach(struct macio_dev *mdev, const struct of_device_id *match)
|
|||
/* Request memory resource for IO ports */
|
||||
if (macio_request_resource(mdev, 0, "ide-pmac (ports)")) {
|
||||
printk(KERN_ERR "ide-pmac: can't request MMIO resource for "
|
||||
"%s!\n", mdev->ofdev.node->full_name);
|
||||
"%s!\n", mdev->ofdev.dev.of_node->full_name);
|
||||
rc = -EBUSY;
|
||||
goto out_free_pmif;
|
||||
}
|
||||
|
|
@ -1173,7 +1173,7 @@ pmac_ide_macio_attach(struct macio_dev *mdev, const struct of_device_id *match)
|
|||
*/
|
||||
if (macio_irq_count(mdev) == 0) {
|
||||
printk(KERN_WARNING "ide-pmac: no intrs for device %s, using "
|
||||
"13\n", mdev->ofdev.node->full_name);
|
||||
"13\n", mdev->ofdev.dev.of_node->full_name);
|
||||
irq = irq_create_mapping(NULL, 13);
|
||||
} else
|
||||
irq = macio_irq(mdev, 0);
|
||||
|
|
@ -1182,7 +1182,7 @@ pmac_ide_macio_attach(struct macio_dev *mdev, const struct of_device_id *match)
|
|||
regbase = (unsigned long) base;
|
||||
|
||||
pmif->mdev = mdev;
|
||||
pmif->node = mdev->ofdev.node;
|
||||
pmif->node = mdev->ofdev.dev.of_node;
|
||||
pmif->regbase = regbase;
|
||||
pmif->irq = irq;
|
||||
pmif->kauai_fcr = NULL;
|
||||
|
|
@ -1191,7 +1191,7 @@ pmac_ide_macio_attach(struct macio_dev *mdev, const struct of_device_id *match)
|
|||
if (macio_request_resource(mdev, 1, "ide-pmac (dma)"))
|
||||
printk(KERN_WARNING "ide-pmac: can't request DMA "
|
||||
"resource for %s!\n",
|
||||
mdev->ofdev.node->full_name);
|
||||
mdev->ofdev.dev.of_node->full_name);
|
||||
else
|
||||
pmif->dma_regs = ioremap(macio_resource_start(mdev, 1), 0x1000);
|
||||
} else
|
||||
|
|
@ -1400,8 +1400,11 @@ static struct of_device_id pmac_ide_macio_match[] =
|
|||
|
||||
static struct macio_driver pmac_ide_macio_driver =
|
||||
{
|
||||
.name = "ide-pmac",
|
||||
.match_table = pmac_ide_macio_match,
|
||||
.driver = {
|
||||
.name = "ide-pmac",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = pmac_ide_macio_match,
|
||||
},
|
||||
.probe = pmac_ide_macio_attach,
|
||||
.suspend = pmac_ide_macio_suspend,
|
||||
.resume = pmac_ide_macio_resume,
|
||||
|
|
|
|||
Loading…
Reference in a new issue