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