On Wed, Nov 11, 2009 at 7:38 AM, Richard Röjfors <richard.rojf...@mocean-labs.com> wrote: > This patch splits the xilinx_spi driver into a generic part and a > OF driver part. > > The reason for this is to later add in a platform driver as well.
Hey Richard, Thanks for the quick response. A couple of important comments, and a bunch of nitpicks. Comments below. > diff --git a/drivers/spi/xilinx_spi.c b/drivers/spi/xilinx_spi.c > index 46b8c5c..1562e9b 100644 > --- a/drivers/spi/xilinx_spi.c > +++ b/drivers/spi/xilinx_spi.c > @@ -14,11 +14,6 @@ > #include <linux/module.h> > #include <linux/init.h> > #include <linux/interrupt.h> > -#include <linux/platform_device.h> > - > -#include <linux/of_platform.h> > -#include <linux/of_device.h> > -#include <linux/of_spi.h> > > #include <linux/spi/spi.h> > #include <linux/spi/spi_bitbang.h> > @@ -78,7 +73,7 @@ struct xilinx_spi { > /* bitbang has to be first */ > struct spi_bitbang bitbang; > struct completion done; > - > + struct resource mem; /* phys mem */ > void __iomem *regs; /* virt. address of the control registers */ > > u32 irq; > @@ -283,40 +278,17 @@ static irqreturn_t xilinx_spi_irq(int irq, void *dev_id) > return IRQ_HANDLED; > } > > -static int __init xilinx_spi_of_probe(struct of_device *ofdev, > - const struct of_device_id *match) > +struct spi_master *xilinx_spi_init(struct device *dev, struct resource *mem, > + u32 irq, s16 bus_num, u16 num_chipselect) Nit: I personally prefer like _setup and _teardown instead of _init and _deinit; but that's just me. (and bike sheds should be blue) Also, in patch 4/4, a new platform_data structure is defined. The platform probe routine extracts the pdata and passes each item individually to _init. The of_driver probe does the same, except it extracts the data from the device tree. That is also the approach that I used to take when writing drivers with multiple bindings. However, it becomes a problem as a driver matures and more and more data needs to be passed. Instead, how about getting the of_driver probe to allocate and populate the pdata structure and stow it in of_dev->dev.platform_data. That way the _init function signature stays sane, the platform driver code becomes simpler, and the driver is better prepared to handle the eventual deprecation of the of_platform bus. > { > struct spi_master *master; > struct xilinx_spi *xspi; > - struct resource r_irq_struct; > - struct resource r_mem_struct; > - > - struct resource *r_irq = &r_irq_struct; > - struct resource *r_mem = &r_mem_struct; > - int rc = 0; > - const u32 *prop; > - int len; > + int ret = 0; > > - /* Get resources(memory, IRQ) associated with the device */ > - master = spi_alloc_master(&ofdev->dev, sizeof(struct xilinx_spi)); > - > - if (master == NULL) { > - return -ENOMEM; > - } > + master = spi_alloc_master(dev, sizeof(struct xilinx_spi)); > > - dev_set_drvdata(&ofdev->dev, master); > - > - rc = of_address_to_resource(ofdev->node, 0, r_mem); > - if (rc) { > - dev_warn(&ofdev->dev, "invalid address\n"); > - goto put_master; > - } > - > - rc = of_irq_to_resource(ofdev->node, 0, r_irq); > - if (rc == NO_IRQ) { > - dev_warn(&ofdev->dev, "no IRQ found\n"); > - goto put_master; > - } > + if (master == NULL) Nit: 'if (!master)' is a pretty well accepted idiom. > @@ -329,128 +301,70 @@ static int __init xilinx_spi_of_probe(struct of_device > *ofdev, [...] > free_irq: > free_irq(xspi->irq, xspi); > unmap_io: > iounmap(xspi->regs); > -release_mem: > - release_mem_region(r_mem->start, resource_size(r_mem)); > +map_failed: > + release_mem_region(mem->start, resource_size(mem)); > put_master: > spi_master_put(master); > - return rc; > + return ERR_PTR(ret); The SPI subsystem does not use the ERR_PTR() pattern, and errors are already printed to the console when a failure occurs. Please return NULL on failure so that the driver isn't mixing idioms. > diff --git a/drivers/spi/xilinx_spi.h b/drivers/spi/xilinx_spi.h > new file mode 100644 > index 0000000..84c98ee > --- /dev/null > +++ b/drivers/spi/xilinx_spi.h > @@ -0,0 +1,31 @@ > +/* > + * xilinx_spi.h Nit: filename is kind of meaningless. Say what that file /is/ instead. ie: * Xilinx SPI device driver API and platform data header file > + * Copyright (c) 2009 Intel Corporation > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License version 2 as > + * published by the Free Software Foundation. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. > + */ > + > +#ifndef _XILINX_SPI_H_ > +#define _XILINX_SPI_H_ 1 Nit: The '1' is unnecessary > + > +#include <linux/spi/spi.h> > +#include <linux/spi/spi_bitbang.h> > + > +#define XILINX_SPI_NAME "xilinx_spi" > + > +struct spi_master *xilinx_spi_init(struct device *dev, struct resource *mem, > + u32 irq, s16 bus_num, u16 num_chipselect); > + > +void xilinx_spi_deinit(struct spi_master *master); > +#endif > diff --git a/drivers/spi/xilinx_spi_of.c b/drivers/spi/xilinx_spi_of.c > new file mode 100644 > index 0000000..5440253 > --- /dev/null > +++ b/drivers/spi/xilinx_spi_of.c > @@ -0,0 +1,126 @@ > +/* > + * xilinx_spi_of.c Support for Xilinx SPI OF devices Ditto nit here. Looking good. Thanks for this work. g. -- Grant Likely, B.Sc., P.Eng. Secret Lab Technologies Ltd. _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev