Path: blob/master/arch/mips/pic32/pic32mzda/early_clk.c
53394 views
// SPDX-License-Identifier: GPL-2.0-only1/*2* Joshua Henderson <[email protected]>3* Copyright (C) 2015 Microchip Technology Inc. All rights reserved.4*/5#include <linux/io.h>6#include <linux/platform_data/pic32.h>78#include "pic32mzda.h"910/* Oscillators, PLL & clocks */11#define ICLK_MASK 0x0000008012#define PLLDIV_MASK 0x0000000713#define CUROSC_MASK 0x0000000714#define PLLMUL_MASK 0x0000007F15#define PB_MASK 0x0000000716#define FRC1 017#define FRC2 718#define SPLL 119#define POSC 220#define FRC_CLK 80000002122#define PIC32_POSC_FREQ 240000002324#define OSCCON 0x000025#define SPLLCON 0x002026#define PB1DIV 0x01402728u32 pic32_get_sysclk(void)29{30u32 osc_freq = 0;31u32 pllclk;32u32 frcdivn;33u32 osccon;34u32 spllcon;35int curr_osc;3637u32 plliclk;38u32 pllidiv;39u32 pllodiv;40u32 pllmult;41u32 frcdiv;4243void __iomem *osc_base = ioremap(PIC32_BASE_OSC, 0x200);4445osccon = __raw_readl(osc_base + OSCCON);46spllcon = __raw_readl(osc_base + SPLLCON);4748plliclk = (spllcon & ICLK_MASK);49pllidiv = ((spllcon >> 8) & PLLDIV_MASK) + 1;50pllodiv = ((spllcon >> 24) & PLLDIV_MASK);51pllmult = ((spllcon >> 16) & PLLMUL_MASK) + 1;52frcdiv = ((osccon >> 24) & PLLDIV_MASK);5354pllclk = plliclk ? FRC_CLK : PIC32_POSC_FREQ;55frcdivn = ((1 << frcdiv) + 1) + (128 * (frcdiv == 7));5657if (pllodiv < 2)58pllodiv = 2;59else if (pllodiv < 5)60pllodiv = (1 << pllodiv);61else62pllodiv = 32;6364curr_osc = (int)((osccon >> 12) & CUROSC_MASK);6566switch (curr_osc) {67case FRC1:68case FRC2:69osc_freq = FRC_CLK / frcdivn;70break;71case SPLL:72osc_freq = ((pllclk / pllidiv) * pllmult) / pllodiv;73break;74case POSC:75osc_freq = PIC32_POSC_FREQ;76break;77default:78break;79}8081iounmap(osc_base);8283return osc_freq;84}8586u32 pic32_get_pbclk(int bus)87{88u32 clk_freq;89void __iomem *osc_base = ioremap(PIC32_BASE_OSC, 0x200);90u32 pbxdiv = PB1DIV + ((bus - 1) * 0x10);91u32 pbdiv = (__raw_readl(osc_base + pbxdiv) & PB_MASK) + 1;9293iounmap(osc_base);9495clk_freq = pic32_get_sysclk();9697return clk_freq / pbdiv;98}99100101