Re: [RFC 4/7] bcma: register bcma as device tree driver

2014-08-26 Thread Hauke Mehrtens
On 08/25/2014 09:57 AM, Arnd Bergmann wrote:
 On Sunday 24 August 2014 23:24:42 Hauke Mehrtens wrote:
 This driver is used by the bcm53xx ARM SoC code. Now it is possible to
 give the address of the chipcommon core in device tree and bcma will
 search for all the other cores.

 Signed-off-by: Hauke Mehrtens ha...@hauke-m.de
 
 Looks good to me overall. Two small comments:
 
  Documentation/devicetree/bindings/bus/bcma.txt | 46 +
  drivers/bcma/host_soc.c| 70 
 ++
  include/linux/bcma/bcma.h  |  2 +
  3 files changed, 118 insertions(+)
  create mode 100644 Documentation/devicetree/bindings/bus/bcma.txt

 diff --git a/Documentation/devicetree/bindings/bus/bcma.txt 
 b/Documentation/devicetree/bindings/bus/bcma.txt
 new file mode 100644
 index 000..52fb929
 --- /dev/null
 +++ b/Documentation/devicetree/bindings/bus/bcma.txt
 @@ -0,0 +1,46 @@
 +Broadcom AIX bcma bus driver
 +
 +
 +Required properties:
 +
 +- compatible : brcm,bus-aix
 +
 +- reg : iomem address range of chipcommon core
 +
 +Optional properties:
 +
 +- sprom: reference to a sprom driver. This is needed for sprom less devices.
 +Use bcm47xx_sprom for example.
 +
 +
 +The cores on the AIX bus are auto detected by bcma. Detection of the
 +IRQ number is not supported on BCM47xx/BCM53xx ARM SoCs, so it is
 +possible to provide the IRQ number over device tree. The IRQ number and
 +the device tree child entry will be added to the core with the matching
 +reg address.
 
 What is the problem with the interrupt numbers? Is that information
 missing completely from the data available to the brcm bus, or is it
 in an inconvenient format?

I do not have access to the datasheet, only to the vendor source code.
The irq numbers are hard coded in the vendor code, see:
https://github.com/RMerl/asuswrt-merlin/blob/master/release/src-rt-6.x.4708/linux/linux-2.6.36/arch/arm/plat-brcm/bcm5301x_pcie.c#L286

On the mips SoCs it was possible to read them from some register in the
mips core on the aix bus.

 
 +Example:
 +
 +   aix@1800 {
 +   compatible = brcm,bus-aix;
 +   reg = 0x1800 0x1000;
 +   ranges = 0x 0x1800 0x0010;
 +   #address-cells = 1;
 +   #size-cells = 1;
 +   sprom = sprom0;
 +
 +   gmac@0 {
 +   reg = 0x18024000 0x1000;
 +   interrupts = GIC_SPI 147 IRQ_TYPE_LEVEL_HIGH;
 +   };
 
 The @0 part seems wrong here: the address should generally match
 the first entry in the reg property, which would be gmac@18024000.
 
 Also, you probably mean ethernet@ not gmac@.

Will change that.

 +   gmac@1 {
 +   reg = 0x18025000 0x1000;
 +   interrupts = GIC_SPI 148 IRQ_TYPE_LEVEL_HIGH;
 +   };
 +
 +   pcie@0 {
 +   reg = 0x18012000 0x1000;
 +   interrupts = GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH;
 +   };
 +   };
 
 We may require additional properties for the pcie node, depending on whether
 we want to use the DT probing interfaces for it, or whether it should just
 hardcode the settings used on brcm based on the ID.

I wrote a driver for the PCIe host controller and it also automatically
detects all needed memory addresses, it just had to provide the IRQ
number through device tree.

 
   Arnd
 

--
To unsubscribe from this list: send the line unsubscribe devicetree in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC 4/7] bcma: register bcma as device tree driver

2014-08-25 Thread Arnd Bergmann
On Sunday 24 August 2014 23:24:42 Hauke Mehrtens wrote:
 This driver is used by the bcm53xx ARM SoC code. Now it is possible to
 give the address of the chipcommon core in device tree and bcma will
 search for all the other cores.
 
 Signed-off-by: Hauke Mehrtens ha...@hauke-m.de

