diff mbox

[v2,1/2] bcma: register bcma as device tree driver

Message ID 1410904582-6519-1-git-send-email-hauke@hauke-m.de
State Superseded, archived
Headers show

Commit Message

Hauke Mehrtens Sept. 16, 2014, 9:56 p.m. UTC
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 <hauke@hauke-m.de>
---
 Documentation/devicetree/bindings/bus/bcma.txt | 40 +++++++++++++
 drivers/bcma/bcma_private.h                    | 16 +++++
 drivers/bcma/host_soc.c                        | 82 ++++++++++++++++++++++++++
 drivers/bcma/main.c                            | 10 ++++
 include/linux/bcma/bcma.h                      |  2 +
 5 files changed, 150 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/bus/bcma.txt

This is based on wireless-testing and should go into that tree.

changes since:
v1:
 - renamed aix to axi
RFC:
 - reworded the irq description
 - improved the example
 - hocked into bcma_modeinit() and bcma_modexit()

Comments

Rafał Miłecki Sept. 17, 2014, 3:10 p.m. UTC | #1
On 16 September 2014 23:56, Hauke Mehrtens <hauke@hauke-m.de> 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.

Did you get any answer from Arend about detecting IRQs?

If not:
Arend: how much time it make take you to get an answer?
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Arend van Spriel Sept. 18, 2014, 9:42 a.m. UTC | #2
On 09/17/14 17:10, Rafał Miłecki wrote:
> On 16 September 2014 23:56, Hauke Mehrtens<hauke@hauke-m.de>  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.
>
> Did you get any answer from Arend about detecting IRQs?
>
> If not:
> Arend: how much time it make take you to get an answer?

I already discussed this with our chip architect. There is a chip design 
rule that core index corresponds to the irq number. This at least is 
true for the bcm43xx devices, but unsure about others. So that option 
does not seem to fit. That leaves the OOB_ROUTER core I mentioned 
earlier, but it is a chip designers nightmare as they told me. Did not 
sound encouraging enough to start digging in there to obtain the 
information.

Regards,
Arend
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Rafał Miłecki Sept. 18, 2014, 8:03 p.m. UTC | #3
On 16 September 2014 23:56, Hauke Mehrtens <hauke@hauke-m.de> wrote:
> +The cores on the AXI bus are auto detected by bcma. bcma automatically
> +detects the cores

I'm far from being an English expert, but above is kind of pleonasm to me ;)


> and the memory ranges they are using and they get
> +registered afterwards. Automatic detection of the IRQ number is not
> +possible on BCM47xx/BCM53xx ARM and MIPS SoCs.

Should we replace "not possible" with something like "not reliable"?
After the last info we got from Arend.


> +#ifdef CONFIG_BCMA_HOST_SOC
> +/* host_pci.c */

s/pci/soc/


> +#ifdef CONFIG_OF
> +extern int __init bcma_host_soc_register_driver(void);
> +extern void __exit bcma_host_soc_unregister_driver(void);
> +#else
> +static inline int __init bcma_host_soc_register_driver(void)
> +{
> +       return 0;
> +}
> +static inline void __exit bcma_host_soc_unregister_driver(void)
> +{
> +}
> +#endif /* CONFIG_OF */
> +#endif /* CONFIG_BCMA_HOST_SOC */

OK, so you just made bcma_host_soc_(un)register_driver calls safe above.


> diff --git a/drivers/bcma/main.c b/drivers/bcma/main.c
> index c421403..e5d578c 100644
> --- a/drivers/bcma/main.c
> +++ b/drivers/bcma/main.c
> @@ -528,6 +528,13 @@ static int __init bcma_modinit(void)
>         if (err)
>                 return err;
>
> +#ifdef CONFIG_BCMA_HOST_SOC
> +       err = bcma_host_soc_register_driver();
> +       if (err) {
> +               pr_err("SoC host initialization failed\n");
> +               err = 0;
> +       }
> +#endif

