bhnd_sprom_chipc.c revision 300702
155714Skris/*- 255714Skris * Copyright (c) 2015-2016 Landon Fuller <landon@landonf.org> 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: 8296465Sdelphij * 1. Redistributions of source code must retain the above copyright 955714Skris * notice, this list of conditions and the following disclaimer, 1055714Skris * without modification. 1155714Skris * 2. Redistributions in binary form must reproduce at minimum a disclaimer 1255714Skris * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any 1355714Skris * redistribution must be conditioned upon including a substantially 1455714Skris * similar Disclaimer requirement for further binary redistribution. 15296465Sdelphij * 1655714Skris * NO WARRANTY 1755714Skris * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1855714Skris * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1955714Skris * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY 2055714Skris * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 2155714Skris * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, 22296465Sdelphij * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2355714Skris * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2455714Skris * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 2555714Skris * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2655714Skris * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 2755714Skris * THE POSSIBILITY OF SUCH DAMAGES. 2855714Skris */ 2955714Skris 3055714Skris#include <sys/cdefs.h> 3155714Skris__FBSDID("$FreeBSD: head/sys/dev/bhnd/cores/chipc/bhnd_sprom_chipc.c 300702 2016-05-26 00:43:08Z adrian $"); 3255714Skris 3355714Skris/* 3455714Skris * ChipCommon SPROM driver. 3555714Skris */ 3655714Skris 37296465Sdelphij#include <sys/param.h> 3855714Skris#include <sys/kernel.h> 3955714Skris#include <sys/bus.h> 40296465Sdelphij#include <sys/limits.h> 4155714Skris#include <sys/malloc.h> 4255714Skris#include <sys/module.h> 4355714Skris#include <sys/systm.h> 4455714Skris 4555714Skris#include <dev/bhnd/bhnd.h> 4655714Skris#include <dev/bhnd/nvram/bhnd_nvram.h> 4755714Skris#include <dev/bhnd/nvram/bhnd_spromvar.h> 4855714Skris 4955714Skris#include "bhnd_nvram_if.h" 5055714Skris 5155714Skris#include "chipc.h" 52296465Sdelphij 5355714Skrisstatic void 5455714Skrischipc_sprom_identify(driver_t *driver, device_t parent) 5555714Skris{ 5655714Skris if (bhnd_chipc_nvram_src(parent) != BHND_NVRAM_SRC_SPROM) 5755714Skris return; 5855714Skris 5955714Skris if (device_find_child(parent, "bhnd_nvram", 0) != NULL) 6055714Skris return; 6155714Skris 6255714Skris if (BUS_ADD_CHILD(parent, 0, "bhnd_nvram", 0) == NULL) 6355714Skris device_printf(parent, "add bhnd_nvram failed\n"); 6455714Skris} 6555714Skris 6655714Skrisstatic int 67296465Sdelphijchipc_sprom_probe(device_t dev) 68296465Sdelphij{ 69296465Sdelphij device_t chipc; 7055714Skris int error; 71296465Sdelphij 72296465Sdelphij chipc = device_get_parent(dev); 73296465Sdelphij 74296465Sdelphij /* Only match on SPROM devices */ 7555714Skris if (BHND_CHIPC_NVRAM_SRC(chipc) != BHND_NVRAM_SRC_SPROM) 7655714Skris return (ENXIO); 77296465Sdelphij 78296465Sdelphij /* Defer to default driver implementation */ 79296465Sdelphij if ((error = bhnd_sprom_probe(dev)) > 0) 80296465Sdelphij return (error); 81296465Sdelphij 82296465Sdelphij return (BUS_PROBE_NOWILDCARD); 83296465Sdelphij} 8455714Skris 85296465Sdelphijstatic int 86296465Sdelphijchipc_sprom_attach(device_t dev) 87296465Sdelphij{ 88296465Sdelphij device_t chipc; 89296465Sdelphij int error; 90296465Sdelphij 91296465Sdelphij /* Request that ChipCommon enable access to SPROM hardware before 92296465Sdelphij * delegating attachment (and SPROM parsing) to the common driver */ 93296465Sdelphij chipc = device_get_parent(dev); 94296465Sdelphij if ((error = BHND_CHIPC_ENABLE_SPROM(chipc))) 95296465Sdelphij return (error); 96296465Sdelphij 97296465Sdelphij error = bhnd_sprom_attach(dev); 98296465Sdelphij BHND_CHIPC_DISABLE_SPROM(chipc); 99296465Sdelphij return (error); 100296465Sdelphij} 101296465Sdelphij 102296465Sdelphijstatic device_method_t chipc_sprom_methods[] = { 103296465Sdelphij /* Device interface */ 104296465Sdelphij DEVMETHOD(device_identify, chipc_sprom_identify), 105296465Sdelphij DEVMETHOD(device_probe, chipc_sprom_probe), 106296465Sdelphij DEVMETHOD(device_attach, chipc_sprom_attach), 107296465Sdelphij DEVMETHOD_END 108296465Sdelphij}; 109296465Sdelphij 110296465SdelphijDEFINE_CLASS_1(bhnd_nvram, chipc_sprom_driver, chipc_sprom_methods, sizeof(struct bhnd_sprom_softc), bhnd_sprom_driver); 111296465SdelphijDRIVER_MODULE(bhnd_chipc_sprom, bhnd_chipc, chipc_sprom_driver, bhnd_nvram_devclass, NULL, NULL); 112296465Sdelphij 113296465SdelphijMODULE_DEPEND(bhnd_chipc_sprom, bhnd, 1, 1, 1); 114296465SdelphijMODULE_DEPEND(bhnd_chipc_sprom, bhnd_chipc, 1, 1, 1); 115296465SdelphijMODULE_DEPEND(bhnd_chipc_sprom, bhnd_sprom, 1, 1, 1); 116296465SdelphijMODULE_VERSION(bhnd_chipc_sprom, 1); 117296465Sdelphij