Re: [PATCH 07/31] swim: Enable clock divider only where appropriate

Laurent Vivier <[email protected]> Mon, 20 Jul 2026 20:49:25 +0200
Newsgroups org.kernel.vger.linux-m68k,org.kernel.vger.linux-block,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
Le 16/07/2026 =C3=A0 12:02, Finn Thain a =C3=A9crit=C2=A0:
> Some models have a 16 MHz FCLK oscillator and others 32 MHz. Put this
> information into the swim device platform_data so that the driver can
> correctly enable the clock divider. When this is enabled incorrectly,
> nothing can be read and failures from the Error Correction Machine are
> flagged in the error register.
>=20
> This is chip initialization, so do this in swim_floppy_init() rather
> than floppy_open(). Drop the udelay() which was apparently copied and
> pasted from swim3.c, where it relates to interrupts (of which this chip
> has none).
>=20
> Cc: Joshua Thompson <[email protected]>
> Fixes: 8852ecd97488 ("m68k: mac - Add SWIM floppy support")
> Signed-off-by: Finn Thain <[email protected]>
> ---
>   arch/m68k/mac/config.c | 31 ++++++++++++++++++++++++++++++-
>   drivers/block/swim.c   | 11 +++++++----
>   2 files changed, 37 insertions(+), 5 deletions(-)
>=20

Reviewed-by: Laurent Vivier <[email protected]>

> diff --git a/arch/m68k/mac/config.c b/arch/m68k/mac/config.c
> index c0033f885ed4..dba3de21c3c4 100644
> --- a/arch/m68k/mac/config.c
> +++ b/arch/m68k/mac/config.c
> @@ -984,8 +984,37 @@ static int __init mac_platform_init(void)
>   			.start =3D swim_base,
>   			.end   =3D swim_base + 0x1FFF,
>   		};
> +		unsigned int data =3D 0;
> +
> +		/* Models in this list are supposed to run FCLK at 32 MHz */
> +		switch (macintosh_config->ident) {
> +		case MAC_MODEL_CCL:
> +		case MAC_MODEL_CCLII:
> +		case MAC_MODEL_LCIII:
> +		case MAC_MODEL_Q605:
> +		case MAC_MODEL_Q605_ACC:
> +		case MAC_MODEL_Q610:
> +		case MAC_MODEL_Q630:
> +		case MAC_MODEL_Q650:
> +		case MAC_MODEL_Q800:
> +		case MAC_MODEL_P460:
> +		case MAC_MODEL_P475:
> +		case MAC_MODEL_P475F:
> +		case MAC_MODEL_P520:
> +		case MAC_MODEL_P550:
> +		case MAC_MODEL_P575:
> +		case MAC_MODEL_P588:
> +		case MAC_MODEL_TV:
> +		case MAC_MODEL_C610:
> +		case MAC_MODEL_C650:
> +		case MAC_MODEL_PB190:
> +		case MAC_MODEL_PB520:
> +			data =3D 1;
> +			break;
> +		}
>  =20
> -		platform_device_register_simple("swim", -1, &swim_rsrc, 1);
> +		platform_device_register_resndata(NULL, "swim", -1, &swim_rsrc, 1,
> +						  &data, sizeof(data));
>   	}
>  =20
>   	/*
> diff --git a/drivers/block/swim.c b/drivers/block/swim.c
> index 481fb1e63ac1..c49e584cd663 100644
> --- a/drivers/block/swim.c
> +++ b/drivers/block/swim.c
> @@ -628,8 +628,7 @@ static int floppy_open(struct gendisk *disk, blk_mod=
e_t mode)
>   		fs->ref_count =3D -1;
>   	else
>   		fs->ref_count++;
> -	swim_write(base, setup, S_IBM_DRIVE  | S_FCLK_DIV2);
> -	udelay(10);
> +
>   	swim_drive(base, fs->location);
>   	swim_motor(base, ON);
>   	swim_action(base, SETMFM);
> @@ -807,8 +806,10 @@ static void swim_set_parameters(struct swim __iomem=
 *base)
>   		swim_write(base, parameter, mem[i]);
>   }
>  =20
> -static int swim_floppy_init(struct swim_priv *swd)
> +static int swim_floppy_init(struct platform_device *pdev)
>   {
> +	struct swim_priv *swd =3D platform_get_drvdata(pdev);
> +	unsigned int *data =3D pdev->dev.platform_data;
>   	struct queue_limits lim =3D {
>   		.features		=3D BLK_FEAT_ROTATIONAL,
>   	};
> @@ -816,6 +817,8 @@ static int swim_floppy_init(struct swim_priv *swd)
>   	int drive;
>   	struct swim __iomem *base =3D swd->base;
>  =20
> +	swim_write(base, setup, S_IBM_DRIVE | (*data ? S_FCLK_DIV2 : 0));
> +
>   	swim_set_parameters(base);
>  =20
>   	/* scan floppy drives */
> @@ -930,7 +933,7 @@ static int swim_probe(struct platform_device *dev)
>  =20
>   	swd->base =3D swim_base;
>  =20
> -	ret =3D swim_floppy_init(swd);
> +	ret =3D swim_floppy_init(dev);
>   	if (ret)
>   		goto out_kfree;
>  =20