您的位置:首页 > 运维架构 > Linux

linux syscon and regmap study note

2015-09-21 13:11 639 查看

linux syscon and regmap study note

-v0.1 2015.9.19 Sherlock draft

1. 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: