1 // SPDX-License-Identifier: GPL-2.0+ or BSD-3-Clause 2 /* 3 * Copyright (C) 2013 Boris BREZILLON <b.brezillon@overkiz.com> 4 * Copyright (C) 2021 Microchip 5 */ 6 7 #include "at91_clk.h" 8 #include <drivers/clk.h> 9 #include <drivers/clk_dt.h> 10 11 static struct clk *slow_clk; 12 13 #define SLOW_CLOCK_FREQ 32768 14 15 struct clk *at91_sckc_clk_get(void) 16 { 17 return slow_clk; 18 } 19 20 static unsigned long sckc_get_rate(struct clk *clk __unused, 21 unsigned long parent_rate __unused) 22 { 23 return SLOW_CLOCK_FREQ; 24 } 25 26 static const struct clk_ops sckc_clk_ops = { 27 .get_rate = sckc_get_rate, 28 }; 29 30 static TEE_Result sckc_pmc_setup(const void *fdt __unused, int offs, 31 const void *data __unused) 32 { 33 struct clk *clk = NULL; 34 TEE_Result res = TEE_ERROR_GENERIC; 35 36 if (slow_clk) 37 return TEE_ERROR_GENERIC; 38 39 clk = clk_alloc("slowck", &sckc_clk_ops, NULL, 0); 40 if (!clk) 41 return TEE_ERROR_OUT_OF_MEMORY; 42 43 res = clk_register(clk); 44 if (res) { 45 clk_free(clk); 46 return res; 47 } 48 49 res = clk_dt_register_clk_provider(fdt, offs, clk_dt_get_simple_clk, 50 clk); 51 if (res) 52 return res; 53 54 slow_clk = clk; 55 56 return TEE_SUCCESS; 57 } 58 59 CLK_DT_DECLARE(at91_sckc, "atmel,sama5d4-sckc", sckc_pmc_setup); 60