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

clk: Add KUnit tests for clks registered with struct clk_parent_data

Test that clks registered with 'struct clk_parent_data' work as
intended and can find their parents.

Cc: Christian Marangi <ansuelsmth@gmail.com>
Cc: Brendan Higgins <brendan.higgins@linux.dev>
Reviewed-by: David Gow <davidgow@google.com>
Cc: Rae Moar <rmoar@google.com>
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
Link: https://lore.kernel.org/r/20240718210513.3801024-9-sboyd@kernel.org

+495 -2
+2
drivers/clk/Kconfig
··· 509 509 tristate "Basic Clock Framework Kunit Tests" if !KUNIT_ALL_TESTS 510 510 depends on KUNIT 511 511 default KUNIT_ALL_TESTS 512 + select OF_OVERLAY if OF 513 + select DTC 512 514 help 513 515 Kunit tests for the common clock framework. 514 516
+3 -1
drivers/clk/Makefile
··· 2 2 # common clock types 3 3 obj-$(CONFIG_HAVE_CLK) += clk-devres.o clk-bulk.o clkdev.o 4 4 obj-$(CONFIG_COMMON_CLK) += clk.o 5 - obj-$(CONFIG_CLK_KUNIT_TEST) += clk_test.o 5 + obj-$(CONFIG_CLK_KUNIT_TEST) += clk-test.o 6 + clk-test-y := clk_test.o \ 7 + kunit_clk_parent_data_test.dtbo.o 6 8 obj-$(CONFIG_COMMON_CLK) += clk-divider.o 7 9 obj-$(CONFIG_COMMON_CLK) += clk-fixed-factor.o 8 10 obj-$(CONFIG_COMMON_CLK) += clk-fixed-rate.o
+10
drivers/clk/clk_parent_data_test.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + #ifndef _CLK_PARENT_DATA_TEST_H 3 + #define _CLK_PARENT_DATA_TEST_H 4 + 5 + #define CLK_PARENT_DATA_1MHZ_NAME "1mhz_fixed_legacy" 6 + #define CLK_PARENT_DATA_PARENT1 "parent_fwname" 7 + #define CLK_PARENT_DATA_PARENT2 "50" 8 + #define CLK_PARENT_DATA_50MHZ_NAME "50_clk" 9 + 10 + #endif
+452 -1
drivers/clk/clk_test.c
··· 4 4 */ 5 5 #include <linux/clk.h> 6 6 #include <linux/clk-provider.h> 7 + #include <linux/of.h> 8 + #include <linux/platform_device.h> 7 9 8 10 /* Needed for clk_hw_get_clk() */ 9 11 #include "clk.h" 10 12 13 + #include <kunit/clk.h> 14 + #include <kunit/of.h> 15 + #include <kunit/platform_device.h> 11 16 #include <kunit/test.h> 17 + 18 + #include "clk_parent_data_test.h" 12 19 13 20 static const struct clk_ops empty_clk_ops = { }; 14 21 ··· 2666 2659 .test_cases = clk_mux_no_reparent_test_cases, 2667 2660 }; 2668 2661 2662 + struct clk_register_clk_parent_data_test_case { 2663 + const char *desc; 2664 + struct clk_parent_data pdata; 2665 + }; 2666 + 2667 + static void 2668 + clk_register_clk_parent_data_test_case_to_desc( 2669 + const struct clk_register_clk_parent_data_test_case *t, char *desc) 2670 + { 2671 + strcpy(desc, t->desc); 2672 + } 2673 + 2674 + static const struct clk_register_clk_parent_data_test_case 2675 + clk_register_clk_parent_data_of_cases[] = { 2676 + { 2677 + /* 2678 + * Test that a clk registered with a struct device_node can 2679 + * find a parent based on struct clk_parent_data::index. 2680 + */ 2681 + .desc = "clk_parent_data_of_index_test", 2682 + .pdata.index = 0, 2683 + }, 2684 + { 2685 + /* 2686 + * Test that a clk registered with a struct device_node can 2687 + * find a parent based on struct clk_parent_data::fwname. 2688 + */ 2689 + .desc = "clk_parent_data_of_fwname_test", 2690 + .pdata.fw_name = CLK_PARENT_DATA_PARENT1, 2691 + }, 2692 + { 2693 + /* 2694 + * Test that a clk registered with a struct device_node can 2695 + * find a parent based on struct clk_parent_data::name. 2696 + */ 2697 + .desc = "clk_parent_data_of_name_test", 2698 + /* The index must be negative to indicate firmware not used */ 2699 + .pdata.index = -1, 2700 + .pdata.name = CLK_PARENT_DATA_1MHZ_NAME, 2701 + }, 2702 + { 2703 + /* 2704 + * Test that a clk registered with a struct device_node can 2705 + * find a parent based on struct 2706 + * clk_parent_data::{fw_name,name}. 2707 + */ 2708 + .desc = "clk_parent_data_of_fwname_name_test", 2709 + .pdata.fw_name = CLK_PARENT_DATA_PARENT1, 2710 + .pdata.name = "not_matching", 2711 + }, 2712 + { 2713 + /* 2714 + * Test that a clk registered with a struct device_node can 2715 + * find a parent based on struct clk_parent_data::{index,name}. 2716 + * Index takes priority. 2717 + */ 2718 + .desc = "clk_parent_data_of_index_name_priority_test", 2719 + .pdata.index = 0, 2720 + .pdata.name = "not_matching", 2721 + }, 2722 + { 2723 + /* 2724 + * Test that a clk registered with a struct device_node can 2725 + * find a parent based on struct 2726 + * clk_parent_data::{index,fwname,name}. The fw_name takes 2727 + * priority over index and name. 2728 + */ 2729 + .desc = "clk_parent_data_of_index_fwname_name_priority_test", 2730 + .pdata.index = 1, 2731 + .pdata.fw_name = CLK_PARENT_DATA_PARENT1, 2732 + .pdata.name = "not_matching", 2733 + }, 2734 + }; 2735 + 2736 + KUNIT_ARRAY_PARAM(clk_register_clk_parent_data_of_test, clk_register_clk_parent_data_of_cases, 2737 + clk_register_clk_parent_data_test_case_to_desc) 2738 + 2739 + /** 2740 + * struct clk_register_clk_parent_data_of_ctx - Context for clk_parent_data OF tests 2741 + * @np: device node of clk under test 2742 + * @hw: clk_hw for clk under test 2743 + */ 2744 + struct clk_register_clk_parent_data_of_ctx { 2745 + struct device_node *np; 2746 + struct clk_hw hw; 2747 + }; 2748 + 2749 + static int clk_register_clk_parent_data_of_test_init(struct kunit *test) 2750 + { 2751 + struct clk_register_clk_parent_data_of_ctx *ctx; 2752 + 2753 + KUNIT_ASSERT_EQ(test, 0, 2754 + of_overlay_apply_kunit(test, kunit_clk_parent_data_test)); 2755 + 2756 + ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL); 2757 + if (!ctx) 2758 + return -ENOMEM; 2759 + test->priv = ctx; 2760 + 2761 + ctx->np = of_find_compatible_node(NULL, NULL, "test,clk-parent-data"); 2762 + if (!ctx->np) 2763 + return -ENODEV; 2764 + 2765 + of_node_put_kunit(test, ctx->np); 2766 + 2767 + return 0; 2768 + } 2769 + 2770 + /* 2771 + * Test that a clk registered with a struct device_node can find a parent based on 2772 + * struct clk_parent_data when the hw member isn't set. 2773 + */ 2774 + static void clk_register_clk_parent_data_of_test(struct kunit *test) 2775 + { 2776 + struct clk_register_clk_parent_data_of_ctx *ctx = test->priv; 2777 + struct clk_hw *parent_hw; 2778 + const struct clk_register_clk_parent_data_test_case *test_param; 2779 + struct clk_init_data init = { }; 2780 + struct clk *expected_parent, *actual_parent; 2781 + 2782 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ctx->np); 2783 + 2784 + expected_parent = of_clk_get_kunit(test, ctx->np, 0); 2785 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, expected_parent); 2786 + 2787 + test_param = test->param_value; 2788 + init.parent_data = &test_param->pdata; 2789 + init.num_parents = 1; 2790 + init.name = "parent_data_of_test_clk"; 2791 + init.ops = &clk_dummy_single_parent_ops; 2792 + ctx->hw.init = &init; 2793 + KUNIT_ASSERT_EQ(test, 0, of_clk_hw_register_kunit(test, ctx->np, &ctx->hw)); 2794 + 2795 + parent_hw = clk_hw_get_parent(&ctx->hw); 2796 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, parent_hw); 2797 + 2798 + actual_parent = clk_hw_get_clk_kunit(test, parent_hw, __func__); 2799 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, actual_parent); 2800 + 2801 + KUNIT_EXPECT_TRUE(test, clk_is_match(expected_parent, actual_parent)); 2802 + } 2803 + 2804 + static struct kunit_case clk_register_clk_parent_data_of_test_cases[] = { 2805 + KUNIT_CASE_PARAM(clk_register_clk_parent_data_of_test, 2806 + clk_register_clk_parent_data_of_test_gen_params), 2807 + {} 2808 + }; 2809 + 2810 + /* 2811 + * Test suite for registering clks with struct clk_parent_data and a struct 2812 + * device_node. 2813 + */ 2814 + static struct kunit_suite clk_register_clk_parent_data_of_suite = { 2815 + .name = "clk_register_clk_parent_data_of", 2816 + .init = clk_register_clk_parent_data_of_test_init, 2817 + .test_cases = clk_register_clk_parent_data_of_test_cases, 2818 + }; 2819 + 2820 + /** 2821 + * struct clk_register_clk_parent_data_device_ctx - Context for clk_parent_data device tests 2822 + * @dev: device of clk under test 2823 + * @hw: clk_hw for clk under test 2824 + * @pdrv: driver to attach to find @dev 2825 + */ 2826 + struct clk_register_clk_parent_data_device_ctx { 2827 + struct device *dev; 2828 + struct clk_hw hw; 2829 + struct platform_driver pdrv; 2830 + }; 2831 + 2832 + static inline struct clk_register_clk_parent_data_device_ctx * 2833 + clk_register_clk_parent_data_driver_to_test_context(struct platform_device *pdev) 2834 + { 2835 + return container_of(to_platform_driver(pdev->dev.driver), 2836 + struct clk_register_clk_parent_data_device_ctx, pdrv); 2837 + } 2838 + 2839 + static int clk_register_clk_parent_data_device_probe(struct platform_device *pdev) 2840 + { 2841 + struct clk_register_clk_parent_data_device_ctx *ctx; 2842 + 2843 + ctx = clk_register_clk_parent_data_driver_to_test_context(pdev); 2844 + ctx->dev = &pdev->dev; 2845 + 2846 + return 0; 2847 + } 2848 + 2849 + static void clk_register_clk_parent_data_device_driver(struct kunit *test) 2850 + { 2851 + struct clk_register_clk_parent_data_device_ctx *ctx = test->priv; 2852 + static const struct of_device_id match_table[] = { 2853 + { .compatible = "test,clk-parent-data" }, 2854 + { } 2855 + }; 2856 + 2857 + ctx->pdrv.probe = clk_register_clk_parent_data_device_probe; 2858 + ctx->pdrv.driver.of_match_table = match_table; 2859 + ctx->pdrv.driver.name = __func__; 2860 + ctx->pdrv.driver.owner = THIS_MODULE; 2861 + 2862 + KUNIT_ASSERT_EQ(test, 0, kunit_platform_driver_register(test, &ctx->pdrv)); 2863 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ctx->dev); 2864 + } 2865 + 2866 + static const struct clk_register_clk_parent_data_test_case 2867 + clk_register_clk_parent_data_device_cases[] = { 2868 + { 2869 + /* 2870 + * Test that a clk registered with a struct device can find a 2871 + * parent based on struct clk_parent_data::index. 2872 + */ 2873 + .desc = "clk_parent_data_device_index_test", 2874 + .pdata.index = 1, 2875 + }, 2876 + { 2877 + /* 2878 + * Test that a clk registered with a struct device can find a 2879 + * parent based on struct clk_parent_data::fwname. 2880 + */ 2881 + .desc = "clk_parent_data_device_fwname_test", 2882 + .pdata.fw_name = CLK_PARENT_DATA_PARENT2, 2883 + }, 2884 + { 2885 + /* 2886 + * Test that a clk registered with a struct device can find a 2887 + * parent based on struct clk_parent_data::name. 2888 + */ 2889 + .desc = "clk_parent_data_device_name_test", 2890 + /* The index must be negative to indicate firmware not used */ 2891 + .pdata.index = -1, 2892 + .pdata.name = CLK_PARENT_DATA_50MHZ_NAME, 2893 + }, 2894 + { 2895 + /* 2896 + * Test that a clk registered with a struct device can find a 2897 + * parent based on struct clk_parent_data::{fw_name,name}. 2898 + */ 2899 + .desc = "clk_parent_data_device_fwname_name_test", 2900 + .pdata.fw_name = CLK_PARENT_DATA_PARENT2, 2901 + .pdata.name = "not_matching", 2902 + }, 2903 + { 2904 + /* 2905 + * Test that a clk registered with a struct device can find a 2906 + * parent based on struct clk_parent_data::{index,name}. Index 2907 + * takes priority. 2908 + */ 2909 + .desc = "clk_parent_data_device_index_name_priority_test", 2910 + .pdata.index = 1, 2911 + .pdata.name = "not_matching", 2912 + }, 2913 + { 2914 + /* 2915 + * Test that a clk registered with a struct device can find a 2916 + * parent based on struct clk_parent_data::{index,fwname,name}. 2917 + * The fw_name takes priority over index and name. 2918 + */ 2919 + .desc = "clk_parent_data_device_index_fwname_name_priority_test", 2920 + .pdata.index = 0, 2921 + .pdata.fw_name = CLK_PARENT_DATA_PARENT2, 2922 + .pdata.name = "not_matching", 2923 + }, 2924 + }; 2925 + 2926 + KUNIT_ARRAY_PARAM(clk_register_clk_parent_data_device_test, 2927 + clk_register_clk_parent_data_device_cases, 2928 + clk_register_clk_parent_data_test_case_to_desc) 2929 + 2930 + /* 2931 + * Test that a clk registered with a struct device can find a parent based on 2932 + * struct clk_parent_data when the hw member isn't set. 2933 + */ 2934 + static void clk_register_clk_parent_data_device_test(struct kunit *test) 2935 + { 2936 + struct clk_register_clk_parent_data_device_ctx *ctx; 2937 + const struct clk_register_clk_parent_data_test_case *test_param; 2938 + struct clk_hw *parent_hw; 2939 + struct clk_init_data init = { }; 2940 + struct clk *expected_parent, *actual_parent; 2941 + 2942 + ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL); 2943 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ctx); 2944 + test->priv = ctx; 2945 + 2946 + clk_register_clk_parent_data_device_driver(test); 2947 + 2948 + expected_parent = clk_get_kunit(test, ctx->dev, "50"); 2949 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, expected_parent); 2950 + 2951 + test_param = test->param_value; 2952 + init.parent_data = &test_param->pdata; 2953 + init.num_parents = 1; 2954 + init.name = "parent_data_device_test_clk"; 2955 + init.ops = &clk_dummy_single_parent_ops; 2956 + ctx->hw.init = &init; 2957 + KUNIT_ASSERT_EQ(test, 0, clk_hw_register_kunit(test, ctx->dev, &ctx->hw)); 2958 + 2959 + parent_hw = clk_hw_get_parent(&ctx->hw); 2960 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, parent_hw); 2961 + 2962 + actual_parent = clk_hw_get_clk_kunit(test, parent_hw, __func__); 2963 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, actual_parent); 2964 + 2965 + KUNIT_EXPECT_TRUE(test, clk_is_match(expected_parent, actual_parent)); 2966 + } 2967 + 2968 + static const struct clk_register_clk_parent_data_test_case 2969 + clk_register_clk_parent_data_device_hw_cases[] = { 2970 + { 2971 + /* 2972 + * Test that a clk registered with a struct device can find a 2973 + * parent based on struct clk_parent_data::hw. 2974 + */ 2975 + .desc = "clk_parent_data_device_hw_index_test", 2976 + /* The index must be negative to indicate firmware not used */ 2977 + .pdata.index = -1, 2978 + }, 2979 + { 2980 + /* 2981 + * Test that a clk registered with a struct device can find a 2982 + * parent based on struct clk_parent_data::hw when 2983 + * struct clk_parent_data::fw_name is set. 2984 + */ 2985 + .desc = "clk_parent_data_device_hw_fwname_test", 2986 + .pdata.fw_name = CLK_PARENT_DATA_PARENT2, 2987 + }, 2988 + { 2989 + /* 2990 + * Test that a clk registered with a struct device can find a 2991 + * parent based on struct clk_parent_data::hw when struct 2992 + * clk_parent_data::name is set. 2993 + */ 2994 + .desc = "clk_parent_data_device_hw_name_test", 2995 + /* The index must be negative to indicate firmware not used */ 2996 + .pdata.index = -1, 2997 + .pdata.name = CLK_PARENT_DATA_50MHZ_NAME, 2998 + }, 2999 + { 3000 + /* 3001 + * Test that a clk registered with a struct device can find a 3002 + * parent based on struct clk_parent_data::hw when struct 3003 + * clk_parent_data::{fw_name,name} are set. 3004 + */ 3005 + .desc = "clk_parent_data_device_hw_fwname_name_test", 3006 + .pdata.fw_name = CLK_PARENT_DATA_PARENT2, 3007 + .pdata.name = "not_matching", 3008 + }, 3009 + { 3010 + /* 3011 + * Test that a clk registered with a struct device can find a 3012 + * parent based on struct clk_parent_data::hw when struct 3013 + * clk_parent_data::index is set. The hw pointer takes 3014 + * priority. 3015 + */ 3016 + .desc = "clk_parent_data_device_hw_index_priority_test", 3017 + .pdata.index = 0, 3018 + }, 3019 + { 3020 + /* 3021 + * Test that a clk registered with a struct device can find a 3022 + * parent based on struct clk_parent_data::hw when 3023 + * struct clk_parent_data::{index,fwname,name} are set. 3024 + * The hw pointer takes priority over everything else. 3025 + */ 3026 + .desc = "clk_parent_data_device_hw_index_fwname_name_priority_test", 3027 + .pdata.index = 0, 3028 + .pdata.fw_name = CLK_PARENT_DATA_PARENT2, 3029 + .pdata.name = "not_matching", 3030 + }, 3031 + }; 3032 + 3033 + KUNIT_ARRAY_PARAM(clk_register_clk_parent_data_device_hw_test, 3034 + clk_register_clk_parent_data_device_hw_cases, 3035 + clk_register_clk_parent_data_test_case_to_desc) 3036 + 3037 + /* 3038 + * Test that a clk registered with a struct device can find a 3039 + * parent based on struct clk_parent_data::hw. 3040 + */ 3041 + static void clk_register_clk_parent_data_device_hw_test(struct kunit *test) 3042 + { 3043 + struct clk_register_clk_parent_data_device_ctx *ctx; 3044 + const struct clk_register_clk_parent_data_test_case *test_param; 3045 + struct clk_dummy_context *parent; 3046 + struct clk_hw *parent_hw; 3047 + struct clk_parent_data pdata = { }; 3048 + struct clk_init_data init = { }; 3049 + 3050 + ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL); 3051 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ctx); 3052 + test->priv = ctx; 3053 + 3054 + clk_register_clk_parent_data_device_driver(test); 3055 + 3056 + parent = kunit_kzalloc(test, sizeof(*parent), GFP_KERNEL); 3057 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, parent); 3058 + 3059 + parent_hw = &parent->hw; 3060 + parent_hw->init = CLK_HW_INIT_NO_PARENT("parent-clk", 3061 + &clk_dummy_rate_ops, 0); 3062 + 3063 + KUNIT_ASSERT_EQ(test, 0, clk_hw_register_kunit(test, ctx->dev, parent_hw)); 3064 + 3065 + test_param = test->param_value; 3066 + memcpy(&pdata, &test_param->pdata, sizeof(pdata)); 3067 + pdata.hw = parent_hw; 3068 + init.parent_data = &pdata; 3069 + init.num_parents = 1; 3070 + init.ops = &clk_dummy_single_parent_ops; 3071 + init.name = "parent_data_device_hw_test_clk"; 3072 + ctx->hw.init = &init; 3073 + KUNIT_ASSERT_EQ(test, 0, clk_hw_register_kunit(test, ctx->dev, &ctx->hw)); 3074 + 3075 + KUNIT_EXPECT_PTR_EQ(test, parent_hw, clk_hw_get_parent(&ctx->hw)); 3076 + } 3077 + 3078 + static struct kunit_case clk_register_clk_parent_data_device_test_cases[] = { 3079 + KUNIT_CASE_PARAM(clk_register_clk_parent_data_device_test, 3080 + clk_register_clk_parent_data_device_test_gen_params), 3081 + KUNIT_CASE_PARAM(clk_register_clk_parent_data_device_hw_test, 3082 + clk_register_clk_parent_data_device_hw_test_gen_params), 3083 + {} 3084 + }; 3085 + 3086 + static int clk_register_clk_parent_data_device_init(struct kunit *test) 3087 + { 3088 + KUNIT_ASSERT_EQ(test, 0, 3089 + of_overlay_apply_kunit(test, kunit_clk_parent_data_test)); 3090 + 3091 + return 0; 3092 + } 3093 + 3094 + /* 3095 + * Test suite for registering clks with struct clk_parent_data and a struct 3096 + * device. 3097 + */ 3098 + static struct kunit_suite clk_register_clk_parent_data_device_suite = { 3099 + .name = "clk_register_clk_parent_data_device", 3100 + .init = clk_register_clk_parent_data_device_init, 3101 + .test_cases = clk_register_clk_parent_data_device_test_cases, 3102 + }; 3103 + 2669 3104 kunit_test_suites( 2670 3105 &clk_leaf_mux_set_rate_parent_test_suite, 2671 3106 &clk_test_suite, ··· 3120 2671 &clk_range_test_suite, 3121 2672 &clk_range_maximize_test_suite, 3122 2673 &clk_range_minimize_test_suite, 2674 + &clk_register_clk_parent_data_of_suite, 2675 + &clk_register_clk_parent_data_device_suite, 3123 2676 &clk_single_parent_mux_test_suite, 3124 - &clk_uncached_test_suite 2677 + &clk_uncached_test_suite, 3125 2678 ); 3126 2679 MODULE_DESCRIPTION("Kunit tests for clk framework"); 3127 2680 MODULE_LICENSE("GPL v2");
+28
drivers/clk/kunit_clk_parent_data_test.dtso
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /dts-v1/; 3 + /plugin/; 4 + 5 + #include "clk_parent_data_test.h" 6 + 7 + &{/} { 8 + fixed_50: kunit-clock-50MHz { 9 + compatible = "fixed-clock"; 10 + #clock-cells = <0>; 11 + clock-frequency = <50000000>; 12 + clock-output-names = CLK_PARENT_DATA_50MHZ_NAME; 13 + }; 14 + 15 + fixed_parent: kunit-clock-1MHz { 16 + compatible = "fixed-clock"; 17 + #clock-cells = <0>; 18 + clock-frequency = <1000000>; 19 + clock-output-names = CLK_PARENT_DATA_1MHZ_NAME; 20 + }; 21 + 22 + kunit-clock-controller { 23 + compatible = "test,clk-parent-data"; 24 + clocks = <&fixed_parent>, <&fixed_50>; 25 + clock-names = CLK_PARENT_DATA_PARENT1, CLK_PARENT_DATA_PARENT2; 26 + #clock-cells = <1>; 27 + }; 28 + };