* [PATCH 01/17] of: add dma-mask binding [not found] <1352710357-3265-1-git-send-email-wenyou.yang@atmel.com> @ 2012-11-12 8:52 ` Wenyou Yang [not found] ` <1352710357-3265-2-git-send-email-wenyou.yang-AIFe0yeh4nAAvxtiuMwx3w@public.gmane.org> [not found] ` <1352710357-3265-1-git-send-email-wenyou.yang-AIFe0yeh4nAAvxtiuMwx3w@public.gmane.org> 2012-11-12 8:52 ` [PATCH 11/17] spi/atmel_spi: add DT support Wenyou Yang 2 siblings, 1 reply; 9+ messages in thread From: Wenyou Yang @ 2012-11-12 8:52 UTC (permalink / raw) To: linux-arm-kernel Cc: JM.Lin, nicolas.ferre, rob.herring, wenyou.yang, grant.likely, Jean-Christophe PLAGNIOL-VILLARD, devicetree-discuss From: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> This will allow each device to specify its dma-mask for this we use the coherent_dma_mask as pointer. By default the dma-mask will be set to DMA_BIT_MASK(32). The microblaze architecture hook is drop Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> Cc: grant.likely@secretlab.ca Cc: rob.herring@calxeda.com Cc: devicetree-discuss@lists.ozlabs.org --- drivers/of/platform.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/drivers/of/platform.c b/drivers/of/platform.c index b80891b..31ed405 100644 --- a/drivers/of/platform.c +++ b/drivers/of/platform.c @@ -130,6 +130,21 @@ void of_device_make_bus_id(struct device *dev) dev_set_name(dev, "%s.%d", node->name, magic - 1); } +static void of_get_dma_mask(struct device *dev, struct device_node *np) +{ + const __be32 *prop; + int len; + + prop = of_get_property(np, "dma-mask", &len); + + dev->dma_mask = &dev->coherent_dma_mask; + + if (!prop) + dev->coherent_dma_mask = DMA_BIT_MASK(32); + else + dev->coherent_dma_mask = of_read_number(prop, len / 4); +} + /** * of_device_alloc - Allocate and initialize an of_device * @np: device node to assign to device @@ -171,10 +186,8 @@ struct platform_device *of_device_alloc(struct device_node *np, WARN_ON(of_irq_to_resource_table(np, res, num_irq) != num_irq); } + of_get_dma_mask(&dev->dev, np); dev->dev.of_node = of_node_get(np); -#if defined(CONFIG_MICROBLAZE) - dev->dev.dma_mask = &dev->archdata.dma_mask; -#endif dev->dev.parent = parent; if (bus_id) @@ -211,10 +224,6 @@ struct platform_device *of_platform_device_create_pdata( if (!dev) return NULL; -#if defined(CONFIG_MICROBLAZE) - dev->archdata.dma_mask = 0xffffffffUL; -#endif - dev->dev.coherent_dma_mask = DMA_BIT_MASK(32); dev->dev.bus = &platform_bus_type; dev->dev.platform_data = platform_data; -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 9+ messages in thread
[parent not found: <1352710357-3265-2-git-send-email-wenyou.yang-AIFe0yeh4nAAvxtiuMwx3w@public.gmane.org>]
* Re: [PATCH 01/17] of: add dma-mask binding [not found] ` <1352710357-3265-2-git-send-email-wenyou.yang-AIFe0yeh4nAAvxtiuMwx3w@public.gmane.org> @ 2012-11-14 3:55 ` Rob Herring [not found] ` <50A3164C.3070301-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> 0 siblings, 1 reply; 9+ messages in thread From: Rob Herring @ 2012-11-14 3:55 UTC (permalink / raw) To: Wenyou Yang Cc: JM.Lin-AIFe0yeh4nAAvxtiuMwx3w, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r On 11/12/2012 02:52 AM, Wenyou Yang wrote: > From: Jean-Christophe PLAGNIOL-VILLARD <plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org> > > This will allow each device to specify its dma-mask for this we use the > coherent_dma_mask as pointer. By default the dma-mask will be set to > DMA_BIT_MASK(32). Do you really have a use case this is not DMA_BIT_MASK(32)? > The microblaze architecture hook is drop > > Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org> > Cc: grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org > Cc: rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org > Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org > --- > drivers/of/platform.c | 23 ++++++++++++++++------- > 1 file changed, 16 insertions(+), 7 deletions(-) > > diff --git a/drivers/of/platform.c b/drivers/of/platform.c > index b80891b..31ed405 100644 > --- a/drivers/of/platform.c > +++ b/drivers/of/platform.c > @@ -130,6 +130,21 @@ void of_device_make_bus_id(struct device *dev) > dev_set_name(dev, "%s.%d", node->name, magic - 1); > } > > +static void of_get_dma_mask(struct device *dev, struct device_node *np) > +{ > + const __be32 *prop; > + int len; > + > + prop = of_get_property(np, "dma-mask", &len); dma-ranges may work for this purpose. > + > + dev->dma_mask = &dev->coherent_dma_mask; I don't really know, but I suspect this is wrong. > + > + if (!prop) > + dev->coherent_dma_mask = DMA_BIT_MASK(32); > + else > + dev->coherent_dma_mask = of_read_number(prop, len / 4); > +} > + > /** > * of_device_alloc - Allocate and initialize an of_device > * @np: device node to assign to device > @@ -171,10 +186,8 @@ struct platform_device *of_device_alloc(struct device_node *np, > WARN_ON(of_irq_to_resource_table(np, res, num_irq) != num_irq); > } > > + of_get_dma_mask(&dev->dev, np); > dev->dev.of_node = of_node_get(np); > -#if defined(CONFIG_MICROBLAZE) > - dev->dev.dma_mask = &dev->archdata.dma_mask; > -#endif > dev->dev.parent = parent; > > if (bus_id) > @@ -211,10 +224,6 @@ struct platform_device *of_platform_device_create_pdata( > if (!dev) > return NULL; > > -#if defined(CONFIG_MICROBLAZE) > - dev->archdata.dma_mask = 0xffffffffUL; > -#endif > - dev->dev.coherent_dma_mask = DMA_BIT_MASK(32); > dev->dev.bus = &platform_bus_type; > dev->dev.platform_data = platform_data; > > ^ permalink raw reply [flat|nested] 9+ messages in thread
[parent not found: <50A3164C.3070301-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>]
* Re: [PATCH 01/17] of: add dma-mask binding [not found] ` <50A3164C.3070301-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> @ 2012-11-14 6:00 ` Jean-Christophe PLAGNIOL-VILLARD [not found] ` <20121114060058.GM4576-RQcB7r2h9QmfDR2tN2SG5Ni2O/JbrIOy@public.gmane.org> 0 siblings, 1 reply; 9+ messages in thread From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-11-14 6:00 UTC (permalink / raw) To: Rob Herring Cc: JM.Lin-AIFe0yeh4nAAvxtiuMwx3w, Wenyou Yang, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r On 21:55 Tue 13 Nov , Rob Herring wrote: > On 11/12/2012 02:52 AM, Wenyou Yang wrote: > > From: Jean-Christophe PLAGNIOL-VILLARD <plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org> > > > > This will allow each device to specify its dma-mask for this we use the > > coherent_dma_mask as pointer. By default the dma-mask will be set to > > DMA_BIT_MASK(32). > > Do you really have a use case this is not DMA_BIT_MASK(32)? yes as exmample on 64bit platfrom it will be 64 on x86 it's also 24, on power pc 40 > > > The microblaze architecture hook is drop > > > > Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org> > > Cc: grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org > > Cc: rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org > > Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org > > --- > > drivers/of/platform.c | 23 ++++++++++++++++------- > > 1 file changed, 16 insertions(+), 7 deletions(-) > > > > diff --git a/drivers/of/platform.c b/drivers/of/platform.c > > index b80891b..31ed405 100644 > > --- a/drivers/of/platform.c > > +++ b/drivers/of/platform.c > > @@ -130,6 +130,21 @@ void of_device_make_bus_id(struct device *dev) > > dev_set_name(dev, "%s.%d", node->name, magic - 1); > > } > > > > +static void of_get_dma_mask(struct device *dev, struct device_node *np) > > +{ > > + const __be32 *prop; > > + int len; > > + > > + prop = of_get_property(np, "dma-mask", &len); > > dma-ranges may work for this purpose. > > > + > > + dev->dma_mask = &dev->coherent_dma_mask; > > I don't really know, but I suspect this is wrong. no this is correct was suggest by Russell we already do so on other ARM or SH as example the dma expect a pointer for dma_mask but the value is the same as coherent > > > + > > + if (!prop) > > + dev->coherent_dma_mask = DMA_BIT_MASK(32); > > + else > > + dev->coherent_dma_mask = of_read_number(prop, len / 4); > > +} > > + > > /** > > * of_device_alloc - Allocate and initialize an of_device > > * @np: device node to assign to device > > @@ -171,10 +186,8 @@ struct platform_device *of_device_alloc(struct device_node *np, > > WARN_ON(of_irq_to_resource_table(np, res, num_irq) != num_irq); > > } > > > > + of_get_dma_mask(&dev->dev, np); > > dev->dev.of_node = of_node_get(np); > > -#if defined(CONFIG_MICROBLAZE) > > - dev->dev.dma_mask = &dev->archdata.dma_mask; > > -#endif > > dev->dev.parent = parent; > > > > if (bus_id) > > @@ -211,10 +224,6 @@ struct platform_device *of_platform_device_create_pdata( > > if (!dev) > > return NULL; > > > > -#if defined(CONFIG_MICROBLAZE) > > - dev->archdata.dma_mask = 0xffffffffUL; > > -#endif > > - dev->dev.coherent_dma_mask = DMA_BIT_MASK(32); > > dev->dev.bus = &platform_bus_type; > > dev->dev.platform_data = platform_data; > > > > ^ permalink raw reply [flat|nested] 9+ messages in thread
[parent not found: <20121114060058.GM4576-RQcB7r2h9QmfDR2tN2SG5Ni2O/JbrIOy@public.gmane.org>]
* Re: [PATCH 01/17] of: add dma-mask binding [not found] ` <20121114060058.GM4576-RQcB7r2h9QmfDR2tN2SG5Ni2O/JbrIOy@public.gmane.org> @ 2012-11-14 20:56 ` Rob Herring [not found] ` <50A4056E.9090700-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> 0 siblings, 1 reply; 9+ messages in thread From: Rob Herring @ 2012-11-14 20:56 UTC (permalink / raw) To: Jean-Christophe PLAGNIOL-VILLARD Cc: JM.Lin-AIFe0yeh4nAAvxtiuMwx3w, Wenyou Yang, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r On 11/14/2012 12:00 AM, Jean-Christophe PLAGNIOL-VILLARD wrote: > On 21:55 Tue 13 Nov , Rob Herring wrote: >> On 11/12/2012 02:52 AM, Wenyou Yang wrote: >>> From: Jean-Christophe PLAGNIOL-VILLARD <plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org> >>> >>> This will allow each device to specify its dma-mask for this we use the >>> coherent_dma_mask as pointer. By default the dma-mask will be set to >>> DMA_BIT_MASK(32). >> >> Do you really have a use case this is not DMA_BIT_MASK(32)? > yes as exmample on 64bit platfrom it will be 64 on x86 it's also 24, on power > pc 40 >> >>> The microblaze architecture hook is drop >>> >>> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org> >>> Cc: grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org >>> Cc: rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org >>> Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org >>> --- >>> drivers/of/platform.c | 23 ++++++++++++++++------- >>> 1 file changed, 16 insertions(+), 7 deletions(-) >>> >>> diff --git a/drivers/of/platform.c b/drivers/of/platform.c >>> index b80891b..31ed405 100644 >>> --- a/drivers/of/platform.c >>> +++ b/drivers/of/platform.c >>> @@ -130,6 +130,21 @@ void of_device_make_bus_id(struct device *dev) >>> dev_set_name(dev, "%s.%d", node->name, magic - 1); >>> } >>> >>> +static void of_get_dma_mask(struct device *dev, struct device_node *np) >>> +{ >>> + const __be32 *prop; >>> + int len; >>> + >>> + prop = of_get_property(np, "dma-mask", &len); >> >> dma-ranges may work for this purpose. >> >>> + >>> + dev->dma_mask = &dev->coherent_dma_mask; >> >> I don't really know, but I suspect this is wrong. > no this is correct was suggest by Russell > we already do so on other ARM or SH as example > > the dma expect a pointer for dma_mask but the value is the same as coherent Okay. Then perhaps this part should be a separate patch as that is useful on its own for 32-bit machines with no DMA address restrictions (most modern ARM h/w). My comment on using dma-ranges still stands though. The form is <parent-address child-address size>. Normally, parent and child would be the same. I think the mask would be "parent address + size - 1". The simple case is <0 0 0> for all of 32-bit memory. I'm using 0 for full 32-bit size here as #size-cells is typically 1 and I can't imagine that 0 size would be useful. Rob >> >>> + >>> + if (!prop) >>> + dev->coherent_dma_mask = DMA_BIT_MASK(32); >>> + else >>> + dev->coherent_dma_mask = of_read_number(prop, len / 4); >>> +} >>> + >>> /** >>> * of_device_alloc - Allocate and initialize an of_device >>> * @np: device node to assign to device >>> @@ -171,10 +186,8 @@ struct platform_device *of_device_alloc(struct device_node *np, >>> WARN_ON(of_irq_to_resource_table(np, res, num_irq) != num_irq); >>> } >>> >>> + of_get_dma_mask(&dev->dev, np); >>> dev->dev.of_node = of_node_get(np); >>> -#if defined(CONFIG_MICROBLAZE) >>> - dev->dev.dma_mask = &dev->archdata.dma_mask; >>> -#endif >>> dev->dev.parent = parent; >>> >>> if (bus_id) >>> @@ -211,10 +224,6 @@ struct platform_device *of_platform_device_create_pdata( >>> if (!dev) >>> return NULL; >>> >>> -#if defined(CONFIG_MICROBLAZE) >>> - dev->archdata.dma_mask = 0xffffffffUL; >>> -#endif >>> - dev->dev.coherent_dma_mask = DMA_BIT_MASK(32); >>> dev->dev.bus = &platform_bus_type; >>> dev->dev.platform_data = platform_data; >>> >>> ^ permalink raw reply [flat|nested] 9+ messages in thread
[parent not found: <50A4056E.9090700-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>]
* Re: [PATCH 01/17] of: add dma-mask binding [not found] ` <50A4056E.9090700-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> @ 2012-11-14 21:05 ` Russell King - ARM Linux 0 siblings, 0 replies; 9+ messages in thread From: Russell King - ARM Linux @ 2012-11-14 21:05 UTC (permalink / raw) To: Rob Herring Cc: JM.Lin-AIFe0yeh4nAAvxtiuMwx3w, Wenyou Yang, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r On Wed, Nov 14, 2012 at 02:56:14PM -0600, Rob Herring wrote: > On 11/14/2012 12:00 AM, Jean-Christophe PLAGNIOL-VILLARD wrote: > > On 21:55 Tue 13 Nov , Rob Herring wrote: > >> On 11/12/2012 02:52 AM, Wenyou Yang wrote: > >>> + > >>> + dev->dma_mask = &dev->coherent_dma_mask; > >> > >> I don't really know, but I suspect this is wrong. > > no this is correct was suggest by Russell > > we already do so on other ARM or SH as example > > > > the dma expect a pointer for dma_mask but the value is the same as coherent > > Okay. Then perhaps this part should be a separate patch as that is > useful on its own for 32-bit machines with no DMA address restrictions > (most modern ARM h/w). I'm not sure that I did make the exact suggestion being alluded to above (I think I may have made the suggestion that dev->dma_mask should be pointed at a dma_mask, and it might be a good idea that it should be part of struct device.) I've always shy'd away from making it the same thing as the coherent DMA mask, because there are drivers around which modify the value pointed to by dev->dma_mask via standard DMA API calls. (Eg, when they know that the device is only N-bit capable.) With that set to the same as dev->coherent_dma_mask, it ends up modifying the coherent DMA mask too which may or may not be entirely a good thing; I suspect ultimately that depends on the driver. My thoughts on this though is that the whole thing is a mess. I'm not sure why we ended up with a separate coherent_dma_mask from the main dma_mask, and why we ended up with dma_mask being a pointer to something allocated elsewhere... it all seems like it's unnecessarily complicated and was designed to cause confusion... ^ permalink raw reply [flat|nested] 9+ messages in thread
[parent not found: <1352710357-3265-1-git-send-email-wenyou.yang-AIFe0yeh4nAAvxtiuMwx3w@public.gmane.org>]
* [PATCH 02/17] of_spi: add generic binding support to specify cs gpio [not found] ` <1352710357-3265-1-git-send-email-wenyou.yang-AIFe0yeh4nAAvxtiuMwx3w@public.gmane.org> @ 2012-11-12 8:52 ` Wenyou Yang 2012-11-12 8:52 ` [PATCH 13/17] spi/atmel_spi: add function to read the spi data from the dts Wenyou Yang 1 sibling, 0 replies; 9+ messages in thread From: Wenyou Yang @ 2012-11-12 8:52 UTC (permalink / raw) To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r Cc: richard.genoud-Re5JQEeQqe8AvxtiuMwx3w, JM.Lin-AIFe0yeh4nAAvxtiuMwx3w, nicolas.ferre-AIFe0yeh4nAAvxtiuMwx3w, rob.herring-bsGFqQB8/DxBDgjK7y7TUQ, wenyou.yang-AIFe0yeh4nAAvxtiuMwx3w, rob-VoJi6FS/r0vR7s880joybQ, spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, Jean-Christophe PLAGNIOL-VILLARD, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ From: Jean-Christophe PLAGNIOL-VILLARD <plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org> This will allow to use gpio for chip select with no modification in the driver binding When use the cs-gpios, the gpio number will be passed via the cs_gpio field and the number of chip select will automatically increased. Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org> Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org Cc: grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org Cc: rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org Cc: rob-VoJi6FS/r0vR7s880joybQ@public.gmane.org Cc: richard.genoud-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org --- Hi, Richard, This patch based on the original patch from Jean-Christophe, [PATCH] of_spi: add generic binding support to specify cs gpio and merged the patch from Richard Genoud, [PATCH] [BUG] SPI: array out of bound => no CS Could you sign your signature in this patch? Best Regards, Wenyou Yang Documentation/devicetree/bindings/spi/spi-bus.txt | 6 +++ drivers/spi/spi.c | 55 +++++++++++++++++++-- include/linux/spi/spi.h | 3 ++ 3 files changed, 61 insertions(+), 3 deletions(-) diff --git a/Documentation/devicetree/bindings/spi/spi-bus.txt b/Documentation/devicetree/bindings/spi/spi-bus.txt index d2c33d0..7f59ae30 100644 --- a/Documentation/devicetree/bindings/spi/spi-bus.txt +++ b/Documentation/devicetree/bindings/spi/spi-bus.txt @@ -12,6 +12,7 @@ The SPI master node requires the following properties: - #size-cells - should be zero. - compatible - name of SPI bus controller following generic names recommended practice. +- cs-gpios - (optional) gpios chip select. No other properties are required in the SPI bus node. It is assumed that a driver for an SPI bus device will understand that it is an SPI bus. However, the binding does not attempt to define the specific method for @@ -21,6 +22,8 @@ assumption that board specific platform code will be used to manage chip selects. Individual drivers can define additional properties to support describing the chip select layout. +If cs-gpios is used the number of chip select will automatically increased. + Optional property: - num-cs : total number of chipselects @@ -37,6 +40,9 @@ contain the following properties. - spi-cs-high - (optional) Empty property indicating device requires chip select active high +If a gpio chipselect is used for the SPI slave the gpio number will be passed +via the controller_data + SPI example for an MPC5200 SPI bus: spi@f00 { #address-cells = <1>; diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 84c2861..74e6577 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -30,6 +30,7 @@ #include <linux/slab.h> #include <linux/mod_devicetable.h> #include <linux/spi/spi.h> +#include <linux/of_gpio.h> #include <linux/pm_runtime.h> #include <linux/export.h> #include <linux/sched.h> @@ -327,6 +328,7 @@ struct spi_device *spi_alloc_device(struct spi_master *master) spi->dev.parent = &master->dev; spi->dev.bus = &spi_bus_type; spi->dev.release = spidev_release; + spi->cs_gpio = -EINVAL; device_initialize(&spi->dev); return spi; } @@ -344,15 +346,16 @@ EXPORT_SYMBOL_GPL(spi_alloc_device); int spi_add_device(struct spi_device *spi) { static DEFINE_MUTEX(spi_add_lock); - struct device *dev = spi->master->dev.parent; + struct spi_master *master = spi->master; + struct device *dev = master->dev.parent; struct device *d; int status; /* Chipselects are numbered 0..max; validate. */ - if (spi->chip_select >= spi->master->num_chipselect) { + if (spi->chip_select >= master->num_chipselect) { dev_err(dev, "cs%d >= max %d\n", spi->chip_select, - spi->master->num_chipselect); + master->num_chipselect); return -EINVAL; } @@ -376,6 +379,9 @@ int spi_add_device(struct spi_device *spi) goto done; } + if (master->cs_gpios) + spi->cs_gpio = master->cs_gpios[spi->chip_select]; + /* Drivers may modify this initial i/o setup, but will * normally rely on the device being setup. Devices * using SPI_CS_HIGH can't coexist well otherwise... @@ -946,6 +952,45 @@ struct spi_master *spi_alloc_master(struct device *dev, unsigned size) } EXPORT_SYMBOL_GPL(spi_alloc_master); +#ifdef CONFIG_OF +static int of_spi_register_master(struct spi_master *master) +{ + int nb, i; + int *cs; + struct device_node *np = master->dev.of_node; + + if (!np) + return 0; + + nb = of_gpio_named_count(np, "cs-gpios"); + + if (nb < 1) + return 0; + + cs = devm_kzalloc(&master->dev, + sizeof(int) * (master->num_chipselect + nb), + GFP_KERNEL); + master->cs_gpios = cs; + + if (!master->cs_gpios) + return -ENOMEM; + + memset(cs, -EINVAL, master->num_chipselect); + cs += master->num_chipselect; + master->num_chipselect += nb; + + for (i = 0; i < nb; i++) + cs[i] = of_get_named_gpio(np, "cs-gpios", i); + + return 0; +} +#else +static int of_spi_register_master(struct spi_master *master) +{ + return 0; +} +#endif + /** * spi_register_master - register SPI master controller * @master: initialized master, originally from spi_alloc_master() @@ -977,6 +1022,10 @@ int spi_register_master(struct spi_master *master) if (!dev) return -ENODEV; + status = of_spi_register_master(master); + if (status) + return status; + /* even if it's just one always-selected device, there must * be at least one chipselect */ diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index fa702ae..f629189 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h @@ -90,6 +90,7 @@ struct spi_device { void *controller_state; void *controller_data; char modalias[SPI_NAME_SIZE]; + int cs_gpio; /* chip select gpio */ /* * likely need more hooks for more protocol options affecting how @@ -362,6 +363,8 @@ struct spi_master { int (*transfer_one_message)(struct spi_master *master, struct spi_message *mesg); int (*unprepare_transfer_hardware)(struct spi_master *master); + /* gpio chip select */ + int *cs_gpios; }; static inline void *spi_master_get_devdata(struct spi_master *master) -- 1.7.9.5 ------------------------------------------------------------------------------ Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_d2d_nov ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 13/17] spi/atmel_spi: add function to read the spi data from the dts [not found] ` <1352710357-3265-1-git-send-email-wenyou.yang-AIFe0yeh4nAAvxtiuMwx3w@public.gmane.org> 2012-11-12 8:52 ` [PATCH 02/17] of_spi: add generic binding support to specify cs gpio Wenyou Yang @ 2012-11-12 8:52 ` Wenyou Yang 1 sibling, 0 replies; 9+ messages in thread From: Wenyou Yang @ 2012-11-12 8:52 UTC (permalink / raw) To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r Cc: linux-doc-u79uwXL29TY76Z2rM5mHXA, JM.Lin-AIFe0yeh4nAAvxtiuMwx3w, nicolas.ferre-AIFe0yeh4nAAvxtiuMwx3w, wenyou.yang-AIFe0yeh4nAAvxtiuMwx3w, rob-VoJi6FS/r0vR7s880joybQ, spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ The spi data include: dma_type and version. dma_type to decide the SPI xfer mode: = 1(pdc), = 2(dmaengine), 0(no dma, using PIO) version to give the SPI ip version. Signed-off-by: Wenyou Yang <wenyou.yang-AIFe0yeh4nAAvxtiuMwx3w@public.gmane.org> Cc: grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org Cc: rob-VoJi6FS/r0vR7s880joybQ@public.gmane.org Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org Cc: linux-doc-u79uwXL29TY76Z2rM5mHXA@public.gmane.org Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org --- .../devicetree/bindings/spi/spi_atmel.txt | 4 +++ drivers/spi/spi-atmel.c | 28 ++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/Documentation/devicetree/bindings/spi/spi_atmel.txt b/Documentation/devicetree/bindings/spi/spi_atmel.txt index 20cdc91..a1ceeb5 100644 --- a/Documentation/devicetree/bindings/spi/spi_atmel.txt +++ b/Documentation/devicetree/bindings/spi/spi_atmel.txt @@ -6,6 +6,8 @@ Required properties: - interrupts: Should contain macb interrupt - cs-gpio: Should contain the GPIOs used for chipselect. - dma-mask: device coherent dma mask. +- dma_type: The dma type supported by the spi of SoC: = 0 (no used), = 1 (pdc), = 2 (dma) +- version: The version of the spi IP. spi0: spi@f0000000 { #address-cells = <1>; @@ -19,5 +21,7 @@ spi0: spi@f0000000 { &pioB 3 0 /* conflicts with ERXDV */ >; dma-mask = <0xffffffff>; + dma_type = <1>; + version = <2>; status = "disabled"; }; diff --git a/drivers/spi/spi-atmel.c b/drivers/spi/spi-atmel.c index 568df5b..791800e 100644 --- a/drivers/spi/spi-atmel.c +++ b/drivers/spi/spi-atmel.c @@ -1467,6 +1467,30 @@ static void atmel_spi_cleanup(struct spi_device *spi) kfree(asd); } +static int of_get_atmel_spi_data(struct device_node *np, struct atmel_spi *as) +{ + const __be32 *val; + + val = of_get_property(np, "dma_type", NULL); + if (!val) { + pr_err("%s: have no 'dma_type' property\n", + np->full_name); + return -EINVAL; + } + + as->data.dma_type = be32_to_cpup(val); + + val = of_get_property(np, "version", NULL); + if (!val) { + pr_err("%s: have no 'version' property\n", np->full_name); + return -EINVAL; + } + + as->data.version = be32_to_cpup(val); + + return 0; +} + /*-------------------------------------------------------------------------*/ static int __devinit atmel_spi_probe(struct platform_device *pdev) @@ -1535,6 +1559,10 @@ static int __devinit atmel_spi_probe(struct platform_device *pdev) if (ret) goto out_unmap_regs; + ret = of_get_atmel_spi_data(pdev->dev.of_node, as); + if (ret) + goto out_unmap_regs; + /* Initialize the hardware */ clk_enable(clk); spi_writel(as, CR, SPI_BIT(SWRST)); -- 1.7.9.5 ------------------------------------------------------------------------------ Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_d2d_nov ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 11/17] spi/atmel_spi: add DT support [not found] <1352710357-3265-1-git-send-email-wenyou.yang@atmel.com> 2012-11-12 8:52 ` [PATCH 01/17] of: add dma-mask binding Wenyou Yang [not found] ` <1352710357-3265-1-git-send-email-wenyou.yang-AIFe0yeh4nAAvxtiuMwx3w@public.gmane.org> @ 2012-11-12 8:52 ` Wenyou Yang 2 siblings, 0 replies; 9+ messages in thread From: Wenyou Yang @ 2012-11-12 8:52 UTC (permalink / raw) To: linux-arm-kernel Cc: nicolas.ferre, JM.Lin, wenyou.yang, Jean-Christophe PLAGNIOL-VILLARD, devicetree-discuss, spi-devel-general, grant.likely, rob.herring, rob, linux-doc, richard.genoud From: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> The atmel_spi use only gpio for chip select. Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> Cc: devicetree-discuss@lists.ozlabs.org Cc: spi-devel-general@lists.sourceforge.net Cc: grant.likely@secretlab.ca Cc: rob.herring@calxeda.com Cc: rob@landley.net Cc: linux-doc@vger.kernel.org Cc: richard.genoud@gmail.com --- Hi, Richard, This patches is based on the original patch from Jean-Christophe [PATCH] spi/atmel: add DT support and merged the patch from Richard Genoud [PATCH] spi-atmel OF: complete documentation Could you sign your signature in this patch? Best Regards, Wenyou Yang .../devicetree/bindings/spi/spi_atmel.txt | 23 ++++++++++++++++++++ drivers/spi/spi-atmel.c | 21 ++++++++++++++---- 2 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 Documentation/devicetree/bindings/spi/spi_atmel.txt diff --git a/Documentation/devicetree/bindings/spi/spi_atmel.txt b/Documentation/devicetree/bindings/spi/spi_atmel.txt new file mode 100644 index 0000000..20cdc91 --- /dev/null +++ b/Documentation/devicetree/bindings/spi/spi_atmel.txt @@ -0,0 +1,23 @@ +Atmel SPI device + +Required properties: +- compatible : should be "atmel,at91rm9200-spi". +- reg: Address and length of the register set for the device +- interrupts: Should contain macb interrupt +- cs-gpio: Should contain the GPIOs used for chipselect. +- dma-mask: device coherent dma mask. + +spi0: spi@f0000000 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "atmel,at91rm9200-spi"; + reg = <0xf0000000 0x100>; + interrupts = <13 4>; + cs-gpios = <&pioA 14 0 + &pioA 7 0 /* conflicts with TXD2 */ + &pioA 1 0 /* conflicts with RXD0 */ + &pioB 3 0 /* conflicts with ERXDV */ + >; + dma-mask = <0xffffffff>; + status = "disabled"; +}; diff --git a/drivers/spi/spi-atmel.c b/drivers/spi/spi-atmel.c index 7a3613d..0cc347c 100644 --- a/drivers/spi/spi-atmel.c +++ b/drivers/spi/spi-atmel.c @@ -20,6 +20,7 @@ #include <linux/interrupt.h> #include <linux/spi/spi.h> #include <linux/slab.h> +#include <linux/of.h> #include <asm/io.h> #include <mach/board.h> @@ -1242,7 +1243,7 @@ static int atmel_spi_setup(struct spi_device *spi) u32 scbr, csr; unsigned int bits = spi->bits_per_word; unsigned long bus_hz; - unsigned int npcs_pin; + int npcs_pin; int ret; as = spi_master_get_devdata(spi->master); @@ -1314,7 +1315,9 @@ static int atmel_spi_setup(struct spi_device *spi) csr |= SPI_BF(DLYBCT, 0); /* chipselect must have been muxed as GPIO (e.g. in board setup) */ - npcs_pin = (unsigned int)spi->controller_data; + if (!gpio_is_valid(spi->cs_gpio)) + spi->cs_gpio = (int)spi->controller_data; + npcs_pin = spi->cs_gpio; asd = spi->controller_state; if (!asd) { asd = kzalloc(sizeof(struct atmel_spi_device), GFP_KERNEL); @@ -1435,7 +1438,7 @@ static void atmel_spi_cleanup(struct spi_device *spi) { struct atmel_spi *as = spi_master_get_devdata(spi->master); struct atmel_spi_device *asd = spi->controller_state; - unsigned gpio = (unsigned) spi->controller_data; + unsigned gpio = spi->cs_gpio; if (!asd) return; @@ -1485,7 +1488,8 @@ static int __devinit atmel_spi_probe(struct platform_device *pdev) master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH; master->bus_num = pdev->id; - master->num_chipselect = 4; + master->dev.of_node = pdev->dev.of_node; + master->num_chipselect = master->dev.of_node ? 0 : 4; master->setup = atmel_spi_setup; master->transfer = atmel_spi_transfer; master->cleanup = atmel_spi_cleanup; @@ -1637,11 +1641,20 @@ static int atmel_spi_resume(struct platform_device *pdev) #define atmel_spi_resume NULL #endif +#if defined(CONFIG_OF) +static const struct of_device_id atmel_spi_dt_ids[] = { + { .compatible = "atmel,at91rm9200-spi" }, + { /* sentinel */ } +}; + +MODULE_DEVICE_TABLE(of, atmel_spi_dt_ids); +#endif static struct platform_driver atmel_spi_driver = { .driver = { .name = "atmel_spi", .owner = THIS_MODULE, + .of_match_table = of_match_ptr(atmel_spi_dt_ids), }, .suspend = atmel_spi_suspend, .resume = atmel_spi_resume, -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 01/17] of: add dma-mask binding @ 2013-03-22 9:16 Wenyou Yang 0 siblings, 0 replies; 9+ messages in thread From: Wenyou Yang @ 2013-03-22 9:16 UTC (permalink / raw) To: andy.gao-AIFe0yeh4nAAvxtiuMwx3w Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, rob.herring-bsGFqQB8/DxBDgjK7y7TUQ From: Jean-Christophe PLAGNIOL-VILLARD <plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org> This will allow each device to specify its dma-mask for this we use the coherent_dma_mask as pointer. By default the dma-mask will be set to DMA_BIT_MASK(32). The microblaze architecture hook is drop Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org> Cc: grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org Cc: rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org --- drivers/of/platform.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/drivers/of/platform.c b/drivers/of/platform.c index e44f8c2..11c765c 100644 --- a/drivers/of/platform.c +++ b/drivers/of/platform.c @@ -121,6 +121,21 @@ void of_device_make_bus_id(struct device *dev) dev_set_name(dev, "%s.%d", node->name, magic - 1); } +static void of_get_dma_mask(struct device *dev, struct device_node *np) +{ + const __be32 *prop; + int len; + + prop = of_get_property(np, "dma-mask", &len); + + dev->dma_mask = &dev->coherent_dma_mask; + + if (!prop) + dev->coherent_dma_mask = DMA_BIT_MASK(32); + else + dev->coherent_dma_mask = of_read_number(prop, len / 4); +} + /** * of_device_alloc - Allocate and initialize an of_device * @np: device node to assign to device @@ -161,10 +176,8 @@ struct platform_device *of_device_alloc(struct device_node *np, WARN_ON(of_irq_to_resource_table(np, res, num_irq) != num_irq); } + of_get_dma_mask(&dev->dev, np); dev->dev.of_node = of_node_get(np); -#if defined(CONFIG_MICROBLAZE) - dev->dev.dma_mask = &dev->archdata.dma_mask; -#endif dev->dev.parent = parent; if (bus_id) @@ -201,10 +214,6 @@ struct platform_device *of_platform_device_create_pdata( if (!dev) return NULL; -#if defined(CONFIG_MICROBLAZE) - dev->archdata.dma_mask = 0xffffffffUL; -#endif - dev->dev.coherent_dma_mask = DMA_BIT_MASK(32); dev->dev.bus = &platform_bus_type; dev->dev.platform_data = platform_data; -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 9+ messages in thread
end of thread, other threads:[~2013-03-22 9:16 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <1352710357-3265-1-git-send-email-wenyou.yang@atmel.com> 2012-11-12 8:52 ` [PATCH 01/17] of: add dma-mask binding Wenyou Yang [not found] ` <1352710357-3265-2-git-send-email-wenyou.yang-AIFe0yeh4nAAvxtiuMwx3w@public.gmane.org> 2012-11-14 3:55 ` Rob Herring [not found] ` <50A3164C.3070301-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> 2012-11-14 6:00 ` Jean-Christophe PLAGNIOL-VILLARD [not found] ` <20121114060058.GM4576-RQcB7r2h9QmfDR2tN2SG5Ni2O/JbrIOy@public.gmane.org> 2012-11-14 20:56 ` Rob Herring [not found] ` <50A4056E.9090700-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> 2012-11-14 21:05 ` Russell King - ARM Linux [not found] ` <1352710357-3265-1-git-send-email-wenyou.yang-AIFe0yeh4nAAvxtiuMwx3w@public.gmane.org> 2012-11-12 8:52 ` [PATCH 02/17] of_spi: add generic binding support to specify cs gpio Wenyou Yang 2012-11-12 8:52 ` [PATCH 13/17] spi/atmel_spi: add function to read the spi data from the dts Wenyou Yang 2012-11-12 8:52 ` [PATCH 11/17] spi/atmel_spi: add DT support Wenyou Yang 2013-03-22 9:16 [PATCH 01/17] of: add dma-mask binding Wenyou Yang
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).