And above you check for CONFIG_ anyway.
Hauke Mehrtens Sept. 18, 2014, 8:50 p.m. UTC | #4
On 09/18/2014 11:42 AM, Arend van Spriel wrote:
> On 09/17/14 17:10, Rafał Miłecki wrote:
>> On 16 September 2014 23:56, Hauke Mehrtens<hauke@hauke-m.de>  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.
>>
>> Did you get any answer from Arend about detecting IRQs?
>>
>> If not:
>> Arend: how much time it make take you to get an answer?
> 
> I already discussed this with our chip architect. There is a chip design
> rule that core index corresponds to the irq number. This at least is
> true for the bcm43xx devices, but unsure about others. So that option
> does not seem to fit. That leaves the OOB_ROUTER core I mentioned
> earlier, but it is a chip designers nightmare as they told me. Did not
> sound encouraging enough to start digging in there to obtain the
> information.

Thanks for asking around.

I will go with specifying the IRQs in device tree then.

Hauke
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Hauke Mehrtens Sept. 18, 2014, 8:52 p.m. UTC | #5
On 09/18/2014 10:03 PM, Rafał Miłecki wrote:
> On 16 September 2014 23:56, Hauke Mehrtens <hauke@hauke-m.de> wrote:
>> +The cores on the AXI bus are auto detected by bcma. bcma automatically
>> +detects the cores
> 
> I'm far from being an English expert, but above is kind of pleonasm to me ;)

Yes to me too. ;-)

>> and the memory ranges they are using and they get
>> +registered afterwards. Automatic detection of the IRQ number is not
>> +possible on BCM47xx/BCM53xx ARM and MIPS SoCs.
> 
> Should we replace "not possible" with something like "not reliable"?
> After the last info we got from Arend.

Yes that sounds good.

> 
> 
>> +#ifdef CONFIG_BCMA_HOST_SOC
>> +/* host_pci.c */
> 
> s/pci/soc/
> 
> 
>> +#ifdef CONFIG_OF
>> +extern int __init bcma_host_soc_register_driver(void);
>> +extern void __exit bcma_host_soc_unregister_driver(void);
>> +#else
>> +static inline int __init bcma_host_soc_register_driver(void)
>> +{
>> +       return 0;
>> +}
>> +static inline void __exit bcma_host_soc_unregister_driver(void)
>> +{
>> +}
>> +#endif /* CONFIG_OF */
>> +#endif /* CONFIG_BCMA_HOST_SOC */
> 
> OK, so you just made bcma_host_soc_(un)register_driver calls safe above.
> 
> 
>> diff --git a/drivers/bcma/main.c b/drivers/bcma/main.c
>> index c421403..e5d578c 100644
>> --- a/drivers/bcma/main.c
>> +++ b/drivers/bcma/main.c
>> @@ -528,6 +528,13 @@ static int __init bcma_modinit(void)
>>         if (err)
>>                 return err;
>>
>> +#ifdef CONFIG_BCMA_HOST_SOC
>> +       err = bcma_host_soc_register_driver();
>> +       if (err) {
>> +               pr_err("SoC host initialization failed\n");
>> +               err = 0;
>> +       }
>> +#endif
> 
> And above you check for CONFIG_ anyway.
> 
Yes that sounds good.

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

Patch

