Hi Dirk,
On Wed, May 11, 2016 at 1:56 PM, Dirk Behme <[email protected]> wrote:
> On 11.05.2016 10:06, Geert Uytterhoeven wrote:
>> On Wed, May 11, 2016 at 7:29 AM, Dirk Behme <[email protected]>
>> wrote:
>>> --- /dev/null
>>> +++ b/Documentation/devicetree/bindings/misc/renesas,rcar-rst.txt
>>> @@ -0,0 +1,15 @@
>>> +Renesas RCar r8a779x reset module
>>> +-----------------------------------------------------
>>> +This binding defines the reset module found on Renesas RCar r8a779x
>>> +SoCs. The reset module contains several reset related registers,
>>> +the meaning of them is implementation dependent.
>>> +
>>> +Required properties:
>>> +- compatible : "renesas,rcar-rst"
>>> +- reg : Location and size of the reset module
>>> +
>>> +Example:
>>> + reset-controller@e6160000 {
>>> + compatible = "renesas,rcar-rst";
>>> + reg = <0 0xe6160000 0 0x200>;
>>> + };
>>
>>
>> While I understand you want to match on a single comptible value, the RST
>> module itself highly depends on the actual SoC.
>> Furthermore, R-Car Gen1 doesn't have RST.
>>
>> Hence I'd go for requiring 2 compatible values:
>> - An SoC-specific one, e.g. "renesas,r8a7795-rst",
>> - A family-specific one, e.g. "renesas,rcar-gen3-rst".
>>
>> Your driver code can match against the two family-specific compatible
>> values
>> using of_find_matching_node().
>
> This way? See below [1].
>
> Best regards
>
> Dirk
>
> [1]
>
> --- a/drivers/misc/boot-mode-reg/rcar.c
> +++ b/drivers/misc/boot-mode-reg/rcar.c
> @@ -16,24 +16,43 @@
> #include <linux/io.h>
> #include <linux/module.h>
> #include <linux/of.h>
> +#include <linux/of_address.h>
>
> #include <misc/boot-mode-reg.h>
>
> -#define MODEMR 0xe6160060
> +#define RCAR_RST_BASE 0xe6160000
> +#define RCAR_RST_SIZE 0x200
> +#define MODEMR 0x60
> +
> +static struct of_device_id rcar_rst_ids[] __initdata = {
const
> + { .compatible = "renesas,rcar-gen2-rst" },
> + { .compatible = "renesas,rcar-gen3-rst" },
> + {}
> +};
>
> static int __init rcar_read_mode_pins(void)
> {
> - void __iomem *modemr;
> + void __iomem *reset;
> + struct device_node *np;
> int err = -ENOMEM;
> static u32 mode;
>
> - modemr = ioremap_nocache(MODEMR, 4);
> - if (!modemr) {
> - pr_err("failed to map boot mode register");
> + np = of_find_matching_node(NULL, rcar_rst_ids);
Yep, like this.
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/misc/renesas,rcar-rst.txt
> @@ -0,0 +1,24 @@
> +Renesas RCar r8a779x reset module
R-Car Gen2 and Gen3
> +-----------------------------------------------------
> +This binding defines the reset module found on Renesas RCar r8a779x
R-Car Gen2 and Gen3
> +SoCs. The reset module contains several reset related registers,
> +the meaning of them is implementation dependent.
You may want to add more functionality from
http://www.spinics.net/lists/linux-sh/msg44754.html
> +Required properties:
> +- compatible : "renesas,rcar-gen2-rst" for RCar Gen2 or
R-Car
> + "renesas,rcar-gen3-rst" for RCar Gen3
R-Car
> + and additionally a SoC specific property like
> + "renesas,r8a7790-rst" or
> + "renesas,r8a7791-rst" or
> + "renesas,r8a7792-rst" or
> + "renesas,r8a7793-rst" or
> + "renesas,r8a7794-rst" or
> + "renesas,r8a7795-rst" or
> + "renesas,r8a7796-rst"
The SoC-specific compatible values should be listed first.
> +- reg : Location and size of the reset module
> +
> +Example:
> + reset-controller@e6160000 {
> + compatible = "renesas,rcar-gen3-rst", "renesas,r8a7795-rst";
The SoC-specific compatible value should be listed first.
The same is true for the actual dtsi files.
> + reg = <0 0xe6160000 0 0x200>;
> + };
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds