1 /* 2 * Copyright (c) 2003, 2004 3 * John Wehle <john@feith.com>. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. All advertising materials mentioning features or use of this software 14 * must display the following acknowledgement: 15 * This product includes software developed by John Wehle. 16 * 4. The name of the author may not be used to endorse or promote products 17 * derived from this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 22 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 23 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 25 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 27 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 28 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 /* 33 * Infrared remote routines for the Conexant MPEG-2 Codec driver. 34 * 35 * Ideally these routines should be implemented as a separate 36 * driver which has a generic infrared remote interface so that 37 * it's not necessary for each multimedia driver to re-invent 38 * the wheel. 39 */ 40 41 42 #include <sys/param.h> 43 #include <sys/systm.h> 44 #include <sys/conf.h> 45 #include <sys/uio.h> 46 #include <sys/kernel.h> 47 #include <sys/poll.h> 48 #include <sys/select.h> 49 #include <sys/resource.h> 50 #include <sys/bus.h> 51 #include <sys/rman.h> 52 53 #include <machine/clock.h> 54 55 #include <dev/video/cxm/cxm.h> 56 57 #include <bus/iicbus/iiconf.h> 58 #include <bus/iicbus/iicbus.h> 59 60 #include "iicbb_if.h" 61 62 63 static int 64 cxm_ir_read(device_t iicbus, int i2c_addr, char *buf, int len) 65 { 66 int received; 67 68 if (iicbus_start(iicbus, i2c_addr + 1, CXM_I2C_TIMEOUT) != 0) 69 return -1; 70 71 if (iicbus_read(iicbus, buf, len, &received, IIC_LAST_READ, 0) != 0) 72 goto fail; 73 74 iicbus_stop(iicbus); 75 76 return received; 77 78 fail: 79 iicbus_stop(iicbus); 80 return -1; 81 } 82 83 84 int 85 cxm_ir_init(struct cxm_softc *sc) 86 { 87 unsigned char key[1]; 88 89 if (cxm_ir_read(sc->iicbus, CXM_I2C_IR, 90 key, sizeof(key)) != sizeof(key)) 91 return -1; 92 93 device_printf(sc->dev, "IR Remote\n"); 94 95 return 0; 96 } 97 98 99 int 100 cxm_ir_key(struct cxm_softc *sc, char *buf, int len) 101 { 102 int result; 103 104 result = cxm_ir_read(sc->iicbus, CXM_I2C_IR, buf, len); 105 106 if (result >= 0) 107 return result; 108 109 /* 110 * If the IR receiver didn't respond, 111 * then wait 50 ms and try again. 112 */ 113 114 tsleep(&sc->iicbus, 0, "IR", hz / 20); 115 116 return cxm_ir_read(sc->iicbus, CXM_I2C_IR, buf, len); 117 } 118