Commit 7e5ad716 authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branches 'spi/topic/dw', 'spi/topic/efm32',...

Merge remote-tracking branches 'spi/topic/dw', 'spi/topic/efm32', 'spi/topic/fsl' and 'spi/topic/omap-uwire' into spi-next
...@@ -10,11 +10,12 @@ Required properties: ...@@ -10,11 +10,12 @@ Required properties:
- cs-gpios: see spi-bus.txt - cs-gpios: see spi-bus.txt
Recommended properties : Recommended properties :
- efm32,location: Value to write to the ROUTE register's LOCATION bitfield to - energymicro,location: Value to write to the ROUTE register's LOCATION
configure the pinmux for the device, see datasheet for values. bitfield to configure the pinmux for the device, see
If "efm32,location" property is not provided, keeping what is datasheet for values.
already configured in the hardware, so its either the reset If this property is not provided, keeping what is
default 0 or whatever the bootloader did. already configured in the hardware, so its either the
reset default 0 or whatever the bootloader did.
Example: Example:
...@@ -26,7 +27,7 @@ spi1: spi@0x4000c400 { /* USART1 */ ...@@ -26,7 +27,7 @@ spi1: spi@0x4000c400 { /* USART1 */
interrupts = <15 16>; interrupts = <15 16>;
clocks = <&cmu 20>; clocks = <&cmu 20>;
cs-gpios = <&gpio 51 1>; // D3 cs-gpios = <&gpio 51 1>; // D3
efm32,location = <1>; energymicro,location = <1>;
status = "ok"; status = "ok";
ks8851@0 { ks8851@0 {
......
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>;
};
...@@ -16,7 +16,9 @@ ...@@ -16,7 +16,9 @@
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/scatterlist.h> #include <linux/scatterlist.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/of.h>
#include <linux/of_gpio.h> #include <linux/of_gpio.h>
#include <linux/of_platform.h>
#include "spi-dw.h" #include "spi-dw.h"
...@@ -33,6 +35,7 @@ static int dw_spi_mmio_probe(struct platform_device *pdev) ...@@ -33,6 +35,7 @@ static int dw_spi_mmio_probe(struct platform_device *pdev)
struct dw_spi *dws; struct dw_spi *dws;
struct resource *mem; struct resource *mem;
int ret; int ret;
int num_cs;
dwsmmio = devm_kzalloc(&pdev->dev, sizeof(struct dw_spi_mmio), dwsmmio = devm_kzalloc(&pdev->dev, sizeof(struct dw_spi_mmio),
GFP_KERNEL); GFP_KERNEL);
...@@ -68,9 +71,16 @@ static int dw_spi_mmio_probe(struct platform_device *pdev) ...@@ -68,9 +71,16 @@ static int dw_spi_mmio_probe(struct platform_device *pdev)
return ret; return ret;
dws->bus_num = pdev->id; dws->bus_num = pdev->id;
dws->num_cs = 4;
dws->max_freq = clk_get_rate(dwsmmio->clk); 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) { if (pdev->dev.of_node) {
int i; int i;
...@@ -114,12 +124,19 @@ static int dw_spi_mmio_remove(struct platform_device *pdev) ...@@ -114,12 +124,19 @@ static int dw_spi_mmio_remove(struct platform_device *pdev)
return 0; 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 = { static struct platform_driver dw_spi_mmio_driver = {
.probe = dw_spi_mmio_probe, .probe = dw_spi_mmio_probe,
.remove = dw_spi_mmio_remove, .remove = dw_spi_mmio_remove,
.driver = { .driver = {
.name = DRIVER_NAME, .name = DRIVER_NAME,
.owner = THIS_MODULE, .owner = THIS_MODULE,
.of_match_table = dw_spi_mmio_of_match,
}, },
}; };
module_platform_driver(dw_spi_mmio_driver); module_platform_driver(dw_spi_mmio_driver);
......
...@@ -294,10 +294,16 @@ static void efm32_spi_probe_dt(struct platform_device *pdev, ...@@ -294,10 +294,16 @@ static void efm32_spi_probe_dt(struct platform_device *pdev,
u32 location; u32 location;
int ret; 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) if (ret)
/* fall back to old and (wrongly) generic property "location" */ /* fall back to old and (wrongly) generic property "location" */
ret = of_property_read_u32(np, "location", &location); ret = of_property_read_u32(np, "location", &location);
if (!ret) { if (!ret) {
dev_dbg(&pdev->dev, "using location %u\n", location); dev_dbg(&pdev->dev, "using location %u\n", location);
} else { } else {
......
...@@ -196,7 +196,7 @@ int of_mpc8xxx_spi_probe(struct platform_device *ofdev) ...@@ -196,7 +196,7 @@ int of_mpc8xxx_spi_probe(struct platform_device *ofdev)
pinfo = devm_kzalloc(&ofdev->dev, sizeof(*pinfo), GFP_KERNEL); pinfo = devm_kzalloc(&ofdev->dev, sizeof(*pinfo), GFP_KERNEL);
if (!pinfo) if (!pinfo)
return -ENOMEM; return ret;
pdata = &pinfo->pdata; pdata = &pinfo->pdata;
dev->platform_data = pdata; dev->platform_data = pdata;
......
...@@ -41,14 +41,15 @@ ...@@ -41,14 +41,15 @@
#include <linux/err.h> #include <linux/err.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/device.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/spi/spi_bitbang.h> #include <linux/spi/spi_bitbang.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/io.h>
#include <asm/irq.h> #include <asm/irq.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <asm/io.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <mach/mux.h> #include <mach/mux.h>
...@@ -447,7 +448,6 @@ static void uwire_off(struct uwire_spi *uwire) ...@@ -447,7 +448,6 @@ static void uwire_off(struct uwire_spi *uwire)
{ {
uwire_write_reg(UWIRE_SR3, 0); uwire_write_reg(UWIRE_SR3, 0);
clk_disable(uwire->ck); clk_disable(uwire->ck);
clk_put(uwire->ck);
spi_master_put(uwire->bitbang.master); spi_master_put(uwire->bitbang.master);
} }
...@@ -463,7 +463,7 @@ static int uwire_probe(struct platform_device *pdev) ...@@ -463,7 +463,7 @@ static int uwire_probe(struct platform_device *pdev)
uwire = spi_master_get_devdata(master); 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) { if (!uwire_base) {
dev_dbg(&pdev->dev, "can't ioremap UWIRE\n"); dev_dbg(&pdev->dev, "can't ioremap UWIRE\n");
spi_master_put(master); spi_master_put(master);
...@@ -472,12 +472,11 @@ static int uwire_probe(struct platform_device *pdev) ...@@ -472,12 +472,11 @@ static int uwire_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, uwire); 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)) { if (IS_ERR(uwire->ck)) {
status = PTR_ERR(uwire->ck); status = PTR_ERR(uwire->ck);
dev_dbg(&pdev->dev, "no functional clock?\n"); dev_dbg(&pdev->dev, "no functional clock?\n");
spi_master_put(master); spi_master_put(master);
iounmap(uwire_base);
return status; return status;
} }
clk_enable(uwire->ck); clk_enable(uwire->ck);
...@@ -507,7 +506,6 @@ static int uwire_probe(struct platform_device *pdev) ...@@ -507,7 +506,6 @@ static int uwire_probe(struct platform_device *pdev)
status = spi_bitbang_start(&uwire->bitbang); status = spi_bitbang_start(&uwire->bitbang);
if (status < 0) { if (status < 0) {
uwire_off(uwire); uwire_off(uwire);
iounmap(uwire_base);
} }
return status; return status;
} }
...@@ -520,7 +518,6 @@ static int uwire_remove(struct platform_device *pdev) ...@@ -520,7 +518,6 @@ static int uwire_remove(struct platform_device *pdev)
spi_bitbang_stop(&uwire->bitbang); spi_bitbang_stop(&uwire->bitbang);
uwire_off(uwire); uwire_off(uwire);
iounmap(uwire_base);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment