MFD for v7.1

* Core:
     * Add a resource-managed version of alloc_workqueue() (`devm_alloc_workqueue()`)
   * Apple SMC:
     * Wire up the Apple SMC power driver by adding a new MFD cell
   * Broadcom BCM2835 PM:
     * Add support for the BCM2712 power management device
     * Introduce a hardware type identifier to distinguish SoC variants
   * Intel LPSS:
     * Add PCI IDs for the Intel Nova Lake-H platform
 
   * Core:
     * Preserve the Open Firmware (OF) node when an ACPI handle is present
   * Atmel HLCDC:
     * Fetch the LVDS PLL clock as a fallback if the generic sys_clk is unavailable
   * EZX PCAP:
     * Avoid rescheduling after destroying the workqueue by switching to a device-managed workqueue
   * Freescale MC13xxx:
     * Fix a memory leak in subdevice platform data allocation by using devm_kmemdup()
   * Intel LPC ICH:
     * Expose a software node for the GPIO controller cell to fix GPIO lookups
   * MediaTek MT6397:
     * Correct the hardware CIDs for the MT6328, MT6331, and MT6332 PMICs to allow proper driver
       binding
   * ROHM BD71828:
     * Enable system wakeup via the power button
   * STMicroelectronics STPMIC1:
     * Attempt system shutdown a second time to handle transient I2C communication failures
 
   * Congatec CGBC, KEMPLD, RSMU, Si476x:
     * Fix various kernel-doc warnings and correct struct member names
   * DLN2:
     * Drop redundant USB device references and switch to managed resource allocations
     * Update bare 'unsigned' types to 'unsigned int'
   * ENE KB3930:
     * Use the of_device_is_system_power_controller() wrapper
   * EZX PCAP:
     * Drop redundant memory allocation error messages
     * Return directly instead of using empty goto statements
   * Maxim MAX77705:
     * Make the max77705_pm_ops variable static to resolve a sparse warning
   * Viperboard:
     * Drop redundant USB device references
 
   * SpacemiT P1:
     * Drop the deprecated "vin-supply" property from the devicetree bindings
 
   * SpacemiT P1:
     * Add individual regulator supply properties to match actual hardware topology
   * Maxim MAX77620:
     * Convert devicetree bindings from TXT to YAML format
     * Document an optional I2C address for the MAX77663 RTC device
   * ROHM BD72720:
     * Add a new compatible string for the ROHM BD73900 PMIC
   * Freescale i.MX25 TSADC:
     * Convert devicetree bindings from TXT to YAML format
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEdrbJNaO+IJqU8IdIUa+KL4f8d2EFAmnl4F8ACgkQUa+KL4f8
 d2HwnRAAjLNnENBowYZeXNsi7QXTyoZPUtJmVEqALKgHZ1SGtUtitw4eaKLn+KC/
 qWUBuglp4YOmue0xf+HmJhEL+hnixzGH0XxbYDdlKPXyk9xxf2UEXushq3+DlwX8
 QA4tznLqxjrHZNvMZoNODRZXkec6PHluYJdUuXZsfXFltR8nfsEmRcrtCgM07TGj
 dBWfbuAIyUnWZss0IaZdWOjxE1LHCT+hBVY7eUkj3DhNKxLgonmCCMysAnlTQV/G
 g9qQbAZtJXL5Km/DJTpRaPj0G0RMjnpi8KJEI7RVCLWT0mDpoSvvoF2xjEUDDVc5
 4M3TI9SFgfNYNZ8IcAAZROVXTjNVEdW4OgbCc7T/GCuxnycGxZJelPJPwNCZQ5LN
 xyKmj9zT6GdTc33l0fxURaFj3gq2NC1WZ018updjmSa7iOAU3zeEKMM3FA0TieMP
 SbOzx661CjaH+6ZIDZ8aQzcGd5OAEy19jzOH7fT9lfkpRU95tU/VWud50PPe0jj0
 1wXTXHHXJ+/k837h4aK+3WDcb/+SwUuUyLY7kZnfW9G+3m9j8VJyu7TjiEfmqRNW
 r7SXFn/y5DEDQIk8ktGa3aAtHQK5bImfodeyw4wHCOa8MHSSfQxbdT+FIKvPSgFv
 30FtCh9azwOQjcdK8bNgE+e+JTgYoM4DUiJ67V8HWaS9sFXBYLc=
 =S0In
 -----END PGP SIGNATURE-----

Merge tag 'mfd-next-7.1' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd

Pull MFD updates from Lee Jones:
 "Core:
   - Add a resource-managed version of alloc_workqueue()
     (`devm_alloc_workqueue()`)
   - Preserve the Open Firmware (OF) node when an ACPI handle
     is present

  Apple SMC:
   - Wire up the Apple SMC power driver by adding a new MFD cell

  Atmel HLCDC:
   - Fetch the LVDS PLL clock as a fallback if the generic sys_clk
     is unavailable

  Broadcom BCM2835 PM:
   - Add support for the BCM2712 power management device
   - Introduce a hardware type identifier to distinguish SoC variants

  Congatec CGBC, KEMPLD, RSMU, Si476x:
   - Fix various kernel-doc warnings and correct struct member names

  DLN2:
   - Drop redundant USB device references and switch to managed
     resource allocations
   - Update bare 'unsigned' types to 'unsigned int'

  ENE KB3930:
   - Use the of_device_is_system_power_controller() wrapper

  EZX PCAP:
   - Avoid rescheduling after destroying the workqueue by switching
     to a device-managed workqueue
   - Drop redundant memory allocation error messages
   - Return directly instead of using empty goto statements

  Freescale i.MX25 TSADC:
   - Convert devicetree bindings from TXT to YAML format

  Freescale MC13xxx:
   - Fix a memory leak in subdevice platform data allocation by
     using devm_kmemdup()

  Intel LPC ICH:
   - Expose a software node for the GPIO controller cell to fix
     GPIO lookups

  Intel LPSS:
   - Add PCI IDs for the Intel Nova Lake-H platform

  Maxim MAX77620:
   - Convert devicetree bindings from TXT to YAML format
   - Document an optional I2C address for the MAX77663 RTC device

  Maxim MAX77705:
   - Make the max77705_pm_ops variable static to resolve a
     sparse warning

  MediaTek MT6397:
   - Correct the hardware CIDs for the MT6328, MT6331, and MT6332
     PMICs to allow proper driver binding

  ROHM BD71828:
   - Enable system wakeup via the power button

  ROHM BD72720:
   - Add a new compatible string for the ROHM BD73900 PMIC

  SpacemiT P1:
   - Drop the deprecated "vin-supply" property from the devicetree
     bindings
   - Add individual regulator supply properties to match actual
     hardware topology

  STMicroelectronics STPMIC1:
   - Attempt system shutdown a second time to handle transient I2C
     communication failures

  Viperboard:
   - Drop redundant USB device references"

