1*37c734d3Snaddy /* $OpenBSD: imxiicvar.h,v 1.2 2022/06/28 23:43:13 naddy Exp $ */ 2a8794a2cSpatrick /* 3a8794a2cSpatrick * Copyright (c) 2013 Patrick Wildt <patrick@blueri.se> 4a8794a2cSpatrick * 5a8794a2cSpatrick * Permission to use, copy, modify, and distribute this software for any 6a8794a2cSpatrick * purpose with or without fee is hereby granted, provided that the above 7a8794a2cSpatrick * copyright notice and this permission notice appear in all copies. 8a8794a2cSpatrick * 9a8794a2cSpatrick * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10a8794a2cSpatrick * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11a8794a2cSpatrick * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12a8794a2cSpatrick * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13a8794a2cSpatrick * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14a8794a2cSpatrick * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15a8794a2cSpatrick * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16a8794a2cSpatrick */ 17a8794a2cSpatrick 18a8794a2cSpatrick #ifndef IMXIICVAR_H 19a8794a2cSpatrick #define IMXIICVAR_H 20a8794a2cSpatrick 21a8794a2cSpatrick #include <sys/param.h> 22a8794a2cSpatrick #include <sys/device.h> 23a8794a2cSpatrick #include <sys/systm.h> 24a8794a2cSpatrick #include <sys/rwlock.h> 25a8794a2cSpatrick 26a8794a2cSpatrick #include <dev/i2c/i2cvar.h> 27a8794a2cSpatrick 28a8794a2cSpatrick #define I2C_TYPE_IMX21 0 29a8794a2cSpatrick #define I2C_TYPE_VF610 1 30a8794a2cSpatrick 31a8794a2cSpatrick struct imxiic_softc { 32a8794a2cSpatrick struct device sc_dev; 33a8794a2cSpatrick bus_space_tag_t sc_iot; 34a8794a2cSpatrick bus_space_handle_t sc_ioh; 35a8794a2cSpatrick bus_size_t sc_ios; 36a8794a2cSpatrick int sc_reg_shift; 37a8794a2cSpatrick int sc_type; 38a8794a2cSpatrick int sc_bitrate; 39a8794a2cSpatrick uint32_t sc_clkrate; 40a8794a2cSpatrick 41*37c734d3Snaddy const struct imxiic_clk_pair *sc_clk_div; 42a8794a2cSpatrick int sc_clk_ndiv; 43a8794a2cSpatrick 44a8794a2cSpatrick struct rwlock sc_buslock; 45a8794a2cSpatrick struct i2c_controller i2c_tag; 46a8794a2cSpatrick 47a8794a2cSpatrick uint16_t frequency; 48a8794a2cSpatrick uint16_t stopped; 49a8794a2cSpatrick }; 50a8794a2cSpatrick 51a8794a2cSpatrick void imxiic_enable(struct imxiic_softc *, int); 52a8794a2cSpatrick void imxiic_setspeed(struct imxiic_softc *, u_int); 53a8794a2cSpatrick 54a8794a2cSpatrick int imxiic_i2c_acquire_bus(void *, int); 55a8794a2cSpatrick void imxiic_i2c_release_bus(void *, int); 56a8794a2cSpatrick int imxiic_i2c_exec(void *, i2c_op_t, i2c_addr_t, const void *, size_t, 57a8794a2cSpatrick void *, size_t, int); 58a8794a2cSpatrick 59a8794a2cSpatrick struct imxiic_clk_pair { 60a8794a2cSpatrick uint16_t div; 61a8794a2cSpatrick uint16_t val; 62a8794a2cSpatrick }; 63a8794a2cSpatrick 64*37c734d3Snaddy static const struct imxiic_clk_pair imxiic_imx21_clk_div[50] = { 65a8794a2cSpatrick { 22, 0x20 }, { 24, 0x21 }, { 26, 0x22 }, { 28, 0x23 }, 66a8794a2cSpatrick { 30, 0x00 }, { 32, 0x24 }, { 36, 0x25 }, { 40, 0x26 }, 67a8794a2cSpatrick { 42, 0x03 }, { 44, 0x27 }, { 48, 0x28 }, { 52, 0x05 }, 68a8794a2cSpatrick { 56, 0x29 }, { 60, 0x06 }, { 64, 0x2A }, { 72, 0x2B }, 69a8794a2cSpatrick { 80, 0x2C }, { 88, 0x09 }, { 96, 0x2D }, { 104, 0x0A }, 70a8794a2cSpatrick { 112, 0x2E }, { 128, 0x2F }, { 144, 0x0C }, { 160, 0x30 }, 71a8794a2cSpatrick { 192, 0x31 }, { 224, 0x32 }, { 240, 0x0F }, { 256, 0x33 }, 72a8794a2cSpatrick { 288, 0x10 }, { 320, 0x34 }, { 384, 0x35 }, { 448, 0x36 }, 73a8794a2cSpatrick { 480, 0x13 }, { 512, 0x37 }, { 576, 0x14 }, { 640, 0x38 }, 74a8794a2cSpatrick { 768, 0x39 }, { 896, 0x3A }, { 960, 0x17 }, { 1024, 0x3B }, 75a8794a2cSpatrick { 1152, 0x18 }, { 1280, 0x3C }, { 1536, 0x3D }, { 1792, 0x3E }, 76a8794a2cSpatrick { 1920, 0x1B }, { 2048, 0x3F }, { 2304, 0x1C }, { 2560, 0x1D }, 77a8794a2cSpatrick { 3072, 0x1E }, { 3840, 0x1F } 78a8794a2cSpatrick }; 79a8794a2cSpatrick 80*37c734d3Snaddy static const struct imxiic_clk_pair imxiic_vf610_clk_div[60] = { 81a8794a2cSpatrick { 20, 0x00 }, { 22, 0x01 }, { 24, 0x02 }, { 26, 0x03 }, 82a8794a2cSpatrick { 28, 0x04 }, { 30, 0x05 }, { 32, 0x09 }, { 34, 0x06 }, 83a8794a2cSpatrick { 36, 0x0A }, { 40, 0x07 }, { 44, 0x0C }, { 48, 0x0D }, 84a8794a2cSpatrick { 52, 0x43 }, { 56, 0x0E }, { 60, 0x45 }, { 64, 0x12 }, 85a8794a2cSpatrick { 68, 0x0F }, { 72, 0x13 }, { 80, 0x14 }, { 88, 0x15 }, 86a8794a2cSpatrick { 96, 0x19 }, { 104, 0x16 }, { 112, 0x1A }, { 128, 0x17 }, 87a8794a2cSpatrick { 136, 0x4F }, { 144, 0x1C }, { 160, 0x1D }, { 176, 0x55 }, 88a8794a2cSpatrick { 192, 0x1E }, { 208, 0x56 }, { 224, 0x22 }, { 228, 0x24 }, 89a8794a2cSpatrick { 240, 0x1F }, { 256, 0x23 }, { 288, 0x5C }, { 320, 0x25 }, 90a8794a2cSpatrick { 384, 0x26 }, { 448, 0x2A }, { 480, 0x27 }, { 512, 0x2B }, 91a8794a2cSpatrick { 576, 0x2C }, { 640, 0x2D }, { 768, 0x31 }, { 896, 0x32 }, 92a8794a2cSpatrick { 960, 0x2F }, { 1024, 0x33 }, { 1152, 0x34 }, { 1280, 0x35 }, 93a8794a2cSpatrick { 1536, 0x36 }, { 1792, 0x3A }, { 1920, 0x37 }, { 2048, 0x3B }, 94a8794a2cSpatrick { 2304, 0x3C }, { 2560, 0x3D }, { 3072, 0x3E }, { 3584, 0x7A }, 95a8794a2cSpatrick { 3840, 0x3F }, { 4096, 0x7B }, { 5120, 0x7D }, { 6144, 0x7E }, 96a8794a2cSpatrick }; 97a8794a2cSpatrick 98a8794a2cSpatrick #endif 99