[PATCH 1/4] xilinx_spi: Split into of driver and generic part.

Grant Likely grant.likely at secretlab.ca
Thu Nov 12 08:03:26 EST 2009


On Wed, Nov 11, 2009 at 7:38 AM, Richard Röjfors
<richard.rojfors at 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.


More information about the Linuxppc-dev mailing list