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