Looks good to me overall. Two small comments:

  Documentation/devicetree/bindings/bus/bcma.txt | 46 +
  drivers/bcma/host_soc.c| 70 
 ++
  include/linux/bcma/bcma.h  |  2 +
  3 files changed, 118 insertions(+)
  create mode 100644 Documentation/devicetree/bindings/bus/bcma.txt
 
 diff --git a/Documentation/devicetree/bindings/bus/bcma.txt 
 b/Documentation/devicetree/bindings/bus/bcma.txt
 new file mode 100644
 index 000..52fb929
 --- /dev/null
 +++ b/Documentation/devicetree/bindings/bus/bcma.txt
 @@ -0,0 +1,46 @@
 +Broadcom AIX bcma bus driver
 +
 +
 +Required properties:
 +
 +- compatible : brcm,bus-aix
 +
 +- reg : iomem address range of chipcommon core
 +
 +Optional properties:
 +
 +- sprom: reference to a sprom driver. This is needed for sprom less devices.
 +Use bcm47xx_sprom for example.
 +
 +
 +The cores on the AIX bus are auto detected by bcma. Detection of the
 +IRQ number is not supported on BCM47xx/BCM53xx ARM SoCs, so it is
 +possible to provide the IRQ number over device tree. The IRQ number and
 +the device tree child entry will be added to the core with the matching
 +reg address.

What is the problem with the interrupt numbers? Is that information
missing completely from the data available to the brcm bus, or is it
in an inconvenient format?

 +Example:
 +
 +   aix@1800 {
 +   compatible = brcm,bus-aix;
 +   reg = 0x1800 0x1000;
 +   ranges = 0x 0x1800 0x0010;
 +   #address-cells = 1;
 +   #size-cells = 1;
 +   sprom = sprom0;
 +
 +   gmac@0 {
 +   reg = 0x18024000 0x1000;
 +   interrupts = GIC_SPI 147 IRQ_TYPE_LEVEL_HIGH;
 +   };

The @0 part seems wrong here: the address should generally match
the first entry in the reg property, which would be gmac@18024000.

Also, you probably mean ethernet@ not gmac@.

 +   gmac@1 {
 +   reg = 0x18025000 0x1000;
 +   interrupts = GIC_SPI 148 IRQ_TYPE_LEVEL_HIGH;
 +   };
 +
 +   pcie@0 {
 +   reg = 0x18012000 0x1000;
 +   interrupts = GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH;
 +   };
 +   };

We may require additional properties for the pcie node, depending on whether
we want to use the DT probing interfaces for it, or whether it should just
hardcode the settings used on brcm based on the ID.

Arnd

--
To unsubscribe from this list: send the line unsubscribe devicetree in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[RFC 4/7] bcma: register bcma as device tree driver

2014-08-24 Thread Hauke Mehrtens
This driver is used by the bcm53xx ARM SoC code. Now it is possible to
give the address of the chipcommon core in device tree and bcma will
search for all the other cores.

Signed-off-by: Hauke Mehrtens ha...@hauke-m.de
---
 Documentation/devicetree/bindings/bus/bcma.txt | 46 +
 drivers/bcma/host_soc.c| 70 ++
 include/linux/bcma/bcma.h  |  2 +
 3 files changed, 118 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/bus/bcma.txt

