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