<?xml version="1.0"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title>dissonant.dev wiki  - Recent changes [en]</title>
		<link>https://wiki.dissonant.dev/wiki/Special:RecentChanges</link>
		<description>Track the most recent changes to the wiki in this feed.</description>
		<language>en</language>
		<generator>MediaWiki 1.43.6</generator>
		<lastBuildDate>Fri, 28 Aug 2026 11:28:36 GMT</lastBuildDate>
		<item>
			<title>Mainline:Broadcom Kona/Adding a new device</title>
			<link>https://wiki.dissonant.dev/index.php?title=Mainline:Broadcom_Kona/Adding_a_new_device&amp;diff=172&amp;oldid=169</link>
			<guid isPermaLink="false">https://wiki.dissonant.dev/index.php?title=Mainline:Broadcom_Kona/Adding_a_new_device&amp;diff=172&amp;oldid=169</guid>
			<description>&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Getting the downstream kernel source&lt;/span&gt;&lt;/p&gt;
&lt;a href=&quot;https://wiki.dissonant.dev/index.php?title=Mainline:Broadcom_Kona/Adding_a_new_device&amp;amp;diff=172&amp;amp;oldid=169&quot;&gt;Show changes&lt;/a&gt;</description>
			<pubDate>Sun, 23 Aug 2026 19:56:09 GMT</pubDate>
			<dc:creator>Uart</dc:creator>
			<comments>https://wiki.dissonant.dev/wiki/Mainline_talk:Broadcom_Kona/Adding_a_new_device</comments>
		</item>
		<item>
			<title>Mainline:Broadcom Kona/Adding a new device</title>
			<link>https://wiki.dissonant.dev/index.php?title=Mainline:Broadcom_Kona/Adding_a_new_device&amp;diff=169&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dissonant.dev/index.php?title=Mainline:Broadcom_Kona/Adding_a_new_device&amp;diff=169&amp;oldid=0</guid>
			<description>&lt;p&gt;start writing draft&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;This page goes over the process of adding support for a Broadcom Kona device to the mainline Linux kernel.&lt;br /&gt;
&lt;br /&gt;
General outline of the process:&lt;br /&gt;
&lt;br /&gt;
* Get the downstream/vendor kernel source code&lt;br /&gt;
** Identify your device&amp;#039;s board files&lt;br /&gt;
* Get the mainline kernel source code&lt;br /&gt;
* Add a DTS for your device based on values from downstream&lt;br /&gt;
* Build the kernel and flash it to the device&lt;br /&gt;
* Test it!&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
In the mainline kernel, a device&amp;#039;s components are described in a structure known as the [https://wiki.mainlining.org/wiki/Devicetree device tree] (or devicetree, as is the official spelling). Device trees are compiled into DTBs (device tree blobs) from DTS (device tree source) files.&lt;br /&gt;
&lt;br /&gt;
Adding support for a new device involves &amp;#039;&amp;#039;&amp;#039;creating a DTS for that device&amp;#039;&amp;#039;&amp;#039; - this is the process covered in this guide.&lt;br /&gt;
&lt;br /&gt;
Device trees appeared in the kernel around version 3.4, and didn&amp;#039;t see widespread use in vendor kernels until a few LTS versions later. Before device trees, each device usually had a &amp;#039;&amp;#039;board file&amp;#039;&amp;#039; - a C file that contained structs with driver data and initialization functions.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;The downstream Kona kernels used board files.&amp;#039;&amp;#039;&amp;#039; (They did have some partial DT support, but it was never used for any production devices.)&lt;br /&gt;
&lt;br /&gt;
== Getting the kernel source ==&lt;br /&gt;
&lt;br /&gt;
(WIP)&lt;/div&gt;</description>
			<pubDate>Thu, 20 Aug 2026 21:54:58 GMT</pubDate>
			<dc:creator>Uart</dc:creator>
			<comments>https://wiki.dissonant.dev/wiki/Mainline_talk:Broadcom_Kona/Adding_a_new_device</comments>
		</item>
		<item>
			<title>User:Uart/Draft:pmOS wiki admin processes</title>
			<link>https://wiki.dissonant.dev/index.php?title=User:Uart/Draft:pmOS_wiki_admin_processes&amp;diff=168&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dissonant.dev/index.php?title=User:Uart/Draft:pmOS_wiki_admin_processes&amp;diff=168&amp;oldid=0</guid>
			<description>&lt;p&gt;Created page with &amp;quot;{{todo|Not sure if this will be on the wiki itself or in a separate note...}}  == Monitoring changes ==  Look through &lt;a href=&quot;/wiki/Special:RecentChanges&quot; title=&quot;Special:RecentChanges&quot;&gt;Special:RecentChanges&lt;/a&gt; and note:  * New article creations. Make sure they are of good enough quality and usefulness to be in the main namespace, if not they should be moved under the user&amp;#039;s userpage. * Redirects or page blanks.  == Approving sign-ups ==  Sign-up approvals have historically been used to stop spambots. These are pretty much a non-issue n...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{todo|Not sure if this will be on the wiki itself or in a separate note...}}&lt;br /&gt;