* tag 'mfd-next-7.1' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd: (28 commits)
  mfd: core: Preserve OF node when ACPI handle is present
  mfd: ene-kb3930: Use of_device_is_system_power_controller() wrapper
  mfd: intel-lpss: Add Intel Nova Lake-H PCI IDs
  dt-bindings: mfd: max77620: Document optional RTC address for MAX77663
  dt-bindings: mfd: max77620: Convert to DT schema
  mfd: ezx-pcap: Avoid rescheduling after destroying workqueue
  mfd: ezx-pcap: Return directly instead of empty gotos
  mfd: ezx-pcap: Drop memory allocation error message
  mfd: bcm2835-pm: Add BCM2712 PM device support
  mfd: bcm2835-pm: Introduce SoC-specific type identifier
  dt-bindings: mfd: bd72720: Add ROHM BD73900
  mfd: si476x: Fix kernel-doc warnings
  mfd: rsmu: Remove a empty kernel-doc line
  mfd: kempld: Fix kernel-doc struct member names
  mfd: congatec: Fix kernel-doc struct member names
  dt-bindings: mfd: Convert fsl-imx25-tsadc.txt to yaml format
  mfd: viperboard: Drop redundant device reference
  mfd: dln2: Switch to managed resources and fix bare unsigned types
  mfd: macsmc: Wire up Apple SMC power driver
  mfd: mt6397: Properly fix CID of MT6328, MT6331 and MT6332
  ...
This commit is contained in:
Linus Torvalds 2026-04-20 11:31:01 -07:00
commit 25c456dab5
30 changed files with 680 additions and 356 deletions

View File

@ -27,7 +27,6 @@ properties:
- gateworks,pld-gpio
- ibm,ppc4xx-gpio
- loongson,ls1x-gpio
- maxim,max77620
- nintendo,hollywood-gpio
- nxp,pca9570
- nxp,pca9571
@ -86,7 +85,6 @@ allOf:
compatible:
contains:
enum:
- maxim,max77620
- rockchip,rk3328-grf-gpio
- ti,lp3943-gpio
- ti,palmas-gpio

View File

@ -0,0 +1,97 @@
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
%YAML 1.2
---
$id: http://devicetree.org/schemas/mfd/fsl,imx25-tsadc.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: Freescale MX25 ADC/TSC MultiFunction Device (MFD)
maintainers:
- Frank Li <Frank.Li@nxp.com>
description:
This device combines two general purpose conversion queues one used for general
ADC and the other used for touchscreens.
properties:
compatible:
const: fsl,imx25-tsadc
reg:
maxItems: 1
interrupts:
maxItems: 1
clocks:
maxItems: 1
clock-names:
items:
- const: ipg
interrupt-controller: true
'#interrupt-cells':
const: 1
'#address-cells':
const: 1
'#size-cells':
const: 1
ranges: true
patternProperties:
'^touchscreen@[0-9a-f]+$':
type: object
$ref: /schemas/input/touchscreen/fsl,imx25-tcq.yaml
unevaluatedProperties: false
'^adc@[0-9a-f]+$':
type: object
$ref: /schemas/iio/adc/fsl,imx25-gcq.yaml
unevaluatedProperties: false
required:
- compatible
- reg
- interrupts
- clocks
- clock-names
- '#interrupt-cells'
- '#address-cells'
- '#size-cells'
additionalProperties: false
examples:
- |
tscadc@50030000 {
compatible = "fsl,imx25-tsadc";
reg = <0x50030000 0xc>;
interrupts = <46>;
clocks = <&clks 119>;
clock-names = "ipg";
interrupt-controller;
#interrupt-cells = <1>;
#address-cells = <1>;
#size-cells = <1>;
ranges;
touchscreen@50030400 {
compatible = "fsl,imx25-tcq";
reg = <0x50030400 0x60>;
interrupts = <0>;
fsl,wires = <4>;
};
adc@50030800 {
compatible = "fsl,imx25-gcq";
reg = <0x50030800 0x60>;
interrupts = <1>;
#address-cells = <1>;
#size-cells = <0>;
};
};

View File

@ -1,47 +0,0 @@
Freescale MX25 ADC/TSC MultiFunction Device (MFD)
This device combines two general purpose conversion queues one used for general
ADC and the other used for touchscreens.
Required properties:
- compatible: Should be "fsl,imx25-tsadc".
- reg: Start address and size of the memory area of
the device
- interrupts: Interrupt for this device
(See: ../interrupt-controller/interrupts.txt)
- clocks: An 'ipg' clock (See: ../clock/clock-bindings.txt)
- interrupt-controller: This device is an interrupt controller. It
controls the interrupts of both
conversion queues.
- #interrupt-cells: Should be '<1>'.
- #address-cells: Should be '<1>'.
- #size-cells: Should be '<1>'.
This device includes two conversion queues which can be added as subnodes.
The first queue is for the touchscreen, the second for general purpose ADC.
Example:
tscadc: tscadc@50030000 {
compatible = "fsl,imx25-tsadc";
reg = <0x50030000 0xc>;
interrupts = <46>;
clocks = <&clks 119>;
clock-names = "ipg";
interrupt-controller;
#interrupt-cells = <1>;
#address-cells = <1>;
#size-cells = <1>;
ranges;
tsc: tcq@50030400 {
compatible = "fsl,imx25-tcq";
reg = <0x50030400 0x60>;
...
};
adc: gcq@50030800 {
compatible = "fsl,imx25-gcq";
reg = <0x50030800 0x60>;
...
};
};

View File

