1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+ 29e5935c0SWenyou Yang /* 39e5935c0SWenyou Yang * Copyright (C) 2016 Atmel Corporation 49e5935c0SWenyou Yang * Wenyou.Yang <wenyou.yang@atmel.com> 59e5935c0SWenyou Yang */ 69e5935c0SWenyou Yang 79e5935c0SWenyou Yang #include <common.h> 89e5935c0SWenyou Yang #include <clk-uclass.h> 99d922450SSimon Glass #include <dm.h> 109e5935c0SWenyou Yang #include <dm/util.h> 119e5935c0SWenyou Yang #include <linux/io.h> 129e5935c0SWenyou Yang #include <mach/at91_pmc.h> 139e5935c0SWenyou Yang #include "pmc.h" 149e5935c0SWenyou Yang 159e5935c0SWenyou Yang DECLARE_GLOBAL_DATA_PTR; 169e5935c0SWenyou Yang 179e5935c0SWenyou Yang #define H32MX_MAX_FREQ 90000000 189e5935c0SWenyou Yang 199e5935c0SWenyou Yang static ulong sama5d4_h32mx_clk_get_rate(struct clk *clk) 209e5935c0SWenyou Yang { 219e5935c0SWenyou Yang struct pmc_platdata *plat = dev_get_platdata(clk->dev); 229e5935c0SWenyou Yang struct at91_pmc *pmc = plat->reg_base; 239e5935c0SWenyou Yang ulong rate = gd->arch.mck_rate_hz; 249e5935c0SWenyou Yang 259e5935c0SWenyou Yang if (readl(&pmc->mckr) & AT91_PMC_MCKR_H32MXDIV) 269e5935c0SWenyou Yang rate /= 2; 279e5935c0SWenyou Yang 289e5935c0SWenyou Yang if (rate > H32MX_MAX_FREQ) 299e5935c0SWenyou Yang dm_warn("H32MX clock is too fast\n"); 309e5935c0SWenyou Yang 319e5935c0SWenyou Yang return rate; 329e5935c0SWenyou Yang } 339e5935c0SWenyou Yang 349e5935c0SWenyou Yang static struct clk_ops sama5d4_h32mx_clk_ops = { 359e5935c0SWenyou Yang .get_rate = sama5d4_h32mx_clk_get_rate, 369e5935c0SWenyou Yang }; 379e5935c0SWenyou Yang 389e5935c0SWenyou Yang static int sama5d4_h32mx_clk_probe(struct udevice *dev) 399e5935c0SWenyou Yang { 409e5935c0SWenyou Yang return at91_pmc_core_probe(dev); 419e5935c0SWenyou Yang } 429e5935c0SWenyou Yang 439e5935c0SWenyou Yang static const struct udevice_id sama5d4_h32mx_clk_match[] = { 449e5935c0SWenyou Yang { .compatible = "atmel,sama5d4-clk-h32mx" }, 459e5935c0SWenyou Yang {} 469e5935c0SWenyou Yang }; 479e5935c0SWenyou Yang 489e5935c0SWenyou Yang U_BOOT_DRIVER(sama5d4_h32mx_clk) = { 499e5935c0SWenyou Yang .name = "sama5d4-h32mx-clk", 509e5935c0SWenyou Yang .id = UCLASS_CLK, 519e5935c0SWenyou Yang .of_match = sama5d4_h32mx_clk_match, 529e5935c0SWenyou Yang .probe = sama5d4_h32mx_clk_probe, 539e5935c0SWenyou Yang .platdata_auto_alloc_size = sizeof(struct pmc_platdata), 549e5935c0SWenyou Yang .ops = &sama5d4_h32mx_clk_ops, 559e5935c0SWenyou Yang }; 56