1 /* 2 * Copyright (c) 2014 The DragonFly Project. All rights reserved. 3 * 4 * This code is derived from software contributed to The DragonFly Project 5 * by Matthew Dillon <dillon@backplane.com> and was subsequently ported 6 * to FreeBSD by Michael Gmelin <freebsd@grem.de> 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in 16 * the documentation and/or other materials provided with the 17 * distribution. 18 * 3. Neither the name of The DragonFly Project nor the names of its 19 * contributors may be used to endorse or promote products derived 20 * from this software without specific, prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 23 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 25 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 26 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 27 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, 28 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 29 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 30 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 31 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 32 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 * 35 * $FreeBSD$ 36 */ 37 38 #ifndef _ICHIIC_IG4_VAR_H_ 39 #define _ICHIIC_IG4_VAR_H_ 40 41 #include "bus_if.h" 42 #include "device_if.h" 43 #include "pci_if.h" 44 #include "iicbus_if.h" 45 46 enum ig4_vers { IG4_HASWELL, IG4_ATOM, IG4_SKYLAKE, IG4_APL, IG4_CANNONLAKE }; 47 /* Controller has additional registers */ 48 #define IG4_HAS_ADDREGS(vers) ((vers) == IG4_SKYLAKE || \ 49 (vers) == IG4_APL || (vers) == IG4_CANNONLAKE) 50 51 struct ig4_hw { 52 uint32_t ic_clock_rate; /* MHz */ 53 uint32_t sda_fall_time; /* nsec */ 54 uint32_t scl_fall_time; /* nsec */ 55 uint32_t sda_hold_time; /* nsec */ 56 int txfifo_depth; 57 int rxfifo_depth; 58 }; 59 60 struct ig4_cfg { 61 uint32_t version; 62 uint32_t bus_speed; 63 uint16_t ss_scl_hcnt; 64 uint16_t ss_scl_lcnt; 65 uint16_t ss_sda_hold; 66 uint16_t fs_scl_hcnt; 67 uint16_t fs_scl_lcnt; 68 uint16_t fs_sda_hold; 69 int txfifo_depth; 70 int rxfifo_depth; 71 }; 72 73 struct ig4iic_softc { 74 device_t dev; 75 device_t iicbus; 76 struct resource *regs_res; 77 int regs_rid; 78 struct resource *intr_res; 79 int intr_rid; 80 void *intr_handle; 81 int intr_type; 82 enum ig4_vers version; 83 struct ig4_cfg cfg; 84 uint32_t intr_mask; 85 uint8_t last_slave; 86 int platform_attached : 1; 87 int use_10bit : 1; 88 int slave_valid : 1; 89 int poll: 1; 90 91 /* 92 * Locking semantics: 93 * 94 * Functions implementing the icbus interface that interact 95 * with the controller acquire an exclusive lock on call_lock 96 * to prevent interleaving of calls to the interface. 97 * 98 * io_lock is used as condition variable to synchronize active process 99 * with the interrupt handler. It should not be used for tasks other 100 * than waiting for interrupt and passing parameters to and from 101 * it's handler. 102 */ 103 struct sx call_lock; 104 struct mtx io_lock; 105 }; 106 107 typedef struct ig4iic_softc ig4iic_softc_t; 108 109 extern devclass_t ig4iic_devclass; 110 111 /* Attach/Detach called from ig4iic_pci_*() */ 112 int ig4iic_attach(ig4iic_softc_t *sc); 113 int ig4iic_detach(ig4iic_softc_t *sc); 114 int ig4iic_suspend(ig4iic_softc_t *sc); 115 int ig4iic_resume(ig4iic_softc_t *sc); 116 117 /* iicbus methods */ 118 extern iicbus_transfer_t ig4iic_transfer; 119 extern iicbus_reset_t ig4iic_reset; 120 extern iicbus_callback_t ig4iic_callback; 121 122 #endif /* _ICHIIC_IG4_VAR_H_ */ 123