@ -1,162 +0,0 @@
MAX77620 Power management IC from Maxim Semiconductor.
Required properties:
-------------------
- compatible: Must be one of
"maxim,max77620"
"maxim,max20024"
"maxim,max77663"
- reg: I2C device address.
Optional properties:
-------------------
- interrupts: The interrupt on the parent the controller is
connected to.
- interrupt-controller: Marks the device node as an interrupt controller.
- #interrupt-cells: is <2> and their usage is compliant to the 2 cells
variant of <../interrupt-controller/interrupts.txt>
IRQ numbers for different interrupt source of MAX77620
are defined at dt-bindings/mfd/max77620.h.
- system-power-controller: Indicates that this PMIC is controlling the
system power, see [1] for more details.
[1] Documentation/devicetree/bindings/power/power-controller.txt
Optional subnodes and their properties:
=======================================
Flexible power sequence configurations:
--------------------------------------
The Flexible Power Sequencer (FPS) allows each regulator to power up under
hardware or software control. Additionally, each regulator can power on
independently or among a group of other regulators with an adjustable power-up
and power-down delays (sequencing). GPIO1, GPIO2, and GPIO3 can be programmed
to be part of a sequence allowing external regulators to be sequenced along
with internal regulators. 32KHz clock can be programmed to be part of a
sequence.
The flexible sequencing structure consists of two hardware enable inputs
(EN0, EN1), and 3 master sequencing timers called FPS0, FPS1 and FPS2.
Each master sequencing timer is programmable through its configuration
register to have a hardware enable source (EN1 or EN2) or a software enable
source (SW). When enabled/disabled, the master sequencing timer generates
eight sequencing events on different time periods called slots. The time
period between each event is programmable within the configuration register.
Each regulator, GPIO1, GPIO2, GPIO3, and 32KHz clock has a flexible power
sequence slave register which allows its enable source to be specified as
a flexible power sequencer timer or a software bit. When a FPS source of
regulators, GPIOs and clocks specifies the enable source to be a flexible
power sequencer, the power up and power down delays can be specified in
the regulators, GPIOs and clocks flexible power sequencer configuration
registers.
When FPS event cleared (set to LOW), regulators, GPIOs and 32KHz
clock are set into following state at the sequencing event that
corresponds to its flexible sequencer configuration register.
Sleep state: In this state, regulators, GPIOs
and 32KHz clock get disabled at
the sequencing event.
Global Low Power Mode (GLPM): In this state, regulators are set in
low power mode at the sequencing event.
The configuration parameters of FPS is provided through sub-node "fps"
and their child for FPS specific. The child node name for FPS are "fps0",
"fps1", and "fps2" for FPS0, FPS1 and FPS2 respectively.
The FPS configurations like FPS source, power up and power down slots for
regulators, GPIOs and 32kHz clocks are provided in their respective
configuration nodes which is explained in respective sub-system DT
binding document.
There is need for different FPS configuration parameters based on system
state like when system state changed from active to suspend or active to
power off (shutdown).
Optional properties:
-------------------
-maxim,fps-event-source: u32, FPS event source like external
hardware input to PMIC i.e. EN0, EN1 or
software (SW).
The macros are defined on
dt-bindings/mfd/max77620.h
for different control source.
- MAX77620_FPS_EVENT_SRC_EN0
for hardware input pin EN0.
- MAX77620_FPS_EVENT_SRC_EN1
for hardware input pin EN1.
- MAX77620_FPS_EVENT_SRC_SW
for software control.
-maxim,shutdown-fps-time-period-us: u32, FPS time period in microseconds
when system enters in to shutdown
state.
-maxim,suspend-fps-time-period-us: u32, FPS time period in microseconds
when system enters in to suspend state.
-maxim,device-state-on-disabled-event: u32, describe the PMIC state when FPS
event cleared (set to LOW) whether it
should go to sleep state or low-power
state. Following are valid values:
- MAX77620_FPS_INACTIVE_STATE_SLEEP
to set the PMIC state to sleep.
- MAX77620_FPS_INACTIVE_STATE_LOW_POWER
to set the PMIC state to low
power.
Absence of this property or other value
will not change device state when FPS
event get cleared.
Here supported time periods by device in microseconds are as follows:
MAX77620 supports 40, 80, 160, 320, 640, 1280, 2560 and 5120 microseconds.
MAX20024 supports 20, 40, 80, 160, 320, 640, 1280 and 2540 microseconds.
MAX77663 supports 20, 40, 80, 160, 320, 640, 1280 and 2540 microseconds.
-maxim,power-ok-control: configure map power ok bit
1: Enables POK(Power OK) to control nRST_IO and GPIO1
POK function.
0: Disables POK control.
if property missing, do not configure MPOK bit.
If POK mapping is enabled for GPIO1/nRST_IO then,
GPIO1/nRST_IO pins are HIGH only if all rails
that have POK control enabled are HIGH.
If any of the rails goes down(which are enabled for POK
control) then, GPIO1/nRST_IO goes LOW.
this property is valid for max20024 only.
For DT binding details of different sub modules like GPIO, pincontrol,
regulator, power, please refer respective device-tree binding document
under their respective sub-system directories.
Example:
--------
#include <dt-bindings/mfd/max77620.h>
max77620@3c {
compatible = "maxim,max77620";
reg = <0x3c>;
interrupt-parent = <&intc>;
interrupts = <0 86 IRQ_TYPE_NONE>;
interrupt-controller;
#interrupt-cells = <2>;
fps {
fps0 {
maxim,shutdown-fps-time-period-us = <1280>;
maxim,fps-event-source = <MAX77620_FPS_EVENT_SRC_EN1>;
};
fps1 {
maxim,shutdown-fps-time-period-us = <1280>;
maxim,fps-event-source = <MAX77620_FPS_EVENT_SRC_EN0>;
};
fps2 {
maxim,shutdown-fps-time-period-us = <1280>;
maxim,fps-event-source = <MAX77620_FPS_EVENT_SRC_SW>;
};
};
};

View File

