Viewing file: i2c-keywest.h (2.22 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
#ifndef __I2C_KEYWEST_H__ #define __I2C_KEYWEST_H__
/* The Tumbler audio equalizer can be really slow sometimes */ #define POLL_TIMEOUT (2*HZ)
/* Register indices */ typedef enum { reg_mode = 0, reg_control, reg_status, reg_isr, reg_ier, reg_addr, reg_subaddr, reg_data } reg_t;
/* Mode register */ #define KW_I2C_MODE_100KHZ 0x00 #define KW_I2C_MODE_50KHZ 0x01 #define KW_I2C_MODE_25KHZ 0x02 #define KW_I2C_MODE_DUMB 0x00 #define KW_I2C_MODE_STANDARD 0x04 #define KW_I2C_MODE_STANDARDSUB 0x08 #define KW_I2C_MODE_COMBINED 0x0C #define KW_I2C_MODE_MODE_MASK 0x0C #define KW_I2C_MODE_CHAN_MASK 0xF0
/* Control register */ #define KW_I2C_CTL_AAK 0x01 #define KW_I2C_CTL_XADDR 0x02 #define KW_I2C_CTL_STOP 0x04 #define KW_I2C_CTL_START 0x08
/* Status register */ #define KW_I2C_STAT_BUSY 0x01 #define KW_I2C_STAT_LAST_AAK 0x02 #define KW_I2C_STAT_LAST_RW 0x04 #define KW_I2C_STAT_SDA 0x08 #define KW_I2C_STAT_SCL 0x10
/* IER & ISR registers */ #define KW_I2C_IRQ_DATA 0x01 #define KW_I2C_IRQ_ADDR 0x02 #define KW_I2C_IRQ_STOP 0x04 #define KW_I2C_IRQ_START 0x08 #define KW_I2C_IRQ_MASK 0x0F
/* Physical interface */ struct keywest_iface { unsigned long base; unsigned bsteps; int irq; struct semaphore sem; spinlock_t lock; struct keywest_chan* channels; unsigned chan_count; u8 cur_mode; char read_write; u8* data; unsigned datalen; int state; int result; int stopretry; struct timer_list timeout_timer; struct completion complete; struct keywest_iface* next; };
enum { state_idle, state_addr, state_read, state_write, state_stop, state_dead };
/* Channel on an interface */ struct keywest_chan { struct i2c_adapter adapter; struct keywest_iface* iface; unsigned chan_no; };
/* Register access */
static inline u8 __read_reg(struct keywest_iface *iface, reg_t reg) { return in_8(((volatile u8 *)iface->base) + (((unsigned)reg) << iface->bsteps)); }
static inline void __write_reg(struct keywest_iface *iface, reg_t reg, u8 val) { out_8(((volatile u8 *)iface->base) + (((unsigned)reg) << iface->bsteps), val); (void)__read_reg(iface, reg); udelay(10); }
#define write_reg(reg, val) __write_reg(iface, reg, val) #define read_reg(reg) __read_reg(iface, reg)
#endif /* __I2C_KEYWEST_H__ */
|