+@@ -198,6 +213,7 @@ static __devinit int ath79_spi_probe(str
+ struct ath79_spi *sp;
+ struct ath79_spi_platform_data *pdata;
+ struct resource *r;
++ unsigned long rate;
+ int ret;
+
+ master = spi_alloc_master(&pdev->dev, sizeof(*sp));
+@@ -239,12 +255,36 @@ static __devinit int ath79_spi_probe(str
+ goto err_put_master;
+ }
+
++ sp->clk = clk_get(&pdev->dev, "ahb");
++ if (IS_ERR(sp->clk)) {
++ ret = PTR_ERR(sp->clk);
++ goto err_unmap;
++ }
++
++ ret = clk_enable(sp->clk);
++ if (ret)
++ goto err_clk_put;
++
++ rate = DIV_ROUND_UP(clk_get_rate(sp->clk), MHZ);
++ if (!rate) {
++ ret = -EINVAL;
++ goto err_clk_disable;
++ }
++
++ sp->rrw_delay = ATH79_SPI_RRW_DELAY_FACTOR / rate;
++ dev_dbg(&pdev->dev, "register read/write delay is %u nsecs\n",
++ sp->rrw_delay);
++
+ ret = spi_bitbang_start(&sp->bitbang);
+ if (ret)
+- goto err_unmap;
++ goto err_clk_disable;
+
+ return 0;
+
++err_clk_disable:
++ clk_disable(sp->clk);
++err_clk_put:
++ clk_put(sp->clk);
+ err_unmap:
+ iounmap(sp->base);
+ err_put_master:
+@@ -259,6 +299,8 @@ static __devexit int ath79_spi_remove(st
+ struct ath79_spi *sp = platform_get_drvdata(pdev);
+
+ spi_bitbang_stop(&sp->bitbang);
++ clk_disable(sp->clk);
++ clk_put(sp->clk);
+ iounmap(sp->base);
+ platform_set_drvdata(pdev, NULL);
+ spi_master_put(sp->bitbang.master);