On Sat, 15 Nov 2008, Laurent Vivier wrote:
> It allows to read data from a floppy, but not to write to, and to eject the
> floppy (useful on our Mac without eject button).
> 
> Changelog:
> v2- use platform device infrastructure
> v3- some cleanups, probe if chip supports SWIM mode
> v4- use platform_device, correct swim_action() and swim_eject()
>    according swim3 driver.
> v5- use a structure for IWM registers (like for SWIM ones)
> 
> Signed-off-by: Laurent Vivier <[EMAIL PROTECTED]>
> ---

Typically changelogs should be put here (under the first `---'), together with
the diffstat output, as they must not be part of the final commit message.

> arch/m68k/mac/config.c   |   40 +
> arch/m68k/mac/via.c      |    9
> drivers/block/Kconfig    |    7
> drivers/block/Makefile   |    3
> drivers/block/swim.c     |  997
> +++++++++++++++++++++++++++++++++++++++++++++++

Oops, severe whitespace damage, also in the body of the patch :-(
So I had to apply your patch manually.  Please fix your mailer.

> Index: linux-2.6/drivers/block/swim.c
> ===================================================================
> --- /dev/null 1970-01-01 00:00:00.000000000 +0000
> +++ linux-2.6/drivers/block/swim.c    2008-11-14 09:36:31.000000000 +0100

> +#define SWIM_IO_SIZE 0x2000

Move SWIM_IO_SIZE to arch/m68k/mac/config.c, as it's needed to set up the
platform device resource only.

> +static inline void set_swim_mode(struct swim *base, int enable)
                                               ^ __iomem
> +{
> +     struct iwm *iwm_base;
                  ^ __iomem

(cfr. sparse warnings, when building with `make C=1')

> +     unsigned long flags;
> +
> +     if (!enable) {
> +             swim_write(base, mode0, 0xf8);
> +             return;
> +     }
> +
> +     iwm_base = (struct iwm *)base;
> +     local_save_flags(flags);
> +     local_irq_disable();

local_save_flags(flags) + local_irq_disable() = local_irq_save(flags)

However, to make the driver future-save (we don't have SMP nor preempt support
yet), it's better to add a spinlock and use spin_lock_irqsave().

> +     local_irq_restore(flags);

... and spin_unlock_irqrestore().

> +static inline int swim_track(struct floppy_state *fs,  int track)
> +{
> +     struct swim *base = fs->swd->base;
                   ^ __iomem

> +static int floppy_eject(struct floppy_state *fs)
> +{
> +     struct swim *base = fs->swd->base;
                   ^ __iomem

> +static inline int swim_read_sector(struct floppy_state *fs,
> +                                int side, int track,
> +                                int sector, unsigned char *buffer)
> +{
> +     struct swim *base = fs->swd->base;
                   ^ __iomem

> +static int floppy_read_sectors(struct floppy_state *fs,
> +                            int req_sector, int sectors_nb,
> +                            unsigned char *buffer)
> +{
> +     struct swim *base = fs->swd->base;
                   ^ __iomem

> +static int __devinit swim_probe(struct platform_device *dev)
> +{
> +     struct resource *res;
> +     struct swim *swim_base;
                   & __iomem

> +     struct swim_priv *swd;
> +     int ret;
> +
> +     res = platform_get_resource_byname(dev, IORESOURCE_MEM, "swim-regs");
> +     if (!res) {
> +             ret = -ENODEV;
> +             goto out;
> +     }
> +
> +     if (!request_mem_region(res->start, SWIM_IO_SIZE, CARDNAME)) {
                                            ^^^^^^^^^^^^
                                            resource_size(res)

> +             ret = -EBUSY;
> +             goto out;
> +     }
> +
> +     swim_base = (struct swim *)ioremap(res->start, SWIM_IO_SIZE);
                    ^^^^^^^^^^^^^^^                    ^^^^^^^^^^^^
casts from void * are not needed                       resource_size(res)

> +     if (!swim_base) {
> +             return -ENOMEM;
> +             goto out_release_io;
> +     }
> +
> +     /* probe device */
> +
> +     set_swim_mode(swim_base, 1);
> +     if (!get_swim_mode(swim_base)) {
> +             printk(KERN_INFO "SWIM device not found !\n");
> +             ret = -ENODEV;
> +             goto out_iounmap;
> +     }
> +
> +     /* set platform driver data */
> +
> +     swd = kzalloc(sizeof(struct swim_priv), GFP_KERNEL);
> +     if (!swd) {
> +             ret = -ENOMEM;
> +             goto out_iounmap;
> +     }
> +     platform_set_drvdata(dev, swd);
> +
> +     swd->base = swim_base;
> +
> +     ret = swim_floppy_init(swd);
> +     if (ret)
> +             goto out_kfree;
> +
> +     return 0;
> +
> +out_kfree:
> +     platform_set_drvdata(dev, NULL);
> +     kfree(swd);
> +out_iounmap:
> +     iounmap(swim_base);
> +out_release_io:
> +     release_mem_region(res->start, SWIM_IO_SIZE);
                                       ^^^^^^^^^^^^
                                       resource_size(res)

> +static int __devexit swim_remove(struct platform_device *dev)

> +static struct platform_driver swim_driver = {
> +     .probe  = swim_probe,
> +     .remove = swim_remove,
                  ^^^^^^^^^^^

As swim_remove() is marked __devexit, the `__devexit_p(swim_remove)' in v3 was
actually correct.

> Index: linux-2.6/arch/m68k/mac/config.c
> ===================================================================
> --- linux-2.6.orig/arch/m68k/mac/config.c     2008-11-12 18:17:52.000000000
> +0100
> +++ linux-2.6/arch/m68k/mac/config.c  2008-11-12 18:17:55.000000000 +0100

> +int __init mac_platform_init(void)
> +{
> +     u8 *swim_base;
> +
> +     switch (macintosh_config->floppy_type) {
> +     case MAC_FLOPPY_SWIM_ADDR1:
> +             swim_base = (u8 *)(VIA1_BASE + 0x1E000);
> +             break;
> +     case MAC_FLOPPY_SWIM_ADDR2:
> +             swim_base = (u8 *)(VIA1_BASE + 0x16000);
> +             break;
> +     default:
> +             return 0;
> +     }
> +
> +     swim_resources[0].name = "swim-regs";
> +     swim_resources[0].start = (resource_size_t)swim_base;
> +     swim_resources[0].end = (resource_size_t)(swim_base + 0x2000);
                                                              ^^^^^^
                                                              SWIM_IO_SIZE
> +     swim_resources[0].flags = IORESOURCE_MEM;
> +
> +     return platform_add_devices(mac_platform_devices,
> +                                 ARRAY_SIZE(mac_platform_devices));
> +}
> +
> +arch_initcall(mac_platform_init);

Gr{oetje,eeting}s,

                                                Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [EMAIL PROTECTED]

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                                            -- Linus Torvalds
--
To unsubscribe from this list: send the line "unsubscribe linux-m68k" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to