Hi Grant, >> <...> >> +#include <asm/mach-ath79/ath79_spi_platform.h> >> + >> +#define DRV_DESC "SPI controller driver for Atheros AR71XX/AR724X/AR91X" > > Used exactly once. Don't bother with a #define Ok. >> +#define DRV_NAME "ath79-spi" >> + >> +struct ath79_spi { >> + struct spi_bitbang bitbang; >> + u32 ioc_base; >> + u32 reg_ctrl; >> + >> + void __iomem *base; >> + >> + struct platform_device *pdev; >> +}; >> + >> +static inline u32 ath79_spi_rr(struct ath79_spi *sp, unsigned reg) >> +{ >> + return __raw_readl(sp->base + reg); >> +} >> + >> +static inline void ath79_spi_wr(struct ath79_spi *sp, unsigned reg, u32 val) >> +{ >> + __raw_writel(val, sp->base + reg); >> +} > > This is suspect. Why is __raw_{readl,writel} being used instead of > ioread32/iowrite32? The __raw versions don't provide any kind of > ordering barriers. Mainly because the resulting code is smaller, and the performance is a bit better with the use of the __raw versions. The controller is embedded into the SoC and the registers are memory mapped, so i think it is safe to access them with __raw_{readl,writel}. However I can change it if that is the preferred method. >> <...> >> +static int ath79_spi_probe(struct platform_device *pdev) > > __devinit I will add this. > >> +{ >> + struct spi_master *master; >> + struct ath79_spi *sp; >> + struct ath79_spi_platform_data *pdata; >> + struct resource *r; >> + int ret; >> + >> + master = spi_alloc_master(&pdev->dev, sizeof(*sp)); >> + if (master == NULL) { >> + dev_err(&pdev->dev, "failed to allocate spi master\n"); >> + return -ENOMEM; >> + } >> + >> + sp = spi_master_get_devdata(master); >> + platform_set_drvdata(pdev, sp); >> + >> + pdata = pdev->dev.platform_data; >> + >> + master->setup = ath79_spi_setup; >> + master->cleanup = ath79_spi_cleanup; >> + if (pdata) { >> + master->bus_num = pdata->bus_num; >> + master->num_chipselect = pdata->num_chipselect; >> + } else { >> + master->bus_num = 0; > > Use -1 so that a bus number can be dynamically assigned All right. >> <...> >> +static int ath79_spi_remove(struct platform_device *pdev) > > __devexit > >> +{ >> + struct ath79_spi *sp = platform_get_drvdata(pdev); >> + >> + spi_bitbang_stop(&sp->bitbang); >> + iounmap(sp->base); >> + platform_set_drvdata(pdev, NULL); >> + spi_master_put(sp->bitbang.master); >> + >> + return 0; >> +} >> + >> +static struct platform_driver ath79_spi_drv = { >> + .probe = ath79_spi_probe, >> + .remove = ath79_spi_remove, > > __devexit_p(ath79_spi_remove), > I will add these annotations as well. Thank you, Gabor