diff --git a/Documentation/devicetree/bindings/bus/bcma.txt b/Documentation/devicetree/bindings/bus/bcma.txt
new file mode 100644
index 0000000..f06f5c3
--- /dev/null
+++ b/Documentation/devicetree/bindings/bus/bcma.txt
@@ -0,0 +1,40 @@ 
+Driver for ARM AXI Bus with Broadcom Plugins (bcma)
+
+Required properties:
+
+- compatible : brcm,bus-axi
+
+- reg : iomem address range of chipcommon core
+
+The cores on the AXI bus are auto detected by bcma. bcma automatically 
+detects the cores and the memory ranges they are using and they get 
+registered afterwards. Automatic detection of the IRQ number is not 
+possible on BCM47xx/BCM53xx ARM and MIPS SoCs. To assign IRQ number to 
+the cores, provide them manually through device tree. The IRQ number 
+and the device tree child entry will get assigned to the core with the 
+matching reg address.
+
+Example:
+
+	axi@18000000 {
+		compatible = "brcm,bus-axi";
+		reg = <0x18000000 0x1000>;
+		ranges = <0x00000000 0x18000000 0x00100000>;
+		#address-cells = <1>;
+		#size-cells = <1>;
+
+		ethernet@18024000 {
+			reg = <0x18024000 0x1000>;
+			interrupts = <GIC_SPI 147 IRQ_TYPE_LEVEL_HIGH>;
+		};
+
+		ethernet@18025000 {
+			reg = <0x18025000 0x1000>;
+			interrupts = <GIC_SPI 148 IRQ_TYPE_LEVEL_HIGH>;
+		};
+
+		pcie@18012000 {
+			reg = <0x18012000 0x1000>;
+			interrupts = <GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>;
+		};
+	};
diff --git a/drivers/bcma/bcma_private.h b/drivers/bcma/bcma_private.h
index b40be43..b8728f0 100644
--- a/drivers/bcma/bcma_private.h
+++ b/drivers/bcma/bcma_private.h
@@ -88,6 +88,22 @@  extern int __init bcma_host_pci_init(void);
 extern void __exit bcma_host_pci_exit(void);
 #endif /* CONFIG_BCMA_HOST_PCI */
 
+#ifdef CONFIG_BCMA_HOST_SOC
+/* host_pci.c */
+#ifdef CONFIG_OF
+extern int __init bcma_host_soc_register_driver(void);
+extern void __exit bcma_host_soc_unregister_driver(void);
+#else
+static inline int __init bcma_host_soc_register_driver(void)
+{
+	return 0;
+}
+static inline void __exit bcma_host_soc_unregister_driver(void)
+{
+}
+#endif /* CONFIG_OF */
+#endif /* CONFIG_BCMA_HOST_SOC */
+
 /* driver_pci.c */
 u32 bcma_pcie_read(struct bcma_drv_pci *pc, u32 address);
 
diff --git a/drivers/bcma/host_soc.c b/drivers/bcma/host_soc.c
index 718e054..cfbf3b3 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>
 
@@ -176,6 +179,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;
 
 	/* Initialize struct, detect chip */
 	bcma_init_bus(bus);
@@ -195,3 +199,81 @@  int __init bcma_host_soc_init(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;
+
+	/* Initialize struct, detect chip */
+	bcma_init_bus(bus);
+
+	/* 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-axi", },
+	{},
+};
+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,
+};
+
+int __init bcma_host_soc_register_driver(void)
+{
+	return platform_driver_register(&bcma_host_soc_driver);
+}
+
+void __exit bcma_host_soc_unregister_driver(void)
+{
+	platform_driver_unregister(&bcma_host_soc_driver);
+}
+#endif /* CONFIG_OF */
diff --git a/drivers/bcma/main.c b/drivers/bcma/main.c
index c421403..e5d578c 100644
--- a/drivers/bcma/main.c
+++ b/drivers/bcma/main.c
@@ -528,6 +528,13 @@  static int __init bcma_modinit(void)
 	if (err)
 		return err;
 
+#ifdef CONFIG_BCMA_HOST_SOC
+	err = bcma_host_soc_register_driver();
+	if (err) {
+		pr_err("SoC host initialization failed\n");
+		err = 0;
+	}
+#endif
 #ifdef CONFIG_BCMA_HOST_PCI
 	err = bcma_host_pci_init();
 	if (err) {
@@ -545,6 +552,9 @@  static void __exit bcma_modexit(void)
 #ifdef CONFIG_BCMA_HOST_PCI
 	bcma_host_pci_exit();
 #endif
+#ifdef CONFIG_BCMA_HOST_SOC
+	bcma_host_soc_unregister_driver();
+#endif
 	bus_unregister(&bcma_bus_type);
 }
 module_exit(bcma_modexit)
diff --git a/include/linux/bcma/bcma.h b/include/linux/bcma/bcma.h
index 6345979..729f48e 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 for BCMA_HOSTTYPE_SOC) */
+		struct platform_device *host_pdev;
 	};
 
 	struct bcma_chipinfo chipinfo;