@ -0,0 +1,444 @@
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/mfd/maxim,max77620.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: MAX77620 Power management IC from Maxim Semiconductor
maintainers:
- Svyatoslav Ryhel <clamor95@gmail.com>
properties:
compatible:
enum:
- maxim,max20024
- maxim,max77620
- maxim,max77663
reg:
description:
Can contain an optional second I2C address pointing to the PMIC's
RTC device. If no RTC address is provided, a default address specific
to this PMIC will be used.
minItems: 1
maxItems: 2
reg-names:
items:
- const: pmic
- const: rtc
interrupts:
maxItems: 1
interrupt-controller: true
"#interrupt-cells":
const: 2
gpio-controller: true
"#gpio-cells":
const: 2
description:
Device has 8 GPIO pins which can be configured as GPIO as well as
the special IO functions. The first cell is the pin number, and the
second cell is used to specify the gpio polarity (GPIO_ACTIVE_HIGH or
GPIO_ACTIVE_LOW).
system-power-controller: true
"#thermal-sensor-cells":
const: 0
description:
Maxim Semiconductor MAX77620 supports alarm interrupts when its
die temperature crosses 120C and 140C. These threshold temperatures
are not configurable. Device does not provide the real temperature
of die other than just indicating whether temperature is above or
below threshold level.
fps:
type: object
additionalProperties: false
description: |
The Flexible Power Sequencer (FPS) allows each regulator to power up
under hardware or software control. Additionally, each regulator can
power on independently or among a group of other regulators with an
adjustable power-up and power-down delays (sequencing). GPIO1, GPIO2,
and GPIO3 can be programmed to be part of a sequence allowing external
regulators to be sequenced along with internal regulators. 32KHz clock
can be programmed to be part of a sequence.
The flexible sequencing structure consists of two hardware enable inputs
(EN0, EN1), and 3 master sequencing timers called FPS0, FPS1 and FPS2.
Each master sequencing timer is programmable through its configuration
register to have a hardware enable source (EN1 or EN2) or a software enable
source (SW). When enabled/disabled, the master sequencing timer generates
eight sequencing events on different time periods called slots. The time
period between each event is programmable within the configuration register.
Each regulator, GPIO1, GPIO2, GPIO3, and 32KHz clock has a flexible power
sequence slave register which allows its enable source to be specified as
a flexible power sequencer timer or a software bit. When a FPS source of
regulators, GPIOs and clocks specifies the enable source to be a flexible
power sequencer, the power up and power down delays can be specified in
the regulators, GPIOs and clocks flexible power sequencer configuration
registers.
When FPS event cleared (set to LOW), regulators, GPIOs and 32KHz clock
are set into following state at the sequencing event that corresponds
to its flexible sequencer configuration register.
Sleep state: In this state, regulators, GPIOs and 32KHz clock get disabled
at the sequencing event.
Global Low Power Mode (GLPM): In this state, regulators are set in low
power mode at the sequencing event.
The configuration parameters of FPS is provided through sub-node "fps"
and their child for FPS specific. The child node name for FPS are "fps0",
"fps1", and "fps2" for FPS0, FPS1 and FPS2 respectively.
The FPS configurations like FPS source, power up and power down slots for
regulators, GPIOs and 32kHz clocks are provided in their respective
configuration nodes which is explained in respective sub-system DT
binding document.
There is need for different FPS configuration parameters based on system
state like when system state changed from active to suspend or active to
power off (shutdown).
patternProperties:
"^fps[0-2]$":
type: object
additionalProperties: false
properties:
maxim,fps-event-source:
$ref: /schemas/types.yaml#/definitions/uint32
description: |
FPS event source like external hardware input to PMIC i.e. EN0, EN1
or software (SW).
The macros are defined on dt-bindings/mfd/max77620.h for different
control source.
- MAX77620_FPS_EVENT_SRC_EN0 for hardware input pin EN0.
- MAX77620_FPS_EVENT_SRC_EN1 for hardware input pin EN1.
- MAX77620_FPS_EVENT_SRC_SW for software control.
maxim,shutdown-fps-time-period-us:
description:
FPS time period in microseconds when system enters in to shutdown state.
maxim,suspend-fps-time-period-us:
description:
FPS time period in microseconds when system enters in to suspend state.
maxim,device-state-on-disabled-event:
$ref: /schemas/types.yaml#/definitions/uint32
description: |
Describe the PMIC state when FPS event cleared (set to LOW) whether it
should go to sleep state or low-power state. Following are valid values:
- MAX77620_FPS_INACTIVE_STATE_SLEEP to set the PMIC state to sleep.
- MAX77620_FPS_INACTIVE_STATE_LOW_POWER to set the PMIC state to low
power.
Absence of this property or other value will not change device state
when FPS event get cleared.
maxim,power-ok-control:
$ref: /schemas/types.yaml#/definitions/uint32
description: |
Configure map power ok bit
1: Enables POK(Power OK) to control nRST_IO and GPIO1 POK function.
0: Disables POK control.
If property missing, do not configure MPOK bit. If POK mapping is
enabled for GPIO1/nRST_IO then, GPIO1/nRST_IO pins are HIGH only if
all rails that have POK control enabled are HIGH. If any of the rails
goes down (which are enabled for POK control) then, GPIO1/nRST_IO
goes LOW.
enum: [0, 1]
pinmux:
$ref: /schemas/pinctrl/maxim,max77620-pinctrl.yaml
regulators:
$ref: /schemas/regulator/maxim,max77620-regulator.yaml
allOf:
- if:
properties:
compatible:
contains:
enum:
- maxim,max20024
- maxim,max77663
then:
properties:
"#thermal-sensor-cells": false
fps:
patternProperties:
"^fps[0-2]$":
properties:
maxim,shutdown-fps-time-period-us:
enum: [20, 40, 80, 160, 320, 640, 1280, 2540]
maxim,suspend-fps-time-period-us:
enum: [20, 40, 80, 160, 320, 640, 1280, 2540]
maxim,power-ok-control: false
- if:
properties:
compatible:
contains:
const: maxim,max77620
then:
properties:
fps:
patternProperties:
"^fps[0-2]$":
properties:
maxim,shutdown-fps-time-period-us:
enum: [40, 80, 160, 320, 640, 1280, 2560, 5120]
maxim,suspend-fps-time-period-us:
enum: [40, 80, 160, 320, 640, 1280, 2560, 5120]
- if:
properties:
compatible:
not:
contains:
const: maxim,max77663
then:
properties:
reg-names: false
required:
- compatible
- reg
additionalProperties: false
examples:
- |
#include <dt-bindings/interrupt-controller/irq.h>
#include <dt-bindings/mfd/max77620.h>
i2c {
#address-cells = <1>;
#size-cells = <0>;
pmic@3c {
compatible = "maxim,max77620";
reg = <0x3c>;
interrupt-parent = <&gpio>;
interrupts = <86 IRQ_TYPE_LEVEL_HIGH>;
interrupt-controller;
#interrupt-cells = <2>;
gpio-controller;
#gpio-cells = <2>;
#thermal-sensor-cells = <0>;
system-power-controller;
pinctrl-names = "default";
pinctrl-0 = <&max77620_default>;
max77620_default: pinmux {
gpio0 {
pins = "gpio0";
function = "gpio";
};
gpio1 {
pins = "gpio1";
function = "fps-out";
maxim,active-fps-source = <MAX77620_FPS_SRC_0>;
};
gpio2 {
pins = "gpio2";
function = "fps-out";
maxim,active-fps-source = <MAX77620_FPS_SRC_1>;
};
gpio3 {
pins = "gpio3";
function = "gpio";
};
gpio4 {
pins = "gpio4";
function = "32k-out1";
};
gpio5-6 {
pins = "gpio5", "gpio6";
function = "gpio";
drive-push-pull = <1>;
};
gpio7 {
pins = "gpio7";
function = "gpio";
};
};
fps {
fps0 {
maxim,shutdown-fps-time-period-us = <1280>;
maxim,fps-event-source = <MAX77620_FPS_EVENT_SRC_EN0>;
};
fps1 {
maxim,shutdown-fps-time-period-us = <1280>;
maxim,fps-event-source = <MAX77620_FPS_EVENT_SRC_EN1>;
};
fps2 {
maxim,shutdown-fps-time-period-us = <1280>;
maxim,fps-event-source = <MAX77620_FPS_EVENT_SRC_SW>;
};
};
regulators {
in-sd0-supply = <&vdd_5v0_vbus>;
in-sd1-supply = <&vdd_5v0_vbus>;
in-sd2-supply = <&vdd_5v0_vbus>;
in-sd3-supply = <&vdd_5v0_vbus>;
in-ldo0-1-supply = <&vdd_1v8_vio>;
in-ldo2-supply = <&vdd_3v3_vbat>;
in-ldo3-5-supply = <&vdd_3v3_vbat>;
in-ldo4-6-supply = <&vdd_3v3_vbat>;
in-ldo7-8-supply = <&vdd_1v8_vio>;
sd0 {
regulator-name = "vdd_cpu";
regulator-min-microvolt = <800000>;
regulator-max-microvolt = <1250000>;
regulator-always-on;
regulator-boot-on;
maxim,active-fps-source = <MAX77620_FPS_SRC_NONE>;
};
sd1 {
regulator-name = "vdd_core";
regulator-min-microvolt = <950000>;
regulator-max-microvolt = <1350000>;
regulator-always-on;
regulator-boot-on;
maxim,active-fps-source = <MAX77620_FPS_SRC_1>;
};
vdd_1v8_vio: sd2 {
regulator-name = "vdd_1v8_gen";
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
regulator-always-on;
regulator-boot-on;
maxim,active-fps-source = <MAX77620_FPS_SRC_NONE>;
};
sd3 {
regulator-name = "vddio_ddr";
regulator-min-microvolt = <1200000>;
regulator-max-microvolt = <1200000>;
regulator-always-on;
regulator-boot-on;
maxim,active-fps-source = <MAX77620_FPS_SRC_NONE>;
};
ldo0 {
regulator-name = "avdd_pll";
regulator-min-microvolt = <1200000>;
regulator-max-microvolt = <1200000>;
regulator-always-on;
regulator-boot-on;
maxim,active-fps-source = <MAX77620_FPS_SRC_1>;
};
ldo1 {
regulator-name = "vdd_ddr_hs";
regulator-min-microvolt = <1000000>;
regulator-max-microvolt = <1000000>;
regulator-always-on;
regulator-boot-on;
maxim,active-fps-source = <MAX77620_FPS_SRC_NONE>;
};
ldo2 {
regulator-name = "avdd_usb";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
maxim,active-fps-source = <MAX77620_FPS_SRC_NONE>;
};
ldo3 {
regulator-name = "vdd_sdmmc3";
regulator-min-microvolt = <3000000>;
regulator-max-microvolt = <3000000>;
regulator-always-on;
maxim,active-fps-source = <MAX77620_FPS_SRC_NONE>;
};
ldo4 {
regulator-name = "vdd_rtc";
regulator-min-microvolt = <1200000>;
regulator-max-microvolt = <1200000>;
regulator-always-on;
regulator-boot-on;
maxim,active-fps-source = <MAX77620_FPS_SRC_0>;
};
ldo5 {
regulator-name = "vdd_ddr_rx";
regulator-min-microvolt = <2850000>;
regulator-max-microvolt = <2850000>;
regulator-always-on;
regulator-boot-on;
maxim,active-fps-source = <MAX77620_FPS_SRC_0>;
};
ldo6 {
regulator-name = "avdd_osc";
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
regulator-always-on;
regulator-boot-on;
maxim,active-fps-source = <MAX77620_FPS_SRC_NONE>;
};
ldo7 {
regulator-name = "vdd_1v2_mhl";
regulator-min-microvolt = <1050000>;
regulator-max-microvolt = <1250000>;
maxim,active-fps-source = <MAX77620_FPS_SRC_NONE>;
};
ldo8 {
regulator-name = "avdd_dsi_csi";
regulator-min-microvolt = <1200000>;
regulator-max-microvolt = <1200000>;
maxim,active-fps-source = <MAX77620_FPS_SRC_NONE>;
};
};
};
};
...

