925static int __init i2c_adap_s3c_init(void)
926{
927 int ret;
928
929 ret = platform_driver_register(&s3c2410_i2c_driver);
930 if (ret == 0) {
931 ret = platform_driver_register(&s3c2440_i2c_driver);
932 if (ret)
933 platform_driver_unregister(&s3c2410_i2c_driver);
934 }
935
936 return ret;
937}
938
945module_init(i2c_adap_s3c_init);
946module_exit(i2c_adap_s3c_exit);
在i2c_adap_s3c_init中注册s3c2410_i2c_driver,那么i2c_adap_s3c_init何时执行的呢?module_init(i2c_adap_s3c_init)表明其存放在initcall段,调用顺序如下:
init/main.c
start_kernel 》 rest_init 》 kernel_init 》 do_basic_setup》do_initcalls,因为platform_bus_init在此之前已经初始化完毕了,且设备已经注册到内核中 了,驱动将和内核绑定,并最终调用s3c24xx_i2c_probe。
748/* s3c24xx_i2c_probe
749 *
750 * called by the bus driver when a suitable device is found
751*/
752
753static int s3c24xx_i2c_probe(struct platform_device *pdev)
754{
755 struct s3c24xx_i2c *i2c = &s3c24xx_i2c;
756 struct resource *res;
757 int ret;
758
759 /* find the clock and enable it */
760
761 i2c->dev = &pdev->dev;
762 i2c->clk = clk_get(&pdev->dev, "i2c");
763 if (IS_ERR(i2c->clk)) {
764 dev_err(&pdev->dev, "cannot get clock/n");
765 ret = -ENOENT;
766 goto err_noclk;
767 }
768
769 dev_dbg(&pdev->dev, "clock source %p/n", i2c->clk);
770
771 clk_enable(i2c->clk);
772
773 /* map the registers */
774
775 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
776 if (res == NULL) {
777 dev_err(&pdev->dev, "cannot find IO resource/n");
778 ret = -ENOENT;
779 goto err_clk;
780 }
781
782 i2c->ioarea = request_mem_region(res->start, (res->end-res->start)+1,
783 pdev->name);
784
785 if (i2c->ioarea == NULL) {
786 dev_err(&pdev->dev, "cannot request IO/n");
787 ret = -ENXIO;
788 goto err_clk;
789 }
790
791 i2c->regs = ioremap(res->start, (res->end-res->start)+1);
792
793 if (i2c->regs == NULL) {
794 dev_err(&pdev->dev, "cannot map IO/n");
795 ret = -ENXIO;
796 goto err_ioarea;
797 }
798
799 dev_dbg(&pdev->dev, "registers %p (%p, %p)/n", i2c->regs, i2c->ioarea, res);
800
801 /* setup info block for the i2c core */
802
803 i2c->adap.algo_data = i2c;
804 i2c->adap.dev.parent = &pdev->dev;
805
806 /* initialise the i2c controller */
807
808 ret = s3c24xx_i2c_init(i2c);
809 if (ret != 0)
810 goto err_iomap;
811
812 /* find the IRQ for this unit (note, this relies on the init call to
813 * ensure no current IRQs pending
814 */
815
816 res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
817 if (res == NULL) {
818 dev_err(&pdev->dev, "cannot find IRQ/n");
819 ret = -ENOENT;
820 goto err_iomap;
821 }
822
823 ret = request_irq(res->start, s3c24xx_i2c_irq, IRQF_DISABLED,
824 pdev->name, i2c);
825
826 if (ret != 0) {
827 dev_err(&pdev->dev, "cannot claim IRQ/n");
828 goto err_iomap;
829 }
830
831 i2c->irq = res;
832
833 dev_dbg(&pdev->dev, "irq resource %p (%lu)/n", res,
834 (unsigned long)res->start);
835
836 ret = i2c_add_adapter(&i2c->adap);
837 if (ret < 0) {
838 dev_err(&pdev->dev, "failed to add bus to i2c core/n");
839 goto err_irq;
840 }
841
842 platform_set_drvdata(pdev, i2c);
843
844 dev_info(&pdev->dev, "%s: S3C I2C adapter/n", i2c->adap.dev.bus_id);
845 return 0;
846
847 err_irq:
848 free_irq(i2c->irq->start, i2c);
849
850 err_iomap:
851 iounmap(i2c->regs);
852
853 err_ioarea:
854 release_resource(i2c->ioarea);
855 kfree(i2c->ioarea);
856
857 err_clk:
858 clk_disable(i2c->clk);
859 clk_put(i2c->clk);
860
861 err_noclk:
862 return ret;
863}