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