summaryrefslogtreecommitdiff
path: root/sys/dev/fdt
diff options
context:
space:
mode:
authorPatrick Wildt <patrick@cvs.openbsd.org>2020-11-17 14:30:14 +0000
committerPatrick Wildt <patrick@cvs.openbsd.org>2020-11-17 14:30:14 +0000
commite4d87290cdf454261709a36ed0b6d748b14410d3 (patch)
tree33be6a262670c2cf1b37aca57a908764c8b25d4d /sys/dev/fdt
parenta51172903dee49247e84eab53033506d3e07b2c5 (diff)
Split imxiic(4) into the FDT-attachment code and the i.MX I2C code
in preparation for upcoming ACPI-attachment. ok kettenis@
Diffstat (limited to 'sys/dev/fdt')
-rw-r--r--sys/dev/fdt/files.fdt7
-rw-r--r--sys/dev/fdt/imxiic.c469
-rw-r--r--sys/dev/fdt/imxiic_fdt.c147
-rw-r--r--sys/dev/fdt/imxiicvar.h67
4 files changed, 150 insertions, 540 deletions
diff --git a/sys/dev/fdt/files.fdt b/sys/dev/fdt/files.fdt
index d1bfe1e2959..9c276aba37b 100644
--- a/sys/dev/fdt/files.fdt
+++ b/sys/dev/fdt/files.fdt
@@ -1,4 +1,4 @@
-# $OpenBSD: files.fdt,v 1.141 2020/06/25 12:09:11 patrick Exp $
+# $OpenBSD: files.fdt,v 1.142 2020/11/17 14:30:13 patrick Exp $
#
# Config file and device description for machine-independent FDT code.
# Included by ports that need it.
@@ -464,9 +464,8 @@ device imxgpio
attach imxgpio at fdt
file dev/fdt/imxgpio.c imxgpio
-device imxiic: i2cbus
-attach imxiic at fdt
-file dev/fdt/imxiic.c imxiic
+attach imxiic at fdt with imxiic_fdt
+file dev/fdt/imxiic_fdt.c imxiic_fdt
device imxiomuxc
attach imxiomuxc at fdt
diff --git a/sys/dev/fdt/imxiic.c b/sys/dev/fdt/imxiic.c
deleted file mode 100644
index 26399704b84..00000000000
--- a/sys/dev/fdt/imxiic.c
+++ /dev/null
@@ -1,469 +0,0 @@
-/* $OpenBSD: imxiic.c,v 1.15 2020/11/14 21:24:08 patrick Exp $ */
-/*
- * Copyright (c) 2013 Patrick Wildt <patrick@blueri.se>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include <sys/param.h>
-#include <sys/device.h>
-#include <sys/kernel.h>
-#include <sys/systm.h>
-
-#include <machine/bus.h>
-#include <machine/fdt.h>
-
-#include <dev/fdt/imxiicvar.h>
-
-#include <dev/ofw/openfirm.h>
-#include <dev/ofw/ofw_clock.h>
-#include <dev/ofw/ofw_pinctrl.h>
-#include <dev/ofw/fdt.h>
-
-/* registers */
-#define I2C_IADR 0x00
-#define I2C_IFDR 0x01
-#define I2C_I2CR 0x02
-#define I2C_I2SR 0x03
-#define I2C_I2DR 0x04
-
-#define I2C_I2CR_RSTA (1 << 2)
-#define I2C_I2CR_TXAK (1 << 3)
-#define I2C_I2CR_MTX (1 << 4)
-#define I2C_I2CR_MSTA (1 << 5)
-#define I2C_I2CR_IIEN (1 << 6)
-#define I2C_I2CR_IEN (1 << 7)
-#define I2C_I2SR_RXAK (1 << 0)
-#define I2C_I2SR_IIF (1 << 1)
-#define I2C_I2SR_IAL (1 << 4)
-#define I2C_I2SR_IBB (1 << 5)
-
-#define I2C_TYPE_IMX21 0
-#define I2C_TYPE_VF610 1
-
-struct imxiic_softc {
- struct device sc_dev;
- bus_space_tag_t sc_iot;
- bus_space_handle_t sc_ioh;
- bus_size_t sc_ios;
- int sc_reg_shift;
- int sc_type;
- int sc_node;
- int sc_bitrate;
- uint32_t sc_clkrate;
-
- struct imxiic_clk_pair *sc_clk_div;
- int sc_clk_ndiv;
-
- struct rwlock sc_buslock;
- struct i2c_controller i2c_tag;
-
- uint16_t frequency;
- uint16_t intr_status;
- uint16_t stopped;
-};
-
-int imxiic_match(struct device *, void *, void *);
-void imxiic_attach(struct device *, struct device *, void *);
-int imxiic_detach(struct device *, int);
-
-void imxiic_enable(struct imxiic_softc *, int);
-void imxiic_clear_iodone(struct imxiic_softc *);
-void imxiic_setspeed(struct imxiic_softc *, u_int);
-int imxiic_wait_state(struct imxiic_softc *, uint32_t, uint32_t);
-int imxiic_read(struct imxiic_softc *, int, const void *, int,
- void *, int);
-int imxiic_write(struct imxiic_softc *, int, const void *, int,
- const void *, int);
-
-int imxiic_i2c_acquire_bus(void *, int);
-void imxiic_i2c_release_bus(void *, int);
-int imxiic_i2c_exec(void *, i2c_op_t, i2c_addr_t, const void *, size_t,
- void *, size_t, int);
-
-uint8_t imxiic_read_1(struct imxiic_softc *, int);
-void imxiic_write_1(struct imxiic_softc *, int, uint8_t);
-
-#define HREAD1(sc, reg) \
- imxiic_read_1((sc), (reg))
-#define HWRITE1(sc, reg, val) \
- imxiic_write_1((sc), (reg), (val))
-#define HSET1(sc, reg, bits) \
- HWRITE1((sc), (reg), HREAD1((sc), (reg)) | (bits))
-#define HCLR1(sc, reg, bits) \
- HWRITE1((sc), (reg), HREAD1((sc), (reg)) & ~(bits))
-
-void imxiic_scan(struct device *, struct i2cbus_attach_args *, void *);
-
-struct cfattach imxiic_ca = {
- sizeof(struct imxiic_softc), imxiic_match, imxiic_attach,
- imxiic_detach
-};
-
-struct cfdriver imxiic_cd = {
- NULL, "imxiic", DV_DULL
-};
-
-int
-imxiic_match(struct device *parent, void *match, void *aux)
-{
- struct fdt_attach_args *faa = aux;
-
- return (OF_is_compatible(faa->fa_node, "fsl,imx21-i2c") ||
- OF_is_compatible(faa->fa_node, "fsl,vf610-i2c"));
-}
-
-void
-imxiic_attach(struct device *parent, struct device *self, void *aux)
-{
- struct imxiic_softc *sc = (struct imxiic_softc *)self;
- struct fdt_attach_args *faa = aux;
-
- if (faa->fa_nreg < 1)
- return;
-
- sc->sc_iot = faa->fa_iot;
- sc->sc_ios = faa->fa_reg[0].size;
- sc->sc_node = faa->fa_node;
- if (bus_space_map(sc->sc_iot, faa->fa_reg[0].addr,
- faa->fa_reg[0].size, 0, &sc->sc_ioh))
- panic("imxiic_attach: bus_space_map failed!");
-
- sc->sc_reg_shift = 2;
- sc->sc_clk_div = imxiic_imx21_clk_div;
- sc->sc_clk_ndiv = nitems(imxiic_imx21_clk_div);
- sc->sc_type = I2C_TYPE_IMX21;
-
- if (OF_is_compatible(faa->fa_node, "fsl,vf610-i2c")) {
- sc->sc_reg_shift = 0;
- sc->sc_clk_div = imxiic_vf610_clk_div;
- sc->sc_clk_ndiv = nitems(imxiic_vf610_clk_div);
- sc->sc_type = I2C_TYPE_VF610;
- }
-
- printf("\n");
-
- clock_enable(faa->fa_node, NULL);
- pinctrl_byname(faa->fa_node, "default");
-
- /* set speed */
- sc->sc_clkrate = clock_get_frequency(sc->sc_node, NULL) / 1000;
- sc->sc_bitrate = OF_getpropint(sc->sc_node,
- "clock-frequency", 100000) / 1000;
- imxiic_setspeed(sc, sc->sc_bitrate);
-
- /* reset */
- imxiic_enable(sc, 0);
-
- sc->stopped = 1;
- rw_init(&sc->sc_buslock, sc->sc_dev.dv_xname);
-
- struct i2cbus_attach_args iba;
-
- sc->i2c_tag.ic_cookie = sc;
- sc->i2c_tag.ic_acquire_bus = imxiic_i2c_acquire_bus;
- sc->i2c_tag.ic_release_bus = imxiic_i2c_release_bus;
- sc->i2c_tag.ic_exec = imxiic_i2c_exec;
-
- bzero(&iba, sizeof iba);
- iba.iba_name = "iic";
- iba.iba_tag = &sc->i2c_tag;
- iba.iba_bus_scan = imxiic_scan;
- iba.iba_bus_scan_arg = &sc->sc_node;
- config_found(&sc->sc_dev, &iba, iicbus_print);
-}
-
-void
-imxiic_enable(struct imxiic_softc *sc, int on)
-{
- /*
- * VF610: write 1 to clear bits
- * iMX21: write 0 to clear bits
- */
- if (sc->sc_type == I2C_TYPE_VF610)
- HWRITE1(sc, I2C_I2SR, I2C_I2SR_IAL | I2C_I2SR_IIF);
- else
- HWRITE1(sc, I2C_I2SR, 0);
-
- /* VF610 inverts enable bit meaning */
- if (sc->sc_type == I2C_TYPE_VF610)
- on = !on;
- if (on)
- HWRITE1(sc, I2C_I2CR, I2C_I2CR_IEN);
- else
- HWRITE1(sc, I2C_I2CR, 0);
-}
-
-void
-imxiic_clear_iodone(struct imxiic_softc *sc)
-{
- /*
- * VF610: write bit to clear bit
- * iMX21: clear bit, keep rest
- */
- if (sc->sc_type == I2C_TYPE_VF610)
- HWRITE1(sc, I2C_I2SR, I2C_I2SR_IIF);
- else
- HCLR1(sc, I2C_I2SR, I2C_I2SR_IIF);
-}
-
-void
-imxiic_setspeed(struct imxiic_softc *sc, u_int speed)
-{
- if (!sc->frequency) {
- uint32_t div;
- int i;
-
- div = (sc->sc_clkrate + speed - 1) / speed;
- if (div < sc->sc_clk_div[0].div)
- i = 0;
- else if (div > sc->sc_clk_div[sc->sc_clk_ndiv - 1].div)
- i = sc->sc_clk_ndiv - 1;
- else
- for (i = 0; sc->sc_clk_div[i].div < div; i++);
-
- sc->frequency = sc->sc_clk_div[i].val;
- }
-
- HWRITE1(sc, I2C_IFDR, sc->frequency);
-}
-
-int
-imxiic_wait_state(struct imxiic_softc *sc, uint32_t mask, uint32_t value)
-{
- uint32_t state;
- int timeout;
- for (timeout = 1000; timeout > 0; timeout--) {
- if (((state = HREAD1(sc, I2C_I2SR)) & mask) == value)
- return 0;
- delay(10);
- }
- return ETIMEDOUT;
-}
-
-int
-imxiic_read(struct imxiic_softc *sc, int addr, const void *cmd, int cmdlen,
- void *data, int len)
-{
- int i;
-
- if (cmdlen > 0) {
- if (imxiic_write(sc, addr, cmd, cmdlen, NULL, 0))
- return (EIO);
-
- HSET1(sc, I2C_I2CR, I2C_I2CR_RSTA);
- delay(1);
- if (imxiic_wait_state(sc, I2C_I2SR_IBB, I2C_I2SR_IBB))
- return (EIO);
- }
-
- imxiic_clear_iodone(sc);
- HWRITE1(sc, I2C_I2DR, (addr << 1) | 1);
-
- if (imxiic_wait_state(sc, I2C_I2SR_IIF, I2C_I2SR_IIF))
- return (EIO);
- imxiic_clear_iodone(sc);
- if (HREAD1(sc, I2C_I2SR) & I2C_I2SR_RXAK)
- return (EIO);
-
- HCLR1(sc, I2C_I2CR, I2C_I2CR_MTX);
- if (len - 1)
- HCLR1(sc, I2C_I2CR, I2C_I2CR_TXAK);
-
- /* dummy read */
- HREAD1(sc, I2C_I2DR);
-
- for (i = 0; i < len; i++) {
- if (imxiic_wait_state(sc, I2C_I2SR_IIF, I2C_I2SR_IIF))
- return (EIO);
- imxiic_clear_iodone(sc);
-
- if (i == (len - 1)) {
- HCLR1(sc, I2C_I2CR, I2C_I2CR_MSTA | I2C_I2CR_MTX);
- imxiic_wait_state(sc, I2C_I2SR_IBB, 0);
- sc->stopped = 1;
- } else if (i == (len - 2)) {
- HSET1(sc, I2C_I2CR, I2C_I2CR_TXAK);
- }
- ((uint8_t*)data)[i] = HREAD1(sc, I2C_I2DR);
- }
-
- return 0;
-}
-
-int
-imxiic_write(struct imxiic_softc *sc, int addr, const void *cmd, int cmdlen,
- const void *data, int len)
-{
- int i;
-
- imxiic_clear_iodone(sc);
- HWRITE1(sc, I2C_I2DR, addr << 1);
-
- if (imxiic_wait_state(sc, I2C_I2SR_IIF, I2C_I2SR_IIF))
- return (EIO);
- imxiic_clear_iodone(sc);
- if (HREAD1(sc, I2C_I2SR) & I2C_I2SR_RXAK)
- return (EIO);
-
- for (i = 0; i < cmdlen; i++) {
- HWRITE1(sc, I2C_I2DR, ((uint8_t*)cmd)[i]);
- if (imxiic_wait_state(sc, I2C_I2SR_IIF, I2C_I2SR_IIF))
- return (EIO);
- imxiic_clear_iodone(sc);
- if (HREAD1(sc, I2C_I2SR) & I2C_I2SR_RXAK)
- return (EIO);
- }
-
- for (i = 0; i < len; i++) {
- HWRITE1(sc, I2C_I2DR, ((uint8_t*)data)[i]);
- if (imxiic_wait_state(sc, I2C_I2SR_IIF, I2C_I2SR_IIF))
- return (EIO);
- imxiic_clear_iodone(sc);
- if (HREAD1(sc, I2C_I2SR) & I2C_I2SR_RXAK)
- return (EIO);
- }
- return 0;
-}
-
-int
-imxiic_i2c_acquire_bus(void *cookie, int flags)
-{
- struct imxiic_softc *sc = cookie;
-
- rw_enter(&sc->sc_buslock, RW_WRITE);
-
- /* clock gating */
- clock_enable(sc->sc_node, NULL);
-
- /* set speed */
- imxiic_setspeed(sc, sc->sc_bitrate);
-
- /* enable the controller */
- imxiic_enable(sc, 1);
-
- /* wait for it to be stable */
- delay(50);
-
- return 0;
-}
-
-void
-imxiic_i2c_release_bus(void *cookie, int flags)
-{
- struct imxiic_softc *sc = cookie;
-
- imxiic_enable(sc, 0);
-
- rw_exit(&sc->sc_buslock);
-}
-
-int
-imxiic_i2c_exec(void *cookie, i2c_op_t op, i2c_addr_t addr,
- const void *cmdbuf, size_t cmdlen, void *buf, size_t len, int flags)
-{
- struct imxiic_softc *sc = cookie;
- int ret = 0;
-
- if (!I2C_OP_STOP_P(op))
- return EINVAL;
-
- /* start transaction */
- HSET1(sc, I2C_I2CR, I2C_I2CR_MSTA);
-
- if (imxiic_wait_state(sc, I2C_I2SR_IBB, I2C_I2SR_IBB)) {
- ret = EIO;
- goto fail;
- }
-
- sc->stopped = 0;
-
- HSET1(sc, I2C_I2CR, I2C_I2CR_IIEN | I2C_I2CR_MTX | I2C_I2CR_TXAK);
-
- if (I2C_OP_READ_P(op)) {
- ret = imxiic_read(sc, addr, cmdbuf, cmdlen, buf, len);
- } else {
- ret = imxiic_write(sc, addr, cmdbuf, cmdlen, buf, len);
- }
-
-fail:
- if (!sc->stopped) {
- HCLR1(sc, I2C_I2CR, I2C_I2CR_MSTA | I2C_I2CR_MTX);
- imxiic_wait_state(sc, I2C_I2SR_IBB, 0);
- sc->stopped = 1;
- }
-
- return ret;
-}
-
-int
-imxiic_detach(struct device *self, int flags)
-{
- struct imxiic_softc *sc = (struct imxiic_softc *)self;
-
- HWRITE1(sc, I2C_IADR, 0);
- HWRITE1(sc, I2C_IFDR, 0);
- HWRITE1(sc, I2C_I2CR, 0);
- HWRITE1(sc, I2C_I2SR, 0);
-
- bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios);
- return 0;
-}
-
-uint8_t
-imxiic_read_1(struct imxiic_softc *sc, int reg)
-{
- reg <<= sc->sc_reg_shift;
-
- return bus_space_read_1(sc->sc_iot, sc->sc_ioh, reg);
-}
-
-void
-imxiic_write_1(struct imxiic_softc *sc, int reg, uint8_t val)
-{
- reg <<= sc->sc_reg_shift;
-
- bus_space_write_1(sc->sc_iot, sc->sc_ioh, reg, val);
-}
-
-void
-imxiic_scan(struct device *self, struct i2cbus_attach_args *iba, void *aux)
-{
- int iba_node = *(int *)aux;
- extern int iic_print(void *, const char *);
- struct i2c_attach_args ia;
- char name[32];
- uint32_t reg[1];
- int node;
-
- for (node = OF_child(iba_node); node; node = OF_peer(node)) {
- memset(name, 0, sizeof(name));
- memset(reg, 0, sizeof(reg));
-
- if (OF_getprop(node, "compatible", name, sizeof(name)) == -1)
- continue;
- if (name[0] == '\0')
- continue;
-
- if (OF_getprop(node, "reg", &reg, sizeof(reg)) != sizeof(reg))
- continue;
-
- memset(&ia, 0, sizeof(ia));
- ia.ia_tag = iba->iba_tag;
- ia.ia_addr = bemtoh32(&reg[0]);
- ia.ia_name = name;
- ia.ia_cookie = &node;
-
- config_found(self, &ia, iic_print);
- }
-}
diff --git a/sys/dev/fdt/imxiic_fdt.c b/sys/dev/fdt/imxiic_fdt.c
new file mode 100644
index 00000000000..ab60de38511
--- /dev/null
+++ b/sys/dev/fdt/imxiic_fdt.c
@@ -0,0 +1,147 @@
+/* $OpenBSD: imxiic_fdt.c,v 1.1 2020/11/17 14:30:13 patrick Exp $ */
+/*
+ * Copyright (c) 2013 Patrick Wildt <patrick@blueri.se>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/param.h>
+#include <sys/device.h>
+#include <sys/kernel.h>
+#include <sys/systm.h>
+
+#include <machine/bus.h>
+#include <machine/fdt.h>
+
+#include <dev/ofw/openfirm.h>
+#include <dev/ofw/ofw_clock.h>
+#include <dev/ofw/ofw_pinctrl.h>
+#include <dev/ofw/fdt.h>
+
+#include <dev/ic/imxiicvar.h>
+
+struct imxiic_fdt_softc {
+ struct imxiic_softc fc_sc;
+ int fc_node;
+};
+
+int imxiic_fdt_match(struct device *, void *, void *);
+void imxiic_fdt_attach(struct device *, struct device *, void *);
+
+void imxiic_fdt_bus_scan(struct device *, struct i2cbus_attach_args *, void *);
+
+struct cfattach imxiic_fdt_ca = {
+ sizeof(struct imxiic_fdt_softc), imxiic_fdt_match, imxiic_fdt_attach
+};
+
+int
+imxiic_fdt_match(struct device *parent, void *match, void *aux)
+{
+ struct fdt_attach_args *faa = aux;
+
+ return (OF_is_compatible(faa->fa_node, "fsl,imx21-i2c") ||
+ OF_is_compatible(faa->fa_node, "fsl,vf610-i2c"));
+}
+
+void
+imxiic_fdt_attach(struct device *parent, struct device *self, void *aux)
+{
+ struct imxiic_fdt_softc *fc = (struct imxiic_fdt_softc *)self;
+ struct imxiic_softc *sc = &fc->fc_sc;
+ struct fdt_attach_args *faa = aux;
+
+ if (faa->fa_nreg < 1)
+ return;
+
+ sc->sc_iot = faa->fa_iot;
+ sc->sc_ios = faa->fa_reg[0].size;
+ fc->fc_node = faa->fa_node;
+ if (bus_space_map(sc->sc_iot, faa->fa_reg[0].addr,
+ faa->fa_reg[0].size, 0, &sc->sc_ioh))
+ panic("imxiic_attach: bus_space_map failed!");
+
+ sc->sc_reg_shift = 2;
+ sc->sc_clk_div = imxiic_imx21_clk_div;
+ sc->sc_clk_ndiv = nitems(imxiic_imx21_clk_div);
+ sc->sc_type = I2C_TYPE_IMX21;
+
+ if (OF_is_compatible(faa->fa_node, "fsl,vf610-i2c")) {
+ sc->sc_reg_shift = 0;
+ sc->sc_clk_div = imxiic_vf610_clk_div;
+ sc->sc_clk_ndiv = nitems(imxiic_vf610_clk_div);
+ sc->sc_type = I2C_TYPE_VF610;
+ }
+
+ printf("\n");
+
+ clock_enable(faa->fa_node, NULL);
+ pinctrl_byname(faa->fa_node, "default");
+
+ /* set speed */
+ sc->sc_clkrate = clock_get_frequency(fc->fc_node, NULL) / 1000;
+ sc->sc_bitrate = OF_getpropint(fc->fc_node,
+ "clock-frequency", 100000) / 1000;
+ imxiic_setspeed(sc, sc->sc_bitrate);
+
+ /* reset */
+ imxiic_enable(sc, 0);
+
+ sc->stopped = 1;
+ rw_init(&sc->sc_buslock, sc->sc_dev.dv_xname);
+
+ struct i2cbus_attach_args iba;
+
+ sc->i2c_tag.ic_cookie = sc;
+ sc->i2c_tag.ic_acquire_bus = imxiic_i2c_acquire_bus;
+ sc->i2c_tag.ic_release_bus = imxiic_i2c_release_bus;
+ sc->i2c_tag.ic_exec = imxiic_i2c_exec;
+
+ bzero(&iba, sizeof iba);
+ iba.iba_name = "iic";
+ iba.iba_tag = &sc->i2c_tag;
+ iba.iba_bus_scan = imxiic_fdt_bus_scan;
+ iba.iba_bus_scan_arg = &fc->fc_node;
+ config_found(&sc->sc_dev, &iba, iicbus_print);
+}
+
+void
+imxiic_fdt_bus_scan(struct device *self, struct i2cbus_attach_args *iba, void *aux)
+{
+ int iba_node = *(int *)aux;
+ extern int iic_print(void *, const char *);
+ struct i2c_attach_args ia;
+ char name[32];
+ uint32_t reg[1];
+ int node;
+
+ for (node = OF_child(iba_node); node; node = OF_peer(node)) {
+ memset(name, 0, sizeof(name));
+ memset(reg, 0, sizeof(reg));
+
+ if (OF_getprop(node, "compatible", name, sizeof(name)) == -1)
+ continue;
+ if (name[0] == '\0')
+ continue;
+
+ if (OF_getprop(node, "reg", &reg, sizeof(reg)) != sizeof(reg))
+ continue;
+
+ memset(&ia, 0, sizeof(ia));
+ ia.ia_tag = iba->iba_tag;
+ ia.ia_addr = bemtoh32(&reg[0]);
+ ia.ia_name = name;
+ ia.ia_cookie = &node;
+
+ config_found(self, &ia, iic_print);
+ }
+}
diff --git a/sys/dev/fdt/imxiicvar.h b/sys/dev/fdt/imxiicvar.h
deleted file mode 100644
index 77786ea271a..00000000000
--- a/sys/dev/fdt/imxiicvar.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/* $OpenBSD: imxiicvar.h,v 1.4 2020/11/14 21:24:08 patrick Exp $ */
-/*
- * Copyright (c) 2013 Patrick Wildt <patrick@blueri.se>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifndef IMXIICVAR_H
-#define IMXIICVAR_H
-
-#include <sys/param.h>
-#include <sys/device.h>
-#include <sys/systm.h>
-#include <sys/rwlock.h>
-
-#include <dev/i2c/i2cvar.h>
-
-struct imxiic_clk_pair {
- uint16_t div;
- uint16_t val;
-};
-
-static struct imxiic_clk_pair imxiic_imx21_clk_div[50] = {
- { 22, 0x20 }, { 24, 0x21 }, { 26, 0x22 }, { 28, 0x23 },
- { 30, 0x00 }, { 32, 0x24 }, { 36, 0x25 }, { 40, 0x26 },
- { 42, 0x03 }, { 44, 0x27 }, { 48, 0x28 }, { 52, 0x05 },
- { 56, 0x29 }, { 60, 0x06 }, { 64, 0x2A }, { 72, 0x2B },
- { 80, 0x2C }, { 88, 0x09 }, { 96, 0x2D }, { 104, 0x0A },
- { 112, 0x2E }, { 128, 0x2F }, { 144, 0x0C }, { 160, 0x30 },
- { 192, 0x31 }, { 224, 0x32 }, { 240, 0x0F }, { 256, 0x33 },
- { 288, 0x10 }, { 320, 0x34 }, { 384, 0x35 }, { 448, 0x36 },
- { 480, 0x13 }, { 512, 0x37 }, { 576, 0x14 }, { 640, 0x38 },
- { 768, 0x39 }, { 896, 0x3A }, { 960, 0x17 }, { 1024, 0x3B },
- { 1152, 0x18 }, { 1280, 0x3C }, { 1536, 0x3D }, { 1792, 0x3E },
- { 1920, 0x1B }, { 2048, 0x3F }, { 2304, 0x1C }, { 2560, 0x1D },
- { 3072, 0x1E }, { 3840, 0x1F }
-};
-
-static struct imxiic_clk_pair imxiic_vf610_clk_div[60] = {
- { 20, 0x00 }, { 22, 0x01 }, { 24, 0x02 }, { 26, 0x03 },
- { 28, 0x04 }, { 30, 0x05 }, { 32, 0x09 }, { 34, 0x06 },
- { 36, 0x0A }, { 40, 0x07 }, { 44, 0x0C }, { 48, 0x0D },
- { 52, 0x43 }, { 56, 0x0E }, { 60, 0x45 }, { 64, 0x12 },
- { 68, 0x0F }, { 72, 0x13 }, { 80, 0x14 }, { 88, 0x15 },
- { 96, 0x19 }, { 104, 0x16 }, { 112, 0x1A }, { 128, 0x17 },
- { 136, 0x4F }, { 144, 0x1C }, { 160, 0x1D }, { 176, 0x55 },
- { 192, 0x1E }, { 208, 0x56 }, { 224, 0x22 }, { 228, 0x24 },
- { 240, 0x1F }, { 256, 0x23 }, { 288, 0x5C }, { 320, 0x25 },
- { 384, 0x26 }, { 448, 0x2A }, { 480, 0x27 }, { 512, 0x2B },
- { 576, 0x2C }, { 640, 0x2D }, { 768, 0x31 }, { 896, 0x32 },
- { 960, 0x2F }, { 1024, 0x33 }, { 1152, 0x34 }, { 1280, 0x35 },
- { 1536, 0x36 }, { 1792, 0x3A }, { 1920, 0x37 }, { 2048, 0x3B },
- { 2304, 0x3C }, { 2560, 0x3D }, { 3072, 0x3E }, { 3584, 0x7A },
- { 3840, 0x3F }, { 4096, 0x7B }, { 5120, 0x7D }, { 6144, 0x7E },
-};
-
-#endif