Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik...
authorLinus Torvalds <torvalds@g5.osdl.org>
Fri, 11 Nov 2005 17:25:54 +0000 (09:25 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Fri, 11 Nov 2005 17:25:54 +0000 (09:25 -0800)
178 files changed:
arch/arm/common/locomo.c
arch/arm/common/sa1111.c
arch/arm/common/scoop.c
arch/arm/mach-pxa/corgi_ssp.c
arch/arm/mach-sa1100/neponset.c
arch/powerpc/Kconfig
arch/powerpc/kernel/Makefile
arch/powerpc/kernel/asm-offsets.c
arch/powerpc/kernel/head_32.S
arch/powerpc/kernel/lparcfg.c
arch/powerpc/kernel/paca.c
arch/powerpc/kernel/proc_ppc64.c
arch/powerpc/kernel/rtas-proc.c
arch/powerpc/kernel/setup-common.c
arch/powerpc/kernel/setup_64.c
arch/powerpc/kernel/signal_32.c
arch/powerpc/kernel/smp.c
arch/powerpc/kernel/sysfs.c
arch/powerpc/kernel/time.c
arch/powerpc/kernel/traps.c
arch/powerpc/kernel/udbg.c [new file with mode: 0644]
arch/powerpc/kernel/udbg_16550.c [new file with mode: 0644]
arch/powerpc/kernel/udbg_scc.c [new file with mode: 0644]
arch/powerpc/kernel/vdso.c [new file with mode: 0644]
arch/powerpc/kernel/vdso32/Makefile [new file with mode: 0644]
arch/powerpc/kernel/vdso32/cacheflush.S [new file with mode: 0644]
arch/powerpc/kernel/vdso32/datapage.S [new file with mode: 0644]
arch/powerpc/kernel/vdso32/gettimeofday.S [new file with mode: 0644]
arch/powerpc/kernel/vdso32/note.S [new file with mode: 0644]
arch/powerpc/kernel/vdso32/sigtramp.S [new file with mode: 0644]
arch/powerpc/kernel/vdso32/vdso32.lds.S [new file with mode: 0644]
arch/powerpc/kernel/vdso32/vdso32_wrapper.S [new file with mode: 0644]
arch/powerpc/kernel/vdso64/Makefile [new file with mode: 0644]
arch/powerpc/kernel/vdso64/cacheflush.S [new file with mode: 0644]
arch/powerpc/kernel/vdso64/datapage.S [new file with mode: 0644]
arch/powerpc/kernel/vdso64/gettimeofday.S [new file with mode: 0644]
arch/powerpc/kernel/vdso64/note.S [new file with mode: 0644]
arch/powerpc/kernel/vdso64/sigtramp.S [new file with mode: 0644]
arch/powerpc/kernel/vdso64/vdso64.lds.S [new file with mode: 0644]
arch/powerpc/kernel/vdso64/vdso64_wrapper.S [new file with mode: 0644]
arch/powerpc/mm/mem.c
arch/powerpc/mm/numa.c
arch/powerpc/oprofile/op_model_power4.c
arch/powerpc/platforms/pseries/rtasd.c
arch/powerpc/platforms/pseries/setup.c
arch/powerpc/platforms/pseries/smp.c
arch/powerpc/xmon/xmon.c
arch/ppc/kernel/asm-offsets.c
arch/ppc/syslib/cpm2_pic.c
arch/ppc64/Kconfig
arch/ppc64/kernel/Makefile
arch/ppc64/kernel/misc.S
arch/ppc64/kernel/udbg.c [deleted file]
arch/ppc64/kernel/udbg_16550.c [deleted file]
arch/ppc64/kernel/udbg_scc.c [deleted file]
arch/ppc64/kernel/vdso32/Makefile [deleted file]
arch/ppc64/kernel/vdso32/cacheflush.S [deleted file]
arch/ppc64/kernel/vdso32/datapage.S [deleted file]
arch/ppc64/kernel/vdso32/gettimeofday.S [deleted file]
arch/ppc64/kernel/vdso32/note.S [deleted file]
arch/ppc64/kernel/vdso32/sigtramp.S [deleted file]
arch/ppc64/kernel/vdso32/vdso32.lds.S [deleted file]
arch/ppc64/kernel/vdso32/vdso32_wrapper.S [deleted file]
arch/ppc64/kernel/vdso64/Makefile [deleted file]
arch/ppc64/kernel/vdso64/cacheflush.S [deleted file]
arch/ppc64/kernel/vdso64/datapage.S [deleted file]
arch/ppc64/kernel/vdso64/gettimeofday.S [deleted file]
arch/ppc64/kernel/vdso64/note.S [deleted file]
arch/ppc64/kernel/vdso64/sigtramp.S [deleted file]
arch/ppc64/kernel/vdso64/vdso64.lds.S [deleted file]
arch/ppc64/kernel/vdso64/vdso64_wrapper.S [deleted file]
arch/um/drivers/net_kern.c
arch/um/drivers/ubd_kern.c
arch/xtensa/platform-iss/network.c
drivers/base/platform.c
drivers/char/ipmi/ipmi_msghandler.c
drivers/char/s3c2410-rtc.c
drivers/char/sonypi.c
drivers/char/tb0219.c
drivers/char/vr41xx_giu.c
drivers/char/vr41xx_rtc.c
drivers/char/watchdog/mpcore_wdt.c
drivers/char/watchdog/mv64x60_wdt.c
drivers/char/watchdog/s3c2410_wdt.c
drivers/hwmon/hdaps.c
drivers/i2c/busses/i2c-iop3xx.c
drivers/i2c/busses/i2c-ixp2000.c
drivers/i2c/busses/i2c-ixp4xx.c
drivers/i2c/busses/i2c-mpc.c
drivers/i2c/busses/i2c-mv64xxx.c
drivers/i2c/busses/i2c-pxa.c
drivers/i2c/busses/i2c-s3c2410.c
drivers/i2c/chips/isp1301_omap.c
drivers/input/keyboard/corgikbd.c
drivers/input/keyboard/spitzkbd.c
drivers/input/serio/i8042.c
drivers/input/serio/rpckbd.c
drivers/input/touchscreen/corgi_ts.c
drivers/mfd/mcp-sa11x0.c
drivers/misc/hdpuftrs/hdpu_cpustate.c
drivers/misc/hdpuftrs/hdpu_nexus.c
drivers/mmc/pxamci.c
drivers/mmc/wbsd.c
drivers/mtd/maps/bast-flash.c
drivers/mtd/maps/integrator-flash.c
drivers/mtd/maps/ixp2000.c
drivers/mtd/maps/ixp4xx.c
drivers/mtd/maps/omap_nor.c
drivers/mtd/maps/plat-ram.c
drivers/mtd/maps/sa1100-flash.c
drivers/mtd/nand/s3c2410.c
drivers/net/depca.c
drivers/net/dm9000.c
drivers/net/gianfar.c
drivers/net/irda/sa1100_ir.c
drivers/net/irda/smsc-ircc2.c
drivers/net/jazzsonic.c
drivers/net/macsonic.c
drivers/net/mv643xx_eth.c
drivers/net/smc91x.c
drivers/net/tokenring/proteon.c
drivers/net/tokenring/skisa.c
drivers/serial/8250.c
drivers/serial/imx.c
drivers/serial/mpc52xx_uart.c
drivers/serial/mpsc.c
drivers/serial/pxa.c
drivers/serial/s3c2410.c
drivers/serial/sa1100.c
drivers/serial/vr41xx_siu.c
drivers/usb/gadget/dummy_hcd.c
drivers/usb/gadget/lh7a40x_udc.c
drivers/usb/gadget/omap_udc.c
drivers/usb/gadget/pxa2xx_udc.c
drivers/usb/host/isp116x-hcd.c
drivers/usb/host/ohci-au1xxx.c
drivers/usb/host/ohci-lh7a404.c
drivers/usb/host/ohci-omap.c
drivers/usb/host/ohci-ppc-soc.c
drivers/usb/host/ohci-pxa27x.c
drivers/usb/host/ohci-s3c2410.c
drivers/usb/host/sl811-hcd.c
drivers/video/acornfb.c
drivers/video/arcfb.c
drivers/video/backlight/corgi_bl.c
drivers/video/dnfb.c
drivers/video/epson1355fb.c
drivers/video/gbefb.c
drivers/video/imxfb.c
drivers/video/pxafb.c
drivers/video/q40fb.c
drivers/video/s1d13xxxfb.c
drivers/video/s3c2410fb.c
drivers/video/sa1100fb.c
drivers/video/sgivwfb.c
drivers/video/vesafb.c
drivers/video/vfb.c
drivers/video/w100fb.c
include/asm-powerpc/auxvec.h
include/asm-powerpc/elf.h
include/asm-powerpc/irq.h
include/asm-powerpc/processor.h
include/asm-powerpc/sparsemem.h
include/asm-powerpc/systemcfg.h [deleted file]
include/asm-powerpc/topology.h
include/asm-powerpc/udbg.h [new file with mode: 0644]
include/asm-powerpc/vdso.h [new file with mode: 0644]
include/asm-powerpc/vdso_datapage.h [new file with mode: 0644]
include/asm-ppc/page.h
include/asm-ppc64/mmzone.h
include/asm-ppc64/page.h
include/asm-ppc64/udbg.h [deleted file]
include/asm-ppc64/vdso.h [deleted file]
include/linux/platform_device.h
net/ipv4/tcp_vegas.c
sound/arm/pxa2xx-ac97.c
sound/core/init.c
sound/core/sound.c

index ad55680726ed5b10fac7efb9852d9294d940cf26..557e52c1c869d9b15341955965f7122d37ddc355 100644 (file)
@@ -550,9 +550,9 @@ struct locomo_save_data {
        u16     LCM_SPIMD;
 };
 
-static int locomo_suspend(struct device *dev, pm_message_t state)
+static int locomo_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct locomo *lchip = dev_get_drvdata(dev);
+       struct locomo *lchip = platform_get_drvdata(dev);
        struct locomo_save_data *save;
        unsigned long flags;
 
@@ -560,7 +560,7 @@ static int locomo_suspend(struct device *dev, pm_message_t state)
        if (!save)
                return -ENOMEM;
 
-       dev->power.saved_state = (void *) save;
+       dev->dev.power.saved_state = (void *) save;
 
        spin_lock_irqsave(&lchip->lock, flags);
 
@@ -594,14 +594,14 @@ static int locomo_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int locomo_resume(struct device *dev)
+static int locomo_resume(struct platform_device *dev)
 {
-       struct locomo *lchip = dev_get_drvdata(dev);
+       struct locomo *lchip = platform_get_drvdata(dev);
        struct locomo_save_data *save;
        unsigned long r;
        unsigned long flags;
        
-       save = (struct locomo_save_data *) dev->power.saved_state;
+       save = (struct locomo_save_data *) dev->dev.power.saved_state;
        if (!save)
                return 0;
 
@@ -760,27 +760,26 @@ static void __locomo_remove(struct locomo *lchip)
        kfree(lchip);
 }
 
-static int locomo_probe(struct device *dev)
+static int locomo_probe(struct platform_device *dev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        struct resource *mem;
        int irq;
 
-       mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       mem = platform_get_resource(dev, IORESOURCE_MEM, 0);
        if (!mem)
                return -EINVAL;
-       irq = platform_get_irq(pdev, 0);
+       irq = platform_get_irq(dev, 0);
 
-       return __locomo_probe(dev, mem, irq);
+       return __locomo_probe(&dev->dev, mem, irq);
 }
 
-static int locomo_remove(struct device *dev)
+static int locomo_remove(struct platform_device *dev)
 {
-       struct locomo *lchip = dev_get_drvdata(dev);
+       struct locomo *lchip = platform__get_drvdata(dev);
 
        if (lchip) {
                __locomo_remove(lchip);
-               dev_set_drvdata(dev, NULL);
+               platform_set_drvdata(dev, NULL);
        }
 
        return 0;
@@ -792,15 +791,16 @@ static int locomo_remove(struct device *dev)
  *     the per-machine level, and then have this driver pick
  *     up the registered devices.
  */
-static struct device_driver locomo_device_driver = {
-       .name           = "locomo",
-       .bus            = &platform_bus_type,
+static struct platform_driver locomo_device_driver = {
        .probe          = locomo_probe,
        .remove         = locomo_remove,
 #ifdef CONFIG_PM
        .suspend        = locomo_suspend,
        .resume         = locomo_resume,
 #endif
+       .driver         = {
+               .name   = "locomo",
+       },
 };
 
 /*
@@ -1126,13 +1126,13 @@ static int __init locomo_init(void)
 {
        int ret = bus_register(&locomo_bus_type);
        if (ret == 0)
-               driver_register(&locomo_device_driver);
+               platform_driver_register(&locomo_device_driver);
        return ret;
 }
 
 static void __exit locomo_exit(void)
 {
-       driver_unregister(&locomo_device_driver);
+       platform_driver_unregister(&locomo_device_driver);
        bus_unregister(&locomo_bus_type);
 }
 
index 174aa86ee816b49b2e41dcd2e2cfca64b2c3abbf..7b07acb03f3ba35acad08a2241cd5a3b62619999 100644 (file)
@@ -801,9 +801,9 @@ struct sa1111_save_data {
 
 #ifdef CONFIG_PM
 
-static int sa1111_suspend(struct device *dev, pm_message_t state)
+static int sa1111_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct sa1111 *sachip = dev_get_drvdata(dev);
+       struct sa1111 *sachip = platform_get_drvdata(dev);
        struct sa1111_save_data *save;
        unsigned long flags;
        unsigned int val;
@@ -812,7 +812,7 @@ static int sa1111_suspend(struct device *dev, pm_message_t state)
        save = kmalloc(sizeof(struct sa1111_save_data), GFP_KERNEL);
        if (!save)
                return -ENOMEM;
-       dev->power.saved_state = save;
+       dev->dev.power.saved_state = save;
 
        spin_lock_irqsave(&sachip->lock, flags);
 
@@ -859,14 +859,14 @@ static int sa1111_suspend(struct device *dev, pm_message_t state)
  *     restored by their respective drivers, and must be called
  *     via LDM after this function.
  */
-static int sa1111_resume(struct device *dev)
+static int sa1111_resume(struct platform_device *dev)
 {
-       struct sa1111 *sachip = dev_get_drvdata(dev);
+       struct sa1111 *sachip = platform_get_drvdata(dev);
        struct sa1111_save_data *save;
        unsigned long flags, id;
        void __iomem *base;
 
-       save = (struct sa1111_save_data *)dev->power.saved_state;
+       save = (struct sa1111_save_data *)dev->dev.power.saved_state;
        if (!save)
                return 0;
 
@@ -879,7 +879,7 @@ static int sa1111_resume(struct device *dev)
        id = sa1111_readl(sachip->base + SA1111_SKID);
        if ((id & SKID_ID_MASK) != SKID_SA1111_ID) {
                __sa1111_remove(sachip);
-               dev_set_drvdata(dev, NULL);
+               platform_set_drvdata(dev, NULL);
                kfree(save);
                return 0;
        }
@@ -911,7 +911,7 @@ static int sa1111_resume(struct device *dev)
 
        spin_unlock_irqrestore(&sachip->lock, flags);
 
-       dev->power.saved_state = NULL;
+       dev->dev.power.saved_state = NULL;
        kfree(save);
 
        return 0;
@@ -922,9 +922,8 @@ static int sa1111_resume(struct device *dev)
 #define sa1111_resume  NULL
 #endif
 
-static int sa1111_probe(struct device *dev)
+static int sa1111_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        struct resource *mem;
        int irq;
 
@@ -933,20 +932,20 @@ static int sa1111_probe(struct device *dev)
                return -EINVAL;
        irq = platform_get_irq(pdev, 0);
 
-       return __sa1111_probe(dev, mem, irq);
+       return __sa1111_probe(&pdev->dev, mem, irq);
 }
 
-static int sa1111_remove(struct device *dev)
+static int sa1111_remove(struct platform_device *pdev)
 {
-       struct sa1111 *sachip = dev_get_drvdata(dev);
+       struct sa1111 *sachip = platform_get_drvdata(pdev);
 
        if (sachip) {
                __sa1111_remove(sachip);
-               dev_set_drvdata(dev, NULL);
+               platform_set_drvdata(pdev, NULL);
 
 #ifdef CONFIG_PM
-               kfree(dev->power.saved_state);
-               dev->power.saved_state = NULL;
+               kfree(pdev->dev.power.saved_state);
+               pdev->dev.power.saved_state = NULL;
 #endif
        }
 
@@ -962,13 +961,14 @@ static int sa1111_remove(struct device *dev)
  *     We also need to handle the SDRAM configuration for
  *     PXA250/SA1110 machine classes.
  */
-static struct device_driver sa1111_device_driver = {
-       .name           = "sa1111",
-       .bus            = &platform_bus_type,
+static struct platform_driver sa1111_device_driver = {
        .probe          = sa1111_probe,
        .remove         = sa1111_remove,
        .suspend        = sa1111_suspend,
        .resume         = sa1111_resume,
+       .driver         = {
+               .name   = "sa1111",
+       },
 };
 
 /*
@@ -1256,13 +1256,13 @@ static int __init sa1111_init(void)
 {
        int ret = bus_register(&sa1111_bus_type);
        if (ret == 0)
-               driver_register(&sa1111_device_driver);
+               platform_driver_register(&sa1111_device_driver);
        return ret;
 }
 
 static void __exit sa1111_exit(void)
 {
-       driver_unregister(&sa1111_device_driver);
+       platform_driver_unregister(&sa1111_device_driver);
        bus_unregister(&sa1111_bus_type);
 }
 
index c7fdf390cef9cbf20325431ea092d07c658f7f18..32924c6714fe54217f8db47b1cfe6684e8f3bb37 100644 (file)
@@ -98,9 +98,9 @@ static void check_scoop_reg(struct scoop_dev *sdev)
 }
 
 #ifdef CONFIG_PM
-static int scoop_suspend(struct device *dev, pm_message_t state)
+static int scoop_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct scoop_dev *sdev = dev_get_drvdata(dev);
+       struct scoop_dev *sdev = platform_get_drvdata(dev);
 
        check_scoop_reg(sdev);
        sdev->scoop_gpwr = SCOOP_REG(sdev->base, SCOOP_GPWR);
@@ -109,9 +109,9 @@ static int scoop_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int scoop_resume(struct device *dev)
+static int scoop_resume(struct platform_device *dev)
 {
-       struct scoop_dev *sdev = dev_get_drvdata(dev);
+       struct scoop_dev *sdev = platform_get_drvdata(dev);
 
        check_scoop_reg(sdev);
        SCOOP_REG(sdev->base,SCOOP_GPWR) = sdev->scoop_gpwr;
@@ -123,11 +123,10 @@ static int scoop_resume(struct device *dev)
 #define scoop_resume   NULL
 #endif
 
-int __init scoop_probe(struct device *dev)
+int __init scoop_probe(struct platform_device *pdev)
 {
        struct scoop_dev *devptr;
        struct scoop_config *inf;
-       struct platform_device *pdev = to_platform_device(dev);
        struct resource *mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 
        if (!mem)
@@ -141,7 +140,7 @@ int __init scoop_probe(struct device *dev)
        memset(devptr, 0, sizeof(struct scoop_dev));
        spin_lock_init(&devptr->scoop_lock);
 
-       inf = dev->platform_data;
+       inf = pdev->dev.platform_data;
        devptr->base = ioremap(mem->start, mem->end - mem->start + 1);
 
        if (!devptr->base) {
@@ -149,7 +148,7 @@ int __init scoop_probe(struct device *dev)
                return -ENOMEM;
        }
 
-       dev_set_drvdata(dev, devptr);
+       platform_set_drvdata(pdev, devptr);
 
        printk("Sharp Scoop Device found at 0x%08x -> 0x%08x\n",(unsigned int)mem->start,(unsigned int)devptr->base);
 
@@ -164,29 +163,30 @@ int __init scoop_probe(struct device *dev)
        return 0;
 }
 
-static int scoop_remove(struct device *dev)
+static int scoop_remove(struct platform_device *pdev)
 {
-       struct scoop_dev *sdev = dev_get_drvdata(dev);
+       struct scoop_dev *sdev = platform_get_drvdata(pdev);
        if (sdev) {
                iounmap(sdev->base);
                kfree(sdev);
-               dev_set_drvdata(dev, NULL);
+               platform_set_drvdata(pdev, NULL);
        }
        return 0;
 }
 
-static struct device_driver scoop_driver = {
-       .name           = "sharp-scoop",
-       .bus            = &platform_bus_type,
+static struct platform_driver scoop_driver = {
        .probe          = scoop_probe,
        .remove         = scoop_remove,
        .suspend        = scoop_suspend,
        .resume         = scoop_resume,
+       .driver         = {
+               .name   = "sharp-scoop",
+       },
 };
 
 int __init scoop_init(void)
 {
-       return driver_register(&scoop_driver);
+       return platform_driver_register(&scoop_driver);
 }
 
 subsys_initcall(scoop_init);
index bdf10cfa94407763b2c46a99d71dc31d7fcaf159..b371d723635f38062d907059d5b9622604148f6b 100644 (file)
@@ -191,7 +191,7 @@ void __init corgi_ssp_set_machinfo(struct corgissp_machinfo *machinfo)
        ssp_machinfo = machinfo;
 }
 
-static int __init corgi_ssp_probe(struct device *dev)
+static int __init corgi_ssp_probe(struct platform_device *dev)
 {
        int ret;
 
@@ -216,13 +216,13 @@ static int __init corgi_ssp_probe(struct device *dev)
        return ret;
 }
 
-static int corgi_ssp_remove(struct device *dev)
+static int corgi_ssp_remove(struct platform_device *dev)
 {
        ssp_exit(&corgi_ssp_dev);
        return 0;
 }
 
-static int corgi_ssp_suspend(struct device *dev, pm_message_t state)
+static int corgi_ssp_suspend(struct platform_device *dev, pm_message_t state)
 {
        ssp_flush(&corgi_ssp_dev);
        ssp_save_state(&corgi_ssp_dev,&corgi_ssp_state);
@@ -230,7 +230,7 @@ static int corgi_ssp_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int corgi_ssp_resume(struct device *dev)
+static int corgi_ssp_resume(struct platform_device *dev)
 {
        GPSR(ssp_machinfo->cs_lcdcon) = GPIO_bit(ssp_machinfo->cs_lcdcon);  /* High - Disable LCD Control/Timing Gen */
        GPSR(ssp_machinfo->cs_max1111) = GPIO_bit(ssp_machinfo->cs_max1111); /* High - Disable MAX1111*/
@@ -241,18 +241,19 @@ static int corgi_ssp_resume(struct device *dev)
        return 0;
 }
 
-static struct device_driver corgissp_driver = {
-       .name           = "corgi-ssp",
-       .bus            = &platform_bus_type,
+static struct platform_driver corgissp_driver = {
        .probe          = corgi_ssp_probe,
        .remove         = corgi_ssp_remove,
        .suspend        = corgi_ssp_suspend,
        .resume         = corgi_ssp_resume,
+       .driver         = {
+               .name   = "corgi-ssp",
+       },
 };
 
 int __init corgi_ssp_init(void)
 {
-       return driver_register(&corgissp_driver);
+       return platform_driver_register(&corgissp_driver);
 }
 
 arch_initcall(corgi_ssp_init);
index 69f1970646c628e3a9e8f68a2adddf511a16297b..9e02bc3712a00b5046245e71a13c1c99101bbcbc 100644 (file)
@@ -137,7 +137,7 @@ static struct sa1100_port_fns neponset_port_fns __initdata = {
        .get_mctrl      = neponset_get_mctrl,
 };
 
-static int neponset_probe(struct device *dev)
+static int neponset_probe(struct platform_device *dev)
 {
        sa1100_register_uart_fns(&neponset_port_fns);
 
@@ -178,27 +178,27 @@ static int neponset_probe(struct device *dev)
 /*
  * LDM power management.
  */
-static int neponset_suspend(struct device *dev, pm_message_t state)
+static int neponset_suspend(struct platform_device *dev, pm_message_t state)
 {
        /*
         * Save state.
         */
-       if (!dev->power.saved_state)
-               dev->power.saved_state = kmalloc(sizeof(unsigned int), GFP_KERNEL);
-       if (!dev->power.saved_state)
+       if (!dev->dev.power.saved_state)
+               dev->dev.power.saved_state = kmalloc(sizeof(unsigned int), GFP_KERNEL);
+       if (!dev->dev.power.saved_state)
                return -ENOMEM;
 
-       *(unsigned int *)dev->power.saved_state = NCR_0;
+       *(unsigned int *)dev->dev.power.saved_state = NCR_0;
 
        return 0;
 }
 
-static int neponset_resume(struct device *dev)
+static int neponset_resume(struct platform_device *dev)
 {
-       if (dev->power.saved_state) {
-               NCR_0 = *(unsigned int *)dev->power.saved_state;
-               kfree(dev->power.saved_state);
-               dev->power.saved_state = NULL;
+       if (dev->dev.power.saved_state) {
+               NCR_0 = *(unsigned int *)dev->dev.power.saved_state;
+               kfree(dev->dev.power.saved_state);
+               dev->dev.power.saved_state = NULL;
        }
 
        return 0;
@@ -209,12 +209,13 @@ static int neponset_resume(struct device *dev)
 #define neponset_resume  NULL
 #endif
 
-static struct device_driver neponset_device_driver = {
-       .name           = "neponset",
-       .bus            = &platform_bus_type,
+static struct platform_driver neponset_device_driver = {
        .probe          = neponset_probe,
        .suspend        = neponset_suspend,
        .resume         = neponset_resume,
+       .driver         = {
+               .name   = "neponset",
+       },
 };
 
 static struct resource neponset_resources[] = {
@@ -293,7 +294,7 @@ static struct platform_device *devices[] __initdata = {
 
 static int __init neponset_init(void)
 {
-       driver_register(&neponset_device_driver);
+       platform_driver_register(&neponset_device_driver);
 
        /*
         * The Neponset is only present on the Assabet machine type.
index ed31062029f7231e7434d436e628d3eed68fc774..c523029674e6e31a86ddcc8ad9675fea14e27de9 100644 (file)
@@ -581,17 +581,12 @@ config ARCH_FLATMEM_ENABLE
        def_bool y
        depends on PPC64 && !NUMA
 
-config ARCH_DISCONTIGMEM_ENABLE
-       def_bool y
-       depends on SMP && PPC_PSERIES
-
-config ARCH_DISCONTIGMEM_DEFAULT
+config ARCH_SPARSEMEM_ENABLE
        def_bool y
-       depends on ARCH_DISCONTIGMEM_ENABLE
 
-config ARCH_SPARSEMEM_ENABLE
+config ARCH_SPARSEMEM_DEFAULT
        def_bool y
-       depends on ARCH_DISCONTIGMEM_ENABLE
+       depends on SMP && PPC_PSERIES
 
 source "mm/Kconfig"
 
index c04bbd320594e6c032ecf75a814a5325908e05f5..9a74b7ab03a4ee7da46e3c839de790493dc6fffa 100644 (file)
@@ -12,11 +12,13 @@ CFLAGS_btext.o              += -fPIC
 endif
 
 obj-y                          := semaphore.o cputable.o ptrace.o syscalls.o \
-                                  irq.o signal_32.o pmc.o
+                                  irq.o signal_32.o pmc.o vdso.o
+obj-y                          += vdso32/
 obj-$(CONFIG_PPC64)            += setup_64.o binfmt_elf32.o sys_ppc32.o \
                                   signal_64.o ptrace32.o systbl.o \
                                   paca.o ioctl32.o cpu_setup_power4.o \
-                                  firmware.o sysfs.o
+                                  firmware.o sysfs.o udbg.o
+obj-$(CONFIG_PPC64)            += vdso64/
 obj-$(CONFIG_ALTIVEC)          += vecemu.o vector.o
 obj-$(CONFIG_POWER4)           += idle_power4.o
 obj-$(CONFIG_PPC_OF)           += of_device.o
@@ -29,6 +31,10 @@ obj-$(CONFIG_RTAS_PROC)              += rtas-proc.o
 obj-$(CONFIG_LPARCFG)          += lparcfg.o
 obj-$(CONFIG_IBMVIO)           += vio.o
 obj-$(CONFIG_GENERIC_TBSYNC)   += smp-tbsync.o
+obj-$(CONFIG_PPC_PSERIES)      += udbg_16550.o
+obj-$(CONFIG_PPC_MAPLE)                += udbg_16550.o
+udbgscc-$(CONFIG_PPC64)                := udbg_scc.o
+obj-$(CONFIG_PPC_PMAC)         += $(udbgscc-y)
 
 ifeq ($(CONFIG_PPC_MERGE),y)
 
index 8793102711a8faa7f24ac5ad2c31468e6d46e5de..4550eb4f4fbd48f2997c334f26ec8e54b262ef3d 100644 (file)
 #include <asm/cputable.h>
 #include <asm/thread_info.h>
 #include <asm/rtas.h>
+#include <asm/vdso_datapage.h>
 #ifdef CONFIG_PPC64
 #include <asm/paca.h>
 #include <asm/lppaca.h>
 #include <asm/iseries/hv_lp_event.h>
 #include <asm/cache.h>
-#include <asm/systemcfg.h>
 #include <asm/compat.h>
 #endif
 
@@ -251,25 +251,42 @@ int main(void)
 
        DEFINE(TASK_SIZE, TASK_SIZE);
        DEFINE(NUM_USER_SEGMENTS, TASK_SIZE>>28);
-#else /* CONFIG_PPC64 */
-       /* systemcfg offsets for use by vdso */
-       DEFINE(CFG_TB_ORIG_STAMP, offsetof(struct systemcfg, tb_orig_stamp));
-       DEFINE(CFG_TB_TICKS_PER_SEC, offsetof(struct systemcfg, tb_ticks_per_sec));
-       DEFINE(CFG_TB_TO_XS, offsetof(struct systemcfg, tb_to_xs));
-       DEFINE(CFG_STAMP_XSEC, offsetof(struct systemcfg, stamp_xsec));
-       DEFINE(CFG_TB_UPDATE_COUNT, offsetof(struct systemcfg, tb_update_count));
-       DEFINE(CFG_TZ_MINUTEWEST, offsetof(struct systemcfg, tz_minuteswest));
-       DEFINE(CFG_TZ_DSTTIME, offsetof(struct systemcfg, tz_dsttime));
-       DEFINE(CFG_SYSCALL_MAP32, offsetof(struct systemcfg, syscall_map_32));
-       DEFINE(CFG_SYSCALL_MAP64, offsetof(struct systemcfg, syscall_map_64));
+#endif /* ! CONFIG_PPC64 */
 
-       /* timeval/timezone offsets for use by vdso */
+       /* datapage offsets for use by vdso */
+       DEFINE(CFG_TB_ORIG_STAMP, offsetof(struct vdso_data, tb_orig_stamp));
+       DEFINE(CFG_TB_TICKS_PER_SEC, offsetof(struct vdso_data, tb_ticks_per_sec));
+       DEFINE(CFG_TB_TO_XS, offsetof(struct vdso_data, tb_to_xs));
+       DEFINE(CFG_STAMP_XSEC, offsetof(struct vdso_data, stamp_xsec));
+       DEFINE(CFG_TB_UPDATE_COUNT, offsetof(struct vdso_data, tb_update_count));
+       DEFINE(CFG_TZ_MINUTEWEST, offsetof(struct vdso_data, tz_minuteswest));
+       DEFINE(CFG_TZ_DSTTIME, offsetof(struct vdso_data, tz_dsttime));
+       DEFINE(CFG_SYSCALL_MAP32, offsetof(struct vdso_data, syscall_map_32));
+       DEFINE(WTOM_CLOCK_SEC, offsetof(struct vdso_data, wtom_clock_sec));
+       DEFINE(WTOM_CLOCK_NSEC, offsetof(struct vdso_data, wtom_clock_nsec));
+#ifdef CONFIG_PPC64
+       DEFINE(CFG_SYSCALL_MAP64, offsetof(struct vdso_data, syscall_map_64));
        DEFINE(TVAL64_TV_SEC, offsetof(struct timeval, tv_sec));
        DEFINE(TVAL64_TV_USEC, offsetof(struct timeval, tv_usec));
        DEFINE(TVAL32_TV_SEC, offsetof(struct compat_timeval, tv_sec));
        DEFINE(TVAL32_TV_USEC, offsetof(struct compat_timeval, tv_usec));
+       DEFINE(TSPC32_TV_SEC, offsetof(struct compat_timespec, tv_sec));
+       DEFINE(TSPC32_TV_NSEC, offsetof(struct compat_timespec, tv_nsec));
+#else
+       DEFINE(TVAL32_TV_SEC, offsetof(struct timeval, tv_sec));
+       DEFINE(TVAL32_TV_USEC, offsetof(struct timeval, tv_usec));
+       DEFINE(TSPEC32_TV_SEC, offsetof(struct timespec, tv_sec));
+       DEFINE(TSPEC32_TV_NSEC, offsetof(struct timespec, tv_nsec));
+#endif
+       /* timeval/timezone offsets for use by vdso */
        DEFINE(TZONE_TZ_MINWEST, offsetof(struct timezone, tz_minuteswest));
        DEFINE(TZONE_TZ_DSTTIME, offsetof(struct timezone, tz_dsttime));
-#endif /* CONFIG_PPC64 */
+
+       /* Other bits used by the vdso */
+       DEFINE(CLOCK_REALTIME, CLOCK_REALTIME);
+       DEFINE(CLOCK_MONOTONIC, CLOCK_MONOTONIC);
+       DEFINE(NSEC_PER_SEC, NSEC_PER_SEC);
+       DEFINE(CLOCK_REALTIME_RES, TICK_NSEC);
+
        return 0;
 }
index b102e3a2415e1fe339324745e4c3a6df75530a8d..ccdf94731e300c8d5f3160f5dd74d6eb9a7d3471 100644 (file)
@@ -1100,6 +1100,7 @@ start_here:
        mr      r3,r31
        mr      r4,r30
        bl      machine_init
+       bl      __save_cpu_setup
        bl      MMU_init
 
 #ifdef CONFIG_APUS
index 5e954fae031f9d9a0e62a83cf399408ff43e4da1..1b3ba8a440a6095b9ded96f591814badde7de552 100644 (file)
@@ -35,7 +35,7 @@
 #include <asm/time.h>
 #include <asm/iseries/it_exp_vpd_panel.h>
 #include <asm/prom.h>
-#include <asm/systemcfg.h>
+#include <asm/vdso_datapage.h>
 
 #define MODULE_VERS "1.6"
 #define MODULE_NAME "lparcfg"
@@ -43,7 +43,7 @@
 /* #define LPARCFG_DEBUG */
 
 /* find a better place for this function... */
-void log_plpar_hcall_return(unsigned long rc, char *tag)
+static void log_plpar_hcall_return(unsigned long rc, char *tag)
 {
        if (rc == 0)            /* success, return */
                return;
@@ -213,11 +213,10 @@ static void h_pic(unsigned long *pool_idle_time, unsigned long *num_procs)
        unsigned long dummy;
        rc = plpar_hcall(H_PIC, 0, 0, 0, 0, pool_idle_time, num_procs, &dummy);
 
-       log_plpar_hcall_return(rc, "H_PIC");
+       if (rc != H_Authority)
+               log_plpar_hcall_return(rc, "H_PIC");
 }
 
-static unsigned long get_purr(void);
-
 /* Track sum of all purrs across all processors. This is used to further */
 /* calculate usage values by different applications                       */
 
@@ -319,8 +318,6 @@ static void parse_system_parameter_string(struct seq_file *m)
        kfree(local_buffer);
 }
 
-static int lparcfg_count_active_processors(void);
-
 /* Return the number of processors in the system.
  * This function reads through the device tree and counts
  * the virtual processors, this does not include threads.
@@ -372,7 +369,7 @@ static int lparcfg_data(struct seq_file *m, void *v)
        lrdrp = (int *)get_property(rtas_node, "ibm,lrdr-capacity", NULL);
 
        if (lrdrp == NULL) {
-               partition_potential_processors = _systemcfg->processorCount;
+               partition_potential_processors = vdso_data->processorCount;
        } else {
                partition_potential_processors = *(lrdrp + 4);
        }
@@ -548,7 +545,7 @@ static ssize_t lparcfg_write(struct file *file, const char __user * buf,
                retval = -EIO;
        }
 
-      out:
+out:
        kfree(kbuf);
        return retval;
 }
@@ -561,10 +558,10 @@ static int lparcfg_open(struct inode *inode, struct file *file)
 }
 
 struct file_operations lparcfg_fops = {
-      .owner   = THIS_MODULE,
-      .read    = seq_read,
-      .open    = lparcfg_open,
-      .release = single_release,
+       .owner          = THIS_MODULE,
+       .read           = seq_read,
+       .open           = lparcfg_open,
+       .release        = single_release,
 };
 
 int __init lparcfg_init(void)
index 3cf2517c5f91171a46fff1ea4586064f64614c4f..a7b68f911eb130b0dcadf2fce7840ef9a12aa0bd 100644 (file)
 #include <asm/processor.h>
 #include <asm/ptrace.h>
 #include <asm/page.h>
-#include <asm/systemcfg.h>
 #include <asm/lppaca.h>
 #include <asm/iseries/it_lp_queue.h>
 #include <asm/paca.h>
 
-static union {
-       struct systemcfg        data;
-       u8                      page[PAGE_SIZE];
-} systemcfg_store __attribute__((__section__(".data.page.aligned")));
-struct systemcfg *_systemcfg = &systemcfg_store.data;
-
 
 /* This symbol is provided by the linker - let it fill in the paca
  * field correctly */
index a1c19502fe8bb9f96e35261a97d87e95add7c919..7ba42a405f41fd8fc32429f3d720fb94bcd22944 100644 (file)
@@ -23,7 +23,7 @@
 #include <linux/slab.h>
 #include <linux/kernel.h>
 
-#include <asm/systemcfg.h>
+#include <asm/vdso_datapage.h>
 #include <asm/rtas.h>
 #include <asm/uaccess.h>
 #include <asm/prom.h>
@@ -72,7 +72,7 @@ static int __init proc_ppc64_init(void)
        if (!pde)
                return 1;
        pde->nlink = 1;
-       pde->data = _systemcfg;
+       pde->data = vdso_data;
        pde->size = PAGE_SIZE;
        pde->proc_fops = &page_map_fops;
 
index ae1a36449ccdd0b9e8039b1d8b73b8f92695988f..7a95b8a283548cfca73e75f76ad74c1a77744ca4 100644 (file)
@@ -32,7 +32,6 @@
 #include <asm/rtas.h>
 #include <asm/machdep.h> /* for ppc_md */
 #include <asm/time.h>
-#include <asm/systemcfg.h>
 
 /* Token for Sensors */
 #define KEY_SWITCH             0x0001
index bae4bff138f1ebe3e1fdb02924026713b0399b80..33e7f2c7f194b6e28324dad030acf64da7ab032b 100644 (file)
@@ -33,7 +33,7 @@
 #include <asm/io.h>
 #include <asm/prom.h>
 #include <asm/processor.h>
-#include <asm/systemcfg.h>
+#include <asm/vdso_datapage.h>
 #include <asm/pgtable.h>
 #include <asm/smp.h>
 #include <asm/elf.h>
@@ -444,10 +444,8 @@ void __init check_for_initrd(void)
        if (initrd_start >= KERNELBASE && initrd_end >= KERNELBASE &&
            initrd_end > initrd_start)
                ROOT_DEV = Root_RAM0;
-       else {
-               printk("Bogus initrd %08lx %08lx\n", initrd_start, initrd_end);
+       else
                initrd_start = initrd_end = 0;
-       }
 
        if (initrd_start)
                printk("Found initrd at 0x%lx:0x%lx\n", initrd_start, initrd_end);
@@ -566,7 +564,7 @@ void __init smp_setup_cpu_maps(void)
                        cpu_set(cpu ^ 0x1, cpu_sibling_map[cpu]);
        }
 
-       _systemcfg->processorCount = num_present_cpus();
+       vdso_data->processorCount = num_present_cpus();
 #endif /* CONFIG_PPC64 */
 }
 #endif /* CONFIG_SMP */
index 6791668213e75997ba229544d7b421a5cfe1bc6f..fdbd9f9122f2a69e5212aa30857e6330826cb5e5 100644 (file)
@@ -57,7 +57,6 @@
 #include <asm/lmb.h>
 #include <asm/iseries/it_lp_naca.h>
 #include <asm/firmware.h>
-#include <asm/systemcfg.h>
 #include <asm/xmon.h>
 #include <asm/udbg.h>
 
@@ -375,9 +374,8 @@ static void __init initialize_cache_info(void)
                                DBG("Argh, can't find dcache properties ! "
                                    "sizep: %p, lsizep: %p\n", sizep, lsizep);
 
-                       _systemcfg->dcache_size = ppc64_caches.dsize = size;
-                       _systemcfg->dcache_line_size =
-                               ppc64_caches.dline_size = lsize;
+                       ppc64_caches.dsize = size;
+                       ppc64_caches.dline_size = lsize;
                        ppc64_caches.log_dline_size = __ilog2(lsize);
                        ppc64_caches.dlines_per_page = PAGE_SIZE / lsize;
 
@@ -393,22 +391,13 @@ static void __init initialize_cache_info(void)
                                DBG("Argh, can't find icache properties ! "
                                    "sizep: %p, lsizep: %p\n", sizep, lsizep);
 
-                       _systemcfg->icache_size = ppc64_caches.isize = size;
-                       _systemcfg->icache_line_size =
-                               ppc64_caches.iline_size = lsize;
+                       ppc64_caches.isize = size;
+                       ppc64_caches.iline_size = lsize;
                        ppc64_caches.log_iline_size = __ilog2(lsize);
                        ppc64_caches.ilines_per_page = PAGE_SIZE / lsize;
                }
        }
 
-       /* Add an eye catcher and the systemcfg layout version number */
-       strcpy(_systemcfg->eye_catcher, "SYSTEMCFG:PPC64");
-       _systemcfg->version.major = SYSTEMCFG_MAJOR;
-       _systemcfg->version.minor = SYSTEMCFG_MINOR;
-       _systemcfg->processor = mfspr(SPRN_PVR);
-       _systemcfg->platform = _machine;
-       _systemcfg->physicalMemorySize = lmb_phys_mem_size();
-
        DBG(" <- initialize_cache_info()\n");
 }
 
@@ -495,15 +484,14 @@ void __init setup_system(void)
 
        printk("-----------------------------------------------------\n");
        printk("ppc64_pft_size                = 0x%lx\n", ppc64_pft_size);
-       printk("ppc64_interrupt_controller    = 0x%ld\n", ppc64_interrupt_controller);
-       printk("systemcfg                     = 0x%p\n", _systemcfg);
-       printk("systemcfg->platform           = 0x%x\n", _systemcfg->platform);
-       printk("systemcfg->processorCount     = 0x%lx\n", _systemcfg->processorCount);
-       printk("systemcfg->physicalMemorySize = 0x%lx\n", _systemcfg->physicalMemorySize);
+       printk("ppc64_interrupt_controller    = 0x%ld\n",
+              ppc64_interrupt_controller);
+       printk("platform                      = 0x%x\n", _machine);
+       printk("physicalMemorySize            = 0x%lx\n", lmb_phys_mem_size());
        printk("ppc64_caches.dcache_line_size = 0x%x\n",
-                       ppc64_caches.dline_size);
+              ppc64_caches.dline_size);
        printk("ppc64_caches.icache_line_size = 0x%x\n",
-                       ppc64_caches.iline_size);
+              ppc64_caches.iline_size);
        printk("htab_address                  = 0x%p\n", htab_address);
        printk("htab_hash_mask                = 0x%lx\n", htab_hash_mask);
        printk("-----------------------------------------------------\n");
@@ -567,33 +555,6 @@ static void __init emergency_stack_init(void)
                __va(lmb_alloc_base(HW_PAGE_SIZE, 128, limit)) + HW_PAGE_SIZE;
 }
 
-/*
- * Called from setup_arch to initialize the bitmap of available
- * syscalls in the systemcfg page
- */
-void __init setup_syscall_map(void)
-{
-       unsigned int i, count64 = 0, count32 = 0;
-       extern unsigned long *sys_call_table;
-       extern unsigned long sys_ni_syscall;
-
-
-       for (i = 0; i < __NR_syscalls; i++) {
-               if (sys_call_table[i*2] != sys_ni_syscall) {
-                       count64++;
-                       _systemcfg->syscall_map_64[i >> 5] |=
-                               0x80000000UL >> (i & 0x1f);
-               }
-               if (sys_call_table[i*2+1] != sys_ni_syscall) {
-                       count32++;
-                       _systemcfg->syscall_map_32[i >> 5] |=
-                               0x80000000UL >> (i & 0x1f);
-               }
-       }
-       printk(KERN_INFO "Syscall map setup, %d 32-bit and %d 64-bit syscalls\n",
-              count32, count64);
-}
-
 /*
  * Called into from start_kernel, after lock_kernel has been called.
  * Initializes bootmem, which is unsed to manage page allocation until
@@ -635,9 +596,6 @@ void __init setup_arch(char **cmdline_p)
        do_init_bootmem();
        sparse_init();
 
-       /* initialize the syscall map in systemcfg */
-       setup_syscall_map();
-
 #ifdef CONFIG_DUMMY_CONSOLE
        conswitchp = &dummy_con;
 #endif
index a7c4515f320fc30b968e70118c6f6bb63db45b95..8bdf95b7e4203ecc8df88853b419fc6a5260651d 100644 (file)
 #include <asm/uaccess.h>
 #include <asm/cacheflush.h>
 #include <asm/sigcontext.h>
+#include <asm/vdso.h>
 #ifdef CONFIG_PPC64
 #include "ppc32.h"
 #include <asm/unistd.h>
-#include <asm/vdso.h>
 #else
 #include <asm/ucontext.h>
 #include <asm/pgtable.h>
@@ -809,14 +809,11 @@ static int handle_rt_signal(unsigned long sig, struct k_sigaction *ka,
 
        /* Save user registers on the stack */
        frame = &rt_sf->uc.uc_mcontext;
-#ifdef CONFIG_PPC64
        if (vdso32_rt_sigtramp && current->thread.vdso_base) {
                if (save_user_regs(regs, frame, 0))
                        goto badframe;
                regs->link = current->thread.vdso_base + vdso32_rt_sigtramp;
-       } else
-#endif
-       {
+       } else {
                if (save_user_regs(regs, frame, __NR_rt_sigreturn))
                        goto badframe;
                regs->link = (unsigned long) frame->tramp;
@@ -1090,14 +1087,11 @@ static int handle_signal(unsigned long sig, struct k_sigaction *ka,
            || __put_user(sig, &sc->signal))
                goto badframe;
 
-#ifdef CONFIG_PPC64
        if (vdso32_sigtramp && current->thread.vdso_base) {
                if (save_user_regs(regs, &frame->mctx, 0))
                        goto badframe;
                regs->link = current->thread.vdso_base + vdso32_sigtramp;
-       } else
-#endif
-       {
+       } else {
                if (save_user_regs(regs, &frame->mctx, __NR_sigreturn))
                        goto badframe;
                regs->link = (unsigned long) frame->mctx.tramp;
index e28a139c29d04322f34f19ecfd0e419890a236c3..62dfc5b8d765c7251c0a469ed596f5cad11d9e60 100644 (file)
@@ -44,7 +44,7 @@
 #include <asm/cputable.h>
 #include <asm/system.h>
 #include <asm/mpic.h>
-#include <asm/systemcfg.h>
+#include <asm/vdso_datapage.h>
 #ifdef CONFIG_PPC64
 #include <asm/paca.h>
 #endif
@@ -371,7 +371,7 @@ int generic_cpu_disable(void)
 
        cpu_clear(cpu, cpu_online_map);
 #ifdef CONFIG_PPC64
-       _systemcfg->processorCount--;
+       vdso_data->processorCount--;
        fixup_irqs(cpu_online_map);
 #endif
        return 0;
index 850af198fb5f6eb2f5636da7e3f1344cc0d592c3..0f0c3a9ae2e5df8017d2018098206f0f344eb7a3 100644 (file)
@@ -16,7 +16,6 @@
 #include <asm/firmware.h>
 #include <asm/hvcall.h>
 #include <asm/prom.h>
-#include <asm/systemcfg.h>
 #include <asm/paca.h>
 #include <asm/lppaca.h>
 #include <asm/machdep.h>
index 260b6ecd26a9d61f72f7aa42a29455a11a3d6e61..070b4b458aafe73f9de49d0005ab23d6484fefc6 100644 (file)
@@ -62,8 +62,8 @@
 #include <asm/irq.h>
 #include <asm/div64.h>
 #include <asm/smp.h>
+#include <asm/vdso_datapage.h>
 #ifdef CONFIG_PPC64
-#include <asm/systemcfg.h>
 #include <asm/firmware.h>
 #endif
 #ifdef CONFIG_PPC_ISERIES
@@ -261,7 +261,6 @@ static inline void update_gtod(u64 new_tb_stamp, u64 new_stamp_xsec,
        do_gtod.varp = temp_varp;
        do_gtod.var_idx = temp_idx;
 
-#ifdef CONFIG_PPC64
        /*
         * tb_update_count is used to allow the userspace gettimeofday code
         * to assure itself that it sees a consistent view of the tb_to_xs and
@@ -271,14 +270,15 @@ static inline void update_gtod(u64 new_tb_stamp, u64 new_stamp_xsec,
         * tb_to_xs and stamp_xsec values are consistent.  If not, then it
         * loops back and reads them again until this criteria is met.
         */
-       ++(_systemcfg->tb_update_count);
+       ++(vdso_data->tb_update_count);
        smp_wmb();
-       _systemcfg->tb_orig_stamp = new_tb_stamp;
-       _systemcfg->stamp_xsec = new_stamp_xsec;
-       _systemcfg->tb_to_xs = new_tb_to_xs;
+       vdso_data->tb_orig_stamp = new_tb_stamp;
+       vdso_data->stamp_xsec = new_stamp_xsec;
+       vdso_data->tb_to_xs = new_tb_to_xs;
+       vdso_data->wtom_clock_sec = wall_to_monotonic.tv_sec;
+       vdso_data->wtom_clock_nsec = wall_to_monotonic.tv_nsec;
        smp_wmb();
-       ++(_systemcfg->tb_update_count);
-#endif
+       ++(vdso_data->tb_update_count);
 }
 
 /*
@@ -357,9 +357,8 @@ static void iSeries_tb_recal(void)
                                do_gtod.tb_ticks_per_sec = tb_ticks_per_sec;
                                tb_to_xs = divres.result_low;
                                do_gtod.varp->tb_to_xs = tb_to_xs;
-                               _systemcfg->tb_ticks_per_sec =
-                                       tb_ticks_per_sec;
-                               _systemcfg->tb_to_xs = tb_to_xs;
+                               vdso_data->tb_ticks_per_sec = tb_ticks_per_sec;
+                               vdso_data->tb_to_xs = tb_to_xs;
                        }
                        else {
                                printk( "Titan recalibrate: FAILED (difference > 4 percent)\n"
@@ -561,10 +560,8 @@ int do_settimeofday(struct timespec *tv)
        new_xsec += (u64)new_sec * XSEC_PER_SEC - tb_delta_xs;
        update_gtod(tb_last_jiffy, new_xsec, do_gtod.varp->tb_to_xs);
 
-#ifdef CONFIG_PPC64
-       _systemcfg->tz_minuteswest = sys_tz.tz_minuteswest;
-       _systemcfg->tz_dsttime = sys_tz.tz_dsttime;
-#endif
+       vdso_data->tz_minuteswest = sys_tz.tz_minuteswest;
+       vdso_data->tz_dsttime = sys_tz.tz_dsttime;
 
        write_sequnlock_irqrestore(&xtime_lock, flags);
        clock_was_set();
@@ -713,13 +710,12 @@ void __init time_init(void)
        do_gtod.tb_ticks_per_sec = tb_ticks_per_sec;
        do_gtod.varp->tb_to_xs = tb_to_xs;
        do_gtod.tb_to_us = tb_to_us;
-#ifdef CONFIG_PPC64
-       _systemcfg->tb_orig_stamp = tb_last_jiffy;
-       _systemcfg->tb_update_count = 0;
-       _systemcfg->tb_ticks_per_sec = tb_ticks_per_sec;
-       _systemcfg->stamp_xsec = xtime.tv_sec * XSEC_PER_SEC;
-       _systemcfg->tb_to_xs = tb_to_xs;
-#endif
+
+       vdso_data->tb_orig_stamp = tb_last_jiffy;
+       vdso_data->tb_update_count = 0;
+       vdso_data->tb_ticks_per_sec = tb_ticks_per_sec;
+       vdso_data->stamp_xsec = xtime.tv_sec * XSEC_PER_SEC;
+       vdso_data->tb_to_xs = tb_to_xs;
 
        time_freq = 0;
 
index 2020bb7648fbc183f2f599ac6c834a2b4d7ed3f9..1511454c4690bafd1a9020afb4c3059180d068c2 100644 (file)
@@ -49,7 +49,6 @@
 #ifdef CONFIG_PPC64
 #include <asm/firmware.h>
 #include <asm/processor.h>
-#include <asm/systemcfg.h>
 #endif
 
 #ifdef CONFIG_PPC64    /* XXX */
diff --git a/arch/powerpc/kernel/udbg.c b/arch/powerpc/kernel/udbg.c
new file mode 100644 (file)
index 0000000..0d878e7
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+ * polling mode stateless debugging stuff, originally for NS16550 Serial Ports
+ *
+ * c 2001 PPC 64 Team, IBM Corp
+ *
+ *      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; either version
+ *      2 of the License, or (at your option) any later version.
+ */
+
+#include <stdarg.h>
+#include <linux/config.h>
+#include <linux/types.h>
+#include <linux/sched.h>
+#include <linux/console.h>
+#include <asm/processor.h>
+
+void (*udbg_putc)(unsigned char c);
+unsigned char (*udbg_getc)(void);
+int (*udbg_getc_poll)(void);
+
+/* udbg library, used by xmon et al */
+void udbg_puts(const char *s)
+{
+       if (udbg_putc) {
+               char c;
+
+               if (s && *s != '\0') {
+                       while ((c = *s++) != '\0')
+                               udbg_putc(c);
+               }
+       }
+#if 0
+       else {
+               printk("%s", s);
+       }
+#endif
+}
+
+int udbg_write(const char *s, int n)
+{
+       int remain = n;
+       char c;
+
+       if (!udbg_putc)
+               return 0;
+
+       if (s && *s != '\0') {
+               while (((c = *s++) != '\0') && (remain-- > 0)) {
+                       udbg_putc(c);
+               }
+       }
+
+       return n - remain;
+}
+
+int udbg_read(char *buf, int buflen)
+{
+       char c, *p = buf;
+       int i;
+
+       if (!udbg_getc)
+               return 0;
+
+       for (i = 0; i < buflen; ++i) {
+               do {
+                       c = udbg_getc();
+               } while (c == 0x11 || c == 0x13);
+               if (c == 0)
+                       break;
+               *p++ = c;
+       }
+
+       return i;
+}
+
+#define UDBG_BUFSIZE 256
+void udbg_printf(const char *fmt, ...)
+{
+       unsigned char buf[UDBG_BUFSIZE];
+       va_list args;
+
+       va_start(args, fmt);
+       vsnprintf(buf, UDBG_BUFSIZE, fmt, args);
+       udbg_puts(buf);
+       va_end(args);
+}
+
+/*
+ * Early boot console based on udbg
+ */
+static void udbg_console_write(struct console *con, const char *s,
+               unsigned int n)
+{
+       udbg_write(s, n);
+}
+
+static struct console udbg_console = {
+       .name   = "udbg",
+       .write  = udbg_console_write,
+       .flags  = CON_PRINTBUFFER,
+       .index  = -1,
+};
+
+static int early_console_initialized;
+
+void __init disable_early_printk(void)
+{
+       if (!early_console_initialized)
+               return;
+       unregister_console(&udbg_console);
+       early_console_initialized = 0;
+}
+
+/* called by setup_system */
+void register_early_udbg_console(void)
+{
+       early_console_initialized = 1;
+       register_console(&udbg_console);
+}
+
+#if 0   /* if you want to use this as a regular output console */
+console_initcall(register_udbg_console);
+#endif
diff --git a/arch/powerpc/kernel/udbg_16550.c b/arch/powerpc/kernel/udbg_16550.c
new file mode 100644 (file)
index 0000000..9313574
--- /dev/null
@@ -0,0 +1,123 @@
+/*
+ * udbg for for NS16550 compatable serial ports
+ *
+ * Copyright (C) 2001-2005 PPC 64 Team, IBM Corp
+ *
+ *      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; either version
+ *      2 of the License, or (at your option) any later version.
+ */
+#include <linux/config.h>
+#include <linux/types.h>
+#include <asm/udbg.h>
+#include <asm/io.h>
+
+extern u8 real_readb(volatile u8 __iomem  *addr);
+extern void real_writeb(u8 data, volatile u8 __iomem *addr);
+
+struct NS16550 {
+       /* this struct must be packed */
+       unsigned char rbr;  /* 0 */
+       unsigned char ier;  /* 1 */
+       unsigned char fcr;  /* 2 */
+       unsigned char lcr;  /* 3 */
+       unsigned char mcr;  /* 4 */
+       unsigned char lsr;  /* 5 */
+       unsigned char msr;  /* 6 */
+       unsigned char scr;  /* 7 */
+};
+
+#define thr rbr
+#define iir fcr
+#define dll rbr
+#define dlm ier
+#define dlab lcr
+
+#define LSR_DR   0x01  /* Data ready */
+#define LSR_OE   0x02  /* Overrun */
+#define LSR_PE   0x04  /* Parity error */
+#define LSR_FE   0x08  /* Framing error */
+#define LSR_BI   0x10  /* Break */
+#define LSR_THRE 0x20  /* Xmit holding register empty */
+#define LSR_TEMT 0x40  /* Xmitter empty */
+#define LSR_ERR  0x80  /* Error */
+
+static volatile struct NS16550 __iomem *udbg_comport;
+
+static void udbg_550_putc(unsigned char c)
+{
+       if (udbg_comport) {
+               while ((in_8(&udbg_comport->lsr) & LSR_THRE) == 0)
+                       /* wait for idle */;
+               out_8(&udbg_comport->thr, c);
+               if (c == '\n')
+                       udbg_550_putc('\r');
+       }
+}
+
+static int udbg_550_getc_poll(void)
+{
+       if (udbg_comport) {
+               if ((in_8(&udbg_comport->lsr) & LSR_DR) != 0)
+                       return in_8(&udbg_comport->rbr);
+               else
+                       return -1;
+       }
+       return -1;
+}
+
+static unsigned char udbg_550_getc(void)
+{
+       if (udbg_comport) {
+               while ((in_8(&udbg_comport->lsr) & LSR_DR) == 0)
+                       /* wait for char */;
+               return in_8(&udbg_comport->rbr);
+       }
+       return 0;
+}
+
+void udbg_init_uart(void __iomem *comport, unsigned int speed)
+{
+       u16 dll = speed ? (115200 / speed) : 12;
+
+       if (comport) {
+               udbg_comport = (struct NS16550 __iomem *)comport;
+               out_8(&udbg_comport->lcr, 0x00);
+               out_8(&udbg_comport->ier, 0xff);
+               out_8(&udbg_comport->ier, 0x00);
+               out_8(&udbg_comport->lcr, 0x80);        /* Access baud rate */
+               out_8(&udbg_comport->dll, dll & 0xff);  /* 1 = 115200,  2 = 57600,
+                                                          3 = 38400, 12 = 9600 baud */
+               out_8(&udbg_comport->dlm, dll >> 8);    /* dll >> 8 which should be zero
+                                                          for fast rates; */
+               out_8(&udbg_comport->lcr, 0x03);        /* 8 data, 1 stop, no parity */
+               out_8(&udbg_comport->mcr, 0x03);        /* RTS/DTR */
+               out_8(&udbg_comport->fcr ,0x07);        /* Clear & enable FIFOs */
+               udbg_putc = udbg_550_putc;
+               udbg_getc = udbg_550_getc;
+               udbg_getc_poll = udbg_550_getc_poll;
+       }
+}
+
+#ifdef CONFIG_PPC_MAPLE
+void udbg_maple_real_putc(unsigned char c)
+{
+       if (udbg_comport) {
+               while ((real_readb(&udbg_comport->lsr) & LSR_THRE) == 0)
+                       /* wait for idle */;
+               real_writeb(c, &udbg_comport->thr); eieio();
+               if (c == '\n')
+                       udbg_maple_real_putc('\r');
+       }
+}
+
+void udbg_init_maple_realmode(void)
+{
+       udbg_comport = (volatile struct NS16550 __iomem *)0xf40003f8;
+
+       udbg_putc = udbg_maple_real_putc;
+       udbg_getc = NULL;
+       udbg_getc_poll = NULL;
+}
+#endif /* CONFIG_PPC_MAPLE */
diff --git a/arch/powerpc/kernel/udbg_scc.c b/arch/powerpc/kernel/udbg_scc.c
new file mode 100644 (file)
index 0000000..820c535
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+ * udbg for for zilog scc ports as found on Apple PowerMacs
+ *
+ * Copyright (C) 2001-2005 PPC 64 Team, IBM Corp
+ *
+ *      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; either version
+ *      2 of the License, or (at your option) any later version.
+ */
+#include <linux/config.h>
+#include <linux/types.h>
+#include <asm/udbg.h>
+#include <asm/processor.h>
+#include <asm/io.h>
+#include <asm/prom.h>
+#include <asm/pmac_feature.h>
+
+extern u8 real_readb(volatile u8 __iomem  *addr);
+extern void real_writeb(u8 data, volatile u8 __iomem *addr);
+
+#define        SCC_TXRDY       4
+#define SCC_RXRDY      1
+
+static volatile u8 __iomem *sccc;
+static volatile u8 __iomem *sccd;
+
+static void udbg_scc_putc(unsigned char c)
+{
+       if (sccc) {
+               while ((in_8(sccc) & SCC_TXRDY) == 0)
+                       ;
+               out_8(sccd,  c);
+               if (c == '\n')
+                       udbg_scc_putc('\r');
+       }
+}
+
+static int udbg_scc_getc_poll(void)
+{
+       if (sccc) {
+               if ((in_8(sccc) & SCC_RXRDY) != 0)
+                       return in_8(sccd);
+               else
+                       return -1;
+       }
+       return -1;
+}
+
+static unsigned char udbg_scc_getc(void)
+{
+       if (sccc) {
+               while ((in_8(sccc) & SCC_RXRDY) == 0)
+                       ;
+               return in_8(sccd);
+       }
+       return 0;
+}
+
+static unsigned char scc_inittab[] = {
+    13, 0,             /* set baud rate divisor */
+    12, 0,
+    14, 1,             /* baud rate gen enable, src=rtxc */
+    11, 0x50,          /* clocks = br gen */
+    5,  0xea,          /* tx 8 bits, assert DTR & RTS */
+    4,  0x46,          /* x16 clock, 1 stop */
+    3,  0xc1,          /* rx enable, 8 bits */
+};
+
+void udbg_init_scc(struct device_node *np)
+{
+       u32 *reg;
+       unsigned long addr;
+       int i, x;
+
+       if (np == NULL)
+               np = of_find_node_by_name(NULL, "escc");
+       if (np == NULL || np->parent == NULL)
+               return;
+
+       udbg_printf("found SCC...\n");
+       /* Get address within mac-io ASIC */
+       reg = (u32 *)get_property(np, "reg", NULL);
+       if (reg == NULL)
+               return;
+       addr = reg[0];
+       udbg_printf("local addr: %lx\n", addr);
+       /* Get address of mac-io PCI itself */
+       reg = (u32 *)get_property(np->parent, "assigned-addresses", NULL);
+       if (reg == NULL)
+               return;
+       addr += reg[2];
+       udbg_printf("final addr: %lx\n", addr);
+
+       /* Setup for 57600 8N1 */
+       addr += 0x20;
+       sccc = (volatile u8 * __iomem) ioremap(addr & PAGE_MASK, PAGE_SIZE) ;
+       sccc += addr & ~PAGE_MASK;
+       sccd = sccc + 0x10;
+
+       udbg_printf("ioremap result sccc: %p\n", sccc);
+       mb();
+
+       for (i = 20000; i != 0; --i)
+               x = in_8(sccc);
+       out_8(sccc, 0x09);              /* reset A or B side */
+       out_8(sccc, 0xc0);
+       for (i = 0; i < sizeof(scc_inittab); ++i)
+               out_8(sccc, scc_inittab[i]);
+
+       udbg_putc = udbg_scc_putc;
+       udbg_getc = udbg_scc_getc;
+       udbg_getc_poll = udbg_scc_getc_poll;
+
+       udbg_puts("Hello World !\n");
+}
+
+static void udbg_real_scc_putc(unsigned char c)
+{
+       while ((real_readb(sccc) & SCC_TXRDY) == 0)
+               ;
+       real_writeb(c, sccd);
+       if (c == '\n')
+               udbg_real_scc_putc('\r');
+}
+
+void udbg_init_pmac_realmode(void)
+{
+       sccc = (volatile u8 __iomem *)0x80013020ul;
+       sccd = (volatile u8 __iomem *)0x80013030ul;
+
+       udbg_putc = udbg_real_scc_putc;
+       udbg_getc = NULL;
+       udbg_getc_poll = NULL;
+}
diff --git a/arch/powerpc/kernel/vdso.c b/arch/powerpc/kernel/vdso.c
new file mode 100644 (file)
index 0000000..0d4d8be
--- /dev/null
@@ -0,0 +1,746 @@
+/*
+ *  linux/arch/ppc64/kernel/vdso.c
+ *
+ *    Copyright (C) 2004 Benjamin Herrenschmidt, IBM Corp.
+ *                      <benh@kernel.crashing.org>
+ *
+ *  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; either version
+ *  2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/errno.h>
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/smp.h>
+#include <linux/smp_lock.h>
+#include <linux/stddef.h>
+#include <linux/unistd.h>
+#include <linux/slab.h>
+#include <linux/user.h>
+#include <linux/elf.h>
+#include <linux/security.h>
+#include <linux/bootmem.h>
+
+#include <asm/pgtable.h>
+#include <asm/system.h>
+#include <asm/processor.h>
+#include <asm/mmu.h>
+#include <asm/mmu_context.h>
+#include <asm/lmb.h>
+#include <asm/machdep.h>
+#include <asm/cputable.h>
+#include <asm/sections.h>
+#include <asm/vdso.h>
+#include <asm/vdso_datapage.h>
+
+#undef DEBUG
+
+#ifdef DEBUG
+#define DBG(fmt...) printk(fmt)
+#else
+#define DBG(fmt...)
+#endif
+
+/* Max supported size for symbol names */
+#define MAX_SYMNAME    64
+
+extern char vdso32_start, vdso32_end;
+static void *vdso32_kbase = &vdso32_start;
+unsigned int vdso32_pages;
+unsigned long vdso32_sigtramp;
+unsigned long vdso32_rt_sigtramp;
+
+#ifdef CONFIG_PPC64
+extern char vdso64_start, vdso64_end;
+static void *vdso64_kbase = &vdso64_start;
+unsigned int vdso64_pages;
+unsigned long vdso64_rt_sigtramp;
+#endif /* CONFIG_PPC64 */
+
+/*
+ * The vdso data page (aka. systemcfg for old ppc64 fans) is here.
+ * Once the early boot kernel code no longer needs to muck around
+ * with it, it will become dynamically allocated
+ */
+static union {
+       struct vdso_data        data;
+       u8                      page[PAGE_SIZE];
+} vdso_data_store __attribute__((__section__(".data.page_aligned")));
+struct vdso_data *vdso_data = &vdso_data_store.data;
+
+/* Format of the patch table */
+struct vdso_patch_def
+{
+       unsigned long   ftr_mask, ftr_value;
+       const char      *gen_name;
+       const char      *fix_name;
+};
+
+/* Table of functions to patch based on the CPU type/revision
+ *
+ * Currently, we only change sync_dicache to do nothing on processors
+ * with a coherent icache
+ */
+static struct vdso_patch_def vdso_patches[] = {
+       {
+               CPU_FTR_COHERENT_ICACHE, CPU_FTR_COHERENT_ICACHE,
+               "__kernel_sync_dicache", "__kernel_sync_dicache_p5"
+       },
+       {
+               CPU_FTR_USE_TB, 0,
+               "__kernel_gettimeofday", NULL
+       },
+};
+
+/*
+ * Some infos carried around for each of them during parsing at
+ * boot time.
+ */
+struct lib32_elfinfo
+{
+       Elf32_Ehdr      *hdr;           /* ptr to ELF */
+       Elf32_Sym       *dynsym;        /* ptr to .dynsym section */
+       unsigned long   dynsymsize;     /* size of .dynsym section */
+       char            *dynstr;        /* ptr to .dynstr section */
+       unsigned long   text;           /* offset of .text section in .so */
+};
+
+struct lib64_elfinfo
+{
+       Elf64_Ehdr      *hdr;
+       Elf64_Sym       *dynsym;
+       unsigned long   dynsymsize;
+       char            *dynstr;
+       unsigned long   text;
+};
+
+
+#ifdef __DEBUG
+static void dump_one_vdso_page(struct page *pg, struct page *upg)
+{
+       printk("kpg: %p (c:%d,f:%08lx)", __va(page_to_pfn(pg) << PAGE_SHIFT),
+              page_count(pg),
+              pg->flags);
+       if (upg/* && pg != upg*/) {
+               printk(" upg: %p (c:%d,f:%08lx)", __va(page_to_pfn(upg)
+                                                      << PAGE_SHIFT),
+                      page_count(upg),
+                      upg->flags);
+       }
+       printk("\n");
+}
+
+static void dump_vdso_pages(struct vm_area_struct * vma)
+{
+       int i;
+
+       if (!vma || test_thread_flag(TIF_32BIT)) {
+               printk("vDSO32 @ %016lx:\n", (unsigned long)vdso32_kbase);
+               for (i=0; i<vdso32_pages; i++) {
+                       struct page *pg = virt_to_page(vdso32_kbase +
+                                                      i*PAGE_SIZE);
+                       struct page *upg = (vma && vma->vm_mm) ?
+                               follow_page(vma->vm_mm, vma->vm_start +
+                                           i*PAGE_SIZE, 0)
+                               : NULL;
+                       dump_one_vdso_page(pg, upg);
+               }
+       }
+       if (!vma || !test_thread_flag(TIF_32BIT)) {
+               printk("vDSO64 @ %016lx:\n", (unsigned long)vdso64_kbase);
+               for (i=0; i<vdso64_pages; i++) {
+                       struct page *pg = virt_to_page(vdso64_kbase +
+                                                      i*PAGE_SIZE);
+                       struct page *upg = (vma && vma->vm_mm) ?
+                               follow_page(vma->vm_mm, vma->vm_start +
+                                           i*PAGE_SIZE, 0)
+                               : NULL;
+                       dump_one_vdso_page(pg, upg);
+               }
+       }
+}
+#endif /* DEBUG */
+
+/*
+ * Keep a dummy vma_close for now, it will prevent VMA merging.
+ */
+static void vdso_vma_close(struct vm_area_struct * vma)
+{
+}
+
+/*
+ * Our nopage() function, maps in the actual vDSO kernel pages, they will
+ * be mapped read-only by do_no_page(), and eventually COW'ed, either
+ * right away for an initial write access, or by do_wp_page().
+ */
+static struct page * vdso_vma_nopage(struct vm_area_struct * vma,
+                                    unsigned long address, int *type)
+{
+       unsigned long offset = address - vma->vm_start;
+       struct page *pg;
+#ifdef CONFIG_PPC64
+       void *vbase = test_thread_flag(TIF_32BIT) ?
+               vdso32_kbase : vdso64_kbase;
+#else
+       void *vbase = vdso32_kbase;
+#endif
+
+       DBG("vdso_vma_nopage(current: %s, address: %016lx, off: %lx)\n",
+           current->comm, address, offset);
+
+       if (address < vma->vm_start || address > vma->vm_end)
+               return NOPAGE_SIGBUS;
+
+       /*
+        * Last page is systemcfg.
+        */
+       if ((vma->vm_end - address) <= PAGE_SIZE)
+               pg = virt_to_page(vdso_data);
+       else
+               pg = virt_to_page(vbase + offset);
+
+       get_page(pg);
+       DBG(" ->page count: %d\n", page_count(pg));
+
+       return pg;
+}
+
+static struct vm_operations_struct vdso_vmops = {
+       .close  = vdso_vma_close,
+       .nopage = vdso_vma_nopage,
+};
+
+/*
+ * This is called from binfmt_elf, we create the special vma for the
+ * vDSO and insert it into the mm struct tree
+ */
+int arch_setup_additional_pages(struct linux_binprm *bprm,
+                               int executable_stack)
+{
+       struct mm_struct *mm = current->mm;
+       struct vm_area_struct *vma;
+       unsigned long vdso_pages;
+       unsigned long vdso_base;
+
+#ifdef CONFIG_PPC64
+       if (test_thread_flag(TIF_32BIT)) {
+               vdso_pages = vdso32_pages;
+               vdso_base = VDSO32_MBASE;
+       } else {
+               vdso_pages = vdso64_pages;
+               vdso_base = VDSO64_MBASE;
+       }
+#else
+       vdso_pages = vdso32_pages;
+       vdso_base = VDSO32_MBASE;
+#endif
+
+       current->thread.vdso_base = 0;
+
+       /* vDSO has a problem and was disabled, just don't "enable" it for the
+        * process
+        */
+       if (vdso_pages == 0)
+               return 0;
+
+       vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
+       if (vma == NULL)
+               return -ENOMEM;
+
+       memset(vma, 0, sizeof(*vma));
+
+       /* Add a page to the vdso size for the data page */
+       vdso_pages ++;
+
+       /*
+        * pick a base address for the vDSO in process space. We try to put it
+        * at vdso_base which is the "natural" base for it, but we might fail
+        * and end up putting it elsewhere.
+        */
+       vdso_base = get_unmapped_area(NULL, vdso_base,
+                                     vdso_pages << PAGE_SHIFT, 0, 0);
+       if (vdso_base & ~PAGE_MASK) {
+               kmem_cache_free(vm_area_cachep, vma);
+               return (int)vdso_base;
+       }
+
+       current->thread.vdso_base = vdso_base;
+
+       vma->vm_mm = mm;
+       vma->vm_start = current->thread.vdso_base;
+       vma->vm_end = vma->vm_start + (vdso_pages << PAGE_SHIFT);
+
+       /*
+        * our vma flags don't have VM_WRITE so by default, the process isn't
+        * allowed to write those pages.
+        * gdb can break that with ptrace interface, and thus trigger COW on
+        * those pages but it's then your responsibility to never do that on
+        * the "data" page of the vDSO or you'll stop getting kernel updates
+        * and your nice userland gettimeofday will be totally dead.
+        * It's fine to use that for setting breakpoints in the vDSO code
+        * pages though
+        */
+       vma->vm_flags = VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYWRITE |
+               VM_MAYEXEC | VM_RESERVED;
+       vma->vm_flags |= mm->def_flags;
+       vma->vm_page_prot = protection_map[vma->vm_flags & 0x7];
+       vma->vm_ops = &vdso_vmops;
+
+       down_write(&mm->mmap_sem);
+       if (insert_vm_struct(mm, vma)) {
+               up_write(&mm->mmap_sem);
+               kmem_cache_free(vm_area_cachep, vma);
+               return -ENOMEM;
+       }
+       mm->total_vm += (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
+       up_write(&mm->mmap_sem);
+
+       return 0;
+}
+
+static void * __init find_section32(Elf32_Ehdr *ehdr, const char *secname,
+                                 unsigned long *size)
+{
+       Elf32_Shdr *sechdrs;
+       unsigned int i;
+       char *secnames;
+
+       /* Grab section headers and strings so we can tell who is who */
+       sechdrs = (void *)ehdr + ehdr->e_shoff;
+       secnames = (void *)ehdr + sechdrs[ehdr->e_shstrndx].sh_offset;
+
+       /* Find the section they want */
+       for (i = 1; i < ehdr->e_shnum; i++) {
+               if (strcmp(secnames+sechdrs[i].sh_name, secname) == 0) {
+                       if (size)
+                               *size = sechdrs[i].sh_size;
+                       return (void *)ehdr + sechdrs[i].sh_offset;
+               }
+       }
+       *size = 0;
+       return NULL;
+}
+
+static Elf32_Sym * __init find_symbol32(struct lib32_elfinfo *lib,
+                                       const char *symname)
+{
+       unsigned int i;
+       char name[MAX_SYMNAME], *c;
+
+       for (i = 0; i < (lib->dynsymsize / sizeof(Elf32_Sym)); i++) {
+               if (lib->dynsym[i].st_name == 0)
+                       continue;
+               strlcpy(name, lib->dynstr + lib->dynsym[i].st_name,
+                       MAX_SYMNAME);
+               c = strchr(name, '@');
+               if (c)
+                       *c = 0;
+               if (strcmp(symname, name) == 0)
+                       return &lib->dynsym[i];
+       }
+       return NULL;
+}
+
+/* Note that we assume the section is .text and the symbol is relative to
+ * the library base
+ */
+static unsigned long __init find_function32(struct lib32_elfinfo *lib,
+                                           const char *symname)
+{
+       Elf32_Sym *sym = find_symbol32(lib, symname);
+
+       if (sym == NULL) {
+               printk(KERN_WARNING "vDSO32: function %s not found !\n",
+                      symname);
+               return 0;
+       }
+       return sym->st_value - VDSO32_LBASE;
+}
+
+static int vdso_do_func_patch32(struct lib32_elfinfo *v32,
+                               struct lib64_elfinfo *v64,
+                               const char *orig, const char *fix)
+{
+       Elf32_Sym *sym32_gen, *sym32_fix;
+
+       sym32_gen = find_symbol32(v32, orig);
+       if (sym32_gen == NULL) {
+               printk(KERN_ERR "vDSO32: Can't find symbol %s !\n", orig);
+               return -1;
+       }
+       if (fix == NULL) {
+               sym32_gen->st_name = 0;
+               return 0;
+       }
+       sym32_fix = find_symbol32(v32, fix);
+       if (sym32_fix == NULL) {
+               printk(KERN_ERR "vDSO32: Can't find symbol %s !\n", fix);
+               return -1;
+       }
+       sym32_gen->st_value = sym32_fix->st_value;
+       sym32_gen->st_size = sym32_fix->st_size;
+       sym32_gen->st_info = sym32_fix->st_info;
+       sym32_gen->st_other = sym32_fix->st_other;
+       sym32_gen->st_shndx = sym32_fix->st_shndx;
+
+       return 0;
+}
+
+
+#ifdef CONFIG_PPC64
+
+static void * __init find_section64(Elf64_Ehdr *ehdr, const char *secname,
+                                 unsigned long *size)
+{
+       Elf64_Shdr *sechdrs;
+       unsigned int i;
+       char *secnames;
+
+       /* Grab section headers and strings so we can tell who is who */
+       sechdrs = (void *)ehdr + ehdr->e_shoff;
+       secnames = (void *)ehdr + sechdrs[ehdr->e_shstrndx].sh_offset;
+
+       /* Find the section they want */
+       for (i = 1; i < ehdr->e_shnum; i++) {
+               if (strcmp(secnames+sechdrs[i].sh_name, secname) == 0) {
+                       if (size)
+                               *size = sechdrs[i].sh_size;
+                       return (void *)ehdr + sechdrs[i].sh_offset;
+               }
+       }
+       if (size)
+               *size = 0;
+       return NULL;
+}
+
+static Elf64_Sym * __init find_symbol64(struct lib64_elfinfo *lib,
+                                       const char *symname)
+{
+       unsigned int i;
+       char name[MAX_SYMNAME], *c;
+
+       for (i = 0; i < (lib->dynsymsize / sizeof(Elf64_Sym)); i++) {
+               if (lib->dynsym[i].st_name == 0)
+                       continue;
+               strlcpy(name, lib->dynstr + lib->dynsym[i].st_name,
+                       MAX_SYMNAME);
+               c = strchr(name, '@');
+               if (c)
+                       *c = 0;
+               if (strcmp(symname, name) == 0)
+                       return &lib->dynsym[i];
+       }
+       return NULL;
+}
+
+/* Note that we assume the section is .text and the symbol is relative to
+ * the library base
+ */
+static unsigned long __init find_function64(struct lib64_elfinfo *lib,
+                                           const char *symname)
+{
+       Elf64_Sym *sym = find_symbol64(lib, symname);
+
+       if (sym == NULL) {
+               printk(KERN_WARNING "vDSO64: function %s not found !\n",
+                      symname);
+               return 0;
+       }
+#ifdef VDS64_HAS_DESCRIPTORS
+       return *((u64 *)(vdso64_kbase + sym->st_value - VDSO64_LBASE)) -
+               VDSO64_LBASE;
+#else
+       return sym->st_value - VDSO64_LBASE;
+#endif
+}
+
+static int vdso_do_func_patch64(struct lib32_elfinfo *v32,
+                               struct lib64_elfinfo *v64,
+                               const char *orig, const char *fix)
+{
+       Elf64_Sym *sym64_gen, *sym64_fix;
+
+       sym64_gen = find_symbol64(v64, orig);
+       if (sym64_gen == NULL) {
+               printk(KERN_ERR "vDSO64: Can't find symbol %s !\n", orig);
+               return -1;
+       }
+       if (fix == NULL) {
+               sym64_gen->st_name = 0;
+               return 0;
+       }
+       sym64_fix = find_symbol64(v64, fix);
+       if (sym64_fix == NULL) {
+               printk(KERN_ERR "vDSO64: Can't find symbol %s !\n", fix);
+               return -1;
+       }
+       sym64_gen->st_value = sym64_fix->st_value;
+       sym64_gen->st_size = sym64_fix->st_size;
+       sym64_gen->st_info = sym64_fix->st_info;
+       sym64_gen->st_other = sym64_fix->st_other;
+       sym64_gen->st_shndx = sym64_fix->st_shndx;
+
+       return 0;
+}
+
+#endif /* CONFIG_PPC64 */
+
+
+static __init int vdso_do_find_sections(struct lib32_elfinfo *v32,
+                                       struct lib64_elfinfo *v64)
+{
+       void *sect;
+
+       /*
+        * Locate symbol tables & text section
+        */
+
+       v32->dynsym = find_section32(v32->hdr, ".dynsym", &v32->dynsymsize);
+       v32->dynstr = find_section32(v32->hdr, ".dynstr", NULL);
+       if (v32->dynsym == NULL || v32->dynstr == NULL) {
+               printk(KERN_ERR "vDSO32: required symbol section not found\n");
+               return -1;
+       }
+       sect = find_section32(v32->hdr, ".text", NULL);
+       if (sect == NULL) {
+               printk(KERN_ERR "vDSO32: the .text section was not found\n");
+               return -1;
+       }
+       v32->text = sect - vdso32_kbase;
+
+#ifdef CONFIG_PPC64
+       v64->dynsym = find_section64(v64->hdr, ".dynsym", &v64->dynsymsize);
+       v64->dynstr = find_section64(v64->hdr, ".dynstr", NULL);
+       if (v64->dynsym == NULL || v64->dynstr == NULL) {
+               printk(KERN_ERR "vDSO64: required symbol section not found\n");
+               return -1;
+       }
+       sect = find_section64(v64->hdr, ".text", NULL);
+       if (sect == NULL) {
+               printk(KERN_ERR "vDSO64: the .text section was not found\n");
+               return -1;
+       }
+       v64->text = sect - vdso64_kbase;
+#endif /* CONFIG_PPC64 */
+
+       return 0;
+}
+
+static __init void vdso_setup_trampolines(struct lib32_elfinfo *v32,
+                                         struct lib64_elfinfo *v64)
+{
+       /*
+        * Find signal trampolines
+        */
+
+#ifdef CONFIG_PPC64
+       vdso64_rt_sigtramp = find_function64(v64, "__kernel_sigtramp_rt64");
+#endif
+       vdso32_sigtramp    = find_function32(v32, "__kernel_sigtramp32");
+       vdso32_rt_sigtramp = find_function32(v32, "__kernel_sigtramp_rt32");
+}
+
+static __init int vdso_fixup_datapage(struct lib32_elfinfo *v32,
+                                      struct lib64_elfinfo *v64)
+{
+       Elf32_Sym *sym32;
+#ifdef CONFIG_PPC64
+       Elf64_Sym *sym64;
+
+               sym64 = find_symbol64(v64, "__kernel_datapage_offset");
+       if (sym64 == NULL) {
+               printk(KERN_ERR "vDSO64: Can't find symbol "
+                      "__kernel_datapage_offset !\n");
+               return -1;
+       }
+       *((int *)(vdso64_kbase + sym64->st_value - VDSO64_LBASE)) =
+               (vdso64_pages << PAGE_SHIFT) -
+               (sym64->st_value - VDSO64_LBASE);
+#endif /* CONFIG_PPC64 */
+
+       sym32 = find_symbol32(v32, "__kernel_datapage_offset");
+       if (sym32 == NULL) {
+               printk(KERN_ERR "vDSO32: Can't find symbol "
+                      "__kernel_datapage_offset !\n");
+               return -1;
+       }
+       *((int *)(vdso32_kbase + (sym32->st_value - VDSO32_LBASE))) =
+               (vdso32_pages << PAGE_SHIFT) -
+               (sym32->st_value - VDSO32_LBASE);
+
+       return 0;
+}
+
+static __init int vdso_fixup_alt_funcs(struct lib32_elfinfo *v32,
+                                      struct lib64_elfinfo *v64)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(vdso_patches); i++) {
+               struct vdso_patch_def *patch = &vdso_patches[i];
+               int match = (cur_cpu_spec->cpu_features & patch->ftr_mask)
+                       == patch->ftr_value;
+               if (!match)
+                       continue;
+
+               DBG("replacing %s with %s...\n", patch->gen_name,
+                   patch->fix_name ? "NONE" : patch->fix_name);
+
+               /*
+                * Patch the 32 bits and 64 bits symbols. Note that we do not
+                * patch the "." symbol on 64 bits.
+                * It would be easy to do, but doesn't seem to be necessary,
+                * patching the OPD symbol is enough.
+                */
+               vdso_do_func_patch32(v32, v64, patch->gen_name,
+                                    patch->fix_name);
+#ifdef CONFIG_PPC64
+               vdso_do_func_patch64(v32, v64, patch->gen_name,
+                                    patch->fix_name);
+#endif /* CONFIG_PPC64 */
+       }
+
+       return 0;
+}
+
+
+static __init int vdso_setup(void)
+{
+       struct lib32_elfinfo    v32;
+       struct lib64_elfinfo    v64;
+
+       v32.hdr = vdso32_kbase;
+#ifdef CONFIG_PPC64
+       v64.hdr = vdso64_kbase;
+#endif
+       if (vdso_do_find_sections(&v32, &v64))
+               return -1;
+
+       if (vdso_fixup_datapage(&v32, &v64))
+               return -1;
+
+       if (vdso_fixup_alt_funcs(&v32, &v64))
+               return -1;
+
+       vdso_setup_trampolines(&v32, &v64);
+
+       return 0;
+}
+
+/*
+ * Called from setup_arch to initialize the bitmap of available
+ * syscalls in the systemcfg page
+ */
+static void __init vdso_setup_syscall_map(void)
+{
+       unsigned int i;
+       extern unsigned long *sys_call_table;
+       extern unsigned long sys_ni_syscall;
+
+
+       for (i = 0; i < __NR_syscalls; i++) {
+#ifdef CONFIG_PPC64
+               if (sys_call_table[i*2] != sys_ni_syscall)
+                       vdso_data->syscall_map_64[i >> 5] |=
+                               0x80000000UL >> (i & 0x1f);
+               if (sys_call_table[i*2+1] != sys_ni_syscall)
+                       vdso_data->syscall_map_32[i >> 5] |=
+                               0x80000000UL >> (i & 0x1f);
+#else /* CONFIG_PPC64 */
+               if (sys_call_table[i] != sys_ni_syscall)
+                       vdso_data->syscall_map_32[i >> 5] |=
+                               0x80000000UL >> (i & 0x1f);
+#endif /* CONFIG_PPC64 */
+       }
+}
+
+
+void __init vdso_init(void)
+{
+       int i;
+
+#ifdef CONFIG_PPC64
+       /*
+        * Fill up the "systemcfg" stuff for backward compatiblity
+        */
+       strcpy(vdso_data->eye_catcher, "SYSTEMCFG:PPC64");
+       vdso_data->version.major = SYSTEMCFG_MAJOR;
+       vdso_data->version.minor = SYSTEMCFG_MINOR;
+       vdso_data->processor = mfspr(SPRN_PVR);
+       vdso_data->platform = _machine;
+       vdso_data->physicalMemorySize = lmb_phys_mem_size();
+       vdso_data->dcache_size = ppc64_caches.dsize;
+       vdso_data->dcache_line_size = ppc64_caches.dline_size;
+       vdso_data->icache_size = ppc64_caches.isize;
+       vdso_data->icache_line_size = ppc64_caches.iline_size;
+
+       /*
+        * Calculate the size of the 64 bits vDSO
+        */
+       vdso64_pages = (&vdso64_end - &vdso64_start) >> PAGE_SHIFT;
+       DBG("vdso64_kbase: %p, 0x%x pages\n", vdso64_kbase, vdso64_pages);
+#endif /* CONFIG_PPC64 */
+
+
+       /*
+        * Calculate the size of the 32 bits vDSO
+        */
+       vdso32_pages = (&vdso32_end - &vdso32_start) >> PAGE_SHIFT;
+       DBG("vdso32_kbase: %p, 0x%x pages\n", vdso32_kbase, vdso32_pages);
+
+
+       /*
+        * Setup the syscall map in the vDOS
+        */
+       vdso_setup_syscall_map();
+       /*
+        * Initialize the vDSO images in memory, that is do necessary
+        * fixups of vDSO symbols, locate trampolines, etc...
+        */
+       if (vdso_setup()) {
+               printk(KERN_ERR "vDSO setup failure, not enabled !\n");
+               vdso32_pages = 0;
+#ifdef CONFIG_PPC64
+               vdso64_pages = 0;
+#endif
+               return;
+       }
+
+       /* Make sure pages are in the correct state */
+       for (i = 0; i < vdso32_pages; i++) {
+               struct page *pg = virt_to_page(vdso32_kbase + i*PAGE_SIZE);
+               ClearPageReserved(pg);
+               get_page(pg);
+
+       }
+#ifdef CONFIG_PPC64
+       for (i = 0; i < vdso64_pages; i++) {
+               struct page *pg = virt_to_page(vdso64_kbase + i*PAGE_SIZE);
+               ClearPageReserved(pg);
+               get_page(pg);
+       }
+#endif /* CONFIG_PPC64 */
+
+       get_page(virt_to_page(vdso_data));
+}
+
+int in_gate_area_no_task(unsigned long addr)
+{
+       return 0;
+}
+
+int in_gate_area(struct task_struct *task, unsigned long addr)
+{
+       return 0;
+}
+
+struct vm_area_struct *get_gate_vma(struct task_struct *tsk)
+{
+       return NULL;
+}
+
diff --git a/arch/powerpc/kernel/vdso32/Makefile b/arch/powerpc/kernel/vdso32/Makefile
new file mode 100644 (file)
index 0000000..8a3bed5
--- /dev/null
@@ -0,0 +1,40 @@
+
+# List of files in the vdso, has to be asm only for now
+
+obj-vdso32 = sigtramp.o gettimeofday.o datapage.o cacheflush.o note.o
+
+# Build rules
+
+ifeq ($(CONFIG_PPC32),y)
+CROSS32CC := $(CC)
+endif
+
+targets := $(obj-vdso32) vdso32.so
+obj-vdso32 := $(addprefix $(obj)/, $(obj-vdso32))
+
+
+EXTRA_CFLAGS := -shared -s -fno-common -fno-builtin
+EXTRA_CFLAGS += -nostdlib -Wl,-soname=linux-vdso32.so.1
+EXTRA_AFLAGS := -D__VDSO32__ -s
+
+obj-y += vdso32_wrapper.o
+extra-y += vdso32.lds
+CPPFLAGS_vdso32.lds += -P -C -Upowerpc
+
+# Force dependency (incbin is bad)
+$(obj)/vdso32_wrapper.o : $(obj)/vdso32.so
+
+# link rule for the .so file, .lds has to be first
+$(obj)/vdso32.so: $(src)/vdso32.lds $(obj-vdso32)
+       $(call if_changed,vdso32ld)
+
+# assembly rules for the .S files
+$(obj-vdso32): %.o: %.S
+       $(call if_changed_dep,vdso32as)
+
+# actual build commands
+quiet_cmd_vdso32ld = VDSO32L $@
+      cmd_vdso32ld = $(CROSS32CC) $(c_flags) -Wl,-T $^ -o $@
+quiet_cmd_vdso32as = VDSO32A $@
+      cmd_vdso32as = $(CROSS32CC) $(a_flags) -c -o $@ $<
+
diff --git a/arch/powerpc/kernel/vdso32/cacheflush.S b/arch/powerpc/kernel/vdso32/cacheflush.S
new file mode 100644 (file)
index 0000000..c8db993
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * vDSO provided cache flush routines
+ *
+ * Copyright (C) 2004 Benjamin Herrenschmuidt (benh@kernel.crashing.org),
+ *                    IBM Corp.
+ *
+ * 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; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+#include <linux/config.h>
+#include <asm/processor.h>
+#include <asm/ppc_asm.h>
+#include <asm/vdso.h>
+#include <asm/asm-offsets.h>
+
+       .text
+
+/*
+ * Default "generic" version of __kernel_sync_dicache.
+ *
+ * void __kernel_sync_dicache(unsigned long start, unsigned long end)
+ *
+ * Flushes the data cache & invalidate the instruction cache for the
+ * provided range [start, end[
+ *
+ * Note: all CPUs supported by this kernel have a 128 bytes cache
+ * line size so we don't have to peek that info from the datapage
+ */
+V_FUNCTION_BEGIN(__kernel_sync_dicache)
+  .cfi_startproc
+       li      r5,127
+       andc    r6,r3,r5                /* round low to line bdy */
+       subf    r8,r6,r4                /* compute length */
+       add     r8,r8,r5                /* ensure we get enough */
+       srwi.   r8,r8,7                 /* compute line count */
+       beqlr                           /* nothing to do? */
+       mtctr   r8
+       mr      r3,r6
+1:     dcbst   0,r3
+       addi    r3,r3,128
+       bdnz    1b
+       sync
+       mtctr   r8
+1:     icbi    0,r6
+       addi    r6,r6,128
+       bdnz    1b
+       isync
+       li      r3,0
+       blr
+  .cfi_endproc
+V_FUNCTION_END(__kernel_sync_dicache)
+
+
+/*
+ * POWER5 version of __kernel_sync_dicache
+ */
+V_FUNCTION_BEGIN(__kernel_sync_dicache_p5)
+  .cfi_startproc
+       sync
+       isync
+       li      r3,0
+       blr
+  .cfi_endproc
+V_FUNCTION_END(__kernel_sync_dicache_p5)
+
diff --git a/arch/powerpc/kernel/vdso32/datapage.S b/arch/powerpc/kernel/vdso32/datapage.S
new file mode 100644 (file)
index 0000000..a08c26e
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * Access to the shared data page by the vDSO & syscall map
+ *
+ * Copyright (C) 2004 Benjamin Herrenschmuidt (benh@kernel.crashing.org), IBM Corp.
+ *
+ * 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; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/config.h>
+#include <asm/processor.h>
+#include <asm/ppc_asm.h>
+#include <asm/asm-offsets.h>
+#include <asm/unistd.h>
+#include <asm/vdso.h>
+
+       .text
+V_FUNCTION_BEGIN(__get_datapage)
+  .cfi_startproc
+       /* We don't want that exposed or overridable as we want other objects
+        * to be able to bl directly to here
+        */
+       .protected __get_datapage
+       .hidden __get_datapage
+
+       mflr    r0
+  .cfi_register lr,r0
+
+       bcl     20,31,1f
+       .global __kernel_datapage_offset;
+__kernel_datapage_offset:
+       .long   0
+1:
+       mflr    r3
+       mtlr    r0
+       lwz     r0,0(r3)
+       add     r3,r0,r3
+       blr
+  .cfi_endproc
+V_FUNCTION_END(__get_datapage)
+
+/*
+ * void *__kernel_get_syscall_map(unsigned int *syscall_count) ;
+ *
+ * returns a pointer to the syscall map. the map is agnostic to the
+ * size of "long", unlike kernel bitops, it stores bits from top to
+ * bottom so that memory actually contains a linear bitmap
+ * check for syscall N by testing bit (0x80000000 >> (N & 0x1f)) of
+ * 32 bits int at N >> 5.
+ */
+V_FUNCTION_BEGIN(__kernel_get_syscall_map)
+  .cfi_startproc
+       mflr    r12
+  .cfi_register lr,r12
+
+       mr      r4,r3
+       bl      __get_datapage@local
+       mtlr    r12
+       addi    r3,r3,CFG_SYSCALL_MAP32
+       cmpli   cr0,r4,0
+       beqlr
+       li      r0,__NR_syscalls
+       stw     r0,0(r4)
+       blr
+  .cfi_endproc
+V_FUNCTION_END(__kernel_get_syscall_map)
+
+/*
+ * void unsigned long long  __kernel_get_tbfreq(void);
+ *
+ * returns the timebase frequency in HZ
+ */
+V_FUNCTION_BEGIN(__kernel_get_tbfreq)
+  .cfi_startproc
+       mflr    r12
+  .cfi_register lr,r12
+       bl      __get_datapage@local
+       lwz     r3,CFG_TB_TICKS_PER_SEC(r3)
+       lwz     r4,(CFG_TB_TICKS_PER_SEC + 4)(r3)
+       mtlr    r12
+  .cfi_endproc
+V_FUNCTION_END(__kernel_get_tbfreq)
diff --git a/arch/powerpc/kernel/vdso32/gettimeofday.S b/arch/powerpc/kernel/vdso32/gettimeofday.S
new file mode 100644 (file)
index 0000000..aeb5fc9
--- /dev/null
@@ -0,0 +1,315 @@
+/*
+ * Userland implementation of gettimeofday() for 32 bits processes in a
+ * ppc64 kernel for use in the vDSO
+ *
+ * Copyright (C) 2004 Benjamin Herrenschmuidt (benh@kernel.crashing.org,
+ *                    IBM Corp.
+ *
+ * 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; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+#include <linux/config.h>
+#include <asm/processor.h>
+#include <asm/ppc_asm.h>
+#include <asm/vdso.h>
+#include <asm/asm-offsets.h>
+#include <asm/unistd.h>
+
+       .text
+/*
+ * Exact prototype of gettimeofday
+ *
+ * int __kernel_gettimeofday(struct timeval *tv, struct timezone *tz);
+ *
+ */
+V_FUNCTION_BEGIN(__kernel_gettimeofday)
+  .cfi_startproc
+       mflr    r12
+  .cfi_register lr,r12
+
+       mr      r10,r3                  /* r10 saves tv */
+       mr      r11,r4                  /* r11 saves tz */
+       bl      __get_datapage@local    /* get data page */
+       mr      r9, r3                  /* datapage ptr in r9 */
+       bl      __do_get_xsec@local     /* get xsec from tb & kernel */
+       bne-    2f                      /* out of line -> do syscall */
+
+       /* seconds are xsec >> 20 */
+       rlwinm  r5,r4,12,20,31
+       rlwimi  r5,r3,12,0,19
+       stw     r5,TVAL32_TV_SEC(r10)
+
+       /* get remaining xsec and convert to usec. we scale
+        * up remaining xsec by 12 bits and get the top 32 bits
+        * of the multiplication
+        */
+       rlwinm  r5,r4,12,0,19
+       lis     r6,1000000@h
+       ori     r6,r6,1000000@l
+       mulhwu  r5,r5,r6
+       stw     r5,TVAL32_TV_USEC(r10)
+
+       cmpli   cr0,r11,0               /* check if tz is NULL */
+       beq     1f
+       lwz     r4,CFG_TZ_MINUTEWEST(r9)/* fill tz */
+       lwz     r5,CFG_TZ_DSTTIME(r9)
+       stw     r4,TZONE_TZ_MINWEST(r11)
+       stw     r5,TZONE_TZ_DSTTIME(r11)
+
+1:     mtlr    r12
+       li      r3,0
+       blr
+
+2:
+       mtlr    r12
+       mr      r3,r10
+       mr      r4,r11
+       li      r0,__NR_gettimeofday
+       sc
+       blr
+  .cfi_endproc
+V_FUNCTION_END(__kernel_gettimeofday)
+
+/*
+ * Exact prototype of clock_gettime()
+ *
+ * int __kernel_clock_gettime(clockid_t clock_id, struct timespec *tp);
+ *
+ */
+V_FUNCTION_BEGIN(__kernel_clock_gettime)
+  .cfi_startproc
+       /* Check for supported clock IDs */
+       cmpli   cr0,r3,CLOCK_REALTIME
+       cmpli   cr1,r3,CLOCK_MONOTONIC
+       cror    cr0,cr0,cr1
+       bne     cr0,99f
+
+       mflr    r12                     /* r12 saves lr */
+  .cfi_register lr,r12
+       mr      r10,r3                  /* r10 saves id */
+       mr      r11,r4                  /* r11 saves tp */
+       bl      __get_datapage@local    /* get data page */
+       mr      r9, r3                  /* datapage ptr in r9 */
+       beq     cr1,50f                 /* if monotonic -> jump there */
+
+       /*
+        * CLOCK_REALTIME
+        */
+
+       bl      __do_get_xsec@local     /* get xsec from tb & kernel */
+       bne-    98f                     /* out of line -> do syscall */
+
+       /* seconds are xsec >> 20 */
+       rlwinm  r5,r4,12,20,31
+       rlwimi  r5,r3,12,0,19
+       stw     r5,TSPC32_TV_SEC(r11)
+
+       /* get remaining xsec and convert to nsec. we scale
+        * up remaining xsec by 12 bits and get the top 32 bits
+        * of the multiplication, then we multiply by 1000
+        */
+       rlwinm  r5,r4,12,0,19
+       lis     r6,1000000@h
+       ori     r6,r6,1000000@l
+       mulhwu  r5,r5,r6
+       mulli   r5,r5,1000
+       stw     r5,TSPC32_TV_NSEC(r11)
+       mtlr    r12
+       li      r3,0
+       blr
+
+       /*
+        * CLOCK_MONOTONIC
+        */
+
+50:    bl      __do_get_xsec@local     /* get xsec from tb & kernel */
+       bne-    98f                     /* out of line -> do syscall */
+
+       /* seconds are xsec >> 20 */
+       rlwinm  r6,r4,12,20,31
+       rlwimi  r6,r3,12,0,19
+
+       /* get remaining xsec and convert to nsec. we scale
+        * up remaining xsec by 12 bits and get the top 32 bits
+        * of the multiplication, then we multiply by 1000
+        */
+       rlwinm  r7,r4,12,0,19
+       lis     r5,1000000@h
+       ori     r5,r5,1000000@l
+       mulhwu  r7,r7,r5
+       mulli   r7,r7,1000
+
+       /* now we must fixup using wall to monotonic. We need to snapshot
+        * that value and do the counter trick again. Fortunately, we still
+        * have the counter value in r8 that was returned by __do_get_xsec.
+        * At this point, r6,r7 contain our sec/nsec values, r3,r4 and r5
+        * can be used
+        */
+
+       lwz     r3,WTOM_CLOCK_SEC(r9)
+       lwz     r4,WTOM_CLOCK_NSEC(r9)
+
+       /* We now have our result in r3,r4. We create a fake dependency
+        * on that result and re-check the counter
+        */
+       or      r5,r4,r3
+       xor     r0,r5,r5
+       add     r9,r9,r0
+#ifdef CONFIG_PPC64
+       lwz     r0,(CFG_TB_UPDATE_COUNT+4)(r9)
+#else
+       lwz     r0,(CFG_TB_UPDATE_COUNT)(r9)
+#endif
+        cmpl    cr0,r8,r0              /* check if updated */
+       bne-    50b
+
+       /* Calculate and store result. Note that this mimmics the C code,
+        * which may cause funny results if nsec goes negative... is that
+        * possible at all ?
+        */
+       add     r3,r3,r6
+       add     r4,r4,r7
+       lis     r5,NSEC_PER_SEC@h
+       ori     r5,r5,NSEC_PER_SEC@l
+       cmpli   cr0,r4,r5
+       blt     1f
+       subf    r4,r5,r4
+       addi    r3,r3,1
+1:     stw     r3,TSPC32_TV_SEC(r11)
+       stw     r4,TSPC32_TV_NSEC(r11)
+
+       mtlr    r12
+       li      r3,0
+       blr
+
+       /*
+        * syscall fallback
+        */
+98:
+       mtlr    r12
+       mr      r3,r10
+       mr      r4,r11
+99:
+       li      r0,__NR_clock_gettime
+       sc
+       blr
+  .cfi_endproc
+V_FUNCTION_END(__kernel_clock_gettime)
+
+
+/*
+ * Exact prototype of clock_getres()
+ *
+ * int __kernel_clock_getres(clockid_t clock_id, struct timespec *res);
+ *
+ */
+V_FUNCTION_BEGIN(__kernel_clock_getres)
+  .cfi_startproc
+       /* Check for supported clock IDs */
+       cmpwi   cr0,r3,CLOCK_REALTIME
+       cmpwi   cr1,r3,CLOCK_MONOTONIC
+       cror    cr0,cr0,cr1
+       bne     cr0,99f
+
+       li      r3,0
+       cmpli   cr0,r4,0
+       beqlr
+       lis     r5,CLOCK_REALTIME_RES@h
+       ori     r5,r5,CLOCK_REALTIME_RES@l
+       stw     r3,TSPC32_TV_SEC(r4)
+       stw     r5,TSPC32_TV_NSEC(r4)
+       blr
+
+       /*
+        * syscall fallback
+        */
+99:
+       li      r0,__NR_clock_getres
+       sc
+       blr
+  .cfi_endproc
+V_FUNCTION_END(__kernel_clock_getres)
+
+
+/*
+ * This is the core of gettimeofday() & friends, it returns the xsec
+ * value in r3 & r4 and expects the datapage ptr (non clobbered)
+ * in r9. clobbers r0,r4,r5,r6,r7,r8.
+ * When returning, r8 contains the counter value that can be reused
+ * by the monotonic clock implementation
+ */
+__do_get_xsec:
+  .cfi_startproc
+       /* Check for update count & load values. We use the low
+        * order 32 bits of the update count
+        */
+#ifdef CONFIG_PPC64
+1:     lwz     r8,(CFG_TB_UPDATE_COUNT+4)(r9)
+#else
+1:     lwz     r8,(CFG_TB_UPDATE_COUNT)(r9)
+#endif
+       andi.   r0,r8,1                 /* pending update ? loop */
+       bne-    1b
+       xor     r0,r8,r8                /* create dependency */
+       add     r9,r9,r0
+
+       /* Load orig stamp (offset to TB) */
+       lwz     r5,CFG_TB_ORIG_STAMP(r9)
+       lwz     r6,(CFG_TB_ORIG_STAMP+4)(r9)
+
+       /* Get a stable TB value */
+2:     mftbu   r3
+       mftbl   r4
+       mftbu   r0
+       cmpl    cr0,r3,r0
+       bne-    2b
+
+       /* Substract tb orig stamp. If the high part is non-zero, we jump to
+        * the slow path which call the syscall.
+        * If it's ok, then we have our 32 bits tb_ticks value in r7
+        */
+       subfc   r7,r6,r4
+       subfe.  r0,r5,r3
+       bne-    3f
+
+       /* Load scale factor & do multiplication */
+       lwz     r5,CFG_TB_TO_XS(r9)     /* load values */
+       lwz     r6,(CFG_TB_TO_XS+4)(r9)
+       mulhwu  r4,r7,r5
+       mulhwu  r6,r7,r6
+       mullw   r0,r7,r5
+       addc    r6,r6,r0
+
+       /* At this point, we have the scaled xsec value in r4 + XER:CA
+        * we load & add the stamp since epoch
+        */
+       lwz     r5,CFG_STAMP_XSEC(r9)
+       lwz     r6,(CFG_STAMP_XSEC+4)(r9)
+       adde    r4,r4,r6
+       addze   r3,r5
+
+       /* We now have our result in r3,r4. We create a fake dependency
+        * on that result and re-check the counter
+        */
+       or      r6,r4,r3
+       xor     r0,r6,r6
+       add     r9,r9,r0
+#ifdef CONFIG_PPC64
+       lwz     r0,(CFG_TB_UPDATE_COUNT+4)(r9)
+#else
+       lwz     r0,(CFG_TB_UPDATE_COUNT)(r9)
+#endif
+        cmpl    cr0,r8,r0              /* check if updated */
+       bne-    1b
+
+       /* Warning ! The caller expects CR:EQ to be set to indicate a
+        * successful calculation (so it won't fallback to the syscall
+        * method). We have overriden that CR bit in the counter check,
+        * but fortunately, the loop exit condition _is_ CR:EQ set, so
+        * we can exit safely here. If you change this code, be careful
+        * of that side effect.
+        */
+3:     blr
+  .cfi_endproc
diff --git a/arch/powerpc/kernel/vdso32/note.S b/arch/powerpc/kernel/vdso32/note.S
new file mode 100644 (file)
index 0000000..d4b5be4
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * This supplies .note.* sections to go into the PT_NOTE inside the vDSO text.
+ * Here we can supply some information useful to userland.
+ */
+
+#include <linux/uts.h>
+#include <linux/version.h>
+
+#define ASM_ELF_NOTE_BEGIN(name, flags, vendor, type)                        \
+       .section name, flags;                                                 \
+       .balign 4;                                                            \
+       .long 1f - 0f;          /* name length */                             \
+       .long 3f - 2f;          /* data length */                             \
+       .long type;             /* note type */                               \
+0:     .asciz vendor;          /* vendor name */                             \
+1:     .balign 4;                                                            \
+2:
+
+#define ASM_ELF_NOTE_END                                                     \
+3:     .balign 4;              /* pad out section */                         \
+       .previous
+
+       ASM_ELF_NOTE_BEGIN(".note.kernel-version", "a", UTS_SYSNAME, 0)
+       .long LINUX_VERSION_CODE
+       ASM_ELF_NOTE_END
diff --git a/arch/powerpc/kernel/vdso32/sigtramp.S b/arch/powerpc/kernel/vdso32/sigtramp.S
new file mode 100644 (file)
index 0000000..e046427
--- /dev/null
@@ -0,0 +1,300 @@
+/*
+ * Signal trampolines for 32 bits processes in a ppc64 kernel for
+ * use in the vDSO
+ *
+ * Copyright (C) 2004 Benjamin Herrenschmuidt (benh@kernel.crashing.org), IBM Corp.
+ * Copyright (C) 2004 Alan Modra (amodra@au.ibm.com)), IBM Corp.
+ *
+ * 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; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+#include <linux/config.h>
+#include <asm/processor.h>
+#include <asm/ppc_asm.h>
+#include <asm/unistd.h>
+#include <asm/vdso.h>
+
+       .text
+
+/* The nop here is a hack.  The dwarf2 unwind routines subtract 1 from
+   the return address to get an address in the middle of the presumed
+   call instruction.  Since we don't have a call here, we artifically
+   extend the range covered by the unwind info by adding a nop before
+   the real start.  */
+       nop
+V_FUNCTION_BEGIN(__kernel_sigtramp32)
+.Lsig_start = . - 4
+       li      r0,__NR_sigreturn
+       sc
+.Lsig_end:
+V_FUNCTION_END(__kernel_sigtramp32)
+
+.Lsigrt_start:
+       nop
+V_FUNCTION_BEGIN(__kernel_sigtramp_rt32)
+       li      r0,__NR_rt_sigreturn
+       sc
+.Lsigrt_end:
+V_FUNCTION_END(__kernel_sigtramp_rt32)
+
+       .section .eh_frame,"a",@progbits
+
+/* Register r1 can be found at offset 4 of a pt_regs structure.
+   A pointer to the pt_regs is stored in memory at the old sp plus PTREGS.  */
+#define cfa_save \
+  .byte 0x0f;                  /* DW_CFA_def_cfa_expression */         \
+  .uleb128 9f - 1f;            /*   length */                          \
+1:                                                                     \
+  .byte 0x71; .sleb128 PTREGS; /*     DW_OP_breg1 */                   \
+  .byte 0x06;                  /*     DW_OP_deref */                   \
+  .byte 0x23; .uleb128 RSIZE;  /*     DW_OP_plus_uconst */             \
+  .byte 0x06;                  /*     DW_OP_deref */                   \
+9:
+
+/* Register REGNO can be found at offset OFS of a pt_regs structure.
+   A pointer to the pt_regs is stored in memory at the old sp plus PTREGS.  */
+#define rsave(regno, ofs) \
+  .byte 0x10;                  /* DW_CFA_expression */                 \
+  .uleb128 regno;              /*   regno */                           \
+  .uleb128 9f - 1f;            /*   length */                          \
+1:                                                                     \
+  .byte 0x71; .sleb128 PTREGS; /*     DW_OP_breg1 */                   \
+  .byte 0x06;                  /*     DW_OP_deref */                   \
+  .ifne ofs;                                                           \
+    .byte 0x23; .uleb128 ofs;  /*     DW_OP_plus_uconst */             \
+  .endif;                                                              \
+9:
+
+/* If msr bit 1<<25 is set, then VMX register REGNO is at offset REGNO*16
+   of the VMX reg struct.  The VMX reg struct is at offset VREGS of
+   the pt_regs struct.  This macro is for REGNO == 0, and contains
+   'subroutines' that the other macros jump to.  */
+#define vsave_msr0(regno) \
+  .byte 0x10;                  /* DW_CFA_expression */                 \
+  .uleb128 regno + 77;         /*   regno */                           \
+  .uleb128 9f - 1f;            /*   length */                          \
+1:                                                                     \
+  .byte 0x30 + regno;          /*     DW_OP_lit0 */                    \
+2:                                                                     \
+  .byte 0x40;                  /*     DW_OP_lit16 */                   \
+  .byte 0x1e;                  /*     DW_OP_mul */                     \
+3:                                                                     \
+  .byte 0x71; .sleb128 PTREGS; /*     DW_OP_breg1 */                   \
+  .byte 0x06;                  /*     DW_OP_deref */                   \
+  .byte 0x12;                  /*     DW_OP_dup */                     \
+  .byte 0x23;                  /*     DW_OP_plus_uconst */             \
+    .uleb128 33*RSIZE;         /*       msr offset */                  \
+  .byte 0x06;                  /*     DW_OP_deref */                   \
+  .byte 0x0c; .long 1 << 25;   /*     DW_OP_const4u */                 \
+  .byte 0x1a;                  /*     DW_OP_and */                     \
+  .byte 0x12;                  /*     DW_OP_dup, ret 0 if bra taken */ \
+  .byte 0x30;                  /*     DW_OP_lit0 */                    \
+  .byte 0x29;                  /*     DW_OP_eq */                      \
+  .byte 0x28; .short 0x7fff;   /*     DW_OP_bra to end */              \
+  .byte 0x13;                  /*     DW_OP_drop, pop the 0 */         \
+  .byte 0x23; .uleb128 VREGS;  /*     DW_OP_plus_uconst */             \
+  .byte 0x22;                  /*     DW_OP_plus */                    \
+  .byte 0x2f; .short 0x7fff;   /*     DW_OP_skip to end */             \
+9:
+
+/* If msr bit 1<<25 is set, then VMX register REGNO is at offset REGNO*16
+   of the VMX reg struct.  REGNO is 1 thru 31.  */
+#define vsave_msr1(regno) \
+  .byte 0x10;                  /* DW_CFA_expression */                 \
+  .uleb128 regno + 77;         /*   regno */                           \
+  .uleb128 9f - 1f;            /*   length */                          \
+1:                                                                     \
+  .byte 0x30 + regno;          /*     DW_OP_lit n */                   \
+  .byte 0x2f; .short 2b - 9f;  /*     DW_OP_skip */                    \
+9:
+
+/* If msr bit 1<<25 is set, then VMX register REGNO is at offset OFS of
+   the VMX save block.  */
+#define vsave_msr2(regno, ofs) \
+  .byte 0x10;                  /* DW_CFA_expression */                 \
+  .uleb128 regno + 77;         /*   regno */                           \
+  .uleb128 9f - 1f;            /*   length */                          \
+1:                                                                     \
+  .byte 0x0a; .short ofs;      /*     DW_OP_const2u */                 \
+  .byte 0x2f; .short 3b - 9f;  /*     DW_OP_skip */                    \
+9:
+
+/* VMX register REGNO is at offset OFS of the VMX save area.  */
+#define vsave(regno, ofs) \
+  .byte 0x10;                  /* DW_CFA_expression */                 \
+  .uleb128 regno + 77;         /*   regno */                           \
+  .uleb128 9f - 1f;            /*   length */                          \
+1:                                                                     \
+  .byte 0x71; .sleb128 PTREGS; /*     DW_OP_breg1 */                   \
+  .byte 0x06;                  /*     DW_OP_deref */                   \
+  .byte 0x23; .uleb128 VREGS;  /*     DW_OP_plus_uconst */             \
+  .byte 0x23; .uleb128 ofs;    /*     DW_OP_plus_uconst */             \
+9:
+
+/* This is where the pt_regs pointer can be found on the stack.  */
+#define PTREGS 64+28
+
+/* Size of regs.  */
+#define RSIZE 4
+
+/* This is the offset of the VMX regs.  */
+#define VREGS 48*RSIZE+34*8
+
+/* Describe where general purpose regs are saved.  */
+#define EH_FRAME_GEN \
+  cfa_save;                                                            \
+  rsave ( 0,  0*RSIZE);                                                        \
+  rsave ( 2,  2*RSIZE);                                                        \
+  rsave ( 3,  3*RSIZE);                                                        \
+  rsave ( 4,  4*RSIZE);                                                        \
+  rsave ( 5,  5*RSIZE);                                                        \
+  rsave ( 6,  6*RSIZE);                                                        \
+  rsave ( 7,  7*RSIZE);                                                        \
+  rsave ( 8,  8*RSIZE);                                                        \
+  rsave ( 9,  9*RSIZE);                                                        \
+  rsave (10, 10*RSIZE);                                                        \
+  rsave (11, 11*RSIZE);                                                        \
+  rsave (12, 12*RSIZE);                                                        \
+  rsave (13, 13*RSIZE);                                                        \
+  rsave (14, 14*RSIZE);                                                        \
+  rsave (15, 15*RSIZE);                                                        \
+  rsave (16, 16*RSIZE);                                                        \
+  rsave (17, 17*RSIZE);                                                        \
+  rsave (18, 18*RSIZE);                                                        \
+  rsave (19, 19*RSIZE);                                                        \
+  rsave (20, 20*RSIZE);                                                        \
+  rsave (21, 21*RSIZE);                                                        \
+  rsave (22, 22*RSIZE);                                                        \
+  rsave (23, 23*RSIZE);                                                        \
+  rsave (24, 24*RSIZE);                                                        \
+  rsave (25, 25*RSIZE);                                                        \
+  rsave (26, 26*RSIZE);                                                        \
+  rsave (27, 27*RSIZE);                                                        \
+  rsave (28, 28*RSIZE);                                                        \
+  rsave (29, 29*RSIZE);                                                        \
+  rsave (30, 30*RSIZE);                                                        \
+  rsave (31, 31*RSIZE);                                                        \
+  rsave (67, 32*RSIZE);                /* ap, used as temp for nip */          \
+  rsave (65, 36*RSIZE);                /* lr */                                \
+  rsave (70, 38*RSIZE)         /* cr */
+
+/* Describe where the FP regs are saved.  */
+#define EH_FRAME_FP \
+  rsave (32, 48*RSIZE +  0*8);                                         \
+  rsave (33, 48*RSIZE +  1*8);                                         \
+  rsave (34, 48*RSIZE +  2*8);                                         \
+  rsave (35, 48*RSIZE +  3*8);                                         \
+  rsave (36, 48*RSIZE +  4*8);                                         \
+  rsave (37, 48*RSIZE +  5*8);                                         \
+  rsave (38, 48*RSIZE +  6*8);                                         \
+  rsave (39, 48*RSIZE +  7*8);                                         \
+  rsave (40, 48*RSIZE +  8*8);                                         \
+  rsave (41, 48*RSIZE +  9*8);                                         \
+  rsave (42, 48*RSIZE + 10*8);                                         \
+  rsave (43, 48*RSIZE + 11*8);                                         \
+  rsave (44, 48*RSIZE + 12*8);                                         \
+  rsave (45, 48*RSIZE + 13*8);                                         \
+  rsave (46, 48*RSIZE + 14*8);                                         \
+  rsave (47, 48*RSIZE + 15*8);                                         \
+  rsave (48, 48*RSIZE + 16*8);                                         \
+  rsave (49, 48*RSIZE + 17*8);                                         \
+  rsave (50, 48*RSIZE + 18*8);                                         \
+  rsave (51, 48*RSIZE + 19*8);                                         \
+  rsave (52, 48*RSIZE + 20*8);                                         \
+  rsave (53, 48*RSIZE + 21*8);                                         \
+  rsave (54, 48*RSIZE + 22*8);                                         \
+  rsave (55, 48*RSIZE + 23*8);                                         \
+  rsave (56, 48*RSIZE + 24*8);                                         \
+  rsave (57, 48*RSIZE + 25*8);                                         \
+  rsave (58, 48*RSIZE + 26*8);                                         \
+  rsave (59, 48*RSIZE + 27*8);                                         \
+  rsave (60, 48*RSIZE + 28*8);                                         \
+  rsave (61, 48*RSIZE + 29*8);                                         \
+  rsave (62, 48*RSIZE + 30*8);                                         \
+  rsave (63, 48*RSIZE + 31*8)
+
+/* Describe where the VMX regs are saved.  */
+#ifdef CONFIG_ALTIVEC
+#define EH_FRAME_VMX \
+  vsave_msr0 ( 0);                                                     \
+  vsave_msr1 ( 1);                                                     \
+  vsave_msr1 ( 2);                                                     \
+  vsave_msr1 ( 3);                                                     \
+  vsave_msr1 ( 4);                                                     \
+  vsave_msr1 ( 5);                                                     \
+  vsave_msr1 ( 6);                                                     \
+  vsave_msr1 ( 7);                                                     \
+  vsave_msr1 ( 8);                                                     \
+  vsave_msr1 ( 9);                                                     \
+  vsave_msr1 (10);                                                     \
+  vsave_msr1 (11);                                                     \
+  vsave_msr1 (12);                                                     \
+  vsave_msr1 (13);                                                     \
+  vsave_msr1 (14);                                                     \
+  vsave_msr1 (15);                                                     \
+  vsave_msr1 (16);                                                     \
+  vsave_msr1 (17);                                                     \
+  vsave_msr1 (18);                                                     \
+  vsave_msr1 (19);                                                     \
+  vsave_msr1 (20);                                                     \
+  vsave_msr1 (21);                                                     \
+  vsave_msr1 (22);                                                     \
+  vsave_msr1 (23);                                                     \
+  vsave_msr1 (24);                                                     \
+  vsave_msr1 (25);                                                     \
+  vsave_msr1 (26);                                                     \
+  vsave_msr1 (27);                                                     \
+  vsave_msr1 (28);                                                     \
+  vsave_msr1 (29);                                                     \
+  vsave_msr1 (30);                                                     \
+  vsave_msr1 (31);                                                     \
+  vsave_msr2 (33, 32*16+12);                                           \
+  vsave      (32, 32*16)
+#else
+#define EH_FRAME_VMX
+#endif
+
+.Lcie:
+       .long .Lcie_end - .Lcie_start
+.Lcie_start:
+       .long 0                 /* CIE ID */
+       .byte 1                 /* Version number */
+       .string "zR"            /* NUL-terminated augmentation string */
+       .uleb128 4              /* Code alignment factor */
+       .sleb128 -4             /* Data alignment factor */
+       .byte 67                /* Return address register column, ap */
+       .uleb128 1              /* Augmentation value length */
+       .byte 0x1b              /* DW_EH_PE_pcrel | DW_EH_PE_sdata4. */
+       .byte 0x0c,1,0          /* DW_CFA_def_cfa: r1 ofs 0 */
+       .balign 4
+.Lcie_end:
+
+       .long .Lfde0_end - .Lfde0_start
+.Lfde0_start:
+       .long .Lfde0_start - .Lcie      /* CIE pointer. */
+       .long .Lsig_start - .           /* PC start, length */
+       .long .Lsig_end - .Lsig_start
+       .uleb128 0                      /* Augmentation */
+       EH_FRAME_GEN
+       EH_FRAME_FP
+       EH_FRAME_VMX
+       .balign 4
+.Lfde0_end:
+
+/* We have a different stack layout for rt_sigreturn.  */
+#undef PTREGS
+#define PTREGS 64+16+128+20+28
+
+       .long .Lfde1_end - .Lfde1_start
+.Lfde1_start:
+       .long .Lfde1_start - .Lcie      /* CIE pointer. */
+       .long .Lsigrt_start - .         /* PC start, length */
+       .long .Lsigrt_end - .Lsigrt_start
+       .uleb128 0                      /* Augmentation */
+       EH_FRAME_GEN
+       EH_FRAME_FP
+       EH_FRAME_VMX
+       .balign 4
+.Lfde1_end:
diff --git a/arch/powerpc/kernel/vdso32/vdso32.lds.S b/arch/powerpc/kernel/vdso32/vdso32.lds.S
new file mode 100644 (file)
index 0000000..f4bad72
--- /dev/null
@@ -0,0 +1,117 @@
+
+/*
+ * This is the infamous ld script for the 32 bits vdso
+ * library
+ */
+#include <asm/vdso.h>
+
+/* Default link addresses for the vDSOs */
+OUTPUT_FORMAT("elf32-powerpc", "elf32-powerpc", "elf32-powerpc")
+OUTPUT_ARCH(powerpc:common)
+ENTRY(_start)
+
+SECTIONS
+{
+  . = VDSO32_LBASE + SIZEOF_HEADERS;
+  .hash           : { *(.hash) }                       :text
+  .dynsym         : { *(.dynsym) }
+  .dynstr         : { *(.dynstr) }
+  .gnu.version    : { *(.gnu.version) }
+  .gnu.version_d  : { *(.gnu.version_d) }
+  .gnu.version_r  : { *(.gnu.version_r) }
+
+  .note                  : { *(.note.*) }                      :text   :note
+
+  . = ALIGN (16);
+  .text :
+  {
+    *(.text .stub .text.* .gnu.linkonce.t.*)
+  }
+  PROVIDE (__etext = .);
+  PROVIDE (_etext = .);
+  PROVIDE (etext = .);
+
+  /* Other stuff is appended to the text segment: */
+  .rodata              : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
+  .rodata1             : { *(.rodata1) }
+
+  .eh_frame_hdr                : { *(.eh_frame_hdr) }          :text   :eh_frame_hdr
+  .eh_frame            : { KEEP (*(.eh_frame)) }       :text
+  .gcc_except_table    : { *(.gcc_except_table) }
+  .fixup               : { *(.fixup) }
+
+  .dynamic             : { *(.dynamic) }               :text   :dynamic
+  .got : { *(.got) }
+  .plt : { *(.plt) }
+
+  _end = .;
+  __end = .;
+  PROVIDE (end = .);
+
+
+  /* Stabs debugging sections are here too
+   */
+  .stab 0 : { *(.stab) }
+  .stabstr 0 : { *(.stabstr) }
+  .stab.excl 0 : { *(.stab.excl) }
+  .stab.exclstr 0 : { *(.stab.exclstr) }
+  .stab.index 0 : { *(.stab.index) }
+  .stab.indexstr 0 : { *(.stab.indexstr) }
+  .comment 0 : { *(.comment) }
+  .debug 0 : { *(.debug) }
+  .line 0 : { *(.line) }
+
+  .debug_srcinfo 0 : { *(.debug_srcinfo) }
+  .debug_sfnames 0 : { *(.debug_sfnames) }
+
+  .debug_aranges 0 : { *(.debug_aranges) }
+  .debug_pubnames 0 : { *(.debug_pubnames) }
+
+  .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
+  .debug_abbrev 0 : { *(.debug_abbrev) }
+  .debug_line 0 : { *(.debug_line) }
+  .debug_frame 0 : { *(.debug_frame) }
+  .debug_str 0 : { *(.debug_str) }
+  .debug_loc 0 : { *(.debug_loc) }
+  .debug_macinfo 0 : { *(.debug_macinfo) }
+
+  .debug_weaknames 0 : { *(.debug_weaknames) }
+  .debug_funcnames 0 : { *(.debug_funcnames) }
+  .debug_typenames 0 : { *(.debug_typenames) }
+  .debug_varnames 0 : { *(.debug_varnames) }
+
+  /DISCARD/ : { *(.note.GNU-stack) }
+  /DISCARD/ : { *(.data .data.* .gnu.linkonce.d.* .sdata*) }
+  /DISCARD/ : { *(.bss .sbss .dynbss .dynsbss) }
+}
+
+
+PHDRS
+{
+  text PT_LOAD FILEHDR PHDRS FLAGS(5); /* PF_R|PF_X */
+  note PT_NOTE FLAGS(4); /* PF_R */
+  dynamic PT_DYNAMIC FLAGS(4); /* PF_R */
+  eh_frame_hdr 0x6474e550; /* PT_GNU_EH_FRAME, but ld doesn't match the name */
+}
+
+
+/*
+ * This controls what symbols we export from the DSO.
+ */
+VERSION
+{
+  VDSO_VERSION_STRING {
+    global:
+       __kernel_datapage_offset; /* Has to be there for the kernel to find */
+       __kernel_get_syscall_map;
+       __kernel_gettimeofday;
+       __kernel_clock_gettime;
+       __kernel_clock_getres;
+       __kernel_get_tbfreq;
+       __kernel_sync_dicache;
+       __kernel_sync_dicache_p5;
+       __kernel_sigtramp32;
+       __kernel_sigtramp_rt32;
+    local: *;
+  };
+}
diff --git a/arch/powerpc/kernel/vdso32/vdso32_wrapper.S b/arch/powerpc/kernel/vdso32/vdso32_wrapper.S
new file mode 100644 (file)
index 0000000..556f0ca
--- /dev/null
@@ -0,0 +1,13 @@
+#include <linux/init.h>
+#include <asm/page.h>
+
+       .section ".data.page_aligned"
+
+       .globl vdso32_start, vdso32_end
+       .balign PAGE_SIZE
+vdso32_start:
+       .incbin "arch/powerpc/kernel/vdso32/vdso32.so"
+       .balign PAGE_SIZE
+vdso32_end:
+
+       .previous
diff --git a/arch/powerpc/kernel/vdso64/Makefile b/arch/powerpc/kernel/vdso64/Makefile
new file mode 100644 (file)
index 0000000..ab39988
--- /dev/null
@@ -0,0 +1,35 @@
+# List of files in the vdso, has to be asm only for now
+
+obj-vdso64 = sigtramp.o gettimeofday.o datapage.o cacheflush.o note.o
+
+# Build rules
+
+targets := $(obj-vdso64) vdso64.so
+obj-vdso64 := $(addprefix $(obj)/, $(obj-vdso64))
+
+EXTRA_CFLAGS := -shared -s -fno-common -fno-builtin
+EXTRA_CFLAGS +=  -nostdlib -Wl,-soname=linux-vdso64.so.1
+EXTRA_AFLAGS := -D__VDSO64__ -s
+
+obj-y += vdso64_wrapper.o
+extra-y += vdso64.lds
+CPPFLAGS_vdso64.lds += -P -C -U$(ARCH)
+
+# Force dependency (incbin is bad)
+$(obj)/vdso64_wrapper.o : $(obj)/vdso64.so
+
+# link rule for the .so file, .lds has to be first
+$(obj)/vdso64.so: $(src)/vdso64.lds $(obj-vdso64)
+       $(call if_changed,vdso64ld)
+
+# assembly rules for the .S files
+$(obj-vdso64): %.o: %.S
+       $(call if_changed_dep,vdso64as)
+
+# actual build commands
+quiet_cmd_vdso64ld = VDSO64L $@
+      cmd_vdso64ld = $(CC) $(c_flags) -Wl,-T $^ -o $@
+quiet_cmd_vdso64as = VDSO64A $@
+      cmd_vdso64as = $(CC) $(a_flags) -c -o $@ $<
+
+
diff --git a/arch/powerpc/kernel/vdso64/cacheflush.S b/arch/powerpc/kernel/vdso64/cacheflush.S
new file mode 100644 (file)
index 0000000..d4a0ad2
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * vDSO provided cache flush routines
+ *
+ * Copyright (C) 2004 Benjamin Herrenschmuidt (benh@kernel.crashing.org),
+ *                    IBM Corp.
+ *
+ * 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; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+#include <linux/config.h>
+#include <asm/processor.h>
+#include <asm/ppc_asm.h>
+#include <asm/vdso.h>
+#include <asm/asm-offsets.h>
+
+       .text
+
+/*
+ * Default "generic" version of __kernel_sync_dicache.
+ *
+ * void __kernel_sync_dicache(unsigned long start, unsigned long end)
+ *
+ * Flushes the data cache & invalidate the instruction cache for the
+ * provided range [start, end[
+ *
+ * Note: all CPUs supported by this kernel have a 128 bytes cache
+ * line size so we don't have to peek that info from the datapage
+ */
+V_FUNCTION_BEGIN(__kernel_sync_dicache)
+  .cfi_startproc
+       li      r5,127
+       andc    r6,r3,r5                /* round low to line bdy */
+       subf    r8,r6,r4                /* compute length */
+       add     r8,r8,r5                /* ensure we get enough */
+       srwi.   r8,r8,7                 /* compute line count */
+       beqlr                           /* nothing to do? */
+       mtctr   r8
+       mr      r3,r6
+1:     dcbst   0,r3
+       addi    r3,r3,128
+       bdnz    1b
+       sync
+       mtctr   r8
+1:     icbi    0,r6
+       addi    r6,r6,128
+       bdnz    1b
+       isync
+       li      r3,0
+       blr
+  .cfi_endproc
+V_FUNCTION_END(__kernel_sync_dicache)
+
+
+/*
+ * POWER5 version of __kernel_sync_dicache
+ */
+V_FUNCTION_BEGIN(__kernel_sync_dicache_p5)
+  .cfi_startproc
+       sync
+       isync
+       li      r3,0
+       blr
+  .cfi_endproc
+V_FUNCTION_END(__kernel_sync_dicache_p5)
diff --git a/arch/powerpc/kernel/vdso64/datapage.S b/arch/powerpc/kernel/vdso64/datapage.S
new file mode 100644 (file)
index 0000000..e67eda0
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * Access to the shared data page by the vDSO & syscall map
+ *
+ * Copyright (C) 2004 Benjamin Herrenschmuidt (benh@kernel.crashing.org), IBM Corp.
+ *
+ * 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; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/config.h>
+#include <asm/processor.h>
+#include <asm/ppc_asm.h>
+#include <asm/asm-offsets.h>
+#include <asm/unistd.h>
+#include <asm/vdso.h>
+
+       .text
+V_FUNCTION_BEGIN(__get_datapage)
+  .cfi_startproc
+       /* We don't want that exposed or overridable as we want other objects
+        * to be able to bl directly to here
+        */
+       .protected __get_datapage
+       .hidden __get_datapage
+
+       mflr    r0
+  .cfi_register lr,r0
+
+       bcl     20,31,1f
+       .global __kernel_datapage_offset;
+__kernel_datapage_offset:
+       .long   0
+1:
+       mflr    r3
+       mtlr    r0
+       lwz     r0,0(r3)
+       add     r3,r0,r3
+       blr
+  .cfi_endproc
+V_FUNCTION_END(__get_datapage)
+
+/*
+ * void *__kernel_get_syscall_map(unsigned int *syscall_count) ;
+ *
+ * returns a pointer to the syscall map. the map is agnostic to the
+ * size of "long", unlike kernel bitops, it stores bits from top to
+ * bottom so that memory actually contains a linear bitmap
+ * check for syscall N by testing bit (0x80000000 >> (N & 0x1f)) of
+ * 32 bits int at N >> 5.
+ */
+V_FUNCTION_BEGIN(__kernel_get_syscall_map)
+  .cfi_startproc
+       mflr    r12
+  .cfi_register lr,r12
+
+       mr      r4,r3
+       bl      V_LOCAL_FUNC(__get_datapage)
+       mtlr    r12
+       addi    r3,r3,CFG_SYSCALL_MAP64
+       cmpli   cr0,r4,0
+       beqlr
+       li      r0,__NR_syscalls
+       stw     r0,0(r4)
+       blr
+  .cfi_endproc
+V_FUNCTION_END(__kernel_get_syscall_map)
+
+
+/*
+ * void unsigned long  __kernel_get_tbfreq(void);
+ *
+ * returns the timebase frequency in HZ
+ */
+V_FUNCTION_BEGIN(__kernel_get_tbfreq)
+  .cfi_startproc
+       mflr    r12
+  .cfi_register lr,r12
+       bl      V_LOCAL_FUNC(__get_datapage)
+       ld      r3,CFG_TB_TICKS_PER_SEC(r3)
+       mtlr    r12
+  .cfi_endproc
+V_FUNCTION_END(__kernel_get_tbfreq)
diff --git a/arch/powerpc/kernel/vdso64/gettimeofday.S b/arch/powerpc/kernel/vdso64/gettimeofday.S
new file mode 100644 (file)
index 0000000..d371c02
--- /dev/null
@@ -0,0 +1,242 @@
+/*
+ * Userland implementation of gettimeofday() for 64 bits processes in a
+ * ppc64 kernel for use in the vDSO
+ *
+ * Copyright (C) 2004 Benjamin Herrenschmuidt (benh@kernel.crashing.org),
+ *                    IBM Corp.
+ *
+ * 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; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+#include <linux/config.h>
+#include <asm/processor.h>
+#include <asm/ppc_asm.h>
+#include <asm/vdso.h>
+#include <asm/asm-offsets.h>
+#include <asm/unistd.h>
+
+       .text
+/*
+ * Exact prototype of gettimeofday
+ *
+ * int __kernel_gettimeofday(struct timeval *tv, struct timezone *tz);
+ *
+ */
+V_FUNCTION_BEGIN(__kernel_gettimeofday)
+  .cfi_startproc
+       mflr    r12
+  .cfi_register lr,r12
+
+       mr      r11,r3                  /* r11 holds tv */
+       mr      r10,r4                  /* r10 holds tz */
+       bl      V_LOCAL_FUNC(__get_datapage)    /* get data page */
+       bl      V_LOCAL_FUNC(__do_get_xsec)     /* get xsec from tb & kernel */
+       lis     r7,15                   /* r7 = 1000000 = USEC_PER_SEC */
+       ori     r7,r7,16960
+       rldicl  r5,r4,44,20             /* r5 = sec = xsec / XSEC_PER_SEC */
+       rldicr  r6,r5,20,43             /* r6 = sec * XSEC_PER_SEC */
+       std     r5,TVAL64_TV_SEC(r11)   /* store sec in tv */
+       subf    r0,r6,r4                /* r0 = xsec = (xsec - r6) */
+       mulld   r0,r0,r7                /* usec = (xsec * USEC_PER_SEC) /
+                                        * XSEC_PER_SEC
+                                        */
+       rldicl  r0,r0,44,20
+       cmpldi  cr0,r10,0               /* check if tz is NULL */
+       std     r0,TVAL64_TV_USEC(r11)  /* store usec in tv */
+       beq     1f
+       lwz     r4,CFG_TZ_MINUTEWEST(r3)/* fill tz */
+       lwz     r5,CFG_TZ_DSTTIME(r3)
+       stw     r4,TZONE_TZ_MINWEST(r10)
+       stw     r5,TZONE_TZ_DSTTIME(r10)
+1:     mtlr    r12
+       li      r3,0                    /* always success */
+       blr
+  .cfi_endproc
+V_FUNCTION_END(__kernel_gettimeofday)
+
+
+/*
+ * Exact prototype of clock_gettime()
+ *
+ * int __kernel_clock_gettime(clockid_t clock_id, struct timespec *tp);
+ *
+ */
+V_FUNCTION_BEGIN(__kernel_clock_gettime)
+  .cfi_startproc
+       /* Check for supported clock IDs */
+       cmpwi   cr0,r3,CLOCK_REALTIME
+       cmpwi   cr1,r3,CLOCK_MONOTONIC
+       cror    cr0,cr0,cr1
+       bne     cr0,99f
+
+       mflr    r12                     /* r12 saves lr */
+  .cfi_register lr,r12
+       mr      r10,r3                  /* r10 saves id */
+       mr      r11,r4                  /* r11 saves tp */
+       bl      V_LOCAL_FUNC(__get_datapage)    /* get data page */
+       beq     cr1,50f                 /* if monotonic -> jump there */
+
+       /*
+        * CLOCK_REALTIME
+        */
+
+       bl      V_LOCAL_FUNC(__do_get_xsec)     /* get xsec from tb & kernel */
+
+       lis     r7,0x3b9a               /* r7 = 1000000000 = NSEC_PER_SEC */
+       ori     r7,r7,0xca00
+       rldicl  r5,r4,44,20             /* r5 = sec = xsec / XSEC_PER_SEC */
+       rldicr  r6,r5,20,43             /* r6 = sec * XSEC_PER_SEC */
+       std     r5,TSPC64_TV_SEC(r11)   /* store sec in tv */
+       subf    r0,r6,r4                /* r0 = xsec = (xsec - r6) */
+       mulld   r0,r0,r7                /* nsec = (xsec * NSEC_PER_SEC) /
+                                        * XSEC_PER_SEC
+                                        */
+       rldicl  r0,r0,44,20
+       std     r0,TSPC64_TV_NSEC(r11)  /* store nsec in tp */
+
+       mtlr    r12
+       li      r3,0
+       blr
+
+       /*
+        * CLOCK_MONOTONIC
+        */
+
+50:    bl      V_LOCAL_FUNC(__do_get_xsec)     /* get xsec from tb & kernel */
+
+       lis     r7,0x3b9a               /* r7 = 1000000000 = NSEC_PER_SEC */
+       ori     r7,r7,0xca00
+       rldicl  r5,r4,44,20             /* r5 = sec = xsec / XSEC_PER_SEC */
+       rldicr  r6,r5,20,43             /* r6 = sec * XSEC_PER_SEC */
+       subf    r0,r6,r4                /* r0 = xsec = (xsec - r6) */
+       mulld   r0,r0,r7                /* nsec = (xsec * NSEC_PER_SEC) /
+                                        * XSEC_PER_SEC
+                                        */
+       rldicl  r6,r0,44,20
+
+       /* now we must fixup using wall to monotonic. We need to snapshot
+        * that value and do the counter trick again. Fortunately, we still
+        * have the counter value in r8 that was returned by __do_get_xsec.
+        * At this point, r5,r6 contain our sec/nsec values.
+        * can be used
+        */
+
+       lwz     r4,WTOM_CLOCK_SEC(r9)
+       lwz     r7,WTOM_CLOCK_NSEC(r9)
+
+       /* We now have our result in r4,r7. We create a fake dependency
+        * on that result and re-check the counter
+        */
+       or      r9,r4,r7
+       xor     r0,r9,r9
+       add     r3,r3,r0
+       ld      r0,CFG_TB_UPDATE_COUNT(r3)
+        cmpld   cr0,r0,r8              /* check if updated */
+       bne-    50b
+
+       /* Calculate and store result. Note that this mimmics the C code,
+        * which may cause funny results if nsec goes negative... is that
+        * possible at all ?
+        */
+       add     r4,r4,r5
+       add     r7,r7,r6
+       lis     r9,NSEC_PER_SEC@h
+       ori     r9,r9,NSEC_PER_SEC@l
+       cmpli   cr0,r7,r9
+       blt     1f
+       subf    r7,r9,r7
+       addi    r4,r4,1
+1:     std     r4,TSPC64_TV_SEC(r11)
+       std     r7,TSPC64_TV_NSEC(r11)
+
+       mtlr    r12
+       li      r3,0
+       blr
+
+       /*
+        * syscall fallback
+        */
+98:
+       mtlr    r12
+       mr      r3,r10
+       mr      r4,r11
+99:
+       li      r0,__NR_clock_gettime
+       sc
+       blr
+  .cfi_endproc
+V_FUNCTION_END(__kernel_clock_gettime)
+
+
+/*
+ * Exact prototype of clock_getres()
+ *
+ * int __kernel_clock_getres(clockid_t clock_id, struct timespec *res);
+ *
+ */
+V_FUNCTION_BEGIN(__kernel_clock_getres)
+  .cfi_startproc
+       /* Check for supported clock IDs */
+       cmpwi   cr0,r3,CLOCK_REALTIME
+       cmpwi   cr1,r3,CLOCK_MONOTONIC
+       cror    cr0,cr0,cr1
+       bne     cr0,99f
+
+       li      r3,0
+       cmpli   cr0,r4,0
+       beqlr
+       lis     r5,CLOCK_REALTIME_RES@h
+       ori     r5,r5,CLOCK_REALTIME_RES@l
+       std     r3,TSPC64_TV_SEC(r4)
+       std     r5,TSPC64_TV_NSEC(r4)
+       blr
+
+       /*
+        * syscall fallback
+        */
+99:
+       li      r0,__NR_clock_getres
+       sc
+       blr
+  .cfi_endproc
+V_FUNCTION_END(__kernel_clock_getres)
+
+
+/*
+ * This is the core of gettimeofday(), it returns the xsec
+ * value in r4 and expects the datapage ptr (non clobbered)
+ * in r3. clobbers r0,r4,r5,r6,r7,r8
+ * When returning, r8 contains the counter value that can be reused
+ */
+V_FUNCTION_BEGIN(__do_get_xsec)
+  .cfi_startproc
+       /* check for update count & load values */
+1:     ld      r8,CFG_TB_UPDATE_COUNT(r3)
+       andi.   r0,r4,1                 /* pending update ? loop */
+       bne-    1b
+       xor     r0,r4,r4                /* create dependency */
+       add     r3,r3,r0
+
+       /* Get TB & offset it */
+       mftb    r7
+       ld      r9,CFG_TB_ORIG_STAMP(r3)
+       subf    r7,r9,r7
+
+       /* Scale result */
+       ld      r5,CFG_TB_TO_XS(r3)
+       mulhdu  r7,r7,r5
+
+       /* Add stamp since epoch */
+       ld      r6,CFG_STAMP_XSEC(r3)
+       add     r4,r6,r7
+
+       xor     r0,r4,r4
+       add     r3,r3,r0
+       ld      r0,CFG_TB_UPDATE_COUNT(r3)
+        cmpld   cr0,r0,r8              /* check if updated */
+       bne-    1b
+       blr
+  .cfi_endproc
+V_FUNCTION_END(__do_get_xsec)
diff --git a/arch/powerpc/kernel/vdso64/note.S b/arch/powerpc/kernel/vdso64/note.S
new file mode 100644 (file)
index 0000000..dc2a509
--- /dev/null
@@ -0,0 +1 @@
+#include "../vdso32/note.S"
diff --git a/arch/powerpc/kernel/vdso64/sigtramp.S b/arch/powerpc/kernel/vdso64/sigtramp.S
new file mode 100644 (file)
index 0000000..31b604a
--- /dev/null
@@ -0,0 +1,295 @@
+/*
+ * Signal trampoline for 64 bits processes in a ppc64 kernel for
+ * use in the vDSO
+ *
+ * Copyright (C) 2004 Benjamin Herrenschmuidt (benh@kernel.crashing.org), IBM Corp.
+ * Copyright (C) 2004 Alan Modra (amodra@au.ibm.com)), IBM Corp.
+ *
+ * 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; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+#include <linux/config.h>
+#include <asm/processor.h>
+#include <asm/ppc_asm.h>
+#include <asm/unistd.h>
+#include <asm/vdso.h>
+#include <asm/ptrace.h>                /* XXX for __SIGNAL_FRAMESIZE */
+
+       .text
+
+/* The nop here is a hack.  The dwarf2 unwind routines subtract 1 from
+   the return address to get an address in the middle of the presumed
+   call instruction.  Since we don't have a call here, we artifically
+   extend the range covered by the unwind info by padding before the
+   real start.  */
+       nop
+       .balign 8
+V_FUNCTION_BEGIN(__kernel_sigtramp_rt64)
+.Lsigrt_start = . - 4
+       addi    r1, r1, __SIGNAL_FRAMESIZE
+       li      r0,__NR_rt_sigreturn
+       sc
+.Lsigrt_end:
+V_FUNCTION_END(__kernel_sigtramp_rt64)
+/* The ".balign 8" above and the following zeros mimic the old stack
+   trampoline layout.  The last magic value is the ucontext pointer,
+   chosen in such a way that older libgcc unwind code returns a zero
+   for a sigcontext pointer.  */
+       .long 0,0,0
+       .quad 0,-21*8
+
+/* Register r1 can be found at offset 8 of a pt_regs structure.
+   A pointer to the pt_regs is stored in memory at the old sp plus PTREGS.  */
+#define cfa_save \
+  .byte 0x0f;                  /* DW_CFA_def_cfa_expression */         \
+  .uleb128 9f - 1f;            /*   length */                          \
+1:                                                                     \
+  .byte 0x71; .sleb128 PTREGS; /*     DW_OP_breg1 */                   \
+  .byte 0x06;                  /*     DW_OP_deref */                   \
+  .byte 0x23; .uleb128 RSIZE;  /*     DW_OP_plus_uconst */             \
+  .byte 0x06;                  /*     DW_OP_deref */                   \
+9:
+
+/* Register REGNO can be found at offset OFS of a pt_regs structure.
+   A pointer to the pt_regs is stored in memory at the old sp plus PTREGS.  */
+#define rsave(regno, ofs) \
+  .byte 0x10;                  /* DW_CFA_expression */                 \
+  .uleb128 regno;              /*   regno */                           \
+  .uleb128 9f - 1f;            /*   length */                          \
+1:                                                                     \
+  .byte 0x71; .sleb128 PTREGS; /*     DW_OP_breg1 */                   \
+  .byte 0x06;                  /*     DW_OP_deref */                   \
+  .ifne ofs;                                                           \
+    .byte 0x23; .uleb128 ofs;  /*     DW_OP_plus_uconst */             \
+  .endif;                                                              \
+9:
+
+/* If msr bit 1<<25 is set, then VMX register REGNO is at offset REGNO*16
+   of the VMX reg struct.  A pointer to the VMX reg struct is at VREGS in
+   the pt_regs struct.  This macro is for REGNO == 0, and contains
+   'subroutines' that the other macros jump to.  */
+#define vsave_msr0(regno) \
+  .byte 0x10;                  /* DW_CFA_expression */                 \
+  .uleb128 regno + 77;         /*   regno */                           \
+  .uleb128 9f - 1f;            /*   length */                          \
+1:                                                                     \
+  .byte 0x30 + regno;          /*     DW_OP_lit0 */                    \
+2:                                                                     \
+  .byte 0x40;                  /*     DW_OP_lit16 */                   \
+  .byte 0x1e;                  /*     DW_OP_mul */                     \
+3:                                                                     \
+  .byte 0x71; .sleb128 PTREGS; /*     DW_OP_breg1 */                   \
+  .byte 0x06;                  /*     DW_OP_deref */                   \
+  .byte 0x12;                  /*     DW_OP_dup */                     \
+  .byte 0x23;                  /*     DW_OP_plus_uconst */             \
+    .uleb128 33*RSIZE;         /*       msr offset */                  \
+  .byte 0x06;                  /*     DW_OP_deref */                   \
+  .byte 0x0c; .long 1 << 25;   /*     DW_OP_const4u */                 \
+  .byte 0x1a;                  /*     DW_OP_and */                     \
+  .byte 0x12;                  /*     DW_OP_dup, ret 0 if bra taken */ \
+  .byte 0x30;                  /*     DW_OP_lit0 */                    \
+  .byte 0x29;                  /*     DW_OP_eq */                      \
+  .byte 0x28; .short 0x7fff;   /*     DW_OP_bra to end */              \
+  .byte 0x13;                  /*     DW_OP_drop, pop the 0 */         \
+  .byte 0x23; .uleb128 VREGS;  /*     DW_OP_plus_uconst */             \
+  .byte 0x06;                  /*     DW_OP_deref */                   \
+  .byte 0x22;                  /*     DW_OP_plus */                    \
+  .byte 0x2f; .short 0x7fff;   /*     DW_OP_skip to end */             \
+9:
+
+/* If msr bit 1<<25 is set, then VMX register REGNO is at offset REGNO*16
+   of the VMX reg struct.  REGNO is 1 thru 31.  */
+#define vsave_msr1(regno) \
+  .byte 0x10;                  /* DW_CFA_expression */                 \
+  .uleb128 regno + 77;         /*   regno */                           \
+  .uleb128 9f - 1f;            /*   length */                          \
+1:                                                                     \
+  .byte 0x30 + regno;          /*     DW_OP_lit n */                   \
+  .byte 0x2f; .short 2b - 9f;  /*     DW_OP_skip */                    \
+9:
+
+/* If msr bit 1<<25 is set, then VMX register REGNO is at offset OFS of
+   the VMX save block.  */
+#define vsave_msr2(regno, ofs) \
+  .byte 0x10;                  /* DW_CFA_expression */                 \
+  .uleb128 regno + 77;         /*   regno */                           \
+  .uleb128 9f - 1f;            /*   length */                          \
+1:                                                                     \
+  .byte 0x0a; .short ofs;      /*     DW_OP_const2u */                 \
+  .byte 0x2f; .short 3b - 9f;  /*     DW_OP_skip */                    \
+9:
+
+/* VMX register REGNO is at offset OFS of the VMX save area.  */
+#define vsave(regno, ofs) \
+  .byte 0x10;                  /* DW_CFA_expression */                 \
+  .uleb128 regno + 77;         /*   regno */                           \
+  .uleb128 9f - 1f;            /*   length */                          \
+1:                                                                     \
+  .byte 0x71; .sleb128 PTREGS; /*     DW_OP_breg1 */                   \
+  .byte 0x06;                  /*     DW_OP_deref */                   \
+  .byte 0x23; .uleb128 VREGS;  /*     DW_OP_plus_uconst */             \
+  .byte 0x06;                  /*     DW_OP_deref */                   \
+  .byte 0x23; .uleb128 ofs;    /*     DW_OP_plus_uconst */             \
+9:
+
+/* This is where the pt_regs pointer can be found on the stack.  */
+#define PTREGS 128+168+56
+
+/* Size of regs.  */
+#define RSIZE 8
+
+/* This is the offset of the VMX reg pointer.  */
+#define VREGS 48*RSIZE+33*8
+
+/* Describe where general purpose regs are saved.  */
+#define EH_FRAME_GEN \
+  cfa_save;                                                            \
+  rsave ( 0,  0*RSIZE);                                                        \
+  rsave ( 2,  2*RSIZE);                                                        \
+  rsave ( 3,  3*RSIZE);                                                        \
+  rsave ( 4,  4*RSIZE);                                                        \
+  rsave ( 5,  5*RSIZE);                                                        \
+  rsave ( 6,  6*RSIZE);                                                        \
+  rsave ( 7,  7*RSIZE);                                                        \
+  rsave ( 8,  8*RSIZE);                                                        \
+  rsave ( 9,  9*RSIZE);                                                        \
+  rsave (10, 10*RSIZE);                                                        \
+  rsave (11, 11*RSIZE);                                                        \
+  rsave (12, 12*RSIZE);                                                        \
+  rsave (13, 13*RSIZE);                                                        \
+  rsave (14, 14*RSIZE);                                                        \
+  rsave (15, 15*RSIZE);                                                        \
+  rsave (16, 16*RSIZE);                                                        \
+  rsave (17, 17*RSIZE);                                                        \
+  rsave (18, 18*RSIZE);                                                        \
+  rsave (19, 19*RSIZE);                                                        \
+  rsave (20, 20*RSIZE);                                                        \
+  rsave (21, 21*RSIZE);                                                        \
+  rsave (22, 22*RSIZE);                                                        \
+  rsave (23, 23*RSIZE);                                                        \
+  rsave (24, 24*RSIZE);                                                        \
+  rsave (25, 25*RSIZE);                                                        \
+  rsave (26, 26*RSIZE);                                                        \
+  rsave (27, 27*RSIZE);                                                        \
+  rsave (28, 28*RSIZE);                                                        \
+  rsave (29, 29*RSIZE);                                                        \
+  rsave (30, 30*RSIZE);                                                        \
+  rsave (31, 31*RSIZE);                                                        \
+  rsave (67, 32*RSIZE);                /* ap, used as temp for nip */          \
+  rsave (65, 36*RSIZE);                /* lr */                                \
+  rsave (70, 38*RSIZE)         /* cr */
+
+/* Describe where the FP regs are saved.  */
+#define EH_FRAME_FP \
+  rsave (32, 48*RSIZE +  0*8);                                         \
+  rsave (33, 48*RSIZE +  1*8);                                         \
+  rsave (34, 48*RSIZE +  2*8);                                         \
+  rsave (35, 48*RSIZE +  3*8);                                         \
+  rsave (36, 48*RSIZE +  4*8);                                         \
+  rsave (37, 48*RSIZE +  5*8);                                         \
+  rsave (38, 48*RSIZE +  6*8);                                         \
+  rsave (39, 48*RSIZE +  7*8);                                         \
+  rsave (40, 48*RSIZE +  8*8);                                         \
+  rsave (41, 48*RSIZE +  9*8);                                         \
+  rsave (42, 48*RSIZE + 10*8);                                         \
+  rsave (43, 48*RSIZE + 11*8);                                         \
+  rsave (44, 48*RSIZE + 12*8);                                         \
+  rsave (45, 48*RSIZE + 13*8);                                         \
+  rsave (46, 48*RSIZE + 14*8);                                         \
+  rsave (47, 48*RSIZE + 15*8);                                         \
+  rsave (48, 48*RSIZE + 16*8);                                         \
+  rsave (49, 48*RSIZE + 17*8);                                         \
+  rsave (50, 48*RSIZE + 18*8);                                         \
+  rsave (51, 48*RSIZE + 19*8);                                         \
+  rsave (52, 48*RSIZE + 20*8);                                         \
+  rsave (53, 48*RSIZE + 21*8);                                         \
+  rsave (54, 48*RSIZE + 22*8);                                         \
+  rsave (55, 48*RSIZE + 23*8);                                         \
+  rsave (56, 48*RSIZE + 24*8);                                         \
+  rsave (57, 48*RSIZE + 25*8);                                         \
+  rsave (58, 48*RSIZE + 26*8);                                         \
+  rsave (59, 48*RSIZE + 27*8);                                         \
+  rsave (60, 48*RSIZE + 28*8);                                         \
+  rsave (61, 48*RSIZE + 29*8);                                         \
+  rsave (62, 48*RSIZE + 30*8);                                         \
+  rsave (63, 48*RSIZE + 31*8)
+
+/* Describe where the VMX regs are saved.  */
+#ifdef CONFIG_ALTIVEC
+#define EH_FRAME_VMX \
+  vsave_msr0 ( 0);                                                     \
+  vsave_msr1 ( 1);                                                     \
+  vsave_msr1 ( 2);                                                     \
+  vsave_msr1 ( 3);                                                     \
+  vsave_msr1 ( 4);                                                     \
+  vsave_msr1 ( 5);                                                     \
+  vsave_msr1 ( 6);                                                     \
+  vsave_msr1 ( 7);                                                     \
+  vsave_msr1 ( 8);                                                     \
+  vsave_msr1 ( 9);                                                     \
+  vsave_msr1 (10);                                                     \
+  vsave_msr1 (11);                                                     \
+  vsave_msr1 (12);                                                     \
+  vsave_msr1 (13);                                                     \
+  vsave_msr1 (14);                                                     \
+  vsave_msr1 (15);                                                     \
+  vsave_msr1 (16);                                                     \
+  vsave_msr1 (17);                                                     \
+  vsave_msr1 (18);                                                     \
+  vsave_msr1 (19);                                                     \
+  vsave_msr1 (20);                                                     \
+  vsave_msr1 (21);                                                     \
+  vsave_msr1 (22);                                                     \
+  vsave_msr1 (23);                                                     \
+  vsave_msr1 (24);                                                     \
+  vsave_msr1 (25);                                                     \
+  vsave_msr1 (26);                                                     \
+  vsave_msr1 (27);                                                     \
+  vsave_msr1 (28);                                                     \
+  vsave_msr1 (29);                                                     \
+  vsave_msr1 (30);                                                     \
+  vsave_msr1 (31);                                                     \
+  vsave_msr2 (33, 32*16+12);                                           \
+  vsave      (32, 33*16)
+#else
+#define EH_FRAME_VMX
+#endif
+
+       .section .eh_frame,"a",@progbits
+.Lcie:
+       .long .Lcie_end - .Lcie_start
+.Lcie_start:
+       .long 0                 /* CIE ID */
+       .byte 1                 /* Version number */
+       .string "zR"            /* NUL-terminated augmentation string */
+       .uleb128 4              /* Code alignment factor */
+       .sleb128 -8             /* Data alignment factor */
+       .byte 67                /* Return address register column, ap */
+       .uleb128 1              /* Augmentation value length */
+       .byte 0x14              /* DW_EH_PE_pcrel | DW_EH_PE_udata8. */
+       .byte 0x0c,1,0          /* DW_CFA_def_cfa: r1 ofs 0 */
+       .balign 8
+.Lcie_end:
+
+       .long .Lfde0_end - .Lfde0_start
+.Lfde0_start:
+       .long .Lfde0_start - .Lcie      /* CIE pointer. */
+       .quad .Lsigrt_start - .         /* PC start, length */
+       .quad .Lsigrt_end - .Lsigrt_start
+       .uleb128 0                      /* Augmentation */
+       EH_FRAME_GEN
+       EH_FRAME_FP
+       EH_FRAME_VMX
+# Do we really need to describe the frame at this point?  ie. will
+# we ever have some call chain that returns somewhere past the addi?
+# I don't think so, since gcc doesn't support async signals.
+#      .byte 0x41              /* DW_CFA_advance_loc 1*4 */
+#undef PTREGS
+#define PTREGS 168+56
+#      EH_FRAME_GEN
+#      EH_FRAME_FP
+#      EH_FRAME_VMX
+       .balign 8
+.Lfde0_end:
diff --git a/arch/powerpc/kernel/vdso64/vdso64.lds.S b/arch/powerpc/kernel/vdso64/vdso64.lds.S
new file mode 100644 (file)
index 0000000..4bdf224
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+ * This is the infamous ld script for the 64 bits vdso
+ * library
+ */
+#include <asm/vdso.h>
+
+OUTPUT_FORMAT("elf64-powerpc", "elf64-powerpc", "elf64-powerpc")
+OUTPUT_ARCH(powerpc:common64)
+ENTRY(_start)
+
+SECTIONS
+{
+  . = VDSO64_LBASE + SIZEOF_HEADERS;
+  .hash           : { *(.hash) }               :text
+  .dynsym         : { *(.dynsym) }
+  .dynstr         : { *(.dynstr) }
+  .gnu.version    : { *(.gnu.version) }
+  .gnu.version_d  : { *(.gnu.version_d) }
+  .gnu.version_r  : { *(.gnu.version_r) }
+
+  .note                  : { *(.note.*) }              :text   :note
+
+  . = ALIGN (16);
+  .text           :
+  {
+    *(.text .stub .text.* .gnu.linkonce.t.*)
+    *(.sfpr .glink)
+  }                                            :text
+  PROVIDE (__etext = .);
+  PROVIDE (_etext = .);
+  PROVIDE (etext = .);
+
+  /* Other stuff is appended to the text segment: */
+  .rodata         : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
+  .rodata1        : { *(.rodata1) }
+  .eh_frame_hdr   : { *(.eh_frame_hdr) }       :text   :eh_frame_hdr
+  .eh_frame       : { KEEP (*(.eh_frame)) }    :text
+  .gcc_except_table   : { *(.gcc_except_table) }
+
+  .opd           ALIGN(8) : { KEEP (*(.opd)) }
+  .got          ALIGN(8) : { *(.got .toc) }
+  .rela.dyn     ALIGN(8) : { *(.rela.dyn) }
+
+  .dynamic        : { *(.dynamic) }            :text   :dynamic
+
+  _end = .;
+  PROVIDE (end = .);
+
+  /* Stabs debugging sections are here too
+   */
+  .stab          0 : { *(.stab) }
+  .stabstr       0 : { *(.stabstr) }
+  .stab.excl     0 : { *(.stab.excl) }
+  .stab.exclstr  0 : { *(.stab.exclstr) }
+  .stab.index    0 : { *(.stab.index) }
+  .stab.indexstr 0 : { *(.stab.indexstr) }
+  .comment       0 : { *(.comment) }
+  /* DWARF debug sectio/ns.
+     Symbols in the DWARF debugging sections are relative to the beginning
+     of the section so we begin them at 0.  */
+  /* DWARF 1 */
+  .debug          0 : { *(.debug) }
+  .line           0 : { *(.line) }
+  /* GNU DWARF 1 extensions */
+  .debug_srcinfo  0 : { *(.debug_srcinfo) }
+  .debug_sfnames  0 : { *(.debug_sfnames) }
+  /* DWARF 1.1 and DWARF 2 */
+  .debug_aranges  0 : { *(.debug_aranges) }
+  .debug_pubnames 0 : { *(.debug_pubnames) }
+  /* DWARF 2 */
+  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
+  .debug_abbrev   0 : { *(.debug_abbrev) }
+  .debug_line     0 : { *(.debug_line) }
+  .debug_frame    0 : { *(.debug_frame) }
+  .debug_str      0 : { *(.debug_str) }
+  .debug_loc      0 : { *(.debug_loc) }
+  .debug_macinfo  0 : { *(.debug_macinfo) }
+  /* SGI/MIPS DWARF 2 extensions */
+  .debug_weaknames 0 : { *(.debug_weaknames) }
+  .debug_funcnames 0 : { *(.debug_funcnames) }
+  .debug_typenames 0 : { *(.debug_typenames) }
+  .debug_varnames  0 : { *(.debug_varnames) }
+
+  /DISCARD/ : { *(.note.GNU-stack) }
+  /DISCARD/ : { *(.branch_lt) }
+  /DISCARD/ : { *(.data .data.* .gnu.linkonce.d.*) }
+  /DISCARD/ : { *(.bss .sbss .dynbss .dynsbss) }
+}
+
+PHDRS
+{
+  text PT_LOAD FILEHDR PHDRS FLAGS(5); /* PF_R|PF_X */
+  note PT_NOTE FLAGS(4); /* PF_R */
+  dynamic PT_DYNAMIC FLAGS(4); /* PF_R */
+  eh_frame_hdr 0x6474e550; /* PT_GNU_EH_FRAME, but ld doesn't match the name */
+}
+
+/*
+ * This controls what symbols we export from the DSO.
+ */
+VERSION
+{
+  VDSO_VERSION_STRING {
+    global:
+       __kernel_datapage_offset; /* Has to be there for the kernel to find */
+       __kernel_get_syscall_map;
+       __kernel_gettimeofday;
+       __kernel_clock_gettime;
+       __kernel_clock_getres;
+       __kernel_get_tbfreq;
+       __kernel_sync_dicache;
+       __kernel_sync_dicache_p5;
+       __kernel_sigtramp_rt64;
+    local: *;
+  };
+}
diff --git a/arch/powerpc/kernel/vdso64/vdso64_wrapper.S b/arch/powerpc/kernel/vdso64/vdso64_wrapper.S
new file mode 100644 (file)
index 0000000..0529cb9
--- /dev/null
@@ -0,0 +1,13 @@
+#include <linux/init.h>
+#include <asm/page.h>
+
+       .section ".data.page_aligned"
+
+       .globl vdso64_start, vdso64_end
+       .balign PAGE_SIZE
+vdso64_start:
+       .incbin "arch/powerpc/kernel/vdso64/vdso64.so"
+       .balign PAGE_SIZE
+vdso64_end:
+
+       .previous
index 1dd3cc69a4901710d0514202dad224121619d9df..e2c95fcb8055186cf2e4d452d0d125c86e024820 100644 (file)
@@ -46,9 +46,7 @@
 #include <asm/prom.h>
 #include <asm/lmb.h>
 #include <asm/sections.h>
-#ifdef CONFIG_PPC64
 #include <asm/vdso.h>
-#endif
 
 #include "mmu_decl.h"
 
@@ -397,10 +395,8 @@ void __init mem_init(void)
 
        mem_init_done = 1;
 
-#ifdef CONFIG_PPC64
        /* Initialize the vDSO */
        vdso_init();
-#endif
 }
 
 /*
index da09ba03c424fb6b89ca06c795bbf2c646d5f734..bd2cf13368853f0518fbf5e018f8b2069b6998d8 100644 (file)
@@ -17,9 +17,8 @@
 #include <linux/nodemask.h>
 #include <linux/cpu.h>
 #include <linux/notifier.h>
+#include <asm/sparsemem.h>
 #include <asm/lmb.h>
-#include <asm/machdep.h>
-#include <asm/abs_addr.h>
 #include <asm/system.h>
 #include <asm/smp.h>
 
@@ -28,45 +27,113 @@ static int numa_enabled = 1;
 static int numa_debug;
 #define dbg(args...) if (numa_debug) { printk(KERN_INFO args); }
 
-#ifdef DEBUG_NUMA
-#define ARRAY_INITIALISER -1
-#else
-#define ARRAY_INITIALISER 0
-#endif
-
-int numa_cpu_lookup_table[NR_CPUS] = { [ 0 ... (NR_CPUS - 1)] =
-       ARRAY_INITIALISER};
-char *numa_memory_lookup_table;
+int numa_cpu_lookup_table[NR_CPUS];
 cpumask_t numa_cpumask_lookup_table[MAX_NUMNODES];
-int nr_cpus_in_node[MAX_NUMNODES] = { [0 ... (MAX_NUMNODES -1)] = 0};
-
 struct pglist_data *node_data[MAX_NUMNODES];
-bootmem_data_t __initdata plat_node_bdata[MAX_NUMNODES];
+
+EXPORT_SYMBOL(numa_cpu_lookup_table);
+EXPORT_SYMBOL(numa_cpumask_lookup_table);
+EXPORT_SYMBOL(node_data);
+
+static bootmem_data_t __initdata plat_node_bdata[MAX_NUMNODES];
 static int min_common_depth;
 
 /*
- * We need somewhere to store start/span for each node until we have
+ * We need somewhere to store start/end/node for each region until we have
  * allocated the real node_data structures.
  */
+#define MAX_REGIONS    (MAX_LMB_REGIONS*2)
 static struct {
-       unsigned long node_start_pfn;
-       unsigned long node_end_pfn;
-       unsigned long node_present_pages;
-} init_node_data[MAX_NUMNODES] __initdata;
+       unsigned long start_pfn;
+       unsigned long end_pfn;
+       int nid;
+} init_node_data[MAX_REGIONS] __initdata;
 
-EXPORT_SYMBOL(node_data);
-EXPORT_SYMBOL(numa_cpu_lookup_table);
-EXPORT_SYMBOL(numa_memory_lookup_table);
-EXPORT_SYMBOL(numa_cpumask_lookup_table);
-EXPORT_SYMBOL(nr_cpus_in_node);
+int __init early_pfn_to_nid(unsigned long pfn)
+{
+       unsigned int i;
+
+       for (i = 0; init_node_data[i].end_pfn; i++) {
+               unsigned long start_pfn = init_node_data[i].start_pfn;
+               unsigned long end_pfn = init_node_data[i].end_pfn;
+
+               if ((start_pfn <= pfn) && (pfn < end_pfn))
+                       return init_node_data[i].nid;
+       }
+
+       return -1;
+}
+
+void __init add_region(unsigned int nid, unsigned long start_pfn,
+                      unsigned long pages)
+{
+       unsigned int i;
+
+       dbg("add_region nid %d start_pfn 0x%lx pages 0x%lx\n",
+               nid, start_pfn, pages);
+
+       for (i = 0; init_node_data[i].end_pfn; i++) {
+               if (init_node_data[i].nid != nid)
+                       continue;
+               if (init_node_data[i].end_pfn == start_pfn) {
+                       init_node_data[i].end_pfn += pages;
+                       return;
+               }
+               if (init_node_data[i].start_pfn == (start_pfn + pages)) {
+                       init_node_data[i].start_pfn -= pages;
+                       return;
+               }
+       }
+
+       /*
+        * Leave last entry NULL so we dont iterate off the end (we use
+        * entry.end_pfn to terminate the walk).
+        */
+       if (i >= (MAX_REGIONS - 1)) {
+               printk(KERN_ERR "WARNING: too many memory regions in "
+                               "numa code, truncating\n");
+               return;
+       }
+
+       init_node_data[i].start_pfn = start_pfn;
+       init_node_data[i].end_pfn = start_pfn + pages;
+       init_node_data[i].nid = nid;
+}
+
+/* We assume init_node_data has no overlapping regions */
+void __init get_region(unsigned int nid, unsigned long *start_pfn,
+                      unsigned long *end_pfn, unsigned long *pages_present)
+{
+       unsigned int i;
+
+       *start_pfn = -1UL;
+       *end_pfn = *pages_present = 0;
+
+       for (i = 0; init_node_data[i].end_pfn; i++) {
+               if (init_node_data[i].nid != nid)
+                       continue;
+
+               *pages_present += init_node_data[i].end_pfn -
+                       init_node_data[i].start_pfn;
+
+               if (init_node_data[i].start_pfn < *start_pfn)
+                       *start_pfn = init_node_data[i].start_pfn;
+
+               if (init_node_data[i].end_pfn > *end_pfn)
+                       *end_pfn = init_node_data[i].end_pfn;
+       }
+
+       /* We didnt find a matching region, return start/end as 0 */
+       if (*start_pfn == -1UL)
+               start_pfn = 0;
+}
 
 static inline void map_cpu_to_node(int cpu, int node)
 {
        numa_cpu_lookup_table[cpu] = node;
-       if (!(cpu_isset(cpu, numa_cpumask_lookup_table[node]))) {
+
+       if (!(cpu_isset(cpu, numa_cpumask_lookup_table[node])))
                cpu_set(cpu, numa_cpumask_lookup_table[node]);
-               nr_cpus_in_node[node]++;
-       }
 }
 
 #ifdef CONFIG_HOTPLUG_CPU
@@ -78,7 +145,6 @@ static void unmap_cpu_from_node(unsigned long cpu)
 
        if (cpu_isset(cpu, numa_cpumask_lookup_table[node])) {
                cpu_clear(cpu, numa_cpumask_lookup_table[node]);
-               nr_cpus_in_node[node]--;
        } else {
                printk(KERN_ERR "WARNING: cpu %lu not found in node %d\n",
                       cpu, node);
@@ -86,7 +152,7 @@ static void unmap_cpu_from_node(unsigned long cpu)
 }
 #endif /* CONFIG_HOTPLUG_CPU */
 
-static struct device_node * __devinit find_cpu_node(unsigned int cpu)
+static struct device_node *find_cpu_node(unsigned int cpu)
 {
        unsigned int hw_cpuid = get_hard_smp_processor_id(cpu);
        struct device_node *cpu_node = NULL;
@@ -213,7 +279,7 @@ static int __init get_mem_size_cells(void)
        return rc;
 }
 
-static unsigned long read_n_cells(int n, unsigned int **buf)
+static unsigned long __init read_n_cells(int n, unsigned int **buf)
 {
        unsigned long result = 0;
 
@@ -295,7 +361,8 @@ static int cpu_numa_callback(struct notifier_block *nfb,
  * or zero. If the returned value of size is 0 the region should be
  * discarded as it lies wholy above the memory limit.
  */
-static unsigned long __init numa_enforce_memory_limit(unsigned long start, unsigned long size)
+static unsigned long __init numa_enforce_memory_limit(unsigned long start,
+                                                     unsigned long size)
 {
        /*
         * We use lmb_end_of_DRAM() in here instead of memory_limit because
@@ -320,8 +387,7 @@ static int __init parse_numa_properties(void)
        struct device_node *cpu = NULL;
        struct device_node *memory = NULL;
        int addr_cells, size_cells;
-       int max_domain = 0;
-       long entries = lmb_end_of_DRAM() >> MEMORY_INCREMENT_SHIFT;
+       int max_domain;
        unsigned long i;
 
        if (numa_enabled == 0) {
@@ -329,13 +395,6 @@ static int __init parse_numa_properties(void)
                return -1;
        }
 
-       numa_memory_lookup_table =
-               (char *)abs_to_virt(lmb_alloc(entries * sizeof(char), 1));
-       memset(numa_memory_lookup_table, 0, entries * sizeof(char));
-
-       for (i = 0; i < entries ; i++)
-               numa_memory_lookup_table[i] = ARRAY_INITIALISER;
-
        min_common_depth = find_min_common_depth();
 
        dbg("NUMA associativity depth for CPU/Memory: %d\n", min_common_depth);
@@ -387,9 +446,6 @@ new_range:
                start = read_n_cells(addr_cells, &memcell_buf);
                size = read_n_cells(size_cells, &memcell_buf);
 
-               start = _ALIGN_DOWN(start, MEMORY_INCREMENT);
-               size = _ALIGN_UP(size, MEMORY_INCREMENT);
-
                numa_domain = of_node_numa_domain(memory);
 
                if (numa_domain >= MAX_NUMNODES) {
@@ -403,44 +459,15 @@ new_range:
                if (max_domain < numa_domain)
                        max_domain = numa_domain;
 
-               if (! (size = numa_enforce_memory_limit(start, size))) {
+               if (!(size = numa_enforce_memory_limit(start, size))) {
                        if (--ranges)
                                goto new_range;
                        else
                                continue;
                }
 
-               /*
-                * Initialize new node struct, or add to an existing one.
-                */
-               if (init_node_data[numa_domain].node_end_pfn) {
-                       if ((start / PAGE_SIZE) <
-                           init_node_data[numa_domain].node_start_pfn)
-                               init_node_data[numa_domain].node_start_pfn =
-                                       start / PAGE_SIZE;
-                       if (((start / PAGE_SIZE) + (size / PAGE_SIZE)) >
-                           init_node_data[numa_domain].node_end_pfn)
-                               init_node_data[numa_domain].node_end_pfn =
-                                       (start / PAGE_SIZE) +
-                                       (size / PAGE_SIZE);
-
-                       init_node_data[numa_domain].node_present_pages +=
-                               size / PAGE_SIZE;
-               } else {
-                       node_set_online(numa_domain);
-
-                       init_node_data[numa_domain].node_start_pfn =
-                               start / PAGE_SIZE;
-                       init_node_data[numa_domain].node_end_pfn =
-                               init_node_data[numa_domain].node_start_pfn +
-                               size / PAGE_SIZE;
-                       init_node_data[numa_domain].node_present_pages =
-                               size / PAGE_SIZE;
-               }
-
-               for (i = start ; i < (start+size); i += MEMORY_INCREMENT)
-                       numa_memory_lookup_table[i >> MEMORY_INCREMENT_SHIFT] =
-                               numa_domain;
+               add_region(numa_domain, start >> PAGE_SHIFT,
+                          size >> PAGE_SHIFT);
 
                if (--ranges)
                        goto new_range;
@@ -456,32 +483,15 @@ static void __init setup_nonnuma(void)
 {
        unsigned long top_of_ram = lmb_end_of_DRAM();
        unsigned long total_ram = lmb_phys_mem_size();
-       unsigned long i;
 
        printk(KERN_INFO "Top of RAM: 0x%lx, Total RAM: 0x%lx\n",
               top_of_ram, total_ram);
        printk(KERN_INFO "Memory hole size: %ldMB\n",
               (top_of_ram - total_ram) >> 20);
 
-       if (!numa_memory_lookup_table) {
-               long entries = top_of_ram >> MEMORY_INCREMENT_SHIFT;
-               numa_memory_lookup_table =
-                       (char *)abs_to_virt(lmb_alloc(entries * sizeof(char), 1));
-               memset(numa_memory_lookup_table, 0, entries * sizeof(char));
-               for (i = 0; i < entries ; i++)
-                       numa_memory_lookup_table[i] = ARRAY_INITIALISER;
-       }
-
        map_cpu_to_node(boot_cpuid, 0);
-
+       add_region(0, 0, lmb_end_of_DRAM() >> PAGE_SHIFT);
        node_set_online(0);
-
-       init_node_data[0].node_start_pfn = 0;
-       init_node_data[0].node_end_pfn = lmb_end_of_DRAM() / PAGE_SIZE;
-       init_node_data[0].node_present_pages = total_ram / PAGE_SIZE;
-
-       for (i = 0 ; i < top_of_ram; i += MEMORY_INCREMENT)
-               numa_memory_lookup_table[i >> MEMORY_INCREMENT_SHIFT] = 0;
 }
 
 static void __init dump_numa_topology(void)
@@ -499,8 +509,9 @@ static void __init dump_numa_topology(void)
 
                count = 0;
 
-               for (i = 0; i < lmb_end_of_DRAM(); i += MEMORY_INCREMENT) {
-                       if (numa_memory_lookup_table[i >> MEMORY_INCREMENT_SHIFT] == node) {
+               for (i = 0; i < lmb_end_of_DRAM();
+                    i += (1 << SECTION_SIZE_BITS)) {
+                       if (early_pfn_to_nid(i >> PAGE_SHIFT) == node) {
                                if (count == 0)
                                        printk(" 0x%lx", i);
                                ++count;
@@ -525,10 +536,12 @@ static void __init dump_numa_topology(void)
  *
  * Returns the physical address of the memory.
  */
-static unsigned long careful_allocation(int nid, unsigned long size,
-                                       unsigned long align, unsigned long end)
+static void __init *careful_allocation(int nid, unsigned long size,
+                                      unsigned long align,
+                                      unsigned long end_pfn)
 {
-       unsigned long ret = lmb_alloc_base(size, align, end);
+       int new_nid;
+       unsigned long ret = lmb_alloc_base(size, align, end_pfn << PAGE_SHIFT);
 
        /* retry over all memory */
        if (!ret)
@@ -542,28 +555,27 @@ static unsigned long careful_allocation(int nid, unsigned long size,
         * If the memory came from a previously allocated node, we must
         * retry with the bootmem allocator.
         */
-       if (pa_to_nid(ret) < nid) {
-               nid = pa_to_nid(ret);
-               ret = (unsigned long)__alloc_bootmem_node(NODE_DATA(nid),
+       new_nid = early_pfn_to_nid(ret >> PAGE_SHIFT);
+       if (new_nid < nid) {
+               ret = (unsigned long)__alloc_bootmem_node(NODE_DATA(new_nid),
                                size, align, 0);
 
                if (!ret)
                        panic("numa.c: cannot allocate %lu bytes on node %d",
-                             size, nid);
+                             size, new_nid);
 
-               ret = virt_to_abs(ret);
+               ret = __pa(ret);
 
                dbg("alloc_bootmem %lx %lx\n", ret, size);
        }
 
-       return ret;
+       return (void *)ret;
 }
 
 void __init do_init_bootmem(void)
 {
        int nid;
-       int addr_cells, size_cells;
-       struct device_node *memory = NULL;
+       unsigned int i;
        static struct notifier_block ppc64_numa_nb = {
                .notifier_call = cpu_numa_callback,
                .priority = 1 /* Must run before sched domains notifier. */
@@ -581,99 +593,66 @@ void __init do_init_bootmem(void)
        register_cpu_notifier(&ppc64_numa_nb);
 
        for_each_online_node(nid) {
-               unsigned long start_paddr, end_paddr;
-               int i;
+               unsigned long start_pfn, end_pfn, pages_present;
                unsigned long bootmem_paddr;
                unsigned long bootmap_pages;
 
-               start_paddr = init_node_data[nid].node_start_pfn * PAGE_SIZE;
-               end_paddr = init_node_data[nid].node_end_pfn * PAGE_SIZE;
+               get_region(nid, &start_pfn, &end_pfn, &pages_present);
 
                /* Allocate the node structure node local if possible */
-               NODE_DATA(nid) = (struct pglist_data *)careful_allocation(nid,
+               NODE_DATA(nid) = careful_allocation(nid,
                                        sizeof(struct pglist_data),
-                                       SMP_CACHE_BYTES, end_paddr);
-               NODE_DATA(nid) = abs_to_virt(NODE_DATA(nid));
+                                       SMP_CACHE_BYTES, end_pfn);
+               NODE_DATA(nid) = __va(NODE_DATA(nid));
                memset(NODE_DATA(nid), 0, sizeof(struct pglist_data));
 
                dbg("node %d\n", nid);
                dbg("NODE_DATA() = %p\n", NODE_DATA(nid));
 
                NODE_DATA(nid)->bdata = &plat_node_bdata[nid];
-               NODE_DATA(nid)->node_start_pfn =
-                       init_node_data[nid].node_start_pfn;
-               NODE_DATA(nid)->node_spanned_pages =
-                       end_paddr - start_paddr;
+               NODE_DATA(nid)->node_start_pfn = start_pfn;
+               NODE_DATA(nid)->node_spanned_pages = end_pfn - start_pfn;
 
                if (NODE_DATA(nid)->node_spanned_pages == 0)
                        continue;
 
-               dbg("start_paddr = %lx\n", start_paddr);
-               dbg("end_paddr = %lx\n", end_paddr);
+               dbg("start_paddr = %lx\n", start_pfn << PAGE_SHIFT);
+               dbg("end_paddr = %lx\n", end_pfn << PAGE_SHIFT);
 
-               bootmap_pages = bootmem_bootmap_pages((end_paddr - start_paddr) >> PAGE_SHIFT);
+               bootmap_pages = bootmem_bootmap_pages(end_pfn - start_pfn);
+               bootmem_paddr = (unsigned long)careful_allocation(nid,
+                                       bootmap_pages << PAGE_SHIFT,
+                                       PAGE_SIZE, end_pfn);
+               memset(__va(bootmem_paddr), 0, bootmap_pages << PAGE_SHIFT);
 
-               bootmem_paddr = careful_allocation(nid,
-                               bootmap_pages << PAGE_SHIFT,
-                               PAGE_SIZE, end_paddr);
-               memset(abs_to_virt(bootmem_paddr), 0,
-                      bootmap_pages << PAGE_SHIFT);
                dbg("bootmap_paddr = %lx\n", bootmem_paddr);
 
                init_bootmem_node(NODE_DATA(nid), bootmem_paddr >> PAGE_SHIFT,
-                                 start_paddr >> PAGE_SHIFT,
-                                 end_paddr >> PAGE_SHIFT);
+                                 start_pfn, end_pfn);
 
-               /*
-                * We need to do another scan of all memory sections to
-                * associate memory with the correct node.
-                */
-               addr_cells = get_mem_addr_cells();
-               size_cells = get_mem_size_cells();
-               memory = NULL;
-               while ((memory = of_find_node_by_type(memory, "memory")) != NULL) {
-                       unsigned long mem_start, mem_size;
-                       int numa_domain, ranges;
-                       unsigned int *memcell_buf;
-                       unsigned int len;
-
-                       memcell_buf = (unsigned int *)get_property(memory, "reg", &len);
-                       if (!memcell_buf || len <= 0)
-                               continue;
+               /* Add free regions on this node */
+               for (i = 0; init_node_data[i].end_pfn; i++) {
+                       unsigned long start, end;
 
-                       ranges = memory->n_addrs;       /* ranges in cell */
-new_range:
-                       mem_start = read_n_cells(addr_cells, &memcell_buf);
-                       mem_size = read_n_cells(size_cells, &memcell_buf);
-                       if (numa_enabled) {
-                               numa_domain = of_node_numa_domain(memory);
-                               if (numa_domain  >= MAX_NUMNODES)
-                                       numa_domain = 0;
-                       } else
-                               numa_domain =  0;
-
-                       if (numa_domain != nid)
+                       if (init_node_data[i].nid != nid)
                                continue;
 
-                       mem_size = numa_enforce_memory_limit(mem_start, mem_size);
-                       if (mem_size) {
-                               dbg("free_bootmem %lx %lx\n", mem_start, mem_size);
-                               free_bootmem_node(NODE_DATA(nid), mem_start, mem_size);
-                       }
+                       start = init_node_data[i].start_pfn << PAGE_SHIFT;
+                       end = init_node_data[i].end_pfn << PAGE_SHIFT;
 
-                       if (--ranges)           /* process all ranges in cell */
-                               goto new_range;
+                       dbg("free_bootmem %lx %lx\n", start, end - start);
+                       free_bootmem_node(NODE_DATA(nid), start, end - start);
                }
 
-               /*
-                * Mark reserved regions on this node
-                */
+               /* Mark reserved regions on this node */
                for (i = 0; i < lmb.reserved.cnt; i++) {
                        unsigned long physbase = lmb.reserved.region[i].base;
                        unsigned long size = lmb.reserved.region[i].size;
+                       unsigned long start_paddr = start_pfn << PAGE_SHIFT;
+                       unsigned long end_paddr = end_pfn << PAGE_SHIFT;
 
-                       if (pa_to_nid(physbase) != nid &&
-                           pa_to_nid(physbase+size-1) != nid)
+                       if (early_pfn_to_nid(physbase >> PAGE_SHIFT) != nid &&
+                           early_pfn_to_nid((physbase+size-1) >> PAGE_SHIFT) != nid)
                                continue;
 
                        if (physbase < end_paddr &&
@@ -693,46 +672,19 @@ new_range:
                                                     size);
                        }
                }
-               /*
-                * This loop may look famaliar, but we have to do it again
-                * after marking our reserved memory to mark memory present
-                * for sparsemem.
-                */
-               addr_cells = get_mem_addr_cells();
-               size_cells = get_mem_size_cells();
-               memory = NULL;
-               while ((memory = of_find_node_by_type(memory, "memory")) != NULL) {
-                       unsigned long mem_start, mem_size;
-                       int numa_domain, ranges;
-                       unsigned int *memcell_buf;
-                       unsigned int len;
-
-                       memcell_buf = (unsigned int *)get_property(memory, "reg", &len);
-                       if (!memcell_buf || len <= 0)
-                               continue;
 
-                       ranges = memory->n_addrs;       /* ranges in cell */
-new_range2:
-                       mem_start = read_n_cells(addr_cells, &memcell_buf);
-                       mem_size = read_n_cells(size_cells, &memcell_buf);
-                       if (numa_enabled) {
-                               numa_domain = of_node_numa_domain(memory);
-                               if (numa_domain  >= MAX_NUMNODES)
-                                       numa_domain = 0;
-                       } else
-                               numa_domain =  0;
-
-                       if (numa_domain != nid)
+               /* Add regions into sparsemem */
+               for (i = 0; init_node_data[i].end_pfn; i++) {
+                       unsigned long start, end;
+
+                       if (init_node_data[i].nid != nid)
                                continue;
 
-                       mem_size = numa_enforce_memory_limit(mem_start, mem_size);
-                       memory_present(numa_domain, mem_start >> PAGE_SHIFT,
-                                      (mem_start + mem_size) >> PAGE_SHIFT);
+                       start = init_node_data[i].start_pfn;
+                       end = init_node_data[i].end_pfn;
 
-                       if (--ranges)           /* process all ranges in cell */
-                               goto new_range2;
+                       memory_present(nid, start, end);
                }
-
        }
 }
 
@@ -746,21 +698,18 @@ void __init paging_init(void)
        memset(zholes_size, 0, sizeof(zholes_size));
 
        for_each_online_node(nid) {
-               unsigned long start_pfn;
-               unsigned long end_pfn;
+               unsigned long start_pfn, end_pfn, pages_present;
 
-               start_pfn = init_node_data[nid].node_start_pfn;
-               end_pfn = init_node_data[nid].node_end_pfn;
+               get_region(nid, &start_pfn, &end_pfn, &pages_present);
 
                zones_size[ZONE_DMA] = end_pfn - start_pfn;
-               zholes_size[ZONE_DMA] = zones_size[ZONE_DMA] -
-                       init_node_data[nid].node_present_pages;
+               zholes_size[ZONE_DMA] = zones_size[ZONE_DMA] - pages_present;
 
                dbg("free_area_init node %d %lx %lx (hole: %lx)\n", nid,
                    zones_size[ZONE_DMA], start_pfn, zholes_size[ZONE_DMA]);
 
-               free_area_init_node(nid, NODE_DATA(nid), zones_size,
-                                                       start_pfn, zholes_size);
+               free_area_init_node(nid, NODE_DATA(nid), zones_size, start_pfn,
+                                   zholes_size);
        }
 }
 
index e3a024e324b62f846fb11eb37c2c1059ffc5967c..a3401b46f3bab2f6da3f6aaa701d1a249320ac00 100644 (file)
@@ -14,7 +14,6 @@
 #include <asm/system.h>
 #include <asm/processor.h>
 #include <asm/cputable.h>
-#include <asm/systemcfg.h>
 #include <asm/rtas.h>
 #include <asm/oprofile_impl.h>
 #include <asm/reg.h>
index 00cf331a1dc4dd1c53de8e72c044611f5b8a1ee2..a6f628d4c9dc59130e2c226b7abf6348fa9764d0 100644 (file)
@@ -27,7 +27,6 @@
 #include <asm/prom.h>
 #include <asm/nvram.h>
 #include <asm/atomic.h>
-#include <asm/systemcfg.h>
 
 #if 0
 #define DEBUG(A...)    printk(KERN_ERR A)
index e94247c28d422a321def8829c0ca3db2daa8429e..31990829310c325716c6cad160863f8ee0847c6b 100644 (file)
@@ -306,9 +306,7 @@ static void __init fw_feature_init(void)
        }
 
        of_node_put(dn);
- no_rtas:
-       printk(KERN_INFO "firmware_features = 0x%lx\n", 
-              ppc64_firmware_features);
+no_rtas:
 
        DBG(" <- fw_feature_init()\n");
 }
index 3ba794ca3288c72fbed747cf1f254fdd5c8ed59a..5800cde7d5adf66c10699b757564d09d3b07fcf8 100644 (file)
@@ -46,7 +46,7 @@
 #include <asm/rtas.h>
 #include <asm/pSeries_reconfig.h>
 #include <asm/mpic.h>
-#include <asm/systemcfg.h>
+#include <asm/vdso_datapage.h>
 
 #include "plpar_wrappers.h"
 
@@ -97,7 +97,7 @@ int pSeries_cpu_disable(void)
        int cpu = smp_processor_id();
 
        cpu_clear(cpu, cpu_online_map);
-       _systemcfg->processorCount--;
+       vdso_data->processorCount--;
 
        /*fix boot_cpuid here*/
        if (cpu == boot_cpuid)
index cfcb2a56d6625d9c9c24edb94cc6aa63504874c1..ef4356b29a979ff08459c9c500dd5d9a93fdded6 100644 (file)
@@ -1467,17 +1467,23 @@ read_spr(int n)
 {
        unsigned int instrs[2];
        unsigned long (*code)(void);
-       unsigned long opd[3];
        unsigned long ret = -1UL;
+#ifdef CONFIG_PPC64
+       unsigned long opd[3];
 
-       instrs[0] = 0x7c6002a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6);
-       instrs[1] = 0x4e800020;
        opd[0] = (unsigned long)instrs;
        opd[1] = 0;
        opd[2] = 0;
+       code = (unsigned long (*)(void)) opd;
+#else
+       code = (unsigned long (*)(void)) instrs;
+#endif
+
+       /* mfspr r3,n; blr */
+       instrs[0] = 0x7c6002a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6);
+       instrs[1] = 0x4e800020;
        store_inst(instrs);
        store_inst(instrs+1);
-       code = (unsigned long (*)(void)) opd;
 
        if (setjmp(bus_error_jmp) == 0) {
                catch_memory_errors = 1;
@@ -1499,16 +1505,21 @@ write_spr(int n, unsigned long val)
 {
        unsigned int instrs[2];
        unsigned long (*code)(unsigned long);
+#ifdef CONFIG_PPC64
        unsigned long opd[3];
 
-       instrs[0] = 0x7c6003a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6);
-       instrs[1] = 0x4e800020;
        opd[0] = (unsigned long)instrs;
        opd[1] = 0;
        opd[2] = 0;
+       code = (unsigned long (*)(unsigned long)) opd;
+#else
+       code = (unsigned long (*)(unsigned long)) instrs;
+#endif
+
+       instrs[0] = 0x7c6003a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6);
+       instrs[1] = 0x4e800020;
        store_inst(instrs);
        store_inst(instrs+1);
-       code = (unsigned long (*)(unsigned long)) opd;
 
        if (setjmp(bus_error_jmp) == 0) {
                catch_memory_errors = 1;
index 968261d6957223a88b3812a414ac0574bb365667..fe0e767fb94ed51f916ce087be3f5efdbd70ea8f 100644 (file)
@@ -25,6 +25,7 @@
 #include <asm/processor.h>
 #include <asm/cputable.h>
 #include <asm/thread_info.h>
+#include <asm/vdso_datapage.h>
 
 #define DEFINE(sym, val) \
        asm volatile("\n->" #sym " %0 " #val : : "i" (val))
@@ -143,5 +144,32 @@ main(void)
 
        DEFINE(TASK_SIZE, TASK_SIZE);
        DEFINE(NUM_USER_SEGMENTS, TASK_SIZE>>28);
+
+       /* datapage offsets for use by vdso */
+       DEFINE(CFG_TB_ORIG_STAMP, offsetof(struct vdso_data, tb_orig_stamp));
+       DEFINE(CFG_TB_TICKS_PER_SEC, offsetof(struct vdso_data, tb_ticks_per_sec));
+       DEFINE(CFG_TB_TO_XS, offsetof(struct vdso_data, tb_to_xs));
+       DEFINE(CFG_STAMP_XSEC, offsetof(struct vdso_data, stamp_xsec));
+       DEFINE(CFG_TB_UPDATE_COUNT, offsetof(struct vdso_data, tb_update_count));
+       DEFINE(CFG_TZ_MINUTEWEST, offsetof(struct vdso_data, tz_minuteswest));
+       DEFINE(CFG_TZ_DSTTIME, offsetof(struct vdso_data, tz_dsttime));
+       DEFINE(CFG_SYSCALL_MAP32, offsetof(struct vdso_data, syscall_map_32));
+       DEFINE(WTOM_CLOCK_SEC, offsetof(struct vdso_data, wtom_clock_sec));
+       DEFINE(WTOM_CLOCK_NSEC, offsetof(struct vdso_data, wtom_clock_nsec));
+       DEFINE(TVAL32_TV_SEC, offsetof(struct timeval, tv_sec));
+       DEFINE(TVAL32_TV_USEC, offsetof(struct timeval, tv_usec));
+       DEFINE(TSPEC32_TV_SEC, offsetof(struct timespec, tv_sec));
+       DEFINE(TSPEC32_TV_NSEC, offsetof(struct timespec, tv_nsec));
+
+       /* timeval/timezone offsets for use by vdso */
+       DEFINE(TZONE_TZ_MINWEST, offsetof(struct timezone, tz_minuteswest));
+       DEFINE(TZONE_TZ_DSTTIME, offsetof(struct timezone, tz_dsttime));
+
+       /* Other bits used by the vdso */
+       DEFINE(CLOCK_REALTIME, CLOCK_REALTIME);
+       DEFINE(CLOCK_MONOTONIC, CLOCK_MONOTONIC);
+       DEFINE(NSEC_PER_SEC, NSEC_PER_SEC);
+       DEFINE(CLOCK_REALTIME_RES, TICK_NSEC);
+
        return 0;
 }
index c867be6981cb34f615755c888d6212737eb53cbf..29d95d415ceb7f70accd8c8381f9666f748be467 100644 (file)
@@ -37,7 +37,7 @@ static        u_char  irq_to_siureg[] = {
 static u_char  irq_to_siubit[] = {
         0, 15, 14, 13, 12, 11, 10,  9,
         8,  7,  6,  5,  4,  3,  2,  1,
-        2,  1, 15, 14, 13, 12, 11, 10,
+        2,  1,  0, 14, 13, 12, 11, 10,
         9,  8,  7,  6,  5,  4,  3,  0,
        31, 30, 29, 28, 27, 26, 25, 24,
        23, 22, 21, 20, 19, 18, 17, 16,
index c9d32db9d76a0e0d84f87ec13e0b14cb6091b262..9d10c12e87fee6863ae0e0567f43b1d9453aa90f 100644 (file)
@@ -279,17 +279,12 @@ config ARCH_FLATMEM_ENABLE
        def_bool y
        depends on !NUMA
 
-config ARCH_DISCONTIGMEM_ENABLE
-       def_bool y
-       depends on SMP && PPC_PSERIES
-
-config ARCH_DISCONTIGMEM_DEFAULT
+config ARCH_SPARSEMEM_ENABLE
        def_bool y
-       depends on ARCH_DISCONTIGMEM_ENABLE
 
-config ARCH_SPARSEMEM_ENABLE
+config ARCH_SPARSEMEM_DEFAULT
        def_bool y
-       depends on ARCH_DISCONTIGMEM_ENABLE
+       depends on NUMA
 
 source "mm/Kconfig"
 
index 58b19f1076568c85ae7cc17d903b7db4050b72a5..dac4cc20fa939af64fdec5502df18e8f68142c36 100644 (file)
@@ -13,10 +13,8 @@ endif
 
 obj-y               += idle.o dma.o \
                        align.o \
-                       udbg.o \
                        rtc.o \
-                       iommu.o vdso.o
-obj-y += vdso32/ vdso64/
+                       iommu.o
 
 pci-obj-$(CONFIG_PPC_MULTIPLATFORM)    += pci_dn.o pci_direct_iommu.o
 
@@ -27,8 +25,6 @@ ifneq ($(CONFIG_PPC_MERGE),y)
 obj-$(CONFIG_PPC_MULTIPLATFORM) += prom_init.o
 endif
 
-obj-$(CONFIG_PPC_PSERIES) += udbg_16550.o
-
 obj-$(CONFIG_KEXEC)            += machine_kexec.o
 obj-$(CONFIG_MODULES)          += module.o
 ifneq ($(CONFIG_PPC_MERGE),y)
@@ -40,10 +36,6 @@ obj-$(CONFIG_BOOTX_TEXT)     += btext.o
 endif
 obj-$(CONFIG_HVCS)             += hvcserver.o
 
-obj-$(CONFIG_PPC_PMAC)         += udbg_scc.o
-
-obj-$(CONFIG_PPC_MAPLE)                += udbg_16550.o
-
 obj-$(CONFIG_KPROBES)          += kprobes.o
 
 ifneq ($(CONFIG_PPC_MERGE),y)
index 492bca6137ebc26fc8ec98870e8b5a50708bfddf..5e089deb0a2b393d5dc5157fad57262a8deab0c4 100644 (file)
@@ -186,7 +186,8 @@ _KPROBE(__flush_icache_range)
        bdnz    2b
        isync
        blr
-       .previous .text
+
+       .text
 /*
  * Like above, but only do the D-cache.
  *
diff --git a/arch/ppc64/kernel/udbg.c b/arch/ppc64/kernel/udbg.c
deleted file mode 100644 (file)
index 0d878e7..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * polling mode stateless debugging stuff, originally for NS16550 Serial Ports
- *
- * c 2001 PPC 64 Team, IBM Corp
- *
- *      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; either version
- *      2 of the License, or (at your option) any later version.
- */
-
-#include <stdarg.h>
-#include <linux/config.h>
-#include <linux/types.h>
-#include <linux/sched.h>
-#include <linux/console.h>
-#include <asm/processor.h>
-
-void (*udbg_putc)(unsigned char c);
-unsigned char (*udbg_getc)(void);
-int (*udbg_getc_poll)(void);
-
-/* udbg library, used by xmon et al */
-void udbg_puts(const char *s)
-{
-       if (udbg_putc) {
-               char c;
-
-               if (s && *s != '\0') {
-                       while ((c = *s++) != '\0')
-                               udbg_putc(c);
-               }
-       }
-#if 0
-       else {
-               printk("%s", s);
-       }
-#endif
-}
-
-int udbg_write(const char *s, int n)
-{
-       int remain = n;
-       char c;
-
-       if (!udbg_putc)
-               return 0;
-
-       if (s && *s != '\0') {
-               while (((c = *s++) != '\0') && (remain-- > 0)) {
-                       udbg_putc(c);
-               }
-       }
-
-       return n - remain;
-}
-
-int udbg_read(char *buf, int buflen)
-{
-       char c, *p = buf;
-       int i;
-
-       if (!udbg_getc)
-               return 0;
-
-       for (i = 0; i < buflen; ++i) {
-               do {
-                       c = udbg_getc();
-               } while (c == 0x11 || c == 0x13);
-               if (c == 0)
-                       break;
-               *p++ = c;
-       }
-
-       return i;
-}
-
-#define UDBG_BUFSIZE 256
-void udbg_printf(const char *fmt, ...)
-{
-       unsigned char buf[UDBG_BUFSIZE];
-       va_list args;
-
-       va_start(args, fmt);
-       vsnprintf(buf, UDBG_BUFSIZE, fmt, args);
-       udbg_puts(buf);
-       va_end(args);
-}
-
-/*
- * Early boot console based on udbg
- */
-static void udbg_console_write(struct console *con, const char *s,
-               unsigned int n)
-{
-       udbg_write(s, n);
-}
-
-static struct console udbg_console = {
-       .name   = "udbg",
-       .write  = udbg_console_write,
-       .flags  = CON_PRINTBUFFER,
-       .index  = -1,
-};
-
-static int early_console_initialized;
-
-void __init disable_early_printk(void)
-{
-       if (!early_console_initialized)
-               return;
-       unregister_console(&udbg_console);
-       early_console_initialized = 0;
-}
-
-/* called by setup_system */
-void register_early_udbg_console(void)
-{
-       early_console_initialized = 1;
-       register_console(&udbg_console);
-}
-
-#if 0   /* if you want to use this as a regular output console */
-console_initcall(register_udbg_console);
-#endif
diff --git a/arch/ppc64/kernel/udbg_16550.c b/arch/ppc64/kernel/udbg_16550.c
deleted file mode 100644 (file)
index 9313574..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * udbg for for NS16550 compatable serial ports
- *
- * Copyright (C) 2001-2005 PPC 64 Team, IBM Corp
- *
- *      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; either version
- *      2 of the License, or (at your option) any later version.
- */
-#include <linux/config.h>
-#include <linux/types.h>
-#include <asm/udbg.h>
-#include <asm/io.h>
-
-extern u8 real_readb(volatile u8 __iomem  *addr);
-extern void real_writeb(u8 data, volatile u8 __iomem *addr);
-
-struct NS16550 {
-       /* this struct must be packed */
-       unsigned char rbr;  /* 0 */
-       unsigned char ier;  /* 1 */
-       unsigned char fcr;  /* 2 */
-       unsigned char lcr;  /* 3 */
-       unsigned char mcr;  /* 4 */
-       unsigned char lsr;  /* 5 */
-       unsigned char msr;  /* 6 */
-       unsigned char scr;  /* 7 */
-};
-
-#define thr rbr
-#define iir fcr
-#define dll rbr
-#define dlm ier
-#define dlab lcr
-
-#define LSR_DR   0x01  /* Data ready */
-#define LSR_OE   0x02  /* Overrun */
-#define LSR_PE   0x04  /* Parity error */
-#define LSR_FE   0x08  /* Framing error */
-#define LSR_BI   0x10  /* Break */
-#define LSR_THRE 0x20  /* Xmit holding register empty */
-#define LSR_TEMT 0x40  /* Xmitter empty */
-#define LSR_ERR  0x80  /* Error */
-
-static volatile struct NS16550 __iomem *udbg_comport;
-
-static void udbg_550_putc(unsigned char c)
-{
-       if (udbg_comport) {
-               while ((in_8(&udbg_comport->lsr) & LSR_THRE) == 0)
-                       /* wait for idle */;
-               out_8(&udbg_comport->thr, c);
-               if (c == '\n')
-                       udbg_550_putc('\r');
-       }
-}
-
-static int udbg_550_getc_poll(void)
-{
-       if (udbg_comport) {
-               if ((in_8(&udbg_comport->lsr) & LSR_DR) != 0)
-                       return in_8(&udbg_comport->rbr);
-               else
-                       return -1;
-       }
-       return -1;
-}
-
-static unsigned char udbg_550_getc(void)
-{
-       if (udbg_comport) {
-               while ((in_8(&udbg_comport->lsr) & LSR_DR) == 0)
-                       /* wait for char */;
-               return in_8(&udbg_comport->rbr);
-       }
-       return 0;
-}
-
-void udbg_init_uart(void __iomem *comport, unsigned int speed)
-{
-       u16 dll = speed ? (115200 / speed) : 12;
-
-       if (comport) {
-               udbg_comport = (struct NS16550 __iomem *)comport;
-               out_8(&udbg_comport->lcr, 0x00);
-               out_8(&udbg_comport->ier, 0xff);
-               out_8(&udbg_comport->ier, 0x00);
-               out_8(&udbg_comport->lcr, 0x80);        /* Access baud rate */
-               out_8(&udbg_comport->dll, dll & 0xff);  /* 1 = 115200,  2 = 57600,
-                                                          3 = 38400, 12 = 9600 baud */
-               out_8(&udbg_comport->dlm, dll >> 8);    /* dll >> 8 which should be zero
-                                                          for fast rates; */
-               out_8(&udbg_comport->lcr, 0x03);        /* 8 data, 1 stop, no parity */
-               out_8(&udbg_comport->mcr, 0x03);        /* RTS/DTR */
-               out_8(&udbg_comport->fcr ,0x07);        /* Clear & enable FIFOs */
-               udbg_putc = udbg_550_putc;
-               udbg_getc = udbg_550_getc;
-               udbg_getc_poll = udbg_550_getc_poll;
-       }
-}
-
-#ifdef CONFIG_PPC_MAPLE
-void udbg_maple_real_putc(unsigned char c)
-{
-       if (udbg_comport) {
-               while ((real_readb(&udbg_comport->lsr) & LSR_THRE) == 0)
-                       /* wait for idle */;
-               real_writeb(c, &udbg_comport->thr); eieio();
-               if (c == '\n')
-                       udbg_maple_real_putc('\r');
-       }
-}
-
-void udbg_init_maple_realmode(void)
-{
-       udbg_comport = (volatile struct NS16550 __iomem *)0xf40003f8;
-
-       udbg_putc = udbg_maple_real_putc;
-       udbg_getc = NULL;
-       udbg_getc_poll = NULL;
-}
-#endif /* CONFIG_PPC_MAPLE */
diff --git a/arch/ppc64/kernel/udbg_scc.c b/arch/ppc64/kernel/udbg_scc.c
deleted file mode 100644 (file)
index 820c535..0000000
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * udbg for for zilog scc ports as found on Apple PowerMacs
- *
- * Copyright (C) 2001-2005 PPC 64 Team, IBM Corp
- *
- *      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; either version
- *      2 of the License, or (at your option) any later version.
- */
-#include <linux/config.h>
-#include <linux/types.h>
-#include <asm/udbg.h>
-#include <asm/processor.h>
-#include <asm/io.h>
-#include <asm/prom.h>
-#include <asm/pmac_feature.h>
-
-extern u8 real_readb(volatile u8 __iomem  *addr);
-extern void real_writeb(u8 data, volatile u8 __iomem *addr);
-
-#define        SCC_TXRDY       4
-#define SCC_RXRDY      1
-
-static volatile u8 __iomem *sccc;
-static volatile u8 __iomem *sccd;
-
-static void udbg_scc_putc(unsigned char c)
-{
-       if (sccc) {
-               while ((in_8(sccc) & SCC_TXRDY) == 0)
-                       ;
-               out_8(sccd,  c);
-               if (c == '\n')
-                       udbg_scc_putc('\r');
-       }
-}
-
-static int udbg_scc_getc_poll(void)
-{
-       if (sccc) {
-               if ((in_8(sccc) & SCC_RXRDY) != 0)
-                       return in_8(sccd);
-               else
-                       return -1;
-       }
-       return -1;
-}
-
-static unsigned char udbg_scc_getc(void)
-{
-       if (sccc) {
-               while ((in_8(sccc) & SCC_RXRDY) == 0)
-                       ;
-               return in_8(sccd);
-       }
-       return 0;
-}
-
-static unsigned char scc_inittab[] = {
-    13, 0,             /* set baud rate divisor */
-    12, 0,
-    14, 1,             /* baud rate gen enable, src=rtxc */
-    11, 0x50,          /* clocks = br gen */
-    5,  0xea,          /* tx 8 bits, assert DTR & RTS */
-    4,  0x46,          /* x16 clock, 1 stop */
-    3,  0xc1,          /* rx enable, 8 bits */
-};
-
-void udbg_init_scc(struct device_node *np)
-{
-       u32 *reg;
-       unsigned long addr;
-       int i, x;
-
-       if (np == NULL)
-               np = of_find_node_by_name(NULL, "escc");
-       if (np == NULL || np->parent == NULL)
-               return;
-
-       udbg_printf("found SCC...\n");
-       /* Get address within mac-io ASIC */
-       reg = (u32 *)get_property(np, "reg", NULL);
-       if (reg == NULL)
-               return;
-       addr = reg[0];
-       udbg_printf("local addr: %lx\n", addr);
-       /* Get address of mac-io PCI itself */
-       reg = (u32 *)get_property(np->parent, "assigned-addresses", NULL);
-       if (reg == NULL)
-               return;
-       addr += reg[2];
-       udbg_printf("final addr: %lx\n", addr);
-
-       /* Setup for 57600 8N1 */
-       addr += 0x20;
-       sccc = (volatile u8 * __iomem) ioremap(addr & PAGE_MASK, PAGE_SIZE) ;
-       sccc += addr & ~PAGE_MASK;
-       sccd = sccc + 0x10;
-
-       udbg_printf("ioremap result sccc: %p\n", sccc);
-       mb();
-
-       for (i = 20000; i != 0; --i)
-               x = in_8(sccc);
-       out_8(sccc, 0x09);              /* reset A or B side */
-       out_8(sccc, 0xc0);
-       for (i = 0; i < sizeof(scc_inittab); ++i)
-               out_8(sccc, scc_inittab[i]);
-
-       udbg_putc = udbg_scc_putc;
-       udbg_getc = udbg_scc_getc;
-       udbg_getc_poll = udbg_scc_getc_poll;
-
-       udbg_puts("Hello World !\n");
-}
-
-static void udbg_real_scc_putc(unsigned char c)
-{
-       while ((real_readb(sccc) & SCC_TXRDY) == 0)
-               ;
-       real_writeb(c, sccd);
-       if (c == '\n')
-               udbg_real_scc_putc('\r');
-}
-
-void udbg_init_pmac_realmode(void)
-{
-       sccc = (volatile u8 __iomem *)0x80013020ul;
-       sccd = (volatile u8 __iomem *)0x80013030ul;
-
-       udbg_putc = udbg_real_scc_putc;
-       udbg_getc = NULL;
-       udbg_getc_poll = NULL;
-}
diff --git a/arch/ppc64/kernel/vdso32/Makefile b/arch/ppc64/kernel/vdso32/Makefile
deleted file mode 100644 (file)
index 0b1b0df..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-
-# List of files in the vdso, has to be asm only for now
-
-obj-vdso32 = sigtramp.o gettimeofday.o datapage.o cacheflush.o note.o
-
-# Build rules
-
-targets := $(obj-vdso32) vdso32.so
-obj-vdso32 := $(addprefix $(obj)/, $(obj-vdso32))
-
-
-EXTRA_CFLAGS := -shared -s -fno-common -fno-builtin
-EXTRA_CFLAGS += -nostdlib -Wl,-soname=linux-vdso32.so.1
-EXTRA_AFLAGS := -D__VDSO32__ -s
-
-obj-y += vdso32_wrapper.o
-extra-y += vdso32.lds
-CPPFLAGS_vdso32.lds += -P -C -U$(ARCH)
-
-# Force dependency (incbin is bad)
-$(obj)/vdso32_wrapper.o : $(obj)/vdso32.so
-
-# link rule for the .so file, .lds has to be first
-$(obj)/vdso32.so: $(src)/vdso32.lds $(obj-vdso32)
-       $(call if_changed,vdso32ld)
-
-# assembly rules for the .S files
-$(obj-vdso32): %.o: %.S
-       $(call if_changed_dep,vdso32as)
-
-# actual build commands
-quiet_cmd_vdso32ld = VDSO32L $@
-      cmd_vdso32ld = $(CROSS32CC) $(c_flags) -Wl,-T $^ -o $@
-quiet_cmd_vdso32as = VDSO32A $@
-      cmd_vdso32as = $(CROSS32CC) $(a_flags) -c -o $@ $<
-
diff --git a/arch/ppc64/kernel/vdso32/cacheflush.S b/arch/ppc64/kernel/vdso32/cacheflush.S
deleted file mode 100644 (file)
index c8db993..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * vDSO provided cache flush routines
- *
- * Copyright (C) 2004 Benjamin Herrenschmuidt (benh@kernel.crashing.org),
- *                    IBM Corp.
- *
- * 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; either version
- * 2 of the License, or (at your option) any later version.
- */
-#include <linux/config.h>
-#include <asm/processor.h>
-#include <asm/ppc_asm.h>
-#include <asm/vdso.h>
-#include <asm/asm-offsets.h>
-
-       .text
-
-/*
- * Default "generic" version of __kernel_sync_dicache.
- *
- * void __kernel_sync_dicache(unsigned long start, unsigned long end)
- *
- * Flushes the data cache & invalidate the instruction cache for the
- * provided range [start, end[
- *
- * Note: all CPUs supported by this kernel have a 128 bytes cache
- * line size so we don't have to peek that info from the datapage
- */
-V_FUNCTION_BEGIN(__kernel_sync_dicache)
-  .cfi_startproc
-       li      r5,127
-       andc    r6,r3,r5                /* round low to line bdy */
-       subf    r8,r6,r4                /* compute length */
-       add     r8,r8,r5                /* ensure we get enough */
-       srwi.   r8,r8,7                 /* compute line count */
-       beqlr                           /* nothing to do? */
-       mtctr   r8
-       mr      r3,r6
-1:     dcbst   0,r3
-       addi    r3,r3,128
-       bdnz    1b
-       sync
-       mtctr   r8
-1:     icbi    0,r6
-       addi    r6,r6,128
-       bdnz    1b
-       isync
-       li      r3,0
-       blr
-  .cfi_endproc
-V_FUNCTION_END(__kernel_sync_dicache)
-
-
-/*
- * POWER5 version of __kernel_sync_dicache
- */
-V_FUNCTION_BEGIN(__kernel_sync_dicache_p5)
-  .cfi_startproc
-       sync
-       isync
-       li      r3,0
-       blr
-  .cfi_endproc
-V_FUNCTION_END(__kernel_sync_dicache_p5)
-
diff --git a/arch/ppc64/kernel/vdso32/datapage.S b/arch/ppc64/kernel/vdso32/datapage.S
deleted file mode 100644 (file)
index 4f4eb0b..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Access to the shared data page by the vDSO & syscall map
- *
- * Copyright (C) 2004 Benjamin Herrenschmuidt (benh@kernel.crashing.org), IBM Corp.
- *
- * 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; either version
- * 2 of the License, or (at your option) any later version.
- */
-
-#include <linux/config.h>
-#include <asm/processor.h>
-#include <asm/ppc_asm.h>
-#include <asm/asm-offsets.h>
-#include <asm/unistd.h>
-#include <asm/vdso.h>
-
-       .text
-V_FUNCTION_BEGIN(__get_datapage)
-  .cfi_startproc
-       /* We don't want that exposed or overridable as we want other objects
-        * to be able to bl directly to here
-        */
-       .protected __get_datapage
-       .hidden __get_datapage
-
-       mflr    r0
-  .cfi_register lr,r0
-
-       bcl     20,31,1f
-       .global __kernel_datapage_offset;
-__kernel_datapage_offset:
-       .long   0
-1:
-       mflr    r3
-       mtlr    r0
-       lwz     r0,0(r3)
-       add     r3,r0,r3
-       blr
-  .cfi_endproc
-V_FUNCTION_END(__get_datapage)
-
-/*
- * void *__kernel_get_syscall_map(unsigned int *syscall_count) ;
- *
- * returns a pointer to the syscall map. the map is agnostic to the
- * size of "long", unlike kernel bitops, it stores bits from top to
- * bottom so that memory actually contains a linear bitmap
- * check for syscall N by testing bit (0x80000000 >> (N & 0x1f)) of
- * 32 bits int at N >> 5.
- */
-V_FUNCTION_BEGIN(__kernel_get_syscall_map)
-  .cfi_startproc
-       mflr    r12
-  .cfi_register lr,r12
-
-       mr      r4,r3
-       bl      __get_datapage@local
-       mtlr    r12
-       addi    r3,r3,CFG_SYSCALL_MAP32
-       cmpli   cr0,r4,0
-       beqlr
-       li      r0,__NR_syscalls
-       stw     r0,0(r4)
-       blr
-  .cfi_endproc
-V_FUNCTION_END(__kernel_get_syscall_map)
diff --git a/arch/ppc64/kernel/vdso32/gettimeofday.S b/arch/ppc64/kernel/vdso32/gettimeofday.S
deleted file mode 100644 (file)
index e243c1d..0000000
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Userland implementation of gettimeofday() for 32 bits processes in a
- * ppc64 kernel for use in the vDSO
- *
- * Copyright (C) 2004 Benjamin Herrenschmuidt (benh@kernel.crashing.org), IBM Corp.
- *
- * 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; either version
- * 2 of the License, or (at your option) any later version.
- */
-#include <linux/config.h>
-#include <asm/processor.h>
-#include <asm/ppc_asm.h>
-#include <asm/vdso.h>
-#include <asm/asm-offsets.h>
-#include <asm/unistd.h>
-
-       .text
-/*
- * Exact prototype of gettimeofday
- *
- * int __kernel_gettimeofday(struct timeval *tv, struct timezone *tz);
- *
- */
-V_FUNCTION_BEGIN(__kernel_gettimeofday)
-  .cfi_startproc
-       mflr    r12
-  .cfi_register lr,r12
-
-       mr      r10,r3                  /* r10 saves tv */
-       mr      r11,r4                  /* r11 saves tz */
-       bl      __get_datapage@local    /* get data page */
-       mr      r9, r3                  /* datapage ptr in r9 */
-       bl      __do_get_xsec@local     /* get xsec from tb & kernel */
-       bne-    2f                      /* out of line -> do syscall */
-
-       /* seconds are xsec >> 20 */
-       rlwinm  r5,r4,12,20,31
-       rlwimi  r5,r3,12,0,19
-       stw     r5,TVAL32_TV_SEC(r10)
-
-       /* get remaining xsec and convert to usec. we scale
-        * up remaining xsec by 12 bits and get the top 32 bits
-        * of the multiplication
-        */
-       rlwinm  r5,r4,12,0,19
-       lis     r6,1000000@h
-       ori     r6,r6,1000000@l
-       mulhwu  r5,r5,r6
-       stw     r5,TVAL32_TV_USEC(r10)
-
-       cmpli   cr0,r11,0               /* check if tz is NULL */
-       beq     1f
-       lwz     r4,CFG_TZ_MINUTEWEST(r9)/* fill tz */
-       lwz     r5,CFG_TZ_DSTTIME(r9)
-       stw     r4,TZONE_TZ_MINWEST(r11)
-       stw     r5,TZONE_TZ_DSTTIME(r11)
-
-1:     mtlr    r12
-       li      r3,0
-       blr
-
-2:     mr      r3,r10
-       mr      r4,r11
-       li      r0,__NR_gettimeofday
-       sc
-       b       1b
-  .cfi_endproc
-V_FUNCTION_END(__kernel_gettimeofday)
-
-/*
- * This is the core of gettimeofday(), it returns the xsec
- * value in r3 & r4 and expects the datapage ptr (non clobbered)
- * in r9. clobbers r0,r4,r5,r6,r7,r8
-*/
-__do_get_xsec:
-  .cfi_startproc
-       /* Check for update count & load values. We use the low
-        * order 32 bits of the update count
-        */
-1:     lwz     r8,(CFG_TB_UPDATE_COUNT+4)(r9)
-       andi.   r0,r8,1                 /* pending update ? loop */
-       bne-    1b
-       xor     r0,r8,r8                /* create dependency */
-       add     r9,r9,r0
-
-       /* Load orig stamp (offset to TB) */
-       lwz     r5,CFG_TB_ORIG_STAMP(r9)
-       lwz     r6,(CFG_TB_ORIG_STAMP+4)(r9)
-
-       /* Get a stable TB value */
-2:     mftbu   r3
-       mftbl   r4
-       mftbu   r0
-       cmpl    cr0,r3,r0
-       bne-    2b
-
-       /* Substract tb orig stamp. If the high part is non-zero, we jump to the
-        * slow path which call the syscall. If it's ok, then we have our 32 bits
-        * tb_ticks value in r7
-        */
-       subfc   r7,r6,r4
-       subfe.  r0,r5,r3
-       bne-    3f
-
-       /* Load scale factor & do multiplication */
-       lwz     r5,CFG_TB_TO_XS(r9)     /* load values */
-       lwz     r6,(CFG_TB_TO_XS+4)(r9)
-       mulhwu  r4,r7,r5
-       mulhwu  r6,r7,r6
-       mullw   r0,r7,r5
-       addc    r6,r6,r0
-
-       /* At this point, we have the scaled xsec value in r4 + XER:CA
-        * we load & add the stamp since epoch
-        */
-       lwz     r5,CFG_STAMP_XSEC(r9)
-       lwz     r6,(CFG_STAMP_XSEC+4)(r9)
-       adde    r4,r4,r6
-       addze   r3,r5
-
-       /* We now have our result in r3,r4. We create a fake dependency
-        * on that result and re-check the counter
-        */
-       xor     r0,r4,r4
-       add     r9,r9,r0
-       lwz     r0,(CFG_TB_UPDATE_COUNT+4)(r9)
-        cmpl    cr0,r8,r0              /* check if updated */
-       bne-    1b
-
-       /* Warning ! The caller expects CR:EQ to be set to indicate a
-        * successful calculation (so it won't fallback to the syscall
-        * method). We have overriden that CR bit in the counter check,
-        * but fortunately, the loop exit condition _is_ CR:EQ set, so
-        * we can exit safely here. If you change this code, be careful
-        * of that side effect.
-        */
-3:     blr
-  .cfi_endproc
diff --git a/arch/ppc64/kernel/vdso32/note.S b/arch/ppc64/kernel/vdso32/note.S
deleted file mode 100644 (file)
index d4b5be4..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * This supplies .note.* sections to go into the PT_NOTE inside the vDSO text.
- * Here we can supply some information useful to userland.
- */
-
-#include <linux/uts.h>
-#include <linux/version.h>
-
-#define ASM_ELF_NOTE_BEGIN(name, flags, vendor, type)                        \
-       .section name, flags;                                                 \
-       .balign 4;                                                            \
-       .long 1f - 0f;          /* name length */                             \
-       .long 3f - 2f;          /* data length */                             \
-       .long type;             /* note type */                               \
-0:     .asciz vendor;          /* vendor name */                             \
-1:     .balign 4;                                                            \
-2:
-
-#define ASM_ELF_NOTE_END                                                     \
-3:     .balign 4;              /* pad out section */                         \
-       .previous
-
-       ASM_ELF_NOTE_BEGIN(".note.kernel-version", "a", UTS_SYSNAME, 0)
-       .long LINUX_VERSION_CODE
-       ASM_ELF_NOTE_END
diff --git a/arch/ppc64/kernel/vdso32/sigtramp.S b/arch/ppc64/kernel/vdso32/sigtramp.S
deleted file mode 100644 (file)
index e046427..0000000
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * Signal trampolines for 32 bits processes in a ppc64 kernel for
- * use in the vDSO
- *
- * Copyright (C) 2004 Benjamin Herrenschmuidt (benh@kernel.crashing.org), IBM Corp.
- * Copyright (C) 2004 Alan Modra (amodra@au.ibm.com)), IBM Corp.
- *
- * 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; either version
- * 2 of the License, or (at your option) any later version.
- */
-#include <linux/config.h>
-#include <asm/processor.h>
-#include <asm/ppc_asm.h>
-#include <asm/unistd.h>
-#include <asm/vdso.h>
-
-       .text
-
-/* The nop here is a hack.  The dwarf2 unwind routines subtract 1 from
-   the return address to get an address in the middle of the presumed
-   call instruction.  Since we don't have a call here, we artifically
-   extend the range covered by the unwind info by adding a nop before
-   the real start.  */
-       nop
-V_FUNCTION_BEGIN(__kernel_sigtramp32)
-.Lsig_start = . - 4
-       li      r0,__NR_sigreturn
-       sc
-.Lsig_end:
-V_FUNCTION_END(__kernel_sigtramp32)
-
-.Lsigrt_start:
-       nop
-V_FUNCTION_BEGIN(__kernel_sigtramp_rt32)
-       li      r0,__NR_rt_sigreturn
-       sc
-.Lsigrt_end:
-V_FUNCTION_END(__kernel_sigtramp_rt32)
-
-       .section .eh_frame,"a",@progbits
-
-/* Register r1 can be found at offset 4 of a pt_regs structure.
-   A pointer to the pt_regs is stored in memory at the old sp plus PTREGS.  */
-#define cfa_save \
-  .byte 0x0f;                  /* DW_CFA_def_cfa_expression */         \
-  .uleb128 9f - 1f;            /*   length */                          \
-1:                                                                     \
-  .byte 0x71; .sleb128 PTREGS; /*     DW_OP_breg1 */                   \
-  .byte 0x06;                  /*     DW_OP_deref */                   \
-  .byte 0x23; .uleb128 RSIZE;  /*     DW_OP_plus_uconst */             \
-  .byte 0x06;                  /*     DW_OP_deref */                   \
-9:
-
-/* Register REGNO can be found at offset OFS of a pt_regs structure.
-   A pointer to the pt_regs is stored in memory at the old sp plus PTREGS.  */
-#define rsave(regno, ofs) \
-  .byte 0x10;                  /* DW_CFA_expression */                 \
-  .uleb128 regno;              /*   regno */                           \
-  .uleb128 9f - 1f;            /*   length */                          \
-1:                                                                     \
-  .byte 0x71; .sleb128 PTREGS; /*     DW_OP_breg1 */                   \
-  .byte 0x06;                  /*     DW_OP_deref */                   \
-  .ifne ofs;                                                           \
-    .byte 0x23; .uleb128 ofs;  /*     DW_OP_plus_uconst */             \
-  .endif;                                                              \
-9:
-
-/* If msr bit 1<<25 is set, then VMX register REGNO is at offset REGNO*16
-   of the VMX reg struct.  The VMX reg struct is at offset VREGS of
-   the pt_regs struct.  This macro is for REGNO == 0, and contains
-   'subroutines' that the other macros jump to.  */
-#define vsave_msr0(regno) \
-  .byte 0x10;                  /* DW_CFA_expression */                 \
-  .uleb128 regno + 77;         /*   regno */                           \
-  .uleb128 9f - 1f;            /*   length */                          \
-1:                                                                     \
-  .byte 0x30 + regno;          /*     DW_OP_lit0 */                    \
-2:                                                                     \
-  .byte 0x40;                  /*     DW_OP_lit16 */                   \
-  .byte 0x1e;                  /*     DW_OP_mul */                     \
-3:                                                                     \
-  .byte 0x71; .sleb128 PTREGS; /*     DW_OP_breg1 */                   \
-  .byte 0x06;                  /*     DW_OP_deref */                   \
-  .byte 0x12;                  /*     DW_OP_dup */                     \
-  .byte 0x23;                  /*     DW_OP_plus_uconst */             \
-    .uleb128 33*RSIZE;         /*       msr offset */                  \
-  .byte 0x06;                  /*     DW_OP_deref */                   \
-  .byte 0x0c; .long 1 << 25;   /*     DW_OP_const4u */                 \
-  .byte 0x1a;                  /*     DW_OP_and */                     \
-  .byte 0x12;                  /*     DW_OP_dup, ret 0 if bra taken */ \
-  .byte 0x30;                  /*     DW_OP_lit0 */                    \
-  .byte 0x29;                  /*     DW_OP_eq */                      \
-  .byte 0x28; .short 0x7fff;   /*     DW_OP_bra to end */              \
-  .byte 0x13;                  /*     DW_OP_drop, pop the 0 */         \
-  .byte 0x23; .uleb128 VREGS;  /*     DW_OP_plus_uconst */             \
-  .byte 0x22;                  /*     DW_OP_plus */                    \
-  .byte 0x2f; .short 0x7fff;   /*     DW_OP_skip to end */             \
-9:
-
-/* If msr bit 1<<25 is set, then VMX register REGNO is at offset REGNO*16
-   of the VMX reg struct.  REGNO is 1 thru 31.  */
-#define vsave_msr1(regno) \
-  .byte 0x10;                  /* DW_CFA_expression */                 \
-  .uleb128 regno + 77;         /*   regno */                           \
-  .uleb128 9f - 1f;            /*   length */                          \
-1:                                                                     \
-  .byte 0x30 + regno;          /*     DW_OP_lit n */                   \
-  .byte 0x2f; .short 2b - 9f;  /*     DW_OP_skip */                    \
-9:
-
-/* If msr bit 1<<25 is set, then VMX register REGNO is at offset OFS of
-   the VMX save block.  */
-#define vsave_msr2(regno, ofs) \
-  .byte 0x10;                  /* DW_CFA_expression */                 \
-  .uleb128 regno + 77;         /*   regno */                           \
-  .uleb128 9f - 1f;            /*   length */                          \
-1:                                                                     \
-  .byte 0x0a; .short ofs;      /*     DW_OP_const2u */                 \
-  .byte 0x2f; .short 3b - 9f;  /*     DW_OP_skip */                    \
-9:
-
-/* VMX register REGNO is at offset OFS of the VMX save area.  */
-#define vsave(regno, ofs) \
-  .byte 0x10;                  /* DW_CFA_expression */                 \
-  .uleb128 regno + 77;         /*   regno */                           \
-  .uleb128 9f - 1f;            /*   length */                          \
-1:                                                                     \
-  .byte 0x71; .sleb128 PTREGS; /*     DW_OP_breg1 */                   \
-  .byte 0x06;                  /*     DW_OP_deref */                   \
-  .byte 0x23; .uleb128 VREGS;  /*     DW_OP_plus_uconst */             \
-  .byte 0x23; .uleb128 ofs;    /*     DW_OP_plus_uconst */             \
-9:
-
-/* This is where the pt_regs pointer can be found on the stack.  */
-#define PTREGS 64+28
-
-/* Size of regs.  */
-#define RSIZE 4
-
-/* This is the offset of the VMX regs.  */
-#define VREGS 48*RSIZE+34*8
-
-/* Describe where general purpose regs are saved.  */
-#define EH_FRAME_GEN \
-  cfa_save;                                                            \
-  rsave ( 0,  0*RSIZE);                                                        \
-  rsave ( 2,  2*RSIZE);                                                        \
-  rsave ( 3,  3*RSIZE);                                                        \
-  rsave ( 4,  4*RSIZE);                                                        \
-  rsave ( 5,  5*RSIZE);                                                        \
-  rsave ( 6,  6*RSIZE);                                                        \
-  rsave ( 7,  7*RSIZE);                                                        \
-  rsave ( 8,  8*RSIZE);                                                        \
-  rsave ( 9,  9*RSIZE);                                                        \
-  rsave (10, 10*RSIZE);                                                        \
-  rsave (11, 11*RSIZE);                                                        \
-  rsave (12, 12*RSIZE);                                                        \
-  rsave (13, 13*RSIZE);                                                        \
-  rsave (14, 14*RSIZE);                                                        \
-  rsave (15, 15*RSIZE);                                                        \
-  rsave (16, 16*RSIZE);                                                        \
-  rsave (17, 17*RSIZE);                                                        \
-  rsave (18, 18*RSIZE);                                                        \
-  rsave (19, 19*RSIZE);                                                        \
-  rsave (20, 20*RSIZE);                                                        \
-  rsave (21, 21*RSIZE);                                                        \
-  rsave (22, 22*RSIZE);                                                        \
-  rsave (23, 23*RSIZE);                                                        \
-  rsave (24, 24*RSIZE);                                                        \
-  rsave (25, 25*RSIZE);                                                        \
-  rsave (26, 26*RSIZE);                                                        \
-  rsave (27, 27*RSIZE);                                                        \
-  rsave (28, 28*RSIZE);                                                        \
-  rsave (29, 29*RSIZE);                                                        \
-  rsave (30, 30*RSIZE);                                                        \
-  rsave (31, 31*RSIZE);                                                        \
-  rsave (67, 32*RSIZE);                /* ap, used as temp for nip */          \
-  rsave (65, 36*RSIZE);                /* lr */                                \
-  rsave (70, 38*RSIZE)         /* cr */
-
-/* Describe where the FP regs are saved.  */
-#define EH_FRAME_FP \
-  rsave (32, 48*RSIZE +  0*8);                                         \
-  rsave (33, 48*RSIZE +  1*8);                                         \
-  rsave (34, 48*RSIZE +  2*8);                                         \
-  rsave (35, 48*RSIZE +  3*8);                                         \
-  rsave (36, 48*RSIZE +  4*8);                                         \
-  rsave (37, 48*RSIZE +  5*8);                                         \
-  rsave (38, 48*RSIZE +  6*8);                                         \
-  rsave (39, 48*RSIZE +  7*8);                                         \
-  rsave (40, 48*RSIZE +  8*8);                                         \
-  rsave (41, 48*RSIZE +  9*8);                                         \
-  rsave (42, 48*RSIZE + 10*8);                                         \
-  rsave (43, 48*RSIZE + 11*8);                                         \
-  rsave (44, 48*RSIZE + 12*8);                                         \
-  rsave (45, 48*RSIZE + 13*8);                                         \
-  rsave (46, 48*RSIZE + 14*8);                                         \
-  rsave (47, 48*RSIZE + 15*8);                                         \
-  rsave (48, 48*RSIZE + 16*8);                                         \
-  rsave (49, 48*RSIZE + 17*8);                                         \
-  rsave (50, 48*RSIZE + 18*8);                                         \
-  rsave (51, 48*RSIZE + 19*8);                                         \
-  rsave (52, 48*RSIZE + 20*8);                                         \
-  rsave (53, 48*RSIZE + 21*8);                                         \
-  rsave (54, 48*RSIZE + 22*8);                                         \
-  rsave (55, 48*RSIZE + 23*8);                                         \
-  rsave (56, 48*RSIZE + 24*8);                                         \
-  rsave (57, 48*RSIZE + 25*8);                                         \
-  rsave (58, 48*RSIZE + 26*8);                                         \
-  rsave (59, 48*RSIZE + 27*8);                                         \
-  rsave (60, 48*RSIZE + 28*8);                                         \
-  rsave (61, 48*RSIZE + 29*8);                                         \
-  rsave (62, 48*RSIZE + 30*8);                                         \
-  rsave (63, 48*RSIZE + 31*8)
-
-/* Describe where the VMX regs are saved.  */
-#ifdef CONFIG_ALTIVEC
-#define EH_FRAME_VMX \
-  vsave_msr0 ( 0);                                                     \
-  vsave_msr1 ( 1);                                                     \
-  vsave_msr1 ( 2);                                                     \
-  vsave_msr1 ( 3);                                                     \
-  vsave_msr1 ( 4);                                                     \
-  vsave_msr1 ( 5);                                                     \
-  vsave_msr1 ( 6);                                                     \
-  vsave_msr1 ( 7);                                                     \
-  vsave_msr1 ( 8);                                                     \
-  vsave_msr1 ( 9);                                                     \
-  vsave_msr1 (10);                                                     \
-  vsave_msr1 (11);                                                     \
-  vsave_msr1 (12);                                                     \
-  vsave_msr1 (13);                                                     \
-  vsave_msr1 (14);                                                     \
-  vsave_msr1 (15);                                                     \
-  vsave_msr1 (16);                                                     \
-  vsave_msr1 (17);                                                     \
-  vsave_msr1 (18);                                                     \
-  vsave_msr1 (19);                                                     \
-  vsave_msr1 (20);                                                     \
-  vsave_msr1 (21);                                                     \
-  vsave_msr1 (22);                                                     \
-  vsave_msr1 (23);                                                     \
-  vsave_msr1 (24);                                                     \
-  vsave_msr1 (25);                                                     \
-  vsave_msr1 (26);                                                     \
-  vsave_msr1 (27);                                                     \
-  vsave_msr1 (28);                                                     \
-  vsave_msr1 (29);                                                     \
-  vsave_msr1 (30);                                                     \
-  vsave_msr1 (31);                                                     \
-  vsave_msr2 (33, 32*16+12);                                           \
-  vsave      (32, 32*16)
-#else
-#define EH_FRAME_VMX
-#endif
-
-.Lcie:
-       .long .Lcie_end - .Lcie_start
-.Lcie_start:
-       .long 0                 /* CIE ID */
-       .byte 1                 /* Version number */
-       .string "zR"            /* NUL-terminated augmentation string */
-       .uleb128 4              /* Code alignment factor */
-       .sleb128 -4             /* Data alignment factor */
-       .byte 67                /* Return address register column, ap */
-       .uleb128 1              /* Augmentation value length */
-       .byte 0x1b              /* DW_EH_PE_pcrel | DW_EH_PE_sdata4. */
-       .byte 0x0c,1,0          /* DW_CFA_def_cfa: r1 ofs 0 */
-       .balign 4
-.Lcie_end:
-
-       .long .Lfde0_end - .Lfde0_start
-.Lfde0_start:
-       .long .Lfde0_start - .Lcie      /* CIE pointer. */
-       .long .Lsig_start - .           /* PC start, length */
-       .long .Lsig_end - .Lsig_start
-       .uleb128 0                      /* Augmentation */
-       EH_FRAME_GEN
-       EH_FRAME_FP
-       EH_FRAME_VMX
-       .balign 4
-.Lfde0_end:
-
-/* We have a different stack layout for rt_sigreturn.  */
-#undef PTREGS
-#define PTREGS 64+16+128+20+28
-
-       .long .Lfde1_end - .Lfde1_start
-.Lfde1_start:
-       .long .Lfde1_start - .Lcie      /* CIE pointer. */
-       .long .Lsigrt_start - .         /* PC start, length */
-       .long .Lsigrt_end - .Lsigrt_start
-       .uleb128 0                      /* Augmentation */
-       EH_FRAME_GEN
-       EH_FRAME_FP
-       EH_FRAME_VMX
-       .balign 4
-.Lfde1_end:
diff --git a/arch/ppc64/kernel/vdso32/vdso32.lds.S b/arch/ppc64/kernel/vdso32/vdso32.lds.S
deleted file mode 100644 (file)
index 6f87a91..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-
-/*
- * This is the infamous ld script for the 32 bits vdso
- * library
- */
-#include <asm/vdso.h>
-
-/* Default link addresses for the vDSOs */
-OUTPUT_FORMAT("elf32-powerpc", "elf32-powerpc", "elf32-powerpc")
-OUTPUT_ARCH(powerpc:common)
-ENTRY(_start)
-
-SECTIONS
-{
-  . = VDSO32_LBASE + SIZEOF_HEADERS;
-  .hash           : { *(.hash) }                       :text
-  .dynsym         : { *(.dynsym) }
-  .dynstr         : { *(.dynstr) }
-  .gnu.version    : { *(.gnu.version) }
-  .gnu.version_d  : { *(.gnu.version_d) }
-  .gnu.version_r  : { *(.gnu.version_r) }
-
-  .note                  : { *(.note.*) }                      :text   :note
-
-  . = ALIGN (16);
-  .text :
-  {
-    *(.text .stub .text.* .gnu.linkonce.t.*)
-  }
-  PROVIDE (__etext = .);
-  PROVIDE (_etext = .);
-  PROVIDE (etext = .);
-
-  /* Other stuff is appended to the text segment: */
-  .rodata              : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
-  .rodata1             : { *(.rodata1) }
-
-  .eh_frame_hdr                : { *(.eh_frame_hdr) }          :text   :eh_frame_hdr
-  .eh_frame            : { KEEP (*(.eh_frame)) }       :text
-  .gcc_except_table    : { *(.gcc_except_table) }
-  .fixup               : { *(.fixup) }
-
-  .dynamic             : { *(.dynamic) }               :text   :dynamic
-  .got : { *(.got) }
-  .plt : { *(.plt) }
-
-  _end = .;
-  __end = .;
-  PROVIDE (end = .);
-
-
-  /* Stabs debugging sections are here too
-   */
-  .stab 0 : { *(.stab) }
-  .stabstr 0 : { *(.stabstr) }
-  .stab.excl 0 : { *(.stab.excl) }
-  .stab.exclstr 0 : { *(.stab.exclstr) }
-  .stab.index 0 : { *(.stab.index) }
-  .stab.indexstr 0 : { *(.stab.indexstr) }
-  .comment 0 : { *(.comment) }
-  .debug 0 : { *(.debug) }
-  .line 0 : { *(.line) }
-
-  .debug_srcinfo 0 : { *(.debug_srcinfo) }
-  .debug_sfnames 0 : { *(.debug_sfnames) }
-
-  .debug_aranges 0 : { *(.debug_aranges) }
-  .debug_pubnames 0 : { *(.debug_pubnames) }
-
-  .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
-  .debug_abbrev 0 : { *(.debug_abbrev) }
-  .debug_line 0 : { *(.debug_line) }
-  .debug_frame 0 : { *(.debug_frame) }
-  .debug_str 0 : { *(.debug_str) }
-  .debug_loc 0 : { *(.debug_loc) }
-  .debug_macinfo 0 : { *(.debug_macinfo) }
-
-  .debug_weaknames 0 : { *(.debug_weaknames) }
-  .debug_funcnames 0 : { *(.debug_funcnames) }
-  .debug_typenames 0 : { *(.debug_typenames) }
-  .debug_varnames 0 : { *(.debug_varnames) }
-
-  /DISCARD/ : { *(.note.GNU-stack) }
-  /DISCARD/ : { *(.data .data.* .gnu.linkonce.d.* .sdata*) }
-  /DISCARD/ : { *(.bss .sbss .dynbss .dynsbss) }
-}
-
-
-PHDRS
-{
-  text PT_LOAD FILEHDR PHDRS FLAGS(5); /* PF_R|PF_X */
-  note PT_NOTE FLAGS(4); /* PF_R */
-  dynamic PT_DYNAMIC FLAGS(4); /* PF_R */
-  eh_frame_hdr 0x6474e550; /* PT_GNU_EH_FRAME, but ld doesn't match the name */
-}
-
-
-/*
- * This controls what symbols we export from the DSO.
- */
-VERSION
-{
-  VDSO_VERSION_STRING {
-    global:
-       __kernel_datapage_offset; /* Has to be there for the kernel to find it */
-       __kernel_get_syscall_map;
-       __kernel_gettimeofday;
-       __kernel_sync_dicache;
-       __kernel_sync_dicache_p5;
-       __kernel_sigtramp32;
-       __kernel_sigtramp_rt32;
-    local: *;
-  };
-}
diff --git a/arch/ppc64/kernel/vdso32/vdso32_wrapper.S b/arch/ppc64/kernel/vdso32/vdso32_wrapper.S
deleted file mode 100644 (file)
index 76ca28e..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <linux/init.h>
-#include <asm/page.h>
-
-       .section ".data.page_aligned"
-
-       .globl vdso32_start, vdso32_end
-       .balign PAGE_SIZE
-vdso32_start:
-       .incbin "arch/ppc64/kernel/vdso32/vdso32.so"
-       .balign PAGE_SIZE
-vdso32_end:
-
-       .previous
diff --git a/arch/ppc64/kernel/vdso64/Makefile b/arch/ppc64/kernel/vdso64/Makefile
deleted file mode 100644 (file)
index ab39988..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-# List of files in the vdso, has to be asm only for now
-
-obj-vdso64 = sigtramp.o gettimeofday.o datapage.o cacheflush.o note.o
-
-# Build rules
-
-targets := $(obj-vdso64) vdso64.so
-obj-vdso64 := $(addprefix $(obj)/, $(obj-vdso64))
-
-EXTRA_CFLAGS := -shared -s -fno-common -fno-builtin
-EXTRA_CFLAGS +=  -nostdlib -Wl,-soname=linux-vdso64.so.1
-EXTRA_AFLAGS := -D__VDSO64__ -s
-
-obj-y += vdso64_wrapper.o
-extra-y += vdso64.lds
-CPPFLAGS_vdso64.lds += -P -C -U$(ARCH)
-
-# Force dependency (incbin is bad)
-$(obj)/vdso64_wrapper.o : $(obj)/vdso64.so
-
-# link rule for the .so file, .lds has to be first
-$(obj)/vdso64.so: $(src)/vdso64.lds $(obj-vdso64)
-       $(call if_changed,vdso64ld)
-
-# assembly rules for the .S files
-$(obj-vdso64): %.o: %.S
-       $(call if_changed_dep,vdso64as)
-
-# actual build commands
-quiet_cmd_vdso64ld = VDSO64L $@
-      cmd_vdso64ld = $(CC) $(c_flags) -Wl,-T $^ -o $@
-quiet_cmd_vdso64as = VDSO64A $@
-      cmd_vdso64as = $(CC) $(a_flags) -c -o $@ $<
-
-
diff --git a/arch/ppc64/kernel/vdso64/cacheflush.S b/arch/ppc64/kernel/vdso64/cacheflush.S
deleted file mode 100644 (file)
index d4a0ad2..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * vDSO provided cache flush routines
- *
- * Copyright (C) 2004 Benjamin Herrenschmuidt (benh@kernel.crashing.org),
- *                    IBM Corp.
- *
- * 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; either version
- * 2 of the License, or (at your option) any later version.
- */
-#include <linux/config.h>
-#include <asm/processor.h>
-#include <asm/ppc_asm.h>
-#include <asm/vdso.h>
-#include <asm/asm-offsets.h>
-
-       .text
-
-/*
- * Default "generic" version of __kernel_sync_dicache.
- *
- * void __kernel_sync_dicache(unsigned long start, unsigned long end)
- *
- * Flushes the data cache & invalidate the instruction cache for the
- * provided range [start, end[
- *
- * Note: all CPUs supported by this kernel have a 128 bytes cache
- * line size so we don't have to peek that info from the datapage
- */
-V_FUNCTION_BEGIN(__kernel_sync_dicache)
-  .cfi_startproc
-       li      r5,127
-       andc    r6,r3,r5                /* round low to line bdy */
-       subf    r8,r6,r4                /* compute length */
-       add     r8,r8,r5                /* ensure we get enough */
-       srwi.   r8,r8,7                 /* compute line count */
-       beqlr                           /* nothing to do? */
-       mtctr   r8
-       mr      r3,r6
-1:     dcbst   0,r3
-       addi    r3,r3,128
-       bdnz    1b
-       sync
-       mtctr   r8
-1:     icbi    0,r6
-       addi    r6,r6,128
-       bdnz    1b
-       isync
-       li      r3,0
-       blr
-  .cfi_endproc
-V_FUNCTION_END(__kernel_sync_dicache)
-
-
-/*
- * POWER5 version of __kernel_sync_dicache
- */
-V_FUNCTION_BEGIN(__kernel_sync_dicache_p5)
-  .cfi_startproc
-       sync
-       isync
-       li      r3,0
-       blr
-  .cfi_endproc
-V_FUNCTION_END(__kernel_sync_dicache_p5)
diff --git a/arch/ppc64/kernel/vdso64/datapage.S b/arch/ppc64/kernel/vdso64/datapage.S
deleted file mode 100644 (file)
index ed6e599..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Access to the shared data page by the vDSO & syscall map
- *
- * Copyright (C) 2004 Benjamin Herrenschmuidt (benh@kernel.crashing.org), IBM Corp.
- *
- * 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; either version
- * 2 of the License, or (at your option) any later version.
- */
-
-#include <linux/config.h>
-#include <asm/processor.h>
-#include <asm/ppc_asm.h>
-#include <asm/asm-offsets.h>
-#include <asm/unistd.h>
-#include <asm/vdso.h>
-
-       .text
-V_FUNCTION_BEGIN(__get_datapage)
-  .cfi_startproc
-       /* We don't want that exposed or overridable as we want other objects
-        * to be able to bl directly to here
-        */
-       .protected __get_datapage
-       .hidden __get_datapage
-
-       mflr    r0
-  .cfi_register lr,r0
-
-       bcl     20,31,1f
-       .global __kernel_datapage_offset;
-__kernel_datapage_offset:
-       .long   0
-1:
-       mflr    r3
-       mtlr    r0
-       lwz     r0,0(r3)
-       add     r3,r0,r3
-       blr
-  .cfi_endproc
-V_FUNCTION_END(__get_datapage)
-
-/*
- * void *__kernel_get_syscall_map(unsigned int *syscall_count) ;
- *
- * returns a pointer to the syscall map. the map is agnostic to the
- * size of "long", unlike kernel bitops, it stores bits from top to
- * bottom so that memory actually contains a linear bitmap
- * check for syscall N by testing bit (0x80000000 >> (N & 0x1f)) of
- * 32 bits int at N >> 5.
- */
-V_FUNCTION_BEGIN(__kernel_get_syscall_map)
-  .cfi_startproc
-       mflr    r12
-  .cfi_register lr,r12
-
-       mr      r4,r3
-       bl      V_LOCAL_FUNC(__get_datapage)
-       mtlr    r12
-       addi    r3,r3,CFG_SYSCALL_MAP64
-       cmpli   cr0,r4,0
-       beqlr
-       li      r0,__NR_syscalls
-       stw     r0,0(r4)
-       blr
-  .cfi_endproc
-V_FUNCTION_END(__kernel_get_syscall_map)
diff --git a/arch/ppc64/kernel/vdso64/gettimeofday.S b/arch/ppc64/kernel/vdso64/gettimeofday.S
deleted file mode 100644 (file)
index f6df802..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Userland implementation of gettimeofday() for 64 bits processes in a
- * ppc64 kernel for use in the vDSO
- *
- * Copyright (C) 2004 Benjamin Herrenschmuidt (benh@kernel.crashing.org),
- *                    IBM Corp.
- *
- * 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; either version
- * 2 of the License, or (at your option) any later version.
- */
-#include <linux/config.h>
-#include <asm/processor.h>
-#include <asm/ppc_asm.h>
-#include <asm/vdso.h>
-#include <asm/asm-offsets.h>
-
-       .text
-/*
- * Exact prototype of gettimeofday
- *
- * int __kernel_gettimeofday(struct timeval *tv, struct timezone *tz);
- *
- */
-V_FUNCTION_BEGIN(__kernel_gettimeofday)
-  .cfi_startproc
-       mflr    r12
-  .cfi_register lr,r12
-
-       mr      r11,r3                  /* r11 holds tv */
-       mr      r10,r4                  /* r10 holds tz */
-       bl      V_LOCAL_FUNC(__get_datapage)            /* get data page */
-       bl      V_LOCAL_FUNC(__do_get_xsec)             /* get xsec from tb & kernel */
-       lis     r7,15                   /* r7 = 1000000 = USEC_PER_SEC */
-       ori     r7,r7,16960
-       rldicl  r5,r4,44,20             /* r5 = sec = xsec / XSEC_PER_SEC */
-       rldicr  r6,r5,20,43             /* r6 = sec * XSEC_PER_SEC */
-       std     r5,TVAL64_TV_SEC(r11)   /* store sec in tv */
-       subf    r0,r6,r4                /* r0 = xsec = (xsec - r6) */
-       mulld   r0,r0,r7                /* usec = (xsec * USEC_PER_SEC) / XSEC_PER_SEC */
-       rldicl  r0,r0,44,20
-       cmpldi  cr0,r10,0               /* check if tz is NULL */
-       std     r0,TVAL64_TV_USEC(r11)  /* store usec in tv */
-       beq     1f
-       lwz     r4,CFG_TZ_MINUTEWEST(r3)/* fill tz */
-       lwz     r5,CFG_TZ_DSTTIME(r3)
-       stw     r4,TZONE_TZ_MINWEST(r10)
-       stw     r5,TZONE_TZ_DSTTIME(r10)
-1:     mtlr    r12
-       li      r3,0                    /* always success */
-       blr
-  .cfi_endproc
-V_FUNCTION_END(__kernel_gettimeofday)
-
-
-/*
- * This is the core of gettimeofday(), it returns the xsec
- * value in r4 and expects the datapage ptr (non clobbered)
- * in r3. clobbers r0,r4,r5,r6,r7,r8
-*/
-V_FUNCTION_BEGIN(__do_get_xsec)
-  .cfi_startproc
-       /* check for update count & load values */
-1:     ld      r7,CFG_TB_UPDATE_COUNT(r3)
-       andi.   r0,r4,1                 /* pending update ? loop */
-       bne-    1b
-       xor     r0,r4,r4                /* create dependency */
-       add     r3,r3,r0
-
-       /* Get TB & offset it */
-       mftb    r8
-       ld      r9,CFG_TB_ORIG_STAMP(r3)
-       subf    r8,r9,r8
-
-       /* Scale result */
-       ld      r5,CFG_TB_TO_XS(r3)
-       mulhdu  r8,r8,r5
-
-       /* Add stamp since epoch */
-       ld      r6,CFG_STAMP_XSEC(r3)
-       add     r4,r6,r8
-
-       xor     r0,r4,r4
-       add     r3,r3,r0
-       ld      r0,CFG_TB_UPDATE_COUNT(r3)
-        cmpld   cr0,r0,r7              /* check if updated */
-       bne-    1b
-       blr
-  .cfi_endproc
-V_FUNCTION_END(__do_get_xsec)
diff --git a/arch/ppc64/kernel/vdso64/note.S b/arch/ppc64/kernel/vdso64/note.S
deleted file mode 100644 (file)
index dc2a509..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include "../vdso32/note.S"
diff --git a/arch/ppc64/kernel/vdso64/sigtramp.S b/arch/ppc64/kernel/vdso64/sigtramp.S
deleted file mode 100644 (file)
index 31b604a..0000000
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- * Signal trampoline for 64 bits processes in a ppc64 kernel for
- * use in the vDSO
- *
- * Copyright (C) 2004 Benjamin Herrenschmuidt (benh@kernel.crashing.org), IBM Corp.
- * Copyright (C) 2004 Alan Modra (amodra@au.ibm.com)), IBM Corp.
- *
- * 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; either version
- * 2 of the License, or (at your option) any later version.
- */
-#include <linux/config.h>
-#include <asm/processor.h>
-#include <asm/ppc_asm.h>
-#include <asm/unistd.h>
-#include <asm/vdso.h>
-#include <asm/ptrace.h>                /* XXX for __SIGNAL_FRAMESIZE */
-
-       .text
-
-/* The nop here is a hack.  The dwarf2 unwind routines subtract 1 from
-   the return address to get an address in the middle of the presumed
-   call instruction.  Since we don't have a call here, we artifically
-   extend the range covered by the unwind info by padding before the
-   real start.  */
-       nop
-       .balign 8
-V_FUNCTION_BEGIN(__kernel_sigtramp_rt64)
-.Lsigrt_start = . - 4
-       addi    r1, r1, __SIGNAL_FRAMESIZE
-       li      r0,__NR_rt_sigreturn
-       sc
-.Lsigrt_end:
-V_FUNCTION_END(__kernel_sigtramp_rt64)
-/* The ".balign 8" above and the following zeros mimic the old stack
-   trampoline layout.  The last magic value is the ucontext pointer,
-   chosen in such a way that older libgcc unwind code returns a zero
-   for a sigcontext pointer.  */
-       .long 0,0,0
-       .quad 0,-21*8
-
-/* Register r1 can be found at offset 8 of a pt_regs structure.
-   A pointer to the pt_regs is stored in memory at the old sp plus PTREGS.  */
-#define cfa_save \
-  .byte 0x0f;                  /* DW_CFA_def_cfa_expression */         \
-  .uleb128 9f - 1f;            /*   length */                          \
-1:                                                                     \
-  .byte 0x71; .sleb128 PTREGS; /*     DW_OP_breg1 */                   \
-  .byte 0x06;                  /*     DW_OP_deref */                   \
-  .byte 0x23; .uleb128 RSIZE;  /*     DW_OP_plus_uconst */             \
-  .byte 0x06;                  /*     DW_OP_deref */                   \
-9:
-
-/* Register REGNO can be found at offset OFS of a pt_regs structure.
-   A pointer to the pt_regs is stored in memory at the old sp plus PTREGS.  */
-#define rsave(regno, ofs) \
-  .byte 0x10;                  /* DW_CFA_expression */                 \
-  .uleb128 regno;              /*   regno */                           \
-  .uleb128 9f - 1f;            /*   length */                          \
-1:                                                                     \
-  .byte 0x71; .sleb128 PTREGS; /*     DW_OP_breg1 */                   \
-  .byte 0x06;                  /*     DW_OP_deref */                   \
-  .ifne ofs;                                                           \
-    .byte 0x23; .uleb128 ofs;  /*     DW_OP_plus_uconst */             \
-  .endif;                                                              \
-9:
-
-/* If msr bit 1<<25 is set, then VMX register REGNO is at offset REGNO*16
-   of the VMX reg struct.  A pointer to the VMX reg struct is at VREGS in
-   the pt_regs struct.  This macro is for REGNO == 0, and contains
-   'subroutines' that the other macros jump to.  */
-#define vsave_msr0(regno) \
-  .byte 0x10;                  /* DW_CFA_expression */                 \
-  .uleb128 regno + 77;         /*   regno */                           \
-  .uleb128 9f - 1f;            /*   length */                          \
-1:                                                                     \
-  .byte 0x30 + regno;          /*     DW_OP_lit0 */                    \
-2:                                                                     \
-  .byte 0x40;                  /*     DW_OP_lit16 */                   \
-  .byte 0x1e;                  /*     DW_OP_mul */                     \
-3:                                                                     \
-  .byte 0x71; .sleb128 PTREGS; /*     DW_OP_breg1 */                   \
-  .byte 0x06;                  /*     DW_OP_deref */                   \
-  .byte 0x12;                  /*     DW_OP_dup */                     \
-  .byte 0x23;                  /*     DW_OP_plus_uconst */             \
-    .uleb128 33*RSIZE;         /*       msr offset */                  \
-  .byte 0x06;                  /*     DW_OP_deref */                   \
-  .byte 0x0c; .long 1 << 25;   /*     DW_OP_const4u */                 \
-  .byte 0x1a;                  /*     DW_OP_and */                     \
-  .byte 0x12;                  /*     DW_OP_dup, ret 0 if bra taken */ \
-  .byte 0x30;                  /*     DW_OP_lit0 */                    \
-  .byte 0x29;                  /*     DW_OP_eq */                      \
-  .byte 0x28; .short 0x7fff;   /*     DW_OP_bra to end */              \
-  .byte 0x13;                  /*     DW_OP_drop, pop the 0 */         \
-  .byte 0x23; .uleb128 VREGS;  /*     DW_OP_plus_uconst */             \
-  .byte 0x06;                  /*     DW_OP_deref */                   \
-  .byte 0x22;                  /*     DW_OP_plus */                    \
-  .byte 0x2f; .short 0x7fff;   /*     DW_OP_skip to end */             \
-9:
-
-/* If msr bit 1<<25 is set, then VMX register REGNO is at offset REGNO*16
-   of the VMX reg struct.  REGNO is 1 thru 31.  */
-#define vsave_msr1(regno) \
-  .byte 0x10;                  /* DW_CFA_expression */                 \
-  .uleb128 regno + 77;         /*   regno */                           \
-  .uleb128 9f - 1f;            /*   length */                          \
-1:                                                                     \
-  .byte 0x30 + regno;          /*     DW_OP_lit n */                   \
-  .byte 0x2f; .short 2b - 9f;  /*     DW_OP_skip */                    \
-9:
-
-/* If msr bit 1<<25 is set, then VMX register REGNO is at offset OFS of
-   the VMX save block.  */
-#define vsave_msr2(regno, ofs) \
-  .byte 0x10;                  /* DW_CFA_expression */                 \
-  .uleb128 regno + 77;         /*   regno */                           \
-  .uleb128 9f - 1f;            /*   length */                          \
-1:                                                                     \
-  .byte 0x0a; .short ofs;      /*     DW_OP_const2u */                 \
-  .byte 0x2f; .short 3b - 9f;  /*     DW_OP_skip */                    \
-9:
-
-/* VMX register REGNO is at offset OFS of the VMX save area.  */
-#define vsave(regno, ofs) \
-  .byte 0x10;                  /* DW_CFA_expression */                 \
-  .uleb128 regno + 77;         /*   regno */                           \
-  .uleb128 9f - 1f;            /*   length */                          \
-1:                                                                     \
-  .byte 0x71; .sleb128 PTREGS; /*     DW_OP_breg1 */                   \
-  .byte 0x06;                  /*     DW_OP_deref */                   \
-  .byte 0x23; .uleb128 VREGS;  /*     DW_OP_plus_uconst */             \
-  .byte 0x06;                  /*     DW_OP_deref */                   \
-  .byte 0x23; .uleb128 ofs;    /*     DW_OP_plus_uconst */             \
-9:
-
-/* This is where the pt_regs pointer can be found on the stack.  */
-#define PTREGS 128+168+56
-
-/* Size of regs.  */
-#define RSIZE 8
-
-/* This is the offset of the VMX reg pointer.  */
-#define VREGS 48*RSIZE+33*8
-
-/* Describe where general purpose regs are saved.  */
-#define EH_FRAME_GEN \
-  cfa_save;                                                            \
-  rsave ( 0,  0*RSIZE);                                                        \
-  rsave ( 2,  2*RSIZE);                                                        \
-  rsave ( 3,  3*RSIZE);                                                        \
-  rsave ( 4,  4*RSIZE);                                                        \
-  rsave ( 5,  5*RSIZE);                                                        \
-  rsave ( 6,  6*RSIZE);                                                        \
-  rsave ( 7,  7*RSIZE);                                                        \
-  rsave ( 8,  8*RSIZE);                                                        \
-  rsave ( 9,  9*RSIZE);                                                        \
-  rsave (10, 10*RSIZE);                                                        \
-  rsave (11, 11*RSIZE);                                                        \
-  rsave (12, 12*RSIZE);                                                        \
-  rsave (13, 13*RSIZE);                                                        \
-  rsave (14, 14*RSIZE);                                                        \
-  rsave (15, 15*RSIZE);                                                        \
-  rsave (16, 16*RSIZE);                                                        \
-  rsave (17, 17*RSIZE);                                                        \
-  rsave (18, 18*RSIZE);                                                        \
-  rsave (19, 19*RSIZE);                                                        \
-  rsave (20, 20*RSIZE);                                                        \
-  rsave (21, 21*RSIZE);                                                        \
-  rsave (22, 22*RSIZE);                                                        \
-  rsave (23, 23*RSIZE);                                                        \
-  rsave (24, 24*RSIZE);                                                        \
-  rsave (25, 25*RSIZE);                                                        \
-  rsave (26, 26*RSIZE);                                                        \
-  rsave (27, 27*RSIZE);                                                        \
-  rsave (28, 28*RSIZE);                                                        \
-  rsave (29, 29*RSIZE);                                                        \
-  rsave (30, 30*RSIZE);                                                        \
-  rsave (31, 31*RSIZE);                                                        \
-  rsave (67, 32*RSIZE);                /* ap, used as temp for nip */          \
-  rsave (65, 36*RSIZE);                /* lr */                                \
-  rsave (70, 38*RSIZE)         /* cr */
-
-/* Describe where the FP regs are saved.  */
-#define EH_FRAME_FP \
-  rsave (32, 48*RSIZE +  0*8);                                         \
-  rsave (33, 48*RSIZE +  1*8);                                         \
-  rsave (34, 48*RSIZE +  2*8);                                         \
-  rsave (35, 48*RSIZE +  3*8);                                         \
-  rsave (36, 48*RSIZE +  4*8);                                         \
-  rsave (37, 48*RSIZE +  5*8);                                         \
-  rsave (38, 48*RSIZE +  6*8);                                         \
-  rsave (39, 48*RSIZE +  7*8);                                         \
-  rsave (40, 48*RSIZE +  8*8);                                         \
-  rsave (41, 48*RSIZE +  9*8);                                         \
-  rsave (42, 48*RSIZE + 10*8);                                         \
-  rsave (43, 48*RSIZE + 11*8);                                         \
-  rsave (44, 48*RSIZE + 12*8);                                         \
-  rsave (45, 48*RSIZE + 13*8);                                         \
-  rsave (46, 48*RSIZE + 14*8);                                         \
-  rsave (47, 48*RSIZE + 15*8);                                         \
-  rsave (48, 48*RSIZE + 16*8);                                         \
-  rsave (49, 48*RSIZE + 17*8);                                         \
-  rsave (50, 48*RSIZE + 18*8);                                         \
-  rsave (51, 48*RSIZE + 19*8);                                         \
-  rsave (52, 48*RSIZE + 20*8);                                         \
-  rsave (53, 48*RSIZE + 21*8);                                         \
-  rsave (54, 48*RSIZE + 22*8);                                         \
-  rsave (55, 48*RSIZE + 23*8);                                         \
-  rsave (56, 48*RSIZE + 24*8);                                         \
-  rsave (57, 48*RSIZE + 25*8);                                         \
-  rsave (58, 48*RSIZE + 26*8);                                         \
-  rsave (59, 48*RSIZE + 27*8);                                         \
-  rsave (60, 48*RSIZE + 28*8);                                         \
-  rsave (61, 48*RSIZE + 29*8);                                         \
-  rsave (62, 48*RSIZE + 30*8);                                         \
-  rsave (63, 48*RSIZE + 31*8)
-
-/* Describe where the VMX regs are saved.  */
-#ifdef CONFIG_ALTIVEC
-#define EH_FRAME_VMX \
-  vsave_msr0 ( 0);                                                     \
-  vsave_msr1 ( 1);                                                     \
-  vsave_msr1 ( 2);                                                     \
-  vsave_msr1 ( 3);                                                     \
-  vsave_msr1 ( 4);                                                     \
-  vsave_msr1 ( 5);                                                     \
-  vsave_msr1 ( 6);                                                     \
-  vsave_msr1 ( 7);                                                     \
-  vsave_msr1 ( 8);                                                     \
-  vsave_msr1 ( 9);                                                     \
-  vsave_msr1 (10);                                                     \
-  vsave_msr1 (11);                                                     \
-  vsave_msr1 (12);                                                     \
-  vsave_msr1 (13);                                                     \
-  vsave_msr1 (14);                                                     \
-  vsave_msr1 (15);                                                     \
-  vsave_msr1 (16);                                                     \
-  vsave_msr1 (17);                                                     \
-  vsave_msr1 (18);                                                     \
-  vsave_msr1 (19);                                                     \
-  vsave_msr1 (20);                                                     \
-  vsave_msr1 (21);                                                     \
-  vsave_msr1 (22);                                                     \
-  vsave_msr1 (23);                                                     \
-  vsave_msr1 (24);                                                     \
-  vsave_msr1 (25);                                                     \
-  vsave_msr1 (26);                                                     \
-  vsave_msr1 (27);                                                     \
-  vsave_msr1 (28);                                                     \
-  vsave_msr1 (29);                                                     \
-  vsave_msr1 (30);                                                     \
-  vsave_msr1 (31);                                                     \
-  vsave_msr2 (33, 32*16+12);                                           \
-  vsave      (32, 33*16)
-#else
-#define EH_FRAME_VMX
-#endif
-
-       .section .eh_frame,"a",@progbits
-.Lcie:
-       .long .Lcie_end - .Lcie_start
-.Lcie_start:
-       .long 0                 /* CIE ID */
-       .byte 1                 /* Version number */
-       .string "zR"            /* NUL-terminated augmentation string */
-       .uleb128 4              /* Code alignment factor */
-       .sleb128 -8             /* Data alignment factor */
-       .byte 67                /* Return address register column, ap */
-       .uleb128 1              /* Augmentation value length */
-       .byte 0x14              /* DW_EH_PE_pcrel | DW_EH_PE_udata8. */
-       .byte 0x0c,1,0          /* DW_CFA_def_cfa: r1 ofs 0 */
-       .balign 8
-.Lcie_end:
-
-       .long .Lfde0_end - .Lfde0_start
-.Lfde0_start:
-       .long .Lfde0_start - .Lcie      /* CIE pointer. */
-       .quad .Lsigrt_start - .         /* PC start, length */
-       .quad .Lsigrt_end - .Lsigrt_start
-       .uleb128 0                      /* Augmentation */
-       EH_FRAME_GEN
-       EH_FRAME_FP
-       EH_FRAME_VMX
-# Do we really need to describe the frame at this point?  ie. will
-# we ever have some call chain that returns somewhere past the addi?
-# I don't think so, since gcc doesn't support async signals.
-#      .byte 0x41              /* DW_CFA_advance_loc 1*4 */
-#undef PTREGS
-#define PTREGS 168+56
-#      EH_FRAME_GEN
-#      EH_FRAME_FP
-#      EH_FRAME_VMX
-       .balign 8
-.Lfde0_end:
diff --git a/arch/ppc64/kernel/vdso64/vdso64.lds.S b/arch/ppc64/kernel/vdso64/vdso64.lds.S
deleted file mode 100644 (file)
index 9cb2818..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * This is the infamous ld script for the 64 bits vdso
- * library
- */
-#include <asm/vdso.h>
-
-OUTPUT_FORMAT("elf64-powerpc", "elf64-powerpc", "elf64-powerpc")
-OUTPUT_ARCH(powerpc:common64)
-ENTRY(_start)
-
-SECTIONS
-{
-  . = VDSO64_LBASE + SIZEOF_HEADERS;
-  .hash           : { *(.hash) }               :text
-  .dynsym         : { *(.dynsym) }
-  .dynstr         : { *(.dynstr) }
-  .gnu.version    : { *(.gnu.version) }
-  .gnu.version_d  : { *(.gnu.version_d) }
-  .gnu.version_r  : { *(.gnu.version_r) }
-
-  .note                  : { *(.note.*) }              :text   :note
-
-  . = ALIGN (16);
-  .text           :
-  {
-    *(.text .stub .text.* .gnu.linkonce.t.*)
-    *(.sfpr .glink)
-  }                                            :text
-  PROVIDE (__etext = .);
-  PROVIDE (_etext = .);
-  PROVIDE (etext = .);
-
-  /* Other stuff is appended to the text segment: */
-  .rodata         : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
-  .rodata1        : { *(.rodata1) }
-  .eh_frame_hdr   : { *(.eh_frame_hdr) }       :text   :eh_frame_hdr
-  .eh_frame       : { KEEP (*(.eh_frame)) }    :text
-  .gcc_except_table   : { *(.gcc_except_table) }
-
-  .opd           ALIGN(8) : { KEEP (*(.opd)) }
-  .got          ALIGN(8) : { *(.got .toc) }
-  .rela.dyn     ALIGN(8) : { *(.rela.dyn) }
-
-  .dynamic        : { *(.dynamic) }            :text   :dynamic
-
-  _end = .;
-  PROVIDE (end = .);
-
-  /* Stabs debugging sections are here too
-   */
-  .stab          0 : { *(.stab) }
-  .stabstr       0 : { *(.stabstr) }
-  .stab.excl     0 : { *(.stab.excl) }
-  .stab.exclstr  0 : { *(.stab.exclstr) }
-  .stab.index    0 : { *(.stab.index) }
-  .stab.indexstr 0 : { *(.stab.indexstr) }
-  .comment       0 : { *(.comment) }
-  /* DWARF debug sectio/ns.
-     Symbols in the DWARF debugging sections are relative to the beginning
-     of the section so we begin them at 0.  */
-  /* DWARF 1 */
-  .debug          0 : { *(.debug) }
-  .line           0 : { *(.line) }
-  /* GNU DWARF 1 extensions */
-  .debug_srcinfo  0 : { *(.debug_srcinfo) }
-  .debug_sfnames  0 : { *(.debug_sfnames) }
-  /* DWARF 1.1 and DWARF 2 */
-  .debug_aranges  0 : { *(.debug_aranges) }
-  .debug_pubnames 0 : { *(.debug_pubnames) }
-  /* DWARF 2 */
-  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
-  .debug_abbrev   0 : { *(.debug_abbrev) }
-  .debug_line     0 : { *(.debug_line) }
-  .debug_frame    0 : { *(.debug_frame) }
-  .debug_str      0 : { *(.debug_str) }
-  .debug_loc      0 : { *(.debug_loc) }
-  .debug_macinfo  0 : { *(.debug_macinfo) }
-  /* SGI/MIPS DWARF 2 extensions */
-  .debug_weaknames 0 : { *(.debug_weaknames) }
-  .debug_funcnames 0 : { *(.debug_funcnames) }
-  .debug_typenames 0 : { *(.debug_typenames) }
-  .debug_varnames  0 : { *(.debug_varnames) }
-
-  /DISCARD/ : { *(.note.GNU-stack) }
-  /DISCARD/ : { *(.branch_lt) }
-  /DISCARD/ : { *(.data .data.* .gnu.linkonce.d.*) }
-  /DISCARD/ : { *(.bss .sbss .dynbss .dynsbss) }
-}
-
-PHDRS
-{
-  text PT_LOAD FILEHDR PHDRS FLAGS(5); /* PF_R|PF_X */
-  note PT_NOTE FLAGS(4); /* PF_R */
-  dynamic PT_DYNAMIC FLAGS(4); /* PF_R */
-  eh_frame_hdr 0x6474e550; /* PT_GNU_EH_FRAME, but ld doesn't match the name */
-}
-
-/*
- * This controls what symbols we export from the DSO.
- */
-VERSION
-{
-  VDSO_VERSION_STRING {
-    global:
-       __kernel_datapage_offset; /* Has to be there for the kernel to find it */
-       __kernel_get_syscall_map;
-       __kernel_gettimeofday;
-       __kernel_sync_dicache;
-       __kernel_sync_dicache_p5;
-       __kernel_sigtramp_rt64;
-    local: *;
-  };
-}
diff --git a/arch/ppc64/kernel/vdso64/vdso64_wrapper.S b/arch/ppc64/kernel/vdso64/vdso64_wrapper.S
deleted file mode 100644 (file)
index 771c274..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <linux/init.h>
-#include <asm/page.h>
-
-       .section ".data.page_aligned"
-
-       .globl vdso64_start, vdso64_end
-       .balign PAGE_SIZE
-vdso64_start:
-       .incbin "arch/ppc64/kernel/vdso64/vdso64.so"
-       .balign PAGE_SIZE
-vdso64_end:
-
-       .previous
index 4cf31a2ae19c3d7a50a49d0da5f4201f11e449e1..84c73a300acb9ffffe0e2f48748df6ece06831c2 100644 (file)
@@ -268,9 +268,10 @@ void uml_net_user_timer_expire(unsigned long _conn)
 static DEFINE_SPINLOCK(devices_lock);
 static struct list_head devices = LIST_HEAD_INIT(devices);
 
-static struct device_driver uml_net_driver = {
-       .name  = DRIVER_NAME,
-       .bus   = &platform_bus_type,
+static struct platform_driver uml_net_driver = {
+       .driver = {
+               .name  = DRIVER_NAME,
+       },
 };
 static int driver_registered;
 
@@ -317,7 +318,7 @@ static int eth_configure(int n, void *init, char *mac,
 
        /* sysfs register */
        if (!driver_registered) {
-               driver_register(&uml_net_driver);
+               platform_driver_register(&uml_net_driver);
                driver_registered = 1;
        }
        device->pdev.id = n;
index b2c86257b0f83cc0f8f254d286db9bf76e4c5e86..93898917cbe5bb97240b77684e52e608de2ea9cc 100644 (file)
@@ -823,9 +823,10 @@ static int ubd_mc_init(void)
 
 __initcall(ubd_mc_init);
 
-static struct device_driver ubd_driver = {
-       .name  = DRIVER_NAME,
-       .bus   = &platform_bus_type,
+static struct platform_driver ubd_driver = {
+       .driver = {
+               .name  = DRIVER_NAME,
+       },
 };
 
 int ubd_init(void)
@@ -850,7 +851,7 @@ int ubd_init(void)
                if (register_blkdev(fake_major, "ubd"))
                        return -1;
        }
-       driver_register(&ubd_driver);
+       platform_driver_register(&ubd_driver);
        for (i = 0; i < MAX_DEV; i++) 
                ubd_add(i);
        return 0;
index 96b9bb4a478d0d269456fa4a1515a0f32b082a94..0dc55cc8691bf1cd3917daa10ec38d1f38109a56 100644 (file)
@@ -616,9 +616,10 @@ void iss_net_user_timer_expire(unsigned long _conn)
 }
 
 
-static struct device_driver iss_net_driver = {
-       .name  = DRIVER_NAME,
-       .bus   = &platform_bus_type,
+static struct platform_driver iss_net_driver = {
+       .driver = {
+               .name  = DRIVER_NAME,
+       },
 };
 
 static int driver_registered;
@@ -669,7 +670,7 @@ static int iss_net_configure(int index, char *init)
        /* sysfs register */
 
        if (!driver_registered) {
-               driver_register(&iss_net_driver);
+               platform_driver_register(&iss_net_driver);
                driver_registered = 1;
        }
 
index 6d4736e89f1adacbfe666e12ac23233424e3ad44..8827dafba9451a7f741b9330eb0e87b58210ab3f 100644 (file)
@@ -20,6 +20,8 @@
 
 #include "base.h"
 
+#define to_platform_driver(drv)        (container_of((drv), struct platform_driver, driver))
+
 struct device platform_bus = {
        .bus_id         = "platform",
 };
@@ -354,6 +356,77 @@ error:
        return ERR_PTR(retval);
 }
 
+static int platform_drv_probe(struct device *_dev)
+{
+       struct platform_driver *drv = to_platform_driver(_dev->driver);
+       struct platform_device *dev = to_platform_device(_dev);
+
+       return drv->probe(dev);
+}
+
+static int platform_drv_remove(struct device *_dev)
+{
+       struct platform_driver *drv = to_platform_driver(_dev->driver);
+       struct platform_device *dev = to_platform_device(_dev);
+
+       return drv->remove(dev);
+}
+
+static void platform_drv_shutdown(struct device *_dev)
+{
+       struct platform_driver *drv = to_platform_driver(_dev->driver);
+       struct platform_device *dev = to_platform_device(_dev);
+
+       drv->shutdown(dev);
+}
+
+static int platform_drv_suspend(struct device *_dev, pm_message_t state)
+{
+       struct platform_driver *drv = to_platform_driver(_dev->driver);
+       struct platform_device *dev = to_platform_device(_dev);
+
+       return drv->suspend(dev, state);
+}
+
+static int platform_drv_resume(struct device *_dev)
+{
+       struct platform_driver *drv = to_platform_driver(_dev->driver);
+       struct platform_device *dev = to_platform_device(_dev);
+
+       return drv->resume(dev);
+}
+
+/**
+ *     platform_driver_register
+ *     @drv: platform driver structure
+ */
+int platform_driver_register(struct platform_driver *drv)
+{
+       drv->driver.bus = &platform_bus_type;
+       if (drv->probe)
+               drv->driver.probe = platform_drv_probe;
+       if (drv->remove)
+               drv->driver.remove = platform_drv_remove;
+       if (drv->shutdown)
+               drv->driver.shutdown = platform_drv_shutdown;
+       if (drv->suspend)
+               drv->driver.suspend = platform_drv_suspend;
+       if (drv->resume)
+               drv->driver.resume = platform_drv_resume;
+       return driver_register(&drv->driver);
+}
+EXPORT_SYMBOL_GPL(platform_driver_register);
+
+/**
+ *     platform_driver_unregister
+ *     @drv: platform driver structure
+ */
+void platform_driver_unregister(struct platform_driver *drv)
+{
+       driver_unregister(&drv->driver);
+}
+EXPORT_SYMBOL_GPL(platform_driver_unregister);
+
 
 /**
  *     platform_match - bind platform device to platform driver.
index c1d06ba449b60455fcffdeb908fca20f4952df8d..d16bd4b5c1174665c5e54e23940e46b5c6e20d12 100644 (file)
@@ -2648,7 +2648,7 @@ void ipmi_smi_msg_received(ipmi_smi_t          intf,
        spin_lock_irqsave(&intf->waiting_msgs_lock, flags);
        if (!list_empty(&intf->waiting_msgs)) {
                list_add_tail(&msg->link, &intf->waiting_msgs);
-               spin_unlock(&intf->waiting_msgs_lock);
+               spin_unlock_irqrestore(&intf->waiting_msgs_lock, flags);
                goto out;
        }
        spin_unlock_irqrestore(&intf->waiting_msgs_lock, flags);
@@ -2657,9 +2657,9 @@ void ipmi_smi_msg_received(ipmi_smi_t          intf,
        if (rv > 0) {
                /* Could not handle the message now, just add it to a
                    list to handle later. */
-               spin_lock(&intf->waiting_msgs_lock);
+               spin_lock_irqsave(&intf->waiting_msgs_lock, flags);
                list_add_tail(&msg->link, &intf->waiting_msgs);
-               spin_unlock(&intf->waiting_msgs_lock);
+               spin_unlock_irqrestore(&intf->waiting_msgs_lock, flags);
        } else if (rv == 0) {
                ipmi_free_smi_msg(msg);
        }
index d724c0de4f28334ad1de8d84ad54291f570f0a15..3df7a574267b8a95445bf545266a7eb9ad35b73b 100644 (file)
@@ -382,7 +382,7 @@ static struct rtc_ops s3c2410_rtcops = {
        .proc           = s3c2410_rtc_proc,
 };
 
-static void s3c2410_rtc_enable(struct device *dev, int en)
+static void s3c2410_rtc_enable(struct platform_device *pdev, int en)
 {
        unsigned int tmp;
 
@@ -399,21 +399,21 @@ static void s3c2410_rtc_enable(struct device *dev, int en)
                /* re-enable the device, and check it is ok */
 
                if ((readb(S3C2410_RTCCON) & S3C2410_RTCCON_RTCEN) == 0){
-                       dev_info(dev, "rtc disabled, re-enabling\n");
+                       dev_info(&pdev->dev, "rtc disabled, re-enabling\n");
 
                        tmp = readb(S3C2410_RTCCON);
                        writeb(tmp | S3C2410_RTCCON_RTCEN , S3C2410_RTCCON);
                }
 
                if ((readb(S3C2410_RTCCON) & S3C2410_RTCCON_CNTSEL)){
-                       dev_info(dev, "removing S3C2410_RTCCON_CNTSEL\n");
+                       dev_info(&pdev->dev, "removing S3C2410_RTCCON_CNTSEL\n");
 
                        tmp = readb(S3C2410_RTCCON);
                        writeb(tmp& ~S3C2410_RTCCON_CNTSEL , S3C2410_RTCCON);
                }
 
                if ((readb(S3C2410_RTCCON) & S3C2410_RTCCON_CLKRST)){
-                       dev_info(dev, "removing S3C2410_RTCCON_CLKRST\n");
+                       dev_info(&pdev->dev, "removing S3C2410_RTCCON_CLKRST\n");
 
                        tmp = readb(S3C2410_RTCCON);
                        writeb(tmp & ~S3C2410_RTCCON_CLKRST, S3C2410_RTCCON);
@@ -421,7 +421,7 @@ static void s3c2410_rtc_enable(struct device *dev, int en)
        }
 }
 
-static int s3c2410_rtc_remove(struct device *dev)
+static int s3c2410_rtc_remove(struct platform_device *dev)
 {
        unregister_rtc(&s3c2410_rtcops);
 
@@ -438,25 +438,24 @@ static int s3c2410_rtc_remove(struct device *dev)
        return 0;
 }
 
-static int s3c2410_rtc_probe(struct device *dev)
+static int s3c2410_rtc_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        struct resource *res;
        int ret;
 
-       pr_debug("%s: probe=%p, device=%p\n", __FUNCTION__, pdev, dev);
+       pr_debug("%s: probe=%p\n", __FUNCTION__, pdev);
 
        /* find the IRQs */
 
        s3c2410_rtc_tickno = platform_get_irq(pdev, 1);
        if (s3c2410_rtc_tickno <= 0) {
-               dev_err(dev, "no irq for rtc tick\n");
+               dev_err(&pdev->dev, "no irq for rtc tick\n");
                return -ENOENT;
        }
 
        s3c2410_rtc_alarmno = platform_get_irq(pdev, 0);
        if (s3c2410_rtc_alarmno <= 0) {
-               dev_err(dev, "no irq for alarm\n");
+               dev_err(&pdev->dev, "no irq for alarm\n");
                return -ENOENT;
        }
 
@@ -467,7 +466,7 @@ static int s3c2410_rtc_probe(struct device *dev)
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (res == NULL) {
-               dev_err(dev, "failed to get memory region resource\n");
+               dev_err(&pdev->dev, "failed to get memory region resource\n");
                return -ENOENT;
        }
 
@@ -475,14 +474,14 @@ static int s3c2410_rtc_probe(struct device *dev)
                                     pdev->name);
 
        if (s3c2410_rtc_mem == NULL) {
-               dev_err(dev, "failed to reserve memory region\n");
+               dev_err(&pdev->dev, "failed to reserve memory region\n");
                ret = -ENOENT;
                goto exit_err;
        }
 
        s3c2410_rtc_base = ioremap(res->start, res->end - res->start + 1);
        if (s3c2410_rtc_base == NULL) {
-               dev_err(dev, "failed ioremap()\n");
+               dev_err(&pdev->dev, "failed ioremap()\n");
                ret = -EINVAL;
                goto exit_err;
        }
@@ -494,7 +493,7 @@ static int s3c2410_rtc_probe(struct device *dev)
 
        /* check to see if everything is setup correctly */
 
-       s3c2410_rtc_enable(dev, 1);
+       s3c2410_rtc_enable(pdev, 1);
 
        pr_debug("s3c2410_rtc: RTCCON=%02x\n", readb(S3C2410_RTCCON));
 
@@ -506,7 +505,7 @@ static int s3c2410_rtc_probe(struct device *dev)
        return 0;
 
  exit_err:
-       dev_err(dev, "error %d during initialisation\n", ret);
+       dev_err(&pdev->dev, "error %d during initialisation\n", ret);
 
        return ret;
 }
@@ -519,7 +518,7 @@ static struct timespec s3c2410_rtc_delta;
 
 static int ticnt_save;
 
-static int s3c2410_rtc_suspend(struct device *dev, pm_message_t state)
+static int s3c2410_rtc_suspend(struct platform_device *pdev, pm_message_t state)
 {
        struct rtc_time tm;
        struct timespec time;
@@ -535,19 +534,19 @@ static int s3c2410_rtc_suspend(struct device *dev, pm_message_t state)
        s3c2410_rtc_gettime(&tm);
        rtc_tm_to_time(&tm, &time.tv_sec);
        save_time_delta(&s3c2410_rtc_delta, &time);
-       s3c2410_rtc_enable(dev, 0);
+       s3c2410_rtc_enable(pdev, 0);
 
        return 0;
 }
 
-static int s3c2410_rtc_resume(struct device *dev)
+static int s3c2410_rtc_resume(struct platform_device *pdev)
 {
        struct rtc_time tm;
        struct timespec time;
 
        time.tv_nsec = 0;
 
-       s3c2410_rtc_enable(dev, 1);
+       s3c2410_rtc_enable(pdev, 1);
        s3c2410_rtc_gettime(&tm);
        rtc_tm_to_time(&tm, &time.tv_sec);
        restore_time_delta(&s3c2410_rtc_delta, &time);
@@ -560,14 +559,15 @@ static int s3c2410_rtc_resume(struct device *dev)
 #define s3c2410_rtc_resume  NULL
 #endif
 
-static struct device_driver s3c2410_rtcdrv = {
-       .name           = "s3c2410-rtc",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver s3c2410_rtcdrv = {
        .probe          = s3c2410_rtc_probe,
        .remove         = s3c2410_rtc_remove,
        .suspend        = s3c2410_rtc_suspend,
        .resume         = s3c2410_rtc_resume,
+       .driver         = {
+               .name   = "s3c2410-rtc",
+               .owner  = THIS_MODULE,
+       },
 };
 
 static char __initdata banner[] = "S3C2410 RTC, (c) 2004 Simtec Electronics\n";
@@ -575,12 +575,12 @@ static char __initdata banner[] = "S3C2410 RTC, (c) 2004 Simtec Electronics\n";
 static int __init s3c2410_rtc_init(void)
 {
        printk(banner);
-       return driver_register(&s3c2410_rtcdrv);
+       return platform_driver_register(&s3c2410_rtcdrv);
 }
 
 static void __exit s3c2410_rtc_exit(void)
 {
-       driver_unregister(&s3c2410_rtcdrv);
+       platform_driver_unregister(&s3c2410_rtcdrv);
 }
 
 module_init(s3c2410_rtc_init);
index d05067dcea01967fa9d645b08dffc982041b91ef..51a07370e636ec85edb0e9b375c5ebe72758fa83 100644 (file)
@@ -1168,7 +1168,7 @@ static int sonypi_disable(void)
 #ifdef CONFIG_PM
 static int old_camera_power;
 
-static int sonypi_suspend(struct device *dev, pm_message_t state)
+static int sonypi_suspend(struct platform_device *dev, pm_message_t state)
 {
        old_camera_power = sonypi_device.camera_power;
        sonypi_disable();
@@ -1176,26 +1176,27 @@ static int sonypi_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int sonypi_resume(struct device *dev)
+static int sonypi_resume(struct platform_device *dev)
 {
        sonypi_enable(old_camera_power);
        return 0;
 }
 #endif
 
-static void sonypi_shutdown(struct device *dev)
+static void sonypi_shutdown(struct platform_device *dev)
 {
        sonypi_disable();
 }
 
-static struct device_driver sonypi_driver = {
-       .name           = "sonypi",
-       .bus            = &platform_bus_type,
+static struct platform_driver sonypi_driver = {
 #ifdef CONFIG_PM
        .suspend        = sonypi_suspend,
        .resume         = sonypi_resume,
 #endif
        .shutdown       = sonypi_shutdown,
+       .driver         = {
+               .name   = "sonypi",
+       },
 };
 
 static int __devinit sonypi_create_input_devices(void)
@@ -1455,20 +1456,20 @@ static int __init sonypi_init(void)
        if (!dmi_check_system(sonypi_dmi_table))
                return -ENODEV;
 
-       ret = driver_register(&sonypi_driver);
+       ret = platform_driver_register(&sonypi_driver);
        if (ret)
                return ret;
 
        ret = sonypi_probe();
        if (ret)
-               driver_unregister(&sonypi_driver);
+               platform_driver_unregister(&sonypi_driver);
 
        return ret;
 }
 
 static void __exit sonypi_exit(void)
 {
-       driver_unregister(&sonypi_driver);
+       platform_driver_unregister(&sonypi_driver);
        sonypi_remove();
 }
 
index 24355b23b2ca8a3aacf77937dd829e66105fac0b..b3d411a756fee2d25a24882d60c3a9215c1ab593 100644 (file)
@@ -283,7 +283,7 @@ static void tb0219_pci_irq_init(void)
        vr41xx_set_irq_level(TB0219_PCI_SLOT3_PIN, IRQ_LEVEL_LOW);
 }
 
-static int tb0219_probe(struct device *dev)
+static int tb0219_probe(struct platform_device *dev)
 {
        int retval;
 
@@ -319,7 +319,7 @@ static int tb0219_probe(struct device *dev)
        return 0;
 }
 
-static int tb0219_remove(struct device *dev)
+static int tb0219_remove(struct platform_device *dev)
 {
        _machine_restart = old_machine_restart;
 
@@ -333,11 +333,12 @@ static int tb0219_remove(struct device *dev)
 
 static struct platform_device *tb0219_platform_device;
 
-static struct device_driver tb0219_device_driver = {
-       .name           = "TB0219",
-       .bus            = &platform_bus_type,
+static struct platform_driver tb0219_device_driver = {
        .probe          = tb0219_probe,
        .remove         = tb0219_remove,
+       .driver         = {
+               .name   = "TB0219",
+       },
 };
 
 static int __devinit tanbac_tb0219_init(void)
@@ -348,7 +349,7 @@ static int __devinit tanbac_tb0219_init(void)
        if (IS_ERR(tb0219_platform_device))
                return PTR_ERR(tb0219_platform_device);
 
-       retval = driver_register(&tb0219_device_driver);
+       retval = platform_driver_register(&tb0219_device_driver);
        if (retval < 0)
                platform_device_unregister(tb0219_platform_device);
 
@@ -357,7 +358,7 @@ static int __devinit tanbac_tb0219_init(void)
 
 static void __devexit tanbac_tb0219_exit(void)
 {
-       driver_unregister(&tb0219_device_driver);
+       platform_driver_unregister(&tb0219_device_driver);
 
        platform_device_unregister(tb0219_platform_device);
 }
index 94641085faf8b66a93ab1c9add8d2cdf49297c1b..9ac6d43437b3cb6b1e4aa27529c11b79c77298fb 100644 (file)
@@ -613,7 +613,7 @@ static struct file_operations gpio_fops = {
        .release        = gpio_release,
 };
 
-static int giu_probe(struct device *dev)
+static int giu_probe(struct platform_device *dev)
 {
        unsigned long start, size, flags = 0;
        unsigned int nr_pins = 0;
@@ -697,7 +697,7 @@ static int giu_probe(struct device *dev)
        return cascade_irq(GIUINT_IRQ, giu_get_irq);
 }
 
-static int giu_remove(struct device *dev)
+static int giu_remove(struct platform_device *dev)
 {
        iounmap(giu_base);
 
@@ -710,11 +710,12 @@ static int giu_remove(struct device *dev)
 
 static struct platform_device *giu_platform_device;
 
-static struct device_driver giu_device_driver = {
-       .name           = "GIU",
-       .bus            = &platform_bus_type,
+static struct platform_driver giu_device_driver = {
        .probe          = giu_probe,
        .remove         = giu_remove,
+       .driver         = {
+               .name   = "GIU",
+       },
 };
 
 static int __devinit vr41xx_giu_init(void)
@@ -725,7 +726,7 @@ static int __devinit vr41xx_giu_init(void)
        if (IS_ERR(giu_platform_device))
                return PTR_ERR(giu_platform_device);
 
-       retval = driver_register(&giu_device_driver);
+       retval = platform_driver_register(&giu_device_driver);
        if (retval < 0)
                platform_device_unregister(giu_platform_device);
 
@@ -734,7 +735,7 @@ static int __devinit vr41xx_giu_init(void)
 
 static void __devexit vr41xx_giu_exit(void)
 {
-       driver_unregister(&giu_device_driver);
+       platform_driver_unregister(&giu_device_driver);
 
        platform_device_unregister(giu_platform_device);
 }
index 5e3292df69d8d794a1a0c4a5ccf5f1becbb38591..435b30748e231807df780458e47cac52eb700e64 100644 (file)
@@ -560,13 +560,11 @@ static struct miscdevice rtc_miscdevice = {
        .fops   = &rtc_fops,
 };
 
-static int rtc_probe(struct device *dev)
+static int rtc_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev;
        unsigned int irq;
        int retval;
 
-       pdev = to_platform_device(dev);
        if (pdev->num_resources != 2)
                return -EBUSY;
 
@@ -635,7 +633,7 @@ static int rtc_probe(struct device *dev)
        return 0;
 }
 
-static int rtc_remove(struct device *dev)
+static int rtc_remove(struct platform_device *dev)
 {
        int retval;
 
@@ -655,11 +653,12 @@ static int rtc_remove(struct device *dev)
 
 static struct platform_device *rtc_platform_device;
 
-static struct device_driver rtc_device_driver = {
-       .name           = rtc_name,
-       .bus            = &platform_bus_type,
+static struct platform_driver rtc_device_driver = {
        .probe          = rtc_probe,
        .remove         = rtc_remove,
+       .driver         = {
+               .name   = rtc_name,
+       },
 };
 
 static int __devinit vr41xx_rtc_init(void)
@@ -691,7 +690,7 @@ static int __devinit vr41xx_rtc_init(void)
        if (IS_ERR(rtc_platform_device))
                return PTR_ERR(rtc_platform_device);
 
-       retval = driver_register(&rtc_device_driver);
+       retval = platform_driver_register(&rtc_device_driver);
        if (retval < 0)
                platform_device_unregister(rtc_platform_device);
 
@@ -700,7 +699,7 @@ static int __devinit vr41xx_rtc_init(void)
 
 static void __devexit vr41xx_rtc_exit(void)
 {
-       driver_unregister(&rtc_device_driver);
+       platform_driver_unregister(&rtc_device_driver);
 
        platform_device_unregister(rtc_platform_device);
 }
index da631c114fd17089e4ad475377e813bfa8f9618a..9defcf861b67095e2a245b1ddeae0686d75badc7 100644 (file)
@@ -139,7 +139,7 @@ static int mpcore_wdt_set_heartbeat(int t)
  */
 static int mpcore_wdt_open(struct inode *inode, struct file *file)
 {
-       struct mpcore_wdt *wdt = dev_get_drvdata(&mpcore_wdt_dev->dev);
+       struct mpcore_wdt *wdt = platform_get_drvdata(mpcore_wdt_dev);
 
        if (test_and_set_bit(0, &wdt->timer_alive))
                return -EBUSY;
@@ -291,9 +291,9 @@ static int mpcore_wdt_ioctl(struct inode *inode, struct file *file,
  *     System shutdown handler.  Turn off the watchdog if we're
  *     restarting or halting the system.
  */
-static void mpcore_wdt_shutdown(struct device *_dev)
+static void mpcore_wdt_shutdown(struct platform_device *dev)
 {
-       struct mpcore_wdt *wdt = dev_get_drvdata(_dev);
+       struct mpcore_wdt *wdt = platform_get_drvdata(dev);
 
        if (system_state == SYSTEM_RESTART || system_state == SYSTEM_HALT)
                mpcore_wdt_stop(wdt);
@@ -317,9 +317,8 @@ static struct miscdevice mpcore_wdt_miscdev = {
        .fops           = &mpcore_wdt_fops,
 };
 
-static int __devinit mpcore_wdt_probe(struct device *_dev)
+static int __devinit mpcore_wdt_probe(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(_dev);
        struct mpcore_wdt *wdt;
        struct resource *res;
        int ret;
@@ -364,7 +363,7 @@ static int __devinit mpcore_wdt_probe(struct device *_dev)
        }
 
        mpcore_wdt_stop(wdt);
-       dev_set_drvdata(&dev->dev, wdt);
+       platform_set_drvdata(&dev->dev, wdt);
        mpcore_wdt_dev = dev;
 
        return 0;
@@ -379,11 +378,11 @@ static int __devinit mpcore_wdt_probe(struct device *_dev)
        return ret;
 }
 
-static int __devexit mpcore_wdt_remove(struct device *dev)
+static int __devexit mpcore_wdt_remove(struct platform_device *dev)
 {
-       struct mpcore_wdt *wdt = dev_get_drvdata(dev);
+       struct mpcore_wdt *wdt = platform_get_drvdata(dev);
 
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(dev, NULL);
 
        misc_deregister(&mpcore_wdt_miscdev);
 
@@ -395,13 +394,14 @@ static int __devexit mpcore_wdt_remove(struct device *dev)
        return 0;
 }
 
-static struct device_driver mpcore_wdt_driver = {
-       .owner          = THIS_MODULE,
-       .name           = "mpcore_wdt",
-       .bus            = &platform_bus_type,
+static struct platform_driver mpcore_wdt_driver = {
        .probe          = mpcore_wdt_probe,
        .remove         = __devexit_p(mpcore_wdt_remove),
        .shutdown       = mpcore_wdt_shutdown,
+       .driver         = {
+               .owner  = THIS_MODULE,
+               .name   = "mpcore_wdt",
+       },
 };
 
 static char banner[] __initdata = KERN_INFO "MPcore Watchdog Timer: 0.1. mpcore_noboot=%d mpcore_margin=%d sec (nowayout= %d)\n";
@@ -420,12 +420,12 @@ static int __init mpcore_wdt_init(void)
 
        printk(banner, mpcore_noboot, mpcore_margin, nowayout);
 
-       return driver_register(&mpcore_wdt_driver);
+       return platform_driver_register(&mpcore_wdt_driver);
 }
 
 static void __exit mpcore_wdt_exit(void)
 {
-       driver_unregister(&mpcore_wdt_driver);
+       platform_driver_unregister(&mpcore_wdt_driver);
 }
 
 module_init(mpcore_wdt_init);
index 119b3c541d9510077e14598409bf7c8ac3cc261f..00d9ef04a3697dde00f1d2121c526c33f4ec0c5e 100644 (file)
@@ -182,10 +182,9 @@ static struct miscdevice mv64x60_wdt_miscdev = {
        .fops = &mv64x60_wdt_fops,
 };
 
-static int __devinit mv64x60_wdt_probe(struct device *dev)
+static int __devinit mv64x60_wdt_probe(struct platform_device *dev)
 {
-       struct platform_device *pd = to_platform_device(dev);
-       struct mv64x60_wdt_pdata *pdata = pd->dev.platform_data;
+       struct mv64x60_wdt_pdata *pdata = dev->dev.platform_data;
        int bus_clk = 133;
 
        mv64x60_wdt_timeout = 10;
@@ -202,7 +201,7 @@ static int __devinit mv64x60_wdt_probe(struct device *dev)
        return misc_register(&mv64x60_wdt_miscdev);
 }
 
-static int __devexit mv64x60_wdt_remove(struct device *dev)
+static int __devexit mv64x60_wdt_remove(struct platform_device *dev)
 {
        misc_deregister(&mv64x60_wdt_miscdev);
 
@@ -212,12 +211,13 @@ static int __devexit mv64x60_wdt_remove(struct device *dev)
        return 0;
 }
 
-static struct device_driver mv64x60_wdt_driver = {
-       .owner = THIS_MODULE,
-       .name = MV64x60_WDT_NAME,
-       .bus = &platform_bus_type,
+static struct platform_driver mv64x60_wdt_driver = {
        .probe = mv64x60_wdt_probe,
        .remove = __devexit_p(mv64x60_wdt_remove),
+       .driver = {
+               .owner = THIS_MODULE,
+               .name = MV64x60_WDT_NAME,
+       },
 };
 
 static struct platform_device *mv64x60_wdt_dev;
@@ -235,14 +235,14 @@ static int __init mv64x60_wdt_init(void)
                goto out;
        }
 
-       ret = driver_register(&mv64x60_wdt_driver);
+       ret = platform_driver_register(&mv64x60_wdt_driver);
       out:
        return ret;
 }
 
 static void __exit mv64x60_wdt_exit(void)
 {
-       driver_unregister(&mv64x60_wdt_driver);
+       platform_driver_unregister(&mv64x60_wdt_driver);
        platform_device_unregister(mv64x60_wdt_dev);
 }
 
index 751cb77b0715531803d85010e5a09529f55d124c..eb667daee19b6de487c28a2563ce42b2dc44935a 100644 (file)
@@ -347,15 +347,14 @@ static irqreturn_t s3c2410wdt_irq(int irqno, void *param,
 }
 /* device interface */
 
-static int s3c2410wdt_probe(struct device *dev)
+static int s3c2410wdt_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        struct resource *res;
        int started = 0;
        int ret;
        int size;
 
-       DBG("%s: probe=%p, device=%p\n", __FUNCTION__, pdev, dev);
+       DBG("%s: probe=%p\n", __FUNCTION__, pdev);
 
        /* get the memory region for the watchdog timer */
 
@@ -386,13 +385,13 @@ static int s3c2410wdt_probe(struct device *dev)
                return -ENOENT;
        }
 
-       ret = request_irq(res->start, s3c2410wdt_irq, 0, pdev->name, dev);
+       ret = request_irq(res->start, s3c2410wdt_irq, 0, pdev->name, pdev);
        if (ret != 0) {
                printk(KERN_INFO PFX "failed to install irq (%d)\n", ret);
                return ret;
        }
 
-       wdt_clock = clk_get(dev, "watchdog");
+       wdt_clock = clk_get(&pdev->dev, "watchdog");
        if (wdt_clock == NULL) {
                printk(KERN_INFO PFX "failed to find watchdog clock source\n");
                return -ENOENT;
@@ -430,7 +429,7 @@ static int s3c2410wdt_probe(struct device *dev)
        return 0;
 }
 
-static int s3c2410wdt_remove(struct device *dev)
+static int s3c2410wdt_remove(struct platform_device *dev)
 {
        if (wdt_mem != NULL) {
                release_resource(wdt_mem);
@@ -454,7 +453,7 @@ static int s3c2410wdt_remove(struct device *dev)
        return 0;
 }
 
-static void s3c2410wdt_shutdown(struct device *dev)
+static void s3c2410wdt_shutdown(struct platform_device *dev)
 {
        s3c2410wdt_stop();      
 }
@@ -464,7 +463,7 @@ static void s3c2410wdt_shutdown(struct device *dev)
 static unsigned long wtcon_save;
 static unsigned long wtdat_save;
 
-static int s3c2410wdt_suspend(struct device *dev, pm_message_t state)
+static int s3c2410wdt_suspend(struct platform_device *dev, pm_message_t state)
 {
        /* Save watchdog state, and turn it off. */
        wtcon_save = readl(wdt_base + S3C2410_WTCON);
@@ -476,7 +475,7 @@ static int s3c2410wdt_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int s3c2410wdt_resume(struct device *dev)
+static int s3c2410wdt_resume(struct platform_device *dev)
 {
        /* Restore watchdog state. */
 
@@ -496,15 +495,16 @@ static int s3c2410wdt_resume(struct device *dev)
 #endif /* CONFIG_PM */
 
 
-static struct device_driver s3c2410wdt_driver = {
-       .owner          = THIS_MODULE,
-       .name           = "s3c2410-wdt",
-       .bus            = &platform_bus_type,
+static struct platform_driver s3c2410wdt_driver = {
        .probe          = s3c2410wdt_probe,
        .remove         = s3c2410wdt_remove,
        .shutdown       = s3c2410wdt_shutdown,
        .suspend        = s3c2410wdt_suspend,
        .resume         = s3c2410wdt_resume,
+       .driver         = {
+               .owner  = THIS_MODULE,
+               .name   = "s3c2410-wdt",
+       },
 };
 
 
@@ -513,12 +513,12 @@ static char banner[] __initdata = KERN_INFO "S3C2410 Watchdog Timer, (c) 2004 Si
 static int __init watchdog_init(void)
 {
        printk(banner);
-       return driver_register(&s3c2410wdt_driver);
+       return platform_driver_register(&s3c2410wdt_driver);
 }
 
 static void __exit watchdog_exit(void)
 {
-       driver_unregister(&s3c2410wdt_driver);
+       platform_driver_unregister(&s3c2410wdt_driver);
 }
 
 module_init(watchdog_init);
index 1e5dfc7805e289acf2063f95774bf387e6ab4876..c81bd4bce1b8648b69b7e730f5c2c414be5d85bf 100644 (file)
 
 #define HDAPS_POLL_PERIOD      (HZ/20) /* poll for input every 1/20s */
 #define HDAPS_INPUT_FUZZ       4       /* input event threshold */
+#define HDAPS_INPUT_FLAT       4
 
 static struct timer_list hdaps_timer;
 static struct platform_device *pdev;
+static struct input_dev *hdaps_idev;
 static unsigned int hdaps_invert;
 static u8 km_activity;
 static int rest_x;
@@ -284,7 +286,7 @@ out:
 
 /* Device model stuff */
 
-static int hdaps_probe(struct device *dev)
+static int hdaps_probe(struct platform_device *dev)
 {
        int ret;
 
@@ -296,29 +298,18 @@ static int hdaps_probe(struct device *dev)
        return 0;
 }
 
-static int hdaps_resume(struct device *dev)
+static int hdaps_resume(struct platform_device *dev)
 {
        return hdaps_device_init();
 }
 
-static struct device_driver hdaps_driver = {
-       .name = "hdaps",
-       .bus = &platform_bus_type,
-       .owner = THIS_MODULE,
+static struct platform_driver hdaps_driver = {
        .probe = hdaps_probe,
-       .resume = hdaps_resume
-};
-
-/* Input class stuff */
-
-static struct input_dev hdaps_idev = {
-       .name = "hdaps",
-       .evbit = { BIT(EV_ABS) },
-       .absbit = { BIT(ABS_X) | BIT(ABS_Y) },
-       .absmin  = { [ABS_X] = -256, [ABS_Y] = -256 },
-       .absmax  = { [ABS_X] = 256, [ABS_Y] = 256 },
-       .absfuzz = { [ABS_X] = HDAPS_INPUT_FUZZ, [ABS_Y] = HDAPS_INPUT_FUZZ },
-       .absflat = { [ABS_X] = HDAPS_INPUT_FUZZ, [ABS_Y] = HDAPS_INPUT_FUZZ },
+       .resume = hdaps_resume,
+       .driver = {
+               .name = "hdaps",
+               .owner = THIS_MODULE,
+       },
 };
 
 /*
@@ -342,9 +333,9 @@ static void hdaps_mousedev_poll(unsigned long unused)
        if (__hdaps_read_pair(HDAPS_PORT_XPOS, HDAPS_PORT_YPOS, &x, &y))
                goto out;
 
-       input_report_abs(&hdaps_idev, ABS_X, x - rest_x);
-       input_report_abs(&hdaps_idev, ABS_Y, y - rest_y);
-       input_sync(&hdaps_idev);
+       input_report_abs(hdaps_idev, ABS_X, x - rest_x);
+       input_report_abs(hdaps_idev, ABS_Y, y - rest_y);
+       input_sync(hdaps_idev);
 
        mod_timer(&hdaps_timer, jiffies + HDAPS_POLL_PERIOD);
 
@@ -550,7 +541,7 @@ static int __init hdaps_init(void)
                goto out;
        }
 
-       ret = driver_register(&hdaps_driver);
+       ret = platform_driver_register(&hdaps_driver);
        if (ret)
                goto out_region;
 
@@ -564,12 +555,25 @@ static int __init hdaps_init(void)
        if (ret)
                goto out_device;
 
+       hdaps_idev = input_allocate_device();
+       if (!hdaps_idev) {
+               ret = -ENOMEM;
+               goto out_group;
+       }
+
        /* initial calibrate for the input device */
        hdaps_calibrate();
 
        /* initialize the input class */
-       hdaps_idev.dev = &pdev->dev;
-       input_register_device(&hdaps_idev);
+       hdaps_idev->name = "hdaps";
+       hdaps_idev->cdev.dev = &pdev->dev;
+       hdaps_idev->evbit[0] = BIT(EV_ABS);
+       input_set_abs_params(hdaps_idev, ABS_X,
+                       -256, 256, HDAPS_INPUT_FUZZ, HDAPS_INPUT_FLAT);
+       input_set_abs_params(hdaps_idev, ABS_X,
+                       -256, 256, HDAPS_INPUT_FUZZ, HDAPS_INPUT_FLAT);
+
+       input_register_device(hdaps_idev);
 
        /* start up our timer for the input device */
        init_timer(&hdaps_timer);
@@ -580,10 +584,12 @@ static int __init hdaps_init(void)
        printk(KERN_INFO "hdaps: driver successfully loaded.\n");
        return 0;
 
+out_group:
+       sysfs_remove_group(&pdev->dev.kobj, &hdaps_attribute_group);
 out_device:
        platform_device_unregister(pdev);
 out_driver:
-       driver_unregister(&hdaps_driver);
+       platform_driver_unregister(&hdaps_driver);
 out_region:
        release_region(HDAPS_LOW_PORT, HDAPS_NR_PORTS);
 out:
@@ -594,10 +600,10 @@ out:
 static void __exit hdaps_exit(void)
 {
        del_timer_sync(&hdaps_timer);
-       input_unregister_device(&hdaps_idev);
+       input_unregister_device(hdaps_idev);
        sysfs_remove_group(&pdev->dev.kobj, &hdaps_attribute_group);
        platform_device_unregister(pdev);
-       driver_unregister(&hdaps_driver);
+       platform_driver_unregister(&hdaps_driver);
        release_region(HDAPS_LOW_PORT, HDAPS_NR_PORTS);
 
        printk(KERN_INFO "hdaps: driver unloaded.\n");
index cfae4ad00faee2bb6ca81b1ed34a7c71f1c66126..1414851a17b8ee1ea13df7124060dec12522055b 100644 (file)
@@ -405,10 +405,9 @@ static struct i2c_algorithm iop3xx_i2c_algo = {
 };
 
 static int 
-iop3xx_i2c_remove(struct device *device)
+iop3xx_i2c_remove(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(device);
-       struct i2c_adapter *padapter = dev_get_drvdata(&pdev->dev);
+       struct i2c_adapter *padapter = platform_get_drvdata(pdev);
        struct i2c_algo_iop3xx_data *adapter_data = 
                (struct i2c_algo_iop3xx_data *)padapter->algo_data;
        struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -426,15 +425,14 @@ iop3xx_i2c_remove(struct device *device)
        kfree(adapter_data);
        kfree(padapter);
 
-       dev_set_drvdata(&pdev->dev, NULL);
+       platform_set_drvdata(pdev, NULL);
 
        return 0;
 }
 
 static int 
-iop3xx_i2c_probe(struct device *dev)
+iop3xx_i2c_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        struct resource *res;
        int ret;
        struct i2c_adapter *new_adapter;
@@ -499,7 +497,7 @@ iop3xx_i2c_probe(struct device *dev)
        iop3xx_i2c_set_slave_addr(adapter_data);
        iop3xx_i2c_enable(adapter_data);
 
-       dev_set_drvdata(&pdev->dev, new_adapter);
+       platform_set_drvdata(pdev, new_adapter);
        new_adapter->algo_data = adapter_data;
 
        i2c_add_adapter(new_adapter);
@@ -523,24 +521,25 @@ out:
 }
 
 
-static struct device_driver iop3xx_i2c_driver = {
-       .owner          = THIS_MODULE,
-       .name           = "IOP3xx-I2C",
-       .bus            = &platform_bus_type,
+static struct platform_driver iop3xx_i2c_driver = {
        .probe          = iop3xx_i2c_probe,
-       .remove         = iop3xx_i2c_remove
+       .remove         = iop3xx_i2c_remove,
+       .driver         = {
+               .owner  = THIS_MODULE,
+               .name   = "IOP3xx-I2C",
+       },
 };
 
 static int __init 
 i2c_iop3xx_init (void)
 {
-       return driver_register(&iop3xx_i2c_driver);
+       return platform_driver_register(&iop3xx_i2c_driver);
 }
 
 static void __exit 
 i2c_iop3xx_exit (void)
 {
-       driver_unregister(&iop3xx_i2c_driver);
+       platform_driver_unregister(&iop3xx_i2c_driver);
        return;
 }
 
index 64552a376f2d000291690abe8d4d4d685a768daf..cef024a7d048eaf63b79765700228dbf4fe9f3dd 100644 (file)
@@ -86,12 +86,11 @@ struct ixp2000_i2c_data {
        struct i2c_algo_bit_data algo_data;
 };
 
-static int ixp2000_i2c_remove(struct device *dev)
+static int ixp2000_i2c_remove(struct platform_device *plat_dev)
 {
-       struct platform_device *plat_dev = to_platform_device(dev);
-       struct ixp2000_i2c_data *drv_data = dev_get_drvdata(&plat_dev->dev);
+       struct ixp2000_i2c_data *drv_data = platform_get_drvdata(plat_dev);
 
-       dev_set_drvdata(&plat_dev->dev, NULL);
+       platform_set_drvdata(plat_dev, NULL);
 
        i2c_bit_del_bus(&drv_data->adapter);
 
@@ -100,10 +99,9 @@ static int ixp2000_i2c_remove(struct device *dev)
        return 0;
 }
 
-static int ixp2000_i2c_probe(struct device *dev)
+static int ixp2000_i2c_probe(struct platform_device *plat_dev)
 {
        int err;
-       struct platform_device *plat_dev = to_platform_device(dev);
        struct ixp2000_i2c_pins *gpio = plat_dev->dev.platform_data;
        struct ixp2000_i2c_data *drv_data = 
                kzalloc(sizeof(struct ixp2000_i2c_data), GFP_KERNEL);
@@ -139,27 +137,28 @@ static int ixp2000_i2c_probe(struct device *dev)
                return err;
        } 
 
-       dev_set_drvdata(&plat_dev->dev, drv_data);
+       platform_set_drvdata(plat_dev, drv_data);
 
        return 0;
 }
 
-static struct device_driver ixp2000_i2c_driver = {
-       .owner          = THIS_MODULE,
-       .name           = "IXP2000-I2C",
-       .bus            = &platform_bus_type,
+static struct platform_driver ixp2000_i2c_driver = {
        .probe          = ixp2000_i2c_probe,
        .remove         = ixp2000_i2c_remove,
+       .driver         = {
+               .name   = "IXP2000-I2C",
+               .owner  = THIS_MODULE,
+       },
 };
 
 static int __init ixp2000_i2c_init(void)
 {
-       return driver_register(&ixp2000_i2c_driver);
+       return platform_driver_register(&ixp2000_i2c_driver);
 }
 
 static void __exit ixp2000_i2c_exit(void)
 {
-       driver_unregister(&ixp2000_i2c_driver);
+       platform_driver_unregister(&ixp2000_i2c_driver);
 }
 
 module_init(ixp2000_i2c_init);
index cc652c3508149b73ed03ed3ef990c0365efd3fcc..aa36855fa995470b2e52d29bd7d0076f189d5b8c 100644 (file)
@@ -87,12 +87,11 @@ struct ixp4xx_i2c_data {
        struct i2c_algo_bit_data algo_data;
 };
 
-static int ixp4xx_i2c_remove(struct device *dev)
+static int ixp4xx_i2c_remove(struct platform_device *plat_dev)
 {
-       struct platform_device *plat_dev = to_platform_device(dev);
-       struct ixp4xx_i2c_data *drv_data = dev_get_drvdata(&plat_dev->dev);
+       struct ixp4xx_i2c_data *drv_data = platform_get_drvdata(plat_dev);
 
-       dev_set_drvdata(&plat_dev->dev, NULL);
+       platform_set_drvdata(plat_dev, NULL);
 
        i2c_bit_del_bus(&drv_data->adapter);
 
@@ -101,10 +100,9 @@ static int ixp4xx_i2c_remove(struct device *dev)
        return 0;
 }
 
-static int ixp4xx_i2c_probe(struct device *dev)
+static int ixp4xx_i2c_probe(struct platform_device *plat_dev)
 {
        int err;
-       struct platform_device *plat_dev = to_platform_device(dev);
        struct ixp4xx_i2c_pins *gpio = plat_dev->dev.platform_data;
        struct ixp4xx_i2c_data *drv_data = 
                kzalloc(sizeof(struct ixp4xx_i2c_data), GFP_KERNEL);
@@ -148,27 +146,28 @@ static int ixp4xx_i2c_probe(struct device *dev)
                return err;
        }
 
-       dev_set_drvdata(&plat_dev->dev, drv_data);
+       platform_set_drvdata(plat_dev, drv_data);
 
        return 0;
 }
 
-static struct device_driver ixp4xx_i2c_driver = {
-       .owner          = THIS_MODULE,
-       .name           = "IXP4XX-I2C",
-       .bus            = &platform_bus_type,
+static struct platform_driver ixp4xx_i2c_driver = {
        .probe          = ixp4xx_i2c_probe,
        .remove         = ixp4xx_i2c_remove,
+       .driver         = {
+               .name   = "IXP4XX-I2C",
+               .owner  = THIS_MODULE,
+       },
 };
 
 static int __init ixp4xx_i2c_init(void)
 {
-       return driver_register(&ixp4xx_i2c_driver);
+       return platform_driver_register(&ixp4xx_i2c_driver);
 }
 
 static void __exit ixp4xx_i2c_exit(void)
 {
-       driver_unregister(&ixp4xx_i2c_driver);
+       platform_driver_unregister(&ixp4xx_i2c_driver);
 }
 
 module_init(ixp4xx_i2c_init);
index 65b939a059e9b6fd803cacc7699533b3fd58b559..5ccd338a9dc98f19c273bcc81e3e758e0ab85594 100644 (file)
@@ -288,11 +288,10 @@ static struct i2c_adapter mpc_ops = {
        .retries = 1
 };
 
-static int fsl_i2c_probe(struct device *device)
+static int fsl_i2c_probe(struct platform_device *pdev)
 {
        int result = 0;
        struct mpc_i2c *i2c;
-       struct platform_device *pdev = to_platform_device(device);
        struct fsl_i2c_platform_data *pdata;
        struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 
@@ -323,7 +322,7 @@ static int fsl_i2c_probe(struct device *device)
                }
 
        mpc_i2c_setclock(i2c);
-       dev_set_drvdata(device, i2c);
+       platform_set_drvdata(pdev, i2c);
 
        i2c->adap = mpc_ops;
        i2c_set_adapdata(&i2c->adap, i2c);
@@ -345,12 +344,12 @@ static int fsl_i2c_probe(struct device *device)
        return result;
 };
 
-static int fsl_i2c_remove(struct device *device)
+static int fsl_i2c_remove(struct platform_device *pdev)
 {
-       struct mpc_i2c *i2c = dev_get_drvdata(device);
+       struct mpc_i2c *i2c = platform_get_drvdata(pdev);
 
        i2c_del_adapter(&i2c->adap);
-       dev_set_drvdata(device, NULL);
+       platform_set_drvdata(pdev, NULL);
 
        if (i2c->irq != 0)
                free_irq(i2c->irq, i2c);
@@ -361,22 +360,23 @@ static int fsl_i2c_remove(struct device *device)
 };
 
 /* Structure for a device driver */
-static struct device_driver fsl_i2c_driver = {
-       .owner = THIS_MODULE,
-       .name = "fsl-i2c",
-       .bus = &platform_bus_type,
+static struct platform_driver fsl_i2c_driver = {
        .probe = fsl_i2c_probe,
        .remove = fsl_i2c_remove,
+       .driver = {
+               .owner = THIS_MODULE,
+               .name = "fsl-i2c",
+       },
 };
 
 static int __init fsl_i2c_init(void)
 {
-       return driver_register(&fsl_i2c_driver);
+       return platform_driver_register(&fsl_i2c_driver);
 }
 
 static void __exit fsl_i2c_exit(void)
 {
-       driver_unregister(&fsl_i2c_driver);
+       platform_driver_unregister(&fsl_i2c_driver);
 }
 
 module_init(fsl_i2c_init);
index 6b48027b2ee340b9cdab8624c03f7c029abea6b2..afd7634e5cc9f1bf68a2ae358f689cad2c55fd09 100644 (file)
@@ -492,11 +492,10 @@ mv64xxx_i2c_unmap_regs(struct mv64xxx_i2c_data *drv_data)
 }
 
 static int __devinit
-mv64xxx_i2c_probe(struct device *dev)
+mv64xxx_i2c_probe(struct platform_device *pd)
 {
-       struct platform_device          *pd = to_platform_device(dev);
        struct mv64xxx_i2c_data         *drv_data;
-       struct mv64xxx_i2c_pdata        *pdata = dev->platform_data;
+       struct mv64xxx_i2c_pdata        *pdata = pd->dev.platform_data;
        int     rc;
 
        if ((pd->id != 0) || !pdata)
@@ -526,7 +525,7 @@ mv64xxx_i2c_probe(struct device *dev)
        drv_data->adapter.class = I2C_CLASS_HWMON;
        drv_data->adapter.timeout = pdata->timeout;
        drv_data->adapter.retries = pdata->retries;
-       dev_set_drvdata(dev, drv_data);
+       platform_set_drvdata(pd, drv_data);
        i2c_set_adapdata(&drv_data->adapter, drv_data);
 
        if (request_irq(drv_data->irq, mv64xxx_i2c_intr, 0,
@@ -555,9 +554,9 @@ mv64xxx_i2c_probe(struct device *dev)
 }
 
 static int __devexit
-mv64xxx_i2c_remove(struct device *dev)
+mv64xxx_i2c_remove(struct platform_device *dev)
 {
-       struct mv64xxx_i2c_data         *drv_data = dev_get_drvdata(dev);
+       struct mv64xxx_i2c_data         *drv_data = platform_get_drvdata(dev);
        int     rc;
 
        rc = i2c_del_adapter(&drv_data->adapter);
@@ -568,24 +567,25 @@ mv64xxx_i2c_remove(struct device *dev)
        return rc;
 }
 
-static struct device_driver mv64xxx_i2c_driver = {
-       .owner  = THIS_MODULE,
-       .name   = MV64XXX_I2C_CTLR_NAME,
-       .bus    = &platform_bus_type,
+static struct platform_driver mv64xxx_i2c_driver = {
        .probe  = mv64xxx_i2c_probe,
        .remove = mv64xxx_i2c_remove,
+       .driver = {
+               .owner  = THIS_MODULE,
+               .name   = MV64XXX_I2C_CTLR_NAME,
+       },
 };
 
 static int __init
 mv64xxx_i2c_init(void)
 {
-       return driver_register(&mv64xxx_i2c_driver);
+       return platform_driver_register(&mv64xxx_i2c_driver);
 }
 
 static void __exit
 mv64xxx_i2c_exit(void)
 {
-       driver_unregister(&mv64xxx_i2c_driver);
+       platform_driver_unregister(&mv64xxx_i2c_driver);
 }
 
 module_init(mv64xxx_i2c_init);
index 67ccbea24ba4b54d546f794b385798d5e193d4a1..70f7ab829d36f5dee4db91bfd5a8ed80a41d944e 100644 (file)
@@ -936,10 +936,10 @@ static struct pxa_i2c i2c_pxa = {
        },
 };
 
-static int i2c_pxa_probe(struct device *dev)
+static int i2c_pxa_probe(struct platform_device *dev)
 {
        struct pxa_i2c *i2c = &i2c_pxa;
-       struct i2c_pxa_platform_data *plat = dev->platform_data;
+       struct i2c_pxa_platform_data *plat = dev->dev.platform_data;
        int ret;
 
 #ifdef CONFIG_PXA27x
@@ -968,7 +968,7 @@ static int i2c_pxa_probe(struct device *dev)
        i2c_pxa_reset(i2c);
 
        i2c->adap.algo_data = i2c;
-       i2c->adap.dev.parent = dev;
+       i2c->adap.dev.parent = &dev->dev;
 
        ret = i2c_add_adapter(&i2c->adap);
        if (ret < 0) {
@@ -976,7 +976,7 @@ static int i2c_pxa_probe(struct device *dev)
                goto err_irq;
        }
 
-       dev_set_drvdata(dev, i2c);
+       platform_set_drvdata(dev, i2c);
 
 #ifdef CONFIG_I2C_PXA_SLAVE
        printk(KERN_INFO "I2C: %s: PXA I2C adapter, slave address %d\n",
@@ -993,11 +993,11 @@ static int i2c_pxa_probe(struct device *dev)
        return ret;
 }
 
-static int i2c_pxa_remove(struct device *dev)
+static int i2c_pxa_remove(struct platform_device *dev)
 {
-       struct pxa_i2c *i2c = dev_get_drvdata(dev);
+       struct pxa_i2c *i2c = platform_get_drvdata(dev);
 
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(dev, NULL);
 
        i2c_del_adapter(&i2c->adap);
        free_irq(IRQ_I2C, i2c);
@@ -1006,21 +1006,22 @@ static int i2c_pxa_remove(struct device *dev)
        return 0;
 }
 
-static struct device_driver i2c_pxa_driver = {
-       .name           = "pxa2xx-i2c",
-       .bus            = &platform_bus_type,
+static struct platform_driver i2c_pxa_driver = {
        .probe          = i2c_pxa_probe,
        .remove         = i2c_pxa_remove,
+       .driver         = {
+               .name   = "pxa2xx-i2c",
+       },
 };
 
 static int __init i2c_adap_pxa_init(void)
 {
-       return driver_register(&i2c_pxa_driver);
+       return platform_driver_register(&i2c_pxa_driver);
 }
 
 static void i2c_adap_pxa_exit(void)
 {
-       return driver_unregister(&i2c_pxa_driver);
+       return platform_driver_unregister(&i2c_pxa_driver);
 }
 
 module_init(i2c_adap_pxa_init);
index 1b582262e677ed89ce68b9277e927d4f61046948..58cfd3111ef62fac86eadd283b437018995bd4b4 100644 (file)
@@ -760,24 +760,23 @@ static void s3c24xx_i2c_free(struct s3c24xx_i2c *i2c)
  * called by the bus driver when a suitable device is found
 */
 
-static int s3c24xx_i2c_probe(struct device *dev)
+static int s3c24xx_i2c_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        struct s3c24xx_i2c *i2c = &s3c24xx_i2c;
        struct resource *res;
        int ret;
 
        /* find the clock and enable it */
 
-       i2c->dev = dev;
-       i2c->clk = clk_get(dev, "i2c");
+       i2c->dev = &pdev->dev;
+       i2c->clk = clk_get(&pdev->dev, "i2c");
        if (IS_ERR(i2c->clk)) {
-               dev_err(dev, "cannot get clock\n");
+               dev_err(&pdev->dev, "cannot get clock\n");
                ret = -ENOENT;
                goto out;
        }
 
-       dev_dbg(dev, "clock source %p\n", i2c->clk);
+       dev_dbg(&pdev->dev, "clock source %p\n", i2c->clk);
 
        clk_use(i2c->clk);
        clk_enable(i2c->clk);
@@ -786,7 +785,7 @@ static int s3c24xx_i2c_probe(struct device *dev)
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (res == NULL) {
-               dev_err(dev, "cannot find IO resource\n");
+               dev_err(&pdev->dev, "cannot find IO resource\n");
                ret = -ENOENT;
                goto out;
        }
@@ -795,7 +794,7 @@ static int s3c24xx_i2c_probe(struct device *dev)
                                         pdev->name);
 
        if (i2c->ioarea == NULL) {
-               dev_err(dev, "cannot request IO\n");
+               dev_err(&pdev->dev, "cannot request IO\n");
                ret = -ENXIO;
                goto out;
        }
@@ -803,17 +802,17 @@ static int s3c24xx_i2c_probe(struct device *dev)
        i2c->regs = ioremap(res->start, (res->end-res->start)+1);
 
        if (i2c->regs == NULL) {
-               dev_err(dev, "cannot map IO\n");
+               dev_err(&pdev->dev, "cannot map IO\n");
                ret = -ENXIO;
                goto out;
        }
 
-       dev_dbg(dev, "registers %p (%p, %p)\n", i2c->regs, i2c->ioarea, res);
+       dev_dbg(&pdev->dev, "registers %p (%p, %p)\n", i2c->regs, i2c->ioarea, res);
 
        /* setup info block for the i2c core */
 
        i2c->adap.algo_data = i2c;
-       i2c->adap.dev.parent = dev;
+       i2c->adap.dev.parent = &pdev->dev;
 
        /* initialise the i2c controller */
 
@@ -827,7 +826,7 @@ static int s3c24xx_i2c_probe(struct device *dev)
 
        res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
        if (res == NULL) {
-               dev_err(dev, "cannot find IRQ\n");
+               dev_err(&pdev->dev, "cannot find IRQ\n");
                ret = -ENOENT;
                goto out;
        }
@@ -836,23 +835,23 @@ static int s3c24xx_i2c_probe(struct device *dev)
                          pdev->name, i2c);
 
        if (ret != 0) {
-               dev_err(dev, "cannot claim IRQ\n");
+               dev_err(&pdev->dev, "cannot claim IRQ\n");
                goto out;
        }
 
        i2c->irq = res;
                
-       dev_dbg(dev, "irq resource %p (%ld)\n", res, res->start);
+       dev_dbg(&pdev->dev, "irq resource %p (%ld)\n", res, res->start);
 
        ret = i2c_add_adapter(&i2c->adap);
        if (ret < 0) {
-               dev_err(dev, "failed to add bus to i2c core\n");
+               dev_err(&pdev->dev, "failed to add bus to i2c core\n");
                goto out;
        }
 
-       dev_set_drvdata(dev, i2c);
+       platform_set_drvdata(pdev, i2c);
 
-       dev_info(dev, "%s: S3C I2C adapter\n", i2c->adap.dev.bus_id);
+       dev_info(&pdev->dev, "%s: S3C I2C adapter\n", i2c->adap.dev.bus_id);
 
  out:
        if (ret < 0)
@@ -866,22 +865,22 @@ static int s3c24xx_i2c_probe(struct device *dev)
  * called when device is removed from the bus
 */
 
-static int s3c24xx_i2c_remove(struct device *dev)
+static int s3c24xx_i2c_remove(struct platform_device *pdev)
 {
-       struct s3c24xx_i2c *i2c = dev_get_drvdata(dev);
+       struct s3c24xx_i2c *i2c = platform_get_drvdata(pdev);
        
        if (i2c != NULL) {
                s3c24xx_i2c_free(i2c);
-               dev_set_drvdata(dev, NULL);
+               platform_set_drvdata(pdev, NULL);
        }
 
        return 0;
 }
 
 #ifdef CONFIG_PM
-static int s3c24xx_i2c_resume(struct device *dev)
+static int s3c24xx_i2c_resume(struct platform_device *dev)
 {
-       struct s3c24xx_i2c *i2c = dev_get_drvdata(dev);
+       struct s3c24xx_i2c *i2c = platform_get_drvdata(dev);
 
        if (i2c != NULL)
                s3c24xx_i2c_init(i2c);
@@ -895,33 +894,35 @@ static int s3c24xx_i2c_resume(struct device *dev)
 
 /* device driver for platform bus bits */
 
-static struct device_driver s3c2410_i2c_driver = {
-       .owner          = THIS_MODULE,
-       .name           = "s3c2410-i2c",
-       .bus            = &platform_bus_type,
+static struct platform_driver s3c2410_i2c_driver = {
        .probe          = s3c24xx_i2c_probe,
        .remove         = s3c24xx_i2c_remove,
        .resume         = s3c24xx_i2c_resume,
+       .driver         = {
+               .owner  = THIS_MODULE,
+               .name   = "s3c2410-i2c",
+       },
 };
 
-static struct device_driver s3c2440_i2c_driver = {
-       .owner          = THIS_MODULE,
-       .name           = "s3c2440-i2c",
-       .bus            = &platform_bus_type,
+static struct platform_driver s3c2440_i2c_driver = {
        .probe          = s3c24xx_i2c_probe,
        .remove         = s3c24xx_i2c_remove,
        .resume         = s3c24xx_i2c_resume,
+       .driver         = {
+               .owner  = THIS_MODULE,
+               .name   = "s3c2440-i2c",
+       },
 };
 
 static int __init i2c_adap_s3c_init(void)
 {
        int ret;
 
-       ret = driver_register(&s3c2410_i2c_driver);
+       ret = platform_driver_register(&s3c2410_i2c_driver);
        if (ret == 0) {
-               ret = driver_register(&s3c2440_i2c_driver);
+               ret = platform_driver_register(&s3c2440_i2c_driver);
                if (ret)
-                       driver_unregister(&s3c2410_i2c_driver);
+                       platform_driver_unregister(&s3c2410_i2c_driver);
        }
 
        return ret;
@@ -929,8 +930,8 @@ static int __init i2c_adap_s3c_init(void)
 
 static void __exit i2c_adap_s3c_exit(void)
 {
-       driver_unregister(&s3c2410_i2c_driver);
-       driver_unregister(&s3c2440_i2c_driver);
+       platform_driver_unregister(&s3c2410_i2c_driver);
+       platform_driver_unregister(&s3c2440_i2c_driver);
 }
 
 module_init(i2c_adap_s3c_init);
index 9dbb72fffbe2520fdcc47d220cb272adf4a81be4..d2a100d778392239a281591d7f1d8c8019aa197d 100644 (file)
@@ -873,26 +873,27 @@ static int otg_init(struct isp1301 *isp)
        return 0;
 }
 
-static int otg_probe(struct device *dev)
+static int otg_probe(struct platform_device *dev)
 {
        // struct omap_usb_config *config = dev->platform_data;
 
-       otg_dev = to_platform_device(dev);
+       otg_dev = dev;
        return 0;
 }
 
-static int otg_remove(struct device *dev)
+static int otg_remove(struct platform_device *dev)
 {
        otg_dev = 0;
        return 0;
 }
 
-struct device_driver omap_otg_driver = {
-       .owner          = THIS_MODULE,
-       .name           = "omap_otg",
-       .bus            = &platform_bus_type,
+struct platform_driver omap_otg_driver = {
        .probe          = otg_probe,
-       .remove         = otg_remove,   
+       .remove         = otg_remove,
+       .driver         = {
+               .owner  = THIS_MODULE,
+               .name   = "omap_otg",
+       },
 };
 
 static int otg_bind(struct isp1301 *isp)
@@ -902,7 +903,7 @@ static int otg_bind(struct isp1301 *isp)
        if (otg_dev)
                return -EBUSY;
 
-       status = driver_register(&omap_otg_driver);
+       status = platform_driver_register(&omap_otg_driver);
        if (status < 0)
                return status;
 
@@ -913,7 +914,7 @@ static int otg_bind(struct isp1301 *isp)
                status = -ENODEV;
 
        if (status < 0)
-               driver_unregister(&omap_otg_driver);
+               platform_driver_unregister(&omap_otg_driver);
        return status;
 }
 
index d00d14bb637a70b9a49125fa308413efd14eca60..64672d491222a99e62f48849f9b7c3139e72a06e 100644 (file)
@@ -259,17 +259,17 @@ static void corgikbd_hinge_timer(unsigned long data)
 }
 
 #ifdef CONFIG_PM
-static int corgikbd_suspend(struct device *dev, pm_message_t state)
+static int corgikbd_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct corgikbd *corgikbd = dev_get_drvdata(dev);
+       struct corgikbd *corgikbd = platform_get_drvdata(dev);
        corgikbd->suspended = 1;
 
        return 0;
 }
 
-static int corgikbd_resume(struct device *dev)
+static int corgikbd_resume(struct platform_device *dev)
 {
-       struct corgikbd *corgikbd = dev_get_drvdata(dev);
+       struct corgikbd *corgikbd = platform_get_drvdata(dev);
 
        /* Upon resume, ignore the suspend key for a short while */
        corgikbd->suspend_jiffies=jiffies;
@@ -282,7 +282,7 @@ static int corgikbd_resume(struct device *dev)
 #define corgikbd_resume                NULL
 #endif
 
-static int __init corgikbd_probe(struct device *dev)
+static int __init corgikbd_probe(struct platform_device *pdev)
 {
        struct corgikbd *corgikbd;
        struct input_dev *input_dev;
@@ -296,7 +296,7 @@ static int __init corgikbd_probe(struct device *dev)
                return -ENOMEM;
        }
 
-       dev_set_drvdata(dev, corgikbd);
+       platform_set_drvdata(pdev, corgikbd);
 
        corgikbd->input = input_dev;
        spin_lock_init(&corgikbd->lock);
@@ -321,7 +321,7 @@ static int __init corgikbd_probe(struct device *dev)
        input_dev->id.vendor = 0x0001;
        input_dev->id.product = 0x0001;
        input_dev->id.version = 0x0100;
-       input_dev->cdev.dev = dev;
+       input_dev->cdev.dev = &pdev->dev;
        input_dev->private = corgikbd;
 
        input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP) | BIT(EV_PWR) | BIT(EV_SW);
@@ -356,10 +356,10 @@ static int __init corgikbd_probe(struct device *dev)
        return 0;
 }
 
-static int corgikbd_remove(struct device *dev)
+static int corgikbd_remove(struct platform_device *pdev)
 {
        int i;
-       struct corgikbd *corgikbd = dev_get_drvdata(dev);
+       struct corgikbd *corgikbd = platform_get_drvdata(pdev);
 
        for (i = 0; i < CORGI_KEY_SENSE_NUM; i++)
                free_irq(CORGI_IRQ_GPIO_KEY_SENSE(i), corgikbd);
@@ -374,23 +374,24 @@ static int corgikbd_remove(struct device *dev)
        return 0;
 }
 
-static struct device_driver corgikbd_driver = {
-       .name           = "corgi-keyboard",
-       .bus            = &platform_bus_type,
+static struct platform_driver corgikbd_driver = {
        .probe          = corgikbd_probe,
        .remove         = corgikbd_remove,
        .suspend        = corgikbd_suspend,
        .resume         = corgikbd_resume,
+       .driver         = {
+               .name   = "corgi-keyboard",
+       },
 };
 
 static int __devinit corgikbd_init(void)
 {
-       return driver_register(&corgikbd_driver);
+       return platform_driver_register(&corgikbd_driver);
 }
 
 static void __exit corgikbd_exit(void)
 {
-       driver_unregister(&corgikbd_driver);
+       platform_driver_unregister(&corgikbd_driver);
 }
 
 module_init(corgikbd_init);
index 0fa38a559cdfedc0815a4d91f521f111b08fd86d..6a15fe3bc527071e683fa12c0eb4944a4a6e5251 100644 (file)
@@ -309,10 +309,10 @@ static void spitzkbd_hinge_timer(unsigned long data)
 }
 
 #ifdef CONFIG_PM
-static int spitzkbd_suspend(struct device *dev, pm_message_t state)
+static int spitzkbd_suspend(struct platform_device *dev, pm_message_t state)
 {
        int i;
-       struct spitzkbd *spitzkbd = dev_get_drvdata(dev);
+       struct spitzkbd *spitzkbd = platform_get_drvdata(dev);
        spitzkbd->suspended = 1;
 
        /* Set Strobe lines as inputs - *except* strobe line 0 leave this
@@ -323,10 +323,10 @@ static int spitzkbd_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int spitzkbd_resume(struct device *dev)
+static int spitzkbd_resume(struct platform_device *dev)
 {
        int i;
-       struct spitzkbd *spitzkbd = dev_get_drvdata(dev);
+       struct spitzkbd *spitzkbd = platform_get_drvdata(dev);
 
        for (i = 0; i < SPITZ_KEY_STROBE_NUM; i++)
                pxa_gpio_mode(spitz_strobes[i] | GPIO_OUT | GPIO_DFLT_HIGH);
@@ -342,7 +342,7 @@ static int spitzkbd_resume(struct device *dev)
 #define spitzkbd_resume                NULL
 #endif
 
-static int __init spitzkbd_probe(struct device *dev)
+static int __init spitzkbd_probe(struct platform_device *dev)
 {
        struct spitzkbd *spitzkbd;
        struct input_dev *input_dev;
@@ -358,7 +358,7 @@ static int __init spitzkbd_probe(struct device *dev)
                return -ENOMEM;
        }
 
-       dev_set_drvdata(dev, spitzkbd);
+       platform_set_drvdata(dev, spitzkbd);
        strcpy(spitzkbd->phys, "spitzkbd/input0");
 
        spin_lock_init(&spitzkbd->lock);
@@ -380,7 +380,7 @@ static int __init spitzkbd_probe(struct device *dev)
        input_dev->private = spitzkbd;
        input_dev->name = "Spitz Keyboard";
        input_dev->phys = spitzkbd->phys;
-       input_dev->cdev.dev = dev;
+       input_dev->cdev.dev = &dev->dev;
 
        input_dev->id.bustype = BUS_HOST;
        input_dev->id.vendor = 0x0001;
@@ -437,10 +437,10 @@ static int __init spitzkbd_probe(struct device *dev)
        return 0;
 }
 
-static int spitzkbd_remove(struct device *dev)
+static int spitzkbd_remove(struct platform_device *dev)
 {
        int i;
-       struct spitzkbd *spitzkbd = dev_get_drvdata(dev);
+       struct spitzkbd *spitzkbd = platform_get_drvdata(dev);
 
        for (i = 0; i < SPITZ_KEY_SENSE_NUM; i++)
                free_irq(IRQ_GPIO(spitz_senses[i]), spitzkbd);
@@ -460,23 +460,24 @@ static int spitzkbd_remove(struct device *dev)
        return 0;
 }
 
-static struct device_driver spitzkbd_driver = {
-       .name           = "spitz-keyboard",
-       .bus            = &platform_bus_type,
+static struct platform_driver spitzkbd_driver = {
        .probe          = spitzkbd_probe,
        .remove         = spitzkbd_remove,
        .suspend        = spitzkbd_suspend,
        .resume         = spitzkbd_resume,
+       .driver         = {
+               .name   = "spitz-keyboard",
+       },
 };
 
 static int __devinit spitzkbd_init(void)
 {
-       return driver_register(&spitzkbd_driver);
+       return platform_driver_register(&spitzkbd_driver);
 }
 
 static void __exit spitzkbd_exit(void)
 {
-       driver_unregister(&spitzkbd_driver);
+       platform_driver_unregister(&spitzkbd_driver);
 }
 
 module_init(spitzkbd_init);
index 01e186422021d3a5c594f5b59a376543b817b2e5..ac86c1d1d83e4a24bffdc6bcaa94ab66cffc75c9 100644 (file)
@@ -912,7 +912,7 @@ static long i8042_panic_blink(long count)
  * Here we try to restore the original BIOS settings
  */
 
-static int i8042_suspend(struct device *dev, pm_message_t state)
+static int i8042_suspend(struct platform_device *dev, pm_message_t state)
 {
        del_timer_sync(&i8042_timer);
        i8042_controller_reset();
@@ -925,7 +925,7 @@ static int i8042_suspend(struct device *dev, pm_message_t state)
  * Here we try to reset everything back to a state in which suspended
  */
 
-static int i8042_resume(struct device *dev)
+static int i8042_resume(struct platform_device *dev)
 {
        int i;
 
@@ -964,17 +964,18 @@ static int i8042_resume(struct device *dev)
  * because otherwise BIOSes will be confused.
  */
 
-static void i8042_shutdown(struct device *dev)
+static void i8042_shutdown(struct platform_device *dev)
 {
        i8042_controller_cleanup();
 }
 
-static struct device_driver i8042_driver = {
-       .name           = "i8042",
-       .bus            = &platform_bus_type,
+static struct platform_driver i8042_driver = {
        .suspend        = i8042_suspend,
        .resume         = i8042_resume,
        .shutdown       = i8042_shutdown,
+       .driver         = {
+               .name   = "i8042",
+       },
 };
 
 static int __init i8042_create_kbd_port(void)
@@ -1078,7 +1079,7 @@ static int __init i8042_init(void)
                goto err_platform_exit;
        }
 
-       err = driver_register(&i8042_driver);
+       err = platform_driver_register(&i8042_driver);
        if (err)
                goto err_controller_cleanup;
 
@@ -1126,7 +1127,7 @@ static int __init i8042_init(void)
  err_unregister_device:
        platform_device_unregister(i8042_platform_device);
  err_unregister_driver:
-       driver_unregister(&i8042_driver);
+       platform_driver_unregister(&i8042_driver);
  err_controller_cleanup:
        i8042_controller_cleanup();
  err_platform_exit:
@@ -1148,7 +1149,7 @@ static void __exit i8042_exit(void)
        del_timer_sync(&i8042_timer);
 
        platform_device_unregister(i8042_platform_device);
-       driver_unregister(&i8042_driver);
+       platform_driver_unregister(&i8042_driver);
 
        i8042_platform_exit();
 
index 52c49258f8a4e4dc447dd5a98d89182e38d2b395..a3bd11589bc3a0371f421b621432a277c78fd43a 100644 (file)
@@ -107,7 +107,7 @@ static void rpckbd_close(struct serio *port)
  * Allocate and initialize serio structure for subsequent registration
  * with serio core.
  */
-static int __devinit rpckbd_probe(struct device *dev)
+static int __devinit rpckbd_probe(struct platform_device *dev)
 {
        struct serio *serio;
 
@@ -120,37 +120,38 @@ static int __devinit rpckbd_probe(struct device *dev)
        serio->write            = rpckbd_write;
        serio->open             = rpckbd_open;
        serio->close            = rpckbd_close;
-       serio->dev.parent       = dev;
+       serio->dev.parent       = &dev->dev;
        strlcpy(serio->name, "RiscPC PS/2 kbd port", sizeof(serio->name));
        strlcpy(serio->phys, "rpckbd/serio0", sizeof(serio->phys));
 
-       dev_set_drvdata(dev, serio);
+       platform_set_drvdata(dev, serio);
        serio_register_port(serio);
        return 0;
 }
 
-static int __devexit rpckbd_remove(struct device *dev)
+static int __devexit rpckbd_remove(struct platform_device *dev)
 {
-       struct serio *serio = dev_get_drvdata(dev);
+       struct serio *serio = platform_get_drvdata(dev);
        serio_unregister_port(serio);
        return 0;
 }
 
-static struct device_driver rpckbd_driver = {
-       .name           = "kart",
-       .bus            = &platform_bus_type,
+static struct platform_driver rpckbd_driver = {
        .probe          = rpckbd_probe,
        .remove         = __devexit_p(rpckbd_remove),
+       .driver         = {
+               .name   = "kart",
+       },
 };
 
 static int __init rpckbd_init(void)
 {
-       return driver_register(&rpckbd_driver);
+       return platform_driver_register(&rpckbd_driver);
 }
 
 static void __exit rpckbd_exit(void)
 {
-       driver_unregister(&rpckbd_driver);
+       platform_driver_unregister(&rpckbd_driver);
 }
 
 module_init(rpckbd_init);
index 15e88eeae8d6daf1cacd4216080cffbc7b09f258..1042987856f7227012be466649e8336fd3b062c8 100644 (file)
@@ -231,9 +231,9 @@ static irqreturn_t ts_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 }
 
 #ifdef CONFIG_PM
-static int corgits_suspend(struct device *dev, pm_message_t state)
+static int corgits_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct corgi_ts *corgi_ts = dev_get_drvdata(dev);
+       struct corgi_ts *corgi_ts = platform_get_drvdata(dev);
 
        if (corgi_ts->pendown) {
                del_timer_sync(&corgi_ts->timer);
@@ -248,9 +248,9 @@ static int corgits_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int corgits_resume(struct device *dev)
+static int corgits_resume(struct platform_device *dev)
 {
-       struct corgi_ts *corgi_ts = dev_get_drvdata(dev);
+       struct corgi_ts *corgi_ts = platform_get_drvdata(dev);
 
        corgi_ssp_ads7846_putget((4u << ADSCTRL_ADR_SH) | ADSCTRL_STS);
        /* Enable Falling Edge */
@@ -264,10 +264,9 @@ static int corgits_resume(struct device *dev)
 #define corgits_resume         NULL
 #endif
 
-static int __init corgits_probe(struct device *dev)
+static int __init corgits_probe(struct platform_device *pdev)
 {
        struct corgi_ts *corgi_ts;
-       struct platform_device *pdev = to_platform_device(dev);
        struct input_dev *input_dev;
        int err = -ENOMEM;
 
@@ -276,9 +275,9 @@ static int __init corgits_probe(struct device *dev)
        if (!corgi_ts || !input_dev)
                goto fail;
 
-       dev_set_drvdata(dev, corgi_ts);
+       platform_set_drvdata(pdev, corgi_ts);
 
-       corgi_ts->machinfo = dev->platform_data;
+       corgi_ts->machinfo = pdev->dev.platform_data;
        corgi_ts->irq_gpio = platform_get_irq(pdev, 0);
 
        if (corgi_ts->irq_gpio < 0) {
@@ -298,7 +297,7 @@ static int __init corgits_probe(struct device *dev)
        input_dev->id.vendor = 0x0001;
        input_dev->id.product = 0x0002;
        input_dev->id.version = 0x0100;
-       input_dev->cdev.dev = dev;
+       input_dev->cdev.dev = &pdev->dev;
        input_dev->private = corgi_ts;
 
        input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
@@ -339,9 +338,9 @@ static int __init corgits_probe(struct device *dev)
 
 }
 
-static int corgits_remove(struct device *dev)
+static int corgits_remove(struct platform_device *pdev)
 {
-       struct corgi_ts *corgi_ts = dev_get_drvdata(dev);
+       struct corgi_ts *corgi_ts = platform_get_drvdata(pdev);
 
        free_irq(corgi_ts->irq_gpio, NULL);
        del_timer_sync(&corgi_ts->timer);
@@ -351,23 +350,24 @@ static int corgits_remove(struct device *dev)
        return 0;
 }
 
-static struct device_driver corgits_driver = {
-       .name           = "corgi-ts",
-       .bus            = &platform_bus_type,
+static struct platform_driver corgits_driver = {
        .probe          = corgits_probe,
        .remove         = corgits_remove,
        .suspend        = corgits_suspend,
        .resume         = corgits_resume,
+       .driver         = {
+               .name   = "corgi-ts",
+       },
 };
 
 static int __devinit corgits_init(void)
 {
-       return driver_register(&corgits_driver);
+       return platform_driver_register(&corgits_driver);
 }
 
 static void __exit corgits_exit(void)
 {
-       driver_unregister(&corgits_driver);
+       platform_driver_unregister(&corgits_driver);
 }
 
 module_init(corgits_init);
index 7daa0ed7331cd9a46ee537f1939af2bf464e2b0e..1eab7cffceaa10180b79df6cd404f5146f81a189 100644 (file)
@@ -138,9 +138,8 @@ static struct mcp_ops mcp_sa11x0 = {
        .disable                = mcp_sa11x0_disable,
 };
 
-static int mcp_sa11x0_probe(struct device *dev)
+static int mcp_sa11x0_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        struct mcp_plat_data *data = pdev->dev.platform_data;
        struct mcp *mcp;
        int ret;
@@ -165,7 +164,7 @@ static int mcp_sa11x0_probe(struct device *dev)
        mcp->dma_telco_rd       = DMA_Ser4MCP1Rd;
        mcp->dma_telco_wr       = DMA_Ser4MCP1Wr;
 
-       dev_set_drvdata(dev, mcp);
+       platform_set_drvdata(pdev, mcp);
 
        if (machine_is_assabet()) {
                ASSABET_BCR_set(ASSABET_BCR_CODEC_RST);
@@ -202,26 +201,26 @@ static int mcp_sa11x0_probe(struct device *dev)
 
  release:
        release_mem_region(0x80060000, 0x60);
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(pdev, NULL);
 
  out:
        return ret;
 }
 
-static int mcp_sa11x0_remove(struct device *dev)
+static int mcp_sa11x0_remove(struct platform_device *dev)
 {
-       struct mcp *mcp = dev_get_drvdata(dev);
+       struct mcp *mcp = platform_get_drvdata(dev);
 
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(dev, NULL);
        mcp_host_unregister(mcp);
        release_mem_region(0x80060000, 0x60);
 
        return 0;
 }
 
-static int mcp_sa11x0_suspend(struct device *dev, pm_message_t state)
+static int mcp_sa11x0_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct mcp *mcp = dev_get_drvdata(dev);
+       struct mcp *mcp = platform_get_drvdata(dev);
 
        priv(mcp)->mccr0 = Ser4MCCR0;
        priv(mcp)->mccr1 = Ser4MCCR1;
@@ -230,9 +229,9 @@ static int mcp_sa11x0_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int mcp_sa11x0_resume(struct device *dev)
+static int mcp_sa11x0_resume(struct platform_device *dev)
 {
-       struct mcp *mcp = dev_get_drvdata(dev);
+       struct mcp *mcp = platform_get_drvdata(dev);
 
        Ser4MCCR1 = priv(mcp)->mccr1;
        Ser4MCCR0 = priv(mcp)->mccr0;
@@ -243,13 +242,14 @@ static int mcp_sa11x0_resume(struct device *dev)
 /*
  * The driver for the SA11x0 MCP port.
  */
-static struct device_driver mcp_sa11x0_driver = {
-       .name           = "sa11x0-mcp",
-       .bus            = &platform_bus_type,
+static struct platform_driver mcp_sa11x0_driver = {
        .probe          = mcp_sa11x0_probe,
        .remove         = mcp_sa11x0_remove,
        .suspend        = mcp_sa11x0_suspend,
        .resume         = mcp_sa11x0_resume,
+       .driver         = {
+               .name   = "sa11x0-mcp",
+       },
 };
 
 /*
@@ -257,12 +257,12 @@ static struct device_driver mcp_sa11x0_driver = {
  */
 static int __init mcp_sa11x0_init(void)
 {
-       return driver_register(&mcp_sa11x0_driver);
+       return platform_driver_register(&mcp_sa11x0_driver);
 }
 
 static void __exit mcp_sa11x0_exit(void)
 {
-       driver_unregister(&mcp_sa11x0_driver);
+       platform_driver_unregister(&mcp_sa11x0_driver);
 }
 
 module_init(mcp_sa11x0_init);
index bc2b72b3290547dce8a0a0214f542e105bdeac73..11a801be71c88f9b39cd04c41336fdf1c25d6ee0 100644 (file)
@@ -26,8 +26,8 @@
 
 #define SKY_CPUSTATE_VERSION           "1.1"
 
-static int hdpu_cpustate_probe(struct device *ddev);
-static int hdpu_cpustate_remove(struct device *ddev);
+static int hdpu_cpustate_probe(struct platform_device *pdev);
+static int hdpu_cpustate_remove(struct platform_device *pdev);
 
 struct cpustate_t cpustate;
 
@@ -158,11 +158,12 @@ static int cpustate_read_proc(char *page, char **start, off_t off,
        return len;
 }
 
-static struct device_driver hdpu_cpustate_driver = {
-       .name = HDPU_CPUSTATE_NAME,
-       .bus = &platform_bus_type,
+static struct platform_driver hdpu_cpustate_driver = {
        .probe = hdpu_cpustate_probe,
        .remove = hdpu_cpustate_remove,
+       .driver = {
+               .name = HDPU_CPUSTATE_NAME,
+       },
 };
 
 /*
@@ -187,9 +188,8 @@ static struct miscdevice cpustate_dev = {
        &cpustate_fops
 };
 
-static int hdpu_cpustate_probe(struct device *ddev)
+static int hdpu_cpustate_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(ddev);
        struct resource *res;
        struct proc_dir_entry *proc_de;
        int ret;
@@ -217,7 +217,7 @@ static int hdpu_cpustate_probe(struct device *ddev)
        return 0;
 }
 
-static int hdpu_cpustate_remove(struct device *ddev)
+static int hdpu_cpustate_remove(struct platform_device *pdev)
 {
 
        cpustate.set_addr = NULL;
@@ -232,13 +232,13 @@ static int hdpu_cpustate_remove(struct device *ddev)
 static int __init cpustate_init(void)
 {
        int rc;
-       rc = driver_register(&hdpu_cpustate_driver);
+       rc = platform_driver_register(&hdpu_cpustate_driver);
        return rc;
 }
 
 static void __exit cpustate_exit(void)
 {
-       driver_unregister(&hdpu_cpustate_driver);
+       platform_driver_unregister(&hdpu_cpustate_driver);
 }
 
 module_init(cpustate_init);
index 4bb461793851c0d704b8ac320a000571051f10ac..ea9d5f233c83037568350a82224d5870bda6a7ba 100644 (file)
 
 #include <linux/platform_device.h>
 
-static int hdpu_nexus_probe(struct device *ddev);
-static int hdpu_nexus_remove(struct device *ddev);
+static int hdpu_nexus_probe(struct platform_device *pdev);
+static int hdpu_nexus_remove(struct platform_device *pdev);
 
 static struct proc_dir_entry *hdpu_slot_id;
 static struct proc_dir_entry *hdpu_chassis_id;
 static int slot_id = -1;
 static int chassis_id = -1;
 
-static struct device_driver hdpu_nexus_driver = {
-       .name = HDPU_NEXUS_NAME,
-       .bus = &platform_bus_type,
+static struct platform_driver hdpu_nexus_driver = {
        .probe = hdpu_nexus_probe,
        .remove = hdpu_nexus_remove,
+       .driver = {
+               .name = HDPU_NEXUS_NAME,
+       },
 };
 
 int hdpu_slot_id_read(char *buffer, char **buffer_location, off_t offset,
@@ -55,9 +56,8 @@ int hdpu_chassis_id_read(char *buffer, char **buffer_location, off_t offset,
        return sprintf(buffer, "%d\n", chassis_id);
 }
 
-static int hdpu_nexus_probe(struct device *ddev)
+static int hdpu_nexus_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(ddev);
        struct resource *res;
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -80,7 +80,7 @@ static int hdpu_nexus_probe(struct device *ddev)
        return 0;
 }
 
-static int hdpu_nexus_remove(struct device *ddev)
+static int hdpu_nexus_remove(struct platform_device *pdev)
 {
        slot_id = -1;
        chassis_id = -1;
@@ -94,13 +94,13 @@ static int hdpu_nexus_remove(struct device *ddev)
 static int __init nexus_init(void)
 {
        int rc;
-       rc = driver_register(&hdpu_nexus_driver);
+       rc = platform_driver_register(&hdpu_nexus_driver);
        return rc;
 }
 
 static void __exit nexus_exit(void)
 {
-       driver_unregister(&hdpu_nexus_driver);
+       platform_driver_unregister(&hdpu_nexus_driver);
 }
 
 module_init(nexus_init);
index f31e247b2cbeabf479c912ae896453db70278935..ee8f8a0420d1c7d16c164d65746f9c9411141892 100644 (file)
@@ -428,9 +428,8 @@ static irqreturn_t pxamci_detect_irq(int irq, void *devid, struct pt_regs *regs)
        return IRQ_HANDLED;
 }
 
-static int pxamci_probe(struct device *dev)
+static int pxamci_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        struct mmc_host *mmc;
        struct pxamci_host *host = NULL;
        struct resource *r;
@@ -445,7 +444,7 @@ static int pxamci_probe(struct device *dev)
        if (!r)
                return -EBUSY;
 
-       mmc = mmc_alloc_host(sizeof(struct pxamci_host), dev);
+       mmc = mmc_alloc_host(sizeof(struct pxamci_host), &pdev->dev);
        if (!mmc) {
                ret = -ENOMEM;
                goto out;
@@ -474,7 +473,7 @@ static int pxamci_probe(struct device *dev)
                         host->pdata->ocr_mask :
                         MMC_VDD_32_33|MMC_VDD_33_34;
 
-       host->sg_cpu = dma_alloc_coherent(dev, PAGE_SIZE, &host->sg_dma, GFP_KERNEL);
+       host->sg_cpu = dma_alloc_coherent(&pdev->dev, PAGE_SIZE, &host->sg_dma, GFP_KERNEL);
        if (!host->sg_cpu) {
                ret = -ENOMEM;
                goto out;
@@ -511,10 +510,10 @@ static int pxamci_probe(struct device *dev)
        if (ret)
                goto out;
 
-       dev_set_drvdata(dev, mmc);
+       platform_set_drvdata(pdev, mmc);
 
        if (host->pdata && host->pdata->init)
-               host->pdata->init(dev, pxamci_detect_irq, mmc);
+               host->pdata->init(&pdev->dev, pxamci_detect_irq, mmc);
 
        mmc_add_host(mmc);
 
@@ -527,7 +526,7 @@ static int pxamci_probe(struct device *dev)
                if (host->base)
                        iounmap(host->base);
                if (host->sg_cpu)
-                       dma_free_coherent(dev, PAGE_SIZE, host->sg_cpu, host->sg_dma);
+                       dma_free_coherent(&pdev->dev, PAGE_SIZE, host->sg_cpu, host->sg_dma);
        }
        if (mmc)
                mmc_free_host(mmc);
@@ -535,17 +534,17 @@ static int pxamci_probe(struct device *dev)
        return ret;
 }
 
-static int pxamci_remove(struct device *dev)
+static int pxamci_remove(struct platform_device *pdev)
 {
-       struct mmc_host *mmc = dev_get_drvdata(dev);
+       struct mmc_host *mmc = platform_get_drvdata(pdev);
 
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(pdev, NULL);
 
        if (mmc) {
                struct pxamci_host *host = mmc_priv(mmc);
 
                if (host->pdata && host->pdata->exit)
-                       host->pdata->exit(dev, mmc);
+                       host->pdata->exit(&pdev->dev, mmc);
 
                mmc_remove_host(mmc);
 
@@ -560,7 +559,7 @@ static int pxamci_remove(struct device *dev)
                free_irq(host->irq, host);
                pxa_free_dma(host->dma);
                iounmap(host->base);
-               dma_free_coherent(dev, PAGE_SIZE, host->sg_cpu, host->sg_dma);
+               dma_free_coherent(&pdev->dev, PAGE_SIZE, host->sg_cpu, host->sg_dma);
 
                release_resource(host->res);
 
@@ -570,9 +569,9 @@ static int pxamci_remove(struct device *dev)
 }
 
 #ifdef CONFIG_PM
-static int pxamci_suspend(struct device *dev, pm_message_t state)
+static int pxamci_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct mmc_host *mmc = dev_get_drvdata(dev);
+       struct mmc_host *mmc = platform_get_drvdata(dev);
        int ret = 0;
 
        if (mmc)
@@ -581,9 +580,9 @@ static int pxamci_suspend(struct device *dev, pm_message_t state)
        return ret;
 }
 
-static int pxamci_resume(struct device *dev)
+static int pxamci_resume(struct platform_device *dev)
 {
-       struct mmc_host *mmc = dev_get_drvdata(dev);
+       struct mmc_host *mmc = platform_get_drvdata(dev);
        int ret = 0;
 
        if (mmc)
@@ -596,23 +595,24 @@ static int pxamci_resume(struct device *dev)
 #define pxamci_resume  NULL
 #endif
 
-static struct device_driver pxamci_driver = {
-       .name           = DRIVER_NAME,
-       .bus            = &platform_bus_type,
+static struct platform_driver pxamci_driver = {
        .probe          = pxamci_probe,
        .remove         = pxamci_remove,
        .suspend        = pxamci_suspend,
        .resume         = pxamci_resume,
+       .driver         = {
+               .name   = DRIVER_NAME,
+       },
 };
 
 static int __init pxamci_init(void)
 {
-       return driver_register(&pxamci_driver);
+       return platform_driver_register(&pxamci_driver);
 }
 
 static void __exit pxamci_exit(void)
 {
-       driver_unregister(&pxamci_driver);
+       platform_driver_unregister(&pxamci_driver);
 }
 
 module_init(pxamci_init);
index e954b8354fef74f3e7f8d6a9dabdfef7814a9c95..c7eb7c269081860303ce07f95369a29e0f30e2e3 100644 (file)
@@ -42,7 +42,7 @@
 #include "wbsd.h"
 
 #define DRIVER_NAME "wbsd"
-#define DRIVER_VERSION "1.4"
+#define DRIVER_VERSION "1.5"
 
 #ifdef CONFIG_MMC_DEBUG
 #define DBG(x...) \
@@ -1932,14 +1932,14 @@ static void __devexit wbsd_shutdown(struct device* dev, int pnp)
  * Non-PnP
  */
 
-static int __devinit wbsd_probe(struct device* dev)
+static int __devinit wbsd_probe(struct platform_device* dev)
 {
-       return wbsd_init(dev, io, irq, dma, 0);
+       return wbsd_init(&dev->dev, io, irq, dma, 0);
 }
 
-static int __devexit wbsd_remove(struct device* dev)
+static int __devexit wbsd_remove(struct platform_device* dev)
 {
-       wbsd_shutdown(dev, 0);
+       wbsd_shutdown(&dev->dev, 0);
 
        return 0;
 }
@@ -1983,9 +1983,9 @@ static void __devexit wbsd_pnp_remove(struct pnp_dev * dev)
 
 #ifdef CONFIG_PM
 
-static int wbsd_suspend(struct device *dev, pm_message_t state)
+static int wbsd_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct mmc_host *mmc = dev_get_drvdata(dev);
+       struct mmc_host *mmc = platform_get_drvdata(dev);
        struct wbsd_host *host;
        int ret;
 
@@ -2005,9 +2005,9 @@ static int wbsd_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int wbsd_resume(struct device *dev)
+static int wbsd_resume(struct platform_device *dev)
 {
-       struct mmc_host *mmc = dev_get_drvdata(dev);
+       struct mmc_host *mmc = platform_get_drvdata(dev);
        struct wbsd_host *host;
 
        if (!mmc)
@@ -2038,14 +2038,15 @@ static int wbsd_resume(struct device *dev)
 
 static struct platform_device *wbsd_device;
 
-static struct device_driver wbsd_driver = {
-       .name           = DRIVER_NAME,
-       .bus            = &platform_bus_type,
+static struct platform_driver wbsd_driver = {
        .probe          = wbsd_probe,
-       .remove         = wbsd_remove,
+       .remove         = __devexit_p(wbsd_remove),
 
        .suspend        = wbsd_suspend,
        .resume         = wbsd_resume,
+       .driver         = {
+               .name   = DRIVER_NAME,
+       },
 };
 
 #ifdef CONFIG_PNP
@@ -2054,7 +2055,7 @@ static struct pnp_driver wbsd_pnp_driver = {
        .name           = DRIVER_NAME,
        .id_table       = pnp_dev_table,
        .probe          = wbsd_pnp_probe,
-       .remove         = wbsd_pnp_remove,
+       .remove         = __devexit_p(wbsd_pnp_remove),
 };
 
 #endif /* CONFIG_PNP */
@@ -2085,7 +2086,7 @@ static int __init wbsd_drv_init(void)
 
        if (nopnp)
        {
-               result = driver_register(&wbsd_driver);
+               result = platform_driver_register(&wbsd_driver);
                if (result < 0)
                        return result;
 
@@ -2111,7 +2112,7 @@ static void __exit wbsd_drv_exit(void)
        {
                platform_device_unregister(wbsd_device);
 
-               driver_unregister(&wbsd_driver);
+               platform_driver_unregister(&wbsd_driver);
        }
 
        DBG("unloaded\n");
@@ -2127,6 +2128,7 @@ module_param(irq, uint, 0444);
 module_param(dma, int, 0444);
 
 MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Pierre Ossman <drzeus@drzeus.cx>");
 MODULE_DESCRIPTION("Winbond W83L51xD SD/MMC card interface driver");
 MODULE_VERSION(DRIVER_VERSION);
 
index b7858eb935347acb767d2961de8896027b4b1674..51f962dd7e31c42054850e3344326f69acbf2752 100644 (file)
@@ -63,11 +63,6 @@ struct bast_flash_info {
 
 static const char *probes[] = { "RedBoot", "cmdlinepart", NULL };
 
-static struct bast_flash_info *to_bast_info(struct device *dev)
-{
-       return (struct bast_flash_info *)dev_get_drvdata(dev);
-}
-
 static void bast_flash_setrw(int to)
 {
        unsigned int val;
@@ -87,11 +82,11 @@ static void bast_flash_setrw(int to)
        local_irq_restore(flags);
 }
 
-static int bast_flash_remove(struct device *dev)
+static int bast_flash_remove(struct platform_device *pdev)
 {
-       struct bast_flash_info *info = to_bast_info(dev);
+       struct bast_flash_info *info = platform_get_drvdata(pdev);
 
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(pdev, NULL);
 
        if (info == NULL)
                return 0;
@@ -116,9 +111,8 @@ static int bast_flash_remove(struct device *dev)
        return 0;
 }
 
-static int bast_flash_probe(struct device *dev)
+static int bast_flash_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        struct bast_flash_info *info;
        struct resource *res;
        int err = 0;
@@ -131,13 +125,13 @@ static int bast_flash_probe(struct device *dev)
        }
 
        memzero(info, sizeof(*info));
-       dev_set_drvdata(dev, info);
+       platform_set_drvdata(pdev, info);
 
        res = pdev->resource;  /* assume that the flash has one resource */
 
        info->map.phys = res->start;
        info->map.size = res->end - res->start + 1;
-       info->map.name = dev->bus_id;
+       info->map.name = pdev->dev.bus_id;      
        info->map.bankwidth = 2;
 
        if (info->map.size > AREA_MAXSIZE)
@@ -199,27 +193,28 @@ static int bast_flash_probe(struct device *dev)
        /* fall through to exit error */
 
  exit_error:
-       bast_flash_remove(dev);
+       bast_flash_remove(pdev);
        return err;
 }
 
-static struct device_driver bast_flash_driver = {
-       .name           = "bast-nor",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver bast_flash_driver = {
        .probe          = bast_flash_probe,
        .remove         = bast_flash_remove,
+       .driver         = {
+               .name   = "bast-nor",
+               .owner  = THIS_MODULE,
+       },
 };
 
 static int __init bast_flash_init(void)
 {
        printk("BAST NOR-Flash Driver, (c) 2004 Simtec Electronics\n");
-       return driver_register(&bast_flash_driver);
+       return platform_driver_register(&bast_flash_driver);
 }
 
 static void __exit bast_flash_exit(void)
 {
-       driver_unregister(&bast_flash_driver);
+       platform_driver_unregister(&bast_flash_driver);
 }
 
 module_init(bast_flash_init);
index fe738fd8d6f89f068910a82cd636a4bb431eb4c9..a3ba52fbd86835968bc01a3c9ffe053641265d25 100644 (file)
@@ -67,9 +67,8 @@ static void armflash_set_vpp(struct map_info *map, int on)
 
 static const char *probes[] = { "cmdlinepart", "RedBoot", "afs", NULL };
 
-static int armflash_probe(struct device *_dev)
+static int armflash_probe(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(_dev);
        struct flash_platform_data *plat = dev->dev.platform_data;
        struct resource *res = dev->resource;
        unsigned int size = res->end - res->start + 1;
@@ -138,7 +137,7 @@ static int armflash_probe(struct device *_dev)
        }
 
        if (err == 0)
-               dev_set_drvdata(&dev->dev, info);
+               platform_set_drvdata(dev, info);
 
        /*
         * If we got an error, free all resources.
@@ -163,12 +162,11 @@ static int armflash_probe(struct device *_dev)
        return err;
 }
 
-static int armflash_remove(struct device *_dev)
+static int armflash_remove(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(_dev);
-       struct armflash_info *info = dev_get_drvdata(&dev->dev);
+       struct armflash_info *info = platform_get_drvdata(dev);
 
-       dev_set_drvdata(&dev->dev, NULL);
+       platform_set_drvdata(dev, NULL);
 
        if (info) {
                if (info->mtd) {
@@ -190,21 +188,22 @@ static int armflash_remove(struct device *_dev)
        return 0;
 }
 
-static struct device_driver armflash_driver = {
-       .name           = "armflash",
-       .bus            = &platform_bus_type,
+static struct platform_driver armflash_driver = {
        .probe          = armflash_probe,
        .remove         = armflash_remove,
+       .driver         = {
+               .name   = "armflash",
+       },
 };
 
 static int __init armflash_init(void)
 {
-       return driver_register(&armflash_driver);
+       return platform_driver_register(&armflash_driver);
 }
 
 static void __exit armflash_exit(void)
 {
-       driver_unregister(&armflash_driver);
+       platform_driver_unregister(&armflash_driver);
 }
 
 module_init(armflash_init);
index 641eb2b55e9f4733b6cbc1d8ad8ef8e21e05b962..fc7a78e31735bc4ea35f56f9a34480e79aa23101 100644 (file)
@@ -111,13 +111,12 @@ static void ixp2000_flash_copy_to(struct map_info *map, unsigned long to,
 }
 
 
-static int ixp2000_flash_remove(struct device *_dev)
+static int ixp2000_flash_remove(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(_dev);
        struct flash_platform_data *plat = dev->dev.platform_data;
-       struct ixp2000_flash_info *info = dev_get_drvdata(&dev->dev);
+       struct ixp2000_flash_info *info = platform_get_drvdata(dev);
 
-       dev_set_drvdata(&dev->dev, NULL);
+       platform_set_drvdata(dev, NULL);
 
        if(!info)
                return 0;
@@ -143,10 +142,9 @@ static int ixp2000_flash_remove(struct device *_dev)
 }
 
 
-static int ixp2000_flash_probe(struct device *_dev)
+static int ixp2000_flash_probe(struct platform_device *dev)
 {
        static const char *probes[] = { "RedBoot", "cmdlinepart", NULL };
-       struct platform_device *dev = to_platform_device(_dev);
        struct ixp2000_flash_data *ixp_data = dev->dev.platform_data;
        struct flash_platform_data *plat;
        struct ixp2000_flash_info *info;
@@ -177,7 +175,7 @@ static int ixp2000_flash_probe(struct device *_dev)
        }
        memzero(info, sizeof(struct ixp2000_flash_info));
 
-       dev_set_drvdata(&dev->dev, info);
+       platform_set_drvdata(dev, info);
 
        /*
         * Tell the MTD layer we're not 1:1 mapped so that it does
@@ -248,25 +246,26 @@ static int ixp2000_flash_probe(struct device *_dev)
        return 0;
 
 Error:
-       ixp2000_flash_remove(_dev);
+       ixp2000_flash_remove(dev);
        return err;
 }
 
-static struct device_driver ixp2000_flash_driver = {
-       .name           = "IXP2000-Flash",
-       .bus            = &platform_bus_type,
+static struct platform_driver ixp2000_flash_driver = {
        .probe          = &ixp2000_flash_probe,
        .remove         = &ixp2000_flash_remove
+       .driver         = {
+               .name   = "IXP2000-Flash",
+       },
 };
 
 static int __init ixp2000_flash_init(void)
 {
-       return driver_register(&ixp2000_flash_driver);
+       return platform_driver_register(&ixp2000_flash_driver);
 }
 
 static void __exit ixp2000_flash_exit(void)
 {
-       driver_unregister(&ixp2000_flash_driver);
+       platform_driver_unregister(&ixp2000_flash_driver);
 }
 
 module_init(ixp2000_flash_init);
index 56b3a355bf7b83f934a77eeca368b2cdfa25d96c..a59f8027903c5d632975bbb28e23ad91f369b35f 100644 (file)
@@ -99,13 +99,12 @@ struct ixp4xx_flash_info {
 
 static const char *probes[] = { "RedBoot", "cmdlinepart", NULL };
 
-static int ixp4xx_flash_remove(struct device *_dev)
+static int ixp4xx_flash_remove(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(_dev);
        struct flash_platform_data *plat = dev->dev.platform_data;
-       struct ixp4xx_flash_info *info = dev_get_drvdata(&dev->dev);
+       struct ixp4xx_flash_info *info = platform_get_drvdata(dev);
 
-       dev_set_drvdata(&dev->dev, NULL);
+       platform_set_drvdata(dev, NULL);
 
        if(!info)
                return 0;
@@ -130,9 +129,8 @@ static int ixp4xx_flash_remove(struct device *_dev)
        return 0;
 }
 
-static int ixp4xx_flash_probe(struct device *_dev)
+static int ixp4xx_flash_probe(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(_dev);
        struct flash_platform_data *plat = dev->dev.platform_data;
        struct ixp4xx_flash_info *info;
        int err = -1;
@@ -153,7 +151,7 @@ static int ixp4xx_flash_probe(struct device *_dev)
        }
        memzero(info, sizeof(struct ixp4xx_flash_info));
 
-       dev_set_drvdata(&dev->dev, info);
+       platform_set_drvdata(dev, info);
 
        /*
         * Tell the MTD layer we're not 1:1 mapped so that it does
@@ -214,25 +212,26 @@ static int ixp4xx_flash_probe(struct device *_dev)
        return 0;
 
 Error:
-       ixp4xx_flash_remove(_dev);
+       ixp4xx_flash_remove(dev);
        return err;
 }
 
-static struct device_driver ixp4xx_flash_driver = {
-       .name           = "IXP4XX-Flash",
-       .bus            = &platform_bus_type,
+static struct platform_driver ixp4xx_flash_driver = {
        .probe          = ixp4xx_flash_probe,
        .remove         = ixp4xx_flash_remove,
+       .driver         = {
+               .name   = "IXP4XX-Flash",
+       },
 };
 
 static int __init ixp4xx_flash_init(void)
 {
-       return driver_register(&ixp4xx_flash_driver);
+       return platform_driver_register(&ixp4xx_flash_driver);
 }
 
 static void __exit ixp4xx_flash_exit(void)
 {
-       driver_unregister(&ixp4xx_flash_driver);
+       platform_driver_unregister(&ixp4xx_flash_driver);
 }
 
 
index fd3b4a5fc2072653a6f2c919d5c9984004a87a04..418afffb2d8026bd85fea3270895f067a7fca4b0 100644 (file)
@@ -70,11 +70,10 @@ static void omap_set_vpp(struct map_info *map, int enable)
        }
 }
 
-static int __devinit omapflash_probe(struct device *dev)
+static int __devinit omapflash_probe(struct platform_device *pdev)
 {
        int err;
        struct omapflash_info *info;
-       struct platform_device *pdev = to_platform_device(dev);
        struct flash_platform_data *pdata = pdev->dev.platform_data;
        struct resource *res = pdev->resource;
        unsigned long size = res->end - res->start + 1;
@@ -119,7 +118,7 @@ static int __devinit omapflash_probe(struct device *dev)
 #endif
                add_mtd_device(info->mtd);
 
-       dev_set_drvdata(&pdev->dev, info);
+       platform_set_drvdata(pdev, info);
 
        return 0;
 
@@ -133,12 +132,11 @@ out_free_info:
        return err;
 }
 
-static int __devexit omapflash_remove(struct device *dev)
+static int __devexit omapflash_remove(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct omapflash_info *info = dev_get_drvdata(&pdev->dev);
+       struct omapflash_info *info = platform_get_drvdata(pdev);
 
-       dev_set_drvdata(&pdev->dev, NULL);
+       platform_set_drvdata(pdev, NULL);
 
        if (info) {
                if (info->parts) {
@@ -155,21 +153,22 @@ static int __devexit omapflash_remove(struct device *dev)
        return 0;
 }
 
-static struct device_driver omapflash_driver = {
-       .name   = "omapflash",
-       .bus    = &platform_bus_type,
+static struct platform_driver omapflash_driver = {
        .probe  = omapflash_probe,
        .remove = __devexit_p(omapflash_remove),
+       .driver = {
+               .name   = "omapflash",
+       },
 };
 
 static int __init omapflash_init(void)
 {
-       return driver_register(&omapflash_driver);
+       return platform_driver_register(&omapflash_driver);
 }
 
 static void __exit omapflash_exit(void)
 {
-       driver_unregister(&omapflash_driver);
+       platform_driver_unregister(&omapflash_driver);
 }
 
 module_init(omapflash_init);
index a02eed94a231ecbf39686d2db1733b65a3fdfd4c..5d3c75451ca292afb002d6f817f5c7e6bc3c4569 100644 (file)
@@ -56,9 +56,9 @@ struct platram_info {
  * device private data to struct platram_info conversion
 */
 
-static inline struct platram_info *to_platram_info(struct device *dev)
+static inline struct platram_info *to_platram_info(struct platform_device *dev)
 {
-       return (struct platram_info *)dev_get_drvdata(dev);
+       return (struct platram_info *)platform_get_drvdata(dev);
 }
 
 /* platram_setrw
@@ -83,13 +83,13 @@ static inline void platram_setrw(struct platram_info *info, int to)
  * called to remove the device from the driver's control
 */
 
-static int platram_remove(struct device *dev)
+static int platram_remove(struct platform_device *pdev)
 {
-       struct platram_info *info = to_platram_info(dev);
+       struct platram_info *info = to_platram_info(pdev);
 
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(pdev, NULL);
 
-       dev_dbg(dev, "removing device\n");
+       dev_dbg(&pdev->dev, "removing device\n");
 
        if (info == NULL)
                return 0;
@@ -130,61 +130,60 @@ static int platram_remove(struct device *dev)
  * driver is found.
 */
 
-static int platram_probe(struct device *dev)
+static int platram_probe(struct platform_device *pdev)
 {
-       struct platform_device *pd = to_platform_device(dev);
        struct platdata_mtd_ram *pdata;
        struct platram_info *info;
        struct resource *res;
        int err = 0;
 
-       dev_dbg(dev, "probe entered\n");
+       dev_dbg(&pdev->dev, "probe entered\n");
 
-       if (dev->platform_data == NULL) {
-               dev_err(dev, "no platform data supplied\n");
+       if (pdev->dev.platform_data == NULL) {
+               dev_err(&pdev->dev, "no platform data supplied\n");
                err = -ENOENT;
                goto exit_error;
        }
 
-       pdata = dev->platform_data;
+       pdata = pdev->dev.platform_data;
 
        info = kmalloc(sizeof(*info), GFP_KERNEL);
        if (info == NULL) {
-               dev_err(dev, "no memory for flash info\n");
+               dev_err(&pdev->dev, "no memory for flash info\n");
                err = -ENOMEM;
                goto exit_error;
        }
 
        memset(info, 0, sizeof(*info));
-       dev_set_drvdata(dev, info);
+       platform_set_drvdata(pdev, info);
 
-       info->dev = dev;
+       info->dev = &pdev->dev;
        info->pdata = pdata;
 
        /* get the resource for the memory mapping */
 
-       res = platform_get_resource(pd, IORESOURCE_MEM, 0);
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 
        if (res == NULL) {
-               dev_err(dev, "no memory resource specified\n");
+               dev_err(&pdev->dev, "no memory resource specified\n");
                err = -ENOENT;
                goto exit_free;
        }
 
-       dev_dbg(dev, "got platform resource %p (0x%lx)\n", res, res->start);
+       dev_dbg(&pdev->dev, "got platform resource %p (0x%lx)\n", res, res->start);
 
        /* setup map parameters */
 
        info->map.phys = res->start;
        info->map.size = (res->end - res->start) + 1;
-       info->map.name = pdata->mapname != NULL ? pdata->mapname : (char *)pd->name;
+       info->map.name = pdata->mapname != NULL ? pdata->mapname : (char *)pdev->name;
        info->map.bankwidth = pdata->bankwidth;
 
        /* register our usage of the memory area */
 
-       info->area = request_mem_region(res->start, info->map.size, pd->name);
+       info->area = request_mem_region(res->start, info->map.size, pdev->name);
        if (info->area == NULL) {
-               dev_err(dev, "failed to request memory region\n");
+               dev_err(&pdev->dev, "failed to request memory region\n");
                err = -EIO;
                goto exit_free;
        }
@@ -192,23 +191,23 @@ static int platram_probe(struct device *dev)
        /* remap the memory area */
 
        info->map.virt = ioremap(res->start, info->map.size);
-       dev_dbg(dev, "virt %p, %lu bytes\n", info->map.virt, info->map.size);
+       dev_dbg(&pdev->dev, "virt %p, %lu bytes\n", info->map.virt, info->map.size);
 
        if (info->map.virt == NULL) {
-               dev_err(dev, "failed to ioremap() region\n");
+               dev_err(&pdev->dev, "failed to ioremap() region\n");
                err = -EIO;
                goto exit_free;
        }
 
        simple_map_init(&info->map);
 
-       dev_dbg(dev, "initialised map, probing for mtd\n");
+       dev_dbg(&pdev->dev, "initialised map, probing for mtd\n");
 
        /* probe for the right mtd map driver */
 
        info->mtd = do_map_probe("map_ram" , &info->map);
        if (info->mtd == NULL) {
-               dev_err(dev, "failed to probe for map_ram\n");
+               dev_err(&pdev->dev, "failed to probe for map_ram\n");
                err = -ENOMEM;
                goto exit_free;
        }
@@ -237,27 +236,28 @@ static int platram_probe(struct device *dev)
 #endif /* CONFIG_MTD_PARTITIONS */
 
        if (add_mtd_device(info->mtd)) {
-               dev_err(dev, "add_mtd_device() failed\n");
+               dev_err(&pdev->dev, "add_mtd_device() failed\n");
                err = -ENOMEM;
        }
 
-       dev_info(dev, "registered mtd device\n");
+       dev_info(&pdev->dev, "registered mtd device\n");
        return err;
 
  exit_free:
-       platram_remove(dev);
+       platram_remove(pdev);
  exit_error:
        return err;
 }
 
 /* device driver info */
 
-static struct device_driver platram_driver = {
-       .name           = "mtd-ram",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver platram_driver = {
        .probe          = platram_probe,
        .remove         = platram_remove,
+       .driver         = {
+               .name   = "mtd-ram",
+               .owner  = THIS_MODULE,
+       },
 };
 
 /* module init/exit */
@@ -265,12 +265,12 @@ static struct device_driver platram_driver = {
 static int __init platram_init(void)
 {
        printk("Generic platform RAM MTD, (c) 2004 Simtec Electronics\n");
-       return driver_register(&platram_driver);
+       return platform_driver_register(&platram_driver);
 }
 
 static void __exit platram_exit(void)
 {
-       driver_unregister(&platram_driver);
+       platform_driver_unregister(&platram_driver);
 }
 
 module_init(platram_init);
index 9e8bb1782be00318ab3eb58264ccf087e3761c8d..5cefb015633ce896e2a08dc75269c93169496573 100644 (file)
@@ -356,9 +356,8 @@ sa1100_setup_mtd(struct platform_device *pdev, struct flash_platform_data *plat)
 
 static const char *part_probes[] = { "cmdlinepart", "RedBoot", NULL };
 
-static int __init sa1100_mtd_probe(struct device *dev)
+static int __init sa1100_mtd_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        struct flash_platform_data *plat = pdev->dev.platform_data;
        struct mtd_partition *parts;
        const char *part_type = NULL;
@@ -402,28 +401,28 @@ static int __init sa1100_mtd_probe(struct device *dev)
 
        info->nr_parts = nr_parts;
 
-       dev_set_drvdata(dev, info);
+       platform_set_drvdata(pdev, info);
        err = 0;
 
  out:
        return err;
 }
 
-static int __exit sa1100_mtd_remove(struct device *dev)
+static int __exit sa1100_mtd_remove(struct platform_device *pdev)
 {
-       struct sa_info *info = dev_get_drvdata(dev);
-       struct flash_platform_data *plat = dev->platform_data;
+       struct sa_info *info = platform_get_drvdata(pdev);
+       struct flash_platform_data *plat = pdev->dev.platform_data;
 
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(pdev, NULL);
        sa1100_destroy(info, plat);
 
        return 0;
 }
 
 #ifdef CONFIG_PM
-static int sa1100_mtd_suspend(struct device *dev, pm_message_t state)
+static int sa1100_mtd_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct sa_info *info = dev_get_drvdata(dev);
+       struct sa_info *info = platform_get_drvdata(dev);
        int ret = 0;
 
        if (info)
@@ -432,17 +431,17 @@ static int sa1100_mtd_suspend(struct device *dev, pm_message_t state)
        return ret;
 }
 
-static int sa1100_mtd_resume(struct device *dev)
+static int sa1100_mtd_resume(struct platform_device *dev)
 {
-       struct sa_info *info = dev_get_drvdata(dev);
+       struct sa_info *info = platform_get_drvdata(dev);
        if (info)
                info->mtd->resume(info->mtd);
        return 0;
 }
 
-static void sa1100_mtd_shutdown(struct device *dev)
+static void sa1100_mtd_shutdown(struct platform_device *dev)
 {
-       struct sa_info *info = dev_get_drvdata(dev);
+       struct sa_info *info = platform_get_drvdata(dev);
        if (info && info->mtd->suspend(info->mtd) == 0)
                info->mtd->resume(info->mtd);
 }
@@ -452,24 +451,25 @@ static void sa1100_mtd_shutdown(struct device *dev)
 #define sa1100_mtd_shutdown NULL
 #endif
 
-static struct device_driver sa1100_mtd_driver = {
-       .name           = "flash",
-       .bus            = &platform_bus_type,
+static struct platform_driver sa1100_mtd_driver = {
        .probe          = sa1100_mtd_probe,
        .remove         = __exit_p(sa1100_mtd_remove),
        .suspend        = sa1100_mtd_suspend,
        .resume         = sa1100_mtd_resume,
        .shutdown       = sa1100_mtd_shutdown,
+       .driver         = {
+               .name   = "flash",
+       },
 };
 
 static int __init sa1100_mtd_init(void)
 {
-       return driver_register(&sa1100_mtd_driver);
+       return platform_driver_register(&sa1100_mtd_driver);
 }
 
 static void __exit sa1100_mtd_exit(void)
 {
-       driver_unregister(&sa1100_mtd_driver);
+       platform_driver_unregister(&sa1100_mtd_driver);
 }
 
 module_init(sa1100_mtd_init);
index 97e9b7892d29dfce8f5eab6f724b85f9740940ed..d209214b1318b451e9680c629b3db767438c51b0 100644 (file)
@@ -125,14 +125,14 @@ static struct s3c2410_nand_info *s3c2410_nand_mtd_toinfo(struct mtd_info *mtd)
        return s3c2410_nand_mtd_toours(mtd)->info;
 }
 
-static struct s3c2410_nand_info *to_nand_info(struct device *dev)
+static struct s3c2410_nand_info *to_nand_info(struct platform_device *dev)
 {
-       return dev_get_drvdata(dev);
+       return platform_get_drvdata(dev);
 }
 
-static struct s3c2410_platform_nand *to_nand_plat(struct device *dev)
+static struct s3c2410_platform_nand *to_nand_plat(struct platform_device *dev)
 {
-       return dev->platform_data;
+       return dev->dev.platform_data;
 }
 
 /* timing calculations */
@@ -165,9 +165,9 @@ static int s3c2410_nand_calc_rate(int wanted, unsigned long clk, int max)
 /* controller setup */
 
 static int s3c2410_nand_inithw(struct s3c2410_nand_info *info,
-                              struct device *dev)
+                              struct platform_device *pdev)
 {
-       struct s3c2410_platform_nand *plat = to_nand_plat(dev);
+       struct s3c2410_platform_nand *plat = to_nand_plat(pdev);
        unsigned long clkrate = clk_get_rate(info->clk);
        int tacls, twrph0, twrph1;
        unsigned long cfg;
@@ -430,11 +430,11 @@ static void s3c2410_nand_write_buf(struct mtd_info *mtd,
 
 /* device management functions */
 
-static int s3c2410_nand_remove(struct device *dev)
+static int s3c2410_nand_remove(struct platform_device *pdev)
 {
-       struct s3c2410_nand_info *info = to_nand_info(dev);
+       struct s3c2410_nand_info *info = to_nand_info(pdev);
 
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(pdev, NULL);
 
        if (info == NULL)
                return 0;
@@ -562,10 +562,9 @@ static void s3c2410_nand_init_chip(struct s3c2410_nand_info *info,
  * nand layer to look for devices
 */
 
-static int s3c24xx_nand_probe(struct device *dev, int is_s3c2440)
+static int s3c24xx_nand_probe(struct platform_device *pdev, int is_s3c2440)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct s3c2410_platform_nand *plat = to_nand_plat(dev);
+       struct s3c2410_platform_nand *plat = to_nand_plat(pdev);
        struct s3c2410_nand_info *info;
        struct s3c2410_nand_mtd *nmtd;
        struct s3c2410_nand_set *sets;
@@ -575,26 +574,26 @@ static int s3c24xx_nand_probe(struct device *dev, int is_s3c2440)
        int nr_sets;
        int setno;
 
-       pr_debug("s3c2410_nand_probe(%p)\n", dev);
+       pr_debug("s3c2410_nand_probe(%p)\n", pdev);
 
        info = kmalloc(sizeof(*info), GFP_KERNEL);
        if (info == NULL) {
-               dev_err(dev, "no memory for flash info\n");
+               dev_err(&pdev->dev, "no memory for flash info\n");
                err = -ENOMEM;
                goto exit_error;
        }
 
        memzero(info, sizeof(*info));
-       dev_set_drvdata(dev, info);
+       platform_set_drvdata(pdev, info);
 
        spin_lock_init(&info->controller.lock);
        init_waitqueue_head(&info->controller.wq);
 
        /* get the clock source and enable it */
 
-       info->clk = clk_get(dev, "nand");
+       info->clk = clk_get(&pdev->dev, "nand");
        if (IS_ERR(info->clk)) {
-               dev_err(dev, "failed to get clock");
+               dev_err(&pdev->dev, "failed to get clock");
                err = -ENOENT;
                goto exit_error;
        }
@@ -611,27 +610,27 @@ static int s3c24xx_nand_probe(struct device *dev, int is_s3c2440)
        info->area = request_mem_region(res->start, size, pdev->name);
 
        if (info->area == NULL) {
-               dev_err(dev, "cannot reserve register region\n");
+               dev_err(&pdev->dev, "cannot reserve register region\n");
                err = -ENOENT;
                goto exit_error;
        }
 
-       info->device     = dev;
+       info->device     = &pdev->dev;
        info->platform   = plat;
        info->regs       = ioremap(res->start, size);
        info->is_s3c2440 = is_s3c2440;
 
        if (info->regs == NULL) {
-               dev_err(dev, "cannot reserve register region\n");
+               dev_err(&pdev->dev, "cannot reserve register region\n");
                err = -EIO;
                goto exit_error;
        }
 
-       dev_dbg(dev, "mapped registers at %p\n", info->regs);
+       dev_dbg(&pdev->dev, "mapped registers at %p\n", info->regs);
 
        /* initialise the hardware */
 
-       err = s3c2410_nand_inithw(info, dev);
+       err = s3c2410_nand_inithw(info, pdev);
        if (err != 0)
                goto exit_error;
 
@@ -645,7 +644,7 @@ static int s3c24xx_nand_probe(struct device *dev, int is_s3c2440)
        size = nr_sets * sizeof(*info->mtds);
        info->mtds = kmalloc(size, GFP_KERNEL);
        if (info->mtds == NULL) {
-               dev_err(dev, "failed to allocate mtd storage\n");
+               dev_err(&pdev->dev, "failed to allocate mtd storage\n");
                err = -ENOMEM;
                goto exit_error;
        }
@@ -677,7 +676,7 @@ static int s3c24xx_nand_probe(struct device *dev, int is_s3c2440)
        return 0;
 
  exit_error:
-       s3c2410_nand_remove(dev);
+       s3c2410_nand_remove(pdev);
 
        if (err == 0)
                err = -EINVAL;
@@ -686,44 +685,46 @@ static int s3c24xx_nand_probe(struct device *dev, int is_s3c2440)
 
 /* driver device registration */
 
-static int s3c2410_nand_probe(struct device *dev)
+static int s3c2410_nand_probe(struct platform_device *dev)
 {
        return s3c24xx_nand_probe(dev, 0);
 }
 
-static int s3c2440_nand_probe(struct device *dev)
+static int s3c2440_nand_probe(struct platform_device *dev)
 {
        return s3c24xx_nand_probe(dev, 1);
 }
 
-static struct device_driver s3c2410_nand_driver = {
-       .name           = "s3c2410-nand",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver s3c2410_nand_driver = {
        .probe          = s3c2410_nand_probe,
        .remove         = s3c2410_nand_remove,
+       .driver         = {
+               .name   = "s3c2410-nand",
+               .owner  = THIS_MODULE,
+       },
 };
 
-static struct device_driver s3c2440_nand_driver = {
-       .name           = "s3c2440-nand",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver s3c2440_nand_driver = {
        .probe          = s3c2440_nand_probe,
        .remove         = s3c2410_nand_remove,
+       .driver         = {
+               .name   = "s3c2440-nand",
+               .owner  = THIS_MODULE,
+       },
 };
 
 static int __init s3c2410_nand_init(void)
 {
        printk("S3C24XX NAND Driver, (c) 2004 Simtec Electronics\n");
 
-       driver_register(&s3c2440_nand_driver);
-       return driver_register(&s3c2410_nand_driver);
+       platform_driver_register(&s3c2440_nand_driver);
+       return platform_driver_register(&s3c2410_nand_driver);
 }
 
 static void __exit s3c2410_nand_exit(void)
 {
-       driver_unregister(&s3c2440_nand_driver);
-       driver_unregister(&s3c2410_nand_driver);
+       platform_driver_unregister(&s3c2440_nand_driver);
+       platform_driver_unregister(&s3c2410_nand_driver);
 }
 
 module_init(s3c2410_nand_init);
index 0d33a93df96b8a2081ad5e984b14121462cffd76..03804cc38be084f3ecb30a05518e9ea130520ebf 100644 (file)
@@ -398,13 +398,19 @@ static struct mca_driver depca_mca_driver = {
 };
 #endif
 
-static int depca_isa_probe (struct device *);
+static int depca_isa_probe (struct platform_device *);
 
-static struct device_driver depca_isa_driver = {
-       .name   = depca_string,
-       .bus    = &platform_bus_type,
+static int __devexit depca_isa_remove(struct platform_device *pdev)
+{
+       return depca_device_remove(&pdev->dev);
+}
+
+static struct platform_driver depca_isa_driver = {
        .probe  = depca_isa_probe,
-       .remove = __devexit_p(depca_device_remove),
+       .remove = __devexit_p(depca_isa_remove),
+       .driver = {
+               .name   = depca_string,
+       },
 };
        
 /*
@@ -1525,7 +1531,7 @@ static enum depca_type __init depca_shmem_probe (ulong *mem_start)
        return adapter;
 }
 
-static int __init depca_isa_probe (struct device *device)
+static int __init depca_isa_probe (struct platform_device *device)
 {
        struct net_device *dev;
        struct depca_private *lp;
@@ -1533,7 +1539,7 @@ static int __init depca_isa_probe (struct device *device)
        enum depca_type adapter = unknown;
        int status = 0;
 
-       ioaddr = (u_long) device->platform_data;
+       ioaddr = (u_long) device->dev.platform_data;
 
        if ((status = depca_common_init (ioaddr, &dev)))
                goto out;
@@ -1553,7 +1559,7 @@ static int __init depca_isa_probe (struct device *device)
        lp->adapter = adapter;
        lp->mem_start = mem_start;
        
-       if ((status = depca_hw_init(dev, device)))
+       if ((status = depca_hw_init(dev, &device->dev)))
                goto out_free;
        
        return 0;
@@ -2082,7 +2088,7 @@ static int __init depca_module_init (void)
 #ifdef CONFIG_EISA
         err |= eisa_driver_register (&depca_eisa_driver);
 #endif
-       err |= driver_register (&depca_isa_driver);
+       err |= platform_driver_register (&depca_isa_driver);
        depca_platform_probe ();
        
         return err;
@@ -2097,7 +2103,7 @@ static void __exit depca_module_exit (void)
 #ifdef CONFIG_EISA
         eisa_driver_unregister (&depca_eisa_driver);
 #endif
-       driver_unregister (&depca_isa_driver);
+       platform_driver_unregister (&depca_isa_driver);
 
        for (i = 0; depca_io_ports[i].iobase; i++) {
                if (depca_io_ports[i].device) {
index f8c9bcdab68beca268889ad07e005848e597a623..24996da4c1c44f9919b3a6277422c158c0312232 100644 (file)
@@ -148,7 +148,7 @@ typedef struct board_info {
 } board_info_t;
 
 /* function declaration ------------------------------------- */
-static int dm9000_probe(struct device *);
+static int dm9000_probe(struct platform_device *);
 static int dm9000_open(struct net_device *);
 static int dm9000_start_xmit(struct sk_buff *, struct net_device *);
 static int dm9000_stop(struct net_device *);
@@ -378,9 +378,8 @@ dm9000_release_board(struct platform_device *pdev, struct board_info *db)
  * Search DM9000 board, allocate space and register it
  */
 static int
-dm9000_probe(struct device *dev)
+dm9000_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        struct dm9000_plat_data *pdata = pdev->dev.platform_data;
        struct board_info *db;  /* Point a board information structure */
        struct net_device *ndev;
@@ -398,7 +397,7 @@ dm9000_probe(struct device *dev)
        }
 
        SET_MODULE_OWNER(ndev);
-       SET_NETDEV_DEV(ndev, dev);
+       SET_NETDEV_DEV(ndev, &pdev->dev);
 
        PRINTK2("dm9000_probe()");
 
@@ -569,7 +568,7 @@ dm9000_probe(struct device *dev)
                printk("%s: Invalid ethernet MAC address.  Please "
                       "set using ifconfig\n", ndev->name);
 
-       dev_set_drvdata(dev, ndev);
+       platform_set_drvdata(pdev, ndev);
        ret = register_netdev(ndev);
 
        if (ret == 0) {
@@ -1140,9 +1139,9 @@ dm9000_phy_write(struct net_device *dev, int phyaddr_unused, int reg, int value)
 }
 
 static int
-dm9000_drv_suspend(struct device *dev, pm_message_t state)
+dm9000_drv_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct net_device *ndev = dev_get_drvdata(dev);
+       struct net_device *ndev = platform_get_drvdata(dev);
 
        if (ndev) {
                if (netif_running(ndev)) {
@@ -1154,9 +1153,9 @@ dm9000_drv_suspend(struct device *dev, pm_message_t state)
 }
 
 static int
-dm9000_drv_resume(struct device *dev)
+dm9000_drv_resume(struct platform_device *dev)
 {
-       struct net_device *ndev = dev_get_drvdata(dev);
+       struct net_device *ndev = platform_get_drvdata(dev);
        board_info_t *db = (board_info_t *) ndev->priv;
 
        if (ndev) {
@@ -1172,12 +1171,11 @@ dm9000_drv_resume(struct device *dev)
 }
 
 static int
-dm9000_drv_remove(struct device *dev)
+dm9000_drv_remove(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct net_device *ndev = dev_get_drvdata(dev);
+       struct net_device *ndev = platform_get_drvdata(pdev);
 
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(pdev, NULL);
 
        unregister_netdev(ndev);
        dm9000_release_board(pdev, (board_info_t *) ndev->priv);
@@ -1188,13 +1186,14 @@ dm9000_drv_remove(struct device *dev)
        return 0;
 }
 
-static struct device_driver dm9000_driver = {
-       .name    = "dm9000",
-       .bus     = &platform_bus_type,
+static struct platform_driver dm9000_driver = {
        .probe   = dm9000_probe,
        .remove  = dm9000_drv_remove,
        .suspend = dm9000_drv_suspend,
        .resume  = dm9000_drv_resume,
+       .driver = {
+               .name   = "dm9000",
+       },
 };
 
 static int __init
@@ -1202,13 +1201,13 @@ dm9000_init(void)
 {
        printk(KERN_INFO "%s Ethernet Driver\n", CARDNAME);
 
-       return driver_register(&dm9000_driver); /* search board and register */
+       return platform_driver_register(&dm9000_driver);        /* search board and register */
 }
 
 static void __exit
 dm9000_cleanup(void)
 {
-       driver_unregister(&dm9000_driver);
+       platform_driver_unregister(&dm9000_driver);
 }
 
 module_init(dm9000_init);
index 54d294ad6df59f4f8d75b9a0a19958e0bf3493d2..e3a329539f1cc5d14d88fa453359cbac80ff1a47 100644 (file)
@@ -126,8 +126,8 @@ static irqreturn_t gfar_interrupt(int irq, void *dev_id, struct pt_regs *regs);
 static void adjust_link(struct net_device *dev);
 static void init_registers(struct net_device *dev);
 static int init_phy(struct net_device *dev);
-static int gfar_probe(struct device *device);
-static int gfar_remove(struct device *device);
+static int gfar_probe(struct platform_device *pdev);
+static int gfar_remove(struct platform_device *pdev);
 static void free_skb_resources(struct gfar_private *priv);
 static void gfar_set_multi(struct net_device *dev);
 static void gfar_set_hash_for_addr(struct net_device *dev, u8 *addr);
@@ -156,12 +156,11 @@ int gfar_uses_fcb(struct gfar_private *priv)
 
 /* Set up the ethernet device structure, private data,
  * and anything else we need before we start */
-static int gfar_probe(struct device *device)
+static int gfar_probe(struct platform_device *pdev)
 {
        u32 tempval;
        struct net_device *dev = NULL;
        struct gfar_private *priv = NULL;
-       struct platform_device *pdev = to_platform_device(device);
        struct gianfar_platform_data *einfo;
        struct resource *r;
        int idx;
@@ -208,7 +207,7 @@ static int gfar_probe(struct device *device)
 
        spin_lock_init(&priv->lock);
 
-       dev_set_drvdata(device, dev);
+       platform_set_drvdata(pdev, dev);
 
        /* Stop the DMA engine now, in case it was running before */
        /* (The firmware could have used it, and left it running). */
@@ -245,7 +244,7 @@ static int gfar_probe(struct device *device)
        dev->base_addr = (unsigned long) (priv->regs);
 
        SET_MODULE_OWNER(dev);
-       SET_NETDEV_DEV(dev, device);
+       SET_NETDEV_DEV(dev, &pdev->dev);
 
        /* Fill in the dev structure */
        dev->open = gfar_enet_open;
@@ -377,12 +376,12 @@ regs_fail:
        return err;
 }
 
-static int gfar_remove(struct device *device)
+static int gfar_remove(struct platform_device *pdev)
 {
-       struct net_device *dev = dev_get_drvdata(device);
+       struct net_device *dev = platform_get_drvdata(pdev);
        struct gfar_private *priv = netdev_priv(dev);
 
-       dev_set_drvdata(device, NULL);
+       platform_set_drvdata(pdev, NULL);
 
        iounmap((void *) priv->regs);
        free_netdev(dev);
@@ -1861,11 +1860,12 @@ static irqreturn_t gfar_error(int irq, void *dev_id, struct pt_regs *regs)
 }
 
 /* Structure for a device driver */
-static struct device_driver gfar_driver = {
-       .name = "fsl-gianfar",
-       .bus = &platform_bus_type,
+static struct platform_driver gfar_driver = {
        .probe = gfar_probe,
        .remove = gfar_remove,
+       .driver = {
+               .name = "fsl-gianfar",
+       },
 };
 
 static int __init gfar_init(void)
@@ -1875,7 +1875,7 @@ static int __init gfar_init(void)
        if (err)
                return err;
 
-       err = driver_register(&gfar_driver);
+       err = platform_driver_register(&gfar_driver);
 
        if (err)
                gfar_mdio_exit();
@@ -1885,7 +1885,7 @@ static int __init gfar_init(void)
 
 static void __exit gfar_exit(void)
 {
-       driver_unregister(&gfar_driver);
+       platform_driver_unregister(&gfar_driver);
        gfar_mdio_exit();
 }
 
index 76e0b9fb5e96a906c9a5ba915d02407ef3b5414e..63d38fbbd04ecb59e6e42748d162af2c4968e4af 100644 (file)
@@ -291,9 +291,9 @@ static void sa1100_irda_shutdown(struct sa1100_irda *si)
 /*
  * Suspend the IrDA interface.
  */
-static int sa1100_irda_suspend(struct device *_dev, pm_message_t state)
+static int sa1100_irda_suspend(struct platform_device *pdev, pm_message_t state)
 {
-       struct net_device *dev = dev_get_drvdata(_dev);
+       struct net_device *dev = platform_get_drvdata(pdev);
        struct sa1100_irda *si;
 
        if (!dev)
@@ -316,9 +316,9 @@ static int sa1100_irda_suspend(struct device *_dev, pm_message_t state)
 /*
  * Resume the IrDA interface.
  */
-static int sa1100_irda_resume(struct device *_dev)
+static int sa1100_irda_resume(struct platform_device *pdev)
 {
-       struct net_device *dev = dev_get_drvdata(_dev);
+       struct net_device *dev = platform_get_drvdata(pdev);
        struct sa1100_irda *si;
 
        if (!dev)
@@ -886,9 +886,8 @@ static int sa1100_irda_init_iobuf(iobuff_t *io, int size)
        return io->head ? 0 : -ENOMEM;
 }
 
-static int sa1100_irda_probe(struct device *_dev)
+static int sa1100_irda_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(_dev);
        struct net_device *dev;
        struct sa1100_irda *si;
        unsigned int baudrate_mask;
@@ -967,7 +966,7 @@ static int sa1100_irda_probe(struct device *_dev)
 
        err = register_netdev(dev);
        if (err == 0)
-               dev_set_drvdata(&pdev->dev, dev);
+               platform_set_drvdata(pdev, dev);
 
        if (err) {
  err_mem_5:
@@ -985,9 +984,9 @@ static int sa1100_irda_probe(struct device *_dev)
        return err;
 }
 
-static int sa1100_irda_remove(struct device *_dev)
+static int sa1100_irda_remove(struct platform_device *pdev)
 {
-       struct net_device *dev = dev_get_drvdata(_dev);
+       struct net_device *dev = platform_get_drvdata(pdev);
 
        if (dev) {
                struct sa1100_irda *si = dev->priv;
@@ -1004,13 +1003,14 @@ static int sa1100_irda_remove(struct device *_dev)
        return 0;
 }
 
-static struct device_driver sa1100ir_driver = {
-       .name           = "sa11x0-ir",
-       .bus            = &platform_bus_type,
+static struct platform_driver sa1100ir_driver = {
        .probe          = sa1100_irda_probe,
        .remove         = sa1100_irda_remove,
        .suspend        = sa1100_irda_suspend,
        .resume         = sa1100_irda_resume,
+       .driver         = {
+               .name   = "sa11x0-ir",
+       },
 };
 
 static int __init sa1100_irda_init(void)
@@ -1023,12 +1023,12 @@ static int __init sa1100_irda_init(void)
        if (power_level > 3)
                power_level = 3;
 
-       return driver_register(&sa1100ir_driver);
+       return platform_driver_register(&sa1100ir_driver);
 }
 
 static void __exit sa1100_irda_exit(void)
 {
-       driver_unregister(&sa1100ir_driver);
+       platform_driver_unregister(&sa1100ir_driver);
 }
 
 module_init(sa1100_irda_init);
index a1d207f2fa68e0c26f54267539ab169dfd40bff0..ec94ecdb103dcfa508ce105a1b9e2bf805c76317 100644 (file)
@@ -214,14 +214,15 @@ static int  smsc_ircc_probe_transceiver_smsc_ircc_atc(int fir_base);
 
 /* Power Management */
 
-static int smsc_ircc_suspend(struct device *dev, pm_message_t state);
-static int smsc_ircc_resume(struct device *dev);
+static int smsc_ircc_suspend(struct platform_device *dev, pm_message_t state);
+static int smsc_ircc_resume(struct platform_device *dev);
 
-static struct device_driver smsc_ircc_driver = {
-       .name           = SMSC_IRCC2_DRIVER_NAME,
-       .bus            = &platform_bus_type,
+static struct platform_driver smsc_ircc_driver = {
        .suspend        = smsc_ircc_suspend,
        .resume         = smsc_ircc_resume,
+       .driver         = {
+               .name   = SMSC_IRCC2_DRIVER_NAME,
+       },
 };
 
 /* Transceivers for SMSC-ircc */
@@ -346,7 +347,7 @@ static int __init smsc_ircc_init(void)
 
        IRDA_DEBUG(1, "%s\n", __FUNCTION__);
 
-       ret = driver_register(&smsc_ircc_driver);
+       ret = platform_driver_register(&smsc_ircc_driver);
        if (ret) {
                IRDA_ERROR("%s, Can't register driver!\n", driver_name);
                return ret;
@@ -378,7 +379,7 @@ static int __init smsc_ircc_init(void)
        }
 
        if (ret)
-               driver_unregister(&smsc_ircc_driver);
+               platform_driver_unregister(&smsc_ircc_driver);
 
        return ret;
 }
@@ -491,7 +492,7 @@ static int __init smsc_ircc_open(unsigned int fir_base, unsigned int sir_base, u
                err = PTR_ERR(self->pldev);
                goto err_out5;
        }
-       dev_set_drvdata(&self->pldev->dev, self);
+       platform_set_drvdata(self->pldev, self);
 
        IRDA_MESSAGE("IrDA: Registered device %s\n", dev->name);
        dev_count++;
@@ -1685,9 +1686,9 @@ static int smsc_ircc_net_close(struct net_device *dev)
        return 0;
 }
 
-static int smsc_ircc_suspend(struct device *dev, pm_message_t state)
+static int smsc_ircc_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct smsc_ircc_cb *self = dev_get_drvdata(dev);
+       struct smsc_ircc_cb *self = platform_get_drvdata(dev);
 
        if (!self->io.suspended) {
                IRDA_DEBUG(1, "%s, Suspending\n", driver_name);
@@ -1706,9 +1707,9 @@ static int smsc_ircc_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int smsc_ircc_resume(struct device *dev)
+static int smsc_ircc_resume(struct platform_device *dev)
 {
-       struct smsc_ircc_cb *self = dev_get_drvdata(dev);
+       struct smsc_ircc_cb *self = platform_get_drvdata(dev);
 
        if (self->io.suspended) {
                IRDA_DEBUG(1, "%s, Waking up\n", driver_name);
@@ -1788,7 +1789,7 @@ static void __exit smsc_ircc_cleanup(void)
                        smsc_ircc_close(dev_self[i]);
        }
 
-       driver_unregister(&smsc_ircc_driver);
+       platform_driver_unregister(&smsc_ircc_driver);
 }
 
 /*
index 2fb3101cb33e65a0f633a43edfdcf1c160d54fd6..b039bd89ceb953ee88c5150ae1329b1913c12cd2 100644 (file)
@@ -194,7 +194,7 @@ out:
  * Probe for a SONIC ethernet controller on a Mips Jazz board.
  * Actually probing is superfluous but we're paranoid.
  */
-static int __init jazz_sonic_probe(struct device *device)
+static int __init jazz_sonic_probe(struct platform_device *pdev)
 {
        struct net_device *dev;
        struct sonic_local *lp;
@@ -212,8 +212,8 @@ static int __init jazz_sonic_probe(struct device *device)
                return -ENOMEM;
 
        lp = netdev_priv(dev);
-       lp->device = device;
-       SET_NETDEV_DEV(dev, device);
+       lp->device = &pdev->dev;
+       SET_NETDEV_DEV(dev, &pdev->dev);
        SET_MODULE_OWNER(dev);
 
        netdev_boot_setup_check(dev);
@@ -264,9 +264,9 @@ MODULE_PARM_DESC(sonic_debug, "jazzsonic debug level (1-4)");
 
 #include "sonic.c"
 
-static int __devexit jazz_sonic_device_remove (struct device *device)
+static int __devexit jazz_sonic_device_remove (struct platform_device *pdev)
 {
-       struct net_device *dev = device->driver_data;
+       struct net_device *dev = platform_get_drvdata(pdev);
        struct sonic_local* lp = netdev_priv(dev);
 
        unregister_netdev (dev);
@@ -278,18 +278,19 @@ static int __devexit jazz_sonic_device_remove (struct device *device)
        return 0;
 }
 
-static struct device_driver jazz_sonic_driver = {
-       .name   = jazz_sonic_string,
-       .bus    = &platform_bus_type,
+static struct platform_driver jazz_sonic_driver = {
        .probe  = jazz_sonic_probe,
        .remove = __devexit_p(jazz_sonic_device_remove),
+       .driver = {
+               .name   = jazz_sonic_string,
+       },
 };
 
 static int __init jazz_sonic_init_module(void)
 {
        int err;
 
-       if ((err = driver_register(&jazz_sonic_driver))) {
+       if ((err = platform_driver_register(&jazz_sonic_driver))) {
                printk(KERN_ERR "Driver registration failed\n");
                return err;
        }
@@ -313,7 +314,7 @@ out_unregister:
 
 static void __exit jazz_sonic_cleanup_module(void)
 {
-       driver_unregister(&jazz_sonic_driver);
+       platform_driver_unregister(&jazz_sonic_driver);
 
        if (jazz_sonic_device) {
                platform_device_unregister(jazz_sonic_device);
index 9ef4592aca036ded3fdc3118bc2dc88b1888ba87..02d5c6822733440f3c78b8e2b1b6c5f8787707a9 100644 (file)
@@ -525,7 +525,7 @@ int __init mac_nubus_sonic_probe(struct net_device* dev)
        return macsonic_init(dev);
 }
 
-static int __init mac_sonic_probe(struct device *device)
+static int __init mac_sonic_probe(struct platform_device *device)
 {
        struct net_device *dev;
        struct sonic_local *lp;
@@ -537,8 +537,8 @@ static int __init mac_sonic_probe(struct device *device)
                return -ENOMEM;
 
        lp = netdev_priv(dev);
-       lp->device = device;
-       SET_NETDEV_DEV(dev, device);
+       lp->device = &device->dev;
+       SET_NETDEV_DEV(dev, &device->dev);
        SET_MODULE_OWNER(dev);
 
        /* This will catch fatal stuff like -ENOMEM as well as success */
@@ -579,9 +579,9 @@ MODULE_PARM_DESC(sonic_debug, "macsonic debug level (1-4)");
 
 #include "sonic.c"
 
-static int __devexit mac_sonic_device_remove (struct device *device)
+static int __devexit mac_sonic_device_remove (struct platform_device *device)
 {
-       struct net_device *dev = device->driver_data;
+       struct net_device *dev = platform_get_drvdata(device);
        struct sonic_local* lp = netdev_priv(dev);
 
        unregister_netdev (dev);
@@ -592,18 +592,19 @@ static int __devexit mac_sonic_device_remove (struct device *device)
        return 0;
 }
 
-static struct device_driver mac_sonic_driver = {
-       .name   = mac_sonic_string,
-       .bus    = &platform_bus_type,
+static struct platform_driver mac_sonic_driver = {
        .probe  = mac_sonic_probe,
        .remove = __devexit_p(mac_sonic_device_remove),
+       .driver = {
+               .name = mac_sonic_string,
+       },
 };
 
 static int __init mac_sonic_init_module(void)
 {
        int err;
 
-       if ((err = driver_register(&mac_sonic_driver))) {
+       if ((err = platform_driver_register(&mac_sonic_driver))) {
                printk(KERN_ERR "Driver registration failed\n");
                return err;
        }
@@ -628,7 +629,7 @@ out_unregister:
 
 static void __exit mac_sonic_cleanup_module(void)
 {
-       driver_unregister(&mac_sonic_driver);
+       platform_driver_unregister(&mac_sonic_driver);
 
        if (mac_sonic_device) {
                platform_device_unregister(mac_sonic_device);
index 71f2c6705bc32ba018788e0283c76e71871af507..3cb9b3fe0cf144000aa69ae7f11a1778c7608e39 100644 (file)
@@ -1387,9 +1387,8 @@ static void mv643xx_netpoll(struct net_device *netdev)
  * Input :     struct device *
  * Output :    -ENOMEM if failed , 0 if success
  */
-static int mv643xx_eth_probe(struct device *ddev)
+static int mv643xx_eth_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(ddev);
        struct mv643xx_eth_platform_data *pd;
        int port_num = pdev->id;
        struct mv643xx_private *mp;
@@ -1402,7 +1401,7 @@ static int mv643xx_eth_probe(struct device *ddev)
        if (!dev)
                return -ENOMEM;
 
-       dev_set_drvdata(ddev, dev);
+       platform_set_drvdata(pdev, dev);
 
        mp = netdev_priv(dev);
 
@@ -1546,21 +1545,20 @@ out:
        return err;
 }
 
-static int mv643xx_eth_remove(struct device *ddev)
+static int mv643xx_eth_remove(struct platform_device *pdev)
 {
-       struct net_device *dev = dev_get_drvdata(ddev);
+       struct net_device *dev = platform_get_drvdata(pdev);
 
        unregister_netdev(dev);
        flush_scheduled_work();
 
        free_netdev(dev);
-       dev_set_drvdata(ddev, NULL);
+       platform_set_drvdata(pdev, NULL);
        return 0;
 }
 
-static int mv643xx_eth_shared_probe(struct device *ddev)
+static int mv643xx_eth_shared_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(ddev);
        struct resource *res;
 
        printk(KERN_NOTICE "MV-643xx 10/100/1000 Ethernet Driver\n");
@@ -1578,7 +1576,7 @@ static int mv643xx_eth_shared_probe(struct device *ddev)
 
 }
 
-static int mv643xx_eth_shared_remove(struct device *ddev)
+static int mv643xx_eth_shared_remove(struct platform_device *pdev)
 {
        iounmap(mv643xx_eth_shared_base);
        mv643xx_eth_shared_base = NULL;
@@ -1586,18 +1584,20 @@ static int mv643xx_eth_shared_remove(struct device *ddev)
        return 0;
 }
 
-static struct device_driver mv643xx_eth_driver = {
-       .name = MV643XX_ETH_NAME,
-       .bus = &platform_bus_type,
+static struct platform_driver mv643xx_eth_driver = {
        .probe = mv643xx_eth_probe,
        .remove = mv643xx_eth_remove,
+       .driver = {
+               .name = MV643XX_ETH_NAME,
+       },
 };
 
-static struct device_driver mv643xx_eth_shared_driver = {
-       .name = MV643XX_ETH_SHARED_NAME,
-       .bus = &platform_bus_type,
+static struct platform_driver mv643xx_eth_shared_driver = {
        .probe = mv643xx_eth_shared_probe,
        .remove = mv643xx_eth_shared_remove,
+       .driver = {
+               .name = MV643XX_ETH_SHARED_NAME,
+       },
 };
 
 /*
@@ -1613,11 +1613,11 @@ static int __init mv643xx_init_module(void)
 {
        int rc;
 
-       rc = driver_register(&mv643xx_eth_shared_driver);
+       rc = platform_driver_register(&mv643xx_eth_shared_driver);
        if (!rc) {
-               rc = driver_register(&mv643xx_eth_driver);
+               rc = platform_driver_register(&mv643xx_eth_driver);
                if (rc)
-                       driver_unregister(&mv643xx_eth_shared_driver);
+                       platform_driver_unregister(&mv643xx_eth_shared_driver);
        }
        return rc;
 }
@@ -1633,8 +1633,8 @@ static int __init mv643xx_init_module(void)
  */
 static void __exit mv643xx_cleanup_module(void)
 {
-       driver_unregister(&mv643xx_eth_driver);
-       driver_unregister(&mv643xx_eth_shared_driver);
+       platform_driver_unregister(&mv643xx_eth_driver);
+       platform_driver_unregister(&mv643xx_eth_shared_driver);
 }
 
 module_init(mv643xx_init_module);
index 74d5f1a6fdea262919736ebd9c86f45cd05d0a6e..c91e2e81f131aa368ca81b9eb20bb5722aa8c765 100644 (file)
@@ -2183,9 +2183,8 @@ static void smc_release_datacs(struct platform_device *pdev, struct net_device *
  *     0 --> there is a device
  *     anything else, error
  */
-static int smc_drv_probe(struct device *dev)
+static int smc_drv_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        struct net_device *ndev;
        struct resource *res;
        unsigned int __iomem *addr;
@@ -2212,7 +2211,7 @@ static int smc_drv_probe(struct device *dev)
                goto out_release_io;
        }
        SET_MODULE_OWNER(ndev);
-       SET_NETDEV_DEV(ndev, dev);
+       SET_NETDEV_DEV(ndev, &pdev->dev);
 
        ndev->dma = (unsigned char)-1;
        ndev->irq = platform_get_irq(pdev, 0);
@@ -2233,7 +2232,7 @@ static int smc_drv_probe(struct device *dev)
                goto out_release_attrib;
        }
 
-       dev_set_drvdata(dev, ndev);
+       platform_set_drvdata(pdev, ndev);
        ret = smc_probe(ndev, addr);
        if (ret != 0)
                goto out_iounmap;
@@ -2249,7 +2248,7 @@ static int smc_drv_probe(struct device *dev)
        return 0;
 
  out_iounmap:
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(pdev, NULL);
        iounmap(addr);
  out_release_attrib:
        smc_release_attrib(pdev);
@@ -2263,14 +2262,13 @@ static int smc_drv_probe(struct device *dev)
        return ret;
 }
 
-static int smc_drv_remove(struct device *dev)
+static int smc_drv_remove(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct net_device *ndev = dev_get_drvdata(dev);
+       struct net_device *ndev = platform_get_drvdata(pdev);
        struct smc_local *lp = netdev_priv(ndev);
        struct resource *res;
 
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(pdev, NULL);
 
        unregister_netdev(ndev);
 
@@ -2295,9 +2293,9 @@ static int smc_drv_remove(struct device *dev)
        return 0;
 }
 
-static int smc_drv_suspend(struct device *dev, pm_message_t state)
+static int smc_drv_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct net_device *ndev = dev_get_drvdata(dev);
+       struct net_device *ndev = platform_get_drvdata(dev);
 
        if (ndev) {
                if (netif_running(ndev)) {
@@ -2309,14 +2307,13 @@ static int smc_drv_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int smc_drv_resume(struct device *dev)
+static int smc_drv_resume(struct platform_device *dev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct net_device *ndev = dev_get_drvdata(dev);
+       struct net_device *ndev = platform_get_drvdata(dev);
 
        if (ndev) {
                struct smc_local *lp = netdev_priv(ndev);
-               smc_enable_device(pdev);
+               smc_enable_device(dev);
                if (netif_running(ndev)) {
                        smc_reset(ndev);
                        smc_enable(ndev);
@@ -2328,13 +2325,14 @@ static int smc_drv_resume(struct device *dev)
        return 0;
 }
 
-static struct device_driver smc_driver = {
-       .name           = CARDNAME,
-       .bus            = &platform_bus_type,
+static struct platform_driver smc_driver = {
        .probe          = smc_drv_probe,
        .remove         = smc_drv_remove,
        .suspend        = smc_drv_suspend,
        .resume         = smc_drv_resume,
+       .driver         = {
+               .name   = CARDNAME,
+       },
 };
 
 static int __init smc_init(void)
@@ -2348,12 +2346,12 @@ static int __init smc_init(void)
 #endif
 #endif
 
-       return driver_register(&smc_driver);
+       return platform_driver_register(&smc_driver);
 }
 
 static void __exit smc_cleanup(void)
 {
-       driver_unregister(&smc_driver);
+       platform_driver_unregister(&smc_driver);
 }
 
 module_init(smc_init);
index d04c918ebef811ad60af0bdede6d5d1047ccb446..4f756960db2ae94281b4eedd9c1b2eec1c4ec4cc 100644 (file)
@@ -344,9 +344,10 @@ module_param_array(dma, int, NULL, 0);
 
 static struct platform_device *proteon_dev[ISATR_MAX_ADAPTERS];
 
-static struct device_driver proteon_driver = {
-       .name           = "proteon",
-       .bus            = &platform_bus_type,
+static struct platform_driver proteon_driver = {
+       .driver         = {
+               .name   = "proteon",
+       },
 };
 
 static int __init proteon_init(void)
@@ -355,7 +356,7 @@ static int __init proteon_init(void)
        struct platform_device *pdev;
        int i, num = 0, err = 0;
 
-       err = driver_register(&proteon_driver);
+       err = platform_driver_register(&proteon_driver);
        if (err)
                return err;
 
@@ -372,7 +373,7 @@ static int __init proteon_init(void)
                err = setup_card(dev, &pdev->dev);
                if (!err) {
                        proteon_dev[i] = pdev;
-                       dev_set_drvdata(&pdev->dev, dev);
+                       platform_set_drvdata(pdev, dev);
                        ++num;
                } else {
                        platform_device_unregister(pdev);
@@ -399,17 +400,17 @@ static void __exit proteon_cleanup(void)
                
                if (!pdev)
                        continue;
-               dev = dev_get_drvdata(&pdev->dev);
+               dev = platform_get_drvdata(pdev);
                unregister_netdev(dev);
                release_region(dev->base_addr, PROTEON_IO_EXTENT);
                free_irq(dev->irq, dev);
                free_dma(dev->dma);
                tmsdev_term(dev);
                free_netdev(dev);
-               dev_set_drvdata(&pdev->dev, NULL);
+               platform_set_drvdata(pdev, NULL);
                platform_device_unregister(pdev);
        }
-       driver_unregister(&proteon_driver);
+       platform_driver_unregister(&proteon_driver);
 }
 
 module_init(proteon_init);
index 72cf708396be3f87e9badd604ee3b5b3ab41c6a2..d6ba41cf3110665ceb3b4a8332921a6baaf28efd 100644 (file)
@@ -354,9 +354,10 @@ module_param_array(dma, int, NULL, 0);
 
 static struct platform_device *sk_isa_dev[ISATR_MAX_ADAPTERS];
 
-static struct device_driver sk_isa_driver = {
-       .name           = "skisa",
-       .bus            = &platform_bus_type,
+static struct platform_driver sk_isa_driver = {
+       .driver         = {
+               .name   = "skisa",
+       },
 };
 
 static int __init sk_isa_init(void)
@@ -365,7 +366,7 @@ static int __init sk_isa_init(void)
        struct platform_device *pdev;
        int i, num = 0, err = 0;
 
-       err = driver_register(&sk_isa_driver);
+       err = platform_driver_register(&sk_isa_driver);
        if (err)
                return err;
 
@@ -382,7 +383,7 @@ static int __init sk_isa_init(void)
                err = setup_card(dev, &pdev->dev);
                if (!err) {
                        sk_isa_dev[i] = pdev;
-                       dev_set_drvdata(&sk_isa_dev[i]->dev, dev);
+                       platform_set_drvdata(sk_isa_dev[i], dev);
                        ++num;
                } else {
                        platform_device_unregister(pdev);
@@ -409,17 +410,17 @@ static void __exit sk_isa_cleanup(void)
 
                if (!pdev)
                        continue;
-               dev = dev_get_drvdata(&pdev->dev);
+               dev = platform_get_drvdata(pdev);
                unregister_netdev(dev);
                release_region(dev->base_addr, SK_ISA_IO_EXTENT);
                free_irq(dev->irq, dev);
                free_dma(dev->dma);
                tmsdev_term(dev);
                free_netdev(dev);
-               dev_set_drvdata(&pdev->dev, NULL);
+               platform_set_drvdata(pdev, NULL);
                platform_device_unregister(pdev);
        }
-       driver_unregister(&sk_isa_driver);
+       platform_driver_unregister(&sk_isa_driver);
 }
 
 module_init(sk_isa_init);
index 98820603e75fd2a4a7b27206817744d60c10f833..3742753241ee8e5b1ff2e34664d2f7540b406136 100644 (file)
@@ -2381,9 +2381,9 @@ void serial8250_resume_port(int line)
  * list is terminated with a zero flags entry, which means we expect
  * all entries to have at least UPF_BOOT_AUTOCONF set.
  */
-static int __devinit serial8250_probe(struct device *dev)
+static int __devinit serial8250_probe(struct platform_device *dev)
 {
-       struct plat_serial8250_port *p = dev->platform_data;
+       struct plat_serial8250_port *p = dev->dev.platform_data;
        struct uart_port port;
        int ret, i;
 
@@ -2399,12 +2399,12 @@ static int __devinit serial8250_probe(struct device *dev)
                port.flags      = p->flags;
                port.mapbase    = p->mapbase;
                port.hub6       = p->hub6;
-               port.dev        = dev;
+               port.dev        = &dev->dev;
                if (share_irqs)
                        port.flags |= UPF_SHARE_IRQ;
                ret = serial8250_register_port(&port);
                if (ret < 0) {
-                       dev_err(dev, "unable to register port at index %d "
+                       dev_err(&dev->dev, "unable to register port at index %d "
                                "(IO%lx MEM%lx IRQ%d): %d\n", i,
                                p->iobase, p->mapbase, p->irq, ret);
                }
@@ -2415,54 +2415,55 @@ static int __devinit serial8250_probe(struct device *dev)
 /*
  * Remove serial ports registered against a platform device.
  */
-static int __devexit serial8250_remove(struct device *dev)
+static int __devexit serial8250_remove(struct platform_device *dev)
 {
        int i;
 
        for (i = 0; i < UART_NR; i++) {
                struct uart_8250_port *up = &serial8250_ports[i];
 
-               if (up->port.dev == dev)
+               if (up->port.dev == &dev->dev)
                        serial8250_unregister_port(i);
        }
        return 0;
 }
 
-static int serial8250_suspend(struct device *dev, pm_message_t state)
+static int serial8250_suspend(struct platform_device *dev, pm_message_t state)
 {
        int i;
 
        for (i = 0; i < UART_NR; i++) {
                struct uart_8250_port *up = &serial8250_ports[i];
 
-               if (up->port.type != PORT_UNKNOWN && up->port.dev == dev)
+               if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev)
                        uart_suspend_port(&serial8250_reg, &up->port);
        }
 
        return 0;
 }
 
-static int serial8250_resume(struct device *dev)
+static int serial8250_resume(struct platform_device *dev)
 {
        int i;
 
        for (i = 0; i < UART_NR; i++) {
                struct uart_8250_port *up = &serial8250_ports[i];
 
-               if (up->port.type != PORT_UNKNOWN && up->port.dev == dev)
+               if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev)
                        uart_resume_port(&serial8250_reg, &up->port);
        }
 
        return 0;
 }
 
-static struct device_driver serial8250_isa_driver = {
-       .name           = "serial8250",
-       .bus            = &platform_bus_type,
+static struct platform_driver serial8250_isa_driver = {
        .probe          = serial8250_probe,
        .remove         = __devexit_p(serial8250_remove),
        .suspend        = serial8250_suspend,
        .resume         = serial8250_resume,
+       .driver         = {
+               .name   = "serial8250",
+       },
 };
 
 /*
@@ -2608,7 +2609,7 @@ static int __init serial8250_init(void)
 
        serial8250_register_ports(&serial8250_reg, &serial8250_isa_devs->dev);
 
-       ret = driver_register(&serial8250_isa_driver);
+       ret = platform_driver_register(&serial8250_isa_driver);
        if (ret == 0)
                goto out;
 
@@ -2630,7 +2631,7 @@ static void __exit serial8250_exit(void)
         */
        serial8250_isa_devs = NULL;
 
-       driver_unregister(&serial8250_isa_driver);
+       platform_driver_unregister(&serial8250_isa_driver);
        platform_device_unregister(isa_dev);
 
        uart_unregister_driver(&serial8250_reg);
index 4a54ff5847003855e7643e3f57f64eb0947bb0eb..355cd93a8a873aa277dbcc65bf3d4c41c5f49d0e 100644 (file)
@@ -921,9 +921,9 @@ static struct uart_driver imx_reg = {
        .cons           = IMX_CONSOLE,
 };
 
-static int serial_imx_suspend(struct device *_dev, pm_message_t state)
+static int serial_imx_suspend(struct platform_device *dev, pm_message_t state)
 {
-        struct imx_port *sport = dev_get_drvdata(_dev);
+        struct imx_port *sport = platform_get_drvdata(dev);
 
         if (sport)
                 uart_suspend_port(&imx_reg, &sport->port);
@@ -931,9 +931,9 @@ static int serial_imx_suspend(struct device *_dev, pm_message_t state)
         return 0;
 }
 
-static int serial_imx_resume(struct device *_dev)
+static int serial_imx_resume(struct platform_device *dev)
 {
-        struct imx_port *sport = dev_get_drvdata(_dev);
+        struct imx_port *sport = platform_get_drvdata(dev);
 
         if (sport)
                 uart_resume_port(&imx_reg, &sport->port);
@@ -941,21 +941,19 @@ static int serial_imx_resume(struct device *_dev)
         return 0;
 }
 
-static int serial_imx_probe(struct device *_dev)
+static int serial_imx_probe(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(_dev);
-
-       imx_ports[dev->id].port.dev = _dev;
+       imx_ports[dev->id].port.dev = &dev->dev;
        uart_add_one_port(&imx_reg, &imx_ports[dev->id].port);
-       dev_set_drvdata(_dev, &imx_ports[dev->id]);
+       platform_set_drvdata(dev, &imx_ports[dev->id]);
        return 0;
 }
 
-static int serial_imx_remove(struct device *_dev)
+static int serial_imx_remove(struct platform_device *dev)
 {
-       struct imx_port *sport = dev_get_drvdata(_dev);
+       struct imx_port *sport = platform_get_drvdata(dev);
 
-       dev_set_drvdata(_dev, NULL);
+       platform_set_drvdata(dev, NULL);
 
        if (sport)
                uart_remove_one_port(&imx_reg, &sport->port);
@@ -963,14 +961,15 @@ static int serial_imx_remove(struct device *_dev)
        return 0;
 }
 
-static struct device_driver serial_imx_driver = {
-        .name           = "imx-uart",
-        .bus            = &platform_bus_type,
+static struct platform_driver serial_imx_driver = {
         .probe          = serial_imx_probe,
         .remove         = serial_imx_remove,
 
        .suspend        = serial_imx_suspend,
        .resume         = serial_imx_resume,
+       .driver         = {
+               .name   = "imx-uart",
+       },
 };
 
 static int __init imx_serial_init(void)
@@ -985,7 +984,7 @@ static int __init imx_serial_init(void)
        if (ret)
                return ret;
 
-       ret = driver_register(&serial_imx_driver);
+       ret = platform_driver_register(&serial_imx_driver);
        if (ret != 0)
                uart_unregister_driver(&imx_reg);
 
index 0dd08a09e7e693aded568a69ae827ca436534a7d..5d3cb84864474b0449afc551caf8c2d2aa0c80dd 100644 (file)
@@ -717,10 +717,9 @@ static struct uart_driver mpc52xx_uart_driver = {
 /* ======================================================================== */
 
 static int __devinit
-mpc52xx_uart_probe(struct device *dev)
+mpc52xx_uart_probe(struct platform_device *dev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct resource *res = pdev->resource;
+       struct resource *res = dev->resource;
 
        struct uart_port *port = NULL;
        int i, idx, ret;
@@ -761,17 +760,17 @@ mpc52xx_uart_probe(struct device *dev)
        /* Add the port to the uart sub-system */
        ret = uart_add_one_port(&mpc52xx_uart_driver, port);
        if (!ret)
-               dev_set_drvdata(dev, (void*)port);
+               platform_set_drvdata(dev, (void*)port);
 
        return ret;
 }
 
 static int
-mpc52xx_uart_remove(struct device *dev)
+mpc52xx_uart_remove(struct platform_device *dev)
 {
-       struct uart_port *port = (struct uart_port *) dev_get_drvdata(dev);
+       struct uart_port *port = (struct uart_port *) platform_get_drvdata(dev);
 
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(dev, NULL);
 
        if (port)
                uart_remove_one_port(&mpc52xx_uart_driver, port);
@@ -781,9 +780,9 @@ mpc52xx_uart_remove(struct device *dev)
 
 #ifdef CONFIG_PM
 static int
-mpc52xx_uart_suspend(struct device *dev, pm_message_t state)
+mpc52xx_uart_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct uart_port *port = (struct uart_port *) dev_get_drvdata(dev);
+       struct uart_port *port = (struct uart_port *) platform_get_drvdata(dev);
 
        if (sport)
                uart_suspend_port(&mpc52xx_uart_driver, port);
@@ -792,9 +791,9 @@ mpc52xx_uart_suspend(struct device *dev, pm_message_t state)
 }
 
 static int
-mpc52xx_uart_resume(struct device *dev)
+mpc52xx_uart_resume(struct platform_device *dev)
 {
-       struct uart_port *port = (struct uart_port *) dev_get_drvdata(dev);
+       struct uart_port *port = (struct uart_port *) platform_get_drvdata(dev);
 
        if (port)
                uart_resume_port(&mpc52xx_uart_driver, port);
@@ -803,15 +802,16 @@ mpc52xx_uart_resume(struct device *dev)
 }
 #endif
 
-static struct device_driver mpc52xx_uart_platform_driver = {
-       .name           = "mpc52xx-psc",
-       .bus            = &platform_bus_type,
+static struct platform_driver mpc52xx_uart_platform_driver = {
        .probe          = mpc52xx_uart_probe,
        .remove         = mpc52xx_uart_remove,
 #ifdef CONFIG_PM
        .suspend        = mpc52xx_uart_suspend,
        .resume         = mpc52xx_uart_resume,
 #endif
+       .driver         = {
+               .name   = "mpc52xx-psc",
+       },
 };
 
 
@@ -828,7 +828,7 @@ mpc52xx_uart_init(void)
 
        ret = uart_register_driver(&mpc52xx_uart_driver);
        if (ret == 0) {
-               ret = driver_register(&mpc52xx_uart_platform_driver);
+               ret = platform_driver_register(&mpc52xx_uart_platform_driver);
                if (ret)
                        uart_unregister_driver(&mpc52xx_uart_driver);
        }
@@ -839,7 +839,7 @@ mpc52xx_uart_init(void)
 static void __exit
 mpc52xx_uart_exit(void)
 {
-       driver_unregister(&mpc52xx_uart_platform_driver);
+       platform_driver_unregister(&mpc52xx_uart_platform_driver);
        uart_unregister_driver(&mpc52xx_uart_driver);
 }
 
index ba8838b234da7b89cfa2575a8689034b5b2cb3e9..8f83e4007ecdf787fa9d890c37571afe41e2a43f 100644 (file)
@@ -1551,15 +1551,14 @@ mpsc_shared_unmap_regs(void)
 }
 
 static int
-mpsc_shared_drv_probe(struct device *dev)
+mpsc_shared_drv_probe(struct platform_device *dev)
 {
-       struct platform_device          *pd = to_platform_device(dev);
        struct mpsc_shared_pdata        *pdata;
        int                              rc = -ENODEV;
 
-       if (pd->id == 0) {
-               if (!(rc = mpsc_shared_map_regs(pd)))  {
-                       pdata = (struct mpsc_shared_pdata *)dev->platform_data;
+       if (dev->id == 0) {
+               if (!(rc = mpsc_shared_map_regs(dev)))  {
+                       pdata = (struct mpsc_shared_pdata *)dev->dev.platform_data;
 
                        mpsc_shared_regs.MPSC_MRR_m = pdata->mrr_val;
                        mpsc_shared_regs.MPSC_RCRR_m= pdata->rcrr_val;
@@ -1577,12 +1576,11 @@ mpsc_shared_drv_probe(struct device *dev)
 }
 
 static int
-mpsc_shared_drv_remove(struct device *dev)
+mpsc_shared_drv_remove(struct platform_device *dev)
 {
-       struct platform_device  *pd = to_platform_device(dev);
        int     rc = -ENODEV;
 
-       if (pd->id == 0) {
+       if (dev->id == 0) {
                mpsc_shared_unmap_regs();
                mpsc_shared_regs.MPSC_MRR_m = 0;
                mpsc_shared_regs.MPSC_RCRR_m = 0;
@@ -1595,11 +1593,12 @@ mpsc_shared_drv_remove(struct device *dev)
        return rc;
 }
 
-static struct device_driver mpsc_shared_driver = {
-       .name   = MPSC_SHARED_NAME,
-       .bus    = &platform_bus_type,
+static struct platform_driver mpsc_shared_driver = {
        .probe  = mpsc_shared_drv_probe,
        .remove = mpsc_shared_drv_remove,
+       .driver = {
+               .name = MPSC_SHARED_NAME,
+       },
 };
 
 /*
@@ -1732,19 +1731,18 @@ mpsc_drv_get_platform_data(struct mpsc_port_info *pi,
 }
 
 static int
-mpsc_drv_probe(struct device *dev)
+mpsc_drv_probe(struct platform_device *dev)
 {
-       struct platform_device  *pd = to_platform_device(dev);
        struct mpsc_port_info   *pi;
        int                     rc = -ENODEV;
 
-       pr_debug("mpsc_drv_probe: Adding MPSC %d\n", pd->id);
+       pr_debug("mpsc_drv_probe: Adding MPSC %d\n", dev->id);
 
-       if (pd->id < MPSC_NUM_CTLRS) {
-               pi = &mpsc_ports[pd->id];
+       if (dev->id < MPSC_NUM_CTLRS) {
+               pi = &mpsc_ports[dev->id];
 
-               if (!(rc = mpsc_drv_map_regs(pi, pd))) {
-                       mpsc_drv_get_platform_data(pi, pd, pd->id);
+               if (!(rc = mpsc_drv_map_regs(pi, dev))) {
+                       mpsc_drv_get_platform_data(pi, dev, dev->id);
 
                        if (!(rc = mpsc_make_ready(pi)))
                                if (!(rc = uart_add_one_port(&mpsc_reg,
@@ -1764,27 +1762,26 @@ mpsc_drv_probe(struct device *dev)
 }
 
 static int
-mpsc_drv_remove(struct device *dev)
+mpsc_drv_remove(struct platform_device *dev)
 {
-       struct platform_device  *pd = to_platform_device(dev);
+       pr_debug("mpsc_drv_exit: Removing MPSC %d\n", dev->id);
 
-       pr_debug("mpsc_drv_exit: Removing MPSC %d\n", pd->id);
-
-       if (pd->id < MPSC_NUM_CTLRS) {
-               uart_remove_one_port(&mpsc_reg, &mpsc_ports[pd->id].port);
-               mpsc_release_port((struct uart_port *)&mpsc_ports[pd->id].port);
-               mpsc_drv_unmap_regs(&mpsc_ports[pd->id]);
+       if (dev->id < MPSC_NUM_CTLRS) {
+               uart_remove_one_port(&mpsc_reg, &mpsc_ports[dev->id].port);
+               mpsc_release_port((struct uart_port *)&mpsc_ports[dev->id].port);
+               mpsc_drv_unmap_regs(&mpsc_ports[dev->id]);
                return 0;
        }
        else
                return -ENODEV;
 }
 
-static struct device_driver mpsc_driver = {
-       .name   = MPSC_CTLR_NAME,
-       .bus    = &platform_bus_type,
+static struct platform_driver mpsc_driver = {
        .probe  = mpsc_drv_probe,
        .remove = mpsc_drv_remove,
+       .driver = {
+               .name = MPSC_CTLR_NAME,
+       },
 };
 
 static int __init
@@ -1798,9 +1795,9 @@ mpsc_drv_init(void)
        memset(&mpsc_shared_regs, 0, sizeof(mpsc_shared_regs));
 
        if (!(rc = uart_register_driver(&mpsc_reg))) {
-               if (!(rc = driver_register(&mpsc_shared_driver))) {
-                       if ((rc = driver_register(&mpsc_driver))) {
-                               driver_unregister(&mpsc_shared_driver);
+               if (!(rc = platform_driver_register(&mpsc_shared_driver))) {
+                       if ((rc = platform_driver_register(&mpsc_driver))) {
+                               platform_driver_unregister(&mpsc_shared_driver);
                                uart_unregister_driver(&mpsc_reg);
                        }
                }
@@ -1815,8 +1812,8 @@ mpsc_drv_init(void)
 static void __exit
 mpsc_drv_exit(void)
 {
-       driver_unregister(&mpsc_driver);
-       driver_unregister(&mpsc_shared_driver);
+       platform_driver_unregister(&mpsc_driver);
+       platform_driver_unregister(&mpsc_shared_driver);
        uart_unregister_driver(&mpsc_reg);
        memset(mpsc_ports, 0, sizeof(mpsc_ports));
        memset(&mpsc_shared_regs, 0, sizeof(mpsc_shared_regs));
index 16b2f9417af9560aa040034357f06a383495b5b6..ff5e6309d682c132a455b5b285bfcd96af1b3cc2 100644 (file)
@@ -805,9 +805,9 @@ static struct uart_driver serial_pxa_reg = {
        .cons           = PXA_CONSOLE,
 };
 
-static int serial_pxa_suspend(struct device *_dev, pm_message_t state)
+static int serial_pxa_suspend(struct platform_device *dev, pm_message_t state)
 {
-        struct uart_pxa_port *sport = dev_get_drvdata(_dev);
+        struct uart_pxa_port *sport = platform_get_drvdata(dev);
 
         if (sport)
                 uart_suspend_port(&serial_pxa_reg, &sport->port);
@@ -815,9 +815,9 @@ static int serial_pxa_suspend(struct device *_dev, pm_message_t state)
         return 0;
 }
 
-static int serial_pxa_resume(struct device *_dev)
+static int serial_pxa_resume(struct platform_device *dev)
 {
-        struct uart_pxa_port *sport = dev_get_drvdata(_dev);
+        struct uart_pxa_port *sport = platform_get_drvdata(dev);
 
         if (sport)
                 uart_resume_port(&serial_pxa_reg, &sport->port);
@@ -825,21 +825,19 @@ static int serial_pxa_resume(struct device *_dev)
         return 0;
 }
 
-static int serial_pxa_probe(struct device *_dev)
+static int serial_pxa_probe(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(_dev);
-
-       serial_pxa_ports[dev->id].port.dev = _dev;
+       serial_pxa_ports[dev->id].port.dev = &dev->dev;
        uart_add_one_port(&serial_pxa_reg, &serial_pxa_ports[dev->id].port);
-       dev_set_drvdata(_dev, &serial_pxa_ports[dev->id]);
+       platform_set_drvdata(dev, &serial_pxa_ports[dev->id]);
        return 0;
 }
 
-static int serial_pxa_remove(struct device *_dev)
+static int serial_pxa_remove(struct platform_device *dev)
 {
-       struct uart_pxa_port *sport = dev_get_drvdata(_dev);
+       struct uart_pxa_port *sport = platform_get_drvdata(dev);
 
-       dev_set_drvdata(_dev, NULL);
+       platform_set_drvdata(dev, NULL);
 
        if (sport)
                uart_remove_one_port(&serial_pxa_reg, &sport->port);
@@ -847,14 +845,15 @@ static int serial_pxa_remove(struct device *_dev)
        return 0;
 }
 
-static struct device_driver serial_pxa_driver = {
-        .name           = "pxa2xx-uart",
-        .bus            = &platform_bus_type,
+static struct platform_driver serial_pxa_driver = {
         .probe          = serial_pxa_probe,
         .remove         = serial_pxa_remove,
 
        .suspend        = serial_pxa_suspend,
        .resume         = serial_pxa_resume,
+       .driver         = {
+               .name   = "pxa2xx-uart",
+       },
 };
 
 int __init serial_pxa_init(void)
@@ -865,7 +864,7 @@ int __init serial_pxa_init(void)
        if (ret != 0)
                return ret;
 
-       ret = driver_register(&serial_pxa_driver);
+       ret = platform_driver_register(&serial_pxa_driver);
        if (ret != 0)
                uart_unregister_driver(&serial_pxa_reg);
 
@@ -874,7 +873,7 @@ int __init serial_pxa_init(void)
 
 void __exit serial_pxa_exit(void)
 {
-        driver_unregister(&serial_pxa_driver);
+       platform_driver_unregister(&serial_pxa_driver);
        uart_unregister_driver(&serial_pxa_reg);
 }
 
index 036792328d499d4f6286174855897e4bb021ece1..47681c4654e4d110d1cd76ea4d37752881de8b0c 100644 (file)
@@ -1092,14 +1092,13 @@ static int s3c24xx_serial_init_port(struct s3c24xx_uart_port *ourport,
 
 static int probe_index = 0;
 
-static int s3c24xx_serial_probe(struct device *_dev,
+static int s3c24xx_serial_probe(struct platform_device *dev,
                                struct s3c24xx_uart_info *info)
 {
        struct s3c24xx_uart_port *ourport;
-       struct platform_device *dev = to_platform_device(_dev);
        int ret;
 
-       dbg("s3c24xx_serial_probe(%p, %p) %d\n", _dev, info, probe_index);
+       dbg("s3c24xx_serial_probe(%p, %p) %d\n", dev, info, probe_index);
 
        ourport = &s3c24xx_serial_ports[probe_index];
        probe_index++;
@@ -1112,7 +1111,7 @@ static int s3c24xx_serial_probe(struct device *_dev,
 
        dbg("%s: adding port\n", __FUNCTION__);
        uart_add_one_port(&s3c24xx_uart_drv, &ourport->port);
-       dev_set_drvdata(_dev, &ourport->port);
+       platform_set_drvdata(dev, &ourport->port);
 
        return 0;
 
@@ -1120,9 +1119,9 @@ static int s3c24xx_serial_probe(struct device *_dev,
        return ret;
 }
 
-static int s3c24xx_serial_remove(struct device *_dev)
+static int s3c24xx_serial_remove(struct platform_device *dev)
 {
-       struct uart_port *port = s3c24xx_dev_to_port(_dev);
+       struct uart_port *port = s3c24xx_dev_to_port(&dev->dev);
 
        if (port)
                uart_remove_one_port(&s3c24xx_uart_drv, port);
@@ -1134,9 +1133,9 @@ static int s3c24xx_serial_remove(struct device *_dev)
 
 #ifdef CONFIG_PM
 
-static int s3c24xx_serial_suspend(struct device *dev, pm_message_t state)
+static int s3c24xx_serial_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct uart_port *port = s3c24xx_dev_to_port(dev);
+       struct uart_port *port = s3c24xx_dev_to_port(&dev->dev);
 
        if (port)
                uart_suspend_port(&s3c24xx_uart_drv, port);
@@ -1144,9 +1143,9 @@ static int s3c24xx_serial_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int s3c24xx_serial_resume(struct device *dev)
+static int s3c24xx_serial_resume(struct platform_device *dev)
 {
-       struct uart_port *port = s3c24xx_dev_to_port(dev);
+       struct uart_port *port = s3c24xx_dev_to_port(&dev->dev);
        struct s3c24xx_uart_port *ourport = to_ourport(port);
 
        if (port) {
@@ -1165,11 +1164,11 @@ static int s3c24xx_serial_resume(struct device *dev)
 #define s3c24xx_serial_resume  NULL
 #endif
 
-static int s3c24xx_serial_init(struct device_driver *drv,
+static int s3c24xx_serial_init(struct platform_driver *drv,
                               struct s3c24xx_uart_info *info)
 {
        dbg("s3c24xx_serial_init(%p,%p)\n", drv, info);
-       return driver_register(drv);
+       return platform_driver_register(drv);
 }
 
 
@@ -1228,19 +1227,20 @@ static struct s3c24xx_uart_info s3c2400_uart_inf = {
        .reset_port     = s3c2400_serial_resetport,
 };
 
-static int s3c2400_serial_probe(struct device *dev)
+static int s3c2400_serial_probe(struct platform_device *dev)
 {
        return s3c24xx_serial_probe(dev, &s3c2400_uart_inf);
 }
 
-static struct device_driver s3c2400_serial_drv = {
-       .name           = "s3c2400-uart",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver s3c2400_serial_drv = {
        .probe          = s3c2400_serial_probe,
        .remove         = s3c24xx_serial_remove,
        .suspend        = s3c24xx_serial_suspend,
        .resume         = s3c24xx_serial_resume,
+       .driver         = {
+               .name   = "s3c2400-uart",
+               .owner  = THIS_MODULE,
+       },
 };
 
 static inline int s3c2400_serial_init(void)
@@ -1250,7 +1250,7 @@ static inline int s3c2400_serial_init(void)
 
 static inline void s3c2400_serial_exit(void)
 {
-       driver_unregister(&s3c2400_serial_drv);
+       platform_driver_unregister(&s3c2400_serial_drv);
 }
 
 #define s3c2400_uart_inf_at &s3c2400_uart_inf
@@ -1332,19 +1332,20 @@ static struct s3c24xx_uart_info s3c2410_uart_inf = {
 
 /* device management */
 
-static int s3c2410_serial_probe(struct device *dev)
+static int s3c2410_serial_probe(struct platform_device *dev)
 {
        return s3c24xx_serial_probe(dev, &s3c2410_uart_inf);
 }
 
-static struct device_driver s3c2410_serial_drv = {
-       .name           = "s3c2410-uart",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver s3c2410_serial_drv = {
        .probe          = s3c2410_serial_probe,
        .remove         = s3c24xx_serial_remove,
        .suspend        = s3c24xx_serial_suspend,
        .resume         = s3c24xx_serial_resume,
+       .driver         = {
+               .name   = "s3c2410-uart",
+               .owner  = THIS_MODULE,
+       },
 };
 
 static inline int s3c2410_serial_init(void)
@@ -1354,7 +1355,7 @@ static inline int s3c2410_serial_init(void)
 
 static inline void s3c2410_serial_exit(void)
 {
-       driver_unregister(&s3c2410_serial_drv);
+       platform_driver_unregister(&s3c2410_serial_drv);
 }
 
 #define s3c2410_uart_inf_at &s3c2410_uart_inf
@@ -1493,20 +1494,21 @@ static struct s3c24xx_uart_info s3c2440_uart_inf = {
 
 /* device management */
 
-static int s3c2440_serial_probe(struct device *dev)
+static int s3c2440_serial_probe(struct platform_device *dev)
 {
        dbg("s3c2440_serial_probe: dev=%p\n", dev);
        return s3c24xx_serial_probe(dev, &s3c2440_uart_inf);
 }
 
-static struct device_driver s3c2440_serial_drv = {
-       .name           = "s3c2440-uart",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver s3c2440_serial_drv = {
        .probe          = s3c2440_serial_probe,
        .remove         = s3c24xx_serial_remove,
        .suspend        = s3c24xx_serial_suspend,
        .resume         = s3c24xx_serial_resume,
+       .driver         = {
+               .name   = "s3c2440-uart",
+               .owner  = THIS_MODULE,
+       },
 };
 
 
@@ -1517,7 +1519,7 @@ static inline int s3c2440_serial_init(void)
 
 static inline void s3c2440_serial_exit(void)
 {
-       driver_unregister(&s3c2440_serial_drv);
+       platform_driver_unregister(&s3c2440_serial_drv);
 }
 
 #define s3c2440_uart_inf_at &s3c2440_uart_inf
index ed618cc7ae96e132ffcb5e9e32cfbe8de2d22675..fd9deee20e05108c7f35c0996878200ff4a716db 100644 (file)
@@ -834,9 +834,9 @@ static struct uart_driver sa1100_reg = {
        .cons                   = SA1100_CONSOLE,
 };
 
-static int sa1100_serial_suspend(struct device *_dev, pm_message_t state)
+static int sa1100_serial_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct sa1100_port *sport = dev_get_drvdata(_dev);
+       struct sa1100_port *sport = platform_get_drvdata(dev);
 
        if (sport)
                uart_suspend_port(&sa1100_reg, &sport->port);
@@ -844,9 +844,9 @@ static int sa1100_serial_suspend(struct device *_dev, pm_message_t state)
        return 0;
 }
 
-static int sa1100_serial_resume(struct device *_dev)
+static int sa1100_serial_resume(struct platform_device *dev)
 {
-       struct sa1100_port *sport = dev_get_drvdata(_dev);
+       struct sa1100_port *sport = platform_get_drvdata(dev);
 
        if (sport)
                uart_resume_port(&sa1100_reg, &sport->port);
@@ -854,9 +854,8 @@ static int sa1100_serial_resume(struct device *_dev)
        return 0;
 }
 
-static int sa1100_serial_probe(struct device *_dev)
+static int sa1100_serial_probe(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(_dev);
        struct resource *res = dev->resource;
        int i;
 
@@ -869,9 +868,9 @@ static int sa1100_serial_probe(struct device *_dev)
                        if (sa1100_ports[i].port.mapbase != res->start)
                                continue;
 
-                       sa1100_ports[i].port.dev = _dev;
+                       sa1100_ports[i].port.dev = &dev->dev;
                        uart_add_one_port(&sa1100_reg, &sa1100_ports[i].port);
-                       dev_set_drvdata(_dev, &sa1100_ports[i]);
+                       platform_set_drvdata(dev, &sa1100_ports[i]);
                        break;
                }
        }
@@ -879,11 +878,11 @@ static int sa1100_serial_probe(struct device *_dev)
        return 0;
 }
 
-static int sa1100_serial_remove(struct device *_dev)
+static int sa1100_serial_remove(struct platform_device *pdev)
 {
-       struct sa1100_port *sport = dev_get_drvdata(_dev);
+       struct sa1100_port *sport = platform_get_drvdata(pdev);
 
-       dev_set_drvdata(_dev, NULL);
+       platform_set_drvdata(pdev, NULL);
 
        if (sport)
                uart_remove_one_port(&sa1100_reg, &sport->port);
@@ -891,13 +890,14 @@ static int sa1100_serial_remove(struct device *_dev)
        return 0;
 }
 
-static struct device_driver sa11x0_serial_driver = {
-       .name           = "sa11x0-uart",
-       .bus            = &platform_bus_type,
+static struct platform_driver sa11x0_serial_driver = {
        .probe          = sa1100_serial_probe,
        .remove         = sa1100_serial_remove,
        .suspend        = sa1100_serial_suspend,
        .resume         = sa1100_serial_resume,
+       .driver         = {
+               .name   = "sa11x0-uart",
+       },
 };
 
 static int __init sa1100_serial_init(void)
@@ -910,7 +910,7 @@ static int __init sa1100_serial_init(void)
 
        ret = uart_register_driver(&sa1100_reg);
        if (ret == 0) {
-               ret = driver_register(&sa11x0_serial_driver);
+               ret = platform_driver_register(&sa11x0_serial_driver);
                if (ret)
                        uart_unregister_driver(&sa1100_reg);
        }
@@ -919,7 +919,7 @@ static int __init sa1100_serial_init(void)
 
 static void __exit sa1100_serial_exit(void)
 {
-       driver_unregister(&sa11x0_serial_driver);
+       platform_driver_unregister(&sa11x0_serial_driver);
        uart_unregister_driver(&sa1100_reg);
 }
 
index 01696b3e3f619f5b80aa9fcea4dfe4c4540790bb..865d4dea65df9b4d131bac4f50fe496246c9b535 100644 (file)
@@ -924,7 +924,7 @@ static struct uart_driver siu_uart_driver = {
        .cons           = SERIAL_VR41XX_CONSOLE,
 };
 
-static int siu_probe(struct device *dev)
+static int siu_probe(struct platform_device *dev)
 {
        struct uart_port *port;
        int num, i, retval;
@@ -941,7 +941,7 @@ static int siu_probe(struct device *dev)
        for (i = 0; i < num; i++) {
                port = &siu_uart_ports[i];
                port->ops = &siu_uart_ops;
-               port->dev = dev;
+               port->dev = &dev->dev;
 
                retval = uart_add_one_port(&siu_uart_driver, port);
                if (retval < 0) {
@@ -958,14 +958,14 @@ static int siu_probe(struct device *dev)
        return 0;
 }
 
-static int siu_remove(struct device *dev)
+static int siu_remove(struct platform_device *dev)
 {
        struct uart_port *port;
        int i;
 
        for (i = 0; i < siu_uart_driver.nr; i++) {
                port = &siu_uart_ports[i];
-               if (port->dev == dev) {
+               if (port->dev == &dev->dev) {
                        uart_remove_one_port(&siu_uart_driver, port);
                        port->dev = NULL;
                }
@@ -976,7 +976,7 @@ static int siu_remove(struct device *dev)
        return 0;
 }
 
-static int siu_suspend(struct device *dev, pm_message_t state)
+static int siu_suspend(struct platform_device *dev, pm_message_t state)
 {
        struct uart_port *port;
        int i;
@@ -984,7 +984,7 @@ static int siu_suspend(struct device *dev, pm_message_t state)
        for (i = 0; i < siu_uart_driver.nr; i++) {
                port = &siu_uart_ports[i];
                if ((port->type == PORT_VR41XX_SIU ||
-                    port->type == PORT_VR41XX_DSIU) && port->dev == dev)
+                    port->type == PORT_VR41XX_DSIU) && port->dev == &dev->dev)
                        uart_suspend_port(&siu_uart_driver, port);
 
        }
@@ -992,7 +992,7 @@ static int siu_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int siu_resume(struct device *dev)
+static int siu_resume(struct platform_device *dev)
 {
        struct uart_port *port;
        int i;
@@ -1000,7 +1000,7 @@ static int siu_resume(struct device *dev)
        for (i = 0; i < siu_uart_driver.nr; i++) {
                port = &siu_uart_ports[i];
                if ((port->type == PORT_VR41XX_SIU ||
-                    port->type == PORT_VR41XX_DSIU) && port->dev == dev)
+                    port->type == PORT_VR41XX_DSIU) && port->dev == &dev->dev)
                        uart_resume_port(&siu_uart_driver, port);
        }
 
@@ -1009,13 +1009,14 @@ static int siu_resume(struct device *dev)
 
 static struct platform_device *siu_platform_device;
 
-static struct device_driver siu_device_driver = {
-       .name           = "SIU",
-       .bus            = &platform_bus_type,
+static struct platform_driver siu_device_driver = {
        .probe          = siu_probe,
        .remove         = siu_remove,
        .suspend        = siu_suspend,
        .resume         = siu_resume,
+       .driver         = {
+               .name   = "SIU",
+       },
 };
 
 static int __devinit vr41xx_siu_init(void)
@@ -1026,7 +1027,7 @@ static int __devinit vr41xx_siu_init(void)
        if (IS_ERR(siu_platform_device))
                return PTR_ERR(siu_platform_device);
 
-       retval = driver_register(&siu_device_driver);
+       retval = platform_driver_register(&siu_device_driver);
        if (retval < 0)
                platform_device_unregister(siu_platform_device);
 
@@ -1035,7 +1036,7 @@ static int __devinit vr41xx_siu_init(void)
 
 static void __devexit vr41xx_siu_exit(void)
 {
-       driver_unregister(&siu_device_driver);
+       platform_driver_unregister(&siu_device_driver);
 
        platform_device_unregister(siu_platform_device);
 }
index 904519085334e8e6bb16f6e3ac79ac0a44a3b1a6..1e407745c1155a679a70867f4f1202808233ff31 100644 (file)
@@ -896,7 +896,7 @@ dummy_gadget_release (struct device *dev)
 #endif
 }
 
-static int dummy_udc_probe (struct device *dev)
+static int dummy_udc_probe (struct platform_device *dev)
 {
        struct dummy    *dum = the_controller;
        int             rc;
@@ -909,7 +909,7 @@ static int dummy_udc_probe (struct device *dev)
        dum->gadget.is_otg = (dummy_to_hcd(dum)->self.otg_port != 0);
 
        strcpy (dum->gadget.dev.bus_id, "gadget");
-       dum->gadget.dev.parent = dev;
+       dum->gadget.dev.parent = &dev->dev;
        dum->gadget.dev.release = dummy_gadget_release;
        rc = device_register (&dum->gadget.dev);
        if (rc < 0)
@@ -919,26 +919,26 @@ static int dummy_udc_probe (struct device *dev)
        usb_bus_get (&dummy_to_hcd (dum)->self);
 #endif
 
-       dev_set_drvdata (dev, dum);
+       platform_set_drvdata (dev, dum);
        device_create_file (&dum->gadget.dev, &dev_attr_function);
        return rc;
 }
 
-static int dummy_udc_remove (struct device *dev)
+static int dummy_udc_remove (struct platform_device *dev)
 {
-       struct dummy    *dum = dev_get_drvdata (dev);
+       struct dummy    *dum = platform_get_drvdata (dev);
 
-       dev_set_drvdata (dev, NULL);
+       platform_set_drvdata (dev, NULL);
        device_remove_file (&dum->gadget.dev, &dev_attr_function);
        device_unregister (&dum->gadget.dev);
        return 0;
 }
 
-static int dummy_udc_suspend (struct device *dev, pm_message_t state)
+static int dummy_udc_suspend (struct platform_device *dev, pm_message_t state)
 {
-       struct dummy    *dum = dev_get_drvdata(dev);
+       struct dummy    *dum = platform_get_drvdata(dev);
 
-       dev_dbg (dev, "%s\n", __FUNCTION__);
+       dev_dbg (&dev->dev, "%s\n", __FUNCTION__);
        spin_lock_irq (&dum->lock);
        dum->udc_suspended = 1;
        set_link_state (dum);
@@ -949,29 +949,30 @@ static int dummy_udc_suspend (struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int dummy_udc_resume (struct device *dev)
+static int dummy_udc_resume (struct platform_device *dev)
 {
-       struct dummy    *dum = dev_get_drvdata(dev);
+       struct dummy    *dum = platform_get_drvdata(dev);
 
-       dev_dbg (dev, "%s\n", __FUNCTION__);
+       dev_dbg (&dev->dev, "%s\n", __FUNCTION__);
        spin_lock_irq (&dum->lock);
        dum->udc_suspended = 0;
        set_link_state (dum);
        spin_unlock_irq (&dum->lock);
 
-       dev->power.power_state = PMSG_ON;
+       dev->dev.power.power_state = PMSG_ON;
        usb_hcd_poll_rh_status (dummy_to_hcd (dum));
        return 0;
 }
 
-static struct device_driver dummy_udc_driver = {
-       .name           = (char *) gadget_name,
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver dummy_udc_driver = {
        .probe          = dummy_udc_probe,
        .remove         = dummy_udc_remove,
        .suspend        = dummy_udc_suspend,
        .resume         = dummy_udc_resume,
+       .driver         = {
+               .name   = (char *) gadget_name,
+               .owner  = THIS_MODULE,
+       },
 };
 
 /*-------------------------------------------------------------------------*/
@@ -1898,14 +1899,14 @@ static const struct hc_driver dummy_hcd = {
        .bus_resume =           dummy_bus_resume,
 };
 
-static int dummy_hcd_probe (struct device *dev)
+static int dummy_hcd_probe (struct platform_device *dev)
 {
        struct usb_hcd          *hcd;
        int                     retval;
 
        dev_info (dev, "%s, driver " DRIVER_VERSION "\n", driver_desc);
 
-       hcd = usb_create_hcd (&dummy_hcd, dev, dev->bus_id);
+       hcd = usb_create_hcd (&dummy_hcd, &dev->dev, dev->dev.bus_id);
        if (!hcd)
                return -ENOMEM;
        the_controller = hcd_to_dummy (hcd);
@@ -1918,48 +1919,49 @@ static int dummy_hcd_probe (struct device *dev)
        return retval;
 }
 
-static int dummy_hcd_remove (struct device *dev)
+static int dummy_hcd_remove (struct platform_device *dev)
 {
        struct usb_hcd          *hcd;
 
-       hcd = dev_get_drvdata (dev);
+       hcd = platform_get_drvdata (dev);
        usb_remove_hcd (hcd);
        usb_put_hcd (hcd);
        the_controller = NULL;
        return 0;
 }
 
-static int dummy_hcd_suspend (struct device *dev, pm_message_t state)
+static int dummy_hcd_suspend (struct platform_device *dev, pm_message_t state)
 {
        struct usb_hcd          *hcd;
 
-       dev_dbg (dev, "%s\n", __FUNCTION__);
-       hcd = dev_get_drvdata (dev);
+       dev_dbg (&dev->dev, "%s\n", __FUNCTION__);
+       hcd = platform_get_drvdata (dev);
 
        hcd->state = HC_STATE_SUSPENDED;
        return 0;
 }
 
-static int dummy_hcd_resume (struct device *dev)
+static int dummy_hcd_resume (struct platform_device *dev)
 {
        struct usb_hcd          *hcd;
 
-       dev_dbg (dev, "%s\n", __FUNCTION__);
-       hcd = dev_get_drvdata (dev);
+       dev_dbg (&dev->dev, "%s\n", __FUNCTION__);
+       hcd = platform_get_drvdata (dev);
        hcd->state = HC_STATE_RUNNING;
 
        usb_hcd_poll_rh_status (hcd);
        return 0;
 }
 
-static struct device_driver dummy_hcd_driver = {
-       .name           = (char *) driver_name,
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver dummy_hcd_driver = {
        .probe          = dummy_hcd_probe,
        .remove         = dummy_hcd_remove,
        .suspend        = dummy_hcd_suspend,
        .resume         = dummy_hcd_resume,
+       .driver         = {
+               .name   = (char *) driver_name,
+               .owner  = THIS_MODULE,
+       },
 };
 
 /*-------------------------------------------------------------------------*/
@@ -1995,11 +1997,11 @@ static int __init init (void)
        if (usb_disabled ())
                return -ENODEV;
 
-       retval = driver_register (&dummy_hcd_driver);
+       retval = platform_driver_register (&dummy_hcd_driver);
        if (retval < 0)
                return retval;
 
-       retval = driver_register (&dummy_udc_driver);
+       retval = platform_driver_register (&dummy_udc_driver);
        if (retval < 0)
                goto err_register_udc_driver;
 
@@ -2015,9 +2017,9 @@ static int __init init (void)
 err_register_udc:
        platform_device_unregister (&the_hcd_pdev);
 err_register_hcd:
-       driver_unregister (&dummy_udc_driver);
+       platform_driver_unregister (&dummy_udc_driver);
 err_register_udc_driver:
-       driver_unregister (&dummy_hcd_driver);
+       platform_driver_unregister (&dummy_hcd_driver);
        return retval;
 }
 module_init (init);
@@ -2026,7 +2028,7 @@ static void __exit cleanup (void)
 {
        platform_device_unregister (&the_udc_pdev);
        platform_device_unregister (&the_hcd_pdev);
-       driver_unregister (&dummy_udc_driver);
-       driver_unregister (&dummy_hcd_driver);
+       platform_driver_unregister (&dummy_udc_driver);
+       platform_driver_unregister (&dummy_hcd_driver);
 }
 module_exit (cleanup);
index bc6269f10cbb5d3fd1e1f4a3f0968bea15448c38..e02fea5a54339da5de3351927f880a724e7a58e4 100644 (file)
@@ -2085,21 +2085,21 @@ static struct lh7a40x_udc memory = {
 /*
  *     probe - binds to the platform device
  */
-static int lh7a40x_udc_probe(struct device *_dev)
+static int lh7a40x_udc_probe(struct platform_device *pdev)
 {
        struct lh7a40x_udc *dev = &memory;
        int retval;
 
-       DEBUG("%s: %p\n", __FUNCTION__, _dev);
+       DEBUG("%s: %p\n", __FUNCTION__, pdev);
 
        spin_lock_init(&dev->lock);
-       dev->dev = _dev;
+       dev->dev = &pdev->dev;
 
        device_initialize(&dev->gadget.dev);
-       dev->gadget.dev.parent = _dev;
+       dev->gadget.dev.parent = &pdev->dev;
 
        the_controller = dev;
-       dev_set_drvdata(_dev, dev);
+       platform_set_drvdata(pdev, dev);
 
        udc_disable(dev);
        udc_reinit(dev);
@@ -2119,11 +2119,11 @@ static int lh7a40x_udc_probe(struct device *_dev)
        return retval;
 }
 
-static int lh7a40x_udc_remove(struct device *_dev)
+static int lh7a40x_udc_remove(struct platform_device *pdev)
 {
-       struct lh7a40x_udc *dev = _dev->driver_data;
+       struct lh7a40x_udc *dev = platform_get_drvdata(pdev);
 
-       DEBUG("%s: %p\n", __FUNCTION__, dev);
+       DEBUG("%s: %p\n", __FUNCTION__, pdev);
 
        udc_disable(dev);
        remove_proc_files();
@@ -2131,7 +2131,7 @@ static int lh7a40x_udc_remove(struct device *_dev)
 
        free_irq(IRQ_USBINTR, dev);
 
-       dev_set_drvdata(_dev, 0);
+       platform_set_drvdata(pdev, 0);
 
        the_controller = 0;
 
@@ -2140,26 +2140,27 @@ static int lh7a40x_udc_remove(struct device *_dev)
 
 /*-------------------------------------------------------------------------*/
 
-static struct device_driver udc_driver = {
-       .name = (char *)driver_name,
-       .owner = THIS_MODULE,
-       .bus = &platform_bus_type,
+static struct platform_driver udc_driver = {
        .probe = lh7a40x_udc_probe,
        .remove = lh7a40x_udc_remove
            /* FIXME power management support */
            /* .suspend = ... disable UDC */
            /* .resume = ... re-enable UDC */
+       .driver = {
+               .name = (char *)driver_name,
+               .owner = THIS_MODULE,
+       },
 };
 
 static int __init udc_init(void)
 {
        DEBUG("%s: %s version %s\n", __FUNCTION__, driver_name, DRIVER_VERSION);
-       return driver_register(&udc_driver);
+       return platform_driver_register(&udc_driver);
 }
 
 static void __exit udc_exit(void)
 {
-       driver_unregister(&udc_driver);
+       platform_driver_unregister(&udc_driver);
 }
 
 module_init(udc_init);
index 387692a3611e7119560b606611e75d1ac881285f..a8972d7c97beff2b6a5831f284daf6f68dfd3cf3 100644 (file)
@@ -2707,18 +2707,17 @@ omap_udc_setup(struct platform_device *odev, struct otg_transceiver *xceiv)
        return 0;
 }
 
-static int __init omap_udc_probe(struct device *dev)
+static int __init omap_udc_probe(struct platform_device *pdev)
 {
-       struct platform_device  *odev = to_platform_device(dev);
        int                     status = -ENODEV;
        int                     hmc;
        struct otg_transceiver  *xceiv = NULL;
        const char              *type = NULL;
-       struct omap_usb_config  *config = dev->platform_data;
+       struct omap_usb_config  *config = pdev->dev.platform_data;
 
        /* NOTE:  "knows" the order of the resources! */
-       if (!request_mem_region(odev->resource[0].start, 
-                       odev->resource[0].end - odev->resource[0].start + 1,
+       if (!request_mem_region(pdev->resource[0].start, 
+                       pdev->resource[0].end - pdev->resource[0].start + 1,
                        driver_name)) {
                DBG("request_mem_region failed\n");
                return -EBUSY;
@@ -2803,7 +2802,7 @@ bad_on_1710:
        INFO("hmc mode %d, %s transceiver\n", hmc, type);
 
        /* a "gadget" abstracts/virtualizes the controller */
-       status = omap_udc_setup(odev, xceiv);
+       status = omap_udc_setup(pdev, xceiv);
        if (status) {
                goto cleanup0;
        }
@@ -2821,28 +2820,28 @@ bad_on_1710:
                udc->clr_halt = UDC_RESET_EP;
 
        /* USB general purpose IRQ:  ep0, state changes, dma, etc */
-       status = request_irq(odev->resource[1].start, omap_udc_irq,
+       status = request_irq(pdev->resource[1].start, omap_udc_irq,
                        SA_SAMPLE_RANDOM, driver_name, udc);
        if (status != 0) {
                ERR( "can't get irq %ld, err %d\n",
-                       odev->resource[1].start, status);
+                       pdev->resource[1].start, status);
                goto cleanup1;
        }
 
        /* USB "non-iso" IRQ (PIO for all but ep0) */
-       status = request_irq(odev->resource[2].start, omap_udc_pio_irq,
+       status = request_irq(pdev->resource[2].start, omap_udc_pio_irq,
                        SA_SAMPLE_RANDOM, "omap_udc pio", udc);
        if (status != 0) {
                ERR( "can't get irq %ld, err %d\n",
-                       odev->resource[2].start, status);
+                       pdev->resource[2].start, status);
                goto cleanup2;
        }
 #ifdef USE_ISO
-       status = request_irq(odev->resource[3].start, omap_udc_iso_irq,
+       status = request_irq(pdev->resource[3].start, omap_udc_iso_irq,
                        SA_INTERRUPT, "omap_udc iso", udc);
        if (status != 0) {
                ERR("can't get irq %ld, err %d\n",
-                       odev->resource[3].start, status);
+                       pdev->resource[3].start, status);
                goto cleanup3;
        }
 #endif
@@ -2853,11 +2852,11 @@ bad_on_1710:
 
 #ifdef USE_ISO
 cleanup3:
-       free_irq(odev->resource[2].start, udc);
+       free_irq(pdev->resource[2].start, udc);
 #endif
 
 cleanup2:
-       free_irq(odev->resource[1].start, udc);
+       free_irq(pdev->resource[1].start, udc);
 
 cleanup1:
        kfree (udc);
@@ -2866,14 +2865,13 @@ cleanup1:
 cleanup0:
        if (xceiv)
                put_device(xceiv->dev);
-       release_mem_region(odev->resource[0].start,
-                       odev->resource[0].end - odev->resource[0].start + 1);
+       release_mem_region(pdev->resource[0].start,
+                       pdev->resource[0].end - pdev->resource[0].start + 1);
        return status;
 }
 
-static int __exit omap_udc_remove(struct device *dev)
+static int __exit omap_udc_remove(struct platform_device *pdev)
 {
-       struct platform_device  *odev = to_platform_device(dev);
        DECLARE_COMPLETION(done);
 
        if (!udc)
@@ -2891,13 +2889,13 @@ static int __exit omap_udc_remove(struct device *dev)
        remove_proc_file();
 
 #ifdef USE_ISO
-       free_irq(odev->resource[3].start, udc);
+       free_irq(pdev->resource[3].start, udc);
 #endif
-       free_irq(odev->resource[2].start, udc);
-       free_irq(odev->resource[1].start, udc);
+       free_irq(pdev->resource[2].start, udc);
+       free_irq(pdev->resource[1].start, udc);
 
-       release_mem_region(odev->resource[0].start,
-                       odev->resource[0].end - odev->resource[0].start + 1);
+       release_mem_region(pdev->resource[0].start,
+                       pdev->resource[0].end - pdev->resource[0].start + 1);
 
        device_unregister(&udc->gadget.dev);
        wait_for_completion(&done);
@@ -2915,7 +2913,7 @@ static int __exit omap_udc_remove(struct device *dev)
  * may involve talking to an external transceiver (e.g. isp1301).
  */
 
-static int omap_udc_suspend(struct device *dev, pm_message_t message)
+static int omap_udc_suspend(struct platform_device *dev, pm_message_t message)
 {
        u32     devstat;
 
@@ -2935,7 +2933,7 @@ static int omap_udc_suspend(struct device *dev, pm_message_t message)
        return 0;
 }
 
-static int omap_udc_resume(struct device *dev)
+static int omap_udc_resume(struct platform_device *dev)
 {
        DBG("resume + wakeup/SRP\n");
        omap_pullup(&udc->gadget, 1);
@@ -2947,14 +2945,15 @@ static int omap_udc_resume(struct device *dev)
 
 /*-------------------------------------------------------------------------*/
 
-static struct device_driver udc_driver = {
-       .name           = (char *) driver_name,
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver udc_driver = {
        .probe          = omap_udc_probe,
        .remove         = __exit_p(omap_udc_remove),
        .suspend        = omap_udc_suspend,
        .resume         = omap_udc_resume,
+       .driver         = {
+               .owner  = THIS_MODULE,
+               .name   = (char *) driver_name,
+       },
 };
 
 static int __init udc_init(void)
@@ -2965,13 +2964,13 @@ static int __init udc_init(void)
 #endif
                "%s\n", driver_desc,
                use_dma ?  " (dma)" : "");
-       return driver_register(&udc_driver);
+       return platform_driver_register(&udc_driver);
 }
 module_init(udc_init);
 
 static void __exit udc_exit(void)
 {
-       driver_unregister(&udc_driver);
+       platform_driver_unregister(&udc_driver);
 }
 module_exit(udc_exit);
 
index 510d28a924db95501edb3c69402148a9df208ea3..bb028c5b8952cbdf141006ce26079d6ab2e68275 100644 (file)
@@ -2432,7 +2432,7 @@ static struct pxa2xx_udc memory = {
 /*
  *     probe - binds to the platform device
  */
-static int __init pxa2xx_udc_probe(struct device *_dev)
+static int __init pxa2xx_udc_probe(struct platform_device *pdev)
 {
        struct pxa2xx_udc *dev = &memory;
        int retval, out_dma = 1;
@@ -2495,19 +2495,19 @@ static int __init pxa2xx_udc_probe(struct device *_dev)
 #endif
 
        /* other non-static parts of init */
-       dev->dev = _dev;
-       dev->mach = _dev->platform_data;
+       dev->dev = &pdev->dev;
+       dev->mach = pdev->dev.platform_data;
 
        init_timer(&dev->timer);
        dev->timer.function = udc_watchdog;
        dev->timer.data = (unsigned long) dev;
 
        device_initialize(&dev->gadget.dev);
-       dev->gadget.dev.parent = _dev;
-       dev->gadget.dev.dma_mask = _dev->dma_mask;
+       dev->gadget.dev.parent = &pdev->dev;
+       dev->gadget.dev.dma_mask = pdev->dev.dma_mask;
 
        the_controller = dev;
-       dev_set_drvdata(_dev, dev);
+       platform_set_drvdata(pdev, dev);
 
        udc_disable(dev);
        udc_reinit(dev);
@@ -2559,14 +2559,14 @@ lubbock_fail0:
        return 0;
 }
 
-static void pxa2xx_udc_shutdown(struct device *_dev)
+static void pxa2xx_udc_shutdown(struct platform_device *_dev)
 {
        pullup_off();
 }
 
-static int __exit pxa2xx_udc_remove(struct device *_dev)
+static int __exit pxa2xx_udc_remove(struct platform_device *pdev)
 {
-       struct pxa2xx_udc *dev = dev_get_drvdata(_dev);
+       struct pxa2xx_udc *dev = platform_get_drvdata(pdev);
 
        udc_disable(dev);
        remove_proc_files();
@@ -2580,7 +2580,7 @@ static int __exit pxa2xx_udc_remove(struct device *_dev)
                free_irq(LUBBOCK_USB_DISC_IRQ, dev);
                free_irq(LUBBOCK_USB_IRQ, dev);
        }
-       dev_set_drvdata(_dev, NULL);
+       platform_set_drvdata(pdev, NULL);
        the_controller = NULL;
        return 0;
 }
@@ -2601,9 +2601,9 @@ static int __exit pxa2xx_udc_remove(struct device *_dev)
  * VBUS IRQs should probably be ignored so that the PXA device just acts
  * "dead" to USB hosts until system resume.
  */
-static int pxa2xx_udc_suspend(struct device *dev, pm_message_t state)
+static int pxa2xx_udc_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct pxa2xx_udc       *udc = dev_get_drvdata(dev);
+       struct pxa2xx_udc       *udc = platform_get_drvdata(dev);
 
        if (!udc->mach->udc_command)
                WARN("USB host won't detect disconnect!\n");
@@ -2612,9 +2612,9 @@ static int pxa2xx_udc_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int pxa2xx_udc_resume(struct device *dev)
+static int pxa2xx_udc_resume(struct platform_device *dev)
 {
-       struct pxa2xx_udc       *udc = dev_get_drvdata(dev);
+       struct pxa2xx_udc       *udc = platform_get_drvdata(dev);
 
        pullup(udc, 1);
 
@@ -2628,27 +2628,28 @@ static int pxa2xx_udc_resume(struct device *dev)
 
 /*-------------------------------------------------------------------------*/
 
-static struct device_driver udc_driver = {
-       .name           = "pxa2xx-udc",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver udc_driver = {
        .probe          = pxa2xx_udc_probe,
        .shutdown       = pxa2xx_udc_shutdown,
        .remove         = __exit_p(pxa2xx_udc_remove),
        .suspend        = pxa2xx_udc_suspend,
        .resume         = pxa2xx_udc_resume,
+       .driver         = {
+               .owner  = THIS_MODULE,
+               .name   = "pxa2xx-udc",
+       },
 };
 
 static int __init udc_init(void)
 {
        printk(KERN_INFO "%s: version %s\n", driver_name, DRIVER_VERSION);
-       return driver_register(&udc_driver);
+       return platform_driver_register(&udc_driver);
 }
 module_init(udc_init);
 
 static void __exit udc_exit(void)
 {
-       driver_unregister(&udc_driver);
+       platform_driver_unregister(&udc_driver);
 }
 module_exit(udc_exit);
 
index f9c3f5b8dd1c3adcdcc79dc2f129bf2278b14796..82f64986bc2269c2a185bfb1d05169ff9479d0a4 100644 (file)
@@ -1633,17 +1633,15 @@ static struct hc_driver isp116x_hc_driver = {
 
 /*----------------------------------------------------------------*/
 
-static int __init_or_module isp116x_remove(struct device *dev)
+static int __init_or_module isp116x_remove(struct platform_device *pdev)
 {
-       struct usb_hcd *hcd = dev_get_drvdata(dev);
+       struct usb_hcd *hcd = platform_get_drvdata(pdev);
        struct isp116x *isp116x;
-       struct platform_device *pdev;
        struct resource *res;
 
        if (!hcd)
                return 0;
        isp116x = hcd_to_isp116x(hcd);
-       pdev = container_of(dev, struct platform_device, dev);
        remove_debug_file(isp116x);
        usb_remove_hcd(hcd);
 
@@ -1660,18 +1658,16 @@ static int __init_or_module isp116x_remove(struct device *dev)
 
 #define resource_len(r) (((r)->end - (r)->start) + 1)
 
-static int __init isp116x_probe(struct device *dev)
+static int __init isp116x_probe(struct platform_device *pdev)
 {
        struct usb_hcd *hcd;
        struct isp116x *isp116x;
-       struct platform_device *pdev;
        struct resource *addr, *data;
        void __iomem *addr_reg;
        void __iomem *data_reg;
        int irq;
        int ret = 0;
 
-       pdev = container_of(dev, struct platform_device, dev);
        if (pdev->num_resources < 3) {
                ret = -ENODEV;
                goto err1;
@@ -1685,7 +1681,7 @@ static int __init isp116x_probe(struct device *dev)
                goto err1;
        }
 
-       if (dev->dma_mask) {
+       if (pdev->dev.dma_mask) {
                DBG("DMA not supported\n");
                ret = -EINVAL;
                goto err1;
@@ -1711,7 +1707,7 @@ static int __init isp116x_probe(struct device *dev)
        }
 
        /* allocate and initialize hcd */
-       hcd = usb_create_hcd(&isp116x_hc_driver, dev, dev->bus_id);
+       hcd = usb_create_hcd(&isp116x_hc_driver, &pdev->dev, pdev->dev.bus_id);
        if (!hcd) {
                ret = -ENOMEM;
                goto err5;
@@ -1723,7 +1719,7 @@ static int __init isp116x_probe(struct device *dev)
        isp116x->addr_reg = addr_reg;
        spin_lock_init(&isp116x->lock);
        INIT_LIST_HEAD(&isp116x->async);
-       isp116x->board = dev->platform_data;
+       isp116x->board = pdev->dev.platform_data;
 
        if (!isp116x->board) {
                ERR("Platform data structure not initialized\n");
@@ -1764,13 +1760,13 @@ static int __init isp116x_probe(struct device *dev)
 /*
   Suspend of platform device
 */
-static int isp116x_suspend(struct device *dev, pm_message_t state)
+static int isp116x_suspend(struct platform_device *dev, pm_message_t state)
 {
        int ret = 0;
 
        VDBG("%s: state %x\n", __func__, state);
 
-       dev->power.power_state = state;
+       dev->dev.power.power_state = state;
 
        return ret;
 }
@@ -1778,13 +1774,13 @@ static int isp116x_suspend(struct device *dev, pm_message_t state)
 /*
   Resume platform device
 */
-static int isp116x_resume(struct device *dev)
+static int isp116x_resume(struct platform_device *dev)
 {
        int ret = 0;
 
-       VDBG("%s:  state %x\n", __func__, dev->power.power_state);
+       VDBG("%s:  state %x\n", __func__, dev->dev.power.power_state);
 
-       dev->power.power_state = PMSG_ON;
+       dev->dev.power.power_state = PMSG_ON;
 
        return ret;
 }
@@ -1796,13 +1792,14 @@ static int isp116x_resume(struct device *dev)
 
 #endif
 
-static struct device_driver isp116x_driver = {
-       .name = (char *)hcd_name,
-       .bus = &platform_bus_type,
+static struct platform_driver isp116x_driver = {
        .probe = isp116x_probe,
        .remove = isp116x_remove,
        .suspend = isp116x_suspend,
        .resume = isp116x_resume,
+       .driver = {
+               .name = (char *)hcd_name,
+       },
 };
 
 /*-----------------------------------------------------------------*/
@@ -1813,14 +1810,14 @@ static int __init isp116x_init(void)
                return -ENODEV;
 
        INFO("driver %s, %s\n", hcd_name, DRIVER_VERSION);
-       return driver_register(&isp116x_driver);
+       return platform_driver_register(&isp116x_driver);
 }
 
 module_init(isp116x_init);
 
 static void __exit isp116x_cleanup(void)
 {
-       driver_unregister(&isp116x_driver);
+       platform_driver_unregister(&isp116x_driver);
 }
 
 module_exit(isp116x_cleanup);
index f0c78cf14b6ca6b11ec98010986d54179c41a5b6..d9cf3b327d96e14a3a5840126cc404659a703f3f 100644 (file)
@@ -225,9 +225,8 @@ static const struct hc_driver ohci_au1xxx_hc_driver = {
 
 /*-------------------------------------------------------------------------*/
 
-static int ohci_hcd_au1xxx_drv_probe(struct device *dev)
+static int ohci_hcd_au1xxx_drv_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        int ret;
 
        pr_debug ("In ohci_hcd_au1xxx_drv_probe");
@@ -239,39 +238,37 @@ static int ohci_hcd_au1xxx_drv_probe(struct device *dev)
        return ret;
 }
 
-static int ohci_hcd_au1xxx_drv_remove(struct device *dev)
+static int ohci_hcd_au1xxx_drv_remove(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct usb_hcd *hcd = dev_get_drvdata(dev);
+       struct usb_hcd *hcd = platform_get_drvdata(pdev);
 
        usb_hcd_au1xxx_remove(hcd, pdev);
        return 0;
 }
        /*TBD*/
-/*static int ohci_hcd_au1xxx_drv_suspend(struct device *dev)
+/*static int ohci_hcd_au1xxx_drv_suspend(struct platform_device *dev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct usb_hcd *hcd = dev_get_drvdata(dev);
+       struct usb_hcd *hcd = platform_get_drvdata(dev);
 
        return 0;
 }
-static int ohci_hcd_au1xxx_drv_resume(struct device *dev)
+static int ohci_hcd_au1xxx_drv_resume(struct platform_device *dev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct usb_hcd *hcd = dev_get_drvdata(dev);
+       struct usb_hcd *hcd = platform_get_drvdata(dev);
 
        return 0;
 }
 */
 
-static struct device_driver ohci_hcd_au1xxx_driver = {
-       .name           = "au1xxx-ohci",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver ohci_hcd_au1xxx_driver = {
        .probe          = ohci_hcd_au1xxx_drv_probe,
        .remove         = ohci_hcd_au1xxx_drv_remove,
        /*.suspend      = ohci_hcd_au1xxx_drv_suspend, */
        /*.resume       = ohci_hcd_au1xxx_drv_resume, */
+       .driver         = {
+               .name   = "au1xxx-ohci",
+               .owner  = THIS_MODULE,
+       },
 };
 
 static int __init ohci_hcd_au1xxx_init (void)
@@ -280,12 +277,12 @@ static int __init ohci_hcd_au1xxx_init (void)
        pr_debug ("block sizes: ed %d td %d\n",
                sizeof (struct ed), sizeof (struct td));
 
-       return driver_register(&ohci_hcd_au1xxx_driver);
+       return platform_driver_register(&ohci_hcd_au1xxx_driver);
 }
 
 static void __exit ohci_hcd_au1xxx_cleanup (void)
 {
-       driver_unregister(&ohci_hcd_au1xxx_driver);
+       platform_driver_unregister(&ohci_hcd_au1xxx_driver);
 }
 
 module_init (ohci_hcd_au1xxx_init);
index 336c766c6e29f0334b52da96bc72103c4b0e8767..081ec3f5cff4e41572c7833890ce977e6736d9a8 100644 (file)
@@ -204,9 +204,8 @@ static const struct hc_driver ohci_lh7a404_hc_driver = {
 
 /*-------------------------------------------------------------------------*/
 
-static int ohci_hcd_lh7a404_drv_probe(struct device *dev)
+static int ohci_hcd_lh7a404_drv_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        int ret;
 
        pr_debug ("In ohci_hcd_lh7a404_drv_probe");
@@ -218,40 +217,38 @@ static int ohci_hcd_lh7a404_drv_probe(struct device *dev)
        return ret;
 }
 
-static int ohci_hcd_lh7a404_drv_remove(struct device *dev)
+static int ohci_hcd_lh7a404_drv_remove(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct usb_hcd *hcd = dev_get_drvdata(dev);
+       struct usb_hcd *hcd = platform_get_drvdata(dev);
 
        usb_hcd_lh7a404_remove(hcd, pdev);
        return 0;
 }
        /*TBD*/
-/*static int ohci_hcd_lh7a404_drv_suspend(struct device *dev)
+/*static int ohci_hcd_lh7a404_drv_suspend(struct platform_device *dev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct usb_hcd *hcd = dev_get_drvdata(dev);
+       struct usb_hcd *hcd = platform_get_drvdata(dev);
 
        return 0;
 }
-static int ohci_hcd_lh7a404_drv_resume(struct device *dev)
+static int ohci_hcd_lh7a404_drv_resume(struct platform_device *dev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct usb_hcd *hcd = dev_get_drvdata(dev);
+       struct usb_hcd *hcd = platform_get_drvdata(dev);
 
 
        return 0;
 }
 */
 
-static struct device_driver ohci_hcd_lh7a404_driver = {
-       .name           = "lh7a404-ohci",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver ohci_hcd_lh7a404_driver = {
        .probe          = ohci_hcd_lh7a404_drv_probe,
        .remove         = ohci_hcd_lh7a404_drv_remove,
        /*.suspend      = ohci_hcd_lh7a404_drv_suspend, */
        /*.resume       = ohci_hcd_lh7a404_drv_resume, */
+       .driver         = {
+               .name   = "lh7a404-ohci",
+               .owner  = THIS_MODULE,
+       },
 };
 
 static int __init ohci_hcd_lh7a404_init (void)
@@ -260,12 +257,12 @@ static int __init ohci_hcd_lh7a404_init (void)
        pr_debug ("block sizes: ed %d td %d\n",
                sizeof (struct ed), sizeof (struct td));
 
-       return driver_register(&ohci_hcd_lh7a404_driver);
+       return platform_driver_register(&ohci_hcd_lh7a404_driver);
 }
 
 static void __exit ohci_hcd_lh7a404_cleanup (void)
 {
-       driver_unregister(&ohci_hcd_lh7a404_driver);
+       platform_driver_unregister(&ohci_hcd_lh7a404_driver);
 }
 
 module_init (ohci_hcd_lh7a404_init);
index e46cc540cf4d3153fb49d9b942dfdf5652dc4f76..c9e29d80871194933651acf50605c445f6db7f90 100644 (file)
@@ -433,24 +433,22 @@ static const struct hc_driver ohci_omap_hc_driver = {
 
 /*-------------------------------------------------------------------------*/
 
-static int ohci_hcd_omap_drv_probe(struct device *dev)
+static int ohci_hcd_omap_drv_probe(struct platform_device *dev)
 {
-       return usb_hcd_omap_probe(&ohci_omap_hc_driver,
-                               to_platform_device(dev));
+       return usb_hcd_omap_probe(&ohci_omap_hc_driver, dev);
 }
 
-static int ohci_hcd_omap_drv_remove(struct device *dev)
+static int ohci_hcd_omap_drv_remove(struct platform_device *dev)
 {
-       struct platform_device  *pdev = to_platform_device(dev);
-       struct usb_hcd          *hcd = dev_get_drvdata(dev);
+       struct usb_hcd          *hcd = platform_get_drvdata(dev);
        struct ohci_hcd         *ohci = hcd_to_ohci (hcd);
 
-       usb_hcd_omap_remove(hcd, pdev);
+       usb_hcd_omap_remove(hcd, dev);
        if (ohci->transceiver) {
                (void) otg_set_host(ohci->transceiver, 0);
                put_device(ohci->transceiver->dev);
        }
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(dev, NULL);
 
        return 0;
 }
@@ -459,9 +457,9 @@ static int ohci_hcd_omap_drv_remove(struct device *dev)
 
 #ifdef CONFIG_PM
 
-static int ohci_omap_suspend(struct device *dev, pm_message_t message)
+static int ohci_omap_suspend(struct platform_device *dev, pm_message_t message)
 {
-       struct ohci_hcd *ohci = hcd_to_ohci(dev_get_drvdata(dev));
+       struct ohci_hcd *ohci = hcd_to_ohci(platform_get_drvdata(dev));
 
        if (time_before(jiffies, ohci->next_statechange))
                msleep(5);
@@ -473,9 +471,9 @@ static int ohci_omap_suspend(struct device *dev, pm_message_t message)
        return 0;
 }
 
-static int ohci_omap_resume(struct device *dev)
+static int ohci_omap_resume(struct platform_device *dev)
 {
-       struct ohci_hcd *ohci = hcd_to_ohci(dev_get_drvdata(dev));
+       struct ohci_hcd *ohci = hcd_to_ohci(platform_get_drvdata(dev));
 
        if (time_before(jiffies, ohci->next_statechange))
                msleep(5);
@@ -494,16 +492,17 @@ static int ohci_omap_resume(struct device *dev)
 /*
  * Driver definition to register with the OMAP bus
  */
-static struct device_driver ohci_hcd_omap_driver = {
-       .name           = "ohci",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver ohci_hcd_omap_driver = {
        .probe          = ohci_hcd_omap_drv_probe,
        .remove         = ohci_hcd_omap_drv_remove,
 #ifdef CONFIG_PM
        .suspend        = ohci_omap_suspend,
        .resume         = ohci_omap_resume,
 #endif
+       .driver         = {
+               .owner  = THIS_MODULE,
+               .name   = "ohci",
+       },
 };
 
 static int __init ohci_hcd_omap_init (void)
@@ -515,12 +514,12 @@ static int __init ohci_hcd_omap_init (void)
        pr_debug("%s: block sizes: ed %Zd td %Zd\n", hcd_name,
                sizeof (struct ed), sizeof (struct td));
 
-       return driver_register(&ohci_hcd_omap_driver);
+       return platform_driver_register(&ohci_hcd_omap_driver);
 }
 
 static void __exit ohci_hcd_omap_cleanup (void)
 {
-       driver_unregister(&ohci_hcd_omap_driver);
+       platform_driver_unregister(&ohci_hcd_omap_driver);
 }
 
 module_init (ohci_hcd_omap_init);
index 92cf6f4a13748ad9535e47d2ce827c6618aa3f75..18755766e406c7ae674bec5e0a408638fd373805 100644 (file)
@@ -172,9 +172,8 @@ static const struct hc_driver ohci_ppc_soc_hc_driver = {
        .start_port_reset =     ohci_start_port_reset,
 };
 
-static int ohci_hcd_ppc_soc_drv_probe(struct device *dev)
+static int ohci_hcd_ppc_soc_drv_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        int ret;
 
        if (usb_disabled())
@@ -184,25 +183,25 @@ static int ohci_hcd_ppc_soc_drv_probe(struct device *dev)
        return ret;
 }
 
-static int ohci_hcd_ppc_soc_drv_remove(struct device *dev)
+static int ohci_hcd_ppc_soc_drv_remove(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct usb_hcd *hcd = dev_get_drvdata(dev);
+       struct usb_hcd *hcd = platform_get_drvdata(dev);
 
        usb_hcd_ppc_soc_remove(hcd, pdev);
        return 0;
 }
 
-static struct device_driver ohci_hcd_ppc_soc_driver = {
-       .name           = "ppc-soc-ohci",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver ohci_hcd_ppc_soc_driver = {
        .probe          = ohci_hcd_ppc_soc_drv_probe,
        .remove         = ohci_hcd_ppc_soc_drv_remove,
 #ifdef CONFIG_PM
        /*.suspend      = ohci_hcd_ppc_soc_drv_suspend,*/
        /*.resume       = ohci_hcd_ppc_soc_drv_resume,*/
 #endif
+       .driver         = {
+               .name   = "ppc-soc-ohci",
+               .owner  = THIS_MODULE,
+       },
 };
 
 static int __init ohci_hcd_ppc_soc_init(void)
@@ -211,12 +210,12 @@ static int __init ohci_hcd_ppc_soc_init(void)
        pr_debug("block sizes: ed %d td %d\n", sizeof(struct ed),
                                                        sizeof(struct td));
 
-       return driver_register(&ohci_hcd_ppc_soc_driver);
+       return platform_driver_register(&ohci_hcd_ppc_soc_driver);
 }
 
 static void __exit ohci_hcd_ppc_soc_cleanup(void)
 {
-       driver_unregister(&ohci_hcd_ppc_soc_driver);
+       platform_driver_unregister(&ohci_hcd_ppc_soc_driver);
 }
 
 module_init(ohci_hcd_ppc_soc_init);
index 59e20568e8f947381753f590fdebf8b5467267bb..9d65ec30799012730f8f939f6996e9904477250d 100644 (file)
@@ -290,9 +290,8 @@ static const struct hc_driver ohci_pxa27x_hc_driver = {
 
 /*-------------------------------------------------------------------------*/
 
-static int ohci_hcd_pxa27x_drv_probe(struct device *dev)
+static int ohci_hcd_pxa27x_drv_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        int ret;
 
        pr_debug ("In ohci_hcd_pxa27x_drv_probe");
@@ -304,41 +303,39 @@ static int ohci_hcd_pxa27x_drv_probe(struct device *dev)
        return ret;
 }
 
-static int ohci_hcd_pxa27x_drv_remove(struct device *dev)
+static int ohci_hcd_pxa27x_drv_remove(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct usb_hcd *hcd = dev_get_drvdata(dev);
+       struct usb_hcd *hcd = platform_get_drvdata(pdev);
 
        usb_hcd_pxa27x_remove(hcd, pdev);
        return 0;
 }
 
-static int ohci_hcd_pxa27x_drv_suspend(struct device *dev, pm_message_t state)
+static int ohci_hcd_pxa27x_drv_suspend(struct platform_device *dev, pm_message_t state)
 {
-//     struct platform_device *pdev = to_platform_device(dev);
-//     struct usb_hcd *hcd = dev_get_drvdata(dev);
+//     struct usb_hcd *hcd = platform_get_drvdata(dev);
        printk("%s: not implemented yet\n", __FUNCTION__);
 
        return 0;
 }
 
-static int ohci_hcd_pxa27x_drv_resume(struct device *dev)
+static int ohci_hcd_pxa27x_drv_resume(struct platform_device *dev)
 {
-//     struct platform_device *pdev = to_platform_device(dev);
-//     struct usb_hcd *hcd = dev_get_drvdata(dev);
+//     struct usb_hcd *hcd = platform_get_drvdata(dev);
        printk("%s: not implemented yet\n", __FUNCTION__);
 
        return 0;
 }
 
 
-static struct device_driver ohci_hcd_pxa27x_driver = {
-       .name           = "pxa27x-ohci",
-       .bus            = &platform_bus_type,
+static struct platform_driver ohci_hcd_pxa27x_driver = {
        .probe          = ohci_hcd_pxa27x_drv_probe,
        .remove         = ohci_hcd_pxa27x_drv_remove,
        .suspend        = ohci_hcd_pxa27x_drv_suspend, 
-       .resume         = ohci_hcd_pxa27x_drv_resume, 
+       .resume         = ohci_hcd_pxa27x_drv_resume,
+       .driver         = {
+               .name   = "pxa27x-ohci",
+       },
 };
 
 static int __init ohci_hcd_pxa27x_init (void)
@@ -347,12 +344,12 @@ static int __init ohci_hcd_pxa27x_init (void)
        pr_debug ("block sizes: ed %d td %d\n",
                sizeof (struct ed), sizeof (struct td));
 
-       return driver_register(&ohci_hcd_pxa27x_driver);
+       return platform_driver_register(&ohci_hcd_pxa27x_driver);
 }
 
 static void __exit ohci_hcd_pxa27x_cleanup (void)
 {
-       driver_unregister(&ohci_hcd_pxa27x_driver);
+       platform_driver_unregister(&ohci_hcd_pxa27x_driver);
 }
 
 module_init (ohci_hcd_pxa27x_init);
index ee1fc605b402c438729871c87c536ee4b2343200..35cc9402adc03dcaceccfe6e6cdd1dd16a5a220c 100644 (file)
@@ -459,39 +459,38 @@ static const struct hc_driver ohci_s3c2410_hc_driver = {
 
 /* device driver */
 
-static int ohci_hcd_s3c2410_drv_probe(struct device *dev)
+static int ohci_hcd_s3c2410_drv_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        return usb_hcd_s3c2410_probe(&ohci_s3c2410_hc_driver, pdev);
 }
 
-static int ohci_hcd_s3c2410_drv_remove(struct device *dev)
+static int ohci_hcd_s3c2410_drv_remove(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct usb_hcd *hcd = dev_get_drvdata(dev);
+       struct usb_hcd *hcd = platform_get_drvdata(pdev);
 
        usb_hcd_s3c2410_remove(hcd, pdev);
        return 0;
 }
 
-static struct device_driver ohci_hcd_s3c2410_driver = {
-       .name           = "s3c2410-ohci",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver ohci_hcd_s3c2410_driver = {
        .probe          = ohci_hcd_s3c2410_drv_probe,
        .remove         = ohci_hcd_s3c2410_drv_remove,
        /*.suspend      = ohci_hcd_s3c2410_drv_suspend, */
        /*.resume       = ohci_hcd_s3c2410_drv_resume, */
+       .driver         = {
+               .owner  = THIS_MODULE,
+               .name   = "s3c2410-ohci",
+       },
 };
 
 static int __init ohci_hcd_s3c2410_init (void)
 {
-       return driver_register(&ohci_hcd_s3c2410_driver);
+       return platform_driver_register(&ohci_hcd_s3c2410_driver);
 }
 
 static void __exit ohci_hcd_s3c2410_cleanup (void)
 {
-       driver_unregister(&ohci_hcd_s3c2410_driver);
+       platform_driver_unregister(&ohci_hcd_s3c2410_driver);
 }
 
 module_init (ohci_hcd_s3c2410_init);
index 5607c0ae683569525358ed5eabeec8c47781eb6d..a7722a6a5a5b40cf7bf18dbd4fbfb75e4b15fe33 100644 (file)
@@ -1631,24 +1631,21 @@ static struct hc_driver sl811h_hc_driver = {
 /*-------------------------------------------------------------------------*/
 
 static int __devexit
-sl811h_remove(struct device *dev)
+sl811h_remove(struct platform_device *dev)
 {
-       struct usb_hcd          *hcd = dev_get_drvdata(dev);
+       struct usb_hcd          *hcd = platform_get_drvdata(dev);
        struct sl811            *sl811 = hcd_to_sl811(hcd);
-       struct platform_device  *pdev;
        struct resource         *res;
 
-       pdev = container_of(dev, struct platform_device, dev);
-
        remove_debug_file(sl811);
        usb_remove_hcd(hcd);
 
        /* some platforms may use IORESOURCE_IO */
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+       res = platform_get_resource(dev, IORESOURCE_MEM, 1);
        if (res)
                iounmap(sl811->data_reg);
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       res = platform_get_resource(dev, IORESOURCE_MEM, 0);
        if (res)
                iounmap(sl811->addr_reg);
 
@@ -1657,11 +1654,10 @@ sl811h_remove(struct device *dev)
 }
 
 static int __devinit
-sl811h_probe(struct device *dev)
+sl811h_probe(struct platform_device *dev)
 {
        struct usb_hcd          *hcd;
        struct sl811            *sl811;
-       struct platform_device  *pdev;
        struct resource         *addr, *data;
        int                     irq;
        void __iomem            *addr_reg;
@@ -1674,24 +1670,23 @@ sl811h_probe(struct device *dev)
         * specific platform_data.  we don't probe for IRQs, and do only
         * minimal sanity checking.
         */
-       pdev = container_of(dev, struct platform_device, dev);
-       irq = platform_get_irq(pdev, 0);
-       if (pdev->num_resources < 3 || irq < 0)
+       irq = platform_get_irq(dev, 0);
+       if (dev->num_resources < 3 || irq < 0)
                return -ENODEV;
 
        /* refuse to confuse usbcore */
-       if (dev->dma_mask) {
+       if (dev->dev.dma_mask) {
                DBG("no we won't dma\n");
                return -EINVAL;
        }
 
        /* the chip may be wired for either kind of addressing */
-       addr = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       data = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+       addr = platform_get_resource(dev, IORESOURCE_MEM, 0);
+       data = platform_get_resource(dev, IORESOURCE_MEM, 1);
        retval = -EBUSY;
        if (!addr || !data) {
-               addr = platform_get_resource(pdev, IORESOURCE_IO, 0);
-               data = platform_get_resource(pdev, IORESOURCE_IO, 1);
+               addr = platform_get_resource(dev, IORESOURCE_IO, 0);
+               data = platform_get_resource(dev, IORESOURCE_IO, 1);
                if (!addr || !data)
                        return -ENODEV;
                ioaddr = 1;
@@ -1713,7 +1708,7 @@ sl811h_probe(struct device *dev)
        }
 
        /* allocate and initialize hcd */
-       hcd = usb_create_hcd(&sl811h_hc_driver, dev, dev->bus_id);
+       hcd = usb_create_hcd(&sl811h_hc_driver, &dev->dev, dev->dev.bus_id);
        if (!hcd) {
                retval = -ENOMEM;
                goto err5;
@@ -1723,7 +1718,7 @@ sl811h_probe(struct device *dev)
 
        spin_lock_init(&sl811->lock);
        INIT_LIST_HEAD(&sl811->async);
-       sl811->board = dev->platform_data;
+       sl811->board = dev->dev.platform_data;
        init_timer(&sl811->timer);
        sl811->timer.function = sl811h_timer;
        sl811->timer.data = (unsigned long) sl811;
@@ -1785,9 +1780,9 @@ sl811h_probe(struct device *dev)
  */
 
 static int
-sl811h_suspend(struct device *dev, pm_message_t state)
+sl811h_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct usb_hcd  *hcd = dev_get_drvdata(dev);
+       struct usb_hcd  *hcd = platform_get_drvdata(dev);
        struct sl811    *sl811 = hcd_to_sl811(hcd);
        int             retval = 0;
 
@@ -1796,27 +1791,27 @@ sl811h_suspend(struct device *dev, pm_message_t state)
        else if (state.event == PM_EVENT_SUSPEND)
                port_power(sl811, 0);
        if (retval == 0)
-               dev->power.power_state = state;
+               dev->dev.power.power_state = state;
        return retval;
 }
 
 static int
-sl811h_resume(struct device *dev)
+sl811h_resume(struct platform_device *dev)
 {
-       struct usb_hcd  *hcd = dev_get_drvdata(dev);
+       struct usb_hcd  *hcd = platform_get_drvdata(dev);
        struct sl811    *sl811 = hcd_to_sl811(hcd);
 
        /* with no "check to see if VBUS is still powered" board hook,
         * let's assume it'd only be powered to enable remote wakeup.
         */
-       if (dev->power.power_state.event == PM_EVENT_SUSPEND
+       if (dev->dev.power.power_state.event == PM_EVENT_SUSPEND
                        || !hcd->can_wakeup) {
                sl811->port1 = 0;
                port_power(sl811, 1);
                return 0;
        }
 
-       dev->power.power_state = PMSG_ON;
+       dev->dev.power.power_state = PMSG_ON;
        return sl811h_bus_resume(hcd);
 }
 
@@ -1829,16 +1824,16 @@ sl811h_resume(struct device *dev)
 
 
 /* this driver is exported so sl811_cs can depend on it */
-struct device_driver sl811h_driver = {
-       .name =         (char *) hcd_name,
-       .bus =          &platform_bus_type,
-       .owner =        THIS_MODULE,
-
+struct platform_driver sl811h_driver = {
        .probe =        sl811h_probe,
        .remove =       __devexit_p(sl811h_remove),
 
        .suspend =      sl811h_suspend,
        .resume =       sl811h_resume,
+       .driver = {
+               .name = (char *) hcd_name,
+               .owner = THIS_MODULE,
+       },
 };
 EXPORT_SYMBOL(sl811h_driver);
 
@@ -1850,12 +1845,12 @@ static int __init sl811h_init(void)
                return -ENODEV;
 
        INFO("driver %s, %s\n", hcd_name, DRIVER_VERSION);
-       return driver_register(&sl811h_driver);
+       return platform_driver_register(&sl811h_driver);
 }
 module_init(sl811h_init);
 
 static void __exit sl811h_cleanup(void)
 {
-       driver_unregister(&sl811h_driver);
+       platform_driver_unregister(&sl811h_driver);
 }
 module_exit(sl811h_cleanup);
index 193b482570c7e9cc1ee41303ad67d5871b37db90..750cebb183063d6eee8b81c36daca65be32e2228 100644 (file)
@@ -1279,7 +1279,7 @@ free_unused_pages(unsigned int virtual_start, unsigned int virtual_end)
        printk("acornfb: freed %dK memory\n", mb_freed);
 }
 
-static int __init acornfb_probe(struct device *dev)
+static int __init acornfb_probe(struct platform_device *dev)
 {
        unsigned long size;
        u_int h_sync, v_sync;
@@ -1292,7 +1292,7 @@ static int __init acornfb_probe(struct device *dev)
 
        acornfb_init_fbinfo();
 
-       current_par.dev = dev;
+       current_par.dev = &dev->dev;
 
        if (current_par.montype == -1)
                current_par.montype = acornfb_detect_monitortype();
@@ -1453,15 +1453,16 @@ static int __init acornfb_probe(struct device *dev)
        return 0;
 }
 
-static struct device_driver acornfb_driver = {
-       .name   = "acornfb",
-       .bus    = &platform_bus_type,
+static struct platform_driver acornfb_driver = {
        .probe  = acornfb_probe,
+       .driver = {
+               .name   = "acornfb",
+       },
 };
 
 static int __init acornfb_init(void)
 {
-       return driver_register(&acornfb_driver);
+       return platform_driver_register(&acornfb_driver);
 }
 
 module_init(acornfb_init);
index a1fc8bbb1090bfe41bfd6bc8b64e4824bc6fe748..080db812ca487a1a4febf2c0781e58524485e213 100644 (file)
@@ -514,9 +514,8 @@ static struct fb_ops arcfb_ops = {
        .fb_ioctl       = arcfb_ioctl,
 };
 
-static int __init arcfb_probe(struct device *device)
+static int __init arcfb_probe(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(device);
        struct fb_info *info;
        int retval = -ENOMEM;
        int videomemorysize;
@@ -559,7 +558,7 @@ static int __init arcfb_probe(struct device *device)
        retval = register_framebuffer(info);
        if (retval < 0)
                goto err1;
-       dev_set_drvdata(&dev->dev, info);
+       platform_set_drvdata(dev, info);
        if (irq) {
                par->irq = irq;
                if (request_irq(par->irq, &arcfb_interrupt, SA_SHIRQ,
@@ -600,9 +599,9 @@ err:
        return retval;
 }
 
-static int arcfb_remove(struct device *device)
+static int arcfb_remove(struct platform_device *dev)
 {
-       struct fb_info *info = dev_get_drvdata(device);
+       struct fb_info *info = platform_get_drvdata(dev);
 
        if (info) {
                unregister_framebuffer(info);
@@ -612,11 +611,12 @@ static int arcfb_remove(struct device *device)
        return 0;
 }
 
-static struct device_driver arcfb_driver = {
-       .name   = "arcfb",
-       .bus    = &platform_bus_type,
+static struct platform_driver arcfb_driver = {
        .probe  = arcfb_probe,
        .remove = arcfb_remove,
+       .driver = {
+               .name   = "arcfb",
+       },
 };
 
 static struct platform_device *arcfb_device;
@@ -628,7 +628,7 @@ static int __init arcfb_init(void)
        if (!arcfb_enable)
                return -ENXIO;
 
-       ret = driver_register(&arcfb_driver);
+       ret = platform_driver_register(&arcfb_driver);
        if (!ret) {
                arcfb_device = platform_device_alloc("arcfb", 0);
                if (arcfb_device) {
@@ -638,7 +638,7 @@ static int __init arcfb_init(void)
                }
                if (ret) {
                        platform_device_put(arcfb_device);
-                       driver_unregister(&arcfb_driver);
+                       platform_driver_unregister(&arcfb_driver);
                }
        }
        return ret;
@@ -648,7 +648,7 @@ static int __init arcfb_init(void)
 static void __exit arcfb_exit(void)
 {
        platform_device_unregister(arcfb_device);
-       driver_unregister(&arcfb_driver);
+       platform_driver_unregister(&arcfb_driver);
 }
 
 module_param(num_cols, ulong, 0);
index bd9a6996aee72286c46ea369db7d57eea2f0da03..6a219b2c77e3d10a18200c5e0c2bca0791a5235a 100644 (file)
@@ -79,13 +79,13 @@ static void corgibl_blank(int blank)
 }
 
 #ifdef CONFIG_PM
-static int corgibl_suspend(struct device *dev, pm_message_t state)
+static int corgibl_suspend(struct platform_device *dev, pm_message_t state)
 {
        corgibl_blank(FB_BLANK_POWERDOWN);
        return 0;
 }
 
-static int corgibl_resume(struct device *dev)
+static int corgibl_resume(struct platform_device *dev)
 {
        corgibl_blank(FB_BLANK_UNBLANK);
        return 0;
@@ -143,9 +143,9 @@ static struct backlight_properties corgibl_data = {
 
 static struct backlight_device *corgi_backlight_device;
 
-static int __init corgibl_probe(struct device *dev)
+static int __init corgibl_probe(struct platform_device *pdev)
 {
-       struct corgibl_machinfo *machinfo = dev->platform_data;
+       struct corgibl_machinfo *machinfo = pdev->dev.platform_data;
 
        corgibl_data.max_brightness = machinfo->max_intensity;
        corgibl_mach_set_intensity = machinfo->set_bl_intensity;
@@ -162,7 +162,7 @@ static int __init corgibl_probe(struct device *dev)
        return 0;
 }
 
-static int corgibl_remove(struct device *dev)
+static int corgibl_remove(struct platform_device *dev)
 {
        backlight_device_unregister(corgi_backlight_device);
 
@@ -172,23 +172,24 @@ static int corgibl_remove(struct device *dev)
        return 0;
 }
 
-static struct device_driver corgibl_driver = {
-       .name           = "corgi-bl",
-       .bus            = &platform_bus_type,
+static struct platform_driver corgibl_driver = {
        .probe          = corgibl_probe,
        .remove         = corgibl_remove,
        .suspend        = corgibl_suspend,
        .resume         = corgibl_resume,
+       .driver         = {
+               .name   = "corgi-bl",
+       },
 };
 
 static int __init corgibl_init(void)
 {
-       return driver_register(&corgibl_driver);
+       return platform_driver_register(&corgibl_driver);
 }
 
 static void __exit corgibl_exit(void)
 {
-       driver_unregister(&corgibl_driver);
+       platform_driver_unregister(&corgibl_driver);
 }
 
 module_init(corgibl_init);
index 957a3ada2b75487c5188b65369ae3121d8866c20..5abd3cb006719447792760cfa822213605f4a664 100644 (file)
@@ -227,9 +227,8 @@ void dnfb_copyarea(struct fb_info *info, const struct fb_copyarea *area)
  * Initialization
  */
 
-static int __devinit dnfb_probe(struct device *device)
+static int __devinit dnfb_probe(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(device);
        struct fb_info *info;
        int err = 0;
 
@@ -257,7 +256,7 @@ static int __devinit dnfb_probe(struct device *device)
                framebuffer_release(info);
                return err;
        }
-       dev_set_drvdata(&dev->dev, info);
+       platform_set_drvdata(dev, info);
 
        /* now we have registered we can safely setup the hardware */
        out_8(AP_CONTROL_3A, RESET_CREG);
@@ -271,10 +270,11 @@ static int __devinit dnfb_probe(struct device *device)
        return err;
 }
 
-static struct device_driver dnfb_driver = {
-       .name   = "dnfb",
-       .bus    = &platform_bus_type,
+static struct platform_driver dnfb_driver = {
        .probe  = dnfb_probe,
+       .driver = {
+               .name   = "dnfb",
+       },
 };
 
 static struct platform_device dnfb_device = {
@@ -288,12 +288,12 @@ int __init dnfb_init(void)
        if (fb_get_options("dnfb", NULL))
                return -ENODEV;
 
-       ret = driver_register(&dnfb_driver);
+       ret = platform_driver_register(&dnfb_driver);
 
        if (!ret) {
                ret = platform_device_register(&dnfb_device);
                if (ret)
-                       driver_unregister(&dnfb_driver);
+                       platform_driver_unregister(&dnfb_driver);
        }
        return ret;
 }
index 6a81a1dd8f3d0bb357db89877bf53c8e4a745802..3b0e71383448a426dc979a008502d04f2dfacb6d 100644 (file)
@@ -609,9 +609,9 @@ static void epson1355fb_platform_release(struct device *device)
 {
 }
 
-static int epson1355fb_remove(struct device *device)
+static int epson1355fb_remove(struct platform_device *dev)
 {
-       struct fb_info *info = dev_get_drvdata(device);
+       struct fb_info *info = platform_get_drvdata(dev);
        struct epson1355_par *par = info->par;
 
        backlight_enable(0);
@@ -632,9 +632,8 @@ static int epson1355fb_remove(struct device *device)
        return 0;
 }
 
-int __init epson1355fb_probe(struct device *device)
+int __init epson1355fb_probe(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(device);
        struct epson1355_par *default_par;
        struct fb_info *info;
        u8 revision;
@@ -713,7 +712,7 @@ int __init epson1355fb_probe(struct device *device)
        /*
         * Our driver data.
         */
-       dev_set_drvdata(&dev->dev, info);
+       platform_set_drvdata(dev, info);
 
        printk(KERN_INFO "fb%d: %s frame buffer device\n",
               info->node, info->fix.id);
@@ -721,15 +720,16 @@ int __init epson1355fb_probe(struct device *device)
        return 0;
 
       bail:
-       epson1355fb_remove(device);
+       epson1355fb_remove(dev);
        return rc;
 }
 
-static struct device_driver epson1355fb_driver = {
-       .name   = "epson1355fb",
-       .bus    = &platform_bus_type,
+static struct platform_driver epson1355fb_driver = {
        .probe  = epson1355fb_probe,
        .remove = epson1355fb_remove,
+       .driver = {
+               .name   = "epson1355fb",
+       },
 };
 
 static struct platform_device epson1355fb_device = {
@@ -747,11 +747,11 @@ int __init epson1355fb_init(void)
        if (fb_get_options("epson1355fb", NULL))
                return -ENODEV;
 
-       ret = driver_register(&epson1355fb_driver);
+       ret = platform_driver_register(&epson1355fb_driver);
        if (!ret) {
                ret = platform_device_register(&epson1355fb_device);
                if (ret)
-                       driver_unregister(&epson1355fb_driver);
+                       platform_driver_unregister(&epson1355fb_driver);
        }
        return ret;
 }
@@ -762,7 +762,7 @@ module_init(epson1355fb_init);
 static void __exit epson1355fb_exit(void)
 {
        platform_device_unregister(&epson1355fb_device);
-       driver_unregister(&epson1355fb_driver);
+       platform_driver_unregister(&epson1355fb_driver);
 }
 
 /* ------------------------------------------------------------------------- */
index 9d5e4f342110acb4dbf34b3f8a835a2d1daaaf69..d744c51807b73af9420abaea6397f5f96afc7af3 100644 (file)
@@ -1105,12 +1105,11 @@ int __init gbefb_setup(char *options)
        return 0;
 }
 
-static int __init gbefb_probe(struct device *dev)
+static int __init gbefb_probe(struct platform_device *p_dev)
 {
        int i, ret = 0;
        struct fb_info *info;
        struct gbefb_par *par;
-       struct platform_device *p_dev = to_platform_device(dev);
 #ifndef MODULE
        char *options = NULL;
 #endif
@@ -1204,8 +1203,8 @@ static int __init gbefb_probe(struct device *dev)
                goto out_gbe_unmap;
        }
 
-       dev_set_drvdata(&p_dev->dev, info);
-       gbefb_create_sysfs(dev);
+       platform_set_drvdata(p_dev, info);
+       gbefb_create_sysfs(&p_dev->dev);
 
        printk(KERN_INFO "fb%d: %s rev %d @ 0x%08x using %dkB memory\n",
               info->node, info->fix.id, gbe_revision, (unsigned) GBE_BASE,
@@ -1231,10 +1230,9 @@ out_release_framebuffer:
        return ret;
 }
 
-static int __devexit gbefb_remove(struct device* dev)
+static int __devexit gbefb_remove(struct platform_device* p_dev)
 {
-       struct platform_device *p_dev = to_platform_device(dev);
-       struct fb_info *info = dev_get_drvdata(&p_dev->dev);
+       struct fb_info *info = platform_get_drvdata(p_dev);
 
        unregister_framebuffer(info);
        gbe_turn_off();
@@ -1252,18 +1250,19 @@ static int __devexit gbefb_remove(struct device* dev)
        return 0;
 }
 
-static struct device_driver gbefb_driver = {
-       .name = "gbefb",
-       .bus = &platform_bus_type,
+static struct platform_driver gbefb_driver = {
        .probe = gbefb_probe,
        .remove = __devexit_p(gbefb_remove),
+       .driver = {
+               .name = "gbefb",
+       },
 };
 
 static struct platform_device *gbefb_device;
 
 int __init gbefb_init(void)
 {
-       int ret = driver_register(&gbefb_driver);
+       int ret = platform_driver_register(&gbefb_driver);
        if (!ret) {
                gbefb_device = platform_device_alloc("gbefb", 0);
                if (gbefb_device) {
@@ -1273,7 +1272,7 @@ int __init gbefb_init(void)
                }
                if (ret) {
                        platform_device_put(gbefb_device);
-                       driver_unregister(&gbefb_driver);
+                       platform_driver_unregister(&gbefb_driver);
                }
        }
        return ret;
@@ -1282,7 +1281,7 @@ int __init gbefb_init(void)
 void __exit gbefb_exit(void)
 {
        platform_device_unregister(gbefb_device);
-       driver_unregister(&gbefb_driver);
+       platform_driver_unregister(&gbefb_driver);
 }
 
 module_init(gbefb_init);
index e20b9f3a255fb65b99e3a0fd37d276cbbbb8957d..5924cc225c95d2f736935a3eb11744e46e17df29 100644 (file)
@@ -423,18 +423,18 @@ static void imxfb_setup_gpio(struct imxfb_info *fbi)
  * Power management hooks.  Note that we won't be called from IRQ context,
  * unlike the blank functions above, so we may sleep.
  */
-static int imxfb_suspend(struct device *dev, pm_message_t state)
+static int imxfb_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct imxfb_info *fbi = dev_get_drvdata(dev);
+       struct imxfb_info *fbi = platform_get_drvdata(dev);
        pr_debug("%s\n",__FUNCTION__);
 
        imxfb_disable_controller(fbi);
        return 0;
 }
 
-static int imxfb_resume(struct device *dev)
+static int imxfb_resume(struct platform_device *dev)
 {
-       struct imxfb_info *fbi = dev_get_drvdata(dev);
+       struct imxfb_info *fbi = platform_get_drvdata(dev);
        pr_debug("%s\n",__FUNCTION__);
 
        imxfb_enable_controller(fbi);
@@ -538,9 +538,8 @@ static int __init imxfb_map_video_memory(struct fb_info *info)
        return fbi->map_cpu ? 0 : -ENOMEM;
 }
 
-static int __init imxfb_probe(struct device *dev)
+static int __init imxfb_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        struct imxfb_info *fbi;
        struct fb_info *info;
        struct imxfb_mach_info *inf;
@@ -553,21 +552,21 @@ static int __init imxfb_probe(struct device *dev)
        if(!res)
                return -ENODEV;
 
-       inf = dev->platform_data;
+       inf = pdev->dev.platform_data;
        if(!inf) {
                dev_err(dev,"No platform_data available\n");
                return -ENOMEM;
        }
 
-       info = framebuffer_alloc(sizeof(struct imxfb_info), dev);
+       info = framebuffer_alloc(sizeof(struct imxfb_info), &pdev->dev);
        if(!info)
                return -ENOMEM;
 
        fbi = info->par;
 
-       dev_set_drvdata(dev, info);
+       platform_set_drvdata(pdev, info);
 
-       ret = imxfb_init_fbinfo(dev);
+       ret = imxfb_init_fbinfo(&pdev->dev);
        if( ret < 0 )
                goto failed_init;
 
@@ -621,22 +620,21 @@ failed_register:
        fb_dealloc_cmap(&info->cmap);
 failed_cmap:
        if (!inf->fixed_screen_cpu)
-               dma_free_writecombine(dev,fbi->map_size,fbi->map_cpu,
+               dma_free_writecombine(&pdev->dev,fbi->map_size,fbi->map_cpu,
                           fbi->map_dma);
 failed_map:
        kfree(info->pseudo_palette);
 failed_regs:
        release_mem_region(res->start, res->end - res->start);
 failed_init:
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(pdev, NULL);
        framebuffer_release(info);
        return ret;
 }
 
-static int imxfb_remove(struct device *dev)
+static int imxfb_remove(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct fb_info *info = dev_get_drvdata(dev);
+       struct fb_info *info = platform_get_drvdata(pdev);
        struct imxfb_info *fbi = info->par;
        struct resource *res;
 
@@ -651,36 +649,37 @@ static int imxfb_remove(struct device *dev)
        framebuffer_release(info);
 
        release_mem_region(res->start, res->end - res->start + 1);
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(pdev, NULL);
 
        return 0;
 }
 
-void  imxfb_shutdown(struct device * dev)
+void  imxfb_shutdown(struct platform_device * dev)
 {
-       struct fb_info *info = dev_get_drvdata(dev);
+       struct fb_info *info = platform_get_drvdata(dev);
        struct imxfb_info *fbi = info->par;
        imxfb_disable_controller(fbi);
 }
 
-static struct device_driver imxfb_driver = {
-       .name           = "imx-fb",
-       .bus            = &platform_bus_type,
+static struct platform_driver imxfb_driver = {
        .probe          = imxfb_probe,
        .suspend        = imxfb_suspend,
        .resume         = imxfb_resume,
        .remove         = imxfb_remove,
        .shutdown       = imxfb_shutdown,
+       .driver         = {
+               .name   = "imx-fb",
+       },
 };
 
 int __init imxfb_init(void)
 {
-       return driver_register(&imxfb_driver);
+       return platform_driver_register(&imxfb_driver);
 }
 
 static void __exit imxfb_cleanup(void)
 {
-       driver_unregister(&imxfb_driver);
+       platform_driver_unregister(&imxfb_driver);
 }
 
 module_init(imxfb_init);
index f305a5b77b23f8db3311315349a5cb24041ad37f..7b4cd250bec8fd9fca0bf6961b8a21a96a4902f6 100644 (file)
@@ -980,17 +980,17 @@ pxafb_freq_policy(struct notifier_block *nb, unsigned long val, void *data)
  * Power management hooks.  Note that we won't be called from IRQ context,
  * unlike the blank functions above, so we may sleep.
  */
-static int pxafb_suspend(struct device *dev, pm_message_t state)
+static int pxafb_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct pxafb_info *fbi = dev_get_drvdata(dev);
+       struct pxafb_info *fbi = platform_get_drvdata(dev);
 
        set_ctrlr_state(fbi, C_DISABLE_PM);
        return 0;
 }
 
-static int pxafb_resume(struct device *dev)
+static int pxafb_resume(struct platform_device *dev)
 {
-       struct pxafb_info *fbi = dev_get_drvdata(dev);
+       struct pxafb_info *fbi = platform_get_drvdata(dev);
 
        set_ctrlr_state(fbi, C_ENABLE_PM);
        return 0;
@@ -1268,7 +1268,7 @@ static int __init pxafb_parse_options(struct device *dev, char *options)
 }
 #endif
 
-int __init pxafb_probe(struct device *dev)
+int __init pxafb_probe(struct platform_device *dev)
 {
        struct pxafb_info *fbi;
        struct pxafb_mach_info *inf;
@@ -1276,14 +1276,14 @@ int __init pxafb_probe(struct device *dev)
 
        dev_dbg(dev, "pxafb_probe\n");
 
-       inf = dev->platform_data;
+       inf = dev->dev.platform_data;
        ret = -ENOMEM;
        fbi = NULL;
        if (!inf)
                goto failed;
 
 #ifdef CONFIG_FB_PXA_PARAMETERS
-       ret = pxafb_parse_options(dev, g_options);
+       ret = pxafb_parse_options(&dev->dev, g_options);
        if (ret < 0)
                goto failed;
 #endif
@@ -1293,36 +1293,36 @@ int __init pxafb_probe(struct device *dev)
         * a warning is given. */
 
         if (inf->lccr0 & LCCR0_INVALID_CONFIG_MASK)
-                dev_warn(dev, "machine LCCR0 setting contains illegal bits: %08x\n",
+                dev_warn(&dev->dev, "machine LCCR0 setting contains illegal bits: %08x\n",
                         inf->lccr0 & LCCR0_INVALID_CONFIG_MASK);
         if (inf->lccr3 & LCCR3_INVALID_CONFIG_MASK)
-                dev_warn(dev, "machine LCCR3 setting contains illegal bits: %08x\n",
+                dev_warn(&dev->dev, "machine LCCR3 setting contains illegal bits: %08x\n",
                         inf->lccr3 & LCCR3_INVALID_CONFIG_MASK);
         if (inf->lccr0 & LCCR0_DPD &&
            ((inf->lccr0 & LCCR0_PAS) != LCCR0_Pas ||
             (inf->lccr0 & LCCR0_SDS) != LCCR0_Sngl ||
             (inf->lccr0 & LCCR0_CMS) != LCCR0_Mono))
-                dev_warn(dev, "Double Pixel Data (DPD) mode is only valid in passive mono"
+                dev_warn(&dev->dev, "Double Pixel Data (DPD) mode is only valid in passive mono"
                         " single panel mode\n");
         if ((inf->lccr0 & LCCR0_PAS) == LCCR0_Act &&
            (inf->lccr0 & LCCR0_SDS) == LCCR0_Dual)
-                dev_warn(dev, "Dual panel only valid in passive mode\n");
+                dev_warn(&dev->dev, "Dual panel only valid in passive mode\n");
         if ((inf->lccr0 & LCCR0_PAS) == LCCR0_Pas &&
              (inf->upper_margin || inf->lower_margin))
-                dev_warn(dev, "Upper and lower margins must be 0 in passive mode\n");
+                dev_warn(&dev->dev, "Upper and lower margins must be 0 in passive mode\n");
 #endif
 
-       dev_dbg(dev, "got a %dx%dx%d LCD\n",inf->xres, inf->yres, inf->bpp);
+       dev_dbg(&dev->dev, "got a %dx%dx%d LCD\n",inf->xres, inf->yres, inf->bpp);
        if (inf->xres == 0 || inf->yres == 0 || inf->bpp == 0) {
-               dev_err(dev, "Invalid resolution or bit depth\n");
+               dev_err(&dev->dev, "Invalid resolution or bit depth\n");
                ret = -EINVAL;
                goto failed;
        }
        pxafb_backlight_power = inf->pxafb_backlight_power;
        pxafb_lcd_power = inf->pxafb_lcd_power;
-       fbi = pxafb_init_fbinfo(dev);
+       fbi = pxafb_init_fbinfo(&dev->dev);
        if (!fbi) {
-               dev_err(dev, "Failed to initialize framebuffer device\n");
+               dev_err(&dev->dev, "Failed to initialize framebuffer device\n");
                ret = -ENOMEM; // only reason for pxafb_init_fbinfo to fail is kmalloc
                goto failed;
        }
@@ -1330,14 +1330,14 @@ int __init pxafb_probe(struct device *dev)
        /* Initialize video memory */
        ret = pxafb_map_video_memory(fbi);
        if (ret) {
-               dev_err(dev, "Failed to allocate video RAM: %d\n", ret);
+               dev_err(&dev->dev, "Failed to allocate video RAM: %d\n", ret);
                ret = -ENOMEM;
                goto failed;
        }
 
        ret = request_irq(IRQ_LCD, pxafb_handle_irq, SA_INTERRUPT, "LCD", fbi);
        if (ret) {
-               dev_err(dev, "request_irq failed: %d\n", ret);
+               dev_err(&dev->dev, "request_irq failed: %d\n", ret);
                ret = -EBUSY;
                goto failed;
        }
@@ -1349,11 +1349,11 @@ int __init pxafb_probe(struct device *dev)
        pxafb_check_var(&fbi->fb.var, &fbi->fb);
        pxafb_set_par(&fbi->fb);
 
-       dev_set_drvdata(dev, fbi);
+       platform_set_drvdata(dev, fbi);
 
        ret = register_framebuffer(&fbi->fb);
        if (ret < 0) {
-               dev_err(dev, "Failed to register framebuffer device: %d\n", ret);
+               dev_err(&dev->dev, "Failed to register framebuffer device: %d\n", ret);
                goto failed;
        }
 
@@ -1376,19 +1376,20 @@ int __init pxafb_probe(struct device *dev)
        return 0;
 
 failed:
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(dev, NULL);
        kfree(fbi);
        return ret;
 }
 
-static struct device_driver pxafb_driver = {
-       .name           = "pxa2xx-fb",
-       .bus            = &platform_bus_type,
+static struct platform_driver pxafb_driver = {
        .probe          = pxafb_probe,
 #ifdef CONFIG_PM
        .suspend        = pxafb_suspend,
        .resume         = pxafb_resume,
 #endif
+       .driver         = {
+               .name   = "pxa2xx-fb",
+       },
 };
 
 #ifndef MODULE
@@ -1415,7 +1416,7 @@ int __devinit pxafb_init(void)
                return -ENODEV;
        pxafb_setup(option);
 #endif
-       return driver_register(&pxafb_driver);
+       return platform_driver_register(&pxafb_driver);
 }
 
 module_init(pxafb_init);
index bfc41f2c902a2d93576b3a86f051b927a4e692bd..fc91dbf896d2697b305b95fb6ad03c43852e34a0 100644 (file)
@@ -86,9 +86,8 @@ static struct fb_ops q40fb_ops = {
        .fb_imageblit   = cfb_imageblit,
 };
 
-static int __init q40fb_probe(struct device *device)
+static int __init q40fb_probe(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(device);
        struct fb_info *info;
 
        if (!MACH_IS_Q40)
@@ -128,10 +127,11 @@ static int __init q40fb_probe(struct device *device)
        return 0;
 }
 
-static struct device_driver q40fb_driver = {
-       .name   = "q40fb",
-       .bus    = &platform_bus_type,
+static struct platform_driver q40fb_driver = {
        .probe  = q40fb_probe,
+       .driver = {
+               .name   = "q40fb",
+       },
 };
 
 static struct platform_device q40fb_device = {
@@ -145,12 +145,12 @@ int __init q40fb_init(void)
        if (fb_get_options("q40fb", NULL))
                return -ENODEV;
 
-       ret = driver_register(&q40fb_driver);
+       ret = platform_driver_register(&q40fb_driver);
 
        if (!ret) {
                ret = platform_device_register(&q40fb_device);
                if (ret)
-                       driver_unregister(&q40fb_driver);
+                       platform_driver_unregister(&q40fb_driver);
        }
        return ret;
 }
index 3edbd14c5c469565500ce970866d2ef24ee86453..e5d0f92eeae36613314f4bd347f9090777c07a02 100644 (file)
@@ -503,10 +503,9 @@ s1d13xxxfb_fetch_hw_state(struct fb_info *info)
 
 
 static int
-s1d13xxxfb_remove(struct device *dev)
+s1d13xxxfb_remove(struct platform_device *pdev)
 {
-       struct fb_info *info = dev_get_drvdata(dev);
-       struct platform_device *pdev = to_platform_device(dev);
+       struct fb_info *info = platform_get_drvdata(pdev);
        struct s1d13xxxfb_par *par = NULL;
 
        if (info) {
@@ -534,9 +533,8 @@ s1d13xxxfb_remove(struct device *dev)
 }
 
 static int __devinit
-s1d13xxxfb_probe(struct device *dev)
+s1d13xxxfb_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        struct s1d13xxxfb_par *default_par;
        struct fb_info *info;
        struct s1d13xxxfb_pdata *pdata = NULL;
@@ -548,8 +546,8 @@ s1d13xxxfb_probe(struct device *dev)
        printk(KERN_INFO "Epson S1D13XXX FB Driver\n");
 
        /* enable platform-dependent hardware glue, if any */
-       if (dev->platform_data)
-               pdata = dev->platform_data;
+       if (pdev->dev.platform_data)
+               pdata = pdev->dev.platform_data;
 
        if (pdata && pdata->platform_init_video)
                pdata->platform_init_video();
@@ -572,14 +570,14 @@ s1d13xxxfb_probe(struct device *dev)
 
        if (!request_mem_region(pdev->resource[0].start,
                pdev->resource[0].end - pdev->resource[0].start +1, "s1d13xxxfb mem")) {
-               dev_dbg(dev, "request_mem_region failed\n");
+               dev_dbg(&pdev->dev, "request_mem_region failed\n");
                ret = -EBUSY;
                goto bail;
        }
 
        if (!request_mem_region(pdev->resource[1].start,
                pdev->resource[1].end - pdev->resource[1].start +1, "s1d13xxxfb regs")) {
-               dev_dbg(dev, "request_mem_region failed\n");
+               dev_dbg(&pdev->dev, "request_mem_region failed\n");
                ret = -EBUSY;
                goto bail;
        }
@@ -640,7 +638,7 @@ s1d13xxxfb_probe(struct device *dev)
                goto bail;
        }
 
-       dev_set_drvdata(&pdev->dev, info);
+       platform_set_drvdata(pdev, info);
 
        printk(KERN_INFO "fb%d: %s frame buffer device\n",
               info->node, info->fix.id);
@@ -648,15 +646,15 @@ s1d13xxxfb_probe(struct device *dev)
        return 0;
 
 bail:
-       s1d13xxxfb_remove(dev);
+       s1d13xxxfb_remove(pdev);
        return ret;
 
 }
 
 #ifdef CONFIG_PM
-static int s1d13xxxfb_suspend(struct device *dev, pm_message_t state)
+static int s1d13xxxfb_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct fb_info *info = dev_get_drvdata(dev);
+       struct fb_info *info = platform_get_drvdata(dev);
        struct s1d13xxxfb_par *s1dfb = info->par;
        struct s1d13xxxfb_pdata *pdata = NULL;
 
@@ -664,8 +662,8 @@ static int s1d13xxxfb_suspend(struct device *dev, pm_message_t state)
        lcd_enable(s1dfb, 0);
        crt_enable(s1dfb, 0);
 
-       if (dev->platform_data)
-               pdata = dev->platform_data;
+       if (dev->dev.platform_data)
+               pdata = dev->dev.platform_data;
 
 #if 0
        if (!s1dfb->disp_save)
@@ -701,9 +699,9 @@ static int s1d13xxxfb_suspend(struct device *dev, pm_message_t state)
                return 0;
 }
 
-static int s1d13xxxfb_resume(struct device *dev)
+static int s1d13xxxfb_resume(struct platform_device *dev)
 {
-       struct fb_info *info = dev_get_drvdata(dev);
+       struct fb_info *info = platform_get_drvdata(dev);
        struct s1d13xxxfb_par *s1dfb = info->par;
        struct s1d13xxxfb_pdata *pdata = NULL;
 
@@ -714,8 +712,8 @@ static int s1d13xxxfb_resume(struct device *dev)
        while ((s1d13xxxfb_readreg(s1dfb, S1DREG_PS_STATUS) & 0x01))
                udelay(10);
 
-       if (dev->platform_data)
-               pdata = dev->platform_data;
+       if (dev->dev.platform_data)
+               pdata = dev->dev.platform_data;
 
        if (s1dfb->regs_save) {
                /* will write RO regs, *should* get away with it :) */
@@ -741,15 +739,16 @@ static int s1d13xxxfb_resume(struct device *dev)
 }
 #endif /* CONFIG_PM */
 
-static struct device_driver s1d13xxxfb_driver = {
-       .name           = S1D_DEVICENAME,
-       .bus            = &platform_bus_type,
+static struct platform_driver s1d13xxxfb_driver = {
        .probe          = s1d13xxxfb_probe,
        .remove         = s1d13xxxfb_remove,
 #ifdef CONFIG_PM
        .suspend        = s1d13xxxfb_suspend,
-       .resume         = s1d13xxxfb_resume
+       .resume         = s1d13xxxfb_resume,
 #endif
+       .driver         = {
+               .name   = S1D_DEVICENAME,
+       },
 };
 
 
@@ -759,14 +758,14 @@ s1d13xxxfb_init(void)
        if (fb_get_options("s1d13xxxfb", NULL))
                return -ENODEV;
 
-       return driver_register(&s1d13xxxfb_driver);
+       return platform_driver_register(&s1d13xxxfb_driver);
 }
 
 
 static void __exit
 s1d13xxxfb_exit(void)
 {
-       driver_unregister(&s1d13xxxfb_driver);
+       platform_driver_unregister(&s1d13xxxfb_driver);
 }
 
 module_init(s1d13xxxfb_init);
index 855a6778b9eba115879bdbde91d4372f414b9d81..ce6e749db3a7aa5433401833e28ee5b56f4ad135 100644 (file)
@@ -634,19 +634,18 @@ static irqreturn_t s3c2410fb_irq(int irq, void *dev_id, struct pt_regs *r)
 
 static char driver_name[]="s3c2410fb";
 
-int __init s3c2410fb_probe(struct device *dev)
+int __init s3c2410fb_probe(struct platform_device *pdev)
 {
        struct s3c2410fb_info *info;
        struct fb_info     *fbinfo;
-       struct platform_device *pdev = to_platform_device(dev);
        struct s3c2410fb_hw *mregs;
        int ret;
        int irq;
        int i;
 
-       mach_info = dev->platform_data;
+       mach_info = pdev->dev.platform_data;
        if (mach_info == NULL) {
-               dev_err(dev,"no platform data for lcd, cannot attach\n");
+               dev_err(&pdev->dev,"no platform data for lcd, cannot attach\n");
                return -EINVAL;
        }
 
@@ -654,11 +653,11 @@ int __init s3c2410fb_probe(struct device *dev)
 
        irq = platform_get_irq(pdev, 0);
        if (irq < 0) {
-               dev_err(dev, "no irq for device\n");
+               dev_err(&pdev->dev, "no irq for device\n");
                return -ENOENT;
        }
 
-       fbinfo = framebuffer_alloc(sizeof(struct s3c2410fb_info), dev);
+       fbinfo = framebuffer_alloc(sizeof(struct s3c2410fb_info), &pdev->dev);
        if (!fbinfo) {
                return -ENOMEM;
        }
@@ -666,7 +665,7 @@ int __init s3c2410fb_probe(struct device *dev)
 
        info = fbinfo->par;
        info->fb = fbinfo;
-       dev_set_drvdata(dev, fbinfo);
+       platform_set_drvdata(pdev, fbinfo);
 
        s3c2410fb_init_registers(info);
 
@@ -676,7 +675,7 @@ int __init s3c2410fb_probe(struct device *dev)
 
        memcpy(&info->regs, &mach_info->regs, sizeof(info->regs));
 
-       info->mach_info             = dev->platform_data;
+       info->mach_info             = pdev->dev.platform_data;
 
        fbinfo->fix.type            = FB_TYPE_PACKED_PIXELS;
        fbinfo->fix.type_aux        = 0;
@@ -735,7 +734,7 @@ int __init s3c2410fb_probe(struct device *dev)
 
        ret = request_irq(irq, s3c2410fb_irq, SA_INTERRUPT, pdev->name, info);
        if (ret) {
-               dev_err(dev, "cannot get irq %d - err %d\n", irq, ret);
+               dev_err(&pdev->dev, "cannot get irq %d - err %d\n", irq, ret);
                ret = -EBUSY;
                goto release_mem;
        }
@@ -773,7 +772,7 @@ int __init s3c2410fb_probe(struct device *dev)
        }
 
        /* create device files */
-       device_create_file(dev, &dev_attr_debug);
+       device_create_file(&pdev->dev, &dev_attr_debug);
 
        printk(KERN_INFO "fb%d: %s frame buffer device\n",
                fbinfo->node, fbinfo->fix.id);
@@ -816,10 +815,9 @@ static void s3c2410fb_stop_lcd(void)
 /*
  *  Cleanup
  */
-static int s3c2410fb_remove(struct device *dev)
+static int s3c2410fb_remove(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct fb_info     *fbinfo = dev_get_drvdata(dev);
+       struct fb_info     *fbinfo = platform_get_drvdata(pdev);
        struct s3c2410fb_info *info = fbinfo->par;
        int irq;
 
@@ -847,9 +845,9 @@ static int s3c2410fb_remove(struct device *dev)
 
 /* suspend and resume support for the lcd controller */
 
-static int s3c2410fb_suspend(struct device *dev, pm_message_t state)
+static int s3c2410fb_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct fb_info     *fbinfo = dev_get_drvdata(dev);
+       struct fb_info     *fbinfo = platform_get_drvdata(dev);
        struct s3c2410fb_info *info = fbinfo->par;
 
        s3c2410fb_stop_lcd();
@@ -864,9 +862,9 @@ static int s3c2410fb_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int s3c2410fb_resume(struct device *dev)
+static int s3c2410fb_resume(struct platform_device *dev)
 {
-       struct fb_info     *fbinfo = dev_get_drvdata(dev);
+       struct fb_info     *fbinfo = platform_get_drvdata(dev);
        struct s3c2410fb_info *info = fbinfo->par;
 
        clk_enable(info->clk);
@@ -882,24 +880,25 @@ static int s3c2410fb_resume(struct device *dev)
 #define s3c2410fb_resume  NULL
 #endif
 
-static struct device_driver s3c2410fb_driver = {
-       .name           = "s3c2410-lcd",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver s3c2410fb_driver = {
        .probe          = s3c2410fb_probe,
+       .remove         = s3c2410fb_remove,
        .suspend        = s3c2410fb_suspend,
        .resume         = s3c2410fb_resume,
-       .remove         = s3c2410fb_remove
+       .driver         = {
+               .name   = "s3c2410-lcd",
+               .owner  = THIS_MODULE,
+       },
 };
 
 int __devinit s3c2410fb_init(void)
 {
-       return driver_register(&s3c2410fb_driver);
+       return platform_driver_register(&s3c2410fb_driver);
 }
 
 static void __exit s3c2410fb_cleanup(void)
 {
-       driver_unregister(&s3c2410fb_driver);
+       platform_driver_unregister(&s3c2410fb_driver);
 }
 
 
index a5184575cfae1696da0709d7db4298d638d93c94..2ea1354e439ff2d5e65a412fe2dbc1dfe41132c0 100644 (file)
@@ -1308,17 +1308,17 @@ sa1100fb_freq_policy(struct notifier_block *nb, unsigned long val,
  * Power management hooks.  Note that we won't be called from IRQ context,
  * unlike the blank functions above, so we may sleep.
  */
-static int sa1100fb_suspend(struct device *dev, pm_message_t state)
+static int sa1100fb_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct sa1100fb_info *fbi = dev_get_drvdata(dev);
+       struct sa1100fb_info *fbi = platform_get_drvdata(dev);
 
        set_ctrlr_state(fbi, C_DISABLE_PM);
        return 0;
 }
 
-static int sa1100fb_resume(struct device *dev)
+static int sa1100fb_resume(struct platform_device *dev)
 {
-       struct sa1100fb_info *fbi = dev_get_drvdata(dev);
+       struct sa1100fb_info *fbi = platform_get_drvdata(dev);
 
        set_ctrlr_state(fbi, C_ENABLE_PM);
        return 0;
@@ -1452,7 +1452,7 @@ static struct sa1100fb_info * __init sa1100fb_init_fbinfo(struct device *dev)
        return fbi;
 }
 
-static int __init sa1100fb_probe(struct device *dev)
+static int __init sa1100fb_probe(struct platform_device *pdev)
 {
        struct sa1100fb_info *fbi;
        int ret;
@@ -1460,7 +1460,7 @@ static int __init sa1100fb_probe(struct device *dev)
        if (!request_mem_region(0xb0100000, 0x10000, "LCD"))
                return -EBUSY;
 
-       fbi = sa1100fb_init_fbinfo(dev);
+       fbi = sa1100fb_init_fbinfo(&pdev->dev);
        ret = -ENOMEM;
        if (!fbi)
                goto failed;
@@ -1488,7 +1488,7 @@ static int __init sa1100fb_probe(struct device *dev)
         */
        sa1100fb_check_var(&fbi->fb.var, &fbi->fb);
 
-       dev_set_drvdata(dev, fbi);
+       platform_set_drvdata(pdev, fbi);
 
        ret = register_framebuffer(&fbi->fb);
        if (ret < 0)
@@ -1505,18 +1505,19 @@ static int __init sa1100fb_probe(struct device *dev)
        return 0;
 
 failed:
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(pdev, NULL);
        kfree(fbi);
        release_mem_region(0xb0100000, 0x10000);
        return ret;
 }
 
-static struct device_driver sa1100fb_driver = {
-       .name           = "sa11x0-fb",
-       .bus            = &platform_bus_type,
+static struct platform_driver sa1100fb_driver = {
        .probe          = sa1100fb_probe,
        .suspend        = sa1100fb_suspend,
        .resume         = sa1100fb_resume,
+       .driver         = {
+               .name   = "sa11x0-fb",
+       },
 };
 
 int __init sa1100fb_init(void)
@@ -1524,7 +1525,7 @@ int __init sa1100fb_init(void)
        if (fb_get_options("sa1100fb", NULL))
                return -ENODEV;
 
-       return driver_register(&sa1100fb_driver);
+       return platform_driver_register(&sa1100fb_driver);
 }
 
 int __init sa1100fb_setup(char *options)
index 2e8769dd345a8ec0cedf06b3e7a0c1a857c3a19a..7054660767e46eb90326b506b4b7b518c87d19ee 100644 (file)
@@ -750,9 +750,8 @@ int __init sgivwfb_setup(char *options)
 /*
  *  Initialisation
  */
-static int __init sgivwfb_probe(struct device *device)
+static int __init sgivwfb_probe(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(device);
        struct sgivw_par *par;
        struct fb_info *info;
        char *monitor;
@@ -813,7 +812,7 @@ static int __init sgivwfb_probe(struct device *device)
                goto fail_register_framebuffer;
        }
 
-       dev_set_drvdata(&dev->dev, info);
+       platform_set_drvdata(dev, info);
 
        printk(KERN_INFO "fb%d: SGI DBE frame buffer device, using %ldK of video memory at %#lx\n",      
                info->node, sgivwfb_mem_size >> 10, sgivwfb_mem_phys);
@@ -831,9 +830,9 @@ fail_ioremap_regs:
        return -ENXIO;
 }
 
-static int sgivwfb_remove(struct device *device)
+static int sgivwfb_remove(struct platform_device *dev)
 {
-       struct fb_info *info = dev_get_drvdata(device);
+       struct fb_info *info = platform_get_drvdata(dev);
 
        if (info) {
                struct sgivw_par *par = info->par;
@@ -847,11 +846,12 @@ static int sgivwfb_remove(struct device *device)
        return 0;
 }
 
-static struct device_driver sgivwfb_driver = {
-       .name   = "sgivwfb",
-       .bus    = &platform_bus_type,
+static struct platform_driver sgivwfb_driver = {
        .probe  = sgivwfb_probe,
        .remove = sgivwfb_remove,
+       .driver = {
+               .name   = "sgivwfb",
+       },
 };
 
 static struct platform_device *sgivwfb_device;
@@ -867,7 +867,7 @@ int __init sgivwfb_init(void)
                return -ENODEV;
        sgivwfb_setup(option);
 #endif
-       ret = driver_register(&sgivwfb_driver);
+       ret = platform_driver_register(&sgivwfb_driver);
        if (!ret) {
                sgivwfb_device = platform_device_alloc("sgivwfb", 0);
                if (sgivwfb_device) {
@@ -875,7 +875,7 @@ int __init sgivwfb_init(void)
                } else
                        ret = -ENOMEM;
                if (ret) {
-                       driver_unregister(&sgivwfb_driver);
+                       platform_driver_unregister(&sgivwfb_driver);
                        platform_device_put(sgivwfb_device);
                }
        }
@@ -890,7 +890,7 @@ MODULE_LICENSE("GPL");
 static void __exit sgivwfb_exit(void)
 {
        platform_device_unregister(sgivwfb_device);
-       driver_unregister(&sgivwfb_driver);
+       platform_driver_unregister(&sgivwfb_driver);
 }
 
 module_exit(sgivwfb_exit);
index e25eae1a78c1de86e9f1f7f25103c12708c63a38..2c3aa2fcfd917e5098c465ab97836ba90037c3a5 100644 (file)
@@ -245,9 +245,8 @@ static int __init vesafb_setup(char *options)
        return 0;
 }
 
-static int __init vesafb_probe(struct device *device)
+static int __init vesafb_probe(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(device);
        struct fb_info *info;
        int i, err;
        unsigned int size_vmode;
@@ -480,10 +479,11 @@ err:
        return err;
 }
 
-static struct device_driver vesafb_driver = {
-       .name   = "vesafb",
-       .bus    = &platform_bus_type,
+static struct platform_driver vesafb_driver = {
        .probe  = vesafb_probe,
+       .driver = {
+               .name   = "vesafb",
+       },
 };
 
 static struct platform_device vesafb_device = {
@@ -498,12 +498,12 @@ static int __init vesafb_init(void)
        /* ignore error return of fb_get_options */
        fb_get_options("vesafb", &option);
        vesafb_setup(option);
-       ret = driver_register(&vesafb_driver);
+       ret = platform_driver_register(&vesafb_driver);
 
        if (!ret) {
                ret = platform_device_register(&vesafb_device);
                if (ret)
-                       driver_unregister(&vesafb_driver);
+                       platform_driver_unregister(&vesafb_driver);
        }
        return ret;
 }
index 8794dc5d24667527fdd838481bd5f18f4b3482eb..ffa1ad474226c5e121486ba8c0f4f87c8bc91f70 100644 (file)
@@ -403,9 +403,8 @@ static void vfb_platform_release(struct device *device)
        // This is called when the reference count goes to zero.
 }
 
-static int __init vfb_probe(struct device *device)
+static int __init vfb_probe(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(device);
        struct fb_info *info;
        int retval = -ENOMEM;
 
@@ -447,7 +446,7 @@ static int __init vfb_probe(struct device *device)
        retval = register_framebuffer(info);
        if (retval < 0)
                goto err2;
-       dev_set_drvdata(&dev->dev, info);
+       platform_set_drvdata(dev, info);
 
        printk(KERN_INFO
               "fb%d: Virtual frame buffer device, using %ldK of video memory\n",
@@ -462,9 +461,9 @@ err:
        return retval;
 }
 
-static int vfb_remove(struct device *device)
+static int vfb_remove(struct platform_device *dev)
 {
-       struct fb_info *info = dev_get_drvdata(device);
+       struct fb_info *info = platform_get_drvdata(dev);
 
        if (info) {
                unregister_framebuffer(info);
@@ -474,11 +473,12 @@ static int vfb_remove(struct device *device)
        return 0;
 }
 
-static struct device_driver vfb_driver = {
-       .name   = "vfb",
-       .bus    = &platform_bus_type,
+static struct platform_driver vfb_driver = {
        .probe  = vfb_probe,
        .remove = vfb_remove,
+       .driver = {
+               .name   = "vfb",
+       },
 };
 
 static struct platform_device vfb_device = {
@@ -504,12 +504,12 @@ static int __init vfb_init(void)
        if (!vfb_enable)
                return -ENXIO;
 
-       ret = driver_register(&vfb_driver);
+       ret = platform_driver_register(&vfb_driver);
 
        if (!ret) {
                ret = platform_device_register(&vfb_device);
                if (ret)
-                       driver_unregister(&vfb_driver);
+                       platform_driver_unregister(&vfb_driver);
        }
        return ret;
 }
@@ -520,7 +520,7 @@ module_init(vfb_init);
 static void __exit vfb_exit(void)
 {
        platform_device_unregister(&vfb_device);
-       driver_unregister(&vfb_driver);
+       platform_driver_unregister(&vfb_driver);
 }
 
 module_exit(vfb_exit);
index 48e70f153c4b23857aea147451418547c431f87f..daa46051f55df8ea5b77f2c5245d677e0ed5c179 100644 (file)
@@ -437,9 +437,9 @@ static void w100fb_restore_vidmem(struct w100fb_par *par)
        }
 }
 
-static int w100fb_suspend(struct device *dev, pm_message_t state)
+static int w100fb_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct fb_info *info = dev_get_drvdata(dev);
+       struct fb_info *info = platform_get_drvdata(dev);
        struct w100fb_par *par=info->par;
        struct w100_tg_info *tg = par->mach->tg;
 
@@ -452,9 +452,9 @@ static int w100fb_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int w100fb_resume(struct device *dev)
+static int w100fb_resume(struct platform_device *dev)
 {
-       struct fb_info *info = dev_get_drvdata(dev);
+       struct fb_info *info = platform_get_drvdata(dev);
        struct w100fb_par *par=info->par;
        struct w100_tg_info *tg = par->mach->tg;
 
@@ -473,13 +473,12 @@ static int w100fb_resume(struct device *dev)
 #endif
 
 
-int __init w100fb_probe(struct device *dev)
+int __init w100fb_probe(struct platform_device *pdev)
 {
        int err = -EIO;
        struct w100fb_mach_info *inf;
        struct fb_info *info = NULL;
        struct w100fb_par *par;
-       struct platform_device *pdev = to_platform_device(dev);
        struct resource *mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        unsigned int chip_id;
 
@@ -522,9 +521,9 @@ int __init w100fb_probe(struct device *dev)
        }
 
        par = info->par;
-       dev_set_drvdata(dev, info);
+       platform_set_drvdata(pdev, info);
 
-       inf = dev->platform_data;
+       inf = pdev->dev.platform_data;
        par->chip_id = chip_id;
        par->mach = inf;
        par->fastpll_mode = 0;
@@ -600,10 +599,10 @@ int __init w100fb_probe(struct device *dev)
                goto out;
        }
 
-       device_create_file(dev, &dev_attr_fastpllclk);
-       device_create_file(dev, &dev_attr_reg_read);
-       device_create_file(dev, &dev_attr_reg_write);
-       device_create_file(dev, &dev_attr_flip);
+       device_create_file(&pdev->dev, &dev_attr_fastpllclk);
+       device_create_file(&pdev->dev, &dev_attr_reg_read);
+       device_create_file(&pdev->dev, &dev_attr_reg_write);
+       device_create_file(&pdev->dev, &dev_attr_flip);
 
        printk(KERN_INFO "fb%d: %s frame buffer device\n", info->node, info->fix.id);
        return 0;
@@ -622,15 +621,15 @@ out:
 }
 
 
-static int w100fb_remove(struct device *dev)
+static int w100fb_remove(struct platform_device *pdev)
 {
-       struct fb_info *info = dev_get_drvdata(dev);
+       struct fb_info *info = platform_get_drvdata(pdev);
        struct w100fb_par *par=info->par;
 
-       device_remove_file(dev, &dev_attr_fastpllclk);
-       device_remove_file(dev, &dev_attr_reg_read);
-       device_remove_file(dev, &dev_attr_reg_write);
-       device_remove_file(dev, &dev_attr_flip);
+       device_remove_file(&pdev->dev, &dev_attr_fastpllclk);
+       device_remove_file(&pdev->dev, &dev_attr_reg_read);
+       device_remove_file(&pdev->dev, &dev_attr_reg_write);
+       device_remove_file(&pdev->dev, &dev_attr_flip);
 
        unregister_framebuffer(info);
 
@@ -1448,23 +1447,24 @@ static void w100_vsync(void)
        writel(0x00000002, remapped_regs + mmGEN_INT_STATUS);
 }
 
-static struct device_driver w100fb_driver = {
-       .name           = "w100fb",
-       .bus            = &platform_bus_type,
+static struct platform_driver w100fb_driver = {
        .probe          = w100fb_probe,
        .remove         = w100fb_remove,
        .suspend        = w100fb_suspend,
        .resume         = w100fb_resume,
+       .driver         = {
+               .name   = "w100fb",
+       },
 };
 
 int __devinit w100fb_init(void)
 {
-       return driver_register(&w100fb_driver);
+       return platform_driver_register(&w100fb_driver);
 }
 
 void __exit w100fb_cleanup(void)
 {
-       driver_unregister(&w100fb_driver);
+       platform_driver_unregister(&w100fb_driver);
 }
 
 module_init(w100fb_init);
index 79d8c47323093508bf0b78223712e60115c81386..19a099b62cd6aae4100129e52bfa1679e0bba9e8 100644 (file)
@@ -14,8 +14,6 @@
 /* The vDSO location. We have to use the same value as x86 for glibc's
  * sake :-)
  */
-#ifdef __powerpc64__
 #define AT_SYSINFO_EHDR                33
-#endif
 
 #endif
index feac3458d71f693a9a31b31f263f5b0106978fc8..3dcd65edf97805daf4f496fc4ecaf83f3cfe81f1 100644 (file)
@@ -269,14 +269,12 @@ extern int dcache_bsize;
 extern int icache_bsize;
 extern int ucache_bsize;
 
-#ifdef __powerpc64__
+/* vDSO has arch_setup_additional_pages */
+#define ARCH_HAS_SETUP_ADDITIONAL_PAGES
 struct linux_binprm;
-#define ARCH_HAS_SETUP_ADDITIONAL_PAGES        /* vDSO has arch_setup_additional_pages */
-extern int arch_setup_additional_pages(struct linux_binprm *bprm, int executable_stack);
+extern int arch_setup_additional_pages(struct linux_binprm *bprm,
+                                      int executable_stack);
 #define VDSO_AUX_ENT(a,b) NEW_AUX_ENT(a,b);
-#else
-#define VDSO_AUX_ENT(a,b)
-#endif /* __powerpc64__ */
 
 /*
  * The requirements here are:
index c9fbcede0ef9faf5773db4d69663e8b7c3661d52..8eb7e857ec4cd167176c78b644ee046a6fbe09b5 100644 (file)
@@ -389,6 +389,7 @@ extern u64 ppc64_interrupt_controller;
 #define        SIU_INT_TIMER4          ((uint)0x0f + CPM_IRQ_OFFSET)
 #define        SIU_INT_TMCNT           ((uint)0x10 + CPM_IRQ_OFFSET)
 #define        SIU_INT_PIT             ((uint)0x11 + CPM_IRQ_OFFSET)
+#define        SIU_INT_PCI             ((uint)0x12 + CPM_IRQ_OFFSET)
 #define        SIU_INT_IRQ1            ((uint)0x13 + CPM_IRQ_OFFSET)
 #define        SIU_INT_IRQ2            ((uint)0x14 + CPM_IRQ_OFFSET)
 #define        SIU_INT_IRQ3            ((uint)0x15 + CPM_IRQ_OFFSET)
index f6f186b56b0f57966733f945db65fd42525232d5..d12382d292d421931234e1d59007e4f070bf376b 100644 (file)
@@ -177,8 +177,8 @@ struct thread_struct {
 #ifdef CONFIG_PPC64
        unsigned long   start_tb;       /* Start purr when proc switched in */
        unsigned long   accum_tb;       /* Total accumilated purr for process */
-       unsigned long   vdso_base;      /* base of the vDSO library */
 #endif
+       unsigned long   vdso_base;      /* base of the vDSO library */
        unsigned long   dabr;           /* Data address breakpoint register */
 #ifdef CONFIG_ALTIVEC
        /* Complete AltiVec register set */
index 58d2aab416f8f21f7574acedeefaeffcf43878b8..ba1b34fdb967e86c7cd761f8e91c2317cd5adf36 100644 (file)
@@ -8,8 +8,8 @@
  * MAX_PHYSMEM_BITS            2^N: how much memory we can have in that space
  */
 #define SECTION_SIZE_BITS       24
-#define MAX_PHYSADDR_BITS       38
-#define MAX_PHYSMEM_BITS        36
+#define MAX_PHYSADDR_BITS       44
+#define MAX_PHYSMEM_BITS        44
 
 #ifdef CONFIG_MEMORY_HOTPLUG
 extern void create_section_mapping(unsigned long start, unsigned long end);
diff --git a/include/asm-powerpc/systemcfg.h b/include/asm-powerpc/systemcfg.h
deleted file mode 100644 (file)
index 36b5cbe..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-#ifndef _SYSTEMCFG_H
-#define _SYSTEMCFG_H
-
-/*
- * Copyright (C) 2002 Peter Bergner <bergner@vnet.ibm.com>, IBM
- *
- * 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; either version
- * 2 of the License, or (at your option) any later version.
- */
-
-/* Change Activity:
- * 2002/09/30 : bergner  : Created
- * End Change Activity
- */
-
-/*
- * If the major version changes we are incompatible.
- * Minor version changes are a hint.
- */
-#define SYSTEMCFG_MAJOR 1
-#define SYSTEMCFG_MINOR 1
-
-#ifndef __ASSEMBLY__
-
-#include <linux/unistd.h>
-
-#define SYSCALL_MAP_SIZE      ((__NR_syscalls + 31) / 32)
-
-struct systemcfg {
-       __u8  eye_catcher[16];          /* Eyecatcher: SYSTEMCFG:PPC64  0x00 */
-       struct {                        /* Systemcfg version numbers         */
-               __u32 major;            /* Major number                 0x10 */
-               __u32 minor;            /* Minor number                 0x14 */
-       } version;
-
-       __u32 platform;                 /* Platform flags               0x18 */
-       __u32 processor;                /* Processor type               0x1C */
-       __u64 processorCount;           /* # of physical processors     0x20 */
-       __u64 physicalMemorySize;       /* Size of real memory(B)       0x28 */
-       __u64 tb_orig_stamp;            /* Timebase at boot             0x30 */
-       __u64 tb_ticks_per_sec;         /* Timebase tics / sec          0x38 */
-       __u64 tb_to_xs;                 /* Inverse of TB to 2^20        0x40 */
-       __u64 stamp_xsec;               /*                              0x48 */
-       __u64 tb_update_count;          /* Timebase atomicity ctr       0x50 */
-       __u32 tz_minuteswest;           /* Minutes west of Greenwich    0x58 */
-       __u32 tz_dsttime;               /* Type of dst correction       0x5C */
-       /* next four are no longer used except to be exported to /proc */
-       __u32 dcache_size;              /* L1 d-cache size              0x60 */
-       __u32 dcache_line_size;         /* L1 d-cache line size         0x64 */
-       __u32 icache_size;              /* L1 i-cache size              0x68 */
-       __u32 icache_line_size;         /* L1 i-cache line size         0x6C */
-       __u32 syscall_map_64[SYSCALL_MAP_SIZE]; /* map of available syscalls 0x70 */
-       __u32 syscall_map_32[SYSCALL_MAP_SIZE]; /* map of available syscalls */
-};
-
-#ifdef __KERNEL__
-extern struct systemcfg *_systemcfg; /* to be renamed */
-#endif
-
-#endif /* __ASSEMBLY__ */
-
-#endif /* _SYSTEMCFG_H */
index 2512e3836bf4de90ba130054b7a889920ab5031b..015d28746e1b0a8e0590db4fcd80c991570d2295 100644 (file)
@@ -9,15 +9,7 @@
 
 static inline int cpu_to_node(int cpu)
 {
-       int node;
-
-       node = numa_cpu_lookup_table[cpu];
-
-#ifdef DEBUG_NUMA
-       BUG_ON(node == -1);
-#endif
-
-       return node;
+       return numa_cpu_lookup_table[cpu];
 }
 
 #define parent_node(node)      (node)
@@ -37,8 +29,6 @@ static inline int node_to_first_cpu(int node)
 #define pcibus_to_node(node)    (-1)
 #define pcibus_to_cpumask(bus) (cpu_online_map)
 
-#define nr_cpus_node(node)     (nr_cpus_in_node[node])
-
 /* sched_domains SD_NODE_INIT for PPC64 machines */
 #define SD_NODE_INIT (struct sched_domain) {           \
        .span                   = CPU_MASK_NONE,        \
diff --git a/include/asm-powerpc/udbg.h b/include/asm-powerpc/udbg.h
new file mode 100644 (file)
index 0000000..a383383
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * c 2001 PPC 64 Team, IBM Corp
+ *
+ * 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; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#ifndef _ASM_POWERPC_UDBG_H
+#define _ASM_POWERPC_UDBG_H
+
+#include <linux/compiler.h>
+#include <linux/init.h>
+
+extern void (*udbg_putc)(unsigned char c);
+extern unsigned char (*udbg_getc)(void);
+extern int (*udbg_getc_poll)(void);
+
+extern void udbg_puts(const char *s);
+extern int udbg_write(const char *s, int n);
+extern int udbg_read(char *buf, int buflen);
+
+extern void register_early_udbg_console(void);
+extern void udbg_printf(const char *fmt, ...);
+
+extern void udbg_init_uart(void __iomem *comport, unsigned int speed);
+
+struct device_node;
+extern void udbg_init_scc(struct device_node *np);
+#endif /* _ASM_POWERPC_UDBG_H */
diff --git a/include/asm-powerpc/vdso.h b/include/asm-powerpc/vdso.h
new file mode 100644 (file)
index 0000000..85d8a7b
--- /dev/null
@@ -0,0 +1,83 @@
+#ifndef __PPC64_VDSO_H__
+#define __PPC64_VDSO_H__
+
+#ifdef __KERNEL__
+
+/* Default link addresses for the vDSOs */
+#define VDSO32_LBASE   0x100000
+#define VDSO64_LBASE   0x100000
+
+/* Default map addresses */
+#define VDSO32_MBASE   VDSO32_LBASE
+#define VDSO64_MBASE   VDSO64_LBASE
+
+#define VDSO_VERSION_STRING    LINUX_2.6.12
+
+/* Define if 64 bits VDSO has procedure descriptors */
+#undef VDS64_HAS_DESCRIPTORS
+
+#ifndef __ASSEMBLY__
+
+extern unsigned int vdso64_pages;
+extern unsigned int vdso32_pages;
+
+/* Offsets relative to thread->vdso_base */
+extern unsigned long vdso64_rt_sigtramp;
+extern unsigned long vdso32_sigtramp;
+extern unsigned long vdso32_rt_sigtramp;
+
+extern void vdso_init(void);
+
+#else /* __ASSEMBLY__ */
+
+#ifdef __VDSO64__
+#ifdef VDS64_HAS_DESCRIPTORS
+#define V_FUNCTION_BEGIN(name)         \
+       .globl name;                    \
+        .section ".opd","a";           \
+        .align 3;                      \
+       name:                           \
+       .quad .name,.TOC.@tocbase,0;    \
+       .previous;                      \
+       .globl .name;                   \
+       .type .name,@function;          \
+       .name:                          \
+
+#define V_FUNCTION_END(name)           \
+       .size .name,.-.name;
+
+#define V_LOCAL_FUNC(name) (.name)
+
+#else /* VDS64_HAS_DESCRIPTORS */
+
+#define V_FUNCTION_BEGIN(name)         \
+       .globl name;                    \
+       name:                           \
+
+#define V_FUNCTION_END(name)           \
+       .size name,.-name;
+
+#define V_LOCAL_FUNC(name) (name)
+
+#endif /* VDS64_HAS_DESCRIPTORS */
+#endif /* __VDSO64__ */
+
+#ifdef __VDSO32__
+
+#define V_FUNCTION_BEGIN(name)         \
+       .globl name;                    \
+       .type name,@function;           \
+       name:                           \
+
+#define V_FUNCTION_END(name)           \
+       .size name,.-name;
+
+#define V_LOCAL_FUNC(name) (name)
+
+#endif /* __VDSO32__ */
+
+#endif /* __ASSEMBLY__ */
+
+#endif /* __KERNEL__ */
+
+#endif /* __PPC64_VDSO_H__ */
diff --git a/include/asm-powerpc/vdso_datapage.h b/include/asm-powerpc/vdso_datapage.h
new file mode 100644 (file)
index 0000000..fc323b5
--- /dev/null
@@ -0,0 +1,108 @@
+#ifndef _VDSO_DATAPAGE_H
+#define _VDSO_DATAPAGE_H
+
+/*
+ * Copyright (C) 2002 Peter Bergner <bergner@vnet.ibm.com>, IBM
+ * Copyright (C) 2005 Benjamin Herrenschmidy <benh@kernel.crashing.org>,
+ *                   IBM Corp.
+ *
+ * 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; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+
+/*
+ * Note about this structure:
+ *
+ * This structure was historically called systemcfg and exposed to
+ * userland via /proc/ppc64/systemcfg. Unfortunately, this became an
+ * ABI issue as some proprietary software started relying on being able
+ * to mmap() it, thus we have to keep the base layout at least for a
+ * few kernel versions.
+ *
+ * However, since ppc32 doesn't suffer from this backward handicap,
+ * a simpler version of the data structure is used there with only the
+ * fields actually used by the vDSO.
+ *
+ */
+
+/*
+ * If the major version changes we are incompatible.
+ * Minor version changes are a hint.
+ */
+#define SYSTEMCFG_MAJOR 1
+#define SYSTEMCFG_MINOR 1
+
+#ifndef __ASSEMBLY__
+
+#include <linux/unistd.h>
+
+#define SYSCALL_MAP_SIZE      ((__NR_syscalls + 31) / 32)
+
+/*
+ * So here is the ppc64 backward compatible version
+ */
+
+#ifdef CONFIG_PPC64
+
+struct vdso_data {
+       __u8  eye_catcher[16];          /* Eyecatcher: SYSTEMCFG:PPC64  0x00 */
+       struct {                        /* Systemcfg version numbers         */
+               __u32 major;            /* Major number                 0x10 */
+               __u32 minor;            /* Minor number                 0x14 */
+       } version;
+
+       __u32 platform;                 /* Platform flags               0x18 */
+       __u32 processor;                /* Processor type               0x1C */
+       __u64 processorCount;           /* # of physical processors     0x20 */
+       __u64 physicalMemorySize;       /* Size of real memory(B)       0x28 */
+       __u64 tb_orig_stamp;            /* Timebase at boot             0x30 */
+       __u64 tb_ticks_per_sec;         /* Timebase tics / sec          0x38 */
+       __u64 tb_to_xs;                 /* Inverse of TB to 2^20        0x40 */
+       __u64 stamp_xsec;               /*                              0x48 */
+       __u64 tb_update_count;          /* Timebase atomicity ctr       0x50 */
+       __u32 tz_minuteswest;           /* Minutes west of Greenwich    0x58 */
+       __u32 tz_dsttime;               /* Type of dst correction       0x5C */
+       __u32 dcache_size;              /* L1 d-cache size              0x60 */
+       __u32 dcache_line_size;         /* L1 d-cache line size         0x64 */
+       __u32 icache_size;              /* L1 i-cache size              0x68 */
+       __u32 icache_line_size;         /* L1 i-cache line size         0x6C */
+
+       /* those additional ones don't have to be located anywhere
+        * special as they were not part of the original systemcfg
+        */
+       __s64 wtom_clock_sec;                   /* Wall to monotonic clock */
+       __s32 wtom_clock_nsec;
+       __u32 syscall_map_64[SYSCALL_MAP_SIZE]; /* map of syscalls  */
+       __u32 syscall_map_32[SYSCALL_MAP_SIZE]; /* map of syscalls */
+};
+
+#else /* CONFIG_PPC64 */
+
+/*
+ * And here is the simpler 32 bits version
+ */
+struct vdso_data {
+       __u64 tb_orig_stamp;            /* Timebase at boot             0x30 */
+       __u64 tb_ticks_per_sec;         /* Timebase tics / sec          0x38 */
+       __u64 tb_to_xs;                 /* Inverse of TB to 2^20        0x40 */
+       __u64 stamp_xsec;               /*                              0x48 */
+       __u32 tb_update_count;          /* Timebase atomicity ctr       0x50 */
+       __u32 tz_minuteswest;           /* Minutes west of Greenwich    0x58 */
+       __u32 tz_dsttime;               /* Type of dst correction       0x5C */
+       __s32 wtom_clock_sec;                   /* Wall to monotonic clock */
+       __s32 wtom_clock_nsec;
+       __u32 syscall_map_32[SYSCALL_MAP_SIZE]; /* map of syscalls */
+};
+
+#endif /* CONFIG_PPC64 */
+
+#ifdef __KERNEL__
+extern struct vdso_data *vdso_data;
+#endif
+
+#endif /* __ASSEMBLY__ */
+
+#endif /* _SYSTEMCFG_H */
index fc44f7ca62d7699977e39918b543dbd658ea0d23..538e0c8ab2434758682d44d4e234e9f595b7ef6a 100644 (file)
@@ -1,9 +1,12 @@
 #ifndef _PPC_PAGE_H
 #define _PPC_PAGE_H
 
+#include <linux/config.h>
+#include <asm/asm-compat.h>
+
 /* PAGE_SHIFT determines the page size */
 #define PAGE_SHIFT     12
-#define PAGE_SIZE      (1UL << PAGE_SHIFT)
+#define PAGE_SIZE      (ASM_CONST(1) << PAGE_SHIFT)
 
 /*
  * Subtle: this is an int (not an unsigned long) and so it
@@ -169,5 +172,8 @@ extern __inline__ int get_order(unsigned long size)
 #define VM_DATA_DEFAULT_FLAGS  (VM_READ | VM_WRITE | VM_EXEC | \
                                 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
 
+/* We do define AT_SYSINFO_EHDR but don't use the gate mecanism */
+#define __HAVE_ARCH_GATE_AREA          1
+
 #endif /* __KERNEL__ */
 #endif /* _PPC_PAGE_H */
index 15e777ce0f4ab66fe61f64ff4fed055c4a86d7fc..54958d6cae0440353ade0ff8a73f8668a52e5bac 100644 (file)
@@ -8,15 +8,14 @@
 #define _ASM_MMZONE_H_
 
 #include <linux/config.h>
-#include <asm/smp.h>
 
-/* generic non-linear memory support:
+/*
+ * generic non-linear memory support:
  *
  * 1) we will not split memory into more chunks than will fit into the
  *    flags field of the struct page
  */
 
-
 #ifdef CONFIG_NEED_MULTIPLE_NODES
 
 extern struct pglist_data *node_data[];
@@ -30,44 +29,11 @@ extern struct pglist_data *node_data[];
  */
 
 extern int numa_cpu_lookup_table[];
-extern char *numa_memory_lookup_table;
 extern cpumask_t numa_cpumask_lookup_table[];
-extern int nr_cpus_in_node[];
 #ifdef CONFIG_MEMORY_HOTPLUG
 extern unsigned long max_pfn;
 #endif
 
-/* 16MB regions */
-#define MEMORY_INCREMENT_SHIFT 24
-#define MEMORY_INCREMENT (1UL << MEMORY_INCREMENT_SHIFT)
-
-/* NUMA debugging, will not work on a DLPAR machine */
-#undef DEBUG_NUMA
-
-static inline int pa_to_nid(unsigned long pa)
-{
-       int nid;
-
-#ifdef CONFIG_MEMORY_HOTPLUG
-       /* kludge hot added sections default to node 0 */
-       if (pa >= (max_pfn << PAGE_SHIFT))
-               return 0;
-#endif
-       nid = numa_memory_lookup_table[pa >> MEMORY_INCREMENT_SHIFT];
-
-#ifdef DEBUG_NUMA
-       /* the physical address passed in is not in the map for the system */
-       if (nid == -1) {
-               printk("bad address: %lx\n", pa);
-               BUG();
-       }
-#endif
-
-       return nid;
-}
-
-#define node_localnr(pfn, nid) ((pfn) - NODE_DATA(nid)->node_start_pfn)
-
 /*
  * Following are macros that each numa implmentation must define.
  */
@@ -75,39 +41,10 @@ static inline int pa_to_nid(unsigned long pa)
 #define node_start_pfn(nid)    (NODE_DATA(nid)->node_start_pfn)
 #define node_end_pfn(nid)      (NODE_DATA(nid)->node_end_pfn)
 
-#ifdef CONFIG_DISCONTIGMEM
-
-/*
- * Given a kernel address, find the home node of the underlying memory.
- */
-#define kvaddr_to_nid(kaddr)   pa_to_nid(__pa(kaddr))
-
-#define pfn_to_nid(pfn)                pa_to_nid((unsigned long)(pfn) << PAGE_SHIFT)
-
-/* Written this way to avoid evaluating arguments twice */
-#define discontigmem_pfn_to_page(pfn) \
-({ \
-       unsigned long __tmp = pfn; \
-       (NODE_DATA(pfn_to_nid(__tmp))->node_mem_map + \
-        node_localnr(__tmp, pfn_to_nid(__tmp))); \
-})
-
-#define discontigmem_page_to_pfn(p) \
-({ \
-       struct page *__tmp = p; \
-       (((__tmp) - page_zone(__tmp)->zone_mem_map) + \
-        page_zone(__tmp)->zone_start_pfn); \
-})
-
-/* XXX fix for discontiguous physical memory */
-#define discontigmem_pfn_valid(pfn)            ((pfn) < num_physpages)
-
-#endif /* CONFIG_DISCONTIGMEM */
-
 #endif /* CONFIG_NEED_MULTIPLE_NODES */
 
 #ifdef CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID
-#define early_pfn_to_nid(pfn)  pa_to_nid(((unsigned long)pfn) << PAGE_SHIFT)
+extern int __init early_pfn_to_nid(unsigned long pfn);
 #endif
 
 #endif /* _ASM_MMZONE_H_ */
index e32f1187aa29730c0ab75f2253e089667ece11f3..3efc3288f7e9ce67afa7ab39af2baf84214382dc 100644 (file)
@@ -279,11 +279,6 @@ extern u64 ppc64_pft_size;         /* Log 2 of page table size */
 
 #define __va(x) ((void *)((unsigned long)(x) + KERNELBASE))
 
-#ifdef CONFIG_DISCONTIGMEM
-#define page_to_pfn(page)      discontigmem_page_to_pfn(page)
-#define pfn_to_page(pfn)       discontigmem_pfn_to_page(pfn)
-#define pfn_valid(pfn)         discontigmem_pfn_valid(pfn)
-#endif
 #ifdef CONFIG_FLATMEM
 #define pfn_to_page(pfn)       (mem_map + (pfn))
 #define page_to_pfn(page)      ((unsigned long)((page) - mem_map))
diff --git a/include/asm-ppc64/udbg.h b/include/asm-ppc64/udbg.h
deleted file mode 100644 (file)
index e3b9279..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-#ifndef __UDBG_HDR
-#define __UDBG_HDR
-
-#include <linux/compiler.h>
-#include <linux/init.h>
-
-/*
- * c 2001 PPC 64 Team, IBM Corp
- *
- * 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; either version
- * 2 of the License, or (at your option) any later version.
- */
-
-extern void (*udbg_putc)(unsigned char c);
-extern unsigned char (*udbg_getc)(void);
-extern int (*udbg_getc_poll)(void);
-
-extern void udbg_puts(const char *s);
-extern int udbg_write(const char *s, int n);
-extern int udbg_read(char *buf, int buflen);
-
-extern void register_early_udbg_console(void);
-extern void udbg_printf(const char *fmt, ...);
-
-extern void udbg_init_uart(void __iomem *comport, unsigned int speed);
-
-struct device_node;
-extern void udbg_init_scc(struct device_node *np);
-#endif
diff --git a/include/asm-ppc64/vdso.h b/include/asm-ppc64/vdso.h
deleted file mode 100644 (file)
index 85d8a7b..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-#ifndef __PPC64_VDSO_H__
-#define __PPC64_VDSO_H__
-
-#ifdef __KERNEL__
-
-/* Default link addresses for the vDSOs */
-#define VDSO32_LBASE   0x100000
-#define VDSO64_LBASE   0x100000
-
-/* Default map addresses */
-#define VDSO32_MBASE   VDSO32_LBASE
-#define VDSO64_MBASE   VDSO64_LBASE
-
-#define VDSO_VERSION_STRING    LINUX_2.6.12
-
-/* Define if 64 bits VDSO has procedure descriptors */
-#undef VDS64_HAS_DESCRIPTORS
-
-#ifndef __ASSEMBLY__
-
-extern unsigned int vdso64_pages;
-extern unsigned int vdso32_pages;
-
-/* Offsets relative to thread->vdso_base */
-extern unsigned long vdso64_rt_sigtramp;
-extern unsigned long vdso32_sigtramp;
-extern unsigned long vdso32_rt_sigtramp;
-
-extern void vdso_init(void);
-
-#else /* __ASSEMBLY__ */
-
-#ifdef __VDSO64__
-#ifdef VDS64_HAS_DESCRIPTORS
-#define V_FUNCTION_BEGIN(name)         \
-       .globl name;                    \
-        .section ".opd","a";           \
-        .align 3;                      \
-       name:                           \
-       .quad .name,.TOC.@tocbase,0;    \
-       .previous;                      \
-       .globl .name;                   \
-       .type .name,@function;          \
-       .name:                          \
-
-#define V_FUNCTION_END(name)           \
-       .size .name,.-.name;
-
-#define V_LOCAL_FUNC(name) (.name)
-
-#else /* VDS64_HAS_DESCRIPTORS */
-
-#define V_FUNCTION_BEGIN(name)         \
-       .globl name;                    \
-       name:                           \
-
-#define V_FUNCTION_END(name)           \
-       .size name,.-name;
-
-#define V_LOCAL_FUNC(name) (name)
-
-#endif /* VDS64_HAS_DESCRIPTORS */
-#endif /* __VDSO64__ */
-
-#ifdef __VDSO32__
-
-#define V_FUNCTION_BEGIN(name)         \
-       .globl name;                    \
-       .type name,@function;           \
-       name:                           \
-
-#define V_FUNCTION_END(name)           \
-       .size name,.-name;
-
-#define V_LOCAL_FUNC(name) (name)
-
-#endif /* __VDSO32__ */
-
-#endif /* __ASSEMBLY__ */
-
-#endif /* __KERNEL__ */
-
-#endif /* __PPC64_VDSO_H__ */
index 1a165b7ae01b5889b154133b345a53c4a022f58b..17e336f40b479e61e70eaac21776ca035af60a6b 100644 (file)
@@ -43,4 +43,19 @@ extern int platform_device_add_data(struct platform_device *pdev, void *data, si
 extern int platform_device_add(struct platform_device *pdev);
 extern void platform_device_put(struct platform_device *pdev);
 
+struct platform_driver {
+       int (*probe)(struct platform_device *);
+       int (*remove)(struct platform_device *);
+       void (*shutdown)(struct platform_device *);
+       int (*suspend)(struct platform_device *, pm_message_t state);
+       int (*resume)(struct platform_device *);
+       struct device_driver driver;
+};
+
+extern int platform_driver_register(struct platform_driver *);
+extern void platform_driver_unregister(struct platform_driver *);
+
+#define platform_get_drvdata(_dev)     dev_get_drvdata(&(_dev)->dev)
+#define platform_set_drvdata(_dev,data)        dev_set_drvdata(&(_dev)->dev, (data))
+
 #endif /* _PLATFORM_DEVICE_H_ */
index 4376814d29fb2072fff59f7b968d6ab24f430f1b..b7d296a8ac6d2366e2470607d579ef1bac5cc3ab 100644 (file)
@@ -236,7 +236,7 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack,
                        /* We don't have enough RTT samples to do the Vegas
                         * calculation, so we'll behave like Reno.
                         */
-                       tcp_reno_cong_avoid(sk, ack, seq_rtt, in_flight, cnt);
+                       tcp_reno_cong_avoid(sk, ack, seq_rtt, in_flight, flag);
                } else {
                        u32 rtt, target_cwnd, diff;
 
index d1f9da498729c96040a477311e7c67cc94d3fc99..c96c8a2aa1c2a68f35c52aa56f5d1dbbb2a82bd9 100644 (file)
@@ -275,9 +275,9 @@ static int pxa2xx_ac97_do_resume(snd_card_t *card)
        return 0;
 }
 
-static int pxa2xx_ac97_suspend(struct device *_dev, pm_message_t state)
+static int pxa2xx_ac97_suspend(struct platform_device *dev, pm_message_t state)
 {
-       snd_card_t *card = dev_get_drvdata(_dev);
+       snd_card_t *card = platform_get_drvdata(dev);
        int ret = 0;
 
        if (card)
@@ -286,9 +286,9 @@ static int pxa2xx_ac97_suspend(struct device *_dev, pm_message_t state)
        return ret;
 }
 
-static int pxa2xx_ac97_resume(struct device *_dev)
+static int pxa2xx_ac97_resume(struct platform_device *dev)
 {
-       snd_card_t *card = dev_get_drvdata(_dev);
+       snd_card_t *card = platform_get_drvdata(dev);
        int ret = 0;
 
        if (card)
@@ -302,7 +302,7 @@ static int pxa2xx_ac97_resume(struct device *_dev)
 #define pxa2xx_ac97_resume     NULL
 #endif
 
-static int pxa2xx_ac97_probe(struct device *dev)
+static int pxa2xx_ac97_probe(struct platform_device *dev)
 {
        snd_card_t *card;
        ac97_bus_t *ac97_bus;
@@ -315,8 +315,8 @@ static int pxa2xx_ac97_probe(struct device *dev)
        if (!card)
                goto err;
 
-       card->dev = dev;
-       strncpy(card->driver, dev->driver->name, sizeof(card->driver));
+       card->dev = &dev->dev;
+       strncpy(card->driver, dev->dev.driver->name, sizeof(card->driver));
 
        ret = pxa2xx_pcm_new(card, &pxa2xx_ac97_pcm_client, &pxa2xx_ac97_pcm);
        if (ret)
@@ -347,13 +347,13 @@ static int pxa2xx_ac97_probe(struct device *dev)
        snprintf(card->shortname, sizeof(card->shortname),
                 "%s", snd_ac97_get_short_name(pxa2xx_ac97_ac97));
        snprintf(card->longname, sizeof(card->longname),
-                "%s (%s)", dev->driver->name, card->mixername);
+                "%s (%s)", dev->dev.driver->name, card->mixername);
 
        snd_card_set_pm_callback(card, pxa2xx_ac97_do_suspend,
                                 pxa2xx_ac97_do_resume, NULL);
        ret = snd_card_register(card);
        if (ret == 0) {
-               dev_set_drvdata(dev, card);
+               platform_set_drvdata(dev, card);
                return 0;
        }
 
@@ -368,13 +368,13 @@ static int pxa2xx_ac97_probe(struct device *dev)
        return ret;
 }
 
-static int pxa2xx_ac97_remove(struct device *dev)
+static int pxa2xx_ac97_remove(struct platform_device *dev)
 {
-       snd_card_t *card = dev_get_drvdata(dev);
+       snd_card_t *card = platform_get_drvdata(dev);
 
        if (card) {
                snd_card_free(card);
-               dev_set_drvdata(dev, NULL);
+               platform_set_drvdata(dev, NULL);
                GCR |= GCR_ACLINK_OFF;
                free_irq(IRQ_AC97, NULL);
                pxa_set_cken(CKEN2_AC97, 0);
@@ -383,23 +383,24 @@ static int pxa2xx_ac97_remove(struct device *dev)
        return 0;
 }
 
-static struct device_driver pxa2xx_ac97_driver = {
-       .name           = "pxa2xx-ac97",
-       .bus            = &platform_bus_type,
+static struct platform_driver pxa2xx_ac97_driver = {
        .probe          = pxa2xx_ac97_probe,
        .remove         = pxa2xx_ac97_remove,
        .suspend        = pxa2xx_ac97_suspend,
        .resume         = pxa2xx_ac97_resume,
+       .driver         = {
+               .name   = "pxa2xx-ac97",
+       },
 };
 
 static int __init pxa2xx_ac97_init(void)
 {
-       return driver_register(&pxa2xx_ac97_driver);
+       return platform_driver_register(&pxa2xx_ac97_driver);
 }
 
 static void __exit pxa2xx_ac97_exit(void)
 {
-       driver_unregister(&pxa2xx_ac97_driver);
+       platform_driver_unregister(&pxa2xx_ac97_driver);
 }
 
 module_init(pxa2xx_ac97_init);
index d9ee27ae9a510a2a1e5ff23e767fda896a9e5e37..33813f92ab523855d473a011a185b6c8a73d36c6 100644 (file)
@@ -674,23 +674,24 @@ struct snd_generic_device {
        snd_card_t *card;
 };
 
-#define get_snd_generic_card(dev)      container_of(to_platform_device(dev), struct snd_generic_device, pdev)->card
+#define get_snd_generic_card(dev)      container_of(dev, struct snd_generic_device, pdev)->card
 
 #define SND_GENERIC_NAME       "snd_generic"
 
 #ifdef CONFIG_PM
-static int snd_generic_suspend(struct device *dev, pm_message_t state);
-static int snd_generic_resume(struct device *dev);
+static int snd_generic_suspend(struct platform_device *dev, pm_message_t state);
+static int snd_generic_resume(struct platform_device *dev);
 #endif
 
 /* initialized in sound.c */
-struct device_driver snd_generic_driver = {
-       .name           = SND_GENERIC_NAME,
-       .bus            = &platform_bus_type,
+struct platform_driver snd_generic_driver = {
 #ifdef CONFIG_PM
        .suspend        = snd_generic_suspend,
        .resume         = snd_generic_resume,
 #endif
+       .driver         = {
+               .name   = SND_GENERIC_NAME,
+       },
 };
 
 void snd_generic_device_release(struct device *dev)
@@ -821,7 +822,7 @@ int snd_card_set_pm_callback(snd_card_t *card,
 
 #ifdef CONFIG_SND_GENERIC_DRIVER
 /* suspend/resume callbacks for snd_generic platform device */
-static int snd_generic_suspend(struct device *dev, pm_message_t state)
+static int snd_generic_suspend(struct platform_device *dev, pm_message_t state)
 {
        snd_card_t *card;
 
@@ -834,7 +835,7 @@ static int snd_generic_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int snd_generic_resume(struct device *dev)
+static int snd_generic_resume(struct platform_device *dev)
 {
        snd_card_t *card;
 
index 1139dd8ca8eb0d38aa3dcd1f22857ad6b888669f..6e7cad1e947e9fbf4cc3884fa92aede2ca6f80b9 100644 (file)
@@ -32,7 +32,7 @@
 #include <sound/initval.h>
 #include <linux/kmod.h>
 #include <linux/devfs_fs_kernel.h>
-#include <linux/device.h>
+#include <linux/platform_device.h>
 
 #define SNDRV_OS_MINORS 256
 
@@ -329,7 +329,7 @@ int __exit snd_minor_info_done(void)
  */
 
 #ifdef CONFIG_SND_GENERIC_DRIVER
-extern struct device_driver snd_generic_driver;
+extern struct platform_driver snd_generic_driver;
 #endif
 
 static int __init alsa_sound_init(void)
@@ -357,7 +357,7 @@ static int __init alsa_sound_init(void)
        }
        snd_info_minor_register();
 #ifdef CONFIG_SND_GENERIC_DRIVER
-       driver_register(&snd_generic_driver);
+       platform_driver_register(&snd_generic_driver);
 #endif
        for (controlnum = 0; controlnum < cards_limit; controlnum++)
                devfs_mk_cdev(MKDEV(major, controlnum<<5), S_IFCHR | device_mode, "snd/controlC%d", controlnum);
@@ -375,7 +375,7 @@ static void __exit alsa_sound_exit(void)
                devfs_remove("snd/controlC%d", controlnum);
 
 #ifdef CONFIG_SND_GENERIC_DRIVER
-       driver_unregister(&snd_generic_driver);
+       platform_driver_unregister(&snd_generic_driver);
 #endif
        snd_info_minor_unregister();
        snd_info_done();
This page took 0.279653 seconds and 5 git commands to generate.