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