linux syscon and regmap study note
2015-09-21 13:11
639 查看
linux syscon and regmap study note
-v0.1 2015.9.19 Sherlock draft1. What is regmap and syscon
regmap was introduced by https://lwn.net/Articles/451789/From my understanding, it provided us a set API to read/write non memory-map I/O
(e.g. I2C and SPI read/write) at first. Then after introduced regmap-mmio.c,
we can use regmap to access memory-map I/O.
code path: drivers/base/regmap/*
syscon was introduced by https://lkml.org/lkml/2012/9/4/568
It provides a set API to access a misc device(e.g. pci-sas subsystem registers
in P660) based on regmap, explicitly based on regmap-mmio.c I guess.
code path: drivers/mfd/*
2. arch of regmap and syscon
basic structure of regmap:struct regmap: per base address per regmap
struct regmap_bus: include read/write callback, different “bus”
(e.g. I2C, SPI, mmio) have different regmap_bus
struct regmap_mmio_context: don’t know…
struct regmap_config: confiuration info.
regmap-mmio call flow:
[code]/* drivers/base/regmap/regmap-mmio.c */ __devm_regmap_init_mmio_clk --> __devm_regmap_init /* regmap_bus(regmap_mmio), config as input, create regmap */ --> __regmap_init /* if don't have bus->read or bus->write */ --> map->reg_read = _regmap_bus_reg_read; --> map->reg_write = _regmap_bus_reg_write; ... /* if have bus->read */ --> map->reg_read = _regmap_bus_read; --> map->bus->read /* drivers/base/regmap/regmap.c */ regmap_read(struct regmap *map, unsigned int reg, unsigned int *val) --> _regmap_read /* _regmap_bus_reg_read */ --> map->reg_read(context, reg, val); --> map->bus->reg_read(map->bus_context, reg, val) /* drivers/base/regmap/regmap.c */ regmap_update_bits --> _regmap_update_bits --> _regmap_read --> _regmap_write --> map->reg_write
basic structure of syscon:
[code]struct syscon: include a strutct regmap; an element in list below static LIST_HEAD(syscon_list) syscon driver init a regmap: syscon->regmap = devm_regmap_init_mmio(dev, base, &syscon_regmap_config);
3. why we need a syscon to describe a misc device
To understand this, we shoudl search related discussion in community:https://lists.ozlabs.org/pipermail/devicetree-discuss/2012-August/018704.html
From my understanding, syscon firstly registers a syscon dts node to syscon_list,
we could find this node when we try to access related registers.
4. how to use syscon to access a misc device
e.g.[code]need dts node: pcie_sas: pcie_sas@0xb0000000 { compatible = "hisilicon,pcie-sas-subctrl", "syscon"; reg = <0xb0000000 0x10000>; };
use below function read/write:
[code] regmap_read(hisi_pcie->subctrl, PCIE_SUBCTRL_SYS_STATE4_REG + 0x100 * hisi_pcie->port_id, &val); regmap_update_bits(pcie->subctrl, reg, bit_mask, mode << bit_shift);
use below function create struct regmap:
[code] hisi_pcie->subctrl = syscon_regmap_lookup_by_compatible("hisilicon,pcie-sas-subctrl");
reference:
Documentation/devicetree/bindings/regmap/regmap.txt../mfd/mfd.txt
./syscon.txt
相关文章推荐
- centos7添加环境变量
- centos7的一些变动
- Linux内核编码规范
- linux下设置代理服务器
- Linux 文件系统底层实现
- Linux经常使用的命令(21) - find参数具体解释
- Linux部署集群.NET网站
- Linux下设置程序可以在当前目录下查找so文件
- Linux 时区变化
- Linux下设置程序可以在当前目录下执行
- Linux查看CPU和内存使用情况
- centos7全局安装composer
- linux cpu mem 排序
- centos救援模式实验笔记
- centos自启动脚本编写
- linux mysql 更改MySQL数据文件目录位置
- linux设置开机启动
- linux下源码安装
- Linux初学——管理文件与目录(下)
- Centos 6.4 KVM安装和配置