Re: [PATCH 07/31] swim: Enable clock divider only where appropriate
Laurent Vivier <[email protected]>
| Newsgroups | org.kernel.vger.linux-block,org.kernel.vger.linux-kernel,org.kernel.vger.linux-m68k |
|---|---|
| Message-ID | <[email protected]> |
Le 16/07/2026 à 12:02, Finn Thain a écrit : > 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. > > 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). > > 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(-) > 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 = swim_base, > .end = swim_base + 0x1FFF, > }; > + unsigned int data = 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 = 1; > + break; > + } > > - platform_device_register_simple("swim", -1, &swim_rsrc, 1); > + platform_device_register_resndata(NULL, "swim", -1, &swim_rsrc, 1, > + &data, sizeof(data)); > } > > /* > 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_mode_t mode) > fs->ref_count = -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]); > } > > -static int swim_floppy_init(struct swim_priv *swd) > +static int swim_floppy_init(struct platform_device *pdev) > { > + struct swim_priv *swd = platform_get_drvdata(pdev); > + unsigned int *data = pdev->dev.platform_data; > struct queue_limits lim = { > .features = BLK_FEAT_ROTATIONAL, > }; > @@ -816,6 +817,8 @@ static int swim_floppy_init(struct swim_priv *swd) > int drive; > struct swim __iomem *base = swd->base; > > + swim_write(base, setup, S_IBM_DRIVE | (*data ? S_FCLK_DIV2 : 0)); > + > swim_set_parameters(base); > > /* scan floppy drives */ > @@ -930,7 +933,7 @@ static int swim_probe(struct platform_device *dev) > > swd->base = swim_base; > > - ret = swim_floppy_init(swd); > + ret = swim_floppy_init(dev); > if (ret) > goto out_kfree; >