/* * L3 code * * Copyright (C) 2008, Christian Pellegrin <chripell@evolware.org> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * * based on: * * L3 bus algorithm module. * * Copyright (C) 2001 Russell King, All Rights Reserved. * * */ #include <linux/module.h> #include <linux/kernel.h> #include <linux/delay.h> #include <sound/l3.h> /* * Send one byte of data to the chip. Data is latched into the chip on * the rising edge of the clock. */ static void sendbyte(struct l3_pins *adap, unsigned int byte) { int i; for (i = 0; i < 8; i++) { adap->setclk(0); udelay(adap->data_hold); adap->setdat(byte & 1); udelay(adap->data_setup); adap->setclk(1); udelay(adap->clock_high); byte >>= 1; } } /* * Send a set of bytes to the chip. We need to pulse the MODE line * between each byte, but never at the start nor at the end of the * transfer. */ static void sendbytes(struct l3_pins *adap, const u8 *buf, int len) { int i; for (i = 0; i < len; i++) { if (i) { udelay(adap->mode_hold); adap->setmode(0); udelay(adap->mode); } adap->setmode(1); udelay(adap->mode_setup); sendbyte(adap, buf[i]); } } int l3_write(struct l3_pins *adap, u8 addr, u8 *data, int len) { adap->setclk(1); adap->setdat(1); adap->setmode(1); udelay(adap->mode); adap->setmode(0); udelay(adap->mode_setup); sendbyte(adap, addr); udelay(adap->mode_hold); sendbytes(adap, data, len); adap->setclk(1); adap->setdat(1); adap->setmode(0); return len; } EXPORT_SYMBOL_GPL(l3_write); MODULE_DESCRIPTION("L3 bit-banging driver"); MODULE_AUTHOR("Christian Pellegrin <chripell@evolware.org>"); MODULE_LICENSE("GPL");