View File

@ -4,19 +4,19 @@
$id: http://devicetree.org/schemas/mfd/rohm,bd72720-pmic.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: ROHM BD72720 Power Management Integrated Circuit
title: ROHM BD72720 and BD73900 Power Management Integrated Circuits
maintainers:
- Matti Vaittinen <mazziesaccount@gmail.com>
description:
BD72720 is a single-chip power management IC for battery-powered portable
devices. The BD72720 integrates 10 bucks and 11 LDOs, and a 3000 mA
switching charger. The IC also includes a Coulomb counter, a real-time
clock (RTC), GPIOs and a 32.768 kHz clock gate.
BD72720 and BD73900 are single-chip power management ICs for
battery-powered portable devices. They integrate 10 bucks and 11 LDOs,
and a 3000 mA switching charger. ICs also include a Coulomb counter,
a real-time clock (RTC), GPIOs and a 32.768 kHz clock gate.
# In addition to the properties found from the charger node, the ROHM BD72720
# uses properties from a static battery node. Please see the:
# In addition to the properties found from the charger node, PMICs
# use properties from a static battery node. Please see the:
# Documentation/devicetree/bindings/power/supply/battery.yaml
#
# Following properties are used
@ -48,7 +48,12 @@ description:
properties:
compatible:
const: rohm,bd72720
oneOf:
- const: rohm,bd72720
- items:
- const: rohm,bd73900
- const: rohm,bd72720
reg:
description:
@ -84,7 +89,7 @@ properties:
minimum: 10000
maximum: 50000
description:
BD72720 has a SAR ADC for measuring charging currents. External sense
PMIC has a SAR ADC for measuring charging currents. External sense
resistor (RSENSE in data sheet) should be used. If some other but
30 mOhm resistor is used the resistance value should be given here in
micro Ohms.
@ -100,7 +105,7 @@ properties:
rohm,pin-fault_b:
$ref: /schemas/types.yaml#/definitions/string
description:
BD72720 has an OTP option to use fault_b-pin for different
PMIC has an OTP option to use fault_b-pin for different
purposes. Set this property accordingly. OTP options are
OTP0 - bi-directional FAULT_B or READY indicator depending on a
'sub option'
@ -116,7 +121,7 @@ patternProperties:
"^rohm,pin-dvs[0-1]$":
$ref: /schemas/types.yaml#/definitions/string
description:
BD72720 has 4 different OTP options to determine the use of dvs<X>-pins.
PMIC has 4 different OTP options to determine the use of dvs<X>-pins.
OTP0 - regulator RUN state control.
OTP1 - GPI.
OTP2 - GPO.
@ -130,7 +135,7 @@ patternProperties:
"^rohm,pin-exten[0-1]$":
$ref: /schemas/types.yaml#/definitions/string
description: BD72720 has an OTP option to use exten0-pin for different
description: PMIC has an OTP option to use exten0-pin for different
purposes. Set this property accordingly.
OTP0 - GPO
OTP1 - Power sequencer output.

View File

@ -1,70 +0,0 @@
Thermal driver for MAX77620 Power management IC from Maxim Semiconductor.
Maxim Semiconductor MAX77620 supports alarm interrupts when its
die temperature crosses 120C and 140C. These threshold temperatures
are not configurable. Device does not provide the real temperature
of die other than just indicating whether temperature is above or
below threshold level.
Required properties:
-------------------
#thermal-sensor-cells: For more details, please refer to
<devicetree/bindings/thermal/thermal-sensor.yaml>
The value must be 0.
For more details, please refer generic thermal DT binding document
<devicetree/bindings/thermal/thermal*.yaml>.
Please refer <devicetree/bindings/mfd/max77620.txt> for mfd DT binding
document for the MAX77620.
Example:
--------
#include <dt-bindings/mfd/max77620.h>
#include <dt-bindings/thermal/thermal.h>
...
i2c@7000d000 {
spmic: max77620@3c {
compatible = "maxim,max77620";
:::::
#thermal-sensor-cells = <0>;
:::
};
};
cool_dev: cool-dev {
compatible = "cooling-dev";
#cooling-cells = <2>;
};
thermal-zones {
PMIC-Die {
polling-delay = <0>;
polling-delay-passive = <0>;
thermal-sensors = <&spmic>;
trips {
pmic_die_warn_temp_thresh: hot-die {
temperature = <120000>;
type = "hot";
hysteresis = <0>;
};
pmic_die_cirt_temp_thresh: cirtical-die {
temperature = <140000>;
type = "critical";
hysteresis = <0>;
};
};
cooling-maps {
map0 {
trip = <&pmic_die_warn_temp_thresh>;
cooling-device = <&cool_dev THERMAL_NO_LIMIT
THERMAL_NO_LIMIT>;
contribution = <100>;
};
};
};
};

View File

@ -108,10 +108,19 @@ static int atmel_hlcdc_probe(struct platform_device *pdev)
return PTR_ERR(hlcdc->periph_clk);
}
/*
* Retrieve one of the primary clocks required for LCD operation:
* prefer sys_clk (for RGB/MIPI), and fall back to lvds_pll_clk
* (for LVDS) if needed.
*/
hlcdc->sys_clk = devm_clk_get(dev, "sys_clk");
if (IS_ERR(hlcdc->sys_clk)) {
dev_err(dev, "failed to get system clock\n");
return PTR_ERR(hlcdc->sys_clk);
hlcdc->sys_clk = NULL;
hlcdc->lvds_pll_clk = devm_clk_get(dev, "lvds_pll_clk");
if (IS_ERR(hlcdc->lvds_pll_clk)) {
dev_err(dev, "Failed to obtain both the LCDC (generic) and LVDS PLL clocks\n");
return PTR_ERR(hlcdc->lvds_pll_clk);
}
}
hlcdc->slow_clk = devm_clk_get(dev, "slow_clk");

View File

