Hi everybody !

I'm trying to write a driver in order to control an i2c controlled audio chip.
I only have to send a few commands...
the problem is that I don't understand how I have to do this...
i've read both articles about I2C drivers programming from the linuxjournal.com (I2C drivers part 1 and 2)
but nothing...I still don't get it...
I don't understand how I can choose an i2c bus (I have 3 busses i2c-0, i2c-1 and i2c-2)

here is what I've done for now, but I'm not sure at all that I'm in the good way...

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <linux/proc_fs.h>
#include <linux/device.h>
#include <linux/i2c.h>

//allocation dynamique des nombres majeurs; 0

#define MTV7109AUDIO_MAJOR 0


static unsigned short normal_i2c[] = { I2C_CLIENT_END };
static unsigned short normal_i2c_range[] = { 0x00, 0x15, I2C_CLIENT_END };

struct w5094_dev{

	struct cdev cdev;
	struct i2c_client clt; 


static int w5094_attach_adapter(struct i2c_adapter *adapter);
static int w5094_detach_client(struct i2c_client * client);

int MTV7109Audio_open(struct inode * inode, struct file *filp);
int MTV7109Audio_ioctl(struct inode * inode, struct file *filp, unsigned int cmd, unsigned long arg);

static struct i2c_driver i2c_w5094_driver = {
  .driver = {
    .name = "w5094",
  .attach_adapter = w5094_attach_adapter,
  .detach_client  = w5094_detach_client,

static int w5094_attach_adapter(struct i2c_adapter *adapter)
	if (!(adapter->class & I2C_CLASS_SOUND )) //Sound device
		return 0;
	return 0;//i2c_detect(adapter, &addr_data, w5094_detect);

static int w5094_detach_client(struct i2c_client * client)
	return 0;


int mtv7109audio_major=MTV7109AUDIO_MAJOR;
int mtv7109audio_minor=0;

struct device mtv7109audio_dev;

struct file_operations mtv7109audio_fops = {
  .owner = THIS_MODULE,
  .open  = MTV7109Audio_open,
  .ioctl = MTV7109Audio_ioctl,

int MTV7109Audio_open(struct inode * inode, struct file *filp)

  struct w5094_dev * dev;
  dev = container_of(inode->i_cdev, struct w5094_dev, cdev);
  filp->private_data = dev;
  return 0;

int MTV7109Audio_ioctl(struct inode * inode, struct file *filp, unsigned int cmd, unsigned long arg)
	//switch sur les commandes
	return 0;

static int MTV7109Audio_init(void)
  int result, i;
  dev_t dev=0;
      dev = MKDEV(mtv7109audio_major,mtv7109audio_minor);
      result = register_chrdev_region(dev,1,"MTV7109Audio");
  if (result<0)
      printk (KERN_WARNING "MTV7109Audio: can't get major %d\n",mtv7109audio_major);
      return result;
  return i2c_add_driver(&i2c_w5094_driver);

static void MTV7109Audio_exit(void)
  dev_t dev = MKDEV(mtv7109audio_major,mtv7109audio_minor);