at91_sdramc.c revision 262598
1207618Srdivacky/*- 2207618Srdivacky * Copyright (c) 2014 Warner Losh. All rights reserved. 3207618Srdivacky * 4207618Srdivacky * Redistribution and use in source and binary forms, with or without 5207618Srdivacky * modification, are permitted provided that the following conditions 6207618Srdivacky * are met: 7207618Srdivacky * 1. Redistributions of source code must retain the above copyright 8207618Srdivacky * notice, this list of conditions and the following disclaimer. 9207618Srdivacky * 2. Redistributions in binary form must reproduce the above copyright 10207618Srdivacky * notice, this list of conditions and the following disclaimer in the 11207618Srdivacky * documentation and/or other materials provided with the distribution. 12207618Srdivacky * 13207618Srdivacky * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 14207618Srdivacky * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15208599Srdivacky * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16208599Srdivacky * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 17249423Sdim * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18207618Srdivacky * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19207618Srdivacky * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20208599Srdivacky * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21208599Srdivacky * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22208599Srdivacky * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23208599Srdivacky * SUCH DAMAGE. 24207618Srdivacky */ 25207618Srdivacky 26207618Srdivacky#include "opt_platform.h" 27207618Srdivacky 28208599Srdivacky#include <sys/cdefs.h> 29208599Srdivacky__FBSDID("$FreeBSD: head/sys/arm/at91/at91_sdramc.c 262598 2014-02-28 02:59:51Z imp $"); 30263508Sdim 31208599Srdivacky#include <sys/param.h> 32208599Srdivacky#include <sys/bus.h> 33208599Srdivacky#include <sys/kernel.h> 34208599Srdivacky#include <sys/module.h> 35218893Sdim#include <sys/resource.h> 36208599Srdivacky#include <sys/systm.h> 37208599Srdivacky#include <sys/rman.h> 38218893Sdim 39218893Sdim#include <machine/bus.h> 40218893Sdim 41239462Sdim#include <arm/at91/at91var.h> 42208599Srdivacky#include <arm/at91/at91_aicreg.h> 43208599Srdivacky 44208599Srdivacky#ifdef FDT 45208599Srdivacky#include <dev/fdt/fdt_common.h> 46208599Srdivacky#include <dev/ofw/ofw_bus.h> 47208599Srdivacky#include <dev/ofw/ofw_bus_subr.h> 48208599Srdivacky#endif 49208599Srdivacky 50208599Srdivackystruct sdramc_softc { 51208599Srdivacky struct resource *mem_res; /* Memory resource */ 52208599Srdivacky device_t sc_dev; 53208599Srdivacky}; 54208599Srdivacky 55243830Sdimstatic int 56208599Srdivackyat91_sdramc_probe(device_t dev) 57208599Srdivacky{ 58208599Srdivacky#ifdef FDT 59208599Srdivacky if (!ofw_bus_is_compatible(dev, "atmel,at91sam9260-sdramc")) 60208599Srdivacky return (ENXIO); 61208599Srdivacky#endif 62208599Srdivacky device_set_desc(dev, "SDRAMC"); 63239462Sdim return (0); 64239462Sdim} 65208599Srdivacky 66234353Sdimstatic int 67234353Sdimat91_sdramc_attach(device_t dev) 68208599Srdivacky{ 69208599Srdivacky int rid, err = 0; 70239462Sdim struct sdramc_softc *sc; 71239462Sdim 72208599Srdivacky sc = device_get_softc(dev); 73208599Srdivacky sc->sc_dev = dev; 74208599Srdivacky 75208599Srdivacky rid = 0; 76208599Srdivacky sc->mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, 77208599Srdivacky RF_ACTIVE); 78208599Srdivacky 79208599Srdivacky if (sc->mem_res == NULL) 80208599Srdivacky panic("couldn't allocate register resources"); 81208599Srdivacky 82208599Srdivacky return (err); 83208599Srdivacky} 84208599Srdivacky 85208599Srdivackystatic device_method_t at91_sdramc_methods[] = { 86208599Srdivacky DEVMETHOD(device_probe, at91_sdramc_probe), 87208599Srdivacky DEVMETHOD(device_attach, at91_sdramc_attach), 88208599Srdivacky DEVMETHOD_END 89208599Srdivacky}; 90208599Srdivacky 91208599Srdivackystatic driver_t at91_sdramc_driver = { 92208599Srdivacky "at91_sdramc", 93208599Srdivacky at91_sdramc_methods, 94208599Srdivacky sizeof(struct sdramc_softc), 95208599Srdivacky}; 96208599Srdivacky 97208599Srdivackystatic devclass_t at91_sdramc_devclass; 98208599Srdivacky 99208599Srdivacky#ifdef FDT 100208599SrdivackyDRIVER_MODULE(at91_sdramc, simplebus, at91_sdramc_driver, at91_sdramc_devclass, NULL, 101208599Srdivacky NULL); 102208599Srdivacky#else 103208599SrdivackyDRIVER_MODULE(at91_sdramc, atmelarm, at91_sdramc_driver, at91_sdramc_devclass, NULL, 104208599Srdivacky NULL); 105208599Srdivacky#endif 106208599Srdivacky