Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ARM: PNX4008: move i2c_adapter structure inside the drivers private data

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>

+26 -36
+3 -15
arch/arm/mach-pnx4008/i2c.c
··· 18 18 #include <mach/irqs.h> 19 19 #include <mach/i2c.h> 20 20 21 - static struct i2c_adapter pnx_adapter0 = { 22 - .name = I2C_CHIP_NAME "0", 23 - }; 24 - 25 - static struct i2c_adapter pnx_adapter1 = { 26 - .name = I2C_CHIP_NAME "1", 27 - }; 28 - 29 - static struct i2c_adapter pnx_adapter2 = { 30 - .name = "USB-I2C", 31 - }; 32 - 33 21 static struct i2c_pnx_data i2c0_data = { 34 - .adapter = &pnx_adapter0, 22 + .name = I2C_CHIP_NAME "0", 35 23 .base = PNX4008_I2C1_BASE, 36 24 .irq = I2C_1_INT, 37 25 }; 38 26 39 27 static struct i2c_pnx_data i2c1_data = { 40 - .adapter = &pnx_adapter1, 28 + .name = I2C_CHIP_NAME "1", 41 29 .base = PNX4008_I2C2_BASE, 42 30 .irq = I2C_2_INT, 43 31 }; 44 32 45 33 static struct i2c_pnx_data i2c2_data = { 46 - .adapter = &pnx_adapter2, 34 + .name = "USB-I2C", 47 35 .base = (PNX4008_USB_CONFIG_BASE + 0x300), 48 36 .irq = USB_I2C_INT, 49 37 };
+20 -20
drivers/i2c/busses/i2c-pnx.c
··· 551 551 static int i2c_pnx_controller_suspend(struct platform_device *pdev, 552 552 pm_message_t state) 553 553 { 554 - struct i2c_pnx_data *i2c_pnx = platform_get_drvdata(pdev); 555 - struct i2c_pnx_algo_data *alg_data = i2c_pnx->adapter->algo_data; 554 + struct i2c_pnx_algo_data *alg_data = platform_get_drvdata(pdev); 556 555 557 556 /* FIXME: shouldn't this be clk_disable? */ 558 557 clk_enable(alg_data->clk); ··· 561 562 562 563 static int i2c_pnx_controller_resume(struct platform_device *pdev) 563 564 { 564 - struct i2c_pnx_data *i2c_pnx = platform_get_drvdata(pdev); 565 - struct i2c_pnx_algo_data *alg_data = i2c_pnx->adapter->algo_data; 565 + struct i2c_pnx_algo_data *alg_data = platform_get_drvdata(pdev); 566 566 567 567 return clk_enable(alg_data->clk); 568 568 } ··· 578 580 unsigned long freq; 579 581 struct i2c_pnx_data *i2c_pnx = pdev->dev.platform_data; 580 582 581 - if (!i2c_pnx || !i2c_pnx->adapter) { 583 + if (!i2c_pnx || !i2c_pnx->name) { 582 584 dev_err(&pdev->dev, "%s: no platform data supplied\n", 583 585 __func__); 584 586 ret = -EINVAL; ··· 591 593 goto err_kzalloc; 592 594 } 593 595 594 - platform_set_drvdata(pdev, i2c_pnx); 596 + platform_set_drvdata(pdev, alg_data); 595 597 596 - i2c_pnx->adapter->algo = &pnx_algorithm; 597 - i2c_pnx->adapter->algo_data = alg_data; 598 + strlcpy(alg_data->adapter.name, i2c_pnx->name, 599 + sizeof(alg_data->adapter.name)); 600 + alg_data->adapter.dev.parent = &pdev->dev; 601 + alg_data->adapter.algo = &pnx_algorithm; 602 + alg_data->adapter.algo_data = alg_data; 603 + alg_data->adapter.nr = pdev->id; 604 + alg_data->i2c_pnx = i2c_pnx; 598 605 599 606 alg_data->clk = clk_get(&pdev->dev, NULL); 600 607 if (IS_ERR(alg_data->clk)) { ··· 609 606 610 607 init_timer(&alg_data->mif.timer); 611 608 alg_data->mif.timer.function = i2c_pnx_timeout; 612 - alg_data->mif.timer.data = (unsigned long)i2c_pnx->adapter; 609 + alg_data->mif.timer.data = (unsigned long)&alg_data->adapter; 613 610 614 611 /* Register I/O resource */ 615 612 if (!request_mem_region(i2c_pnx->base, I2C_PNX_REGION_SIZE, ··· 657 654 init_completion(&alg_data->mif.complete); 658 655 659 656 ret = request_irq(i2c_pnx->irq, i2c_pnx_interrupt, 660 - 0, pdev->name, i2c_pnx->adapter); 657 + 0, pdev->name, &alg_data->adapter); 661 658 if (ret) 662 659 goto out_clock; 663 660 664 661 /* Register this adapter with the I2C subsystem */ 665 - i2c_pnx->adapter->dev.parent = &pdev->dev; 666 - i2c_pnx->adapter->nr = pdev->id; 667 - ret = i2c_add_numbered_adapter(i2c_pnx->adapter); 662 + ret = i2c_add_numbered_adapter(&alg_data->adapter); 668 663 if (ret < 0) { 669 664 dev_err(&pdev->dev, "I2C: Failed to add bus\n"); 670 665 goto out_irq; 671 666 } 672 667 673 668 dev_dbg(&pdev->dev, "%s: Master at %#8x, irq %d.\n", 674 - i2c_pnx->adapter->name, i2c_pnx->base, i2c_pnx->irq); 669 + alg_data->adapter.name, i2c_pnx->base, i2c_pnx->irq); 675 670 676 671 return 0; 677 672 678 673 out_irq: 679 - free_irq(i2c_pnx->irq, i2c_pnx->adapter); 674 + free_irq(i2c_pnx->irq, &alg_data->adapter); 680 675 out_clock: 681 676 clk_disable(alg_data->clk); 682 677 out_unmap: ··· 693 692 694 693 static int __devexit i2c_pnx_remove(struct platform_device *pdev) 695 694 { 696 - struct i2c_pnx_data *i2c_pnx = platform_get_drvdata(pdev); 697 - struct i2c_adapter *adap = i2c_pnx->adapter; 698 - struct i2c_pnx_algo_data *alg_data = adap->algo_data; 695 + struct i2c_pnx_algo_data *alg_data = platform_get_drvdata(pdev); 696 + struct i2c_pnx_data *i2c_pnx = alg_data->i2c_pnx; 699 697 700 - free_irq(i2c_pnx->irq, i2c_pnx->adapter); 701 - i2c_del_adapter(adap); 698 + free_irq(i2c_pnx->irq, &alg_data->adapter); 699 + i2c_del_adapter(&alg_data->adapter); 702 700 clk_disable(alg_data->clk); 703 701 iounmap(alg_data->ioaddr); 704 702 release_mem_region(i2c_pnx->base, I2C_PNX_REGION_SIZE);
+3 -1
include/linux/i2c-pnx.h
··· 29 29 struct i2c_pnx_mif mif; 30 30 int last; 31 31 struct clk *clk; 32 + struct i2c_pnx_data *i2c_pnx; 33 + struct i2c_adapter adapter; 32 34 }; 33 35 34 36 struct i2c_pnx_data { 35 - struct i2c_adapter *adapter; 37 + const char *name; 36 38 u32 base; 37 39 int irq; 38 40 };