Path: blob/main/sys/arm/allwinner/a20/a20_cpu_cfg.c
39566 views
/*-1* SPDX-License-Identifier: BSD-2-Clause2*3* Copyright (c) 2013 Ganbold Tsagaankhuu <[email protected]>4* All rights reserved.5*6* Redistribution and use in source and binary forms, with or without7* modification, are permitted provided that the following conditions8* are met:9* 1. Redistributions of source code must retain the above copyright10* notice, this list of conditions and the following disclaimer.11* 2. Redistributions in binary form must reproduce the above copyright12* notice, this list of conditions and the following disclaimer in the13* documentation and/or other materials provided with the distribution.14*15* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND16* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE17* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE18* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE19* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL20* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS21* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)22* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT23* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY24* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF25* SUCH DAMAGE.26*/2728/* CPU configuration module for Allwinner A20 */2930#include <sys/param.h>31#include <sys/systm.h>32#include <sys/bus.h>33#include <sys/kernel.h>34#include <sys/module.h>35#include <sys/malloc.h>36#include <sys/rman.h>37#include <sys/timeet.h>38#include <sys/timetc.h>39#include <sys/watchdog.h>40#include <machine/bus.h>41#include <machine/cpu.h>42#include <machine/intr.h>4344#include <dev/ofw/openfirm.h>45#include <dev/ofw/ofw_bus.h>46#include <dev/ofw/ofw_bus_subr.h>4748#include <machine/bus.h>4950#include "a20_cpu_cfg.h"5152struct a20_cpu_cfg_softc {53struct resource *res;54bus_space_tag_t bst;55bus_space_handle_t bsh;56};5758static struct a20_cpu_cfg_softc *a20_cpu_cfg_sc = NULL;5960#define cpu_cfg_read_4(sc, reg) \61bus_space_read_4((sc)->bst, (sc)->bsh, (reg))62#define cpu_cfg_write_4(sc, reg, val) \63bus_space_write_4((sc)->bst, (sc)->bsh, (reg), (val))6465static int66a20_cpu_cfg_probe(device_t dev)67{6869if (!ofw_bus_status_okay(dev))70return (ENXIO);7172if (ofw_bus_is_compatible(dev, "allwinner,sun7i-cpu-cfg")) {73device_set_desc(dev, "A20 CPU Configuration Module");74return(BUS_PROBE_DEFAULT);75}7677return (ENXIO);78}7980static int81a20_cpu_cfg_attach(device_t dev)82{83struct a20_cpu_cfg_softc *sc = device_get_softc(dev);84int rid = 0;8586if (a20_cpu_cfg_sc)87return (ENXIO);8889sc->res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE);90if (!sc->res) {91device_printf(dev, "could not allocate resource\n");92return (ENXIO);93}9495sc->bst = rman_get_bustag(sc->res);96sc->bsh = rman_get_bushandle(sc->res);9798a20_cpu_cfg_sc = sc;99100return (0);101}102103static device_method_t a20_cpu_cfg_methods[] = {104DEVMETHOD(device_probe, a20_cpu_cfg_probe),105DEVMETHOD(device_attach, a20_cpu_cfg_attach),106{ 0, 0 }107};108109static driver_t a20_cpu_cfg_driver = {110"a20_cpu_cfg",111a20_cpu_cfg_methods,112sizeof(struct a20_cpu_cfg_softc),113};114115EARLY_DRIVER_MODULE(a20_cpu_cfg, simplebus, a20_cpu_cfg_driver, 0, 0,116BUS_PASS_CPU + BUS_PASS_ORDER_FIRST);117118uint64_t119a20_read_counter64(void)120{121uint32_t lo, hi;122123/* Latch counter, wait for it to be ready to read. */124cpu_cfg_write_4(a20_cpu_cfg_sc, OSC24M_CNT64_CTRL_REG, CNT64_RL_EN);125while (cpu_cfg_read_4(a20_cpu_cfg_sc, OSC24M_CNT64_CTRL_REG) & CNT64_RL_EN)126continue;127128hi = cpu_cfg_read_4(a20_cpu_cfg_sc, OSC24M_CNT64_HIGH_REG);129lo = cpu_cfg_read_4(a20_cpu_cfg_sc, OSC24M_CNT64_LOW_REG);130131return (((uint64_t)hi << 32) | lo);132}133134135