Title: [7403] trunk/drivers/video: [#5524] drivers/video/bfin_adv7393fb.c build fails in 2.6.31 due to old
Revision
7403
Author
hennerich
Date
2009-09-22 08:47:23 -0400 (Tue, 22 Sep 2009)

Log Message

[#5524] drivers/video/bfin_adv7393fb.c build fails in 2.6.31 due to old
i2c usage

Convert to new style I2C client binding.
Remove some global usage
Use dev_pm_ops
Some cleanup

Modified Paths

Diff

Modified: trunk/drivers/video/bfin_adv7393fb.c (7402 => 7403)


--- trunk/drivers/video/bfin_adv7393fb.c	2009-09-22 08:33:08 UTC (rev 7402)
+++ trunk/drivers/video/bfin_adv7393fb.c	2009-09-22 12:47:23 UTC (rev 7403)
@@ -42,18 +42,11 @@
 
 #include "bfin_adv7393fb.h"
 
-static struct adv7393fb_device *drv;
 static int mode = VMODE;
 static int mem = VMEM;
 static int nocursor = 1;
 
 /*
- * I2C driver
- */
-
-static char adv7393_name[] = DRIVER_NAME;
-
-/*
  * card parameters
  */
 
@@ -278,20 +271,12 @@
 
 static inline int adv7393_write(struct i2c_client *client, u8 reg, u8 value)
 {
-	if (client)
-		return i2c_smbus_write_byte_data(client, reg, value);
-
-	pr_err("i2c write failed\n");
-	return -1;
+	return i2c_smbus_write_byte_data(client, reg, value);
 }
 
 static inline int adv7393_read(struct i2c_client *client, u8 reg)
 {
-	if (client)
-		return i2c_smbus_read_byte_data(client, reg);
-
-	pr_err("i2c read failed\n");
-	return -1;
+	return i2c_smbus_read_byte_data(client, reg);
 }
 
 static int
@@ -311,20 +296,20 @@
 }
 
 
-static int adv7393_mode(u16 mode)
+static int adv7393_mode(struct i2c_client *client, u16 mode)
 {
 	switch (mode) {
 	case POWER_ON:
-		adv7393_write(drv->i2c_adv7393_client, 0x00, 0x1E);	/* ADV7393 Sleep mode OFF */
+		adv7393_write(client, 0x00, 0x1E);	/* ADV7393 Sleep mode OFF */
 		break;
 	case POWER_DOWN:
-		adv7393_write(drv->i2c_adv7393_client, 0x00, 0x1F);	/* ADV7393 Sleep mode ON */
+		adv7393_write(client, 0x00, 0x1F);	/* ADV7393 Sleep mode ON */
 		break;
 	case BLANK_OFF:
-		adv7393_write(drv->i2c_adv7393_client, 0x82, 0xCB);	/*Pixel Data Valid */
+		adv7393_write(client, 0x82, 0xCB);	/*Pixel Data Valid */
 		break;
 	case BLANK_ON:
-		adv7393_write(drv->i2c_adv7393_client, 0x82, 0x8B);	/*Pixel Data Invalid */
+		adv7393_write(client, 0x82, 0x8B);	/*Pixel Data Invalid */
 		break;
 	default:
 		return -EINVAL;
@@ -333,108 +318,8 @@
 	return 0;
 }
 
-/*
- * Generic i2c probe * concerning the addresses: i2c wants 7 bit (without the r/w bit), so '>>1'
- */
-static u16 normal_i2c[] = { I2C_ADV7393 >> 1, (I2C_ADV7393 >> 1) + 1,
-	I2C_CLIENT_END
-};
 
-static u16 probe[2] = { I2C_CLIENT_END, I2C_CLIENT_END };
-static u16 ignore[2] = { I2C_CLIENT_END, I2C_CLIENT_END };
 
-static struct i2c_client_address_data addr_data = {
-	.normal_i2c = normal_i2c,
-	.probe = probe,
-	.ignore = ignore,
-};
-
-static struct i2c_driver i2c_driver_adv7393;
-
-static int
-adv7393_detect_client(struct i2c_adapter *adapter, int address, int kind)
-{
-	int i;
-	struct i2c_client *client;
-	char *dname;
-
-	pr_info("detecting client on address %#x\n", address << 1);
-
-	/* Check if the adapter supports the needed features */
-	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
-		return 0;
-
-	client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
-	if (client == 0)
-		return -ENOMEM;
-
-	client->addr = address;
-	client->adapter = adapter;
-	client->driver = &i2c_driver_adv7393;
-	if ((client->addr == I2C_ADV7393 >> 1) ||
-	    (client->addr == (I2C_ADV7393 >> 1) + 1)) {
-		dname = adv7393_name;
-	} else {
-		/* We should never get here!!! */
-		kfree(client);
-		return 0;
-	}
-	strlcpy(I2C_NAME(client), dname, sizeof(I2C_NAME(client)));
-
-	i = i2c_attach_client(client);
-	if (i) {
-		kfree(client);
-		return i;
-	}
-
-	drv->i2c_adv7393_client = client;
-
-	if (adv7393_write_block
-	    (drv->i2c_adv7393_client, drv->modes[mode].adv7393_i2c_initd,
-	     drv->modes[mode].adv7393_i2c_initd_len) < 0) {
-		pr_err("i2c attach: init error\n");
-	}
-
-	if (drv->open)
-		adv7393_mode(BLANK_OFF);
-
-	return 0;
-}
-
-static int adv7393_attach_adapter(struct i2c_adapter *adapter)
-{
-	pr_info("starting probe for adapter %s(0x%x)\n",
-		I2C_NAME(adapter), adapter->id);
-	return i2c_probe(adapter, &addr_data, &adv7393_detect_client);
-}
-
-static int adv7393_detach_client(struct i2c_client *client)
-{
-	int err;
-
-	err = i2c_detach_client(client);
-	if (err)
-		return err;
-
-	kfree(client);
-
-	return 0;
-}
-
-/* ----------------------------------------------------------------------- */
-
-static struct i2c_driver i2c_driver_adv7393 = {
-	.driver = {
-		.name = "adv7393",
-	},
-
-	.id = I2C_DRIVERID_ADV7170,
-
-	.attach_adapter = adv7393_attach_adapter,
-	.detach_client = adv7393_detach_client,
-};
-
-
 static irqreturn_t ppi_irq_error(int irq, void *dev_id)
 {
 
@@ -491,6 +376,7 @@
 adv7393_write_proc(struct file *file, const char __user * buffer,
 		   unsigned long count, void *data)
 {
+	struct adv7393fb_device *fbdev = data;
 	char line[8];
 	unsigned int val;
 	int ret;
@@ -500,12 +386,13 @@
 		return -EFAULT;
 
 	val = simple_strtoul(line, NULL, 0);
-	adv7393_write(drv->i2c_adv7393_client, val >> 8, val & 0xff);
+	adv7393_write(fbdev->client, val >> 8, val & 0xff);
 
 	return count;
 }
 
-static int __devinit bfin_adv7393_fb_probe(struct platform_device *pdev)
+static int __devinit bfin_adv7393_fb_probe(struct i2c_client *client,
+					const struct i2c_device_id *id)
 {
 	int ret = 0;
 	struct proc_dir_entry *entry;
@@ -515,28 +402,25 @@
 	struct adv7393fb_device *fbdev = NULL;
 
 	if (mem > 2) {
-		pr_err("mem out of allowed range [1;2]\n");
+		dev_err(&client->dev, "mem out of allowed range [1;2]\n");
 		return -EINVAL;
 	}
 
 	if (mode > num_modes) {
-		pr_err("mode %d: not supported", mode);
+		dev_err(&client->dev, "mode %d: not supported", mode);
 		return -EFAULT;
 	}
 
 	if (!(fbdev = kzalloc(sizeof(*fbdev), GFP_KERNEL))) {
-		pr_err("failed to allocate device private record");
+		dev_err(&client->dev, "failed to allocate device private record");
 		return -ENOMEM;
 	}
 
-	drv = fbdev;
+	i2c_set_clientdata(client, fbdev);
 
-	platform_set_drvdata(pdev, fbdev);
-
 	fbdev->modes = known_modes;
+	fbdev->client = client;
 
-	pr_notice("initializing: %s\n", fbdev->modes[mode].name);
-
 	fbdev->fb_len =
 	    mem * fbdev->modes[mode].xres * fbdev->modes[mode].xres *
 	    (fbdev->modes[mode].bpp / 8);
@@ -549,16 +433,15 @@
 	 * PPI Does Not Start Properly In Specific Mode
 	 */
 	if (gpio_request(P_IDENT(P_PPI0_FS3), "PPI0_FS3")) {
-		pr_err("PPI0_FS3 GPIO request failed\n");
+		dev_err(&client->dev, "PPI0_FS3 GPIO request failed\n");
 		return -EBUSY;
 	}
 
 	gpio_direction_output(P_IDENT(P_PPI0_FS3), 0);
 #endif
 
-
 	if (peripheral_request_list(ppi_req, DRIVER_NAME)) {
-		pr_err("requesting PPI peripheral failed\n");
+		dev_err(&client->dev, "requesting PPI peripheral failed\n");
 		ret = -EFAULT;
 		goto out_8;
 	}
@@ -568,7 +451,7 @@
 			       GFP_KERNEL);
 
 	if (NULL == fbdev->fb_mem) {
-		pr_err("couldn't allocate dma buffer (%d bytes)\n",
+		dev_err(&client->dev, "couldn't allocate dma buffer (%d bytes)\n",
 		       (u32) fbdev->fb_len);
 		ret = -ENOMEM;
 		goto out_7;
@@ -600,66 +483,67 @@
 	fbdev->info.flags = FBINFO_DEFAULT;
 
 	if (!(fbdev->info.pseudo_palette = kzalloc(sizeof(u32) * 16, GFP_KERNEL))) {
-		pr_err("failed to allocate pseudo_palette\n");
+		dev_err(&client->dev, "failed to allocate pseudo_palette\n");
 		ret = -ENOMEM;
 		goto out_6;
 	}
 
 	if (fb_alloc_cmap(&fbdev->info.cmap, BFIN_LCD_NBR_PALETTE_ENTRIES, 0) < 0) {
-		pr_err("failed to allocate colormap (%d entries)\n",
+		dev_err(&client->dev, "failed to allocate colormap (%d entries)\n",
 			   BFIN_LCD_NBR_PALETTE_ENTRIES);
 		ret = -EFAULT;
 		goto out_5;
 	}
 
 	if (request_dma(CH_PPI, "BF5xx_PPI_DMA") < 0) {
-		pr_err("unable to request PPI DMA\n");
+		dev_err(&client->dev, "unable to request PPI DMA\n");
 		ret = -EFAULT;
 		goto out_4;
 	}
 
 	if (request_irq(IRQ_PPI_ERROR, ppi_irq_error, IRQF_DISABLED,
 			"PPI ERROR", fbdev) < 0) {
-		pr_err("unable to request PPI ERROR IRQ\n");
+		dev_err(&client->dev, "unable to request PPI ERROR IRQ\n");
 		ret = -EFAULT;
 		goto out_3;
 	}
 
-	if (i2c_add_driver(&i2c_driver_adv7393)) {
-		pr_err("I2C driver initialisation failed\n");
-		ret = -EFAULT;
-		goto out_2;
-	}
-
 	fbdev->open = 0;
 
 	if (register_framebuffer(&fbdev->info) < 0) {
-		pr_err("unable to register framebuffer\n");
+		dev_err(&client->dev, "unable to register framebuffer\n");
 		ret = -EFAULT;
 		goto out_1;
 	}
 
-	pr_info("fb%d: %s frame buffer device\n",
+	dev_info(&client->dev, "fb%d: %s frame buffer device\n",
 	       fbdev->info.node, fbdev->info.fix.id);
-	pr_info("fb memory address : 0x%p\n", fbdev->fb_mem);
+	dev_info(&client->dev, "fb memory address : 0x%p\n", fbdev->fb_mem);
 
 	if ((entry = create_proc_entry("driver/adv7393", 0, NULL)) == NULL) {
-		pr_err("unable to create /proc entry\n");
+		dev_err(&client->dev, "unable to create /proc entry\n");
 		ret = -EFAULT;
 		goto out_0;
 	}
 
 	entry->read_proc = adv7393_read_proc;
 	entry->write_proc = adv7393_write_proc;
-	entry->data = ""
+	entry->data = ""
 
+	ret = adv7393_write_block(client, fbdev->modes[mode].adv7393_i2c_initd,
+				fbdev->modes[mode].adv7393_i2c_initd_len);
+
+	if (ret) {
+		dev_err(&client->dev, "i2c attach: init error\n");
+		goto out_0;
+	}
+
+
 	return 0;
 
 out_0:
 	unregister_framebuffer(&fbdev->info);
 out_1:
-	i2c_del_driver(&i2c_driver_adv7393);
-out_2:
 	free_irq(IRQ_PPI_ERROR, fbdev);
 out_3:
 	free_dma(CH_PPI);
@@ -674,7 +558,8 @@
 	peripheral_free_list(ppi_req);
 out_8:
 	kfree(fbdev);
-	platform_set_drvdata(pdev, NULL);
+	i2c_set_clientdata(client, NULL);
+
 	return ret;
 }
 
@@ -684,13 +569,13 @@
 
 	fbdev->info.screen_base = (void *)fbdev->fb_mem;
 	if (!fbdev->info.screen_base) {
-		pr_err("unable to map device\n");
+		dev_err(&fbdev->client->dev, "unable to map device\n");
 		return -ENOMEM;
 	}
 
 	fbdev->open = 1;
 	dma_desc_list(fbdev, BUILD);
-	adv7393_mode(BLANK_OFF);
+	adv7393_mode(fbdev->client, BLANK_OFF);
 	bfin_config_ppi(fbdev);
 	bfin_config_dma(fbdev);
 	bfin_enable_ppi();
@@ -700,10 +585,9 @@
 
 static int bfin_adv7393_fb_release(struct fb_info *info, int user)
 {
-
 	struct adv7393fb_device *fbdev = to_adv7393fb_device(info);
 
-	adv7393_mode(BLANK_ON);
+	adv7393_mode(fbdev->client, BLANK_ON);
 	bfin_disable_dma();
 	bfin_disable_ppi();
 	dma_desc_list(fbdev, DESTRUCT);
@@ -792,18 +676,20 @@
 /* 0 unblank, 1 blank, 2 no vsync, 3 no hsync, 4 off */
 static int bfin_adv7393_fb_blank(int blank, struct fb_info *info)
 {
+	struct adv7393fb_device *fbdev = to_adv7393fb_device(info);
+
 	switch (blank) {
 
 	case VESA_NO_BLANKING:
 		/* Turn on panel */
-		adv7393_mode(BLANK_OFF);
+		adv7393_mode(fbdev->client, BLANK_OFF);
 		break;
 
 	case VESA_VSYNC_SUSPEND:
 	case VESA_HSYNC_SUSPEND:
 	case VESA_POWERDOWN:
 		/* Turn off panel */
-		adv7393_mode(BLANK_ON);
+		adv7393_mode(fbdev->client, BLANK_ON);
 		break;
 
 	default:
@@ -858,51 +744,51 @@
 	return 0;
 }
 
-static int __devexit bfin_adv7393_fb_remove(struct platform_device *pdev)
+static int __devexit bfin_adv7393_fb_remove(struct i2c_client *client)
 {
+	struct adv7393fb_device *fbdev = i2c_get_clientdata(client);
 	u16 ppi_req[] = PPI0_16;
 
-	adv7393_mode(POWER_DOWN);
+	adv7393_mode(client, POWER_DOWN);
 
-	if (drv->fb_mem)
-		dma_free_coherent(NULL, drv->fb_len, drv->fb_mem, drv->dma_handle);
+	if (fbdev->fb_mem)
+		dma_free_coherent(NULL, fbdev->fb_len, fbdev->fb_mem, fbdev->dma_handle);
 	free_dma(CH_PPI);
-	free_irq(IRQ_PPI_ERROR, drv);
-	unregister_framebuffer(&drv->info);
-	i2c_del_driver(&i2c_driver_adv7393);
+	free_irq(IRQ_PPI_ERROR, fbdev);
+	unregister_framebuffer(&fbdev->info);
 	remove_proc_entry("driver/adv7393", NULL);
-	fb_dealloc_cmap(&drv->info.cmap);
-	kfree(drv->info.pseudo_palette);
+	fb_dealloc_cmap(&fbdev->info.cmap);
+	kfree(fbdev->info.pseudo_palette);
 
 #if defined(BF533_FAMILY)
 	gpio_free(P_IDENT(P_PPI0_FS3));	/* FS3 */
 #endif
 	peripheral_free_list(ppi_req);
-	kfree(drv);
+	kfree(fbdev);
 
 	return 0;
 }
 
 #ifdef CONFIG_PM
-static int bfin_adv7393_fb_suspend(struct platform_device *pdev, pm_message_t state)
+static int bfin_adv7393_fb_suspend(struct i2c_client *client, pm_message_t state)
 {
-	struct adv7393fb_device *fbdev = platform_get_drvdata(pdev);
+	struct adv7393fb_device *fbdev = i2c_get_clientdata(client);
 
 	if (fbdev->open) {
 		bfin_disable_dma();
 		bfin_disable_ppi();
 		dma_desc_list(fbdev, DESTRUCT);
 	}
-	adv7393_mode(POWER_DOWN);
+	adv7393_mode(client, POWER_DOWN);
 
 	return 0;
 }
 
-static int bfin_adv7393_fb_resume(struct platform_device *pdev)
+static int bfin_adv7393_fb_resume(struct i2c_client *client)
 {
-	struct adv7393fb_device *fbdev = platform_get_drvdata(pdev);
+	struct adv7393fb_device *fbdev = i2c_get_clientdata(client);
 
-	adv7393_mode(POWER_ON);
+	adv7393_mode(client, POWER_ON);
 
 	if (fbdev->open) {
 		dma_desc_list(fbdev, BUILD);
@@ -913,22 +799,33 @@
 
 	return 0;
 }
-#else
-#define bfin_adv7393_fb_suspend	NULL
-#define bfin_adv7393_fb_resume	NULL
-#endif
 
-static struct platform_driver bfin_adv7393_fb_driver = {
-	.probe = bfin_adv7393_fb_probe,
-	.remove = __devexit_p(bfin_adv7393_fb_remove),
+static struct dev_pm_ops bfin_adv7393_dev_pm_ops = {
 	.suspend = bfin_adv7393_fb_suspend,
-	.resume = bfin_adv7393_fb_resume,
+	.resume  = bfin_adv7393_fb_resume,
+};
+#endif
+
+static const struct i2c_device_id bfin_adv7393_id[] = {
+	{DRIVER_NAME, 0},
+	{}
+};
+
+MODULE_DEVICE_TABLE(i2c, bfin_adv7393_id);
+
+static struct i2c_driver bfin_adv7393_fb_driver = {
 	.driver = {
-		 .name = DRIVER_NAME,
-		 .owner = THIS_MODULE,
+		   .name = DRIVER_NAME,
+#ifdef CONFIG_PM
+		   .pm   = &bfin_adv7393_dev_pm_ops,
+#endif
 	},
+	.probe = bfin_adv7393_fb_probe,
+	.remove = __devexit_p(bfin_adv7393_fb_remove),
+	.id_table = bfin_adv7393_id,
 };
 
+
 static int __init bfin_adv7393_fb_driver_init(void)
 {
 
@@ -938,12 +835,12 @@
 	request_module("i2c-gpio");
 #endif
 
-	return platform_driver_register(&bfin_adv7393_fb_driver);
+	return i2c_add_driver(&bfin_adv7393_fb_driver);
 }
 
 static void __exit bfin_adv7393_fb_driver_cleanup(void)
 {
-	platform_driver_unregister(&bfin_adv7393_fb_driver);
+	i2c_del_driver(&bfin_adv7393_fb_driver);
 }
 
 MODULE_LICENSE("GPL");

Modified: trunk/drivers/video/bfin_adv7393fb.h (7402 => 7403)


--- trunk/drivers/video/bfin_adv7393fb.h	2009-09-22 08:33:08 UTC (rev 7402)
+++ trunk/drivers/video/bfin_adv7393fb.h	2009-09-22 12:47:23 UTC (rev 7403)
@@ -55,9 +55,6 @@
 	BLANK_OFF,
 };
 
-#define   I2C_ADV7393        0x54
-#define I2C_NAME(x) (x)->name
-
 #define DRIVER_NAME "bfin-adv7393"
 
 #define PPI0_16 {P_PPI0_CLK, P_PPI0_D0, P_PPI0_D1, P_PPI0_D2, P_PPI0_D3, \
@@ -270,7 +267,7 @@
 struct adv7393fb_device {
 	struct fb_info info;	/* FB driver info record */
 
-	struct i2c_client *i2c_adv7393_client;
+	struct i2c_client *client;
 
 	struct dmasg *descriptor_list_head;
 	struct dmasg *vb1;
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to