37#include <sys/kernel.h>
38#include <sys/limits.h>
39#include <sys/module.h>
45#include <dev/extres/clk/clk.h>
50#include <dev/ofw/ofw_bus.h>
51#include <dev/ofw/ofw_bus_subr.h>
57 {
"opencores,i2c-ocores", 1 },
58 {
"sifive,fu740-c000-i2c", 1 },
59 {
"sifive,fu540-c000-i2c", 1 },
65 { SYS_RES_MEMORY, 0, RF_ACTIVE },
74 return (ofw_bus_get_node(bus));
86 sc = device_get_softc(
dev);
89 mtx_init(&sc->
sc_mtx,
"iicoc",
"iicoc", MTX_DEF);
93 device_printf(
dev,
"Could not allocate bus resource.\n");
97 node = ofw_bus_get_node(
dev);
99 OF_getencprop(node,
"reg-shift", &sc->
reg_shift,
102 error = clk_get_by_ofw_index(
dev, 0, 0, &clock);
104 device_printf(
dev,
"Couldn't get clock\n");
107 error = clk_enable(clock);
109 device_printf(
dev,
"Couldn't enable clock\n");
114 device_printf(
dev,
"Couldn't get clock frequency\n");
118 device_printf(
dev,
"Unsupported clock frequency\n");
125 sc->
iicbus = device_add_child(
dev,
"iicbus", -1);
127 device_printf(
dev,
"Could not allocate iicbus instance.\n");
133 config_intrhook_oneshot((ich_func_t)bus_generic_attach,
dev);
150 if (!ofw_bus_status_okay(
dev))
156 device_set_desc(
dev,
"OpenCores I2C master controller");
158 return (BUS_PROBE_DEFAULT);
int iicbus_null_callback(device_t dev, int index, caddr_t data)
devclass_t ofw_iicbus_devclass
driver_t ofw_iicbus_driver
devclass_t iicoc_devclass
int iicoc_iicbus_write(device_t dev, const char *buf, int len, int *sent, int timeout)
int iicoc_iicbus_stop(device_t dev)
int iicoc_iicbus_reset(device_t dev, u_char speed, u_char addr, u_char *oldadr)
int iicoc_iicbus_repeated_start(device_t dev, u_char slave, int timeout)
int iicoc_init(device_t dev)
int iicoc_iicbus_start(device_t dev, u_char slave, int timeout)
int iicoc_iicbus_read(device_t dev, char *buf, int len, int *read, int last, int delay)
static struct resource_spec iicoc_spec[]
static phandle_t iicoc_get_node(device_t bus, device_t dev)
MODULE_DEPEND(iicoc, iicbus, 1, 1, 1)
static int iicoc_probe(device_t dev)
static driver_t iicoc_driver
static struct ofw_compat_data compat_data[]
SIMPLEBUS_PNP_INFO(compat_data)
DRIVER_MODULE(iicoc, simplebus, iicoc_driver, iicoc_devclass, 0, 0)
static device_method_t iicoc_methods[]
static int iicoc_attach(device_t dev)
int iicbus_transfer(device_t bus, struct iic_msg *msgs, uint32_t nmsgs)
int iicbus_read(device_t bus, char *buf, int len, int *read, int last, int delay)
int iicbus_write(device_t bus, const char *buf, int len, int *sent, int timeout)
int iicbus_stop(device_t bus)
int iicbus_repeated_start(device_t bus, u_char slave, int timeout)
int iicbus_start(device_t bus, u_char slave, int timeout)
int iicbus_transfer_gen(device_t dev, struct iic_msg *msgs, uint32_t nmsgs)
#define iicbus_reset(bus, speed, addr, oldaddr)
struct resource * mem_res