Re: Device Tree Child Node Parsing Question

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On Tue, Dec 23, 2014 at 10:34 AM, Thor Thayer
<tthayer@xxxxxxxxxxxxxxxxxxxxx> wrote:
> Hi,
>
> What is the best way to queue devicetree child nodes so the node is passed
> in the platform_device pointer to the probe() function?
>
> Documentation/devicetree/usage-model.txt has the following:
>
> "For Linux DT support, the generic behaviour is for child devices to be
> registered by the parent's device driver at driver .probe() time."
>
> "Actually, it turns out that registering children of some platform_devices
> as more platform_devices is a common pattern, and the
> device tree support code reflects that and makes the above example
> simpler.  The second argument to of_platform_populate() is an
> of_device_id table, and any node that matches an entry in that table
> will also get its child nodes registered."
>
>
> I tried calling of_platform_populate() in the probe of the a10_sysctl node
> but it doesn't appear to setup the platform device data properly for the
> sub-child nodes.
>
> The top child node (a10_sysctl) is probed properly and has a valid of_node
> passed in. However, the sub-child nodes such as gpio4 have null passed in
> for pdev->dev.of_node (gpio4 probe prototype is int
> a10sycon_gpio_probe(struct platform_device *pdev).
>
> My current solution is to call of_find_matching_node() in
> a10sycon_gpio_probe() to get a valid node pointer but other examples tend to
> dereference pdev->dev.of_node.
>
> Thank you in advance for your insight.

This should work. There are quite a few users already including unit
tests. Can you tell what you are doing differently from those users?

Rob

>
> Thor
>
>
> My device tree looks like this:
>
> / {
>     soc {
>         spi0: spi@fff00000 {
>              compatible = "snps,dw-spi-mmio";
>              #address-cells = <1>;
>              #size-cells = <0>;
>              reg = <0xfff00000 0x1000>;
>              interrupts = <0 154 4>;
>              num-chipselect = <4>;
>              clocks = <&per_base_clk>;
>              status = "okay";
>
>              a10_sysctl: a10_sysctl@0 {
>                 compatible = "altr,a10sycon";
>                 reg = <0>;
>                 interrupt-parent = <&gpio2>;
>                 /* low-level active IRQ at GPIO2_24 */
>                 interrupts = <24 0x8>;
>                 interrupt-controller;
>                 #interrupt-cells = <2>;
>                 spi-max-frequency = <100000>;
>
>                 gpio4: gpio-controller {
>                         compatible = "altr,a10sycon-gpio";
>                         gpio-controller;
>                         #gpio-cells = <2>;
>                         ngpios = <16>;
>                 };
>
>                 a10rst: a10rst {
>                         compatible = "altr,a10sycon-reset";
>                         #reset-cells = <1>;
>                 };
>             };
>         };
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]
  Powered by Linux