&lt;br /&gt;
== Monitoring changes ==&lt;br /&gt;
&lt;br /&gt;
Look through [[Special:RecentChanges]] and note:&lt;br /&gt;
&lt;br /&gt;
* New article creations. Make sure they are of good enough quality and usefulness to be in the main namespace, if not they should be moved under the user&amp;#039;s userpage.&lt;br /&gt;
* Redirects or page blanks.&lt;br /&gt;
&lt;br /&gt;
== Approving sign-ups ==&lt;br /&gt;
&lt;br /&gt;
Sign-up approvals have historically been used to stop spambots. These are pretty much a non-issue nowadays as they seem to have been completely stopped by Anubis, but it&amp;#039;s still worth pre-screening potential editors.&lt;br /&gt;
&lt;br /&gt;
When email-confirmed signups are pending, you will see a banner on the top of [[Special:RecentChanges]].&lt;br /&gt;
&lt;br /&gt;
To approve accounts, go to [[Special:ConfirmAccounts]] and click on the &amp;quot;Open requests&amp;quot; tab. For each account:&lt;br /&gt;
&lt;br /&gt;
* Open the &amp;quot;Review&amp;quot; tab.&lt;br /&gt;
* Look at the provided information.&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;Things to look out for&amp;#039;&amp;#039;&amp;#039; that might disqualify an account:&lt;br /&gt;
*** Presence of racist dogwhistles or slurs in username, bio, email or linked websites/socials: e.g. the number 1488 is used by Nazis. Deny with &amp;quot;Spam (do not send email)&amp;quot;.&lt;br /&gt;
*** Nonsensical repeating phrases in bio.&lt;br /&gt;
**** Folks usually do this to get around the 6 words in bio requirement; check if they listed something in the Additional notes that might hint at what they actually want to do on the wiki. If not, feel free to deny the request and in the reason, politely ask them to explain why they want to sign up to the postmarketOS wiki (TODO write a template for this).&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;Things that don&amp;#039;t always disqualify candidates&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
*** Foreign language bios. (Make sure to translate them first in case they contain something inappropriate.)&lt;br /&gt;
*** People who mention running AI/agents, have vibecoded projects in their links, etc.&lt;br /&gt;
**** Exception - if you suspect an AI agent is attempting to create an account as part of a larger change plan (for example, there&amp;#039;s a link to a code forge repo with AI-generated plans); in this case, deny the account and link to the AI policy in the reasoning.&lt;br /&gt;
** If you&amp;#039;re unsure, you can leave the account request for another admin.&lt;br /&gt;
* Select &amp;quot;Approve&amp;quot; on the bottom, and click &amp;quot;Create account&amp;quot;.&lt;br /&gt;
* You will be redirected to the CreateAccount page; click &amp;quot;Create account&amp;quot; there. This might take a few seconds.&lt;br /&gt;
&lt;br /&gt;
If during either of these operations you get an error about expired session or cookies, just click the Approve/Create button again (it should remember the data).&lt;br /&gt;
&lt;br /&gt;
== Renaming accounts ==&lt;br /&gt;
&lt;br /&gt;
{{todo|Create a workflow for users to submit these requests privately; right now they have to go through public chats or guess who the admins are which is not ideal.}}&lt;br /&gt;
&lt;br /&gt;
Admins can rename a user&amp;#039;s account. To do so, go to [[Special:RenameUser]] and change the user&amp;#039;s name.&lt;br /&gt;
&lt;br /&gt;
Keep the &amp;quot;Move user and talk pages (and their subpages) to new name&amp;quot; option selected.&lt;br /&gt;
&lt;br /&gt;
== Deleting accounts ==&lt;br /&gt;
&lt;br /&gt;
If a user requests account deletion:&lt;br /&gt;
&lt;br /&gt;
* Delete their user page and user talk page with the reason &amp;quot;Requested by user&amp;quot;&lt;br /&gt;
* Go to [[Special:BlockUser]] and block the user&amp;#039;s account&lt;br /&gt;
** Block type: &amp;#039;&amp;#039;&amp;#039;Sitewide&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** Block details: &amp;#039;&amp;#039;&amp;#039;Sending email, Editing their own talk page&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** Expiration: &amp;#039;&amp;#039;&amp;#039;indefinite&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** Reason: &amp;#039;&amp;#039;&amp;#039;Other&amp;#039;&amp;#039;&amp;#039;, &amp;quot;Requested by user&amp;quot;&lt;br /&gt;
** Additional options: &amp;#039;&amp;#039;&amp;#039;Hide username from edits and lists&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Disable the account via [[Special:DisableAccount]]&lt;br /&gt;
&lt;br /&gt;
TODO - if [https://www.mediawiki.org/wiki/Extension:UserMerge UserMerge] ever gets added: go to [[Special:UserMerge]] and merge the user, leaving the New User field empty (or write Anonymous)&lt;br /&gt;
&lt;br /&gt;
== New admin onboarding ==&lt;br /&gt;
&lt;br /&gt;
* Wiki admins should enable issue notifications on [https://gitlab.postmarketos.org/postmarketOS/wiki/-/work_items the wiki repo].&lt;br /&gt;
* Wiki admins should join and monitor the #postmarketOS-wiki IRC/Matrix channel.&lt;br /&gt;
* Go to the user&amp;#039;s page and select &amp;quot;Change user groups&amp;quot; from the sidebar (or go to [[Special:UserRights]] and type in their username). Add them to the &amp;quot;administrators&amp;quot;, &amp;quot;interface administrators&amp;quot;, &amp;quot;bureaucrats&amp;quot;, &amp;quot;suppressor&amp;quot; and &amp;quot;trusted&amp;quot; groups.&lt;/div&gt;</description>
			<pubDate>Tue, 18 Aug 2026 11:49:33 GMT</pubDate>
			<dc:creator>Uart</dc:creator>
			<comments>https://wiki.dissonant.dev/wiki/User_talk:Uart/Draft:pmOS_wiki_admin_processes</comments>
		</item>
		<item>
			<title>User:AltUart</title>
			<link>https://wiki.dissonant.dev/wiki/User:AltUart</link>
			<guid isPermaLink="false">https://wiki.dissonant.dev/wiki/User:AltUart</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AltUart&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new mw-userlink&quot; title=&quot;User:AltUart (page does not exist)&quot;&gt;&lt;bdi&gt;AltUart&lt;/bdi&gt;&lt;/a&gt; changed group membership for &lt;a href=&quot;/index.php?title=User:AltUart&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User:AltUart (page does not exist)&quot;&gt;AltUart&lt;/a&gt; from bureaucrat and administrator to (none)&lt;/p&gt;
</description>
			<pubDate>Sun, 09 Aug 2026 09:24:19 GMT</pubDate>
			<dc:creator>AltUart</dc:creator>
			<comments>https://wiki.dissonant.dev/wiki/User_talk:AltUart</comments>
		</item>
		<item>
			<title>Main Page</title>
			<link>https://wiki.dissonant.dev/index.php?title=Main_Page&amp;diff=167&amp;oldid=161</link>
			<guid isPermaLink="false">https://wiki.dissonant.dev/index.php?title=Main_Page&amp;diff=167&amp;oldid=161</guid>
			<description>&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 11:23, 9 August 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l5&quot;&gt;Line 5:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 5:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Mainline:BCM215xx]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Mainline:BCM215xx]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;contact [&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[User&lt;/del&gt;:&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Knuxify]&lt;/del&gt;] for an account.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;contact [&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;https&lt;/ins&gt;:&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;//uart.sh uart&lt;/ins&gt;] for an account.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key my_wiki-mediawiki-:diff:1.41:old-161:rev-167:php=table --&gt;
&lt;/table&gt;</description>
			<pubDate>Sun, 09 Aug 2026 09:23:59 GMT</pubDate>
			<dc:creator>AltUart</dc:creator>
			<comments>https://wiki.dissonant.dev/wiki/Talk:Main_Page</comments>
		</item>
		<item>
			<title>User:Knuxify/sidebartest</title>
			<link>https://wiki.dissonant.dev/index.php?title=User:Knuxify/sidebartest&amp;diff=163&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dissonant.dev/index.php?title=User:Knuxify/sidebartest&amp;diff=163&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AltUart&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new mw-userlink&quot; title=&quot;User:AltUart (page does not exist)&quot;&gt;&lt;bdi&gt;AltUart&lt;/bdi&gt;&lt;/a&gt; moved page &lt;a href=&quot;/index.php?title=User:Knuxify/sidebartest&amp;amp;redirect=no&quot; class=&quot;mw-redirect&quot; title=&quot;User:Knuxify/sidebartest&quot;&gt;User:Knuxify/sidebartest&lt;/a&gt; to &lt;a href=&quot;/wiki/User:Uart/sidebartest&quot; title=&quot;User:Uart/sidebartest&quot;&gt;User:Uart/sidebartest&lt;/a&gt; Automatically moved page while renaming the user &amp;quot;&lt;a href=&quot;/index.php?title=User:Knuxify&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User:Knuxify (page does not exist)&quot;&gt;Knuxify&lt;/a&gt;&amp;quot; to &amp;quot;&lt;a href=&quot;/index.php?title=User:Uart&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User:Uart (page does not exist)&quot;&gt;Uart&lt;/a&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;This is an example page&lt;br /&gt;
[[Category:Sidebar test]]&lt;/div&gt;</description>
			<pubDate>Sun, 09 Aug 2026 09:23:32 GMT</pubDate>
			<dc:creator>AltUart</dc:creator>
			<comments>https://wiki.dissonant.dev/wiki/User_talk:Knuxify/sidebartest</comments>
		</item>
		<item>
			<title>User:Knuxify/Old BCM590xx regulator notes</title>
			<link>https://wiki.dissonant.dev/index.php?title=User:Knuxify/Old_BCM590xx_regulator_notes&amp;diff=165&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dissonant.dev/index.php?title=User:Knuxify/Old_BCM590xx_regulator_notes&amp;diff=165&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AltUart&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new mw-userlink&quot; title=&quot;User:AltUart (page does not exist)&quot;&gt;&lt;bdi&gt;AltUart&lt;/bdi&gt;&lt;/a&gt; moved page &lt;a href=&quot;/index.php?title=User:Knuxify/Old_BCM590xx_regulator_notes&amp;amp;redirect=no&quot; class=&quot;mw-redirect&quot; title=&quot;User:Knuxify/Old BCM590xx regulator notes&quot;&gt;User:Knuxify/Old BCM590xx regulator notes&lt;/a&gt; to &lt;a href=&quot;/wiki/User:Uart/Old_BCM590xx_regulator_notes&quot; title=&quot;User:Uart/Old BCM590xx regulator notes&quot;&gt;User:Uart/Old BCM590xx regulator notes&lt;/a&gt; Automatically moved page while renaming the user &amp;quot;&lt;a href=&quot;/index.php?title=User:Knuxify&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User:Knuxify (page does not exist)&quot;&gt;Knuxify&lt;/a&gt;&amp;quot; to &amp;quot;&lt;a href=&quot;/index.php?title=User:Uart&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User:Uart (page does not exist)&quot;&gt;Uart&lt;/a&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;(note: this article has not been cleaned up &amp;#039;&amp;#039;at all&amp;#039;&amp;#039;, it is imported from my local notes as-is.)&lt;br /&gt;
&lt;br /&gt;
== Revisions ==&lt;br /&gt;
&lt;br /&gt;
BCMPMU_59054_ID is ID for 59054&lt;br /&gt;
&lt;br /&gt;
BCMPMU_59054A1_ANA_REV refers to A1 which has ACLD, A0 does not&lt;br /&gt;
&lt;br /&gt;
== Downstream driver notes ==&lt;br /&gt;
&lt;br /&gt;
* The downstream driver used is BCM59xxx, which despite the name is only for the BCM59054&lt;br /&gt;
** In the tree there are also drivers for BCM59056, a handful of other PMUs including BCM59055, and BCM590xx (which confusingly is &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; the same as BCM59xxx).&lt;br /&gt;
* The whole driver is fragmented as it&amp;#039;s an MFD device, but the most important files are:&lt;br /&gt;
** &amp;lt;code&amp;gt;arch/arm/mach-{codename}/board-bcm59xxx_{device}.c&amp;lt;/code&amp;gt; - contains PMU setup data, including voltages, regulator modes, battery values, etc.&lt;br /&gt;
** various files in &amp;lt;code&amp;gt;drivers/mfd/&amp;lt;/code&amp;gt; starting from &amp;lt;code&amp;gt;bcmpmu59xxx-&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;drivers/regulator/bcmpmu-rgltr-bcm59xxx.c&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;drivers/regulator/bcmpmu59xxx-regulator.c&amp;lt;/code&amp;gt;&lt;br /&gt;
** there&amp;#039;s some OTG related driver in &amp;lt;code&amp;gt;drivers/usb/otg/&amp;lt;/code&amp;gt;? investigate&lt;br /&gt;
** &amp;lt;code&amp;gt;drivers/misc/bcmpmu59xxx_audio.c&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;include/linux/mfd/bcmpmu59xxx_reg.h&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;include/linux/mfd/bcmpmu59054_reg.h&amp;lt;/code&amp;gt;&lt;br /&gt;
** and others not mentioned here. todo&lt;br /&gt;
&lt;br /&gt;
== Regulators ==&lt;br /&gt;
&lt;br /&gt;
SR apparently means &amp;quot;switcher&amp;quot; (drivers/regulator/bcmpmu-regulator-56.c line 249). Rest is LDOs.&lt;br /&gt;
&lt;br /&gt;
== Modes ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;(see &amp;lt;code&amp;gt;drivers/regulator/bcmpmu59xxx-regulator.c&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;include/linux/mfd/bcmpmu59xxx.h&amp;lt;/code&amp;gt;)&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
There are two mode settings: 3bit (GPLDOs only) and 2bit (everything else, including all regs in bcm59056).&lt;br /&gt;
&lt;br /&gt;
A standard regulator can have 3 modes: * ON (&amp;lt;code&amp;gt;REGULATOR_MODE_FAST&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;REGULATOR_MODE_NORMAL&amp;lt;/code&amp;gt;) (0) * LPM (&amp;lt;code&amp;gt;REGULATOR_MODE_IDLE&amp;lt;/code&amp;gt;) (1) * OFF (&amp;lt;code&amp;gt;REGULATOR_MODE_STANDBY&amp;lt;/code&amp;gt;) (2)&lt;br /&gt;
&lt;br /&gt;
* 2-bit mode regulators have 4 PM values in the PMMODE registers, at offsets 0, 2, 4 and 6 respectively (PM0, PM1, PM2, PM3), and &amp;#039;&amp;#039;&amp;#039;2 PMMODE registers&amp;#039;&amp;#039;&amp;#039;. (PMCTRL1 and PMCTRL2)&lt;br /&gt;
* 3-bit mode regulators have 2 PM values in the PMMODE registers, at offsets 0 and 3 respectively, and &amp;#039;&amp;#039;&amp;#039;4 PMMODE registers&amp;#039;&amp;#039;&amp;#039;. (PMCTRL1-&amp;gt;4)&lt;br /&gt;
&lt;br /&gt;
Each PM value corresponds to a different mode.&lt;br /&gt;
&lt;br /&gt;
== BCM59056 and modes ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;(see &amp;lt;code&amp;gt;drivers/regulator/bcmpmu-regulator-56.c&amp;lt;/code&amp;gt;)&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strike&amp;gt;Unlike BCM59054, there&amp;#039;s only one PMMODE register&amp;lt;/strike&amp;gt; (this is completely wrong! BCM59056 also has multiple PMMODE regs), and it has values PM0 to PM3. DSM (deep sleep) is pins PM0 and PM2. Regular value is written to PM1 and PM3.&lt;br /&gt;
&lt;br /&gt;
I have a sneaking suspicion, based on the mainline driver, and the fact that the function described in the &amp;quot;Enabling the regulator&amp;quot; part will gleefuly ignore PM0 mostly, that PM0 may be some sort of &amp;quot;perma-override&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*State of enabled regualtor in deep sleep     &lt;br /&gt;
Used to program PC2PC1 = 0b10 &amp;amp; 0b00 case     &lt;br /&gt;
when the regulator is enabled*/     &lt;br /&gt;
enum {     &lt;br /&gt;
        BCMPMU_REGL_ON_IN_DSM = 1,     &lt;br /&gt;
        BCMPMU_REGL_LPM_IN_DSM,     &lt;br /&gt;
        BCMPMU_REGL_OFF_IN_DSM     &lt;br /&gt;
};   &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...a PC reference? You&amp;#039;ll see these in the next section.&lt;br /&gt;
&lt;br /&gt;
=== BCM59054 and modes ===&lt;br /&gt;
&lt;br /&gt;
Here, the situation is a bit more complicated because there are multiple PMMODE regs. (Actually BCM59056 seems to have these as well? weird.)&lt;br /&gt;
&lt;br /&gt;
=== Enabling a regulator ===&lt;br /&gt;
&lt;br /&gt;
In theory, enabling a regulator can be done by setting all of its modes to &amp;lt;code&amp;gt;PMMODE_ON&amp;lt;/code&amp;gt;. In practice, however, each regulator has specific &amp;quot;pins&amp;quot; which, when enabled, will enable the regulator. The pins used are stored in &amp;lt;code&amp;gt;arch/arm/mach-java/board-bcm59xxx_*&amp;lt;/code&amp;gt;, under &amp;lt;code&amp;gt;pc_pins_map&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
This has a value created with the &amp;quot;PCPIN_MAP_ENC&amp;quot; macro, which effectively packs two &amp;quot;sets&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Set 1&amp;#039;&amp;#039;&amp;#039;, which is the first parameter - if this is set, then &amp;#039;&amp;#039;&amp;#039;all pins in this set must be enabled&amp;#039;&amp;#039;&amp;#039; to enable this regulator.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Set 0&amp;#039;&amp;#039;&amp;#039;, which is the second parameter - if this is set, then &amp;#039;&amp;#039;&amp;#039;one of the pins in this set must be enabled&amp;#039;&amp;#039;&amp;#039; to enable this regulator.&lt;br /&gt;
&lt;br /&gt;
The functions &amp;lt;code&amp;gt;__is_2bit_pmmode_regl_enabled&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;__is_3bit_pmmode_regl_enabled&amp;lt;/code&amp;gt; check if a regulator is enabled based on those pin maps, and the &amp;lt;code&amp;gt;pmmode&amp;lt;/code&amp;gt; value as read out from the PMMODE registers.&lt;br /&gt;
&lt;br /&gt;
For every &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; from 0 to 7 (&amp;lt;code&amp;gt;REGL_PMMODE_VAL_MAX&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
* get the PM reg shift by &amp;lt;code&amp;gt;PMMODE_2BIT_PMx_MASK &amp;amp; i&amp;lt;/code&amp;gt; (PMMODE_2BIT_PMx_MASK == 3)&lt;br /&gt;
* if this &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; gives a value through &amp;lt;code&amp;gt;setval &amp;amp; i&amp;lt;/code&amp;gt; in set0 or set1, then the value of whether the regulator is enabled is calculated using &amp;lt;code&amp;gt;PMMODE_2BIT_PMx_MASK &amp;amp; (pmmode[inx] &amp;gt;&amp;gt; shift)&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;inx&amp;lt;/code&amp;gt; is increased for every value where &amp;lt;code&amp;gt;PMMODE_2BIT_PMx_MASK &amp;amp; i&amp;lt;/code&amp;gt; == 3.&lt;br /&gt;
&lt;br /&gt;
In normal words: if the mode corresponding to the pin in &amp;#039;&amp;#039;any&amp;#039;&amp;#039; of the PMMODE registers is ON, then the regulator is on.&lt;br /&gt;
&lt;br /&gt;
Here&amp;#039;s a table of what that looks like:&lt;br /&gt;
&lt;br /&gt;
(i - i iterator, s - pm offset, x - pmmode register no., set0 - matches against joined set0; pc1, pc2, pc3 - the result of the check for each of the possible pins in set0)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;i s x set0   pc1   pc2   pc3&lt;br /&gt;
0 0 0 False [False, False, False]&lt;br /&gt;
1 2 0 True [True, False, False]&lt;br /&gt;
2 4 0 True [False, True, False]&lt;br /&gt;
3 6 0 True [True, True, False]&lt;br /&gt;
4 0 1 True [False, False, True]&lt;br /&gt;
5 2 1 True [True, False, True]&lt;br /&gt;
6 4 1 True [False, True, True]&lt;br /&gt;
7 6 1 True [True, True, True]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
One thing of note - PC1 matches exactly the same configuration as the non-deep-sleep pins from the BCM59056 driver mentioned earlier. PC2 matches offsets 4 and 6, and PC3 matches everything in the second register, but not the first one.&lt;br /&gt;
&lt;br /&gt;
So, how can the BCM59056 driver ignore that second register? Maybe I just didn&amp;#039;t read something right? (probably...) (update: I think it&amp;#039;s just BCM59054 that pokes multiple regs?)&lt;br /&gt;
&lt;br /&gt;
Update: I found this a little later, in the bcm59&amp;#039;&amp;#039;&amp;#039;0xx&amp;#039;&amp;#039;&amp;#039; driver (actually for the BCM59055).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;#define PC2_IS_0_PC1_IS_0                       0    &lt;br /&gt;
#define PC2_IS_0_PC1_IS_1                       2    &lt;br /&gt;
#define PC2_IS_1_PC1_IS_0                       4    &lt;br /&gt;
#define PC2_IS_1_PC1_IS_1                       6    &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
I suppose this should match the table above?&lt;br /&gt;
&lt;br /&gt;
In any case - what I think is happening here is that which registers are read from to determine the notes are controlled by some kind of pins. Each PMMODE offset represents a different combination of pins to set.&lt;br /&gt;
&lt;br /&gt;
=== The actual function called to prepare the enable value ===&lt;br /&gt;
&lt;br /&gt;
Now that we know how these pins work, we can analyze the second function, &amp;lt;code&amp;gt;__2bit_pmmode_frm_map&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
This one&amp;#039;s similar to the previous function:&lt;br /&gt;
&lt;br /&gt;
For every &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; from 0 to 7 (&amp;lt;code&amp;gt;REGL_PMMODE_VAL_MAX&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
* If the value is in set0 or set1, set the value to &amp;lt;code&amp;gt;PMMODE_ON&amp;lt;/code&amp;gt;; otherwise, use &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;dsm_pmmode&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; (a variable passed at init time). Oooh, DSM again!&lt;br /&gt;
* Figure out the shift and register like before.&lt;br /&gt;
* Add the value to a temp variable by ORing &amp;lt;code&amp;gt;val &amp;lt;&amp;lt; shift&amp;lt;/code&amp;gt; to it.&lt;br /&gt;
&lt;br /&gt;
Here&amp;#039;s the thing: &amp;lt;code&amp;gt;dsm_pmmode&amp;lt;/code&amp;gt;... is the mode value provided in &amp;lt;code&amp;gt;__bcmpmuldo_set_mode&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The mode is set in a few places in the code, and next to one of them, I found this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;                        /* We need to set mode here as regulator framework     &lt;br /&gt;
                        (set_machine_constraints) set the mode first and     &lt;br /&gt;
                        then call enable. We have updated enable function     &lt;br /&gt;
                        to set ON for all states based on customer request     &lt;br /&gt;
                        set_mode function sets PMMODE as needed*/     &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== TL;DR, summary ====&lt;br /&gt;
&lt;br /&gt;
Regulators can be enabled by setting specific offsets at the PMMODE registers to PMMODE_ON. A combination of PC pins can be used to select which offsets and PMMODE registers actually apply - by default, only offsets in PMCTRL1 is used, but the others can be used as well if PC3 is present - see below.&lt;br /&gt;
&lt;br /&gt;
As a gross oversimplification, you can simply set &amp;#039;&amp;#039;every&amp;#039;&amp;#039; register to PMMODE_ON and it should work.&lt;br /&gt;
&lt;br /&gt;
PM0 and PM2 (offsets 0 and 4) may or may not be related to deep sleep mode.&lt;br /&gt;
&lt;br /&gt;
== A note about PC pins ==&lt;br /&gt;
&lt;br /&gt;
According to schematics, on the Grand Neo, PC1 and PC2 are connected to the accordingly named PC1 and PC2 pinctrl pins. PC3 is an alternative function of LCDCS0 - and it&amp;#039;s connected, as PMU_PC3, to the GPIO1 pin on the PMIC.&lt;br /&gt;
&lt;br /&gt;
Turns out, the function of the GPIO pins can be programmed by writing to the GPIOCTRL registers. Here&amp;#039;s the relevant downstream code:&lt;br /&gt;
&lt;br /&gt;
(arch/arm/mach-java/board-bcm59xxx_ss_baffinlite.c)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt; 121         /*  enable PC3 function */&lt;br /&gt;
 122         {.addr = PMU_REG_GPIOCTRL2, .val = 0x0E, .mask = 0xFF},&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Sadly, these regs are completely undocumented, so we can&amp;#039;t know for sure which exact bit enables this function. We also don&amp;#039;t know what happens if it&amp;#039;s &amp;#039;&amp;#039;not&amp;#039;&amp;#039; enabled.&lt;br /&gt;
&lt;br /&gt;
== What about the regulator modes? ==&lt;br /&gt;
&lt;br /&gt;
Somehow, &amp;lt;code&amp;gt;__2bit_pmmode_frm_map&amp;lt;/code&amp;gt; &amp;#039;&amp;#039;doesn&amp;#039;t&amp;#039;&amp;#039; set all of the PMMODE offsets! For the offsets matching the PC pin map, it actually &amp;#039;&amp;#039;leaves them on&amp;#039;&amp;#039;, and only sets the requested mode for the remaining ones! Given that the variable name for the provided mode is &amp;lt;code&amp;gt;dsm_pmmode&amp;lt;/code&amp;gt;, I suspect that Broadcom might&amp;#039;ve abused the mode system to provide the &amp;#039;&amp;#039;deep sleep regulator mode&amp;#039;&amp;#039; instead.&lt;br /&gt;
&lt;br /&gt;
Still, this doesn&amp;#039;t explain how the PC pins are controlled. I can&amp;#039;t find any place in the downstream code that would do it. I suspect I should look at the suspend code...&lt;br /&gt;
&lt;br /&gt;
Note to self: CHIPREG seems interesting. Has a whole bunch of stuff.&lt;br /&gt;
&lt;br /&gt;
Another unrelated note: looks like i2c sets up slew rate for its pins in the driver, investigate&lt;/div&gt;</description>
			<pubDate>Sun, 09 Aug 2026 09:23:32 GMT</pubDate>
			<dc:creator>AltUart</dc:creator>
			<comments>https://wiki.dissonant.dev/wiki/User_talk:Knuxify/Old_BCM590xx_regulator_notes</comments>
		</item>
		<item>
			<title>User:Knuxify</title>
			<link>https://wiki.dissonant.dev/wiki/User:Knuxify</link>
			<guid isPermaLink="false">https://wiki.dissonant.dev/wiki/User:Knuxify</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AltUart&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new mw-userlink&quot; title=&quot;User:AltUart (page does not exist)&quot;&gt;&lt;bdi&gt;AltUart&lt;/bdi&gt;&lt;/a&gt; renamed user &lt;a href=&quot;/index.php?title=User:Knuxify&amp;amp;redirect=no&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User:Knuxify (page does not exist)&quot;&gt;Knuxify&lt;/a&gt; (160 edits) to &lt;a href=&quot;/index.php?title=User:Uart&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User:Uart (page does not exist)&quot;&gt;Uart&lt;/a&gt; rename&lt;/p&gt;
</description>
			<pubDate>Sun, 09 Aug 2026 09:23:32 GMT</pubDate>
			<dc:creator>AltUart</dc:creator>
			<comments>https://wiki.dissonant.dev/wiki/User_talk:Knuxify</comments>
		</item>
		<item>
			<title>User:AltUart</title>
			<link>https://wiki.dissonant.dev/wiki/User:AltUart</link>
			<guid isPermaLink="false">https://wiki.dissonant.dev/wiki/User:AltUart</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:Uart&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new mw-userlink&quot; title=&quot;User:Uart (page does not exist)&quot;&gt;&lt;bdi&gt;Uart&lt;/bdi&gt;&lt;/a&gt; changed group membership for &lt;a href=&quot;/index.php?title=User:AltUart&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User:AltUart (page does not exist)&quot;&gt;AltUart&lt;/a&gt; from (none) to administrator and bureaucrat&lt;/p&gt;
</description>
			<pubDate>Sun, 09 Aug 2026 09:04:03 GMT</pubDate>
			<dc:creator>Uart</dc:creator>
			<comments>https://wiki.dissonant.dev/wiki/User_talk:AltUart</comments>
		</item>
		<item>
			<title>User:AltUart</title>
			<link>https://wiki.dissonant.dev/wiki/User:AltUart</link>
			<guid isPermaLink="false">https://wiki.dissonant.dev/wiki/User:AltUart</guid>
			<description>&lt;p&gt;User account &lt;a href=&quot;/index.php?title=User:AltUart&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new mw-userlink&quot; title=&quot;User:AltUart (page does not exist)&quot;&gt;&lt;bdi&gt;AltUart&lt;/bdi&gt;&lt;/a&gt; was created by &lt;a href=&quot;/index.php?title=User:Uart&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new mw-userlink&quot; title=&quot;User:Uart (page does not exist)&quot;&gt;&lt;bdi&gt;Uart&lt;/bdi&gt;&lt;/a&gt;&lt;/p&gt;
</description>
			<pubDate>Sun, 09 Aug 2026 09:03:41 GMT</pubDate>
			<dc:creator>Uart</dc:creator>
			<comments>https://wiki.dissonant.dev/wiki/User_talk:AltUart</comments>
		</item>
</channel></rss>