@ -81,6 +81,7 @@ static int bcm2835_pm_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, pm);
pm->dev = dev;
pm->soc = (uintptr_t)device_get_match_data(dev);
ret = bcm2835_pm_get_pdata(pdev, pm);
if (ret)
@ -97,7 +98,7 @@ static int bcm2835_pm_probe(struct platform_device *pdev)
* bcm2835-pm binding as the key for whether we can reference
* the full PM register range and support power domains.
*/
if (pm->asb)
if (pm->asb || pm->soc == BCM2835_PM_SOC_BCM2712)
return devm_mfd_add_devices(dev, -1, bcm2835_power_devs,
ARRAY_SIZE(bcm2835_power_devs),
NULL, 0, NULL);
@ -106,9 +107,9 @@ static int bcm2835_pm_probe(struct platform_device *pdev)
static const struct of_device_id bcm2835_pm_of_match[] = {
{ .compatible = "brcm,bcm2835-pm-wdt", },
{ .compatible = "brcm,bcm2835-pm", },
{ .compatible = "brcm,bcm2711-pm", },
{ .compatible = "brcm,bcm2712-pm", },
{ .compatible = "brcm,bcm2835-pm", .data = (void *)BCM2835_PM_SOC_BCM2835 },
{ .compatible = "brcm,bcm2711-pm", .data = (void *)BCM2835_PM_SOC_BCM2711 },
{ .compatible = "brcm,bcm2712-pm", .data = (void *)BCM2835_PM_SOC_BCM2712 },
{},
};
MODULE_DEVICE_TABLE(of, bcm2835_pm_of_match);

View File

