Linux regmap子系统分析之三 regmap bus实例分析

在前面一章我们分析了regmap子系统的数据结构 , 基本上熟悉了数据结构的关联 , 也就大概理解了regmap子系统的实现流程 , 本章我们简要介绍下regmap子系统中接口的调用过程 , 然后介绍下regmap bus的实现及其提供的regmap的创建及注销接口 。
一、regmap子系统接口调用关系 针对regmap子系统提供的读写接口包含regmap_read、regmap_write、regmap_raw_read、regmap_raw_write等接口 , 此处我们主要说明regmap_read、regmap_write这两个接口的调用流程 。
regmap_write接口调用regmap_write的调用包含如下三个大分支:

  1. 若regmap创建时提供了reg_write接口、reg_read接口 , 则regmap_write直接调用该reg_write接口;
  2. 若根据reg bits、reg value bits的值 , 确定其reg_write接口为_regmap_bus_formatted_write接口(即reg+pad+write的位数为16bits) , 首先对寄存器与寄存器值执行formart操作 , 然后调用regmp bus提供的write接口 , 执行写操作;
  3. 若reg bits、reg valut bits的位数均是8bits的整数倍 , 则针对reg、value均提供format接口 , 且将其写接口设置为_regmap_bus_raw_write , 然后完成reg、value的format操作 , 并确认是否需要进行page方式访问及page选择等 。 然后在进行写操作时 , 若是异步写则调用regmap bus的异步写接口即可;若是同步写 , 则调用regmap bus的write/gather_write接口执行写操作 。

Linux regmap子系统分析之三 regmap bus实例分析文章插图
regmap_read接口调用针对regmap读操作 , 也包含如下几个大的方向:
  1. 若支持从cache中获取 , 则直接调用regcache_read从cache中获取值即可;
  2. 若regmap创建时提供了reg_write接口、reg_read接口 , 则regmap_write直接调用该reg_read接口;
  3. 调用_regmap_bus_read接口进行读操作 , 在读之前也需要判断是否需要进行page选择 , 最终也是调用regmap bus的读接口即可 。

Linux regmap子系统分析之三 regmap bus实例分析文章插图
以上即是regmap_read/regmap_write的调用逻辑 , 针对regmap_raw_read、regmap_raw_write接口的调用也大致类似 , 此处不再细述读者可自行查找 。
regmap bus的实现及其提供的regmap的创建及注销接此处我们选择iic regmap bus的创建及其提供的regmap的创建及注销接口 。
iic regmap bus的定义 如下图所示 , iic regmap bus提供了read、write、gather_write接口 , 而read、write接口则主要调用i2c_transfer接口实现对i2c设备的读写操作 , 相对来说也是比较简单的 。
Linux regmap子系统分析之三 regmap bus实例分析文章插图
iic regmap的创建接口 iic regmap的创建接口为regmap_init_i2c , 该接口即是对regmap_init接口的调用 , 并传递iic regmap_bus变量 , 这样创建的iic regmap变量中执行的regmap_bus即为regmap_i2c , 然后在regmap_write、regmap_read接口的调用中 , 最终即调用了regmap_i2c的read、write接口 , 即调用regmap_i2c_read、regmap_i2c_write接口 , 实现与i2c设备的通信操作 。
Linux regmap子系统分析之三 regmap bus实例分析文章插图
iic regmap的注销接口【Linux regmap子系统分析之三 regmap bus实例分析】对于iic/spi regmap的注销接口 , 直接调用regmap_exit接口即可 。
regmap的使用 在regulator子系统专栏的虚拟regulator 设备驱动的开发中 , 我们就已经实现了regmap的创建与注销操作 , 只需要在i2c设备驱动的probe接口中调用devm_regmap_init_i2c接口完成i2c regmap的创建后 , 即可进行regmap_write、regmap_read的调用 。
至此我们即完成regmap子系统的分析 , regmap子系统设计也不是很复杂 , 我们就不大篇幅介绍 。
下一章我们分析下linux设备资源管理、iio子系统等内容 。