Lines Matching +full:no +full:- +full:divider

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
5 * Copyright (c) 2024 Pierre-Luc Drouin <pldrouin@pldrouin.net>
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
30 * Vybrid Family Inter-Integrated Circuit (I2C)
63 #define I2C_IBFD 0x1 /* I2C Bus Frequency Divider Register */
66 #define IBCR_IBIE (1 << 6) /* I-Bus Interrupt Enable. */
78 #define IBSR_IBIF (1 << 1) /* I-Bus Interrupt Flag. */
87 #define READ1(_sc, _reg) bus_space_read_1(_sc->bst, _sc->bsh, _reg)
88 #define WRITE1(_sc, _reg, _val) bus_space_write_1(_sc->bst,\
89 _sc->bsh, _reg, _val)
93 device_printf((_sc)->dev, fmt, ##args)
98 bus_space_write_1(_sc->bst, _sc->bsh, _reg, _val);\
102 uint32_t ret=bus_space_read_1(_sc->bst, _sc->bsh, _reg);\
126 { -1, 0 }
155 mtx_init(&sc->mutex, device_get_nameunit(dev), "I2C", MTX_DEF); in vf_i2c_attach_common()
157 error = bus_alloc_resources(dev, i2c_spec, sc->res); in vf_i2c_attach_common()
159 mtx_destroy(&sc->mutex); in vf_i2c_attach_common()
165 sc->bst = rman_get_bustag(sc->res[0]); in vf_i2c_attach_common()
166 sc->bsh = rman_get_bushandle(sc->res[0]); in vf_i2c_attach_common()
168 mtx_lock(&sc->mutex); in vf_i2c_attach_common()
172 if (sc->freq == 0) { in vf_i2c_attach_common()
178 sc->freq = UINT32_MAX; in vf_i2c_attach_common()
179 device_printf(dev, "Using existing bus frequency divider register value (0x%02X).\n", div_reg); in vf_i2c_attach_common()
181 …device_printf(dev, "Bus frequency divider value appears unset, defaulting to low I2C bus speed.\n"… in vf_i2c_attach_common()
185 mtx_unlock(&sc->mutex); in vf_i2c_attach_common()
187 sc->iicbus = device_add_child(dev, "iicbus", DEVICE_UNIT_ANY); in vf_i2c_attach_common()
189 if (sc->iicbus == NULL) { in vf_i2c_attach_common()
191 mtx_destroy(&sc->mutex); in vf_i2c_attach_common()
192 bus_release_resources(dev, i2c_spec, sc->res); in vf_i2c_attach_common()
216 mtx_lock(&sc->mutex); in i2c_detach()
218 if (sc->freq == 0) { in i2c_detach()
219 vf_i2c_dbg(sc, "Writing 0x00 to clock divider register\n"); in i2c_detach()
223 bus_release_resources(dev, i2c_spec, sc->res); in i2c_detach()
225 mtx_unlock(&sc->mutex); in i2c_detach()
227 mtx_destroy(&sc->mutex); in i2c_detach()
239 while (retry --) { in wait_for_nibb()
258 while (retry --) { in wait_for_icf()
298 mtx_lock(&sc->mutex); in i2c_repeated_start()
301 vf_i2c_dbg(sc, "cant i2c repeat start: bus is no longer busy\n"); in i2c_repeated_start()
302 mtx_unlock(&sc->mutex); in i2c_repeated_start()
310 /* Write target address - LSB is R/W bit */ in i2c_repeated_start()
316 mtx_unlock(&sc->mutex); in i2c_repeated_start()
321 mtx_unlock(&sc->mutex); in i2c_repeated_start()
340 mtx_lock(&sc->mutex); in i2c_start()
353 mtx_unlock(&sc->mutex); in i2c_start()
364 /* Write target address - LSB is R/W bit */ in i2c_start()
369 mtx_unlock(&sc->mutex); in i2c_start()
373 mtx_unlock(&sc->mutex); in i2c_start()
392 mtx_lock(&sc->mutex); in i2c_stop()
397 mtx_unlock(&sc->mutex); in i2c_stop()
410 if (sc->freq == UINT32_MAX) in i2c_get_div_val()
413 div_reg = vf610_div_table[nitems(vf610_div_table) - 1].reg_val; in i2c_get_div_val()
415 if (sc->hwtype == HW_MVF600) in i2c_get_div_val()
417 else if (sc->freq == 0) in i2c_get_div_val()
418 div_reg = vf610_div_table[nitems(vf610_div_table) - 1].reg_val; in i2c_get_div_val()
423 error = clk_get_freq(sc->clock, &clk_freq); in i2c_get_div_val()
426 "Using default divider.\n"); in i2c_get_div_val()
427 div_reg = vf610_div_table[nitems(vf610_div_table) - 1].reg_val; in i2c_get_div_val()
430 for (i = 0; i < nitems(vf610_div_table) - 1; i++) in i2c_get_div_val()
431 if ((clk_freq / vf610_div_table[i].div) <= sc->freq) in i2c_get_div_val()
437 vf_i2c_dbg(sc, "Writing 0x%02X to clock divider register\n", div_reg); in i2c_get_div_val()
451 mtx_lock(&sc->mutex); in i2c_reset()
459 mtx_unlock(&sc->mutex); in i2c_reset()
476 mtx_lock(&sc->mutex); in i2c_read()
490 mtx_unlock(&sc->mutex); in i2c_read()
495 if (*read == len - 2) { in i2c_read()
496 /* NO ACK on last byte */ in i2c_read()
499 } else if (*read == len - 1) { in i2c_read()
509 mtx_unlock(&sc->mutex); in i2c_read()
526 mtx_lock(&sc->mutex); in i2c_write()
532 mtx_unlock(&sc->mutex); in i2c_write()
536 if (!tx_acked(sc) && (*sent = (len - 2)) ){ in i2c_write()
537 mtx_unlock(&sc->mutex); in i2c_write()
538 vf_i2c_dbg(sc, "no ACK on %d write\n", *sent); in i2c_write()
544 mtx_unlock(&sc->mutex); in i2c_write()