Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'armsoc-drivers' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc

Pull ARM SoC driver updates from Olof Johansson:
"This branch contains platform-related driver updates for ARM and ARM64.

Among them:

- Reset driver updates:
+ New API for dealing with arrays of resets
+ Make unimplemented {de,}assert return success on shared resets
+ MSDKv1 driver
+ Removal of obsolete Gemini reset driver
+ Misc updates for sunxi and Uniphier

- SoC drivers:
+ Platform SoC driver registration on Tegra
+ Shuffle of Qualcomm drivers into a submenu
+ Allwinner A64 support for SRAM
+ Renesas R-Car R3 support
+ Power domains for Rockchip RK3366

- Misc updates and smaller fixes for TEE and memory driver
subsystems"

* tag 'armsoc-drivers' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (54 commits)
firmware: arm_scpi: fix endianness of dev_id in struct dev_pstate_set
soc/tegra: fuse: Add missing semi-colon
soc/tegra: Restrict SoC device registration to Tegra
drivers: soc: sunxi: add support for A64 and its SRAM C
drivers: soc: sunxi: add support for remapping func value to reg value
drivers: soc: sunxi: fix error processing on base address when claiming
dt-bindings: add binding for Allwinner A64 SRAM controller and SRAM C
bus: sunxi-rsb: Enable by default for ARM64
soc/tegra: Register SoC device
firmware: tegra: set drvdata earlier
memory: Convert to using %pOF instead of full_name
soc: Convert to using %pOF instead of full_name
bus: Convert to using %pOF instead of full_name
firmware: Convert to using %pOF instead of full_name
soc: mediatek: add SCPSYS power domain driver for MediaTek MT7622 SoC
soc: mediatek: add header files required for MT7622 SCPSYS dt-binding
soc: mediatek: reduce code duplication of scpsys_probe across all SoCs
dt-bindings: soc: update the binding document for SCPSYS on MediaTek MT7622 SoC
reset: uniphier: add analog amplifiers reset control
reset: uniphier: add video input subsystem reset control
...

