⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c-old-porting

📁 I2C总线LINUX驱动程序
💻
📖 第 1 页 / 共 2 页
字号:
 	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 + -