Changeset View
Changeset View
Standalone View
Standalone View
sys/arm/broadcom/bcm2835/bcm2835_bsc.c
Show First 20 Lines • Show All 94 Lines • ▼ Show 20 Lines | |||||
#include <sys/rman.h> | #include <sys/rman.h> | ||||
#include <sys/sysctl.h> | #include <sys/sysctl.h> | ||||
#include <dev/iicbus/iicbus.h> | #include <dev/iicbus/iicbus.h> | ||||
#include <dev/iicbus/iiconf.h> | #include <dev/iicbus/iiconf.h> | ||||
#include <dev/ofw/ofw_bus.h> | #include <dev/ofw/ofw_bus.h> | ||||
#include <dev/ofw/ofw_bus_subr.h> | #include <dev/ofw/ofw_bus_subr.h> | ||||
#include <arm/broadcom/bcm2835/bcm2835_gpio.h> | |||||
#include <arm/broadcom/bcm2835/bcm2835_bscreg.h> | #include <arm/broadcom/bcm2835/bcm2835_bscreg.h> | ||||
#include <arm/broadcom/bcm2835/bcm2835_bscvar.h> | #include <arm/broadcom/bcm2835/bcm2835_bscvar.h> | ||||
#include "iicbus_if.h" | #include "iicbus_if.h" | ||||
static struct ofw_compat_data compat_data[] = { | static struct ofw_compat_data compat_data[] = { | ||||
{"broadcom,bcm2835-bsc", 1}, | {"broadcom,bcm2835-bsc", 1}, | ||||
{"brcm,bcm2708-i2c", 1}, | {"brcm,bcm2708-i2c", 1}, | ||||
▲ Show 20 Lines • Show All 181 Lines • ▼ Show 20 Lines | bcm_bsc_probe(device_t dev) | ||||
return (BUS_PROBE_DEFAULT); | return (BUS_PROBE_DEFAULT); | ||||
} | } | ||||
static int | static int | ||||
bcm_bsc_attach(device_t dev) | bcm_bsc_attach(device_t dev) | ||||
{ | { | ||||
struct bcm_bsc_softc *sc; | struct bcm_bsc_softc *sc; | ||||
unsigned long start; | int rid; | ||||
device_t gpio; | |||||
int i, rid; | |||||
sc = device_get_softc(dev); | sc = device_get_softc(dev); | ||||
sc->sc_dev = dev; | sc->sc_dev = dev; | ||||
rid = 0; | rid = 0; | ||||
sc->sc_mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, | sc->sc_mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, | ||||
RF_ACTIVE); | RF_ACTIVE); | ||||
if (!sc->sc_mem_res) { | if (!sc->sc_mem_res) { | ||||
device_printf(dev, "cannot allocate memory window\n"); | device_printf(dev, "cannot allocate memory window\n"); | ||||
return (ENXIO); | return (ENXIO); | ||||
} | } | ||||
sc->sc_bst = rman_get_bustag(sc->sc_mem_res); | sc->sc_bst = rman_get_bustag(sc->sc_mem_res); | ||||
sc->sc_bsh = rman_get_bushandle(sc->sc_mem_res); | sc->sc_bsh = rman_get_bushandle(sc->sc_mem_res); | ||||
/* Check the unit we are attaching by its base address. */ | |||||
start = rman_get_start(sc->sc_mem_res); | |||||
for (i = 0; i < nitems(bcm_bsc_pins); i++) { | |||||
if (bcm_bsc_pins[i].start == (start & BCM_BSC_BASE_MASK)) | |||||
break; | |||||
} | |||||
if (i == nitems(bcm_bsc_pins)) { | |||||
device_printf(dev, "only bsc0 and bsc1 are supported\n"); | |||||
bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res); | |||||
return (ENXIO); | |||||
} | |||||
/* | |||||
* Configure the GPIO pins to ALT0 function to enable BSC control | |||||
* over the pins. | |||||
*/ | |||||
gpio = devclass_get_device(devclass_find("gpio"), 0); | |||||
if (!gpio) { | |||||
device_printf(dev, "cannot find gpio0\n"); | |||||
bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res); | |||||
return (ENXIO); | |||||
} | |||||
bcm_gpio_set_alternate(gpio, bcm_bsc_pins[i].sda, BCM_GPIO_ALT0); | |||||
bcm_gpio_set_alternate(gpio, bcm_bsc_pins[i].scl, BCM_GPIO_ALT0); | |||||
rid = 0; | rid = 0; | ||||
sc->sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, | sc->sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, | ||||
RF_ACTIVE | RF_SHAREABLE); | RF_ACTIVE | RF_SHAREABLE); | ||||
if (!sc->sc_irq_res) { | if (!sc->sc_irq_res) { | ||||
bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res); | bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res); | ||||
device_printf(dev, "cannot allocate interrupt\n"); | device_printf(dev, "cannot allocate interrupt\n"); | ||||
return (ENXIO); | return (ENXIO); | ||||
▲ Show 20 Lines • Show All 403 Lines • Show Last 20 Lines |