Linux设备驱动剖析之IIC(一)


写在前面

                            Linux IIC子系统体系结构

   

   __init i2c_init(      
     retval = bus_register(&                   i2c_adapter_compat_class = class_compat_register(      (!         retval = -          
     retval = i2c_add_driver(&                     
 
     bus_unregister(&      }

  bus_type i2c_bus_type =     .name        =      .match        =     .probe        =     .remove        =     .shutdown    =     .pm        = & };

   i2c_device_match( device *dev,  device_driver *      i2c_client    *client =      i2c_driver    * 
      (!           
     
                
     driver =     
      (driver->          i2c_match_id(driver->id_table, client) != 
       }

    i2c_device_id *i2c_match_id(  i2c_device_id *                           i2c_client *      (id->name[          (strcmp(client->name, id->name) ==                       id++      }

   i2c_device_probe( device *      i2c_client    *client =      i2c_driver    *      
      (!           
     driver = to_i2c_driver(dev->      (!driver->probe || !driver->          -     client->driver =      (!device_can_wakeup(&client->         device_init_wakeup(&client->                     client->flags &     dev_dbg(dev,  
     status = driver->probe(client, i2c_match_id(driver->              client->driver =      }

   platform_driver s3c24xx_i2c_driver =     .probe        =     .remove        =     .id_table    =     .driver        =         .owner    =         .name    =          .pm    = 
   __init i2c_adap_s3c_init(      platform_driver_register(& subsys_initcall(i2c_adap_s3c_init);

   s3c24xx_i2c_probe( platform_device *      s3c24xx_i2c *      s3c2410_platform_i2c *      resource *      
     pdata = pdev->      (!         dev_err(&pdev->dev,           - 
     i2c = kzalloc((      (!         dev_err(&pdev->dev,           - 
     strlcpy(i2c->adap.name, , (i2c->     i2c->adap.owner   =     i2c->adap.algo    = &     i2c->adap.retries =      i2c->adap.   = I2C_CLASS_HWMON |     i2c->tx_setup     =  
     spin_lock_init(&i2c->     init_waitqueue_head(&i2c-> 
     
 
     i2c->dev = &pdev->     i2c->clk = clk_get(&pdev->dev,       (IS_ERR(i2c->         dev_err(&pdev->dev,          ret = -          
     dev_dbg(&pdev->dev, , i2c-> 
     clk_enable(i2c-> 
     
 
     res = platform_get_resource(pdev, IORESOURCE_MEM,       (res ==         dev_err(&pdev->dev,          ret = -          
     i2c->ioarea = request_mem_region(res->                      pdev-> 
      (i2c->ioarea ==         dev_err(&pdev->dev,          ret = -          
     i2c->regs = ioremap(res-> 
      (i2c->regs ==         dev_err(&pdev->dev,          ret = -          
     dev_dbg(&pdev->dev,          i2c->regs, i2c-> 
     
 
     i2c->adap.algo_data =     i2c->adap.dev.parent = &pdev-> 
     
 
     ret =      (ret !=           
     
 
     i2c->irq = ret = platform_get_irq(pdev,       (ret <=          dev_err(&pdev->dev,           
     ret = request_irq(i2c->               dev_name(&pdev-> 
      (ret !=          dev_err(&pdev->dev, , i2c->          
     ret =      (ret <          dev_err(&pdev->dev,           
     
 
     i2c->adap.nr = pdata-> 
     ret = i2c_add_numbered_adapter(&i2c->      (ret <          dev_err(&pdev->dev,           
 
     dev_info(&pdev->dev, , dev_name(&i2c->       
 
     free_irq(i2c-> 
     iounmap(i2c-> 
     release_resource(i2c->     kfree(i2c-> 
     clk_disable(i2c->     clk_put(i2c-> 
      }

      spinlock_t             unsigned         suspended: 
      i2c_msg        *     unsigned      unsigned      unsigned  
     unsigned      unsigned  
          unsigned  
      __iomem        *      clk        *      device        *      resource        *      
      
 };

      __u16 addr;    
  I2C_M_TEN        0x0010    /* this is a ten bit chip address */
  I2C_M_RD        0x0001    /* read data, from slave to master */
  I2C_M_NOSTART        0x4000    /* if I2C_FUNC_PROTOCOL_MANGLING */
  I2C_M_REV_DIR_ADDR    0x2000    /* if I2C_FUNC_PROTOCOL_MANGLING */
  I2C_M_IGNORE_NAK    0x1000    /* if I2C_FUNC_PROTOCOL_MANGLING */
  I2C_M_NO_RD_ACK        0x0800    /* if I2C_FUNC_PROTOCOL_MANGLING */
  I2C_M_RECV_LEN        0x0400    /* length will be first received byte */
     __u16 len;        
     __u8 *buf;        
 };

  };

       module *     unsigned      unsigned  ;          
       i2c_algorithm *algo; 
      * 
     
      
      timeout;            
           device dev;        
 
           name[      
           };

  i2c_add_numbered_adapter( i2c_adapter *           
      (adap->nr & ~          - 
      (idr_pre_get(&i2c_adapter_idr, GFP_KERNEL) ==           - 
     mutex_lock(&     
     status = idr_get_new_above(&i2c_adapter_idr, adap, adap->nr, &      (status ==  && id != adap->         status = -         idr_remove(&     mutex_unlock(&      (status == -          
      (status ==          status =      }

 

相关内容