+1347 -462
+29
Documentation/devicetree/bindings/arm/amlogic.txt
··· 61 61 - "amlogic,q201" (Meson gxm s912) 62 62 - "kingnovel,r-box-pro" (Meson gxm S912) 63 63 - "nexbox,a1" (Meson gxm s912) 64 + 65 + Amlogic Meson Firmware registers Interface 66 + ------------------------------------------ 67 + 68 + The Meson SoCs have a register bank with status and data shared with the 69 + secure firmware. 70 + 71 + Required properties: 72 + - compatible: For Meson GX SoCs, must be "amlogic,meson-gx-ao-secure", "syscon" 73 + 74 + Properties should indentify components of this register interface : 75 + 76 + Meson GX SoC Information 77 + ------------------------ 78 + A firmware register encodes the SoC type, package and revision information on 79 + the Meson GX SoCs. 80 + If present, the following property should be added : 81 + 82 + Optional properties: 83 + - amlogic,has-chip-id: If present, the interface gives the current SoC version. 84 + 85 + Example 86 + ------- 87 + 88 + ao-secure@140 { 89 + compatible = "amlogic,meson-gx-ao-secure", "syscon"; 90 + reg = <0x0 0x140 0x0 0x140>; 91 + amlogic,has-chip-id; 92 + };
+1
Documentation/devicetree/bindings/power/renesas,rcar-sysc.txt
··· 17 17 - "renesas,r8a7794-sysc" (R-Car E2) 18 18 - "renesas,r8a7795-sysc" (R-Car H3) 19 19 - "renesas,r8a7796-sysc" (R-Car M3-W) 20 + - "renesas,r8a77995-sysc" (R-Car D3) 20 21 - reg: Address start and address range for the device. 21 22 - #power-domain-cells: Must be 1. 22 23
+1
Documentation/devicetree/bindings/reset/renesas,rst.txt
··· 26 26 - "renesas,r8a7794-rst" (R-Car E2) 27 27 - "renesas,r8a7795-rst" (R-Car H3) 28 28 - "renesas,r8a7796-rst" (R-Car M3-W) 29 + - "renesas,r8a77995-rst" (R-Car D3) 29 30 - reg: Address start and address range for the device. 30 31 31 32
+25 -2
Documentation/devicetree/bindings/reset/uniphier-reset.txt
··· 6 6 7 7 Required properties: 8 8 - compatible: should be one of the following: 9 - "socionext,uniphier-sld3-reset" - for sLD3 SoC 10 9 "socionext,uniphier-ld4-reset" - for LD4 SoC 11 10 "socionext,uniphier-pro4-reset" - for Pro4 SoC 12 11 "socionext,uniphier-sld8-reset" - for sLD8 SoC ··· 36 37 37 38 Required properties: 38 39 - compatible: should be one of the following: 39 - "socionext,uniphier-sld3-mio-reset" - for sLD3 SoC 40 40 "socionext,uniphier-ld4-mio-reset" - for LD4 SoC 41 41 "socionext,uniphier-pro4-mio-reset" - for Pro4 SoC 42 42 "socionext,uniphier-sld8-mio-reset" - for sLD8 SoC ··· 85 87 86 88 reset { 87 89 compatible = "socionext,uniphier-ld11-peri-reset"; 90 + #reset-cells = <1>; 91 + }; 92 + 93 + other nodes ... 94 + }; 95 + 96 + 97 + Analog signal amplifier reset 98 + ----------------------------- 99 + 100 + Required properties: 101 + - compatible: should be one of the following: 102 + "socionext,uniphier-ld11-adamv-reset" - for LD11 SoC 103 + "socionext,uniphier-ld20-adamv-reset" - for LD20 SoC 104 + - #reset-cells: should be 1. 105 + 106 + Example: 107 + 108 + adamv@57920000 { 109 + compatible = "socionext,uniphier-ld11-adamv", 110 + "simple-mfd", "syscon"; 111 + reg = <0x57920000 0x1000>; 112 + 113 + adamv_rst: reset { 114 + compatible = "socionext,uniphier-ld11-adamv-reset"; 88 115 #reset-cells = <1>; 89 116 }; 90 117
+3
Documentation/devicetree/bindings/soc/mediatek/scpsys.txt
··· 12 12 - include/dt-bindings/power/mt8173-power.h 13 13 - include/dt-bindings/power/mt6797-power.h 14 14 - include/dt-bindings/power/mt2701-power.h 15 + - include/dt-bindings/power/mt7622-power.h 15 16 16 17 Required properties: 17 18 - compatible: Should be one of: 18 19 - "mediatek,mt2701-scpsys" 19 20 - "mediatek,mt6797-scpsys" 21 + - "mediatek,mt7622-scpsys" 20 22 - "mediatek,mt8173-scpsys" 21 23 - #power-domain-cells: Must be 1 22 24 - reg: Address range of the SCPSYS unit ··· 28 26 enabled before enabling certain power domains. 29 27 Required clocks for MT2701: "mm", "mfg", "ethif" 30 28 Required clocks for MT6797: "mm", "mfg", "vdec" 29 + Required clocks for MT7622: "hif_sel" 31 30 Required clocks for MT8173: "mm", "mfg", "venc", "venc_lt" 32 31 33 32 Optional properties:
+3
Documentation/devicetree/bindings/soc/rockchip/power_domain.txt
··· 7 7 - compatible: Should be one of the following. 8 8 "rockchip,rk3288-power-controller" - for RK3288 SoCs. 9 9 "rockchip,rk3328-power-controller" - for RK3328 SoCs. 10 + "rockchip,rk3366-power-controller" - for RK3366 SoCs. 10 11 "rockchip,rk3368-power-controller" - for RK3368 SoCs. 11 12 "rockchip,rk3399-power-controller" - for RK3399 SoCs. 12 13 - #power-domain-cells: Number of cells in a power-domain specifier. ··· 19 18 - reg: index of the power domain, should use macros in: 20 19 "include/dt-bindings/power/rk3288-power.h" - for RK3288 type power domain. 21 20 "include/dt-bindings/power/rk3328-power.h" - for RK3328 type power domain. 21 + "include/dt-bindings/power/rk3366-power.h" - for RK3366 type power domain. 22 22 "include/dt-bindings/power/rk3368-power.h" - for RK3368 type power domain. 23 23 "include/dt-bindings/power/rk3399-power.h" - for RK3399 type power domain. 24 24 - clocks (optional): phandles to clocks which need to be enabled while power domain ··· 95 93 The index should use macros in: 96 94 "include/dt-bindings/power/rk3288-power.h" - for rk3288 type power domain. 97 95 "include/dt-bindings/power/rk3328-power.h" - for rk3328 type power domain. 96 + "include/dt-bindings/power/rk3366-power.h" - for rk3366 type power domain. 98 97 "include/dt-bindings/power/rk3368-power.h" - for rk3368 type power domain. 99 98 "include/dt-bindings/power/rk3399-power.h" - for rk3399 type power domain. 100 99
+7 -2
Documentation/devicetree/bindings/sram/sunxi-sram.txt
··· 9 9 --------------- 10 10 11 11 Required properties: 12 - - compatible : "allwinner,sun4i-a10-sram-controller" 12 + - compatible : should be: 13 + - "allwinner,sun4i-a10-sram-controller" 14 + - "allwinner,sun50i-a64-sram-controller" 13 15 - reg : sram controller register offset + length 14 16 15 17 SRAM nodes ··· 24 22 SRAM controller as subnodes. These sections are represented following 25 23 once again the representation described in the mmio-sram binding. 26 24 27 - The valid sections compatible are: 25 + The valid sections compatible for A10 are: 28 26 - allwinner,sun4i-a10-sram-a3-a4 29 27 - allwinner,sun4i-a10-sram-d 28 + 29 + The valid sections compatible for A64 are: 30 + - allwinner,sun50i-a64-sram-c 30 31 31 32 Devices using SRAM sections 32 33 ---------------------------
+7
MAINTAINERS
··· 12867 12867 S: Maintained 12868 12868 F: drivers/mmc/host/dw_mmc* 12869 12869 12870 + SYNOPSYS HSDK RESET CONTROLLER DRIVER 12871 + M: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com> 12872 + S: Supported 12873 + F: drivers/reset/reset-hsdk-v1.c 12874 + F: include/dt-bindings/reset/snps,hsdk-v1-reset.h 12875 + F: Documentation/devicetree/bindings/reset/snps,hsdk-v1-reset.txt 12876 + 12870 12877 SYSTEM CONFIGURATION (SYSCON) 12871 12878 M: Lee Jones <lee.jones@linaro.org> 12872 12879 M: Arnd Bergmann <arnd@arndb.de>
+2
arch/arm/mach-mediatek/mediatek.c
··· 30 30 31 31 if (of_machine_is_compatible("mediatek,mt6589") || 32 32 of_machine_is_compatible("mediatek,mt7623") || 33 + of_machine_is_compatible("mediatek,mt7623a") || 33 34 of_machine_is_compatible("mediatek,mt8135") || 34 35 of_machine_is_compatible("mediatek,mt8127")) { 35 36 /* turn on GPT6 which ungates arch timer clocks */ ··· 50 49 "mediatek,mt6589", 51 50 "mediatek,mt6592", 52 51 "mediatek,mt7623", 52 + "mediatek,mt7623a", 53 53 "mediatek,mt8127", 54 54 "mediatek,mt8135", 55 55 NULL,
+1
arch/arm/mach-mediatek/platsmp.c
··· 59 59 static const struct of_device_id mtk_smp_boot_infos[] __initconst = { 60 60 { .compatible = "mediatek,mt6589", .data = &mtk_mt6589_boot }, 61 61 { .compatible = "mediatek,mt7623", .data = &mtk_mt7623_boot }, 62 + { .compatible = "mediatek,mt7623a", .data = &mtk_mt7623_boot }, 62 63 }; 63 64 64 65 static void __iomem *mtk_smp_base;
+1 -28
arch/arm/mach-tegra/tegra.c
··· 84 84 85 85 static void __init tegra_dt_init(void) 86 86 { 87 - struct soc_device_attribute *soc_dev_attr; 88 - struct soc_device *soc_dev; 89 - struct device *parent = NULL; 87 + struct device *parent = tegra_soc_device_register(); 90 88 91 - soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL); 92 - if (!soc_dev_attr) 93 - goto out; 94 - 95 - soc_dev_attr->family = kasprintf(GFP_KERNEL, "Tegra"); 96 - soc_dev_attr->revision = kasprintf(GFP_KERNEL, "%d", 97 - tegra_sku_info.revision); 98 - soc_dev_attr->soc_id = kasprintf(GFP_KERNEL, "%u", tegra_get_chip_id()); 99 - 100 - soc_dev = soc_device_register(soc_dev_attr); 101 - if (IS_ERR(soc_dev)) { 102 - kfree(soc_dev_attr->family); 103 - kfree(soc_dev_attr->revision); 104 - kfree(soc_dev_attr->soc_id); 105 - kfree(soc_dev_attr); 106 - goto out; 107 - } 108 - 109 - parent = soc_device_to_device(soc_dev); 110 - 111 - /* 112 - * Finished with the static registrations now; fill in the missing 113 - * devices 114 - */ 115 - out: 116 89 of_platform_default_populate(NULL, NULL, parent); 117 90 } 118 91
+1 -1
drivers/bus/Kconfig
··· 132 132 133 133 config SUNXI_RSB 134 134 tristate "Allwinner sunXi Reduced Serial Bus Driver" 135 - default MACH_SUN8I || MACH_SUN9I 135 + default MACH_SUN8I || MACH_SUN9I || ARM64 136 136 depends on ARCH_SUNXI 137 137 select REGMAP 138 138 help
+6 -6
drivers/bus/arm-cci.c
··· 2124 2124 return -ENODEV; 2125 2125 2126 2126 port = __cci_ace_get_port(dn, ACE_LITE_PORT); 2127 - if (WARN_ONCE(port < 0, "node %s ACE lite port look-up failure\n", 2128 - dn->full_name)) 2127 + if (WARN_ONCE(port < 0, "node %pOF ACE lite port look-up failure\n", 2128 + dn)) 2129 2129 return -ENODEV; 2130 2130 cci_port_control(port, enable); 2131 2131 return 0; ··· 2200 2200 2201 2201 if (of_property_read_string(cp, "interface-type", 2202 2202 &match_str)) { 2203 - WARN(1, "node %s missing interface-type property\n", 2204 - cp->full_name); 2203 + WARN(1, "node %pOF missing interface-type property\n", 2204 + cp); 2205 2205 continue; 2206 2206 } 2207 2207 is_ace = strcmp(match_str, "ace") == 0; 2208 2208 if (!is_ace && strcmp(match_str, "ace-lite")) { 2209 - WARN(1, "node %s containing invalid interface-type property, skipping it\n", 2210 - cp->full_name); 2209 + WARN(1, "node %pOF containing invalid interface-type property, skipping it\n", 2210 + cp); 2211 2211 continue; 2212 2212 } 2213 2213
+4 -4
drivers/bus/imx-weim.c
··· 156 156 157 157 ret = weim_timing_setup(child, base, devtype); 158 158 if (ret) 159 - dev_warn(&pdev->dev, "%s set timing failed.\n", 160 - child->full_name); 159 + dev_warn(&pdev->dev, "%pOF set timing failed.\n", 160 + child); 161 161 else 162 162 have_child = 1; 163 163 } ··· 166 166 ret = of_platform_default_populate(pdev->dev.of_node, 167 167 NULL, &pdev->dev); 168 168 if (ret) 169 - dev_err(&pdev->dev, "%s fail to create devices.\n", 170 - pdev->dev.of_node->full_name); 169 + dev_err(&pdev->dev, "%pOF fail to create devices.\n", 170 + pdev->dev.of_node); 171 171 return ret; 172 172 } 173 173
+11 -11
drivers/bus/sunxi-rsb.c
··· 556 556 557 557 /* Runtime addresses for all slaves should be set first */ 558 558 for_each_available_child_of_node(np, child) { 559 - dev_dbg(dev, "setting child %s runtime address\n", 560 - child->full_name); 559 + dev_dbg(dev, "setting child %pOF runtime address\n", 560 + child); 561 561 562 562 ret = of_property_read_u32(child, "reg", &hwaddr); 563 563 if (ret) { 564 - dev_err(dev, "%s: invalid 'reg' property: %d\n", 565 - child->full_name, ret); 564 + dev_err(dev, "%pOF: invalid 'reg' property: %d\n", 565 + child, ret); 566 566 continue; 567 567 } 568 568 569 569 rtaddr = sunxi_rsb_get_rtaddr(hwaddr); 570 570 if (!rtaddr) { 571 - dev_err(dev, "%s: unknown hardware device address\n", 572 - child->full_name); 571 + dev_err(dev, "%pOF: unknown hardware device address\n", 572 + child); 573 573 continue; 574 574 } 575 575 ··· 586 586 /* send command */ 587 587 ret = _sunxi_rsb_run_xfer(rsb); 588 588 if (ret) 589 - dev_warn(dev, "%s: set runtime address failed: %d\n", 590 - child->full_name, ret); 589 + dev_warn(dev, "%pOF: set runtime address failed: %d\n", 590 + child, ret); 591 591 } 592 592 593 593 /* Then we start adding devices and probing them */ 594 594 for_each_available_child_of_node(np, child) { 595 595 struct sunxi_rsb_device *rdev; 596 596 597 - dev_dbg(dev, "adding child %s\n", child->full_name); 597 + dev_dbg(dev, "adding child %pOF\n", child); 598 598 599 599 ret = of_property_read_u32(child, "reg", &hwaddr); 600 600 if (ret) ··· 606 606 607 607 rdev = sunxi_rsb_device_create(rsb, child, hwaddr, rtaddr); 608 608 if (IS_ERR(rdev)) 609 - dev_err(dev, "failed to add child device %s: %ld\n", 610 - child->full_name, PTR_ERR(rdev)); 609 + dev_err(dev, "failed to add child device %pOF: %ld\n", 610 + child, PTR_ERR(rdev)); 611 611 } 612 612 613 613 return 0;
+2 -2
drivers/firmware/arm_scpi.c
··· 357 357 } __packed; 358 358 359 359 struct dev_pstate_set { 360 - u16 dev_id; 360 + __le16 dev_id; 361 361 u8 pstate; 362 362 } __packed; 363 363 ··· 965 965 966 966 count = of_count_phandle_with_args(np, "mboxes", "#mbox-cells"); 967 967 if (count < 0) { 968 - dev_err(dev, "no mboxes property in '%s'\n", np->full_name); 968 + dev_err(dev, "no mboxes property in '%pOF'\n", np); 969 969 return -ENODEV; 970 970 } 971 971
+2 -2
drivers/firmware/psci.c
··· 280 280 "arm,psci-suspend-param", 281 281 &state); 282 282 if (ret) { 283 - pr_warn(" * %s missing arm,psci-suspend-param property\n", 284 - state_node->full_name); 283 + pr_warn(" * %pOF missing arm,psci-suspend-param property\n", 284 + state_node); 285 285 of_node_put(state_node); 286 286 goto free_mem; 287 287 }
+2 -2
drivers/firmware/tegra/bpmp.c
··· 806 806 807 807 dev_info(&pdev->dev, "firmware: %s\n", tag); 808 808 809 + platform_set_drvdata(pdev, bpmp); 810 + 809 811 err = of_platform_default_populate(pdev->dev.of_node, NULL, &pdev->dev); 810 812 if (err < 0) 811 813 goto free_mrq; ··· 823 821 err = tegra_bpmp_init_powergates(bpmp); 824 822 if (err < 0) 825 823 goto free_mrq; 826 - 827 - platform_set_drvdata(pdev, bpmp); 828 824 829 825 return 0; 830 826
+8 -9
drivers/memory/atmel-ebi.c
··· 159 159 out: 160 160 if (ret) { 161 161 dev_err(ebid->ebi->dev, 162 - "missing or invalid timings definition in %s", 163 - np->full_name); 162 + "missing or invalid timings definition in %pOF", 163 + np); 164 164 return ret; 165 165 } 166 166 ··· 270 270 return -EINVAL; 271 271 272 272 if ((ret > 0 && !required) || (!ret && required)) { 273 - dev_err(ebid->ebi->dev, "missing atmel,smc- properties in %s", 274 - np->full_name); 273 + dev_err(ebid->ebi->dev, "missing atmel,smc- properties in %pOF", 274 + np); 275 275 return -EINVAL; 276 276 } 277 277 ··· 314 314 315 315 if (cs >= AT91_MATRIX_EBI_NUM_CS || 316 316 !(ebi->caps->available_cs & BIT(cs))) { 317 - dev_err(dev, "invalid reg property in %s\n", 318 - np->full_name); 317 + dev_err(dev, "invalid reg property in %pOF\n", np); 319 318 return -EINVAL; 320 319 } 321 320 ··· 323 324 } 324 325 325 326 if (!numcs) { 326 - dev_err(dev, "invalid reg property in %s\n", np->full_name); 327 + dev_err(dev, "invalid reg property in %pOF\n", np); 327 328 return -EINVAL; 328 329 } 329 330 ··· 575 576 576 577 ret = atmel_ebi_dev_setup(ebi, child, reg_cells); 577 578 if (ret) { 578 - dev_err(dev, "failed to configure EBI bus for %s, disabling the device", 579 - child->full_name); 579 + dev_err(dev, "failed to configure EBI bus for %pOF, disabling the device", 580 + child); 580 581 581 582 ret = atmel_ebi_dev_disable(ebi, child); 582 583 if (ret)
+6 -6
drivers/memory/jz4780-nemc.c
··· 322 322 bank = of_read_number(prop, 1); 323 323 if (bank < 1 || bank >= JZ4780_NEMC_NUM_BANKS) { 324 324 dev_err(nemc->dev, 325 - "%s requests invalid bank %u\n", 326 - child->full_name, bank); 325 + "%pOF requests invalid bank %u\n", 326 + child, bank); 327 327 328 328 /* Will continue the outer loop below. */ 329 329 referenced = 0; ··· 334 334 } 335 335 336 336 if (!referenced) { 337 - dev_err(nemc->dev, "%s has no addresses\n", 338 - child->full_name); 337 + dev_err(nemc->dev, "%pOF has no addresses\n", 338 + child); 339 339 continue; 340 340 } else if (nemc->banks_present & referenced) { 341 - dev_err(nemc->dev, "%s conflicts with another node\n", 342 - child->full_name); 341 + dev_err(nemc->dev, "%pOF conflicts with another node\n", 342 + child); 343 343 continue; 344 344 } 345 345
+6 -6
drivers/memory/mvebu-devbus.c
··· 105 105 106 106 err = of_property_read_u32(node, name, &time_ps); 107 107 if (err < 0) { 108 - dev_err(devbus->dev, "%s has no '%s' property\n", 109 - name, node->full_name); 108 + dev_err(devbus->dev, "%pOF has no '%s' property\n", 109 + node, name); 110 110 return err; 111 111 } 112 112 ··· 127 127 err = of_property_read_u32(node, "devbus,bus-width", &r->bus_width); 128 128 if (err < 0) { 129 129 dev_err(devbus->dev, 130 - "%s has no 'devbus,bus-width' property\n", 131 - node->full_name); 130 + "%pOF has no 'devbus,bus-width' property\n", 131 + node); 132 132 return err; 133 133 } 134 134 ··· 180 180 &w->sync_enable); 181 181 if (err < 0) { 182 182 dev_err(devbus->dev, 183 - "%s has no 'devbus,sync-enable' property\n", 184 - node->full_name); 183 + "%pOF has no 'devbus,sync-enable' property\n", 184 + node); 185 185 return err; 186 186 } 187 187 }
+8 -8
drivers/memory/omap-gpmc.c
··· 1930 1930 struct omap_onenand_platform_data *gpmc_onenand_data; 1931 1931 1932 1932 if (of_property_read_u32(child, "reg", &val) < 0) { 1933 - dev_err(&pdev->dev, "%s has no 'reg' property\n", 1934 - child->full_name); 1933 + dev_err(&pdev->dev, "%pOF has no 'reg' property\n", 1934 + child); 1935 1935 return -ENODEV; 1936 1936 } 1937 1937 ··· 1979 1979 struct gpmc_device *gpmc = platform_get_drvdata(pdev); 1980 1980 1981 1981 if (of_property_read_u32(child, "reg", &cs) < 0) { 1982 - dev_err(&pdev->dev, "%s has no 'reg' property\n", 1983 - child->full_name); 1982 + dev_err(&pdev->dev, "%pOF has no 'reg' property\n", 1983 + child); 1984 1984 return -ENODEV; 1985 1985 } 1986 1986 1987 1987 if (of_address_to_resource(child, 0, &res) < 0) { 1988 - dev_err(&pdev->dev, "%s has malformed 'reg' property\n", 1989 - child->full_name); 1988 + dev_err(&pdev->dev, "%pOF has malformed 'reg' property\n", 1989 + child); 1990 1990 return -ENODEV; 1991 1991 } 1992 1992 ··· 2084 2084 ret = of_property_read_u32(child, "bank-width", 2085 2085 &gpmc_s.device_width); 2086 2086 if (ret < 0) { 2087 - dev_err(&pdev->dev, "%s has no 'bank-width' property\n", 2088 - child->full_name); 2087 + dev_err(&pdev->dev, "%pOF has no 'bank-width' property\n", 2088 + child); 2089 2089 goto err; 2090 2090 } 2091 2091 }
+4 -5
drivers/reset/Kconfig
··· 34 34 help 35 35 This enables the reset controller driver for Marvell Berlin SoCs. 36 36 37 - config RESET_GEMINI 38 - bool "Gemini Reset Driver" if COMPILE_TEST 39 - default ARCH_GEMINI 40 - select MFD_SYSCON 37 + config RESET_HSDK_V1 38 + bool "HSDK v1 Reset Driver" 39 + default n 41 40 help 42 - This enables the reset controller driver for Cortina Systems Gemini. 41 + This enables the reset controller driver for HSDK v1. 43 42 44 43 config RESET_IMX7 45 44 bool "i.MX7 Reset Driver" if COMPILE_TEST
+1 -1
drivers/reset/Makefile
··· 5 5 obj-$(CONFIG_RESET_A10SR) += reset-a10sr.o 6 6 obj-$(CONFIG_RESET_ATH79) += reset-ath79.o 7 7 obj-$(CONFIG_RESET_BERLIN) += reset-berlin.o 8 - obj-$(CONFIG_RESET_GEMINI) += reset-gemini.o 8 + obj-$(CONFIG_RESET_HSDK_V1) += reset-hsdk-v1.o 9 9 obj-$(CONFIG_RESET_IMX7) += reset-imx7.o 10 10 obj-$(CONFIG_RESET_LPC18XX) += reset-lpc18xx.o 11 11 obj-$(CONFIG_RESET_MESON) += reset-meson.o
+233 -5
drivers/reset/core.c
··· 43 43 unsigned int id; 44 44 struct kref refcnt; 45 45 bool shared; 46 + bool array; 46 47 atomic_t deassert_count; 47 48 atomic_t triggered_count; 49 + }; 50 + 51 + /** 52 + * struct reset_control_array - an array of reset controls 53 + * @base: reset control for compatibility with reset control API functions 54 + * @num_rstcs: number of reset controls 55 + * @rstc: array of reset controls 56 + */ 57 + struct reset_control_array { 58 + struct reset_control base; 59 + unsigned int num_rstcs; 60 + struct reset_control *rstc[]; 48 61 }; 49 62 50 63 /** ··· 148 135 } 149 136 EXPORT_SYMBOL_GPL(devm_reset_controller_register); 150 137 138 + static inline struct reset_control_array * 139 + rstc_to_array(struct reset_control *rstc) { 140 + return container_of(rstc, struct reset_control_array, base); 141 + } 142 + 143 + static int reset_control_array_reset(struct reset_control_array *resets) 144 + { 145 + int ret, i; 146 + 147 + for (i = 0; i < resets->num_rstcs; i++) { 148 + ret = reset_control_reset(resets->rstc[i]); 149 + if (ret) 150 + return ret; 151 + } 152 + 153 + return 0; 154 + } 155 + 156 + static int reset_control_array_assert(struct reset_control_array *resets) 157 + { 158 + int ret, i; 159 + 160 + for (i = 0; i < resets->num_rstcs; i++) { 161 + ret = reset_control_assert(resets->rstc[i]); 162 + if (ret) 163 + goto err; 164 + } 165 + 166 + return 0; 167 + 168 + err: 169 + while (i--) 170 + reset_control_deassert(resets->rstc[i]); 171 + return ret; 172 + } 173 + 174 + static int reset_control_array_deassert(struct reset_control_array *resets) 175 + { 176 + int ret, i; 177 + 178 + for (i = 0; i < resets->num_rstcs; i++) { 179 + ret = reset_control_deassert(resets->rstc[i]); 180 + if (ret) 181 + goto err; 182 + } 183 + 184 + return 0; 185 + 186 + err: 187 + while (i--) 188 + reset_control_assert(resets->rstc[i]); 189 + return ret; 190 + } 191 + 192 + static inline bool reset_control_is_array(struct reset_control *rstc) 193 + { 194 + return rstc->array; 195 + } 196 + 151 197 /** 152 198 * reset_control_reset - reset the controlled device 153 199 * @rstc: reset controller ··· 229 157 230 158 if (WARN_ON(IS_ERR(rstc))) 231 159 return -EINVAL; 160 + 161 + if (reset_control_is_array(rstc)) 162 + return reset_control_array_reset(rstc_to_array(rstc)); 232 163 233 164 if (!rstc->rcdev->ops->reset) 234 165 return -ENOTSUPP; ··· 277 202 if (WARN_ON(IS_ERR(rstc))) 278 203 return -EINVAL; 279 204 280 - if (!rstc->rcdev->ops->assert) 281 - return -ENOTSUPP; 205 + if (reset_control_is_array(rstc)) 206 + return reset_control_array_assert(rstc_to_array(rstc)); 282 207 283 208 if (rstc->shared) { 284 209 if (WARN_ON(atomic_read(&rstc->triggered_count) != 0)) ··· 289 214 290 215 if (atomic_dec_return(&rstc->deassert_count) != 0) 291 216 return 0; 217 + 218 + /* 219 + * Shared reset controls allow the reset line to be in any state 220 + * after this call, so doing nothing is a valid option. 221 + */ 222 + if (!rstc->rcdev->ops->assert) 223 + return 0; 224 + } else { 225 + /* 226 + * If the reset controller does not implement .assert(), there 227 + * is no way to guarantee that the reset line is asserted after 228 + * this call. 229 + */ 230 + if (!rstc->rcdev->ops->assert) 231 + return -ENOTSUPP; 292 232 } 293 233 294 234 return rstc->rcdev->ops->assert(rstc->rcdev, rstc->id); ··· 330 240 if (WARN_ON(IS_ERR(rstc))) 331 241 return -EINVAL; 332 242 333 - if (!rstc->rcdev->ops->deassert) 334 - return -ENOTSUPP; 243 + if (reset_control_is_array(rstc)) 244 + return reset_control_array_deassert(rstc_to_array(rstc)); 335 245 336 246 if (rstc->shared) { 337 247 if (WARN_ON(atomic_read(&rstc->triggered_count) != 0)) ··· 340 250 if (atomic_inc_return(&rstc->deassert_count) != 1) 341 251 return 0; 342 252 } 253 + 254 + /* 255 + * If the reset controller does not implement .deassert(), we assume 256 + * that it handles self-deasserting reset lines via .reset(). In that 257 + * case, the reset lines are deasserted by default. If that is not the 258 + * case, the reset controller driver should implement .deassert() and 259 + * return -ENOTSUPP. 260 + */ 261 + if (!rstc->rcdev->ops->deassert) 262 + return 0; 343 263 344 264 return rstc->rcdev->ops->deassert(rstc->rcdev, rstc->id); 345 265 } ··· 366 266 if (!rstc) 367 267 return 0; 368 268 369 - if (WARN_ON(IS_ERR(rstc))) 269 + if (WARN_ON(IS_ERR(rstc)) || reset_control_is_array(rstc)) 370 270 return -EINVAL; 371 271 372 272 if (rstc->rcdev->ops->status) ··· 504 404 } 505 405 EXPORT_SYMBOL_GPL(__reset_control_get); 506 406 407 + static void reset_control_array_put(struct reset_control_array *resets) 408 + { 409 + int i; 410 + 411 + mutex_lock(&reset_list_mutex); 412 + for (i = 0; i < resets->num_rstcs; i++) 413 + __reset_control_put_internal(resets->rstc[i]); 414 + mutex_unlock(&reset_list_mutex); 415 + } 416 + 507 417 /** 508 418 * reset_control_put - free the reset controller 509 419 * @rstc: reset controller ··· 522 412 { 523 413 if (IS_ERR_OR_NULL(rstc)) 524 414 return; 415 + 416 + if (reset_control_is_array(rstc)) { 417 + reset_control_array_put(rstc_to_array(rstc)); 418 + return; 419 + } 525 420 526 421 mutex_lock(&reset_list_mutex); 527 422 __reset_control_put_internal(rstc); ··· 587 472 return ret; 588 473 } 589 474 EXPORT_SYMBOL_GPL(device_reset); 475 + 476 + /** 477 + * APIs to manage an array of reset controls. 478 + */ 479 + /** 480 + * of_reset_control_get_count - Count number of resets available with a device 481 + * 482 + * @node: device node that contains 'resets'. 483 + * 484 + * Returns positive reset count on success, or error number on failure and 485 + * on count being zero. 486 + */ 487 + static int of_reset_control_get_count(struct device_node *node) 488 + { 489 + int count; 490 + 491 + if (!node) 492 + return -EINVAL; 493 + 494 + count = of_count_phandle_with_args(node, "resets", "#reset-cells"); 495 + if (count == 0) 496 + count = -ENOENT; 497 + 498 + return count; 499 + } 500 + 501 + /** 502 + * of_reset_control_array_get - Get a list of reset controls using 503 + * device node. 504 + * 505 + * @np: device node for the device that requests the reset controls array 506 + * @shared: whether reset controls are shared or not 507 + * @optional: whether it is optional to get the reset controls 508 + * 509 + * Returns pointer to allocated reset_control_array on success or 510 + * error on failure 511 + */ 512 + struct reset_control * 513 + of_reset_control_array_get(struct device_node *np, bool shared, bool optional) 514 + { 515 + struct reset_control_array *resets; 516 + struct reset_control *rstc; 517 + int num, i; 518 + 519 + num = of_reset_control_get_count(np); 520 + if (num < 0) 521 + return optional ? NULL : ERR_PTR(num); 522 + 523 + resets = kzalloc(sizeof(*resets) + sizeof(resets->rstc[0]) * num, 524 + GFP_KERNEL); 525 + if (!resets) 526 + return ERR_PTR(-ENOMEM); 527 + 528 + for (i = 0; i < num; i++) { 529 + rstc = __of_reset_control_get(np, NULL, i, shared, optional); 530 + if (IS_ERR(rstc)) 531 + goto err_rst; 532 + resets->rstc[i] = rstc; 533 + } 534 + resets->num_rstcs = num; 535 + resets->base.array = true; 536 + 537 + return &resets->base; 538 + 539 + err_rst: 540 + mutex_lock(&reset_list_mutex); 541 + while (--i >= 0) 542 + __reset_control_put_internal(resets->rstc[i]); 543 + mutex_unlock(&reset_list_mutex); 544 + 545 + kfree(resets); 546 + 547 + return rstc; 548 + } 549 + EXPORT_SYMBOL_GPL(of_reset_control_array_get); 550 + 551 + /** 552 + * devm_reset_control_array_get - Resource managed reset control array get 553 + * 554 + * @dev: device that requests the list of reset controls 555 + * @shared: whether reset controls are shared or not 556 + * @optional: whether it is optional to get the reset controls 557 + * 558 + * The reset control array APIs are intended for a list of resets 559 + * that just have to be asserted or deasserted, without any 560 + * requirements on the order. 561 + * 562 + * Returns pointer to allocated reset_control_array on success or 563 + * error on failure 564 + */ 565 + struct reset_control * 566 + devm_reset_control_array_get(struct device *dev, bool shared, bool optional) 567 + { 568 + struct reset_control **devres; 569 + struct reset_control *rstc; 570 + 571 + devres = devres_alloc(devm_reset_control_release, sizeof(*devres), 572 + GFP_KERNEL); 573 + if (!devres) 574 + return ERR_PTR(-ENOMEM); 575 + 576 + rstc = of_reset_control_array_get(dev->of_node, shared, optional); 577 + if (IS_ERR(rstc)) { 578 + devres_free(devres); 579 + return rstc; 580 + } 581 + 582 + *devres = rstc; 583 + devres_add(dev, devres); 584 + 585 + return rstc; 586 + } 587 + EXPORT_SYMBOL_GPL(devm_reset_control_array_get);
-110
drivers/reset/reset-gemini.c
··· 1 - /* 2 - * Cortina Gemini Reset controller driver 3 - * Copyright (C) 2017 Linus Walleij <linus.walleij@linaro.org> 4 - * 5 - * This program is free software; you can redistribute it and/or modify 6 - * it under the terms of the GNU General Public License version 2 as 7 - * published by the Free Software Foundation. 8 - */ 9 - 10 - #include <linux/err.h> 11 - #include <linux/init.h> 12 - #include <linux/mfd/syscon.h> 13 - #include <linux/regmap.h> 14 - #include <linux/of.h> 15 - #include <linux/platform_device.h> 16 - #include <linux/reset-controller.h> 17 - #include <dt-bindings/reset/cortina,gemini-reset.h> 18 - 19 - /** 20 - * struct gemini_reset - gemini reset controller 21 - * @map: regmap to access the containing system controller 22 - * @rcdev: reset controller device 23 - */ 24 - struct gemini_reset { 25 - struct regmap *map; 26 - struct reset_controller_dev rcdev; 27 - }; 28 - 29 - #define GEMINI_GLOBAL_SOFT_RESET 0x0c 30 - 31 - #define to_gemini_reset(p) \ 32 - container_of((p), struct gemini_reset, rcdev) 33 - 34 - /* 35 - * This is a self-deasserting reset controller. 36 - */ 37 - static int gemini_reset(struct reset_controller_dev *rcdev, 38 - unsigned long id) 39 - { 40 - struct gemini_reset *gr = to_gemini_reset(rcdev); 41 - 42 - /* Manual says to always set BIT 30 (CPU1) to 1 */ 43 - return regmap_write(gr->map, 44 - GEMINI_GLOBAL_SOFT_RESET, 45 - BIT(GEMINI_RESET_CPU1) | BIT(id)); 46 - } 47 - 48 - static int gemini_reset_status(struct reset_controller_dev *rcdev, 49 - unsigned long id) 50 - { 51 - struct gemini_reset *gr = to_gemini_reset(rcdev); 52 - u32 val; 53 - int ret; 54 - 55 - ret = regmap_read(gr->map, GEMINI_GLOBAL_SOFT_RESET, &val); 56 - if (ret) 57 - return ret; 58 - 59 - return !!(val & BIT(id)); 60 - } 61 - 62 - static const struct reset_control_ops gemini_reset_ops = { 63 - .reset = gemini_reset, 64 - .status = gemini_reset_status, 65 - }; 66 - 67 - static int gemini_reset_probe(struct platform_device *pdev) 68 - { 69 - struct gemini_reset *gr; 70 - struct device *dev = &pdev->dev; 71 - struct device_node *np = dev->of_node; 72 - int ret; 73 - 74 - gr = devm_kzalloc(dev, sizeof(*gr), GFP_KERNEL); 75 - if (!gr) 76 - return -ENOMEM; 77 - 78 - gr->map = syscon_node_to_regmap(np); 79 - if (IS_ERR(gr->map)) { 80 - ret = PTR_ERR(gr->map); 81 - dev_err(dev, "unable to get regmap (%d)", ret); 82 - return ret; 83 - } 84 - gr->rcdev.owner = THIS_MODULE; 85 - gr->rcdev.nr_resets = 32; 86 - gr->rcdev.ops = &gemini_reset_ops; 87 - gr->rcdev.of_node = pdev->dev.of_node; 88 - 89 - ret = devm_reset_controller_register(&pdev->dev, &gr->rcdev); 90 - if (ret) 91 - return ret; 92 - 93 - dev_info(dev, "registered Gemini reset controller\n"); 94 - return 0; 95 - } 96 - 97 - static const struct of_device_id gemini_reset_dt_ids[] = { 98 - { .compatible = "cortina,gemini-syscon", }, 99 - { /* sentinel */ }, 100 - }; 101 - 102 - static struct platform_driver gemini_reset_driver = { 103 - .probe = gemini_reset_probe, 104 - .driver = { 105 - .name = "gemini-reset", 106 - .of_match_table = gemini_reset_dt_ids, 107 - .suppress_bind_attrs = true, 108 - }, 109 - }; 110 - builtin_platform_driver(gemini_reset_driver);
+137
drivers/reset/reset-hsdk-v1.c
··· 1 + /* 2 + * Copyright (C) 2017 Synopsys. 3 + * 4 + * Synopsys HSDKv1 SDP reset driver. 5 + * 6 + * This file is licensed under the terms of the GNU General Public 7 + * License version 2. This program is licensed "as is" without any 8 + * warranty of any kind, whether express or implied. 9 + */ 10 + 11 + #include <linux/delay.h> 12 + #include <linux/io.h> 13 + #include <linux/iopoll.h> 14 + #include <linux/module.h> 15 + #include <linux/of.h> 16 + #include <linux/platform_device.h> 17 + #include <linux/reset-controller.h> 18 + #include <linux/slab.h> 19 + #include <linux/types.h> 20 + 21 + #define to_hsdkv1_rst(p) container_of((p), struct hsdkv1_rst, rcdev) 22 + 23 + struct hsdkv1_rst { 24 + void __iomem *regs_ctl; 25 + void __iomem *regs_rst; 26 + spinlock_t lock; 27 + struct reset_controller_dev rcdev; 28 + }; 29 + 30 + static const u32 rst_map[] = { 31 + BIT(16), /* APB_RST */ 32 + BIT(17), /* AXI_RST */ 33 + BIT(18), /* ETH_RST */ 34 + BIT(19), /* USB_RST */ 35 + BIT(20), /* SDIO_RST */ 36 + BIT(21), /* HDMI_RST */ 37 + BIT(22), /* GFX_RST */ 38 + BIT(25), /* DMAC_RST */ 39 + BIT(31), /* EBI_RST */ 40 + }; 41 + 42 + #define HSDK_MAX_RESETS ARRAY_SIZE(rst_map) 43 + 44 + #define CGU_SYS_RST_CTRL 0x0 45 + #define CGU_IP_SW_RESET 0x0 46 + #define CGU_IP_SW_RESET_DELAY_SHIFT 16 47 + #define CGU_IP_SW_RESET_DELAY_MASK GENMASK(31, CGU_IP_SW_RESET_DELAY_SHIFT) 48 + #define CGU_IP_SW_RESET_DELAY 0 49 + #define CGU_IP_SW_RESET_RESET BIT(0) 50 + #define SW_RESET_TIMEOUT 10000 51 + 52 + static void hsdkv1_reset_config(struct hsdkv1_rst *rst, unsigned long id) 53 + { 54 + writel(rst_map[id], rst->regs_ctl + CGU_SYS_RST_CTRL); 55 + } 56 + 57 + static int hsdkv1_reset_do(struct hsdkv1_rst *rst) 58 + { 59 + u32 reg; 60 + 61 + reg = readl(rst->regs_rst + CGU_IP_SW_RESET); 62 + reg &= ~CGU_IP_SW_RESET_DELAY_MASK; 63 + reg |= CGU_IP_SW_RESET_DELAY << CGU_IP_SW_RESET_DELAY_SHIFT; 64 + reg |= CGU_IP_SW_RESET_RESET; 65 + writel(reg, rst->regs_rst + CGU_IP_SW_RESET); 66 + 67 + /* wait till reset bit is back to 0 */ 68 + return readl_poll_timeout_atomic(rst->regs_rst + CGU_IP_SW_RESET, reg, 69 + !(reg & CGU_IP_SW_RESET_RESET), 5, SW_RESET_TIMEOUT); 70 + } 71 + 72 + static int hsdkv1_reset_reset(struct reset_controller_dev *rcdev, 73 + unsigned long id) 74 + { 75 + struct hsdkv1_rst *rst = to_hsdkv1_rst(rcdev); 76 + unsigned long flags; 77 + int ret; 78 + 79 + spin_lock_irqsave(&rst->lock, flags); 80 + hsdkv1_reset_config(rst, id); 81 + ret = hsdkv1_reset_do(rst); 82 + spin_unlock_irqrestore(&rst->lock, flags); 83 + 84 + return ret; 85 + } 86 + 87 + static const struct reset_control_ops hsdkv1_reset_ops = { 88 + .reset = hsdkv1_reset_reset, 89 + }; 90 + 91 + static int hsdkv1_reset_probe(struct platform_device *pdev) 92 + { 93 + struct hsdkv1_rst *rst; 94 + struct resource *mem; 95 + 96 + rst = devm_kzalloc(&pdev->dev, sizeof(*rst), GFP_KERNEL); 97 + if (!rst) 98 + return -ENOMEM; 99 + 100 + mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); 101 + rst->regs_ctl = devm_ioremap_resource(&pdev->dev, mem); 102 + if (IS_ERR(rst->regs_ctl)) 103 + return PTR_ERR(rst->regs_ctl); 104 + 105 + mem = platform_get_resource(pdev, IORESOURCE_MEM, 1); 106 + rst->regs_rst = devm_ioremap_resource(&pdev->dev, mem); 107 + if (IS_ERR(rst->regs_rst)) 108 + return PTR_ERR(rst->regs_rst); 109 + 110 + spin_lock_init(&rst->lock); 111 + 112 + rst->rcdev.owner = THIS_MODULE; 113 + rst->rcdev.ops = &hsdkv1_reset_ops; 114 + rst->rcdev.of_node = pdev->dev.of_node; 115 + rst->rcdev.nr_resets = HSDK_MAX_RESETS; 116 + rst->rcdev.of_reset_n_cells = 1; 117 + 118 + return reset_controller_register(&rst->rcdev); 119 + } 120 + 121 + static const struct of_device_id hsdkv1_reset_dt_match[] = { 122 + { .compatible = "snps,hsdk-v1.0-reset" }, 123 + { }, 124 + }; 125 + 126 + static struct platform_driver hsdkv1_reset_driver = { 127 + .probe = hsdkv1_reset_probe, 128 + .driver = { 129 + .name = "hsdk-v1.0-reset", 130 + .of_match_table = hsdkv1_reset_dt_match, 131 + }, 132 + }; 133 + builtin_platform_driver(hsdkv1_reset_driver); 134 + 135 + MODULE_AUTHOR("Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>"); 136 + MODULE_DESCRIPTION("Synopsys HSDKv1 SDP reset driver"); 137 + MODULE_LICENSE("GPL v2");
+2 -2
drivers/reset/reset-sunxi.c
··· 107 107 spin_lock_init(&data->lock); 108 108 109 109 data->rcdev.owner = THIS_MODULE; 110 - data->rcdev.nr_resets = size * 32; 110 + data->rcdev.nr_resets = size * 8; 111 111 data->rcdev.ops = &sunxi_reset_ops; 112 112 data->rcdev.of_node = np; 113 113 ··· 162 162 spin_lock_init(&data->lock); 163 163 164 164 data->rcdev.owner = THIS_MODULE; 165 - data->rcdev.nr_resets = resource_size(res) * 32; 165 + data->rcdev.nr_resets = resource_size(res) * 8; 166 166 data->rcdev.ops = &sunxi_reset_ops; 167 167 data->rcdev.of_node = pdev->dev.of_node; 168 168
+52 -65
drivers/reset/reset-uniphier.c
··· 50 50 } 51 51 52 52 /* System reset data */ 53 - #define UNIPHIER_SLD3_SYS_RESET_NAND(id) \ 54 - UNIPHIER_RESETX((id), 0x2004, 2) 55 - 56 - #define UNIPHIER_LD11_SYS_RESET_NAND(id) \ 57 - UNIPHIER_RESETX((id), 0x200c, 0) 58 - 59 - #define UNIPHIER_LD11_SYS_RESET_EMMC(id) \ 60 - UNIPHIER_RESETX((id), 0x200c, 2) 61 - 62 - #define UNIPHIER_SLD3_SYS_RESET_STDMAC(id) \ 63 - UNIPHIER_RESETX((id), 0x2000, 10) 64 - 65 - #define UNIPHIER_LD11_SYS_RESET_STDMAC(id) \ 66 - UNIPHIER_RESETX((id), 0x200c, 8) 67 - 68 - #define UNIPHIER_PRO4_SYS_RESET_GIO(id) \ 69 - UNIPHIER_RESETX((id), 0x2000, 6) 70 - 71 - #define UNIPHIER_LD20_SYS_RESET_GIO(id) \ 72 - UNIPHIER_RESETX((id), 0x200c, 5) 73 - 74 - #define UNIPHIER_PRO4_SYS_RESET_USB3(id, ch) \ 75 - UNIPHIER_RESETX((id), 0x2000 + 0x4 * (ch), 17) 76 - 77 - static const struct uniphier_reset_data uniphier_sld3_sys_reset_data[] = { 78 - UNIPHIER_SLD3_SYS_RESET_NAND(2), 79 - UNIPHIER_SLD3_SYS_RESET_STDMAC(8), /* Ether, HSC, MIO */ 53 + static const struct uniphier_reset_data uniphier_ld4_sys_reset_data[] = { 54 + UNIPHIER_RESETX(2, 0x2000, 2), /* NAND */ 55 + UNIPHIER_RESETX(8, 0x2000, 10), /* STDMAC (Ether, HSC, MIO) */ 80 56 UNIPHIER_RESET_END, 81 57 }; 82 58 83 59 static const struct uniphier_reset_data uniphier_pro4_sys_reset_data[] = { 84 - UNIPHIER_SLD3_SYS_RESET_NAND(2), 85 - UNIPHIER_SLD3_SYS_RESET_STDMAC(8), /* HSC, MIO, RLE */ 86 - UNIPHIER_PRO4_SYS_RESET_GIO(12), /* Ether, SATA, USB3 */ 87 - UNIPHIER_PRO4_SYS_RESET_USB3(14, 0), 88 - UNIPHIER_PRO4_SYS_RESET_USB3(15, 1), 60 + UNIPHIER_RESETX(2, 0x2000, 2), /* NAND */ 61 + UNIPHIER_RESETX(8, 0x2000, 10), /* STDMAC (HSC, MIO, RLE) */ 62 + UNIPHIER_RESETX(12, 0x2000, 6), /* GIO (Ether, SATA, USB3) */ 63 + UNIPHIER_RESETX(14, 0x2000, 17), /* USB30 */ 64 + UNIPHIER_RESETX(15, 0x2004, 17), /* USB31 */ 89 65 UNIPHIER_RESET_END, 90 66 }; 91 67 92 68 static const struct uniphier_reset_data uniphier_pro5_sys_reset_data[] = { 93 - UNIPHIER_SLD3_SYS_RESET_NAND(2), 94 - UNIPHIER_SLD3_SYS_RESET_STDMAC(8), /* HSC */ 95 - UNIPHIER_PRO4_SYS_RESET_GIO(12), /* PCIe, USB3 */ 96 - UNIPHIER_PRO4_SYS_RESET_USB3(14, 0), 97 - UNIPHIER_PRO4_SYS_RESET_USB3(15, 1), 69 + UNIPHIER_RESETX(2, 0x2000, 2), /* NAND */ 70 + UNIPHIER_RESETX(8, 0x2000, 10), /* STDMAC (HSC) */ 71 + UNIPHIER_RESETX(12, 0x2000, 6), /* GIO (PCIe, USB3) */ 72 + UNIPHIER_RESETX(14, 0x2000, 17), /* USB30 */ 73 + UNIPHIER_RESETX(15, 0x2004, 17), /* USB31 */ 98 74 UNIPHIER_RESET_END, 99 75 }; 100 76 101 77 static const struct uniphier_reset_data uniphier_pxs2_sys_reset_data[] = { 102 - UNIPHIER_SLD3_SYS_RESET_NAND(2), 103 - UNIPHIER_SLD3_SYS_RESET_STDMAC(8), /* HSC, RLE */ 104 - UNIPHIER_PRO4_SYS_RESET_USB3(14, 0), 105 - UNIPHIER_PRO4_SYS_RESET_USB3(15, 1), 78 + UNIPHIER_RESETX(2, 0x2000, 2), /* NAND */ 79 + UNIPHIER_RESETX(8, 0x2000, 10), /* STDMAC (HSC, RLE) */ 80 + UNIPHIER_RESETX(14, 0x2000, 17), /* USB30 */ 81 + UNIPHIER_RESETX(15, 0x2004, 17), /* USB31 */ 106 82 UNIPHIER_RESETX(16, 0x2014, 4), /* USB30-PHY0 */ 107 83 UNIPHIER_RESETX(17, 0x2014, 0), /* USB30-PHY1 */ 108 84 UNIPHIER_RESETX(18, 0x2014, 2), /* USB30-PHY2 */ ··· 90 114 }; 91 115 92 116 static const struct uniphier_reset_data uniphier_ld11_sys_reset_data[] = { 93 - UNIPHIER_LD11_SYS_RESET_NAND(2), 94 - UNIPHIER_LD11_SYS_RESET_EMMC(4), 95 - UNIPHIER_LD11_SYS_RESET_STDMAC(8), /* HSC, MIO */ 117 + UNIPHIER_RESETX(2, 0x200c, 0), /* NAND */ 118 + UNIPHIER_RESETX(4, 0x200c, 2), /* eMMC */ 119 + UNIPHIER_RESETX(8, 0x200c, 8), /* STDMAC (HSC, MIO) */ 120 + UNIPHIER_RESETX(40, 0x2008, 0), /* AIO */ 121 + UNIPHIER_RESETX(41, 0x2008, 1), /* EVEA */ 122 + UNIPHIER_RESETX(42, 0x2010, 2), /* EXIV */ 96 123 UNIPHIER_RESET_END, 97 124 }; 98 125 99 126 static const struct uniphier_reset_data uniphier_ld20_sys_reset_data[] = { 100 - UNIPHIER_LD11_SYS_RESET_NAND(2), 101 - UNIPHIER_LD11_SYS_RESET_EMMC(4), 102 - UNIPHIER_LD11_SYS_RESET_STDMAC(8), /* HSC */ 103 - UNIPHIER_LD20_SYS_RESET_GIO(12), /* PCIe, USB3 */ 127 + UNIPHIER_RESETX(2, 0x200c, 0), /* NAND */ 128 + UNIPHIER_RESETX(4, 0x200c, 2), /* eMMC */ 129 + UNIPHIER_RESETX(8, 0x200c, 8), /* STDMAC (HSC) */ 130 + UNIPHIER_RESETX(12, 0x200c, 5), /* GIO (PCIe, USB3) */ 104 131 UNIPHIER_RESETX(16, 0x200c, 12), /* USB30-PHY0 */ 105 132 UNIPHIER_RESETX(17, 0x200c, 13), /* USB30-PHY1 */ 106 133 UNIPHIER_RESETX(18, 0x200c, 14), /* USB30-PHY2 */ 107 134 UNIPHIER_RESETX(19, 0x200c, 15), /* USB30-PHY3 */ 135 + UNIPHIER_RESETX(40, 0x2008, 0), /* AIO */ 136 + UNIPHIER_RESETX(41, 0x2008, 1), /* EVEA */ 137 + UNIPHIER_RESETX(42, 0x2010, 2), /* EXIV */ 108 138 UNIPHIER_RESET_END, 109 139 }; 110 140 ··· 133 151 #define UNIPHIER_MIO_RESET_DMAC(id) \ 134 152 UNIPHIER_RESETX((id), 0x110, 17) 135 153 136 - static const struct uniphier_reset_data uniphier_sld3_mio_reset_data[] = { 154 + static const struct uniphier_reset_data uniphier_ld4_mio_reset_data[] = { 137 155 UNIPHIER_MIO_RESET_SD(0, 0), 138 156 UNIPHIER_MIO_RESET_SD(1, 1), 139 157 UNIPHIER_MIO_RESET_SD(2, 2), ··· 145 163 UNIPHIER_MIO_RESET_USB2(8, 0), 146 164 UNIPHIER_MIO_RESET_USB2(9, 1), 147 165 UNIPHIER_MIO_RESET_USB2(10, 2), 148 - UNIPHIER_MIO_RESET_USB2(11, 3), 149 166 UNIPHIER_MIO_RESET_USB2_BRIDGE(12, 0), 150 167 UNIPHIER_MIO_RESET_USB2_BRIDGE(13, 1), 151 168 UNIPHIER_MIO_RESET_USB2_BRIDGE(14, 2), 152 - UNIPHIER_MIO_RESET_USB2_BRIDGE(15, 3), 153 169 UNIPHIER_RESET_END, 154 170 }; 155 171 ··· 193 213 UNIPHIER_PERI_RESET_FI2C(8, 4), 194 214 UNIPHIER_PERI_RESET_FI2C(9, 5), 195 215 UNIPHIER_PERI_RESET_FI2C(10, 6), 216 + UNIPHIER_RESET_END, 217 + }; 218 + 219 + /* Analog signal amplifiers reset data */ 220 + static const struct uniphier_reset_data uniphier_ld11_adamv_reset_data[] = { 221 + UNIPHIER_RESETX(0, 0x10, 6), /* EVEA */ 196 222 UNIPHIER_RESET_END, 197 223 }; 198 224 ··· 332 346 static const struct of_device_id uniphier_reset_match[] = { 333 347 /* System reset */ 334 348 { 335 - .compatible = "socionext,uniphier-sld3-reset", 336 - .data = uniphier_sld3_sys_reset_data, 337 - }, 338 - { 339 349 .compatible = "socionext,uniphier-ld4-reset", 340 - .data = uniphier_sld3_sys_reset_data, 350 + .data = uniphier_ld4_sys_reset_data, 341 351 }, 342 352 { 343 353 .compatible = "socionext,uniphier-pro4-reset", ··· 341 359 }, 342 360 { 343 361 .compatible = "socionext,uniphier-sld8-reset", 344 - .data = uniphier_sld3_sys_reset_data, 362 + .data = uniphier_ld4_sys_reset_data, 345 363 }, 346 364 { 347 365 .compatible = "socionext,uniphier-pro5-reset", ··· 361 379 }, 362 380 /* Media I/O reset, SD reset */ 363 381 { 364 - .compatible = "socionext,uniphier-sld3-mio-reset", 365 - .data = uniphier_sld3_mio_reset_data, 366 - }, 367 - { 368 382 .compatible = "socionext,uniphier-ld4-mio-reset", 369 - .data = uniphier_sld3_mio_reset_data, 383 + .data = uniphier_ld4_mio_reset_data, 370 384 }, 371 385 { 372 386 .compatible = "socionext,uniphier-pro4-mio-reset", 373 - .data = uniphier_sld3_mio_reset_data, 387 + .data = uniphier_ld4_mio_reset_data, 374 388 }, 375 389 { 376 390 .compatible = "socionext,uniphier-sld8-mio-reset", 377 - .data = uniphier_sld3_mio_reset_data, 391 + .data = uniphier_ld4_mio_reset_data, 378 392 }, 379 393 { 380 394 .compatible = "socionext,uniphier-pro5-sd-reset", ··· 382 404 }, 383 405 { 384 406 .compatible = "socionext,uniphier-ld11-mio-reset", 385 - .data = uniphier_sld3_mio_reset_data, 407 + .data = uniphier_ld4_mio_reset_data, 386 408 }, 387 409 { 388 410 .compatible = "socionext,uniphier-ld11-sd-reset", ··· 420 442 { 421 443 .compatible = "socionext,uniphier-ld20-peri-reset", 422 444 .data = uniphier_pro4_peri_reset_data, 445 + }, 446 + /* Analog signal amplifiers reset */ 447 + { 448 + .compatible = "socionext,uniphier-ld11-adamv-reset", 449 + .data = uniphier_ld11_adamv_reset_data, 450 + }, 451 + { 452 + .compatible = "socionext,uniphier-ld20-adamv-reset", 453 + .data = uniphier_ld11_adamv_reset_data, 423 454 }, 424 455 { /* sentinel */ } 425 456 };
+1 -1
drivers/reset/reset-zx2967.c
··· 55 55 return zx2967_reset_act(rcdev, id, false); 56 56 } 57 57 58 - static struct reset_control_ops zx2967_reset_ops = { 58 + static const struct reset_control_ops zx2967_reset_ops = { 59 59 .assert = zx2967_reset_assert, 60 60 .deassert = zx2967_reset_deassert, 61 61 };
+1
drivers/soc/Kconfig
··· 1 1 menu "SOC (System On Chip) specific Drivers" 2 2 3 3 source "drivers/soc/actions/Kconfig" 4 + source "drivers/soc/amlogic/Kconfig" 4 5 source "drivers/soc/atmel/Kconfig" 5 6 source "drivers/soc/bcm/Kconfig" 6 7 source "drivers/soc/fsl/Kconfig"
+1
drivers/soc/Makefile
··· 10 10 obj-y += fsl/ 11 11 obj-$(CONFIG_ARCH_MXC) += imx/ 12 12 obj-$(CONFIG_ARCH_MEDIATEK) += mediatek/ 13 + obj-$(CONFIG_ARCH_MESON) += amlogic/ 13 14 obj-$(CONFIG_ARCH_QCOM) += qcom/ 14 15 obj-y += renesas/ 15 16 obj-$(CONFIG_ARCH_ROCKCHIP) += rockchip/
+12
drivers/soc/amlogic/Kconfig
··· 1 + menu "Amlogic SoC drivers" 2 + 3 + config MESON_GX_SOCINFO 4 + bool "Amlogic Meson GX SoC Information driver" 5 + depends on ARCH_MESON || COMPILE_TEST 6 + default ARCH_MESON 7 + select SOC_BUS 8 + help 9 + Say yes to support decoding of Amlogic Meson GX SoC family 10 + information about the type, package and version. 11 + 12 + endmenu
+1
drivers/soc/amlogic/Makefile
··· 1 + obj-$(CONFIG_MESON_GX_SOCINFO) += meson-gx-socinfo.o
+177
drivers/soc/amlogic/meson-gx-socinfo.c
··· 1 + /* 2 + * Copyright (c) 2017 BayLibre, SAS 3 + * Author: Neil Armstrong <narmstrong@baylibre.com> 4 + * 5 + * SPDX-License-Identifier: GPL-2.0+ 6 + */ 7 + 8 + #include <linux/io.h> 9 + #include <linux/of.h> 10 + #include <linux/of_address.h> 11 + #include <linux/of_platform.h> 12 + #include <linux/platform_device.h> 13 + #include <linux/slab.h> 14 + #include <linux/sys_soc.h> 15 + #include <linux/bitfield.h> 16 + #include <linux/regmap.h> 17 + #include <linux/mfd/syscon.h> 18 + 19 + #define AO_SEC_SD_CFG8 0xe0 20 + #define AO_SEC_SOCINFO_OFFSET AO_SEC_SD_CFG8 21 + 22 + #define SOCINFO_MAJOR GENMASK(31, 24) 23 + #define SOCINFO_MINOR GENMASK(23, 16) 24 + #define SOCINFO_PACK GENMASK(15, 8) 25 + #define SOCINFO_MISC GENMASK(7, 0) 26 + 27 + static const struct meson_gx_soc_id { 28 + const char *name; 29 + unsigned int id; 30 + } soc_ids[] = { 31 + { "GXBB", 0x1f }, 32 + { "GXTVBB", 0x20 }, 33 + { "GXL", 0x21 }, 34 + { "GXM", 0x22 }, 35 + { "TXL", 0x23 }, 36 + }; 37 + 38 + static const struct meson_gx_package_id { 39 + const char *name; 40 + unsigned int major_id; 41 + unsigned int pack_id; 42 + } soc_packages[] = { 43 + { "S905", 0x1f, 0 }, 44 + { "S905M", 0x1f, 0x20 }, 45 + { "S905D", 0x21, 0 }, 46 + { "S905X", 0x21, 0x80 }, 47 + { "S905L", 0x21, 0xc0 }, 48 + { "S905M2", 0x21, 0xe0 }, 49 + { "S912", 0x22, 0 }, 50 + }; 51 + 52 + static inline unsigned int socinfo_to_major(u32 socinfo) 53 + { 54 + return FIELD_GET(SOCINFO_MAJOR, socinfo); 55 + } 56 + 57 + static inline unsigned int socinfo_to_minor(u32 socinfo) 58 + { 59 + return FIELD_GET(SOCINFO_MINOR, socinfo); 60 + } 61 + 62 + static inline unsigned int socinfo_to_pack(u32 socinfo) 63 + { 64 + return FIELD_GET(SOCINFO_PACK, socinfo); 65 + } 66 + 67 + static inline unsigned int socinfo_to_misc(u32 socinfo) 68 + { 69 + return FIELD_GET(SOCINFO_MISC, socinfo); 70 + } 71 + 72 + static const char *socinfo_to_package_id(u32 socinfo) 73 + { 74 + unsigned int pack = socinfo_to_pack(socinfo) & 0xf0; 75 + unsigned int major = socinfo_to_major(socinfo); 76 + int i; 77 + 78 + for (i = 0 ; i < ARRAY_SIZE(soc_packages) ; ++i) { 79 + if (soc_packages[i].major_id == major && 80 + soc_packages[i].pack_id == pack) 81 + return soc_packages[i].name; 82 + } 83 + 84 + return "Unknown"; 85 + } 86 + 87 + static const char *socinfo_to_soc_id(u32 socinfo) 88 + { 89 + unsigned int id = socinfo_to_major(socinfo); 90 + int i; 91 + 92 + for (i = 0 ; i < ARRAY_SIZE(soc_ids) ; ++i) { 93 + if (soc_ids[i].id == id) 94 + return soc_ids[i].name; 95 + } 96 + 97 + return "Unknown"; 98 + } 99 + 100 + int __init meson_gx_socinfo_init(void) 101 + { 102 + struct soc_device_attribute *soc_dev_attr; 103 + struct soc_device *soc_dev; 104 + struct device_node *np; 105 + struct regmap *regmap; 106 + unsigned int socinfo; 107 + struct device *dev; 108 + int ret; 109 + 110 + /* look up for chipid node */ 111 + np = of_find_compatible_node(NULL, NULL, "amlogic,meson-gx-ao-secure"); 112 + if (!np) 113 + return -ENODEV; 114 + 115 + /* check if interface is enabled */ 116 + if (!of_device_is_available(np)) 117 + return -ENODEV; 118 + 119 + /* check if chip-id is available */ 120 + if (!of_property_read_bool(np, "amlogic,has-chip-id")) 121 + return -ENODEV; 122 + 123 + /* node should be a syscon */ 124 + regmap = syscon_node_to_regmap(np); 125 + of_node_put(np); 126 + if (IS_ERR(regmap)) { 127 + pr_err("%s: failed to get regmap\n", __func__); 128 + return -ENODEV; 129 + } 130 + 131 + ret = regmap_read(regmap, AO_SEC_SOCINFO_OFFSET, &socinfo); 132 + if (ret < 0) 133 + return ret; 134 + 135 + if (!socinfo) { 136 + pr_err("%s: invalid chipid value\n", __func__); 137 + return -EINVAL; 138 + } 139 + 140 + soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL); 141 + if (!soc_dev_attr) 142 + return -ENODEV; 143 + 144 + soc_dev_attr->family = "Amlogic Meson"; 145 + 146 + np = of_find_node_by_path("/"); 147 + of_property_read_string(np, "model", &soc_dev_attr->machine); 148 + of_node_put(np); 149 + 150 + soc_dev_attr->revision = kasprintf(GFP_KERNEL, "%x:%x - %x:%x", 151 + socinfo_to_major(socinfo), 152 + socinfo_to_minor(socinfo), 153 + socinfo_to_pack(socinfo), 154 + socinfo_to_misc(socinfo)); 155 + soc_dev_attr->soc_id = kasprintf(GFP_KERNEL, "%s (%s)", 156 + socinfo_to_soc_id(socinfo), 157 + socinfo_to_package_id(socinfo)); 158 + 159 + soc_dev = soc_device_register(soc_dev_attr); 160 + if (IS_ERR(soc_dev)) { 161 + kfree(soc_dev_attr->revision); 162 + kfree_const(soc_dev_attr->soc_id); 163 + kfree(soc_dev_attr); 164 + return PTR_ERR(soc_dev); 165 + } 166 + dev = soc_device_to_device(soc_dev); 167 + 168 + dev_info(dev, "Amlogic Meson %s Revision %x:%x (%x:%x) Detected\n", 169 + soc_dev_attr->soc_id, 170 + socinfo_to_major(socinfo), 171 + socinfo_to_minor(socinfo), 172 + socinfo_to_pack(socinfo), 173 + socinfo_to_misc(socinfo)); 174 + 175 + return 0; 176 + } 177 + device_initcall(meson_gx_socinfo_init);
+5 -5
drivers/soc/fsl/qbman/bman_ccsr.c
··· 177 177 178 178 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 179 179 if (!res) { 180 - dev_err(dev, "Can't get %s property 'IORESOURCE_MEM'\n", 181 - node->full_name); 180 + dev_err(dev, "Can't get %pOF property 'IORESOURCE_MEM'\n", 181 + node); 182 182 return -ENXIO; 183 183 } 184 184 bm_ccsr_start = devm_ioremap(dev, res->start, resource_size(res)); ··· 205 205 206 206 err_irq = platform_get_irq(pdev, 0); 207 207 if (err_irq <= 0) { 208 - dev_info(dev, "Can't get %s IRQ\n", node->full_name); 208 + dev_info(dev, "Can't get %pOF IRQ\n", node); 209 209 return -ENODEV; 210 210 } 211 211 ret = devm_request_irq(dev, err_irq, bman_isr, IRQF_SHARED, "bman-err", 212 212 dev); 213 213 if (ret) { 214 - dev_err(dev, "devm_request_irq() failed %d for '%s'\n", 215 - ret, node->full_name); 214 + dev_err(dev, "devm_request_irq() failed %d for '%pOF'\n", 215 + ret, node); 216 216 return ret; 217 217 } 218 218 /* Disable Buffer Pool State Change */
+3 -5
drivers/soc/fsl/qbman/bman_portal.c
··· 103 103 addr_phys[0] = platform_get_resource(pdev, IORESOURCE_MEM, 104 104 DPAA_PORTAL_CE); 105 105 if (!addr_phys[0]) { 106 - dev_err(dev, "Can't get %s property 'reg::CE'\n", 107 - node->full_name); 106 + dev_err(dev, "Can't get %pOF property 'reg::CE'\n", node); 108 107 return -ENXIO; 109 108 } 110 109 111 110 addr_phys[1] = platform_get_resource(pdev, IORESOURCE_MEM, 112 111 DPAA_PORTAL_CI); 113 112 if (!addr_phys[1]) { 114 - dev_err(dev, "Can't get %s property 'reg::CI'\n", 115 - node->full_name); 113 + dev_err(dev, "Can't get %pOF property 'reg::CI'\n", node); 116 114 return -ENXIO; 117 115 } 118 116 ··· 118 120 119 121 irq = platform_get_irq(pdev, 0); 120 122 if (irq <= 0) { 121 - dev_err(dev, "Can't get %s IRQ'\n", node->full_name); 123 + dev_err(dev, "Can't get %pOF IRQ'\n", node); 122 124 return -ENXIO; 123 125 } 124 126 pcfg->irq = irq;
+6 -6
drivers/soc/fsl/qbman/qman_ccsr.c
··· 695 695 696 696 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 697 697 if (!res) { 698 - dev_err(dev, "Can't get %s property 'IORESOURCE_MEM'\n", 699 - node->full_name); 698 + dev_err(dev, "Can't get %pOF property 'IORESOURCE_MEM'\n", 699 + node); 700 700 return -ENXIO; 701 701 } 702 702 qm_ccsr_start = devm_ioremap(dev, res->start, resource_size(res)); ··· 740 740 741 741 err_irq = platform_get_irq(pdev, 0); 742 742 if (err_irq <= 0) { 743 - dev_info(dev, "Can't get %s property 'interrupts'\n", 744 - node->full_name); 743 + dev_info(dev, "Can't get %pOF property 'interrupts'\n", 744 + node); 745 745 return -ENODEV; 746 746 } 747 747 ret = devm_request_irq(dev, err_irq, qman_isr, IRQF_SHARED, "qman-err", 748 748 dev); 749 749 if (ret) { 750 - dev_err(dev, "devm_request_irq() failed %d for '%s'\n", 751 - ret, node->full_name); 750 + dev_err(dev, "devm_request_irq() failed %d for '%pOF'\n", 751 + ret, node); 752 752 return ret; 753 753 } 754 754
+4 -7
drivers/soc/fsl/qbman/qman_portal.c
··· 237 237 addr_phys[0] = platform_get_resource(pdev, IORESOURCE_MEM, 238 238 DPAA_PORTAL_CE); 239 239 if (!addr_phys[0]) { 240 - dev_err(dev, "Can't get %s property 'reg::CE'\n", 241 - node->full_name); 240 + dev_err(dev, "Can't get %pOF property 'reg::CE'\n", node); 242 241 return -ENXIO; 243 242 } 244 243 245 244 addr_phys[1] = platform_get_resource(pdev, IORESOURCE_MEM, 246 245 DPAA_PORTAL_CI); 247 246 if (!addr_phys[1]) { 248 - dev_err(dev, "Can't get %s property 'reg::CI'\n", 249 - node->full_name); 247 + dev_err(dev, "Can't get %pOF property 'reg::CI'\n", node); 250 248 return -ENXIO; 251 249 } 252 250 253 251 err = of_property_read_u32(node, "cell-index", &val); 254 252 if (err) { 255 - dev_err(dev, "Can't get %s property 'cell-index'\n", 256 - node->full_name); 253 + dev_err(dev, "Can't get %pOF property 'cell-index'\n", node); 257 254 return err; 258 255 } 259 256 pcfg->channel = val; 260 257 pcfg->cpu = -1; 261 258 irq = platform_get_irq(pdev, 0); 262 259 if (irq <= 0) { 263 - dev_err(dev, "Can't get %s IRQ\n", node->full_name); 260 + dev_err(dev, "Can't get %pOF IRQ\n", node); 264 261 return -ENXIO; 265 262 } 266 263 pcfg->irq = irq;
+2 -2
drivers/soc/fsl/qe/gpio.c
··· 304 304 goto err; 305 305 continue; 306 306 err: 307 - pr_err("%s: registration failed with status %d\n", 308 - np->full_name, ret); 307 + pr_err("%pOF: registration failed with status %d\n", 308 + np, ret); 309 309 kfree(qe_gc); 310 310 /* try others anyway */ 311 311 }
+5 -5
drivers/soc/mediatek/mtk-pmic-wrap.c
··· 1067 1067 .init_soc_specific = pwrap_mt2701_init_soc_specific, 1068 1068 }; 1069 1069 1070 - static struct pmic_wrapper_type pwrap_mt8135 = { 1070 + static const struct pmic_wrapper_type pwrap_mt8135 = { 1071 1071 .regs = mt8135_regs, 1072 1072 .type = PWRAP_MT8135, 1073 1073 .arb_en_all = 0x1ff, ··· 1079 1079 .init_soc_specific = pwrap_mt8135_init_soc_specific, 1080 1080 }; 1081 1081 1082 - static struct pmic_wrapper_type pwrap_mt8173 = { 1082 + static const struct pmic_wrapper_type pwrap_mt8173 = { 1083 1083 .regs = mt8173_regs, 1084 1084 .type = PWRAP_MT8173, 1085 1085 .arb_en_all = 0x3f, ··· 1091 1091 .init_soc_specific = pwrap_mt8173_init_soc_specific, 1092 1092 }; 1093 1093 1094 - static struct of_device_id of_pwrap_match_tbl[] = { 1094 + static const struct of_device_id of_pwrap_match_tbl[] = { 1095 1095 { 1096 1096 .compatible = "mediatek,mt2701-pwrap", 1097 1097 .data = &pwrap_mt2701, ··· 1233 1233 1234 1234 ret = of_platform_populate(np, NULL, NULL, wrp->dev); 1235 1235 if (ret) { 1236 - dev_dbg(wrp->dev, "failed to create child devices at %s\n", 1237 - np->full_name); 1236 + dev_dbg(wrp->dev, "failed to create child devices at %pOF\n", 1237 + np); 1238 1238 goto err_out2; 1239 1239 } 1240 1240
+147 -100
drivers/soc/mediatek/mtk-scpsys.c
··· 22 22 23 23 #include <dt-bindings/power/mt2701-power.h> 24 24 #include <dt-bindings/power/mt6797-power.h> 25 + #include <dt-bindings/power/mt7622-power.h> 25 26 #include <dt-bindings/power/mt8173-power.h> 26 27 27 28 #define SPM_VDE_PWR_CON 0x0210 ··· 40 39 #define SPM_MFG_2D_PWR_CON 0x02c0 41 40 #define SPM_MFG_ASYNC_PWR_CON 0x02c4 42 41 #define SPM_USB_PWR_CON 0x02cc 42 + #define SPM_ETHSYS_PWR_CON 0x02e0 /* MT7622 */ 43 + #define SPM_HIF0_PWR_CON 0x02e4 /* MT7622 */ 44 + #define SPM_HIF1_PWR_CON 0x02e8 /* MT7622 */ 45 + #define SPM_WB_PWR_CON 0x02ec /* MT7622 */ 46 + 43 47 44 48 #define SPM_PWR_STATUS 0x060c 45 49 #define SPM_PWR_STATUS_2ND 0x0610 ··· 70 64 #define PWR_STATUS_MFG_ASYNC BIT(23) 71 65 #define PWR_STATUS_AUDIO BIT(24) 72 66 #define PWR_STATUS_USB BIT(25) 67 + #define PWR_STATUS_ETHSYS BIT(24) /* MT7622 */ 68 + #define PWR_STATUS_HIF0 BIT(25) /* MT7622 */ 69 + #define PWR_STATUS_HIF1 BIT(26) /* MT7622 */ 70 + #define PWR_STATUS_WB BIT(27) /* MT7622 */ 73 71 74 72 enum clk_id { 75 73 CLK_NONE, ··· 83 73 CLK_VENC_LT, 84 74 CLK_ETHIF, 85 75 CLK_VDEC, 76 + CLK_HIFSEL, 86 77 CLK_MAX, 87 78 }; 88 79 ··· 95 84 "venc_lt", 96 85 "ethif", 97 86 "vdec", 87 + "hif_sel", 98 88 NULL, 99 89 }; 100 90 ··· 134 122 void __iomem *base; 135 123 struct regmap *infracfg; 136 124 struct scp_ctrl_reg ctrl_reg; 125 + }; 126 + 127 + struct scp_subdomain { 128 + int origin; 129 + int subdomain; 130 + }; 131 + 132 + struct scp_soc_data { 133 + const struct scp_domain_data *domains; 134 + int num_domains; 135 + const struct scp_subdomain *subdomains; 136 + int num_subdomains; 137 + const struct scp_ctrl_reg regs; 137 138 }; 138 139 139 140 static int scpsys_domain_is_on(struct scp_domain *scpd) ··· 382 357 383 358 static struct scp *init_scp(struct platform_device *pdev, 384 359 const struct scp_domain_data *scp_domain_data, int num, 385 - struct scp_ctrl_reg *scp_ctrl_reg) 360 + const struct scp_ctrl_reg *scp_ctrl_reg) 386 361 { 387 362 struct genpd_onecell_data *pd_data; 388 363 struct resource *res; ··· 590 565 }, 591 566 }; 592 567 593 - #define NUM_DOMAINS_MT2701 ARRAY_SIZE(scp_domain_data_mt2701) 594 - 595 - static int __init scpsys_probe_mt2701(struct platform_device *pdev) 596 - { 597 - struct scp *scp; 598 - struct scp_ctrl_reg scp_reg; 599 - 600 - scp_reg.pwr_sta_offs = SPM_PWR_STATUS; 601 - scp_reg.pwr_sta2nd_offs = SPM_PWR_STATUS_2ND; 602 - 603 - scp = init_scp(pdev, scp_domain_data_mt2701, NUM_DOMAINS_MT2701, 604 - &scp_reg); 605 - if (IS_ERR(scp)) 606 - return PTR_ERR(scp); 607 - 608 - mtk_register_power_domains(pdev, scp, NUM_DOMAINS_MT2701); 609 - 610 - return 0; 611 - } 612 - 613 568 /* 614 569 * MT6797 power domain support 615 570 */ ··· 654 649 }, 655 650 }; 656 651 657 - #define NUM_DOMAINS_MT6797 ARRAY_SIZE(scp_domain_data_mt6797) 658 652 #define SPM_PWR_STATUS_MT6797 0x0180 659 653 #define SPM_PWR_STATUS_2ND_MT6797 0x0184 660 654 661 - static int __init scpsys_probe_mt6797(struct platform_device *pdev) 662 - { 663 - struct scp *scp; 664 - struct genpd_onecell_data *pd_data; 665 - int ret; 666 - struct scp_ctrl_reg scp_reg; 655 + static const struct scp_subdomain scp_subdomain_mt6797[] = { 656 + {MT6797_POWER_DOMAIN_MM, MT6797_POWER_DOMAIN_VDEC}, 657 + {MT6797_POWER_DOMAIN_MM, MT6797_POWER_DOMAIN_ISP}, 658 + {MT6797_POWER_DOMAIN_MM, MT6797_POWER_DOMAIN_VENC}, 659 + {MT6797_POWER_DOMAIN_MM, MT6797_POWER_DOMAIN_MJC}, 660 + }; 667 661 668 - scp_reg.pwr_sta_offs = SPM_PWR_STATUS_MT6797; 669 - scp_reg.pwr_sta2nd_offs = SPM_PWR_STATUS_2ND_MT6797; 662 + /* 663 + * MT7622 power domain support 664 + */ 670 665 671 - scp = init_scp(pdev, scp_domain_data_mt6797, NUM_DOMAINS_MT6797, 672 - &scp_reg); 673 - if (IS_ERR(scp)) 674 - return PTR_ERR(scp); 675 - 676 - mtk_register_power_domains(pdev, scp, NUM_DOMAINS_MT6797); 677 - 678 - pd_data = &scp->pd_data; 679 - 680 - ret = pm_genpd_add_subdomain(pd_data->domains[MT6797_POWER_DOMAIN_MM], 681 - pd_data->domains[MT6797_POWER_DOMAIN_VDEC]); 682 - if (ret && IS_ENABLED(CONFIG_PM)) 683 - dev_err(&pdev->dev, "Failed to add subdomain: %d\n", ret); 684 - 685 - ret = pm_genpd_add_subdomain(pd_data->domains[MT6797_POWER_DOMAIN_MM], 686 - pd_data->domains[MT6797_POWER_DOMAIN_ISP]); 687 - if (ret && IS_ENABLED(CONFIG_PM)) 688 - dev_err(&pdev->dev, "Failed to add subdomain: %d\n", ret); 689 - 690 - ret = pm_genpd_add_subdomain(pd_data->domains[MT6797_POWER_DOMAIN_MM], 691 - pd_data->domains[MT6797_POWER_DOMAIN_VENC]); 692 - if (ret && IS_ENABLED(CONFIG_PM)) 693 - dev_err(&pdev->dev, "Failed to add subdomain: %d\n", ret); 694 - 695 - ret = pm_genpd_add_subdomain(pd_data->domains[MT6797_POWER_DOMAIN_MM], 696 - pd_data->domains[MT6797_POWER_DOMAIN_MJC]); 697 - if (ret && IS_ENABLED(CONFIG_PM)) 698 - dev_err(&pdev->dev, "Failed to add subdomain: %d\n", ret); 699 - 700 - return 0; 701 - } 666 + static const struct scp_domain_data scp_domain_data_mt7622[] = { 667 + [MT7622_POWER_DOMAIN_ETHSYS] = { 668 + .name = "ethsys", 669 + .sta_mask = PWR_STATUS_ETHSYS, 670 + .ctl_offs = SPM_ETHSYS_PWR_CON, 671 + .sram_pdn_bits = GENMASK(11, 8), 672 + .sram_pdn_ack_bits = GENMASK(15, 12), 673 + .clk_id = {CLK_NONE}, 674 + .bus_prot_mask = MT7622_TOP_AXI_PROT_EN_ETHSYS, 675 + .active_wakeup = true, 676 + }, 677 + [MT7622_POWER_DOMAIN_HIF0] = { 678 + .name = "hif0", 679 + .sta_mask = PWR_STATUS_HIF0, 680 + .ctl_offs = SPM_HIF0_PWR_CON, 681 + .sram_pdn_bits = GENMASK(11, 8), 682 + .sram_pdn_ack_bits = GENMASK(15, 12), 683 + .clk_id = {CLK_HIFSEL}, 684 + .bus_prot_mask = MT7622_TOP_AXI_PROT_EN_HIF0, 685 + .active_wakeup = true, 686 + }, 687 + [MT7622_POWER_DOMAIN_HIF1] = { 688 + .name = "hif1", 689 + .sta_mask = PWR_STATUS_HIF1, 690 + .ctl_offs = SPM_HIF1_PWR_CON, 691 + .sram_pdn_bits = GENMASK(11, 8), 692 + .sram_pdn_ack_bits = GENMASK(15, 12), 693 + .clk_id = {CLK_HIFSEL}, 694 + .bus_prot_mask = MT7622_TOP_AXI_PROT_EN_HIF1, 695 + .active_wakeup = true, 696 + }, 697 + [MT7622_POWER_DOMAIN_WB] = { 698 + .name = "wb", 699 + .sta_mask = PWR_STATUS_WB, 700 + .ctl_offs = SPM_WB_PWR_CON, 701 + .sram_pdn_bits = 0, 702 + .sram_pdn_ack_bits = 0, 703 + .clk_id = {CLK_NONE}, 704 + .bus_prot_mask = MT7622_TOP_AXI_PROT_EN_WB, 705 + .active_wakeup = true, 706 + }, 707 + }; 702 708 703 709 /* 704 710 * MT8173 power domain support ··· 805 789 }, 806 790 }; 807 791 808 - #define NUM_DOMAINS_MT8173 ARRAY_SIZE(scp_domain_data_mt8173) 792 + static const struct scp_subdomain scp_subdomain_mt8173[] = { 793 + {MT8173_POWER_DOMAIN_MFG_ASYNC, MT8173_POWER_DOMAIN_MFG_2D}, 794 + {MT8173_POWER_DOMAIN_MFG_2D, MT8173_POWER_DOMAIN_MFG}, 795 + }; 809 796 810 - static int __init scpsys_probe_mt8173(struct platform_device *pdev) 811 - { 812 - struct scp *scp; 813 - struct genpd_onecell_data *pd_data; 814 - int ret; 815 - struct scp_ctrl_reg scp_reg; 797 + static const struct scp_soc_data mt2701_data = { 798 + .domains = scp_domain_data_mt2701, 799 + .num_domains = ARRAY_SIZE(scp_domain_data_mt2701), 800 + .regs = { 801 + .pwr_sta_offs = SPM_PWR_STATUS, 802 + .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND 803 + } 804 + }; 816 805 817 - scp_reg.pwr_sta_offs = SPM_PWR_STATUS; 818 - scp_reg.pwr_sta2nd_offs = SPM_PWR_STATUS_2ND; 806 + static const struct scp_soc_data mt6797_data = { 807 + .domains = scp_domain_data_mt6797, 808 + .num_domains = ARRAY_SIZE(scp_domain_data_mt6797), 809 + .subdomains = scp_subdomain_mt6797, 810 + .num_subdomains = ARRAY_SIZE(scp_subdomain_mt6797), 811 + .regs = { 812 + .pwr_sta_offs = SPM_PWR_STATUS_MT6797, 813 + .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND_MT6797 814 + } 815 + }; 819 816 820 - scp = init_scp(pdev, scp_domain_data_mt8173, NUM_DOMAINS_MT8173, 821 - &scp_reg); 822 - if (IS_ERR(scp)) 823 - return PTR_ERR(scp); 817 + static const struct scp_soc_data mt7622_data = { 818 + .domains = scp_domain_data_mt7622, 819 + .num_domains = ARRAY_SIZE(scp_domain_data_mt7622), 820 + .regs = { 821 + .pwr_sta_offs = SPM_PWR_STATUS, 822 + .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND 823 + } 824 + }; 824 825 825 - mtk_register_power_domains(pdev, scp, NUM_DOMAINS_MT8173); 826 - 827 - pd_data = &scp->pd_data; 828 - 829 - ret = pm_genpd_add_subdomain(pd_data->domains[MT8173_POWER_DOMAIN_MFG_ASYNC], 830 - pd_data->domains[MT8173_POWER_DOMAIN_MFG_2D]); 831 - if (ret && IS_ENABLED(CONFIG_PM)) 832 - dev_err(&pdev->dev, "Failed to add subdomain: %d\n", ret); 833 - 834 - ret = pm_genpd_add_subdomain(pd_data->domains[MT8173_POWER_DOMAIN_MFG_2D], 835 - pd_data->domains[MT8173_POWER_DOMAIN_MFG]); 836 - if (ret && IS_ENABLED(CONFIG_PM)) 837 - dev_err(&pdev->dev, "Failed to add subdomain: %d\n", ret); 838 - 839 - return 0; 840 - } 826 + static const struct scp_soc_data mt8173_data = { 827 + .domains = scp_domain_data_mt8173, 828 + .num_domains = ARRAY_SIZE(scp_domain_data_mt8173), 829 + .subdomains = scp_subdomain_mt8173, 830 + .num_subdomains = ARRAY_SIZE(scp_subdomain_mt8173), 831 + .regs = { 832 + .pwr_sta_offs = SPM_PWR_STATUS, 833 + .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND 834 + } 835 + }; 841 836 842 837 /* 843 838 * scpsys driver init ··· 857 830 static const struct of_device_id of_scpsys_match_tbl[] = { 858 831 { 859 832 .compatible = "mediatek,mt2701-scpsys", 860 - .data = scpsys_probe_mt2701, 833 + .data = &mt2701_data, 861 834 }, { 862 835 .compatible = "mediatek,mt6797-scpsys", 863 - .data = scpsys_probe_mt6797, 836 + .data = &mt6797_data, 837 + }, { 838 + .compatible = "mediatek,mt7622-scpsys", 839 + .data = &mt7622_data, 864 840 }, { 865 841 .compatible = "mediatek,mt8173-scpsys", 866 - .data = scpsys_probe_mt8173, 842 + .data = &mt8173_data, 867 843 }, { 868 844 /* sentinel */ 869 845 } ··· 874 844 875 845 static int scpsys_probe(struct platform_device *pdev) 876 846 { 877 - int (*probe)(struct platform_device *); 878 - const struct of_device_id *of_id; 847 + const struct of_device_id *match; 848 + const struct scp_subdomain *sd; 849 + const struct scp_soc_data *soc; 850 + struct scp *scp; 851 + struct genpd_onecell_data *pd_data; 852 + int i, ret; 879 853 880 - of_id = of_match_node(of_scpsys_match_tbl, pdev->dev.of_node); 881 - if (!of_id || !of_id->data) 882 - return -EINVAL; 854 + match = of_match_device(of_scpsys_match_tbl, &pdev->dev); 855 + soc = (const struct scp_soc_data *)match->data; 883 856 884 - probe = of_id->data; 857 + scp = init_scp(pdev, soc->domains, soc->num_domains, &soc->regs); 858 + if (IS_ERR(scp)) 859 + return PTR_ERR(scp); 885 860 886 - return probe(pdev); 861 + mtk_register_power_domains(pdev, scp, soc->num_domains); 862 + 863 + pd_data = &scp->pd_data; 864 + 865 + for (i = 0, sd = soc->subdomains ; i < soc->num_subdomains ; i++) { 866 + ret = pm_genpd_add_subdomain(pd_data->domains[sd->origin], 867 + pd_data->domains[sd->subdomain]); 868 + if (ret && IS_ENABLED(CONFIG_PM)) 869 + dev_err(&pdev->dev, "Failed to add subdomain: %d\n", 870 + ret); 871 + } 872 + 873 + return 0; 887 874 } 888 875 889 876 static struct platform_driver scpsys_drv = {
+4
drivers/soc/qcom/Kconfig
··· 1 1 # 2 2 # QCOM Soc drivers 3 3 # 4 + menu "Qualcomm SoC drivers" 5 + 4 6 config QCOM_GLINK_SSR 5 7 tristate "Qualcomm Glink SSR driver" 6 8 depends on RPMSG ··· 85 83 help 86 84 Client driver for the WCNSS_CTRL SMD channel, used to download nv 87 85 firmware to a newly booted WCNSS chip. 86 + 87 + endmenu
+2 -3
drivers/soc/qcom/mdt_loader.c
··· 178 178 179 179 if (phdr->p_filesz) { 180 180 sprintf(fw_name + fw_name_len - 3, "b%02d", i); 181 - ret = request_firmware(&seg_fw, fw_name, dev); 181 + ret = request_firmware_into_buf(&seg_fw, fw_name, dev, 182 + ptr, phdr->p_filesz); 182 183 if (ret) { 183 184 dev_err(dev, "failed to load %s\n", fw_name); 184 185 break; 185 186 } 186 - 187 - memcpy(ptr, seg_fw->data, seg_fw->size); 188 187 189 188 release_firmware(seg_fw); 190 189 }
+2 -1
drivers/soc/qcom/smsm.c
··· 496 496 if (!smsm->hosts) 497 497 return -ENOMEM; 498 498 499 - local_node = of_find_node_with_property(pdev->dev.of_node, "#qcom,smem-state-cells"); 499 + local_node = of_find_node_with_property(of_node_get(pdev->dev.of_node), 500 + "#qcom,smem-state-cells"); 500 501 if (!local_node) { 501 502 dev_err(&pdev->dev, "no state entry\n"); 502 503 return -EINVAL;
+1
drivers/soc/qcom/wcnss_ctrl.c
··· 347 347 { .compatible = "qcom,wcnss", }, 348 348 {} 349 349 }; 350 + MODULE_DEVICE_TABLE(of, wcnss_ctrl_of_match); 350 351 351 352 static struct rpmsg_driver wcnss_ctrl_driver = { 352 353 .probe = wcnss_ctrl_probe,
+6 -1
drivers/soc/renesas/Kconfig
··· 3 3 default y if ARCH_RENESAS 4 4 select SOC_BUS 5 5 select RST_RCAR if ARCH_RCAR_GEN1 || ARCH_RCAR_GEN2 || \ 6 - ARCH_R8A7795 || ARCH_R8A7796 6 + ARCH_R8A7795 || ARCH_R8A7796 || ARCH_R8A77995 7 7 select SYSC_R8A7743 if ARCH_R8A7743 8 8 select SYSC_R8A7745 if ARCH_R8A7745 9 9 select SYSC_R8A7779 if ARCH_R8A7779 ··· 13 13 select SYSC_R8A7794 if ARCH_R8A7794 14 14 select SYSC_R8A7795 if ARCH_R8A7795 15 15 select SYSC_R8A7796 if ARCH_R8A7796 16 + select SYSC_R8A77995 if ARCH_R8A77995 16 17 17 18 if SOC_RENESAS 18 19 ··· 52 51 53 52 config SYSC_R8A7796 54 53 bool "R-Car M3-W System Controller support" if COMPILE_TEST 54 + select SYSC_RCAR 55 + 56 + config SYSC_R8A77995 57 + bool "R-Car D3 System Controller support" if COMPILE_TEST 55 58 select SYSC_RCAR 56 59 57 60 # Family
+1
drivers/soc/renesas/Makefile
··· 11 11 obj-$(CONFIG_SYSC_R8A7794) += r8a7794-sysc.o 12 12 obj-$(CONFIG_SYSC_R8A7795) += r8a7795-sysc.o 13 13 obj-$(CONFIG_SYSC_R8A7796) += r8a7796-sysc.o 14 + obj-$(CONFIG_SYSC_R8A77995) += r8a77995-sysc.o 14 15 15 16 # Family 16 17 obj-$(CONFIG_RST_RCAR) += rcar-rst.o
+31
drivers/soc/renesas/r8a77995-sysc.c
··· 1 + /* 2 + * Renesas R-Car D3 System Controller 3 + * 4 + * Copyright (C) 2017 Glider bvba 5 + * 6 + * This program is free software; you can redistribute it and/or modify 7 + * it under the terms of the GNU General Public License as published by 8 + * the Free Software Foundation; version 2 of the License. 9 + */ 10 + 11 + #include <linux/bug.h> 12 + #include <linux/kernel.h> 13 + #include <linux/sys_soc.h> 14 + 15 + #include <dt-bindings/power/r8a77995-sysc.h> 16 + 17 + #include "rcar-sysc.h" 18 + 19 + static struct rcar_sysc_area r8a77995_areas[] __initdata = { 20 + { "always-on", 0, 0, R8A77995_PD_ALWAYS_ON, -1, PD_ALWAYS_ON }, 21 + { "ca53-scu", 0x140, 0, R8A77995_PD_CA53_SCU, R8A77995_PD_ALWAYS_ON, 22 + PD_SCU }, 23 + { "ca53-cpu0", 0x200, 0, R8A77995_PD_CA53_CPU0, R8A77995_PD_CA53_SCU, 24 + PD_CPU_NOCR }, 25 + }; 26 + 27 + 28 + const struct rcar_sysc_info r8a77995_sysc_info __initconst = { 29 + .areas = r8a77995_areas, 30 + .num_areas = ARRAY_SIZE(r8a77995_areas), 31 + };
+3 -2
drivers/soc/renesas/rcar-rst.c
··· 41 41 /* R-Car Gen3 is handled like R-Car Gen2 */ 42 42 { .compatible = "renesas,r8a7795-rst", .data = &rcar_rst_gen2 }, 43 43 { .compatible = "renesas,r8a7796-rst", .data = &rcar_rst_gen2 }, 44 + { .compatible = "renesas,r8a77995-rst", .data = &rcar_rst_gen2 }, 44 45 { /* sentinel */ } 45 46 }; 46 47 ··· 62 61 63 62 base = of_iomap(np, 0); 64 63 if (!base) { 65 - pr_warn("%s: Cannot map regs\n", np->full_name); 64 + pr_warn("%pOF: Cannot map regs\n", np); 66 65 error = -ENOMEM; 67 66 goto out_put; 68 67 } ··· 71 70 cfg = match->data; 72 71 saved_mode = ioread32(base + cfg->modemr); 73 72 74 - pr_debug("%s: MODE = 0x%08x\n", np->full_name, saved_mode); 73 + pr_debug("%pOF: MODE = 0x%08x\n", np, saved_mode); 75 74 76 75 out_put: 77 76 of_node_put(np);
+6 -3
drivers/soc/renesas/rcar-sysc.c
··· 284 284 #ifdef CONFIG_SYSC_R8A7796 285 285 { .compatible = "renesas,r8a7796-sysc", .data = &r8a7796_sysc_info }, 286 286 #endif 287 + #ifdef CONFIG_SYSC_R8A77995 288 + { .compatible = "renesas,r8a77995-sysc", .data = &r8a77995_sysc_info }, 289 + #endif 287 290 { /* sentinel */ } 288 291 }; 289 292 ··· 326 323 327 324 base = of_iomap(np, 0); 328 325 if (!base) { 329 - pr_warn("%s: Cannot map regs\n", np->full_name); 326 + pr_warn("%pOF: Cannot map regs\n", np); 330 327 error = -ENOMEM; 331 328 goto out_put; 332 329 } ··· 351 348 */ 352 349 syscimr = ioread32(base + SYSCIMR); 353 350 syscimr |= syscier; 354 - pr_debug("%s: syscimr = 0x%08x\n", np->full_name, syscimr); 351 + pr_debug("%pOF: syscimr = 0x%08x\n", np, syscimr); 355 352 iowrite32(syscimr, base + SYSCIMR); 356 353 357 354 /* 358 355 * SYSC needs all interrupt sources enabled to control power. 359 356 */ 360 - pr_debug("%s: syscier = 0x%08x\n", np->full_name, syscier); 357 + pr_debug("%pOF: syscier = 0x%08x\n", np, syscier); 361 358 iowrite32(syscier, base + SYSCIER); 362 359 363 360 for (i = 0; i < info->num_areas; i++) {
+1
drivers/soc/renesas/rcar-sysc.h
··· 58 58 extern const struct rcar_sysc_info r8a7794_sysc_info; 59 59 extern const struct rcar_sysc_info r8a7795_sysc_info; 60 60 extern const struct rcar_sysc_info r8a7796_sysc_info; 61 + extern const struct rcar_sysc_info r8a77995_sysc_info; 61 62 62 63 63 64 /*
+8
drivers/soc/renesas/renesas-soc.c
··· 144 144 .id = 0x52, 145 145 }; 146 146 147 + static const struct renesas_soc soc_rcar_d3 __initconst __maybe_unused = { 148 + .family = &fam_rcar_gen3, 149 + .id = 0x58, 150 + }; 151 + 147 152 static const struct renesas_soc soc_shmobile_ag5 __initconst __maybe_unused = { 148 153 .family = &fam_shmobile, 149 154 .id = 0x37, ··· 203 198 #endif 204 199 #ifdef CONFIG_ARCH_R8A7796 205 200 { .compatible = "renesas,r8a7796", .data = &soc_rcar_m3_w }, 201 + #endif 202 + #ifdef CONFIG_ARCH_R8A77995 203 + { .compatible = "renesas,r8a77995", .data = &soc_rcar_d3 }, 206 204 #endif 207 205 #ifdef CONFIG_ARCH_SH73A0 208 206 { .compatible = "renesas,sh73a0", .data = &soc_shmobile_ag5 },
+14
drivers/soc/rockchip/grf.c
··· 54 54 .num_values = ARRAY_SIZE(rk3288_defaults), 55 55 }; 56 56 57 + #define RK3328_GRF_SOC_CON4 0x410 58 + 59 + static const struct rockchip_grf_value rk3328_defaults[] __initconst = { 60 + { "jtag switching", RK3328_GRF_SOC_CON4, HIWORD_UPDATE(0, 1, 12) }, 61 + }; 62 + 63 + static const struct rockchip_grf_info rk3328_grf __initconst = { 64 + .values = rk3328_defaults, 65 + .num_values = ARRAY_SIZE(rk3328_defaults), 66 + }; 67 + 57 68 #define RK3368_GRF_SOC_CON15 0x43c 58 69 59 70 static const struct rockchip_grf_value rk3368_defaults[] __initconst = { ··· 94 83 }, { 95 84 .compatible = "rockchip,rk3288-grf", 96 85 .data = (void *)&rk3288_grf, 86 + }, { 87 + .compatible = "rockchip,rk3328-grf", 88 + .data = (void *)&rk3328_grf, 97 89 }, { 98 90 .compatible = "rockchip,rk3368-grf", 99 91 .data = (void *)&rk3368_grf,
+32
drivers/soc/rockchip/pm_domains.c
··· 20 20 #include <linux/mfd/syscon.h> 21 21 #include <dt-bindings/power/rk3288-power.h> 22 22 #include <dt-bindings/power/rk3328-power.h> 23 + #include <dt-bindings/power/rk3366-power.h> 23 24 #include <dt-bindings/power/rk3368-power.h> 24 25 #include <dt-bindings/power/rk3399-power.h> 25 26 ··· 731 730 [RK3328_PD_VPU] = DOMAIN_RK3328(-1, 9, 9, false), 732 731 }; 733 732 733 + static const struct rockchip_domain_info rk3366_pm_domains[] = { 734 + [RK3366_PD_PERI] = DOMAIN_RK3368(10, 10, 6, true), 735 + [RK3366_PD_VIO] = DOMAIN_RK3368(14, 14, 8, false), 736 + [RK3366_PD_VIDEO] = DOMAIN_RK3368(13, 13, 7, false), 737 + [RK3366_PD_RKVDEC] = DOMAIN_RK3368(11, 11, 7, false), 738 + [RK3366_PD_WIFIBT] = DOMAIN_RK3368(8, 8, 9, false), 739 + [RK3366_PD_VPU] = DOMAIN_RK3368(12, 12, 7, false), 740 + [RK3366_PD_GPU] = DOMAIN_RK3368(15, 15, 2, false), 741 + }; 742 + 734 743 static const struct rockchip_domain_info rk3368_pm_domains[] = { 735 744 [RK3368_PD_PERI] = DOMAIN_RK3368(13, 12, 6, true), 736 745 [RK3368_PD_VIO] = DOMAIN_RK3368(15, 14, 8, false), ··· 805 794 .domain_info = rk3328_pm_domains, 806 795 }; 807 796 797 + static const struct rockchip_pmu_info rk3366_pmu = { 798 + .pwr_offset = 0x0c, 799 + .status_offset = 0x10, 800 + .req_offset = 0x3c, 801 + .idle_offset = 0x40, 802 + .ack_offset = 0x40, 803 + 804 + .core_pwrcnt_offset = 0x48, 805 + .gpu_pwrcnt_offset = 0x50, 806 + 807 + .core_power_transition_time = 24, 808 + .gpu_power_transition_time = 24, 809 + 810 + .num_domains = ARRAY_SIZE(rk3366_pm_domains), 811 + .domain_info = rk3366_pm_domains, 812 + }; 813 + 808 814 static const struct rockchip_pmu_info rk3368_pmu = { 809 815 .pwr_offset = 0x0c, 810 816 .status_offset = 0x10, ··· 860 832 { 861 833 .compatible = "rockchip,rk3328-power-controller", 862 834 .data = (void *)&rk3328_pmu, 835 + }, 836 + { 837 + .compatible = "rockchip,rk3366-power-controller", 838 + .data = (void *)&rk3366_pmu, 863 839 }, 864 840 { 865 841 .compatible = "rockchip,rk3368-power-controller",
+5 -5
drivers/soc/samsung/pm_domains.c
··· 147 147 const char *name; 148 148 149 149 if (of_property_read_string(node, "label", &name) < 0) 150 - name = strrchr(node->full_name, '/') + 1; 150 + name = kbasename(node->full_name); 151 151 return kstrdup_const(name, GFP_KERNEL); 152 152 } 153 153 ··· 237 237 continue; 238 238 239 239 if (of_genpd_add_subdomain(&parent, &child)) 240 - pr_warn("%s failed to add subdomain: %s\n", 241 - parent.np->full_name, child.np->full_name); 240 + pr_warn("%pOF failed to add subdomain: %pOF\n", 241 + parent.np, child.np); 242 242 else 243 - pr_info("%s has as child subdomain: %s.\n", 244 - parent.np->full_name, child.np->full_name); 243 + pr_info("%pOF has as child subdomain: %pOF.\n", 244 + parent.np, child.np); 245 245 } 246 246 247 247 return 0;
+48 -9
drivers/soc/sunxi/sunxi_sram.c
··· 23 23 struct sunxi_sram_func { 24 24 char *func; 25 25 u8 val; 26 + u32 reg_val; 26 27 }; 27 28 28 29 struct sunxi_sram_data { ··· 40 39 bool claimed; 41 40 }; 42 41 43 - #define SUNXI_SRAM_MAP(_val, _func) \ 42 + #define SUNXI_SRAM_MAP(_reg_val, _val, _func) \ 44 43 { \ 45 44 .func = _func, \ 46 45 .val = _val, \ 46 + .reg_val = _reg_val, \ 47 47 } 48 48 49 49 #define SUNXI_SRAM_DATA(_name, _reg, _off, _width, ...) \ ··· 59 57 60 58 static struct sunxi_sram_desc sun4i_a10_sram_a3_a4 = { 61 59 .data = SUNXI_SRAM_DATA("A3-A4", 0x4, 0x4, 2, 62 - SUNXI_SRAM_MAP(0, "cpu"), 63 - SUNXI_SRAM_MAP(1, "emac")), 60 + SUNXI_SRAM_MAP(0, 0, "cpu"), 61 + SUNXI_SRAM_MAP(1, 1, "emac")), 64 62 }; 65 63 66 64 static struct sunxi_sram_desc sun4i_a10_sram_d = { 67 65 .data = SUNXI_SRAM_DATA("D", 0x4, 0x0, 1, 68 - SUNXI_SRAM_MAP(0, "cpu"), 69 - SUNXI_SRAM_MAP(1, "usb-otg")), 66 + SUNXI_SRAM_MAP(0, 0, "cpu"), 67 + SUNXI_SRAM_MAP(1, 1, "usb-otg")), 68 + }; 69 + 70 + static struct sunxi_sram_desc sun50i_a64_sram_c = { 71 + .data = SUNXI_SRAM_DATA("C", 0x4, 24, 1, 72 + SUNXI_SRAM_MAP(0, 1, "cpu"), 73 + SUNXI_SRAM_MAP(1, 0, "de2")), 70 74 }; 71 75 72 76 static const struct of_device_id sunxi_sram_dt_ids[] = { ··· 83 75 { 84 76 .compatible = "allwinner,sun4i-a10-sram-d", 85 77 .data = &sun4i_a10_sram_d.data, 78 + }, 79 + { 80 + .compatible = "allwinner,sun50i-a64-sram-c", 81 + .data = &sun50i_a64_sram_c.data, 86 82 }, 87 83 {} 88 84 }; ··· 133 121 134 122 for (func = sram_data->func; func->func; func++) { 135 123 seq_printf(s, "\t\t%s%c\n", func->func, 136 - func->val == val ? '*' : ' '); 124 + func->reg_val == val ? 125 + '*' : ' '); 137 126 } 138 127 } 139 128 ··· 162 149 } 163 150 164 151 static const struct sunxi_sram_data *sunxi_sram_of_parse(struct device_node *node, 165 - unsigned int *value) 152 + unsigned int *reg_value) 166 153 { 167 154 const struct of_device_id *match; 155 + const struct sunxi_sram_data *data; 156 + struct sunxi_sram_func *func; 168 157 struct of_phandle_args args; 158 + u8 val; 169 159 int ret; 170 160 171 161 ret = of_parse_phandle_with_fixed_args(node, "allwinner,sram", 1, 0, ··· 181 165 goto err; 182 166 } 183 167 184 - if (value) 185 - *value = args.args[0]; 168 + val = args.args[0]; 186 169 187 170 match = of_match_node(sunxi_sram_dt_ids, args.np); 188 171 if (!match) { 172 + ret = -EINVAL; 173 + goto err; 174 + } 175 + 176 + data = match->data; 177 + if (!data) { 178 + ret = -EINVAL; 179 + goto err; 180 + }; 181 + 182 + for (func = data->func; func->func; func++) { 183 + if (val == func->val) { 184 + if (reg_value) 185 + *reg_value = func->reg_val; 186 + 187 + break; 188 + } 189 + } 190 + 191 + if (!func->func) { 189 192 ret = -EINVAL; 190 193 goto err; 191 194 } ··· 225 190 u32 val, mask; 226 191 227 192 if (IS_ERR(base)) 193 + return PTR_ERR(base); 194 + 195 + if (!base) 228 196 return -EPROBE_DEFER; 229 197 230 198 if (!dev || !dev->of_node) ··· 305 267 306 268 static const struct of_device_id sunxi_sram_dt_match[] = { 307 269 { .compatible = "allwinner,sun4i-a10-sram-controller" }, 270 + { .compatible = "allwinner,sun50i-a64-sram-controller" }, 308 271 { }, 309 272 }; 310 273 MODULE_DEVICE_TABLE(of, sunxi_sram_dt_match);
+5
drivers/soc/tegra/Kconfig
··· 107 107 endif 108 108 endif 109 109 110 + config SOC_TEGRA_FUSE 111 + def_bool y 112 + depends on ARCH_TEGRA 113 + select SOC_BUS 114 + 110 115 config SOC_TEGRA_FLOWCTRL 111 116 bool 112 117
+54 -2
drivers/soc/tegra/fuse/fuse-tegra.c
··· 19 19 #include <linux/device.h> 20 20 #include <linux/kobject.h> 21 21 #include <linux/init.h> 22 - #include <linux/platform_device.h> 22 + #include <linux/io.h> 23 23 #include <linux/of.h> 24 24 #include <linux/of_address.h> 25 - #include <linux/io.h> 25 + #include <linux/platform_device.h> 26 + #include <linux/slab.h> 27 + #include <linux/sys_soc.h> 26 28 27 29 #include <soc/tegra/common.h> 28 30 #include <soc/tegra/fuse.h> ··· 212 210 writel(reg, base + 0x14); 213 211 } 214 212 213 + struct device * __init tegra_soc_device_register(void) 214 + { 215 + struct soc_device_attribute *attr; 216 + struct soc_device *dev; 217 + 218 + attr = kzalloc(sizeof(*attr), GFP_KERNEL); 219 + if (!attr) 220 + return NULL; 221 + 222 + attr->family = kasprintf(GFP_KERNEL, "Tegra"); 223 + attr->revision = kasprintf(GFP_KERNEL, "%d", tegra_sku_info.revision); 224 + attr->soc_id = kasprintf(GFP_KERNEL, "%u", tegra_get_chip_id()); 225 + 226 + dev = soc_device_register(attr); 227 + if (IS_ERR(dev)) { 228 + kfree(attr->soc_id); 229 + kfree(attr->revision); 230 + kfree(attr->family); 231 + kfree(attr); 232 + return ERR_CAST(dev); 233 + } 234 + 235 + return soc_device_to_device(dev); 236 + } 237 + 215 238 static int __init tegra_init_fuse(void) 216 239 { 217 240 const struct of_device_id *match; ··· 338 311 pr_debug("Tegra CPU Speedo ID %d, SoC Speedo ID %d\n", 339 312 tegra_sku_info.cpu_speedo_id, tegra_sku_info.soc_speedo_id); 340 313 314 + 341 315 return 0; 342 316 } 343 317 early_initcall(tegra_init_fuse); 318 + 319 + #ifdef CONFIG_ARM64 320 + static int __init tegra_init_soc(void) 321 + { 322 + struct device_node *np; 323 + struct device *soc; 324 + 325 + /* make sure we're running on Tegra */ 326 + np = of_find_matching_node(NULL, tegra_fuse_match); 327 + if (!np) 328 + return 0; 329 + 330 + of_node_put(np); 331 + 332 + soc = tegra_soc_device_register(); 333 + if (IS_ERR(soc)) { 334 + pr_err("failed to register SoC device: %ld\n", PTR_ERR(soc)); 335 + return PTR_ERR(soc); 336 + } 337 + 338 + return 0; 339 + } 340 + device_initcall(tegra_init_soc); 341 + #endif
+1 -3
drivers/soc/tegra/pmc.c
··· 918 918 if (!np) 919 919 return; 920 920 921 - for_each_child_of_node(np, child) { 921 + for_each_child_of_node(np, child) 922 922 tegra_powergate_add(pmc, child); 923 - of_node_put(child); 924 - } 925 923 926 924 of_node_put(np); 927 925 }
+10 -9
drivers/tee/optee/core.c
··· 224 224 if (!IS_ERR(shm)) { 225 225 arg = tee_shm_get_va(shm, 0); 226 226 /* 227 - * If va2pa fails for some reason, we can't call 228 - * optee_close_session(), only free the memory. Secure OS 229 - * will leak sessions and finally refuse more sessions, but 230 - * we will at least let normal world reclaim its memory. 227 + * If va2pa fails for some reason, we can't call into 228 + * secure world, only free the memory. Secure OS will leak 229 + * sessions and finally refuse more sessions, but we will 230 + * at least let normal world reclaim its memory. 231 231 */ 232 232 if (!IS_ERR(arg)) 233 - tee_shm_va2pa(shm, arg, &parg); 233 + if (tee_shm_va2pa(shm, arg, &parg)) 234 + arg = NULL; /* prevent usage of parg below */ 234 235 } 235 236 236 237 list_for_each_entry_safe(sess, sess_tmp, &ctxdata->sess_list, ··· 259 258 } 260 259 } 261 260 262 - static struct tee_driver_ops optee_ops = { 261 + static const struct tee_driver_ops optee_ops = { 263 262 .get_version = optee_get_version, 264 263 .open = optee_open, 265 264 .release = optee_release, ··· 269 268 .cancel_req = optee_cancel_req, 270 269 }; 271 270 272 - static struct tee_desc optee_desc = { 271 + static const struct tee_desc optee_desc = { 273 272 .name = DRIVER_NAME "-clnt", 274 273 .ops = &optee_ops, 275 274 .owner = THIS_MODULE, 276 275 }; 277 276 278 - static struct tee_driver_ops optee_supp_ops = { 277 + static const struct tee_driver_ops optee_supp_ops = { 279 278 .get_version = optee_get_version, 280 279 .open = optee_open, 281 280 .release = optee_release, ··· 283 282 .supp_send = optee_supp_send, 284 283 }; 285 284 286 - static struct tee_desc optee_supp_desc = { 285 + static const struct tee_desc optee_supp_desc = { 287 286 .name = DRIVER_NAME "-supp", 288 287 .ops = &optee_supp_ops, 289 288 .owner = THIS_MODULE,
+6 -6
drivers/tee/optee/optee_smc.h
··· 298 298 OPTEE_SMC_FAST_CALL_VAL(OPTEE_SMC_FUNCID_ENABLE_SHM_CACHE) 299 299 300 300 /* 301 - * Resume from RPC (for example after processing an IRQ) 301 + * Resume from RPC (for example after processing a foreign interrupt) 302 302 * 303 303 * Call register usage: 304 304 * a0 SMC Function ID, OPTEE_SMC_CALL_RETURN_FROM_RPC ··· 383 383 OPTEE_SMC_RPC_VAL(OPTEE_SMC_RPC_FUNC_FREE) 384 384 385 385 /* 386 - * Deliver an IRQ in normal world. 386 + * Deliver foreign interrupt to normal world. 387 387 * 388 388 * "Call" register usage: 389 - * a0 OPTEE_SMC_RETURN_RPC_IRQ 389 + * a0 OPTEE_SMC_RETURN_RPC_FOREIGN_INTR 390 390 * a1-7 Resume information, must be preserved 391 391 * 392 392 * "Return" register usage: 393 393 * a0 SMC Function ID, OPTEE_SMC_CALL_RETURN_FROM_RPC. 394 394 * a1-7 Preserved 395 395 */ 396 - #define OPTEE_SMC_RPC_FUNC_IRQ 4 397 - #define OPTEE_SMC_RETURN_RPC_IRQ \ 398 - OPTEE_SMC_RPC_VAL(OPTEE_SMC_RPC_FUNC_IRQ) 396 + #define OPTEE_SMC_RPC_FUNC_FOREIGN_INTR 4 397 + #define OPTEE_SMC_RETURN_RPC_FOREIGN_INTR \ 398 + OPTEE_SMC_RPC_VAL(OPTEE_SMC_RPC_FUNC_FOREIGN_INTR) 399 399 400 400 /* 401 401 * Do an RPC request. The supplied struct optee_msg_arg tells which
+6 -9
drivers/tee/optee/rpc.c
··· 140 140 141 141 msec_to_wait = arg->params[0].u.value.a; 142 142 143 - /* set task's state to interruptible sleep */ 144 - set_current_state(TASK_INTERRUPTIBLE); 145 - 146 - /* take a nap */ 147 - msleep(msec_to_wait); 143 + /* Go to interruptible sleep */ 144 + msleep_interruptible(msec_to_wait); 148 145 149 146 arg->ret = TEEC_SUCCESS; 150 147 return; ··· 371 374 shm = reg_pair_to_ptr(param->a1, param->a2); 372 375 tee_shm_free(shm); 373 376 break; 374 - case OPTEE_SMC_RPC_FUNC_IRQ: 377 + case OPTEE_SMC_RPC_FUNC_FOREIGN_INTR: 375 378 /* 376 - * An IRQ was raised while secure world was executing, 377 - * since all IRQs are handled in Linux a dummy RPC is 378 - * performed to let Linux take the IRQ through the normal 379 + * A foreign interrupt was raised while secure world was 380 + * executing, since they are handled in Linux a dummy RPC is 381 + * performed to let Linux take the interrupt through the normal 379 382 * vector. 380 383 */ 381 384 break;
+5
drivers/tee/tee_core.c
··· 90 90 struct tee_ioctl_version_data vers; 91 91 92 92 ctx->teedev->desc->ops->get_version(ctx->teedev, &vers); 93 + 94 + if (ctx->teedev->desc->flags & TEE_DESC_PRIVILEGED) 95 + vers.gen_caps |= TEE_GEN_CAP_PRIVILEGED; 96 + 93 97 if (copy_to_user(uvers, &vers, sizeof(vers))) 94 98 return -EFAULT; 99 + 95 100 return 0; 96 101 } 97 102
+1 -1
drivers/tee/tee_shm.c
··· 80 80 size, vma->vm_page_prot); 81 81 } 82 82 83 - static struct dma_buf_ops tee_shm_dma_buf_ops = { 83 + static const struct dma_buf_ops tee_shm_dma_buf_ops = { 84 84 .map_dma_buf = tee_shm_op_map_dma_buf, 85 85 .unmap_dma_buf = tee_shm_op_unmap_dma_buf, 86 86 .release = tee_shm_op_release,
+22
include/dt-bindings/power/mt7622-power.h
··· 1 + /* 2 + * Copyright (C) 2017 MediaTek Inc. 3 + * 4 + * This program is free software; you can redistribute it and/or modify 5 + * it under the terms of the GNU General Public License version 2 as 6 + * published by the Free Software Foundation. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 11 + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. 12 + */ 13 + 14 + #ifndef _DT_BINDINGS_POWER_MT7622_POWER_H 15 + #define _DT_BINDINGS_POWER_MT7622_POWER_H 16 + 17 + #define MT7622_POWER_DOMAIN_ETHSYS 0 18 + #define MT7622_POWER_DOMAIN_HIF0 1 19 + #define MT7622_POWER_DOMAIN_HIF1 2 20 + #define MT7622_POWER_DOMAIN_WB 3 21 + 22 + #endif /* _DT_BINDINGS_POWER_MT7622_POWER_H */
+23
include/dt-bindings/power/r8a77995-sysc.h
··· 1 + /* 2 + * Copyright (C) 2017 Glider bvba 3 + * 4 + * This program is free software; you can redistribute it and/or modify 5 + * it under the terms of the GNU General Public License as published by 6 + * the Free Software Foundation; version 2 of the License. 7 + */ 8 + #ifndef __DT_BINDINGS_POWER_R8A77995_SYSC_H__ 9 + #define __DT_BINDINGS_POWER_R8A77995_SYSC_H__ 10 + 11 + /* 12 + * These power domain indices match the numbers of the interrupt bits 13 + * representing the power areas in the various Interrupt Registers 14 + * (e.g. SYSCISR, Interrupt Status Register) 15 + */ 16 + 17 + #define R8A77995_PD_CA53_CPU0 5 18 + #define R8A77995_PD_CA53_SCU 21 19 + 20 + /* Always-on power area */ 21 + #define R8A77995_PD_ALWAYS_ON 32 22 + 23 + #endif /* __DT_BINDINGS_POWER_R8A77995_SYSC_H__ */
+24
include/dt-bindings/power/rk3366-power.h
··· 1 + #ifndef __DT_BINDINGS_POWER_RK3366_POWER_H__ 2 + #define __DT_BINDINGS_POWER_RK3366_POWER_H__ 3 + 4 + /* VD_CORE */ 5 + #define RK3366_PD_A53_0 0 6 + #define RK3366_PD_A53_1 1 7 + #define RK3366_PD_A53_2 2 8 + #define RK3366_PD_A53_3 3 9 + 10 + /* VD_LOGIC */ 11 + #define RK3366_PD_BUS 4 12 + #define RK3366_PD_PERI 5 13 + #define RK3366_PD_VIO 6 14 + #define RK3366_PD_VIDEO 7 15 + #define RK3366_PD_RKVDEC 8 16 + #define RK3366_PD_WIFIBT 9 17 + #define RK3366_PD_VPU 10 18 + #define RK3366_PD_GPU 11 19 + #define RK3366_PD_ALIVE 12 20 + 21 + /* VD_PMU */ 22 + #define RK3366_PD_PMU 13 23 + 24 + #endif
+17
include/dt-bindings/reset/snps,hsdk-v1-reset.h
··· 1 + /** 2 + * This header provides index for the HSDK v1 reset controller. 3 + */ 4 + #ifndef _DT_BINDINGS_RESET_CONTROLLER_HSDK_V1 5 + #define _DT_BINDINGS_RESET_CONTROLLER_HSDK_V1 6 + 7 + #define HSDK_V1_APB_RESET 0 8 + #define HSDK_V1_AXI_RESET 1 9 + #define HSDK_V1_ETH_RESET 2 10 + #define HSDK_V1_USB_RESET 3 11 + #define HSDK_V1_SDIO_RESET 4 12 + #define HSDK_V1_HDMI_RESET 5 13 + #define HSDK_V1_GFX_RESET 6 14 + #define HSDK_V1_DMAC_RESET 7 15 + #define HSDK_V1_EBI_RESET 8 16 + 17 + #endif /*_DT_BINDINGS_RESET_CONTROLLER_HSDK_V1*/
+68
include/linux/reset.h
··· 25 25 26 26 int __must_check device_reset(struct device *dev); 27 27 28 + struct reset_control *devm_reset_control_array_get(struct device *dev, 29 + bool shared, bool optional); 30 + struct reset_control *of_reset_control_array_get(struct device_node *np, 31 + bool shared, bool optional); 32 + 28 33 static inline int device_reset_optional(struct device *dev) 29 34 { 30 35 return device_reset(dev); ··· 90 85 static inline struct reset_control *__devm_reset_control_get( 91 86 struct device *dev, const char *id, 92 87 int index, bool shared, bool optional) 88 + { 89 + return optional ? NULL : ERR_PTR(-ENOTSUPP); 90 + } 91 + 92 + static inline struct reset_control * 93 + devm_reset_control_array_get(struct device *dev, bool shared, bool optional) 94 + { 95 + return optional ? NULL : ERR_PTR(-ENOTSUPP); 96 + } 97 + 98 + static inline struct reset_control * 99 + of_reset_control_array_get(struct device_node *np, bool shared, bool optional) 93 100 { 94 101 return optional ? NULL : ERR_PTR(-ENOTSUPP); 95 102 } ··· 390 373 struct device *dev, int index) 391 374 { 392 375 return devm_reset_control_get_exclusive_by_index(dev, index); 376 + } 377 + 378 + /* 379 + * APIs to manage a list of reset controllers 380 + */ 381 + static inline struct reset_control * 382 + devm_reset_control_array_get_exclusive(struct device *dev) 383 + { 384 + return devm_reset_control_array_get(dev, false, false); 385 + } 386 + 387 + static inline struct reset_control * 388 + devm_reset_control_array_get_shared(struct device *dev) 389 + { 390 + return devm_reset_control_array_get(dev, true, false); 391 + } 392 + 393 + static inline struct reset_control * 394 + devm_reset_control_array_get_optional_exclusive(struct device *dev) 395 + { 396 + return devm_reset_control_array_get(dev, false, true); 397 + } 398 + 399 + static inline struct reset_control * 400 + devm_reset_control_array_get_optional_shared(struct device *dev) 401 + { 402 + return devm_reset_control_array_get(dev, true, true); 403 + } 404 + 405 + static inline struct reset_control * 406 + of_reset_control_array_get_exclusive(struct device_node *node) 407 + { 408 + return of_reset_control_array_get(node, false, false); 409 + } 410 + 411 + static inline struct reset_control * 412 + of_reset_control_array_get_shared(struct device_node *node) 413 + { 414 + return of_reset_control_array_get(node, true, false); 415 + } 416 + 417 + static inline struct reset_control * 418 + of_reset_control_array_get_optional_exclusive(struct device_node *node) 419 + { 420 + return of_reset_control_array_get(node, false, true); 421 + } 422 + 423 + static inline struct reset_control * 424 + of_reset_control_array_get_optional_shared(struct device_node *node) 425 + { 426 + return of_reset_control_array_get(node, true, true); 393 427 } 394 428 #endif
+7
include/linux/soc/mediatek/infracfg.h
··· 20 20 #define MT8173_TOP_AXI_PROT_EN_MFG_M1 BIT(22) 21 21 #define MT8173_TOP_AXI_PROT_EN_MFG_SNOOP_OUT BIT(23) 22 22 23 + #define MT7622_TOP_AXI_PROT_EN_ETHSYS (BIT(3) | BIT(17)) 24 + #define MT7622_TOP_AXI_PROT_EN_HIF0 (BIT(24) | BIT(25)) 25 + #define MT7622_TOP_AXI_PROT_EN_HIF1 (BIT(26) | BIT(27) | \ 26 + BIT(28)) 27 + #define MT7622_TOP_AXI_PROT_EN_WB (BIT(2) | BIT(6) | \ 28 + BIT(7) | BIT(8)) 29 + 23 30 int mtk_infracfg_set_bus_protection(struct regmap *infracfg, u32 mask); 24 31 int mtk_infracfg_clear_bus_protection(struct regmap *infracfg, u32 mask); 25 32
+1
include/linux/tee_drv.h
··· 28 28 #define TEE_SHM_MAPPED 0x1 /* Memory mapped by the kernel */ 29 29 #define TEE_SHM_DMA_BUF 0x2 /* Memory with dma-buf handle */ 30 30 31 + struct device; 31 32 struct tee_device; 32 33 struct tee_shm; 33 34 struct tee_shm_pool;
+2
include/soc/tegra/fuse.h
··· 65 65 66 66 extern struct tegra_sku_info tegra_sku_info; 67 67 68 + struct device *tegra_soc_device_register(void); 69 + 68 70 #endif /* __ASSEMBLY__ */ 69 71 70 72 #endif /* __SOC_TEGRA_FUSE_H__ */
+1
include/uapi/linux/tee.h
··· 49 49 #define TEE_MAX_ARG_SIZE 1024 50 50 51 51 #define TEE_GEN_CAP_GP (1 << 0)/* GlobalPlatform compliant TEE */ 52 + #define TEE_GEN_CAP_PRIVILEGED (1 << 1)/* Privileged device (for supplicant) */ 52 53 53 54 /* 54 55 * TEE Implementation ID