Skip to content

Commit

Permalink
Merge remote-tracking branches 'spi/topic/dw', 'spi/topic/efm32', 'sp…
Browse files Browse the repository at this point in the history
…i/topic/fsl' and 'spi/topic/omap-uwire' into spi-next
  • Loading branch information
Mark Brown committed Aug 4, 2014
5 parents d1345c5 + 22dae17 + 10ed7e9 + ef4bbde + ec17a7f commit 7e5ad71
Show file tree
Hide file tree
Showing 6 changed files with 65 additions and 16 deletions.
13 changes: 7 additions & 6 deletions Documentation/devicetree/bindings/spi/efm32-spi.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,12 @@ Required properties:
- cs-gpios: see spi-bus.txt

Recommended properties :
- efm32,location: Value to write to the ROUTE register's LOCATION bitfield to
configure the pinmux for the device, see datasheet for values.
If "efm32,location" property is not provided, keeping what is
already configured in the hardware, so its either the reset
default 0 or whatever the bootloader did.
- energymicro,location: Value to write to the ROUTE register's LOCATION
bitfield to configure the pinmux for the device, see
datasheet for values.
If this property is not provided, keeping what is
already configured in the hardware, so its either the
reset default 0 or whatever the bootloader did.

Example:

Expand All @@ -26,7 +27,7 @@ spi1: spi@0x4000c400 { /* USART1 */
interrupts = <15 16>;
clocks = <&cmu 20>;
cs-gpios = <&gpio 51 1>; // D3
efm32,location = <1>;
energymicro,location = <1>;
status = "ok";

ks8851@0 {
Expand Down
28 changes: 28 additions & 0 deletions Documentation/devicetree/bindings/spi/snps,dw-apb-ssi.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
Synopsys DesignWare AMBA 2.0 Synchronous Serial Interface.

Required properties:
- compatible : "snps,dw-apb-ssi"
- reg : The register base for the controller.
- interrupts : One interrupt, used by the controller.
- #address-cells : <1>, as required by generic SPI binding.
- #size-cells : <0>, also as required by generic SPI binding.

Optional properties:
- cs-gpios : Specifies the gpio pis to be used for chipselects.
- num-cs : The number of chipselects. If omitted, this will default to 4.

Child nodes as per the generic SPI binding.

Example:

spi@fff00000 {
compatible = "snps,dw-apb-ssi";
reg = <0xfff00000 0x1000>;
interrupts = <0 154 4>;
#address-cells = <1>;
#size-cells = <0>;
num-cs = <2>;
cs-gpios = <&gpio0 13 0>,
<&gpio0 14 0>;
};

19 changes: 18 additions & 1 deletion drivers/spi/spi-dw-mmio.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@
#include <linux/spi/spi.h>
#include <linux/scatterlist.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/of_platform.h>

#include "spi-dw.h"

Expand All @@ -33,6 +35,7 @@ static int dw_spi_mmio_probe(struct platform_device *pdev)
struct dw_spi *dws;
struct resource *mem;
int ret;
int num_cs;

dwsmmio = devm_kzalloc(&pdev->dev, sizeof(struct dw_spi_mmio),
GFP_KERNEL);
Expand Down Expand Up @@ -68,9 +71,16 @@ static int dw_spi_mmio_probe(struct platform_device *pdev)
return ret;

dws->bus_num = pdev->id;
dws->num_cs = 4;

dws->max_freq = clk_get_rate(dwsmmio->clk);

num_cs = 4;

if (pdev->dev.of_node)
of_property_read_u32(pdev->dev.of_node, "num-cs", &num_cs);

dws->num_cs = num_cs;

if (pdev->dev.of_node) {
int i;

Expand Down Expand Up @@ -114,12 +124,19 @@ static int dw_spi_mmio_remove(struct platform_device *pdev)
return 0;
}

static const struct of_device_id dw_spi_mmio_of_match[] = {
{ .compatible = "snps,dw-apb-ssi", },
{ /* end of table */}
};
MODULE_DEVICE_TABLE(of, dw_spi_mmio_of_match);

static struct platform_driver dw_spi_mmio_driver = {
.probe = dw_spi_mmio_probe,
.remove = dw_spi_mmio_remove,
.driver = {
.name = DRIVER_NAME,
.owner = THIS_MODULE,
.of_match_table = dw_spi_mmio_of_match,
},
};
module_platform_driver(dw_spi_mmio_driver);
Expand Down
8 changes: 7 additions & 1 deletion drivers/spi/spi-efm32.c
Original file line number Diff line number Diff line change
Expand Up @@ -294,10 +294,16 @@ static void efm32_spi_probe_dt(struct platform_device *pdev,
u32 location;
int ret;

ret = of_property_read_u32(np, "efm32,location", &location);
ret = of_property_read_u32(np, "energymicro,location", &location);

if (ret)
/* fall back to wrongly namespaced property */
ret = of_property_read_u32(np, "efm32,location", &location);

if (ret)
/* fall back to old and (wrongly) generic property "location" */
ret = of_property_read_u32(np, "location", &location);

if (!ret) {
dev_dbg(&pdev->dev, "using location %u\n", location);
} else {
Expand Down
2 changes: 1 addition & 1 deletion drivers/spi/spi-fsl-lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ int of_mpc8xxx_spi_probe(struct platform_device *ofdev)

pinfo = devm_kzalloc(&ofdev->dev, sizeof(*pinfo), GFP_KERNEL);
if (!pinfo)
return -ENOMEM;
return ret;

pdata = &pinfo->pdata;
dev->platform_data = pdata;
Expand Down
11 changes: 4 additions & 7 deletions drivers/spi/spi-omap-uwire.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,15 @@
#include <linux/err.h>
#include <linux/clk.h>
#include <linux/slab.h>
#include <linux/device.h>

#include <linux/spi/spi.h>
#include <linux/spi/spi_bitbang.h>
#include <linux/module.h>
#include <linux/io.h>

#include <asm/irq.h>
#include <mach/hardware.h>
#include <asm/io.h>
#include <asm/mach-types.h>

#include <mach/mux.h>
Expand Down Expand Up @@ -447,7 +448,6 @@ static void uwire_off(struct uwire_spi *uwire)
{
uwire_write_reg(UWIRE_SR3, 0);
clk_disable(uwire->ck);
clk_put(uwire->ck);
spi_master_put(uwire->bitbang.master);
}

Expand All @@ -463,7 +463,7 @@ static int uwire_probe(struct platform_device *pdev)

uwire = spi_master_get_devdata(master);

uwire_base = ioremap(UWIRE_BASE_PHYS, UWIRE_IO_SIZE);
uwire_base = devm_ioremap(&pdev->dev, UWIRE_BASE_PHYS, UWIRE_IO_SIZE);
if (!uwire_base) {
dev_dbg(&pdev->dev, "can't ioremap UWIRE\n");
spi_master_put(master);
Expand All @@ -472,12 +472,11 @@ static int uwire_probe(struct platform_device *pdev)

platform_set_drvdata(pdev, uwire);

uwire->ck = clk_get(&pdev->dev, "fck");
uwire->ck = devm_clk_get(&pdev->dev, "fck");
if (IS_ERR(uwire->ck)) {
status = PTR_ERR(uwire->ck);
dev_dbg(&pdev->dev, "no functional clock?\n");
spi_master_put(master);
iounmap(uwire_base);
return status;
}
clk_enable(uwire->ck);
Expand Down Expand Up @@ -507,7 +506,6 @@ static int uwire_probe(struct platform_device *pdev)
status = spi_bitbang_start(&uwire->bitbang);
if (status < 0) {
uwire_off(uwire);
iounmap(uwire_base);
}
return status;
}
Expand All @@ -520,7 +518,6 @@ static int uwire_remove(struct platform_device *pdev)

spi_bitbang_stop(&uwire->bitbang);
uwire_off(uwire);
iounmap(uwire_base);
return 0;
}

Expand Down

0 comments on commit 7e5ad71

Please sign in to comment.