<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://paz00.ru/index.php?action=history&amp;feed=atom&amp;title=Nvec_dt</id>
	<title>Nvec dt - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://paz00.ru/index.php?action=history&amp;feed=atom&amp;title=Nvec_dt"/>
	<link rel="alternate" type="text/html" href="https://paz00.ru/index.php?title=Nvec_dt&amp;action=history"/>
	<updated>2026-05-02T11:00:15Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.39.10</generator>
	<entry>
		<id>https://paz00.ru/index.php?title=Nvec_dt&amp;diff=182&amp;oldid=prev</id>
		<title>Unknown user в 08:14, 15 октября 2014</title>
		<link rel="alternate" type="text/html" href="https://paz00.ru/index.php?title=Nvec_dt&amp;diff=182&amp;oldid=prev"/>
		<updated>2014-10-15T08:14:09Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;===Links=== &lt;br /&gt;
[1] [[http://www.spinics.net/lists/linux-tegra/msg12659.html|[RFC] binding for nvec mfd device]]&lt;br /&gt;
[2] [http://www.devicetree.org/Device_Tree_Usage Device Tree Usage]&lt;br /&gt;
[3] [https://www.power.org/documentation/epapr-version-1-1/ ePAPR specification]&lt;br /&gt;
[4] [https://gitorious.org/ac100/marvin24s-kernel/source/7326d4987f7bfa785eb819296d2fffef87c8fc94:arch/arm/boot/dts/tegra20.dtsi arch/arm/boot/dts/tegra20.dtsi]&lt;br /&gt;
[5] http://lists.denx.de/pipermail/u-boot/2014-April/178449.html&lt;br /&gt;
&lt;br /&gt;
===Intro=== &lt;br /&gt;
Here is my step-by-step vision of dt for nvec.&lt;br /&gt;
There is few requirements:&lt;br /&gt;
1) DT must describe hardware, but not software.&lt;br /&gt;
2) DT must be enough for SW implementation.&lt;br /&gt;
&lt;br /&gt;
===Configurations===&lt;br /&gt;
I. i2c_controller_master { i2c_device_master, i2c_device_master, i2c_device_slave, i2c_device_slave }&lt;br /&gt;
II. i2c_controller_master { i2c_device_slave, i2c_device_slave }&lt;br /&gt;
III. i2c_controller_slave { i2c_device_master, i2c_device_master, i2c_device_slave, i2c_device_slave }&lt;br /&gt;
IV. i2c_controller_slave { i2c_device_slave, i2c_device_slave }  - '''impossible'''&lt;br /&gt;
&lt;br /&gt;
===Addressing===&lt;br /&gt;
'''a) #address-cells / #size-cells,  master/slave by first value (child)'''&lt;br /&gt;
&lt;br /&gt;
I2C ''controller'' node has #address-cells 1 or 2 (1 means master mode only, 2 mean master/slave mode possible)&lt;br /&gt;
There are now two ways to set address in the I2C ''child'' nodes:&lt;br /&gt;
&lt;br /&gt;
a)&lt;br /&gt;
reg = &amp;lt;slave address&amp;gt; '' ''ordinary child operating in slave mode, address-cells of parent is 1''&lt;br /&gt;
&lt;br /&gt;
''b)&lt;br /&gt;
'' ''reg = &amp;lt;0 slave address&amp;gt;'' '' alternative form of above if address-cells is 2 (master and slave mode of controller possible)&lt;br /&gt;
&lt;br /&gt;
c)&lt;br /&gt;
reg = &amp;lt;1 master address&amp;gt; '' child operates in master mode, address-cells must be 2&lt;br /&gt;
&lt;br /&gt;
initially, the i2c controller runs its old setup code (does not enable slave mode). If the child (in master mode operation) gets&lt;br /&gt;
instantiated, it tells the i2c controller via some api that it should setup slave mode.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: 1px solid #c6c9ff; border-collapse: collapse;&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| I. i2c_controller - master&lt;br /&gt;
devices - masters and slaves&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_controller {&lt;br /&gt;
    reg = &amp;lt;0x7000c500 0x100&amp;gt;&lt;br /&gt;
    #address-cells = &amp;lt;2&amp;gt;&lt;br /&gt;
    i2c_device_master {&lt;br /&gt;
        reg = &amp;lt;0x01 0x87&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
    i2c_device_slave {&lt;br /&gt;
        reg = &amp;lt;0x00 0x87&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
| II. i2c_controller - master&lt;br /&gt;
devices - all slaves&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_controller {&lt;br /&gt;
    reg = &amp;lt;0x7000c500 0x100&amp;gt;&lt;br /&gt;
    #address-cells = &amp;lt;1&amp;gt;&lt;br /&gt;
    i2c_device_slave {&lt;br /&gt;
        reg = &amp;lt;0x87&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
| III. i2c_controller - slave&lt;br /&gt;
devices - masters and slaves&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_controller {&lt;br /&gt;
    reg = &amp;lt;0x7000c500 0x100&amp;gt;&lt;br /&gt;
    #address-cells = &amp;lt;2&amp;gt;&lt;br /&gt;
    i2c_device_master {&lt;br /&gt;
        reg = &amp;lt;0x01 0x87&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
    i2c_device_slave {&lt;br /&gt;
        reg = &amp;lt;0x00 0x87&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''b) extend &amp;quot;reg&amp;quot; property'''&lt;br /&gt;
{| style=&amp;quot;border: 1px solid #c6c9ff; border-collapse: collapse;&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| I. i2c_controller - master&lt;br /&gt;
devices - masters and slaves&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_controller {&lt;br /&gt;
    reg = &amp;lt;0x7000c500 0x100&amp;gt;&lt;br /&gt;
    i2c_device_master {&lt;br /&gt;
        ???&lt;br /&gt;
    }&lt;br /&gt;
    i2c_device_slave {&lt;br /&gt;
        ???&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
| II. i2c_controller - master&lt;br /&gt;
devices - all slaves&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_controller {&lt;br /&gt;
    reg = &amp;lt;0x7000c500 0x100&amp;gt;&lt;br /&gt;
    i2c_device_slave {&lt;br /&gt;
        reg = &amp;lt;0x87&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
| III. i2c_controller - slave&lt;br /&gt;
devices - masters and slaves&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_controller {&lt;br /&gt;
    reg = &amp;lt;0x7000c500 0x100 0x87 0&amp;gt;&lt;br /&gt;
    i2c_device_master {&lt;br /&gt;
        reg = &amp;lt;0x00&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
    i2c_device_slave {&lt;br /&gt;
        reg = &amp;lt;0x87&amp;gt;&lt;br /&gt;
    }}&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''c) use &amp;quot;alternate-reg&amp;quot; property''' (see [http://www.openfirmware.org/1275/bindings/pci/pci2_1.pdf PCI Bus Binding to IEEE Std 1275-1994 Standard for Boot])&lt;br /&gt;
{| style=&amp;quot;border: 1px solid #c6c9ff; border-collapse: collapse;&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| I. i2c_controller - master&lt;br /&gt;
devices - masters and slaves&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_controller {&lt;br /&gt;
    reg = &amp;lt;0x7000c500 0x100&amp;gt;&lt;br /&gt;
    i2c_device_master {&lt;br /&gt;
        reg = &amp;lt;0x89&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
    i2c_device_slave {&lt;br /&gt;
        reg = &amp;lt;0x87&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
| II. i2c_controller - master&lt;br /&gt;
devices - all slaves&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_controller {&lt;br /&gt;
    reg = &amp;lt;0x7000c500 0x100&amp;gt;&lt;br /&gt;
    i2c_device_slave {&lt;br /&gt;
       reg = &amp;lt;0x87&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
| III. i2c_controller - slave&lt;br /&gt;
devices - masters and slaves&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_controller {&lt;br /&gt;
    reg = &amp;lt;0x7000c500 0x100&amp;gt;&lt;br /&gt;
    alternate-reg = &amp;lt;0x87&amp;gt;&lt;br /&gt;
    i2c_device_master {&lt;br /&gt;
        reg = &amp;lt;0x00&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
    i2c_device_slave {&lt;br /&gt;
        reg = &amp;lt;0x87&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''d) use tricky bits'''&lt;br /&gt;
???&lt;br /&gt;
&lt;br /&gt;
'''e) tricky bits on childs (TODO: make a clear description)'''&lt;br /&gt;
{| style=&amp;quot;border: 1px solid #c6c9ff; border-collapse: collapse;&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| I. i2c_controller - master&lt;br /&gt;
devices - masters and slaves&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_controller {&lt;br /&gt;
    reg = &amp;lt;0x7000c500 0x100&amp;gt;&lt;br /&gt;
    ???&lt;br /&gt;
    i2c_device_master {&lt;br /&gt;
        reg = &amp;lt;0x0187&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
    i2c_device_slave {&lt;br /&gt;
        reg = &amp;lt;0x0087&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
| II. i2c_controller - master&lt;br /&gt;
devices - all slaves&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_controller {&lt;br /&gt;
    reg = &amp;lt;0x7000c500 0x100&amp;gt;&lt;br /&gt;
    i2c_device_slave {&lt;br /&gt;
        reg = &amp;lt;0x0087&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
| III. i2c_controller - slave&lt;br /&gt;
devices - masters and slaves&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_controller {&lt;br /&gt;
    reg = &amp;lt;0x7000c500 0x100&amp;gt;&lt;br /&gt;
    i2c_device_master {&lt;br /&gt;
        reg = &amp;lt;0x0187&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
    i2c_device_slave {&lt;br /&gt;
        reg = &amp;lt;0x0087&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===OLD=== &lt;br /&gt;
===General=== &lt;br /&gt;
Root node is SOC.&lt;br /&gt;
&amp;lt;name&amp;gt;[@&amp;lt;unit-address&amp;gt;]. : name - device type, unit-address - address, that is used to access device&lt;br /&gt;
&lt;br /&gt;
a) SOC can have multiple i2c controllers.&lt;br /&gt;
b) Some of controllers can be master and/or slave at the same time.&lt;br /&gt;
c) Some of controllers can be connected to same i2c bus.&lt;br /&gt;
d) In some cases slave may want attention from master.&lt;br /&gt;
&lt;br /&gt;
a) SOC can have multiple i2c controllers.&lt;br /&gt;
OK, it's current implementation&lt;br /&gt;
&lt;br /&gt;
b) ??? Some of controllers can be master and/or slave at the same time.&lt;br /&gt;
'''Q: Need a way for SW to select mode. How it should be done ?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c-slave@7000c500 {&lt;br /&gt;
    compatible = &amp;quot;nvidia,tegra20-i2c&amp;quot;;&lt;br /&gt;
    ???&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Possible values: master, slave, master and slave, sw decides&lt;br /&gt;
In current implementation i2c controller is master, i2c device is slave.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: #aaaaaa;&amp;quot;&amp;gt;c) Some of controllers can be connected to same i2c bus.&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: #aaaaaa;&amp;quot;&amp;gt; '''Q: Do we need information, that both controllers are on the same bus.'''&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c-slave@7000c500 {&lt;br /&gt;
    compatible = &amp;quot;nvidia,tegra20-i2c&amp;quot;;&lt;br /&gt;
    ???&lt;br /&gt;
}&lt;br /&gt;
i2c-slave@7000cf00 {&lt;br /&gt;
    compatible = &amp;quot;nvidia,tegra20-i2c&amp;quot;;&lt;br /&gt;
    ???&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: #aaaaaa;&amp;quot;&amp;gt;A: Useless case. Forget.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
d) In some cases slave may want attention from master.&lt;br /&gt;
'''Q: Who should contain information about &amp;quot;gpio&amp;quot; ? Master or slave ?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c-slave@7000c500 {&lt;br /&gt;
    compatible = &amp;quot;vendor,device&amp;quot;;&lt;br /&gt;
    mode = &amp;quot;slave&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    master@87 {&lt;br /&gt;
        compatible = &amp;quot;nvidia,nvec&amp;quot;;&lt;br /&gt;
        mode = &amp;quot;master&amp;quot;;&lt;br /&gt;
        reg = &amp;lt;0x87&amp;gt;;&lt;br /&gt;
    };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If i2c controller don't know about gpios, then there is no reason to add this field to it's node.&lt;br /&gt;
Only nvec knows about gpios. This is a reason why we should add gpio to nvec node.&lt;br /&gt;
&lt;br /&gt;
===Nvec=== &lt;br /&gt;
Root node is tegra20. This means that parent i2c node should be tegra's i2c controller.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c-slave@7000c500 {&lt;br /&gt;
    compatible = &amp;quot;nvidia,tegra20-i2c-slave&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nvec is child node.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c-slave@7000c500 {&lt;br /&gt;
    compatible = &amp;quot;nvidia,tegra20-i2c-slave&amp;quot;;&lt;br /&gt;
    reg = &amp;lt;0x7000c500 0x100&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
    nvec@87 {&lt;br /&gt;
        compatible = &amp;quot;nvidia,nvec&amp;quot;;&lt;br /&gt;
        reg = &amp;lt;0x87&amp;gt;;&lt;br /&gt;
    };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Software interaction=== &lt;br /&gt;
Common:&lt;br /&gt;
&amp;lt;tt&amp;gt;[ master ] --i2c-- [ slave ] | [ i2c-master ] ---- [ i2c-slave ]&amp;lt;/tt&amp;gt;&lt;br /&gt;
Nvec:&lt;br /&gt;
&amp;lt;tt&amp;gt;[ Nvec ] --i2c-- [ Tegra20 ] | [ tegra20-i2c ] ---- [ nvec ]&amp;lt;/tt&amp;gt;&lt;br /&gt;
Left side - hardware components, right side - software drivers.&lt;br /&gt;
&lt;br /&gt;
TODO: describe communication process&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Discussion=== &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c-slave@7000c500 {&lt;br /&gt;
    compatible = &amp;quot;nvidia,tegra20-i2c-slave&amp;quot;, &amp;quot;simple-bus&amp;quot;;&lt;br /&gt;
    reg = &amp;lt;0x7000c500 0x100&amp;gt;;&lt;br /&gt;
    interrupts = &amp;lt;0 92 0x04&amp;gt;;&lt;br /&gt;
    #address-cells = &amp;lt;1&amp;gt;;&lt;br /&gt;
    #size-cells = &amp;lt;0&amp;gt;;&lt;br /&gt;
    clock-frequency = &amp;lt;80000&amp;gt;;&lt;br /&gt;
    clocks = &amp;lt;&amp;amp;tegra_car 67&amp;gt;, &amp;lt;&amp;amp;tegra_car 124&amp;gt;;&lt;br /&gt;
    clock-names = &amp;quot;div-clk&amp;quot;, &amp;quot;fast-clk&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    nvec@87 {&lt;br /&gt;
        compatible = &amp;quot;nvidia,nvec&amp;quot;, &amp;quot;simple-bus&amp;quot;;&lt;br /&gt;
        reg = &amp;lt;0x87&amp;gt;;&lt;br /&gt;
        request-gpios = &amp;lt;&amp;amp;gpio TEGRA_GPIO(V, 2) 0&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
        keyboard {&lt;br /&gt;
            compatible = &amp;quot;nvidia,nvec-keyboard&amp;quot;;&lt;br /&gt;
            ...&lt;br /&gt;
            &amp;lt;insert key mappings here&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        ps2 {&lt;br /&gt;
            compatible = &amp;quot;nvidia,nvec-ps2&amp;quot;;&lt;br /&gt;
            packet-size = 6; /* for the ac100 tp */&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        events {&lt;br /&gt;
            compatible = &amp;quot;nvidia,nvec-events&amp;quot;;&lt;br /&gt;
            ...&lt;br /&gt;
            &amp;lt;add some system events here,&lt;br /&gt;
                e.g. lid switch, power button&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        charger: ac {&lt;br /&gt;
            compatible = &amp;quot;nvidia,nvec-ac&amp;quot;;&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        battery {&lt;br /&gt;
            compatible = &amp;quot;nvidia,nvec-battery&amp;quot;;&lt;br /&gt;
            charger = &amp;lt;&amp;amp;charger&amp;gt;;&lt;br /&gt;
       };&lt;br /&gt;
&lt;br /&gt;
        oem {&lt;br /&gt;
            compatible = &amp;quot;compal,nvec-paz00&amp;quot;;&lt;br /&gt;
            /* ac100 specific extentions to the protocol */&lt;br /&gt;
        };&lt;br /&gt;
    };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* simple bus (smbus) - where to define&lt;br /&gt;
* GPIO is part of the NVEC (?)&lt;br /&gt;
* If you need to instantiate child nodes as Linux platform devices, this should be done in the driver for the bus. Relying on simple-bus to do this is a hack.&lt;/div&gt;</summary>
		<author><name>Unknown user</name></author>
	</entry>
</feed>