📄 i2c-old-porting
字号:
if ((status & 3) == 0) {- saa7110_write(decoder,0x06,0x80);+ i2c_smbus_write_byte_data(client,0x06,0x80); if (status & 0x20) {- DEBUG(printk(KERN_INFO "%s: norm=bw60\n",dev->name));- saa7110_write(decoder,0x2E,0x81);+ DEBUG(printk(KERN_INFO "%s: norm=bw60\n",adp->name));+ i2c_smbus_write_byte_data(client,0x2E,0x81); return VIDEO_MODE_NTSC; }- DEBUG(printk(KERN_INFO "%s: norm=bw50\n",dev->name));- saa7110_write(decoder,0x2E,0x9A);+ DEBUG(printk(KERN_INFO "%s: norm=bw50\n",adp->name));+ i2c_smbus_write_byte_data(client,0x2E,0x9A); return VIDEO_MODE_PAL; } - saa7110_write(decoder,0x06,0x00);+ i2c_smbus_write_byte_data(client,0x06,0x00); if (status & 0x20) { /* 60Hz */- DEBUG(printk(KERN_INFO "%s: norm=ntsc\n",dev->name));- saa7110_write(decoder,0x0D,0x06);- saa7110_write(decoder,0x11,0x2C);- saa7110_write(decoder,0x2E,0x81);+ DEBUG(printk(KERN_INFO "%s: norm=ntsc\n",adp->name));+ i2c_smbus_write_byte_data(client,0x0D,0x06);+ i2c_smbus_write_byte_data(client,0x11,0x2C);+ i2c_smbus_write_byte_data(client,0x2E,0x81); return VIDEO_MODE_NTSC; } /* 50Hz -> PAL/SECAM */- saa7110_write(decoder,0x0D,0x06);- saa7110_write(decoder,0x11,0x59);- saa7110_write(decoder,0x2E,0x9A);+ i2c_smbus_write_byte_data(client,0x0D,0x06);+ i2c_smbus_write_byte_data(client,0x11,0x59);+ i2c_smbus_write_byte_data(client,0x2E,0x9A); mdelay(150); /* pause 150 ms */ - status = saa7110_read(decoder);+ status = i2c_smbus_read_byte(client); if ((status & 0x03) == 0x01) { DEBUG(printk(KERN_INFO "%s: norm=secam\n",dev->name));- saa7110_write(decoder,0x0D,0x07);+ i2c_smbus_write_byte_data(client,0x0D,0x07); return VIDEO_MODE_SECAM; } DEBUG(printk(KERN_INFO "%s: norm=pal\n",dev->name));@@ -188,7 +147,7 @@ } static-int saa7110_attach(struct i2c_device *device)+int saa7110_attach(struct i2c_adapter *adap, int addr, unsigned short flags, int kind) { static const unsigned char initseq[] = { 0, 0x4C, 0x3C, 0x0D, 0xEF, 0xBD, 0xF0, 0x00, 0x00,@@ -198,20 +157,28 @@ 0xD9, 0x17, 0x40, 0x41, 0x80, 0x41, 0x80, 0x4F, 0xFE, 0x01, 0xCF, 0x0F, 0x03, 0x01, 0x81, 0x03, 0x40, 0x75, 0x01, 0x8C, 0x03};- struct saa7110* decoder;+ struct saa7110 *decoder;+ struct i2c_client *client; int rv;-- device->data = decoder = kmalloc(sizeof(struct saa7110), GFP_KERNEL);- if (device->data == 0)+ client=kmalloc(sizeof(*client), GFP_KERNEL);+ if(client == NULL) return -ENOMEM;-- MOD_INC_USE_COUNT;+ client_template.adapter = adap;+ client_template.addr = addr;+ memcpy(client, &client_template, sizeof(*client));++ decoder = kmalloc(sizeof(*decoder), GFP_KERNEL);+ if (decoder == NULL) {+ kfree(client);+ return -ENOMEM;+ } /* clear our private data */- memset(decoder, 0, sizeof(struct saa7110));- strcpy(device->name, "saa7110");- decoder->bus = device->bus;- decoder->addr = device->addr;+ memset(decoder, 0, sizeof(*decoder));+ strcpy(client->name, IF_NAME);+ decoder->client = client;+ client->data = decoder;+ decoder->addr = addr; decoder->norm = VIDEO_MODE_PAL; decoder->input = 0; decoder->enable = 1;@@ -220,40 +187,52 @@ decoder->hue = 32768; decoder->sat = 32768; - rv = saa7110_write_block(decoder, initseq, sizeof(initseq));+ rv = i2c_master_send(client, initseq, sizeof(initseq)); if (rv < 0)- printk(KERN_ERR "%s_attach: init status %d\n", device->name, rv);+ printk(KERN_ERR "%s_attach: init status %d\n", client->name, rv); else {- saa7110_write(decoder,0x21,0x16);- saa7110_write(decoder,0x0D,0x04);- DEBUG(printk(KERN_INFO "%s_attach: chip version %x\n", device->name, saa7110_read(decoder)));- saa7110_write(decoder,0x0D,0x06);+ i2c_smbus_write_byte_data(client,0x21,0x16);+ i2c_smbus_write_byte_data(client,0x0D,0x04);+ DEBUG(printk(KERN_INFO "%s_attach: chip version %x\n", client->name, i2c_smbus_read_byte(client)));+ i2c_smbus_write_byte_data(client,0x0D,0x06); } + init_MUTEX(&decoder->lock);+ i2c_attach_client(client);+ MOD_INC_USE_COUNT; /* setup and implicit mode 0 select has been performed */ return 0; } +static +int saa7110_probe(struct i2c_adapter *adap) +{+ return i2c_probe(adap, &addr_data, saa7110_attach);+}+ static-int saa7110_detach(struct i2c_device *device)+int saa7110_detach(struct i2c_client *client) {- struct saa7110* decoder = device->data;+ struct saa7110* decoder = client->data; - DEBUG(printk(KERN_INFO "%s_detach\n",device->name));+ i2c_detach_client(client);++ DEBUG(printk(KERN_INFO "%s_detach\n",client->name)); /* stop further output */- saa7110_write(decoder,0x0E,0x00);+ i2c_smbus_write_byte_data(client,0x0E,0x00); - kfree(device->data);+ kfree(decoder);+ kfree(client); MOD_DEC_USE_COUNT; return 0; } static-int saa7110_command(struct i2c_device *device, unsigned int cmd, void *arg)+int saa7110_command(struct i2c_client *client, unsigned int cmd, void *arg) {- struct saa7110* decoder = device->data;+ struct saa7110* decoder = client->data; int v; switch (cmd) {@@ -272,11 +251,11 @@ case DECODER_GET_STATUS: {- struct saa7110* decoder = device->data;+ struct saa7110* decoder = client->data; int status; int res = 0; - status = i2c_read(device->bus,device->addr|1);+ status = i2c_smbus_read_byte(client); if (status & 0x40) res |= DECODER_STATUS_GOOD; if (status & 0x03)@@ -301,26 +280,26 @@ v = *(int*)arg; if (decoder->norm != v) { decoder->norm = v;- saa7110_write(decoder, 0x06, 0x00);+ i2c_smbus_write_byte_data(client, 0x06, 0x00); switch (v) { case VIDEO_MODE_NTSC:- saa7110_write(decoder, 0x0D, 0x06);- saa7110_write(decoder, 0x11, 0x2C);- saa7110_write(decoder, 0x30, 0x81);- saa7110_write(decoder, 0x2A, 0xDF);+ i2c_smbus_write_byte_data(client, 0x0D, 0x06);+ i2c_smbus_write_byte_data(client, 0x11, 0x2C);+ i2c_smbus_write_byte_data(client, 0x30, 0x81);+ i2c_smbus_write_byte_data(client, 0x2A, 0xDF); break; case VIDEO_MODE_PAL:- saa7110_write(decoder, 0x0D, 0x06);- saa7110_write(decoder, 0x11, 0x59);- saa7110_write(decoder, 0x2E, 0x9A);+ i2c_smbus_write_byte_data(client, 0x0D, 0x06);+ i2c_smbus_write_byte_data(client, 0x11, 0x59);+ i2c_smbus_write_byte_data(client, 0x2E, 0x9A); break; case VIDEO_MODE_SECAM:- saa7110_write(decoder, 0x0D, 0x07);- saa7110_write(decoder, 0x11, 0x59);- saa7110_write(decoder, 0x2E, 0x9A);+ i2c_smbus_write_byte_data(client, 0x0D, 0x07);+ i2c_smbus_write_byte_data(client, 0x11, 0x59);+ i2c_smbus_write_byte_data(client, 0x2E, 0x9A); break; case VIDEO_MODE_AUTO:- *(int*)arg = determine_norm(device);+ *(int*)arg = determine_norm(client); break; default: return -EPERM;@@ -334,7 +313,7 @@ return -EINVAL; if (decoder->input != v) { decoder->input = v;- saa7110_selmux(device, v);+ saa7110_selmux(client, v); } break; @@ -349,7 +328,7 @@ v = *(int*)arg; if (decoder->enable != v) { decoder->enable = v;- saa7110_write(decoder,0x0E, v ? 0x18 : 0x00);+ i2c_smbus_write_byte_data(client,0x0E, v ? 0x18 : 0x00); } break; @@ -360,22 +339,22 @@ if (decoder->bright != pic->brightness) { /* We want 0 to 255 we get 0-65535 */ decoder->bright = pic->brightness;- saa7110_write(decoder, 0x19, decoder->bright >> 8);+ i2c_smbus_write_byte_data(client, 0x19, decoder->bright >> 8); } if (decoder->contrast != pic->contrast) { /* We want 0 to 127 we get 0-65535 */ decoder->contrast = pic->contrast;- saa7110_write(decoder, 0x13, decoder->contrast >> 9);+ i2c_smbus_write_byte_data(client, 0x13, decoder->contrast >> 9); } if (decoder->sat != pic->colour) { /* We want 0 to 127 we get 0-65535 */ decoder->sat = pic->colour;- saa7110_write(decoder, 0x12, decoder->sat >> 9);+ i2c_smbus_write_byte_data(client, 0x12, decoder->sat >> 9); } if (decoder->hue != pic->hue) { /* We want -128 to 127 we get 0-65535 */ decoder->hue = pic->hue;- saa7110_write(decoder, 0x07, (decoder->hue>>8)-128);+ i2c_smbus_write_byte_data(client, 0x07, (decoder->hue>>8)-128); } } break;@@ -383,7 +362,7 @@ case DECODER_DUMP: for (v=0; v<34; v+=16) { int j;- DEBUG(printk(KERN_INFO "%s: %03x\n",device->name,v));+ DEBUG(printk(KERN_INFO "%s: %03x\n",client->name,v)); for (j=0; j<16; j++) { DEBUG(printk(KERN_INFO " %02x",decoder->reg[v+j])); }@@ -402,24 +381,30 @@ static struct i2c_driver i2c_driver_saa7110 = {- "saa7110", /* name */-- I2C_DRIVERID_VIDEODECODER, /* in i2c.h */- I2C_SAA7110, I2C_SAA7110+1, /* Addr range */-- saa7110_attach,+ IF_NAME, /* name */+ I2C_DRIVERID_SAA7110, /* in i2c.h */+ I2C_DF_NOTIFY, /* Addr range */+ saa7110_probe, saa7110_detach, saa7110_command };+static struct i2c_client client_template = {+ "saa7110_client",+ -1,+ 0,+ 0,+ NULL,+ &i2c_driver_saa7110+}; static int saa7110_init(void) {- return i2c_register_driver(&i2c_driver_saa7110);+ return i2c_add_driver(&i2c_driver_saa7110); } static void saa7110_exit(void) {- i2c_unregister_driver(&i2c_driver_saa7110);+ i2c_del_driver(&i2c_driver_saa7110); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -