diff options
| author | Kyle Evans <kevans@FreeBSD.org> | 2017-12-23 14:30:44 +0000 |
|---|---|---|
| committer | Kyle Evans <kevans@FreeBSD.org> | 2017-12-23 14:30:44 +0000 |
| commit | cd04523f0edf38e57f54ded357ffa5138db00ed7 (patch) | |
| tree | 507c02290ca829cbc13779c70d10f0cde5a2e4aa /sys/dev/syscon | |
| parent | 4d68f3daa0e9153dc4e1ccaa74104e9d52b85aa7 (diff) | |
Notes
Diffstat (limited to 'sys/dev/syscon')
| -rw-r--r-- | sys/dev/syscon/syscon.c | 185 | ||||
| -rw-r--r-- | sys/dev/syscon/syscon.h | 77 | ||||
| -rw-r--r-- | sys/dev/syscon/syscon_generic.c | 211 | ||||
| -rw-r--r-- | sys/dev/syscon/syscon_if.m | 64 |
4 files changed, 0 insertions, 537 deletions
diff --git a/sys/dev/syscon/syscon.c b/sys/dev/syscon/syscon.c deleted file mode 100644 index 8bb3e14b700a..000000000000 --- a/sys/dev/syscon/syscon.c +++ /dev/null @@ -1,185 +0,0 @@ -/*- - * Copyright (c) 2017 Kyle Evans <kevans@FreeBSD.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * This is a generic syscon driver, whose purpose is to provide access to - * various unrelated bits packed in a single register space. It is usually used - * as a fallback to more specific driver, but works well enough for simple - * access. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/bus.h> -#include <sys/kernel.h> -#include <sys/module.h> -#include <sys/rman.h> - -#include <machine/bus.h> - -#include <dev/ofw/ofw_bus.h> -#include <dev/ofw/ofw_bus_subr.h> - -#include "syscon_if.h" - -#define SYSCON_LOCK(_sc) mtx_lock(&(_sc)->mtx) -#define SYSCON_UNLOCK(_sc) mtx_unlock(&(_sc)->mtx) -#define SYSCON_LOCK_INIT(_sc) mtx_init(&(_sc)->mtx, \ - device_get_nameunit((_sc)->dev), "syscon", MTX_DEF) -#define SYSCON_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->mtx); -#define SYSCON_ASSERT_LOCKED(_sc) mtx_assert(&(_sc)->mtx, MA_OWNED); -#define SYSCON_ASSERT_UNLOCKED(_sc) mtx_assert(&(_sc)->mtx, MA_NOTOWNED); - -struct syscon_softc { - device_t dev; - struct resource *mem_res; - struct mtx mtx; -}; - -static struct ofw_compat_data compat_data[] = { - {"syscon", 1}, - {NULL, 0} -}; - -static uint32_t -syscon_read_4(device_t dev, device_t consumer, bus_size_t offset) -{ - struct syscon_softc *sc; - uint32_t val; - - sc = device_get_softc(dev); - - SYSCON_LOCK(sc); - val = bus_read_4(sc->mem_res, offset); - SYSCON_UNLOCK(sc); - return (val); -} - -static void -syscon_write_4(device_t dev, device_t consumer, bus_size_t offset, uint32_t val) -{ - struct syscon_softc *sc; - - sc = device_get_softc(dev); - - SYSCON_LOCK(sc); - bus_write_4(sc->mem_res, offset, val); - SYSCON_UNLOCK(sc); -} - -static void -syscon_modify_4(device_t dev, device_t consumer, bus_size_t offset, - uint32_t clear_bits, uint32_t set_bits) -{ - struct syscon_softc *sc; - uint32_t val; - - sc = device_get_softc(dev); - - SYSCON_LOCK(sc); - val = bus_read_4(sc->mem_res, offset); - val &= ~clear_bits; - val |= set_bits; - bus_write_4(sc->mem_res, offset, val); - SYSCON_UNLOCK(sc); -} - -static int -syscon_probe(device_t dev) -{ - - if (!ofw_bus_status_okay(dev)) - return (ENXIO); - if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0) - return (ENXIO); - - device_set_desc(dev, "syscon"); - return (BUS_PROBE_GENERIC); -} - -static int -syscon_attach(device_t dev) -{ - struct syscon_softc *sc; - int rid; - phandle_t node; - - sc = device_get_softc(dev); - sc->dev = dev; - node = ofw_bus_get_node(sc->dev); - - SYSCON_LOCK_INIT(sc); - - rid = 0; - sc->mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, - RF_ACTIVE); - if (sc->mem_res == NULL) { - device_printf(dev, "Cannot allocate memory resource\n"); - return (ENXIO); - } - - OF_device_register_xref(OF_xref_from_node(node), dev); - - return (0); -} - -static int -syscon_detach(device_t dev) -{ - struct syscon_softc *sc; - - sc = device_get_softc(dev); - - OF_device_register_xref(OF_xref_from_device(dev), NULL); - - SYSCON_LOCK_DESTROY(sc); - if (sc->mem_res != NULL) - bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->mem_res); - return (0); -} - -static device_method_t syscon_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, syscon_probe), - DEVMETHOD(device_attach, syscon_attach), - DEVMETHOD(device_detach, syscon_detach), - - /* Syscon interface */ - DEVMETHOD(syscon_read_4, syscon_read_4), - DEVMETHOD(syscon_write_4, syscon_write_4), - DEVMETHOD(syscon_modify_4, syscon_modify_4), - - DEVMETHOD_END -}; - -DEFINE_CLASS_0(syscon, syscon_driver, syscon_methods, - sizeof(struct syscon_softc)); -static devclass_t syscon_devclass; -EARLY_DRIVER_MODULE(syscon, simplebus, syscon_driver, syscon_devclass, 0, 0, - BUS_PASS_BUS + BUS_PASS_ORDER_LATE); -MODULE_VERSION(syscon, 1); diff --git a/sys/dev/syscon/syscon.h b/sys/dev/syscon/syscon.h deleted file mode 100644 index 7825dfd844ac..000000000000 --- a/sys/dev/syscon/syscon.h +++ /dev/null @@ -1,77 +0,0 @@ -/*- - * Copyright 2017 Kyle Evans <kevans@FreeBSD.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#ifndef DEV_SYSCON_H -#define DEV_SYSCON_H - -#include "opt_platform.h" - -#include <sys/types.h> -#include <sys/kobj.h> -#ifdef FDT -#include <dev/ofw/ofw_bus.h> -#endif - -struct syscon { - KOBJ_FIELDS; - - TAILQ_ENTRY(syscon) syscon_link; /* Global list entry */ - - device_t pdev; /* provider device */ -#ifdef FDT - phandle_t ofw_node; /* OFW node for syscon */ -#endif - void *softc; /* provider softc */ -}; - -/* - * Shorthands for constructing method tables. - */ -#define SYSCONMETHOD KOBJMETHOD -#define SYSCONMETHOD_END KOBJMETHOD_END -#define syscon_method_t kobj_method_t -#define syscon_class_t kobj_class_t -DECLARE_CLASS(syscon_class); - -void *syscon_get_softc(struct syscon *syscon); - -/* - * Provider interface - */ -struct syscon *syscon_create(device_t pdev, syscon_class_t syscon_class); -struct syscon *syscon_register(struct syscon *syscon); -int syscon_unregister(struct syscon *syscon); - -#ifdef FDT -struct syscon *syscon_create_ofw_node(device_t pdev, - syscon_class_t syscon_class, phandle_t node); -phandle_t syscon_get_ofw_node(struct syscon *syscon); -int syscon_get_by_ofw_property(device_t consumer, phandle_t node, char *name, - struct syscon **syscon); -#endif - -#endif /* DEV_SYSCON_H */ diff --git a/sys/dev/syscon/syscon_generic.c b/sys/dev/syscon/syscon_generic.c deleted file mode 100644 index 04b0343f1817..000000000000 --- a/sys/dev/syscon/syscon_generic.c +++ /dev/null @@ -1,211 +0,0 @@ -/*- - * Copyright (c) 2015 Michal Meloun - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * This is a generic syscon driver, whose purpose is to provide access to - * various unrelated bits packed in a single register space. It is usually used - * as a fallback to more specific driver, but works well enough for simple - * access. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/bus.h> -#include <sys/kernel.h> -#include <sys/lock.h> -#include <sys/module.h> -#include <sys/rman.h> - -#include <machine/bus.h> - -#include <dev/ofw/ofw_bus.h> -#include <dev/ofw/ofw_bus_subr.h> - -#include "syscon_if.h" -#include "syscon.h" - -MALLOC_DECLARE(M_SYSCON); - -static uint32_t syscon_generic_read_4(struct syscon *syscon, bus_size_t offset); -static int syscon_generic_write_4(struct syscon *syscon, bus_size_t offset, - uint32_t val); -static int syscon_generic_modify_4(struct syscon *syscon, bus_size_t offset, - uint32_t clear_bits, uint32_t set_bits); - -/* - * Generic syscon driver (FDT) - */ -struct syscon_generic_softc { - device_t dev; - struct syscon *syscon; - struct resource *mem_res; - struct mtx mtx; -}; - -static struct ofw_compat_data compat_data[] = { - {"syscon", 1}, - {NULL, 0} -}; - -#define SYSCON_LOCK(_sc) mtx_lock(&(_sc)->mtx) -#define SYSCON_UNLOCK(_sc) mtx_unlock(&(_sc)->mtx) -#define SYSCON_LOCK_INIT(_sc) mtx_init(&(_sc)->mtx, \ - device_get_nameunit((_sc)->dev), "syscon", MTX_DEF) -#define SYSCON_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->mtx); -#define SYSCON_ASSERT_LOCKED(_sc) mtx_assert(&(_sc)->mtx, MA_OWNED); -#define SYSCON_ASSERT_UNLOCKED(_sc) mtx_assert(&(_sc)->mtx, MA_NOTOWNED); - -static syscon_method_t syscon_generic_methods[] = { - SYSCONMETHOD(syscon_read_4, syscon_generic_read_4), - SYSCONMETHOD(syscon_write_4, syscon_generic_write_4), - SYSCONMETHOD(syscon_modify_4, syscon_generic_modify_4), - - SYSCONMETHOD_END -}; -DEFINE_CLASS_1(syscon_generic, syscon_generic_class, syscon_generic_methods, - 0, syscon_class); - -static uint32_t -syscon_generic_read_4(struct syscon *syscon, bus_size_t offset) -{ - struct syscon_generic_softc *sc; - uint32_t val; - - sc = device_get_softc(syscon->pdev); - - SYSCON_LOCK(sc); - val = bus_read_4(sc->mem_res, offset); - SYSCON_UNLOCK(sc); - return (val); -} - -static int -syscon_generic_write_4(struct syscon *syscon, bus_size_t offset, uint32_t val) -{ - struct syscon_generic_softc *sc; - - sc = device_get_softc(syscon->pdev); - - SYSCON_LOCK(sc); - bus_write_4(sc->mem_res, offset, val); - SYSCON_UNLOCK(sc); - return (0); -} - -static int -syscon_generic_modify_4(struct syscon *syscon, bus_size_t offset, - uint32_t clear_bits, uint32_t set_bits) -{ - struct syscon_generic_softc *sc; - uint32_t val; - - sc = device_get_softc(syscon->pdev); - - SYSCON_LOCK(sc); - val = bus_read_4(sc->mem_res, offset); - val &= ~clear_bits; - val |= set_bits; - bus_write_4(sc->mem_res, offset, val); - SYSCON_UNLOCK(sc); - return (0); -} - -static int -syscon_generic_probe(device_t dev) -{ - - if (!ofw_bus_status_okay(dev)) - return (ENXIO); - if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0) - return (ENXIO); - - device_set_desc(dev, "syscon"); - return (BUS_PROBE_GENERIC); -} - -static int -syscon_generic_attach(device_t dev) -{ - struct syscon_generic_softc *sc; - int rid; - - sc = device_get_softc(dev); - sc->dev = dev; - - rid = 0; - sc->mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, - RF_ACTIVE); - if (sc->mem_res == NULL) { - device_printf(dev, "Cannot allocate memory resource\n"); - return (ENXIO); - } - - SYSCON_LOCK_INIT(sc); - sc->syscon = syscon_create_ofw_node(dev, &syscon_generic_class, - ofw_bus_get_node(dev)); - if (sc->syscon == NULL) { - device_printf(dev, "Failed to create/register syscon\n"); - return (ENXIO); - } - return (0); -} - -static int -syscon_generic_detach(device_t dev) -{ - struct syscon_generic_softc *sc; - - sc = device_get_softc(dev); - - if (sc->syscon != NULL) { - syscon_unregister(sc->syscon); - free(sc->syscon, M_SYSCON); - } - - SYSCON_LOCK_DESTROY(sc); - - if (sc->mem_res != NULL) - bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->mem_res); - return (0); -} - -static device_method_t syscon_generic_dmethods[] = { - /* Device interface */ - DEVMETHOD(device_probe, syscon_generic_probe), - DEVMETHOD(device_attach, syscon_generic_attach), - DEVMETHOD(device_detach, syscon_generic_detach), - - DEVMETHOD_END -}; - -DEFINE_CLASS_0(syscon_generic, syscon_generic_driver, syscon_generic_dmethods, - sizeof(struct syscon_generic_softc)); -static devclass_t syscon_generic_devclass; -EARLY_DRIVER_MODULE(syscon_generic, simplebus, syscon_generic_driver, - syscon_generic_devclass, 0, 0, BUS_PASS_BUS + BUS_PASS_ORDER_LATE); -MODULE_VERSION(syscon_generic, 1); diff --git a/sys/dev/syscon/syscon_if.m b/sys/dev/syscon/syscon_if.m deleted file mode 100644 index b394927842d7..000000000000 --- a/sys/dev/syscon/syscon_if.m +++ /dev/null @@ -1,64 +0,0 @@ -#- -# Copyright (c) 2015 Michal Meloun -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -# SUCH DAMAGE. -# -# $FreeBSD$ -# - -#include <machine/bus.h> - -INTERFACE syscon; - -HEADER { - struct syscon; -} - -METHOD int init { - struct syscon *syscon; -}; - -METHOD int uninit { - struct syscon *syscon; -}; - -/** - * Accessor functions for syscon register space - */ -METHOD uint32_t read_4 { - struct syscon *syscon; - bus_size_t offset; -}; - -METHOD int write_4 { - struct syscon *syscon; - bus_size_t offset; - uint32_t val; -}; - -METHOD int modify_4 { - struct syscon *syscon; - bus_size_t offset; - uint32_t clear_bits; - uint32_t set_bits; -}; |