diff --git a/Documentation/devicetree/bindings/bus/bcma.txt 
b/Documentation/devicetree/bindings/bus/bcma.txt
new file mode 100644
index 000..52fb929
--- /dev/null
+++ b/Documentation/devicetree/bindings/bus/bcma.txt
@@ -0,0 +1,46 @@
+Broadcom AIX bcma bus driver
+
+
+Required properties:
+
+- compatible : brcm,bus-aix
+
+- reg : iomem address range of chipcommon core
+
+Optional properties:
+
+- sprom: reference to a sprom driver. This is needed for sprom less devices.
+Use bcm47xx_sprom for example.
+
+
+The cores on the AIX bus are auto detected by bcma. Detection of the
+IRQ number is not supported on BCM47xx/BCM53xx ARM SoCs, so it is
+possible to provide the IRQ number over device tree. The IRQ number and
+the device tree child entry will be added to the core with the matching
+reg address.
+
+Example:
+
+   aix@1800 {
+   compatible = brcm,bus-aix;
+   reg = 0x1800 0x1000;
+   ranges = 0x 0x1800 0x0010;
+   #address-cells = 1;
+   #size-cells = 1;
+   sprom = sprom0;
+
+   gmac@0 {
+   reg = 0x18024000 0x1000;
+   interrupts = GIC_SPI 147 IRQ_TYPE_LEVEL_HIGH;
+   };
+
+   gmac@1 {
+   reg = 0x18025000 0x1000;
+   interrupts = GIC_SPI 148 IRQ_TYPE_LEVEL_HIGH;
+   };
+
+   pcie@0 {
+   reg = 0x18012000 0x1000;
+   interrupts = GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH;
+   };
+   };
diff --git a/drivers/bcma/host_soc.c b/drivers/bcma/host_soc.c
index 3475e60..d009bc9 100644
--- a/drivers/bcma/host_soc.c
+++ b/drivers/bcma/host_soc.c
@@ -7,6 +7,9 @@
 
 #include bcma_private.h
 #include scan.h
+#include linux/slab.h
+#include linux/module.h
+#include linux/of_address.h
 #include linux/bcma/bcma.h
 #include linux/bcma/bcma_soc.h
 
@@ -173,6 +176,7 @@ int __init bcma_host_soc_register(struct bcma_soc *soc)
/* Host specific */
bus-hosttype = BCMA_HOSTTYPE_SOC;
bus-ops = bcma_host_soc_ops;
+   bus-host_pdev = NULL;
 
/* Register */
err = bcma_bus_early_register(bus, soc-core_cc, soc-core_mips);
@@ -181,3 +185,69 @@ int __init bcma_host_soc_register(struct bcma_soc *soc)
 
return err;
 }
+
+#ifdef CONFIG_OF
+static int bcma_host_soc_probe(struct platform_device *pdev)
+{
+   struct device *dev = pdev-dev;
+   struct device_node *np = dev-of_node;
+   struct bcma_bus *bus;
+   int err;
+
+   /* Alloc */
+   bus = devm_kzalloc(dev, sizeof(*bus), GFP_KERNEL);
+   if (!bus)
+   return -ENOMEM;
+
+   /* Map MMIO */
+   bus-mmio = of_iomap(np, 0);
+   if (!bus-mmio)
+   return -ENOMEM;
+
+   /* Host specific */
+   bus-hosttype = BCMA_HOSTTYPE_SOC;
+   bus-ops = bcma_host_soc_ops;
+   bus-host_pdev = pdev;
+
+   /* Register */
+   err = bcma_bus_register(bus);
+   if (err)
+   goto err_unmap_mmio;
+
+   platform_set_drvdata(pdev, bus);
+
+   return err;
+
+err_unmap_mmio:
+   iounmap(bus-mmio);
+   return err;
+}
+
+static int bcma_host_soc_remove(struct platform_device *pdev)
+{
+   struct bcma_bus *bus = platform_get_drvdata(pdev);
+
+   bcma_bus_unregister(bus);
+   iounmap(bus-mmio);
+   platform_set_drvdata(pdev, NULL);
+
+   return 0;
+}
+
+static const struct of_device_id bcma_host_soc_of_match[] = {
+   { .compatible = brcm,bus-aix, },
+   {},
+};
+MODULE_DEVICE_TABLE(of, bcma_host_soc_of_match);
+
+static struct platform_driver bcma_host_soc_driver = {
+   .driver = {
+   .name = bcma-host-soc,
+   .owner = THIS_MODULE,
+   .of_match_table = bcma_host_soc_of_match,
+   },
+   .probe  = bcma_host_soc_probe,
+   .remove = bcma_host_soc_remove,
+};
+module_platform_driver(bcma_host_soc_driver);
+#endif /* CONFIG_OF */
diff --git a/include/linux/bcma/bcma.h b/include/linux/bcma/bcma.h
index 0272e49..7a10d6d 100644
--- a/include/linux/bcma/bcma.h
+++ b/include/linux/bcma/bcma.h
@@ -323,6 +323,8 @@ struct bcma_bus {
struct pci_dev *host_pci;
/* Pointer to the SDIO device (only for BCMA_HOSTTYPE_SDIO) */
struct sdio_func *host_sdio;
+   /* Pointer to platform device (only