vf_tcon.c revision 266155
155714Skris/*- 255714Skris * Copyright (c) 2014 Ruslan Bukin <br@bsdpad.com> 355714Skris * All rights reserved. 455714Skris * 555714Skris * Redistribution and use in source and binary forms, with or without 655714Skris * modification, are permitted provided that the following conditions 755714Skris * are met: 8280297Sjkim * 1. Redistributions of source code must retain the above copyright 955714Skris * notice, this list of conditions and the following disclaimer. 1055714Skris * 2. Redistributions in binary form must reproduce the above copyright 1155714Skris * notice, this list of conditions and the following disclaimer in the 1255714Skris * documentation and/or other materials provided with the distribution. 1355714Skris * 1455714Skris * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15280297Sjkim * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1655714Skris * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1755714Skris * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1855714Skris * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1955714Skris * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2055714Skris * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2155714Skris * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22280297Sjkim * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2355714Skris * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2455714Skris * SUCH DAMAGE. 2555714Skris */ 2655714Skris 2755714Skris/* 2855714Skris * Vybrid Family Timing Controller (TCON) 2955714Skris * Chapter 58, Vybrid Reference Manual, Rev. 5, 07/2013 3055714Skris */ 3155714Skris 3255714Skris#include <sys/cdefs.h> 3355714Skris__FBSDID("$FreeBSD: stable/10/sys/arm/freescale/vybrid/vf_tcon.c 266155 2014-05-15 16:23:24Z ian $"); 3455714Skris 3555714Skris#include <sys/param.h> 3655714Skris#include <sys/systm.h> 37280297Sjkim#include <sys/bus.h> 3855714Skris#include <sys/kernel.h> 3955714Skris#include <sys/module.h> 40280297Sjkim#include <sys/malloc.h> 4155714Skris#include <sys/rman.h> 4255714Skris#include <sys/timeet.h> 4355714Skris#include <sys/timetc.h> 4455714Skris#include <sys/watchdog.h> 4555714Skris 4655714Skris#include <dev/fdt/fdt_common.h> 4755714Skris#include <dev/ofw/openfirm.h> 4855714Skris#include <dev/ofw/ofw_bus.h> 4955714Skris#include <dev/ofw/ofw_bus_subr.h> 5055714Skris 5155714Skris#include <machine/bus.h> 52280297Sjkim#include <machine/fdt.h> 5355714Skris#include <machine/cpu.h> 5455714Skris#include <machine/intr.h> 5555714Skris 5655714Skris#include <arm/freescale/vybrid/vf_common.h> 5755714Skris 5855714Skris#define TCON0_CTRL1 0x00 59280297Sjkim#define TCON_BYPASS (1 << 29) 60280297Sjkim 61280297Sjkimstruct tcon_softc { 62280297Sjkim struct resource *res[1]; 6355714Skris bus_space_tag_t bst; 6455714Skris bus_space_handle_t bsh; 6555714Skris}; 6655714Skris 6755714Skrisstruct tcon_softc *tcon_sc; 68109998Smarkm 69109998Smarkmstatic struct resource_spec tcon_spec[] = { 70109998Smarkm { SYS_RES_MEMORY, 0, RF_ACTIVE }, 7155714Skris { -1, 0 } 7255714Skris}; 7355714Skris 74280297Sjkimuint32_t 7555714Skristcon_bypass(void) 7655714Skris{ 77280297Sjkim struct tcon_softc *sc; 7855714Skris 79280297Sjkim if (tcon_sc == NULL) 80280297Sjkim return (1); 81280297Sjkim 82280297Sjkim sc = tcon_sc; 83280297Sjkim 84280297Sjkim WRITE4(tcon_sc, TCON0_CTRL1, TCON_BYPASS); 85280297Sjkim 86280297Sjkim return (0); 87280297Sjkim} 88280297Sjkim 8955714Skrisstatic int 90280297Sjkimtcon_probe(device_t dev) 91280297Sjkim{ 92280297Sjkim 93280297Sjkim if (!ofw_bus_status_okay(dev)) 94280297Sjkim return (ENXIO); 95280297Sjkim 9655714Skris if (!ofw_bus_is_compatible(dev, "fsl,mvf600-tcon")) 97280297Sjkim return (ENXIO); 98280297Sjkim 99280297Sjkim device_set_desc(dev, "Vybrid Family Timing Controller (TCON)"); 100280297Sjkim return (BUS_PROBE_DEFAULT); 101280297Sjkim} 102280297Sjkim 103280297Sjkimstatic int 10455714Skristcon_attach(device_t dev) 105280297Sjkim{ 106280297Sjkim struct tcon_softc *sc; 107280297Sjkim 108280297Sjkim sc = device_get_softc(dev); 109280297Sjkim 11055714Skris if (bus_alloc_resources(dev, tcon_spec, sc->res)) { 111280297Sjkim device_printf(dev, "could not allocate resources\n"); 112280297Sjkim return (ENXIO); 113280297Sjkim } 11455714Skris 11555714Skris /* Memory interface */ 116280297Sjkim sc->bst = rman_get_bustag(sc->res[0]); 11755714Skris sc->bsh = rman_get_bushandle(sc->res[0]); 118280297Sjkim 119280297Sjkim tcon_sc = sc; 120280297Sjkim 121280297Sjkim return (0); 122280297Sjkim} 123280297Sjkim 124280297Sjkimstatic device_method_t tcon_methods[] = { 125280297Sjkim DEVMETHOD(device_probe, tcon_probe), 126280297Sjkim DEVMETHOD(device_attach, tcon_attach), 127280297Sjkim { 0, 0 } 128280297Sjkim}; 129280297Sjkim 130280297Sjkimstatic driver_t tcon_driver = { 131280297Sjkim "tcon", 13255714Skris tcon_methods, 133280297Sjkim sizeof(struct tcon_softc), 134280297Sjkim}; 135280297Sjkim 136280297Sjkimstatic devclass_t tcon_devclass; 137280297Sjkim 138280297SjkimDRIVER_MODULE(tcon, simplebus, tcon_driver, tcon_devclass, 0, 0); 139280297Sjkim