@ -424,8 +424,8 @@ static void free_rx_slot(struct dln2_dev *dln2, u16 handle, int slot)
}
static int _dln2_transfer(struct dln2_dev *dln2, u16 handle, u16 cmd,
const void *obuf, unsigned obuf_len,
void *ibuf, unsigned *ibuf_len)
const void *obuf, unsigned int obuf_len,
void *ibuf, unsigned int *ibuf_len)
{
int ret = 0;
int rx_slot;
@ -511,8 +511,8 @@ static int _dln2_transfer(struct dln2_dev *dln2, u16 handle, u16 cmd,
}
int dln2_transfer(struct platform_device *pdev, u16 cmd,
const void *obuf, unsigned obuf_len,
void *ibuf, unsigned *ibuf_len)
const void *obuf, unsigned int obuf_len,
void *ibuf, unsigned int *ibuf_len)
{
struct dln2_platform_data *dln2_pdata;
struct dln2_dev *dln2;
@ -583,10 +583,8 @@ static void dln2_free_rx_urbs(struct dln2_dev *dln2)
{
int i;
for (i = 0; i < DLN2_MAX_URBS; i++) {
for (i = 0; i < DLN2_MAX_URBS; i++)
usb_free_urb(dln2->rx_urb[i]);
kfree(dln2->rx_buf[i]);
}
}
static void dln2_stop_rx_urbs(struct dln2_dev *dln2)
@ -600,8 +598,6 @@ static void dln2_stop_rx_urbs(struct dln2_dev *dln2)
static void dln2_free(struct dln2_dev *dln2)
{
dln2_free_rx_urbs(dln2);
usb_put_dev(dln2->usb_dev);
kfree(dln2);
}
static int dln2_setup_rx_urbs(struct dln2_dev *dln2,
@ -609,9 +605,10 @@ static int dln2_setup_rx_urbs(struct dln2_dev *dln2,
{
int i;
const int rx_max_size = DLN2_RX_BUF_SIZE;
struct device *dev = &dln2->interface->dev;
for (i = 0; i < DLN2_MAX_URBS; i++) {
dln2->rx_buf[i] = kmalloc(rx_max_size, GFP_KERNEL);
dln2->rx_buf[i] = devm_kmalloc(dev, rx_max_size, GFP_KERNEL);
if (!dln2->rx_buf[i])
return -ENOMEM;
@ -778,13 +775,13 @@ static int dln2_probe(struct usb_interface *interface,
if (ret)
return ret;
dln2 = kzalloc_obj(*dln2);
dln2 = devm_kzalloc(dev, sizeof(*dln2), GFP_KERNEL);
if (!dln2)
return -ENOMEM;
dln2->ep_out = epout->bEndpointAddress;
dln2->ep_in = epin->bEndpointAddress;
dln2->usb_dev = usb_get_dev(interface_to_usbdev(interface));
dln2->usb_dev = interface_to_usbdev(interface);
dln2->interface = interface;
usb_set_intfdata(interface, dln2);
init_waitqueue_head(&dln2->disconnect_wq);

View File

@ -157,7 +157,7 @@ static int kb3930_probe(struct i2c_client *client)
if (ret)
return ret;
if (of_property_read_bool(np, "system-power-controller")) {
if (of_device_is_system_power_controller(np)) {
ddata->off_gpios =
devm_gpiod_get_array_optional(dev, "off", GPIOD_IN);
if (IS_ERR(ddata->off_gpios))

View File

@ -375,8 +375,6 @@ static void ezx_pcap_remove(struct spi_device *spi)
/* cleanup irqchip */
for (i = pcap->irq_base; i < (pcap->irq_base + PCAP_NIRQS); i++)
irq_set_chip_and_handler(i, NULL, NULL);
destroy_workqueue(pcap->workqueue);
}
static int ezx_pcap_probe(struct spi_device *spi)
@ -384,17 +382,15 @@ static int ezx_pcap_probe(struct spi_device *spi)
struct pcap_platform_data *pdata = dev_get_platdata(&spi->dev);
struct pcap_chip *pcap;
int i, adc_irq;
int ret = -ENODEV;
int ret;
/* platform data is required */
if (!pdata)
goto ret;
return -ENODEV;
pcap = devm_kzalloc(&spi->dev, sizeof(*pcap), GFP_KERNEL);
if (!pcap) {
ret = -ENOMEM;
goto ret;
}
if (!pcap)
return -ENOMEM;
spin_lock_init(&pcap->io_lock);
spin_lock_init(&pcap->adc_lock);
@ -407,18 +403,15 @@ static int ezx_pcap_probe(struct spi_device *spi)
spi->mode = SPI_MODE_0 | (pdata->config & PCAP_CS_AH ? SPI_CS_HIGH : 0);
ret = spi_setup(spi);
if (ret)
goto ret;
return ret;
pcap->spi = spi;
/* setup irq */
pcap->irq_base = pdata->irq_base;
pcap->workqueue = create_singlethread_workqueue("pcapd");
if (!pcap->workqueue) {
ret = -ENOMEM;
dev_err(&spi->dev, "can't create pcap thread\n");
goto ret;
}
pcap->workqueue = devm_alloc_ordered_workqueue(&spi->dev, "pcapd", 0);
if (!pcap->workqueue)
return -ENOMEM;
/* redirect interrupts to AP, except adcdone2 */
if (!(pdata->config & PCAP_SECOND_PORT))
@ -468,9 +461,7 @@ static int ezx_pcap_probe(struct spi_device *spi)
free_irqchip:
for (i = pcap->irq_base; i < (pcap->irq_base + PCAP_NIRQS); i++)
irq_set_chip_and_handler(i, NULL, NULL);
/* destroy_workqueue: */
destroy_workqueue(pcap->workqueue);
ret:
return ret;
}

View File

@ -633,6 +633,19 @@ static const struct pci_device_id intel_lpss_pci_ids[] = {
{ PCI_VDEVICE(INTEL, 0xa879), (kernel_ulong_t)&ehl_i2c_info },
{ PCI_VDEVICE(INTEL, 0xa87a), (kernel_ulong_t)&ehl_i2c_info },
{ PCI_VDEVICE(INTEL, 0xa87b), (kernel_ulong_t)&ehl_i2c_info },
/* NVL-H */
{ PCI_VDEVICE(INTEL, 0xd325), (kernel_ulong_t)&bxt_uart_info },
{ PCI_VDEVICE(INTEL, 0xd326), (kernel_ulong_t)&bxt_uart_info },
{ PCI_VDEVICE(INTEL, 0xd327), (kernel_ulong_t)&tgl_spi_info },
{ PCI_VDEVICE(INTEL, 0xd330), (kernel_ulong_t)&tgl_spi_info },
{ PCI_VDEVICE(INTEL, 0xd347), (kernel_ulong_t)&tgl_spi_info },
{ PCI_VDEVICE(INTEL, 0xd350), (kernel_ulong_t)&ehl_i2c_info },
{ PCI_VDEVICE(INTEL, 0xd351), (kernel_ulong_t)&ehl_i2c_info },
{ PCI_VDEVICE(INTEL, 0xd352), (kernel_ulong_t)&bxt_uart_info },
{ PCI_VDEVICE(INTEL, 0xd378), (kernel_ulong_t)&ehl_i2c_info },
{ PCI_VDEVICE(INTEL, 0xd379), (kernel_ulong_t)&ehl_i2c_info },
{ PCI_VDEVICE(INTEL, 0xd37a), (kernel_ulong_t)&ehl_i2c_info },
{ PCI_VDEVICE(INTEL, 0xd37b), (kernel_ulong_t)&ehl_i2c_info },
/* PTL-H */
{ PCI_VDEVICE(INTEL, 0xe325), (kernel_ulong_t)&bxt_uart_info },
{ PCI_VDEVICE(INTEL, 0xe326), (kernel_ulong_t)&bxt_uart_info },

View File

@ -45,6 +45,7 @@
#include <linux/acpi.h>
#include <linux/pci.h>
#include <linux/pinctrl/pinctrl.h>
#include <linux/property.h>
#include <linux/mfd/core.h>
#include <linux/mfd/lpc_ich.h>
#include <linux/platform_data/itco_wdt.h>
@ -125,11 +126,17 @@ static struct mfd_cell lpc_ich_wdt_cell = {
.ignore_resource_conflicts = true,
};
const struct software_node lpc_ich_gpio_swnode = {
.name = "gpio_ich",
};
EXPORT_SYMBOL_NS(lpc_ich_gpio_swnode, "LPC_ICH");
static struct mfd_cell lpc_ich_gpio_cell = {
.name = "gpio_ich",
.num_resources = ARRAY_SIZE(gpio_ich_res),
.resources = gpio_ich_res,
.ignore_resource_conflicts = true,
.swnode = &lpc_ich_gpio_swnode,
};
#define INTEL_GPIO_RESOURCE_SIZE 0x1000

View File

@ -46,6 +46,7 @@
static const struct mfd_cell apple_smc_devs[] = {
MFD_CELL_NAME("macsmc-input"),
MFD_CELL_NAME("macsmc-power"),
MFD_CELL_OF("macsmc-gpio", NULL, NULL, 0, 0, "apple,smc-gpio"),
MFD_CELL_OF("macsmc-hwmon", NULL, NULL, 0, 0, "apple,smc-hwmon"),
MFD_CELL_OF("macsmc-reboot", NULL, NULL, 0, 0, "apple,smc-reboot"),

View File

@ -157,7 +157,7 @@ static int max77705_resume(struct device *dev)
return 0;
}
DEFINE_SIMPLE_DEV_PM_OPS(max77705_pm_ops, max77705_suspend, max77705_resume);
static DEFINE_SIMPLE_DEV_PM_OPS(max77705_pm_ops, max77705_suspend, max77705_resume);
static const struct of_device_id max77705_i2c_of_match[] = {
{ .compatible = "maxim,max77705" },

View File

@ -377,7 +377,7 @@ static int mc13xxx_add_subdevice_pdata(struct mc13xxx *mc13xxx,
if (snprintf(buf, sizeof(buf), format, name) > sizeof(buf))
return -E2BIG;
cell.name = kmemdup(buf, strlen(buf) + 1, GFP_KERNEL);
cell.name = devm_kmemdup(mc13xxx->dev, buf, strlen(buf) + 1, GFP_KERNEL);
if (!cell.name)
return -ENOMEM;

View File

@ -88,7 +88,17 @@ static void mfd_acpi_add_device(const struct mfd_cell *cell,
}
}
device_set_node(&pdev->dev, acpi_fwnode_handle(adev ?: parent));
/*
* NOTE: The fwnode design doesn't allow proper stacking/sharing. This
* should eventually turn into a device fwnode API call that will allow
* prepending to a list of fwnodes (with ACPI taking precedence).
*
* set_primary_fwnode() is used here, instead of device_set_node(), as
* device_set_node() will overwrite the existing fwnode, which may be an
* OF node that was populated earlier. To support a use case where ACPI
* and OF is used in conjunction, we call set_primary_fwnode() instead.
*/
set_primary_fwnode(&pdev->dev, acpi_fwnode_handle(adev ?: parent));
}
#else
static inline void mfd_acpi_add_device(const struct mfd_cell *cell,

View File

@ -297,7 +297,7 @@ static const struct chip_data mt6323_core = {
static const struct chip_data mt6328_core = {
.cid_addr = MT6328_HWCID,
.cid_shift = 0,
.cid_shift = 8,
.cells = mt6328_devs,
.cell_size = ARRAY_SIZE(mt6328_devs),
.irq_init = mt6397_irq_init,
@ -313,7 +313,7 @@ static const struct chip_data mt6357_core = {
static const struct chip_data mt6331_mt6332_core = {
.cid_addr = MT6331_HWCID,
.cid_shift = 0,
.cid_shift = 8,
.cells = mt6331_mt6332_devs,
.cell_size = ARRAY_SIZE(mt6331_mt6332_devs),
.irq_init = mt6397_irq_init,

View File

@ -41,6 +41,7 @@ static struct gpio_keys_button button = {
.code = KEY_POWER,
.gpio = -1,
.type = EV_KEY,
.wakeup = 1,
};
static const struct gpio_keys_platform_data bd71828_powerkey_data = {

View File

@ -16,6 +16,8 @@
#include <dt-bindings/mfd/st,stpmic1.h>
#define STPMIC1_MAX_RETRIES 2
#define STPMIC1_MAIN_IRQ 0
static const struct regmap_range stpmic1_readable_ranges[] = {
@ -121,9 +123,23 @@ static const struct regmap_irq_chip stpmic1_regmap_irq_chip = {
static int stpmic1_power_off(struct sys_off_data *data)
{
struct stpmic1 *ddata = data->cb_data;
int ret;
regmap_update_bits(ddata->regmap, MAIN_CR,
SOFTWARE_SWITCH_OFF, SOFTWARE_SWITCH_OFF);
/*
* Attempt to shut down again, in case the first attempt failed.
* The STPMIC1 might get confused and the first regmap_update_bits()
* returns with -ETIMEDOUT / -110 . If that or similar transient
* failure occurs, try to shut down again. If the second attempt
* fails, there is some bigger problem, report it to user.
*/
for (int retries = 0; retries < STPMIC1_MAX_RETRIES; retries++) {
ret = regmap_update_bits(ddata->regmap, MAIN_CR, SOFTWARE_SWITCH_OFF,
SOFTWARE_SWITCH_OFF);
if (!ret)
return NOTIFY_DONE;
}
dev_err(ddata->dev, "Failed to access PMIC I2C bus (%d)\n", ret);
return NOTIFY_DONE;
}

View File

@ -59,7 +59,7 @@ static int vprbrd_probe(struct usb_interface *interface,
mutex_init(&vb->lock);
vb->usb_dev = usb_get_dev(interface_to_usbdev(interface));
vb->usb_dev = interface_to_usbdev(interface);
/* save our data pointer in this interface device */
usb_set_intfdata(interface, vb);
@ -96,10 +96,8 @@ static int vprbrd_probe(struct usb_interface *interface,
return 0;
error:
if (vb) {
usb_put_dev(vb->usb_dev);
if (vb)
kfree(vb);
}
return ret;
}
@ -110,7 +108,6 @@ static void vprbrd_disconnect(struct usb_interface *interface)
mfd_remove_devices(&interface->dev);
usb_set_intfdata(interface, NULL);
usb_put_dev(vb->usb_dev);
kfree(vb);
dev_dbg(&interface->dev, "disconnected\n");

View File

@ -75,6 +75,7 @@
*/
struct atmel_hlcdc {
struct regmap *regmap;
struct clk *lvds_pll_clk;
struct clk *periph_clk;
struct clk *sys_clk;
struct clk *slow_clk;

View File

@ -5,11 +5,18 @@
#include <linux/regmap.h>
enum bcm2835_soc {
BCM2835_PM_SOC_BCM2835,
BCM2835_PM_SOC_BCM2711,
BCM2835_PM_SOC_BCM2712,
};
struct bcm2835_pm {
struct device *dev;
void __iomem *base;
void __iomem *asb;
void __iomem *rpivid_asb;
enum bcm2835_soc soc;
};
#endif /* BCM2835_MFD_PM_H */

View File

@ -26,8 +26,8 @@ struct cgbc_version {
* @io_cmd: Pointer to the command IO memory
* @session: Session id returned by the Board Controller
* @dev: Pointer to kernel device structure
* @cgbc_version: Board Controller version structure
* @mutex: Board Controller mutex
* @version: Board Controller version structure
* @lock: Board Controller mutex
*/
struct cgbc_device_data {
void __iomem *io_session;

View File

@ -98,10 +98,10 @@ struct kempld_device_data {
/**
* struct kempld_platform_data - PLD hardware configuration structure
* @pld_clock: PLD clock frequency
* @gpio_base GPIO base pin number
* @gpio_base: GPIO base pin number
* @ioresource: IO addresses of the PLD
* @get_mutex: PLD specific get_mutex callback
* @release_mutex: PLD specific release_mutex callback
* @get_hardware_mutex: PLD specific get_mutex callback
* @release_hardware_mutex: PLD specific release_mutex callback
* @get_info: PLD specific get_info callback
* @register_cells: PLD specific register_cells callback
*/

View File

@ -37,4 +37,6 @@ struct lpc_ich_info {
u8 use_gpio;
};
extern const struct software_node lpc_ich_gpio_swnode;
#endif

View File

@ -12,9 +12,9 @@
enum chip_id {
MT6323_CHIP_ID = 0x23,
MT6328_CHIP_ID = 0x30,
MT6331_CHIP_ID = 0x20,
MT6332_CHIP_ID = 0x20,
MT6328_CHIP_ID = 0x28,
MT6331_CHIP_ID = 0x31,
MT6332_CHIP_ID = 0x32,
MT6357_CHIP_ID = 0x57,
MT6358_CHIP_ID = 0x58,
MT6359_CHIP_ID = 0x59,

View File

@ -19,7 +19,6 @@ enum rsmu_type {
};
/**
*
* struct rsmu_ddata - device data structure for sub devices.
*
* @dev: i2c/spi device.

View File

@ -77,6 +77,7 @@ enum si476x_power_state {
* underlying "core" device which all the MFD cell-devices use.
*
* @client: Actual I2C client used to transfer commands to the chip.
* @regmap: Regmap for accessing the device registers
* @chip_id: Last digit of the chip model(E.g. "1" for SI4761)
* @cells: MFD cell devices created by this driver.
* @cmd_lock: Mutex used to serialize all the requests to the core
@ -100,16 +101,18 @@ enum si476x_power_state {
* @stc: Similar to @cts, but for the STC bit of the status value.
* @power_up_parameters: Parameters used as argument for POWER_UP
* command when the device is started.
* @state: Current power state of the device.
* @supplues: Structure containing handles to all power supplies used
* @power_state: Current power state of the device.
* @supplies: Structure containing handles to all power supplies used
* by the device (NULL ones are ignored).
* @gpio_reset: GPIO pin connectet to the RSTB pin of the chip.
* @pinmux: Chip's configurable pins configuration.
* @diversity_mode: Chips role when functioning in diversity mode.
* @is_alive: Chip is initialized and active.
* @status_monitor: Polling worker used in polling use case scenarion
* (when IRQ is not avalible).
* @revision: Chip's running firmware revision number(Used for correct
* command set support).
* @rds_fifo_depth: RDS FIFO size: 20 for IRQ mode or 5 for polling mode.
*/
struct si476x_core {
@ -166,6 +169,7 @@ static inline struct si476x_core *i2c_mfd_cell_to_core(struct device *dev)
/**
* si476x_core_lock() - lock the core device to get an exclusive access
* to it.
* @core: Core device structure
*/
static inline void si476x_core_lock(struct si476x_core *core)
{
@ -175,6 +179,7 @@ static inline void si476x_core_lock(struct si476x_core *core)
/**
* si476x_core_unlock() - unlock the core device to relinquish an
* exclusive access to it.
* @core: Core device structure
*/
static inline void si476x_core_unlock(struct si476x_core *core)
{
@ -246,9 +251,10 @@ static inline int si476x_to_v4l2(struct si476x_core *core, u16 freq)
* struct si476x_func_info - structure containing result of the
* FUNC_INFO command.
*
* @firmware: Firmware version numbers.
* @firmware.major: Firmware major number.
* @firmware.minor[...]: Firmware minor numbers.
* @patch_id:
* @patch_id: Firmware patch level.
* @func: Mode tuner is working in.
*/
struct si476x_func_info {
@ -318,8 +324,9 @@ enum si476x_smoothmetrics {
* @tp: Current channel's TP flag.
* @pty: Current channel's PTY code.
* @pi: Current channel's PI code.
* @rdsfifoused: Number of blocks remaining in the RDS FIFO (0 if
* empty).
* @rdsfifoused: Number of blocks remaining in the RDS FIFO (0 if empty).
* @ble:
* @rds: RDS data descriptor
*/
struct si476x_rds_status_report {
bool rdstpptyint, rdspiint, rdssyncint, rdsfifoint;