Commit cf8d7e38 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'mfd-for-linus-4.5' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd

Pull MFD updates from Lee Jones:
 "New Device Support:
   - Add support for s2mps15; sec-core
   - Add support for Lewisburg; lpc_ich
   - Add support for cs47l24 and wm1831; arizona

  New Functionality:
   - Allow user to select syscon register width; syscon

  Fix-ups:
   - Lots of Checkpatch fixes
   - Rename -pmic/-regulator; s2mps11
   - Build driver components into a single module; wm8994-*
   - Better handing of IRQ during suspend/resume; as3722
   - Constify things; da903x
   - Remove unused code; ab8500-core
   - Improve error handing; qcom_rpm
   - Simplify code: wm831x-otp, sta2x11-mfd
   - Improve locking; cros_ec_spi
   - Fix incorrect DT binding filename reference; arizona, palmas,
     snps-dwapb-gpio, wm8994

  Bug Fixes:
   - Fix broken SYSFS 'show ID' call; wm831x-otp
   - Protect reads from non-existent registers; qcom-spmi-pmic
   - Repair build warnings; as3722
   - Fix IRQ request ordering; arizona-irq
   - Ensure return value is boolean; ucb1x00-core, tps65010, tc6393xb,
     htc-egpio, dm355evm_msp, asic3"

* tag 'mfd-for-linus-4.5' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd: (58 commits)
  mfd: davinci_voicecodec: Remove pointless 'out of memory' error message
  mfd: da9052-irq: Fix trivial 'space before comma' error
  mfd: da9052-i2c: Fix tabbing/whitespace issue
  mfd: da903x: Fix white space and split string issues
  mfd: cs5535-mfd: Add missing line spacing and make local array static
  mfd: cros_ec_spi: Repair comparison ordering issue
  mfd: cros_ec_i2c: Fix trivial 'tabs before spaces' whitespace issue.
  mfd: asic3: Fix a plethora of Checkpatch errors and warnings
  mfd: as3711: Repair OOM and 'line over 80 chars' formatting warnings
  mfd: arizona-i2c: Add blank line formatting after declaration
  mfd: arizona-core: msleep() is unreliable for anything <20ms use usleep_range() instead
  mfd: adp5520: Some trivial 'no space before tab' fixes
  mfd: ab8500-sysctrl: Fix Constify, printk => pr_info and formatting issues
  mfd: ab8500-gpadc: Squash a whole bunch of Checkpatch warnings and one error
  mfd: ab8500-debugfs: Clean-up non-conforming commenting and print formatting
  mfd: ab8500-core: Fix many warnings reported by Checkpatch
  mfd: ab2100-otp: Remove pointless 'out of memory' error message
  mfd: ab3100-core.c: Fix multiple warnings reported by Checkpatch
  mfd: aat2870-core: Remove unnecessary 'out of memory' message
  mfd: 88pm860x-core: Fix commenting and declaration spacing
  ...
parents 5c43019f 9fb41166
Binding for Samsung S2M and S5M family clock generator block
============================================================
This is a part of device tree bindings for S2M and S5M family multi-function
devices.
More information can be found in bindings/mfd/sec-core.txt file.
The S2MPS11/13/15 and S5M8767 provide three(AP/CP/BT) buffered 32.768 kHz
outputs. The S2MPS14 provides two (AP/BT) buffered 32.768 KHz outputs.
To register these as clocks with common clock framework instantiate under
main device node a sub-node named "clocks".
It uses the common clock binding documented in:
- Documentation/devicetree/bindings/clock/clock-bindings.txt
Required properties of the "clocks" sub-node:
- #clock-cells: should be 1.
- compatible: Should be one of: "samsung,s2mps11-clk", "samsung,s2mps13-clk",
"samsung,s2mps14-clk", "samsung,s5m8767-clk"
The S2MPS15 uses the same compatible as S2MPS13, as both provides similar
clocks.
Each clock is assigned an identifier and client nodes use this identifier
to specify the clock which they consume.
Clock ID Devices
----------------------------------------------------------
32KhzAP 0 S2MPS11/13/14/15, S5M8767
32KhzCP 1 S2MPS11/13/15, S5M8767
32KhzBT 2 S2MPS11/13/14/15, S5M8767
Include dt-bindings/clock/samsung,s2mps11.h file to use preprocessor defines
in device tree sources.
Example:
s2mps11_pmic@66 {
compatible = "samsung,s2mps11-pmic";
reg = <0x66>;
s2m_osc: clocks {
compatible = "samsung,s2mps11-clk";
#clock-cells = <1>;
clock-output-names = "xx", "yy", "zz";
};
};
...@@ -24,7 +24,7 @@ controller. ...@@ -24,7 +24,7 @@ controller.
- #interrupt-cells : Specifies the number of cells needed to encode an - #interrupt-cells : Specifies the number of cells needed to encode an
interrupt. Shall be set to 2. The first cell defines the interrupt number, interrupt. Shall be set to 2. The first cell defines the interrupt number,
the second encodes the triger flags encoded as described in the second encodes the triger flags encoded as described in
Documentation/devicetree/bindings/interrupts.txt Documentation/devicetree/bindings/interrupt-controller/interrupts.txt
- interrupt-parent : The parent interrupt controller. - interrupt-parent : The parent interrupt controller.
- interrupts : The interrupt to the parent controller raised when GPIOs - interrupts : The interrupt to the parent controller raised when GPIOs
generate the interrupts. generate the interrupts.
......
Wolfson Arizona class audio SoCs Cirrus Logic/Wolfson Microelectronics Arizona class audio SoCs
These devices are audio SoCs with extensive digital capabilites and a range These devices are audio SoCs with extensive digital capabilites and a range
of analogue I/O. of analogue I/O.
...@@ -6,12 +6,14 @@ of analogue I/O. ...@@ -6,12 +6,14 @@ of analogue I/O.
Required properties: Required properties:
- compatible : One of the following chip-specific strings: - compatible : One of the following chip-specific strings:
"cirrus,cs47l24"
"wlf,wm5102" "wlf,wm5102"
"wlf,wm5110" "wlf,wm5110"
"wlf,wm8280" "wlf,wm8280"
"wlf,wm8997" "wlf,wm8997"
"wlf,wm8998" "wlf,wm8998"
"wlf,wm1814" "wlf,wm1814"
"wlf,wm1831"
- reg : I2C slave address when connected using I2C, chip select number when - reg : I2C slave address when connected using I2C, chip select number when
using SPI. using SPI.
...@@ -24,7 +26,7 @@ Required properties: ...@@ -24,7 +26,7 @@ Required properties:
- #interrupt-cells: the number of cells to describe an IRQ, this should be 2. - #interrupt-cells: the number of cells to describe an IRQ, this should be 2.
The first cell is the IRQ number. The first cell is the IRQ number.
The second cell is the flags, encoded as the trigger masks from The second cell is the flags, encoded as the trigger masks from
Documentation/devicetree/bindings/interrupts.txt Documentation/devicetree/bindings/interrupt-controller/interrupts.txt
- gpio-controller : Indicates this device is a GPIO controller. - gpio-controller : Indicates this device is a GPIO controller.
- #gpio-cells : Must be 2. The first cell is the pin number and the - #gpio-cells : Must be 2. The first cell is the pin number and the
...@@ -41,10 +43,21 @@ Required properties: ...@@ -41,10 +43,21 @@ Required properties:
- SPKVDD-supply : Speaker driver power supply (wm8997) - SPKVDD-supply : Speaker driver power supply (wm8997)
- DCVDD-supply : Main power supply (cs47l24, wm1831)
- MICVDD-supply : Microphone power supply (cs47l24, wm1831)
Optional properties: Optional properties:
- wlf,reset : GPIO specifier for the GPIO controlling /RESET - wlf,reset : GPIO specifier for the GPIO controlling /RESET
- clocks: Should reference the clocks supplied on MCLK1 and MCLK2
- clock-names: Should contains two strings:
"mclk1" for the clock supplied on MCLK1, recommended to be a high
quality audio reference clock
"mclk2" for the clock supplied on MCLK2, recommended to be an always on
32k clock
- wlf,gpio-defaults : A list of GPIO configuration register values. Defines - wlf,gpio-defaults : A list of GPIO configuration register values. Defines
for the appropriate values can found in <dt-bindings/mfd/arizona.txt>. If for the appropriate values can found in <dt-bindings/mfd/arizona.txt>. If
absent, no configuration of these registers is performed. If any entry has absent, no configuration of these registers is performed. If any entry has
...@@ -59,6 +72,12 @@ Optional properties: ...@@ -59,6 +72,12 @@ Optional properties:
that have not been specified are set to 0 by default. Entries are: that have not been specified are set to 0 by default. Entries are:
<IN1, IN2, IN3, IN4> (wm5102, wm5110, wm8280, wm8997) <IN1, IN2, IN3, IN4> (wm5102, wm5110, wm8280, wm8997)
<IN1A, IN2A, IN1B, IN2B> (wm8998, wm1814) <IN1A, IN2A, IN1B, IN2B> (wm8998, wm1814)
- wlf,out-mono : A list of boolean values indicating whether each output is
mono or stereo. Position within the list indicates the output affected
(eg. First entry in the list corresponds to output 1). A non-zero value
indicates a mono output. If present, the number of values should be less
than or equal to the number of outputs, if less values are supplied the
additional outputs will be treated as stereo.
- wlf,dmic-ref : DMIC reference voltage source for each input, can be - wlf,dmic-ref : DMIC reference voltage source for each input, can be
selected from either MICVDD or one of the MICBIAS's, defines selected from either MICVDD or one of the MICBIAS's, defines
...@@ -69,6 +88,7 @@ Optional properties: ...@@ -69,6 +88,7 @@ Optional properties:
- DCVDD-supply, MICVDD-supply : Power supplies, only need to be specified if - DCVDD-supply, MICVDD-supply : Power supplies, only need to be specified if
they are being externally supplied. As covered in they are being externally supplied. As covered in
Documentation/devicetree/bindings/regulator/regulator.txt Documentation/devicetree/bindings/regulator/regulator.txt
(wm5102, wm5110, wm8280, wm8997, wm8998, wm1814)
Also see child specific device properties: Also see child specific device properties:
Regulator - ../regulator/arizona-regulator.txt Regulator - ../regulator/arizona-regulator.txt
......
...@@ -24,7 +24,7 @@ and also the generic series names ...@@ -24,7 +24,7 @@ and also the generic series names
- #interrupt-cells : should be set to 2 for IRQ number and flags - #interrupt-cells : should be set to 2 for IRQ number and flags
The first cell is the IRQ number. The first cell is the IRQ number.
The second cell is the flags, encoded as the trigger masks from The second cell is the flags, encoded as the trigger masks from
Documentation/devicetree/bindings/interrupts.txt Documentation/devicetree/bindings/interrupt-controller/interrupts.txt
- interrupt-parent : The parent interrupt controller. - interrupt-parent : The parent interrupt controller.
Optional properties: Optional properties:
......
* Samsung S2MPS11/13/14/15 and S2MPU02 Voltage and Current Regulator
The Samsung S2MPS11 is a multi-function device which includes voltage and
current regulators, RTC, charger controller and other sub-blocks. It is
interfaced to the host controller using an I2C interface. Each sub-block is
addressed by the host system using different I2C slave addresses.
Required properties:
- compatible: Should be one of the following
- "samsung,s2mps11-pmic"
- "samsung,s2mps13-pmic"
- "samsung,s2mps14-pmic"
- "samsung,s2mps15-pmic"
- "samsung,s2mpu02-pmic".
- reg: Specifies the I2C slave address of the pmic block. It should be 0x66.
Optional properties:
- interrupt-parent: Specifies the phandle of the interrupt controller to which
the interrupts from s2mps11 are delivered to.
- interrupts: Interrupt specifiers for interrupt sources.
- samsung,s2mps11-wrstbi-ground: Indicates that WRSTBI pin of PMIC is pulled
down. When the system is suspended it will always go down thus triggerring
unwanted buck warm reset (setting buck voltages to default values).
- samsung,s2mps11-acokb-ground: Indicates that ACOKB pin of S2MPS11 PMIC is
connected to the ground so the PMIC must manually set PWRHOLD bit in CTRL1
register to turn off the power. Usually the ACOKB is pulled up to VBATT so
when PWRHOLD pin goes low, the rising ACOKB will trigger power off.
Optional nodes:
- clocks: s2mps11, s2mps13, s2mps15 and s5m8767 provide three(AP/CP/BT) buffered 32.768
KHz outputs, so to register these as clocks with common clock framework
instantiate a sub-node named "clocks". It uses the common clock binding
documented in :
[Documentation/devicetree/bindings/clock/clock-bindings.txt]
The s2mps14 provides two (AP/BT) buffered 32.768 KHz outputs.
- #clock-cells: should be 1.
- The following is the list of clocks generated by the controller. Each clock
is assigned an identifier and client nodes use this identifier to specify
the clock which they consume.
Clock ID Devices
----------------------------------------------------------
32KhzAP 0 S2MPS11, S2MPS13, S2MPS14, S2MPS15, S5M8767
32KhzCP 1 S2MPS11, S2MPS13, S2MPS15, S5M8767
32KhzBT 2 S2MPS11, S2MPS13, S2MPS14, S2MPS15, S5M8767
- compatible: Should be one of: "samsung,s2mps11-clk", "samsung,s2mps13-clk",
"samsung,s2mps14-clk", "samsung,s5m8767-clk"
The s2msp15 uses the same compatible as s2mps13, as both provides similar clocks.
- regulators: The regulators of s2mps11 that have to be instantiated should be
included in a sub-node named 'regulators'. Regulator nodes included in this
sub-node should be of the format as listed below.
regulator_name {
[standard regulator constraints....];
};
regulator-ramp-delay for BUCKs = [6250/12500/25000(default)/50000] uV/us
BUCK[2/3/4/6] supports disabling ramp delay on hardware, so explicitly
regulator-ramp-delay = <0> can be used for them to disable ramp delay.
In the absence of the regulator-ramp-delay property, the default ramp
delay will be used.
NOTE: Some BUCKs share the ramp rate setting i.e. same ramp value will be set
for a particular group of BUCKs. So provide same regulator-ramp-delay<value>.
Grouping of BUCKs sharing ramp rate setting is as follow : BUCK[1, 6],
BUCK[3, 4], and BUCK[7, 8, 10]
On S2MPS14 the LDO10, LDO11 and LDO12 can be configured to external control
over GPIO. To turn this feature on this property must be added to the regulator
sub-node:
- samsung,ext-control-gpios: GPIO specifier for one GPIO
controlling this regulator (enable/disable);
Example:
LDO12 {
regulator-name = "V_EMMC_2.8V";
regulator-min-microvolt = <2800000>;
regulator-max-microvolt = <2800000>;
samsung,ext-control-gpios = <&gpk0 2 0>;
};
The regulator constraints inside the regulator nodes use the standard regulator
bindings which are documented elsewhere.
The following are the names of the regulators that the s2mps11 pmic block
supports. Note: The 'n' in LDOn and BUCKn represents the LDO or BUCK number
as per the datasheet of s2mps11.
- LDOn
- valid values for n are:
- S2MPS11: 1 to 38
- S2MPS13: 1 to 40
- S2MPS14: 1 to 25
- S2MPS15: 1 to 27
- S2MPU02: 1 to 28
- Example: LDO1, LDO2, LDO28
- BUCKn
- valid values for n are:
- S2MPS11: 1 to 10
- S2MPS13: 1 to 10
- S2MPS14: 1 to 5
- S2MPS15: 1 to 10
- S2MPU02: 1 to 7
- Example: BUCK1, BUCK2, BUCK9
Example:
s2mps11_pmic@66 {
compatible = "samsung,s2mps11-pmic";
reg = <0x66>;
s2m_osc: clocks {
compatible = "samsung,s2mps11-clk";
#clock-cells = <1>;
clock-output-names = "xx", "yy", "zz";
};
regulators {
ldo1_reg: LDO1 {
regulator-name = "VDD_ABB_3.3V";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
};
ldo2_reg: LDO2 {
regulator-name = "VDD_ALIVE_1.1V";
regulator-min-microvolt = <1100000>;
regulator-max-microvolt = <1100000>;
regulator-always-on;
};
buck1_reg: BUCK1 {
regulator-name = "vdd_mif";
regulator-min-microvolt = <950000>;
regulator-max-microvolt = <1350000>;
regulator-always-on;
regulator-boot-on;
};
buck2_reg: BUCK2 {
regulator-name = "vdd_arm";
regulator-min-microvolt = <950000>;
regulator-max-microvolt = <1350000>;
regulator-always-on;
regulator-boot-on;
regulator-ramp-delay = <50000>;
};
};
};
Binding for Samsung S2M and S5M family multi-function device
============================================================
This is a part of device tree bindings for S2M and S5M family multi-function
devices.
The Samsung S2MPA01, S2MPS11/13/14/15, S2MPU02 and S5M8767 is a family
of multi-function devices which include voltage and current regulators, RTC,
charger controller, clock outputs and other sub-blocks. It is interfaced
to the host controller using an I2C interface. Each sub-block is usually
addressed by the host system using different I2C slave addresses.
This document describes bindings for main device node. Optional sub-blocks
must be a sub-nodes to it. Bindings for them can be found in:
- bindings/regulator/samsung,s2mpa01.txt
- bindings/regulator/samsung,s2mps11.txt
- bindings/regulator/samsung,s5m8767.txt
- bindings/clock/samsung,s2mps11.txt
Required properties:
- compatible: Should be one of the following
- "samsung,s2mpa01-pmic",
- "samsung,s2mps11-pmic",
- "samsung,s2mps13-pmic",
- "samsung,s2mps14-pmic",
- "samsung,s2mps15-pmic",
- "samsung,s2mpu02-pmic",
- "samsung,s5m8767-pmic".
- reg: Specifies the I2C slave address of the pmic block. It should be 0x66.
Optional properties:
- interrupt-parent: Specifies the phandle of the interrupt controller to which
the interrupts from s2mps11 are delivered to.
- interrupts: Interrupt specifiers for interrupt sources.
- samsung,s2mps11-wrstbi-ground: Indicates that WRSTBI pin of PMIC is pulled
down. When the system is suspended it will always go down thus triggerring
unwanted buck warm reset (setting buck voltages to default values).
- samsung,s2mps11-acokb-ground: Indicates that ACOKB pin of S2MPS11 PMIC is
connected to the ground so the PMIC must manually set PWRHOLD bit in CTRL1
register to turn off the power. Usually the ACOKB is pulled up to VBATT so
when PWRHOLD pin goes low, the rising ACOKB will trigger power off.
Example:
s2mps11_pmic@66 {
compatible = "samsung,s2mps11-pmic";
reg = <0x66>;
s2m_osc: clocks {
compatible = "samsung,s2mps11-clk";
#clock-cells = <1>;
clock-output-names = "xx", "yy", "zz";
};
regulators {
ldo1_reg: LDO1 {
regulator-name = "VDD_ABB_3.3V";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
};
ldo2_reg: LDO2 {
regulator-name = "VDD_ALIVE_1.1V";
regulator-min-microvolt = <1100000>;
regulator-max-microvolt = <1100000>;
regulator-always-on;
};
buck1_reg: BUCK1 {
regulator-name = "vdd_mif";
regulator-min-microvolt = <950000>;
regulator-max-microvolt = <1350000>;
regulator-always-on;
regulator-boot-on;
};
buck2_reg: BUCK2 {
regulator-name = "vdd_arm";
regulator-min-microvolt = <950000>;
regulator-max-microvolt = <1350000>;
regulator-always-on;
regulator-boot-on;
regulator-ramp-delay = <50000>;
};
};
};
...@@ -13,6 +13,10 @@ Required properties: ...@@ -13,6 +13,10 @@ Required properties:
- compatible: Should contain "syscon". - compatible: Should contain "syscon".
- reg: the register region can be accessed from syscon - reg: the register region can be accessed from syscon
Optional property:
- reg-io-width: the size (in bytes) of the IO accesses that should be
performed on the device.
Examples: Examples:
gpr: iomuxc-gpr@020e0000 { gpr: iomuxc-gpr@020e0000 {
compatible = "fsl,imx6q-iomuxc-gpr", "syscon"; compatible = "fsl,imx6q-iomuxc-gpr", "syscon";
......
Binding for Samsung S2MPA01 regulator block
===========================================
* Samsung S2MPA01 Voltage and Current Regulator This is a part of device tree bindings for S2M family multi-function devices.
More information can be found in bindings/mfd/sec-core.txt file.
The Samsung S2MPA01 is a multi-function device which includes high The S2MPA01 device provide buck and LDO regulators.
efficiency buck converters including Dual-Phase buck converter, various LDOs,
and an RTC. It is interfaced to the host controller using an I2C interface.
Each sub-block is addressed by the host system using different I2C slave
addresses.
Required properties: To register these with regulator framework instantiate under main device node
- compatible: Should be "samsung,s2mpa01-pmic". a sub-node named "regulators" with more sub-nodes for each regulator using the
- reg: Specifies the I2C slave address of the PMIC block. It should be 0x66. common regulator binding documented in:
- Documentation/devicetree/bindings/regulator/regulator.txt
Optional properties:
- interrupt-parent: Specifies the phandle of the interrupt controller to which
the interrupts from s2mpa01 are delivered to.
- interrupts: An interrupt specifier for the sole interrupt generated by the
device.
Optional nodes:
- regulators: The regulators of s2mpa01 that have to be instantiated should be
included in a sub-node named 'regulators'. Regulator nodes and constraints
included in this sub-node use the standard regulator bindings which are
documented elsewhere.
Properties for BUCK regulator nodes:
- regulator-ramp-delay: ramp delay in uV/us. May be 6250, 12500
(default), 25000, or 50000. May be 0 for disabling the ramp delay on
BUCK{1,2,3,4}.
In the absence of the regulator-ramp-delay property, the default ramp
delay will be used.
NOTE: Some BUCKs share the ramp rate setting i.e. same ramp value will be set
for a particular group of BUCKs. So provide same regulator-ramp-delay=<value>.
The following BUCKs share ramp settings:
* 1 and 6
* 2 and 4
* 8, 9, and 10
The following are the names of the regulators that the s2mpa01 PMIC block
supports. Note: The 'n' in LDOn and BUCKn represents the LDO or BUCK number
as per the datasheet of s2mpa01.
Names of regulators supported by S2MPA01 device:
- LDOn - LDOn
- valid values for n are 1 to 26 - valid values for n are 1 to 26
- Example: LDO1, LD02, LDO26 - Example: LDO1, LD02, LDO26
- BUCKn - BUCKn
- valid values for n are 1 to 10. - valid values for n are 1 to 10.
- Example: BUCK1, BUCK2, BUCK9 - Example: BUCK1, BUCK2, BUCK9
Note: The 'n' in LDOn and BUCKn represents the LDO or BUCK number
as per the datasheet of device.
Optional properties of buck regulator nodes under "regulators" sub-node:
- regulator-ramp-delay: ramp delay in uV/us. May be 6250, 12500
(default), 25000, or 50000. May be 0 for disabling the ramp delay on
BUCK{1,2,3,4}.
In the absence of the regulator-ramp-delay property, the default ramp
delay will be used.
Note: Some bucks share the ramp rate setting i.e. same ramp value
will be set for a particular group of bucks so provide the same
regulator-ramp-delay value for them.
Groups sharing ramp rate:
- buck{1,6},
- buck{2,4},
- buck{8,9,10}.
Example: Example:
......
Binding for Samsung S2M family regulator block
==============================================
This is a part of device tree bindings for S2M family multi-function devices.
More information can be found in bindings/mfd/sec-core.txt file.
The S2MPS11/13/14/15 and S2MPU02 devices provide buck and LDO regulators.
To register these with regulator framework instantiate under main device node
a sub-node named "regulators" with more sub-nodes for each regulator using the
common regulator binding documented in:
- Documentation/devicetree/bindings/regulator/regulator.txt
Names of regulators supported by different devices:
- LDOn
- valid values for n are:
- S2MPS11: 1 to 38
- S2MPS13: 1 to 40
- S2MPS14: 1 to 25
- S2MPS15: 1 to 27
- S2MPU02: 1 to 28
- Example: LDO1, LDO2, LDO28
- BUCKn
- valid values for n are:
- S2MPS11: 1 to 10
- S2MPS13: 1 to 10
- S2MPS14: 1 to 5
- S2MPS15: 1 to 10
- S2MPU02: 1 to 7
- Example: BUCK1, BUCK2, BUCK9
Note: The 'n' in LDOn and BUCKn represents the LDO or BUCK number
as per the datasheet of device.
Optional properties of the nodes under "regulators" sub-node:
- regulator-ramp-delay: ramp delay in uV/us. May be 6250, 12500,
25000 (default) or 50000.
Additionally S2MPS11 supports disabling ramp delay for BUCK{2,3,4,6}
by setting it to <0>.
Note: On S2MPS11 some bucks share the ramp rate setting i.e. same ramp value
will be set for a particular group of bucks so provide the same
regulator-ramp-delay value for them.
Groups sharing ramp rate:
- buck{1,6},
- buck{3,4},
- buck{7,8,10}.
- samsung,ext-control-gpios: On S2MPS14 the LDO10, LDO11 and LDO12 can be
configured to external control over GPIO. To turn this feature on this
property must be added to the regulator sub-node:
- samsung,ext-control-gpios: GPIO specifier for one GPIO
controlling this regulator (enable/disable)
Example:
LDO12 {
regulator-name = "V_EMMC_2.8V";
regulator-min-microvolt = <2800000>;
regulator-max-microvolt = <2800000>;
samsung,ext-control-gpios = <&gpk0 2 0>;
};
Example:
s2mps11_pmic@66 {
compatible = "samsung,s2mps11-pmic";
reg = <0x66>;
regulators {
ldo1_reg: LDO1 {
regulator-name = "VDD_ABB_3.3V";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
};
ldo2_reg: LDO2 {
regulator-name = "VDD_ALIVE_1.1V";
regulator-min-microvolt = <1100000>;
regulator-max-microvolt = <1100000>;
regulator-always-on;
};
buck1_reg: BUCK1 {
regulator-name = "vdd_mif";
regulator-min-microvolt = <950000>;
regulator-max-microvolt = <1350000>;
regulator-always-on;
regulator-boot-on;
};
buck2_reg: BUCK2 {
regulator-name = "vdd_arm";
regulator-min-microvolt = <950000>;
regulator-max-microvolt = <1350000>;
regulator-always-on;
regulator-boot-on;
regulator-ramp-delay = <50000>;
};
};
};
* Samsung S5M8767 Voltage and Current Regulator Binding for Samsung S5M8767 regulator block
===========================================
The Samsung S5M8767 is a multi-function device which includes voltage and
current regulators, rtc, charger controller and other sub-blocks. It is This is a part of device tree bindings for S5M family multi-function devices.
interfaced to the host controller using a i2c interface. Each sub-block is More information can be found in bindings/mfd/sec-core.txt file.
addressed by the host system using different i2c slave address. This document
describes the bindings for 'pmic' sub-block of s5m8767. The S5M8767 device provide buck and LDO regulators.
Required properties: To register these with regulator framework instantiate under main device node
- compatible: Should be "samsung,s5m8767-pmic". a sub-node named "regulators" with more sub-nodes for each regulator using the
- reg: Specifies the i2c slave address of the pmic block. It should be 0x66. common regulator binding documented in:
- Documentation/devicetree/bindings/regulator/regulator.txt
- s5m8767,pmic-buck2-dvs-voltage: A set of 8 voltage values in micro-volt (uV)
units for buck2 when changing voltage using gpio dvs. Refer to [1] below
for additional information. Required properties of the main device node (the parent!):
- s5m8767,pmic-buck2-dvs-voltage: A set of 8 voltage values in micro-volt (uV)
- s5m8767,pmic-buck3-dvs-voltage: A set of 8 voltage values in micro-volt (uV) units for buck2 when changing voltage using gpio dvs. Refer to [1] below
units for buck3 when changing voltage using gpio dvs. Refer to [1] below for additional information.
for additional information.
- s5m8767,pmic-buck3-dvs-voltage: A set of 8 voltage values in micro-volt (uV)
- s5m8767,pmic-buck4-dvs-voltage: A set of 8 voltage values in micro-volt (uV) units for buck3 when changing voltage using gpio dvs. Refer to [1] below
units for buck4 when changing voltage using gpio dvs. Refer to [1] below for additional information.
for additional information.
- s5m8767,pmic-buck4-dvs-voltage: A set of 8 voltage values in micro-volt (uV)
- s5m8767,pmic-buck-ds-gpios: GPIO specifiers for three host gpio's used units for buck4 when changing voltage using gpio dvs. Refer to [1] below
for selecting GPIO DVS lines. It is one-to-one mapped to dvs gpio lines. for additional information.
[1] If none of the 's5m8767,pmic-buck[2/3/4]-uses-gpio-dvs' optional - s5m8767,pmic-buck-ds-gpios: GPIO specifiers for three host gpio's used
property is specified, the 's5m8767,pmic-buck[2/3/4]-dvs-voltage' for selecting GPIO DVS lines. It is one-to-one mapped to dvs gpio lines.
property should specify atleast one voltage level (which would be a
safe operating voltage). [1] If none of the 's5m8767,pmic-buck[2/3/4]-uses-gpio-dvs' optional
property is specified, the 's5m8767,pmic-buck[2/3/4]-dvs-voltage'
If either of the 's5m8767,pmic-buck[2/3/4]-uses-gpio-dvs' optional property should specify atleast one voltage level (which would be a
property is specified, then all the eight voltage values for the safe operating voltage).
's5m8767,pmic-buck[2/3/4]-dvs-voltage' should be specified.
If either of the 's5m8767,pmic-buck[2/3/4]-uses-gpio-dvs' optional
Optional properties: property is specified, then all the eight voltage values for the
- interrupt-parent: Specifies the phandle of the interrupt controller to which 's5m8767,pmic-buck[2/3/4]-dvs-voltage' should be specified.
the interrupts from s5m8767 are delivered to.
- interrupts: Interrupt specifiers for two interrupt sources. Optional properties of the main device node (the parent!):
- First interrupt specifier is for 'irq1' interrupt. - s5m8767,pmic-buck2-uses-gpio-dvs: 'buck2' can be controlled by gpio dvs.
- Second interrupt specifier is for 'alert' interrupt. - s5m8767,pmic-buck3-uses-gpio-dvs: 'buck3' can be controlled by gpio dvs.
- s5m8767,pmic-buck2-uses-gpio-dvs: 'buck2' can be controlled by gpio dvs. - s5m8767,pmic-buck4-uses-gpio-dvs: 'buck4' can be controlled by gpio dvs.
- s5m8767,pmic-buck3-uses-gpio-dvs: 'buck3' can be controlled by gpio dvs.
- s5m8767,pmic-buck4-uses-gpio-dvs: 'buck4' can be controlled by gpio dvs.
Additional properties required if either of the optional properties are used: Additional properties required if either of the optional properties are used:
- s5m8767,pmic-buck234-default-dvs-idx: Default voltage setting selected from - s5m8767,pmic-buck234-default-dvs-idx: Default voltage setting selected from
the possible 8 options selectable by the dvs gpios. The value of this the possible 8 options selectable by the dvs gpios. The value of this
property should be between 0 and 7. If not specified or if out of range, the property should be between 0 and 7. If not specified or if out of range, the
default value of this property is set to 0. default value of this property is set to 0.
- s5m8767,pmic-buck-dvs-gpios: GPIO specifiers for three host gpio's used - s5m8767,pmic-buck-dvs-gpios: GPIO specifiers for three host gpio's used
for dvs. The format of the gpio specifier depends in the gpio controller. for dvs. The format of the gpio specifier depends in the gpio controller.
Regulators: The regulators of s5m8767 that have to be instantiated should be
included in a sub-node named 'regulators'. Regulator nodes included in this
sub-node should be of the format as listed below.
regulator_name {
ldo1_reg: LDO1 {
regulator-name = "VDD_ALIVE_1.0V";
regulator-min-microvolt = <1100000>;
regulator-max-microvolt = <1100000>;
regulator-always-on;
regulator-boot-on;
op_mode = <1>; /* Normal Mode */
};
};
The above regulator entries are defined in regulator bindings documentation
except these properties:
- op_mode: describes the different operating modes of the LDO's with
power mode change in SOC. The different possible values are,
0 - always off mode
1 - on in normal mode
2 - low power mode
3 - suspend mode
- s5m8767,pmic-ext-control-gpios: (optional) GPIO specifier for one
GPIO controlling this regulator (enable/disable); This is
valid only for buck9.
The following are the names of the regulators that the s5m8767 pmic block
supports. Note: The 'n' in LDOn and BUCKn represents the LDO or BUCK number
as per the datasheet of s5m8767.
Names of regulators supported by S5M8767 device:
- LDOn - LDOn
- valid values for n are 1 to 28 - valid values for n are 1 to 28
- Example: LDO1, LDO2, LDO28 - Example: LDO1, LDO2, LDO28
- BUCKn - BUCKn
- valid values for n are 1 to 9. - valid values for n are 1 to 9.
- Example: BUCK1, BUCK2, BUCK9 - Example: BUCK1, BUCK2, BUCK9
Note: The 'n' in LDOn and BUCKn represents the LDO or BUCK number
The bindings inside the regulator nodes use the standard regulator bindings as per the datasheet of device.
which are documented elsewhere.
Optional properties of the nodes under "regulators" sub-node:
- op_mode: describes the different operating modes of the LDO's with
power mode change in SOC. The different possible values are,
0 - always off mode
1 - on in normal mode
2 - low power mode
3 - suspend mode
- s5m8767,pmic-ext-control-gpios: (optional) GPIO specifier for one
GPIO controlling this regulator
(enable/disable); This is valid only
for buck9.
Example: Example:
......
...@@ -30,7 +30,7 @@ Optional properties: ...@@ -30,7 +30,7 @@ Optional properties:
- #interrupt-cells: the number of cells to describe an IRQ, this should be 2. - #interrupt-cells: the number of cells to describe an IRQ, this should be 2.
The first cell is the IRQ number. The first cell is the IRQ number.
The second cell is the flags, encoded as the trigger masks from The second cell is the flags, encoded as the trigger masks from
Documentation/devicetree/bindings/interrupts.txt Documentation/devicetree/bindings/interrupt-controller/interrupts.txt
- clocks : A list of up to two phandle and clock specifier pairs - clocks : A list of up to two phandle and clock specifier pairs
- clock-names : A list of clock names sorted in the same order as clocks. - clock-names : A list of clock names sorted in the same order as clocks.
......
...@@ -9285,8 +9285,10 @@ F: drivers/regulator/s5m*.c ...@@ -9285,8 +9285,10 @@ F: drivers/regulator/s5m*.c
F: drivers/clk/clk-s2mps11.c F: drivers/clk/clk-s2mps11.c
F: drivers/rtc/rtc-s5m.c F: drivers/rtc/rtc-s5m.c
F: include/linux/mfd/samsung/ F: include/linux/mfd/samsung/
F: Documentation/devicetree/bindings/regulator/s5m8767-regulator.txt F: Documentation/devicetree/bindings/mfd/samsung,sec-core.txt
F: Documentation/devicetree/bindings/mfd/s2mp*.txt F: Documentation/devicetree/bindings/regulator/samsung,s2m*.txt
F: Documentation/devicetree/bindings/regulator/samsung,s5m*.txt
F: Documentation/devicetree/bindings/clock/samsung,s2mps11.txt
SAMSUNG S5P/EXYNOS4 SOC SERIES CAMERA SUBSYSTEM DRIVERS SAMSUNG S5P/EXYNOS4 SOC SERIES CAMERA SUBSYSTEM DRIVERS
M: Kyungmin Park <kyungmin.park@samsung.com> M: Kyungmin Park <kyungmin.park@samsung.com>
...@@ -11743,6 +11745,7 @@ F: drivers/input/touchscreen/wm831x-ts.c ...@@ -11743,6 +11745,7 @@ F: drivers/input/touchscreen/wm831x-ts.c
F: drivers/input/touchscreen/wm97*.c F: drivers/input/touchscreen/wm97*.c
F: drivers/mfd/arizona* F: drivers/mfd/arizona*
F: drivers/mfd/wm*.c F: drivers/mfd/wm*.c
F: drivers/mfd/cs47l24*
F: drivers/power/wm83*.c F: drivers/power/wm83*.c
F: drivers/rtc/rtc-wm83*.c F: drivers/rtc/rtc-wm83*.c
F: drivers/regulator/wm8*.c F: drivers/regulator/wm8*.c
...@@ -11756,6 +11759,7 @@ F: include/linux/wm97xx.h ...@@ -11756,6 +11759,7 @@ F: include/linux/wm97xx.h
F: include/sound/wm????.h F: include/sound/wm????.h
F: sound/soc/codecs/arizona.? F: sound/soc/codecs/arizona.?
F: sound/soc/codecs/wm* F: sound/soc/codecs/wm*
F: sound/soc/codecs/cs47l24*
WORKQUEUE WORKQUEUE
M: Tejun Heo <tj@kernel.org> M: Tejun Heo <tj@kernel.org>
......
...@@ -122,6 +122,10 @@ static int arizona_gpio_probe(struct platform_device *pdev) ...@@ -122,6 +122,10 @@ static int arizona_gpio_probe(struct platform_device *pdev)
case WM1814: case WM1814:
arizona_gpio->gpio_chip.ngpio = 5; arizona_gpio->gpio_chip.ngpio = 5;
break; break;
case WM1831:
case CS47L24:
arizona_gpio->gpio_chip.ngpio = 2;
break;
default: default:
dev_err(&pdev->dev, "Unknown chip variant %d\n", dev_err(&pdev->dev, "Unknown chip variant %d\n",
arizona->type); arizona->type);
......
...@@ -135,7 +135,7 @@ EXPORT_SYMBOL_GPL(pm80x_deinit); ...@@ -135,7 +135,7 @@ EXPORT_SYMBOL_GPL(pm80x_deinit);
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
static int pm80x_suspend(struct device *dev) static int pm80x_suspend(struct device *dev)
{ {
struct i2c_client *client = container_of(dev, struct i2c_client, dev); struct i2c_client *client = to_i2c_client(dev);
struct pm80x_chip *chip = i2c_get_clientdata(client); struct pm80x_chip *chip = i2c_get_clientdata(client);
if (chip && chip->wu_flag) if (chip && chip->wu_flag)
...@@ -147,7 +147,7 @@ static int pm80x_suspend(struct device *dev) ...@@ -147,7 +147,7 @@ static int pm80x_suspend(struct device *dev)
static int pm80x_resume(struct device *dev) static int pm80x_resume(struct device *dev)
{ {
struct i2c_client *client = container_of(dev, struct i2c_client, dev); struct i2c_client *client = to_i2c_client(dev);
struct pm80x_chip *chip = i2c_get_clientdata(client); struct pm80x_chip *chip = i2c_get_clientdata(client);
if (chip && chip->wu_flag) if (chip && chip->wu_flag)
......
...@@ -705,10 +705,12 @@ int pm8606_osc_disable(struct pm860x_chip *chip, unsigned short client) ...@@ -705,10 +705,12 @@ int pm8606_osc_disable(struct pm860x_chip *chip, unsigned short client)
chip->osc_status); chip->osc_status);
mutex_lock(&chip->osc_lock); mutex_lock(&chip->osc_lock);
/*Update voting status */ /* Update voting status */
chip->osc_vote &= ~(client); chip->osc_vote &= ~(client);
/* If reference group is off and this is the last client to release /*
* - turn off */ * If reference group is off and this is the last client to release
* - turn off
*/
if ((chip->osc_status != PM8606_REF_GP_OSC_OFF) && if ((chip->osc_status != PM8606_REF_GP_OSC_OFF) &&
(chip->osc_vote == REF_GP_NO_CLIENTS)) { (chip->osc_vote == REF_GP_NO_CLIENTS)) {
chip->osc_status = PM8606_REF_GP_OSC_UNKNOWN; chip->osc_status = PM8606_REF_GP_OSC_UNKNOWN;
...@@ -1218,7 +1220,7 @@ static int pm860x_remove(struct i2c_client *client) ...@@ -1218,7 +1220,7 @@ static int pm860x_remove(struct i2c_client *client)
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
static int pm860x_suspend(struct device *dev) static int pm860x_suspend(struct device *dev)
{ {
struct i2c_client *client = container_of(dev, struct i2c_client, dev); struct i2c_client *client = to_i2c_client(dev);
struct pm860x_chip *chip = i2c_get_clientdata(client); struct pm860x_chip *chip = i2c_get_clientdata(client);
if (device_may_wakeup(dev) && chip->wakeup_flag) if (device_may_wakeup(dev) && chip->wakeup_flag)
...@@ -1228,7 +1230,7 @@ static int pm860x_suspend(struct device *dev) ...@@ -1228,7 +1230,7 @@ static int pm860x_suspend(struct device *dev)
static int pm860x_resume(struct device *dev) static int pm860x_resume(struct device *dev)
{ {
struct i2c_client *client = container_of(dev, struct i2c_client, dev); struct i2c_client *client = to_i2c_client(dev);
struct pm860x_chip *chip = i2c_get_clientdata(client); struct pm860x_chip *chip = i2c_get_clientdata(client);
if (device_may_wakeup(dev) && chip->wakeup_flag) if (device_may_wakeup(dev) && chip->wakeup_flag)
...@@ -1265,6 +1267,7 @@ static struct i2c_driver pm860x_driver = { ...@@ -1265,6 +1267,7 @@ static struct i2c_driver pm860x_driver = {
static int __init pm860x_i2c_init(void) static int __init pm860x_i2c_init(void)
{ {
int ret; int ret;
ret = i2c_add_driver(&pm860x_driver); ret = i2c_add_driver(&pm860x_driver);
if (ret != 0) if (ret != 0)
pr_err("Failed to register 88PM860x I2C driver: %d\n", ret); pr_err("Failed to register 88PM860x I2C driver: %d\n", ret);
......
...@@ -211,7 +211,7 @@ config MFD_DA9062 ...@@ -211,7 +211,7 @@ config MFD_DA9062
of the device. of the device.
config MFD_DA9063 config MFD_DA9063
bool "Dialog Semiconductor DA9063 PMIC Support" tristate "Dialog Semiconductor DA9063 PMIC Support"
select MFD_CORE select MFD_CORE
select REGMAP_I2C select REGMAP_I2C
select REGMAP_IRQ select REGMAP_IRQ
...@@ -1370,24 +1370,30 @@ config MFD_ARIZONA ...@@ -1370,24 +1370,30 @@ config MFD_ARIZONA
bool bool
config MFD_ARIZONA_I2C config MFD_ARIZONA_I2C
tristate "Wolfson Microelectronics Arizona platform with I2C" tristate "Cirrus Logic/Wolfson Microelectronics Arizona platform with I2C"
select MFD_ARIZONA select MFD_ARIZONA
select MFD_CORE select MFD_CORE
select REGMAP_I2C select REGMAP_I2C
depends on I2C depends on I2C
help help
Support for the Wolfson Microelectronics Arizona platform audio SoC Support for the Cirrus Logic/Wolfson Microelectronics Arizona platform
core functionality controlled via I2C. audio SoC core functionality controlled via I2C.
config MFD_ARIZONA_SPI config MFD_ARIZONA_SPI
tristate "Wolfson Microelectronics Arizona platform with SPI" tristate "Cirrus Logic/Wolfson Microelectronics Arizona platform with SPI"
select MFD_ARIZONA select MFD_ARIZONA
select MFD_CORE select MFD_CORE
select REGMAP_SPI select REGMAP_SPI
depends on SPI_MASTER depends on SPI_MASTER
help help
Support for the Wolfson Microelectronics Arizona platform audio SoC Support for the Cirrus Logic/Wolfson Microelectronics Arizona platform
core functionality controlled via I2C. audio SoC core functionality controlled via I2C.
config MFD_CS47L24
bool "Cirrus Logic CS47L24 and WM1831"
depends on MFD_ARIZONA
help
Support for Cirrus Logic CS47L24 and WM1831 low power audio SoC
config MFD_WM5102 config MFD_WM5102
bool "Wolfson Microelectronics WM5102" bool "Wolfson Microelectronics WM5102"
......
...@@ -51,6 +51,9 @@ endif ...@@ -51,6 +51,9 @@ endif
ifeq ($(CONFIG_MFD_WM8998),y) ifeq ($(CONFIG_MFD_WM8998),y)
obj-$(CONFIG_MFD_ARIZONA) += wm8998-tables.o obj-$(CONFIG_MFD_ARIZONA) += wm8998-tables.o
endif endif
ifeq ($(CONFIG_MFD_CS47L24),y)
obj-$(CONFIG_MFD_ARIZONA) += cs47l24-tables.o
endif
obj-$(CONFIG_MFD_WM8400) += wm8400-core.o obj-$(CONFIG_MFD_WM8400) += wm8400-core.o
wm831x-objs := wm831x-core.o wm831x-irq.o wm831x-otp.o wm831x-objs := wm831x-core.o wm831x-irq.o wm831x-otp.o
wm831x-objs += wm831x-auxadc.o wm831x-objs += wm831x-auxadc.o
...@@ -61,7 +64,8 @@ wm8350-objs := wm8350-core.o wm8350-regmap.o wm8350-gpio.o ...@@ -61,7 +64,8 @@ wm8350-objs := wm8350-core.o wm8350-regmap.o wm8350-gpio.o
wm8350-objs += wm8350-irq.o wm8350-objs += wm8350-irq.o
obj-$(CONFIG_MFD_WM8350) += wm8350.o obj-$(CONFIG_MFD_WM8350) += wm8350.o
obj-$(CONFIG_MFD_WM8350_I2C) += wm8350-i2c.o obj-$(CONFIG_MFD_WM8350_I2C) += wm8350-i2c.o
obj-$(CONFIG_MFD_WM8994) += wm8994-core.o wm8994-irq.o wm8994-regmap.o wm8994-objs := wm8994-core.o wm8994-irq.o wm8994-regmap.o
obj-$(CONFIG_MFD_WM8994) += wm8994.o
obj-$(CONFIG_TPS6105X) += tps6105x.o obj-$(CONFIG_TPS6105X) += tps6105x.o
obj-$(CONFIG_TPS65010) += tps65010.o obj-$(CONFIG_TPS65010) += tps65010.o
......
...@@ -373,11 +373,8 @@ static int aat2870_i2c_probe(struct i2c_client *client, ...@@ -373,11 +373,8 @@ static int aat2870_i2c_probe(struct i2c_client *client,
aat2870 = devm_kzalloc(&client->dev, sizeof(struct aat2870_data), aat2870 = devm_kzalloc(&client->dev, sizeof(struct aat2870_data),
GFP_KERNEL); GFP_KERNEL);
if (!aat2870) { if (!aat2870)
dev_err(&client->dev,
"Failed to allocate memory for aat2870\n");
return -ENOMEM; return -ENOMEM;
}
aat2870->dev = &client->dev; aat2870->dev = &client->dev;
dev_set_drvdata(aat2870->dev, aat2870); dev_set_drvdata(aat2870->dev, aat2870);
......
...@@ -381,9 +381,11 @@ static int ab3100_event_registers_startup_state_get(struct device *dev, ...@@ -381,9 +381,11 @@ static int ab3100_event_registers_startup_state_get(struct device *dev,
u8 *event) u8 *event)
{ {
struct ab3100 *ab3100 = dev_get_drvdata(dev->parent); struct ab3100 *ab3100 = dev_get_drvdata(dev->parent);
if (!ab3100->startup_events_read) if (!ab3100->startup_events_read)
return -EAGAIN; /* Try again later */ return -EAGAIN; /* Try again later */
memcpy(event, ab3100->startup_events, 3); memcpy(event, ab3100->startup_events, 3);
return 0; return 0;
} }
...@@ -858,10 +860,8 @@ static int ab3100_probe(struct i2c_client *client, ...@@ -858,10 +860,8 @@ static int ab3100_probe(struct i2c_client *client,
int i; int i;
ab3100 = devm_kzalloc(&client->dev, sizeof(struct ab3100), GFP_KERNEL); ab3100 = devm_kzalloc(&client->dev, sizeof(struct ab3100), GFP_KERNEL);
if (!ab3100) { if (!ab3100)
dev_err(&client->dev, "could not allocate AB3100 device\n");
return -ENOMEM; return -ENOMEM;
}
/* Initialize data structure */ /* Initialize data structure */
mutex_init(&ab3100->access_mutex); mutex_init(&ab3100->access_mutex);
...@@ -883,20 +883,17 @@ static int ab3100_probe(struct i2c_client *client, ...@@ -883,20 +883,17 @@ static int ab3100_probe(struct i2c_client *client,
for (i = 0; ids[i].id != 0x0; i++) { for (i = 0; ids[i].id != 0x0; i++) {
if (ids[i].id == ab3100->chip_id) { if (ids[i].id == ab3100->chip_id) {
if (ids[i].name != NULL) { if (ids[i].name)
snprintf(&ab3100->chip_name[0],
sizeof(ab3100->chip_name) - 1,
"AB3100 %s",
ids[i].name);
break; break;
} else {
dev_err(&client->dev, dev_err(&client->dev, "AB3000 is not supported\n");
"AB3000 is not supported\n"); goto exit_no_detect;
goto exit_no_detect;
}
} }
} }
snprintf(&ab3100->chip_name[0],
sizeof(ab3100->chip_name) - 1, "AB3100 %s", ids[i].name);
if (ids[i].id == 0x0) { if (ids[i].id == 0x0) {
dev_err(&client->dev, "unknown analog baseband chip id: 0x%x\n", dev_err(&client->dev, "unknown analog baseband chip id: 0x%x\n",
ab3100->chip_id); ab3100->chip_id);
......
...@@ -188,10 +188,9 @@ static int __init ab3100_otp_probe(struct platform_device *pdev) ...@@ -188,10 +188,9 @@ static int __init ab3100_otp_probe(struct platform_device *pdev)
int i; int i;
otp = devm_kzalloc(&pdev->dev, sizeof(struct ab3100_otp), GFP_KERNEL); otp = devm_kzalloc(&pdev->dev, sizeof(struct ab3100_otp), GFP_KERNEL);
if (!otp) { if (!otp)
dev_err(&pdev->dev, "could not allocate AB3100 OTP device\n");
return -ENOMEM; return -ENOMEM;
}
otp->dev = &pdev->dev; otp->dev = &pdev->dev;
/* Replace platform data coming in with a local struct */ /* Replace platform data coming in with a local struct */
......
This diff is collapsed.
...@@ -242,8 +242,10 @@ static struct ab8500_prcmu_ranges ab8500_debug_ranges[AB8500_NUM_BANKS] = { ...@@ -242,8 +242,10 @@ static struct ab8500_prcmu_ranges ab8500_debug_ranges[AB8500_NUM_BANKS] = {
.first = 0x40, .first = 0x40,
.last = 0x44, .last = 0x44,
}, },
/* 0x80-0x8B is SIM registers and should /*
* not be accessed from here */ * 0x80-0x8B are SIM registers and should
* not be accessed from here
*/
}, },
}, },
[AB8500_USB] = { [AB8500_USB] = {
...@@ -587,8 +589,10 @@ static struct ab8500_prcmu_ranges ab8505_debug_ranges[AB8500_NUM_BANKS] = { ...@@ -587,8 +589,10 @@ static struct ab8500_prcmu_ranges ab8505_debug_ranges[AB8500_NUM_BANKS] = {
.first = 0x40, .first = 0x40,
.last = 0x48, .last = 0x48,
}, },
/* 0x80-0x8B is SIM registers and should /*
* not be accessed from here */ * 0x80-0x8B are SIM registers and should
* not be accessed from here
*/
}, },
}, },
[AB8500_USB] = { [AB8500_USB] = {
...@@ -1306,8 +1310,10 @@ static int ab8500_registers_print(struct device *dev, u32 bank, ...@@ -1306,8 +1310,10 @@ static int ab8500_registers_print(struct device *dev, u32 bank,
if (s) { if (s) {
seq_printf(s, " [0x%02X/0x%02X]: 0x%02X\n", seq_printf(s, " [0x%02X/0x%02X]: 0x%02X\n",
bank, reg, value); bank, reg, value);
/* Error is not returned here since /*
* the output is wanted in any case */ * Error is not returned here since
* the output is wanted in any case
*/
if (seq_has_overflowed(s)) if (seq_has_overflowed(s))
return 0; return 0;
} else { } else {
...@@ -2740,10 +2746,9 @@ static ssize_t hwreg_common_write(char *b, struct hwreg_cfg *cfg, ...@@ -2740,10 +2746,9 @@ static ssize_t hwreg_common_write(char *b, struct hwreg_cfg *cfg,
*cfg = loc; *cfg = loc;
#ifdef ABB_HWREG_DEBUG #ifdef ABB_HWREG_DEBUG
pr_warn("HWREG request: %s, %s,\n" pr_warn("HWREG request: %s, %s,\n", (write) ? "write" : "read",
" addr=0x%08X, mask=0x%X, shift=%d" "value=0x%X\n", REG_FMT_DEC(cfg) ? "decimal" : "hexa");
(write) ? "write" : "read", pr_warn(" addr=0x%08X, mask=0x%X, shift=%d" "value=0x%X\n",
REG_FMT_DEC(cfg) ? "decimal" : "hexa",
cfg->addr, cfg->mask, cfg->shift, val); cfg->addr, cfg->mask, cfg->shift, val);
#endif #endif
......
...@@ -49,61 +49,61 @@ ...@@ -49,61 +49,61 @@
* OTP register offsets * OTP register offsets
* Bank : 0x15 * Bank : 0x15
*/ */
#define AB8500_GPADC_CAL_1 0x0F #define AB8500_GPADC_CAL_1 0x0F
#define AB8500_GPADC_CAL_2 0x10 #define AB8500_GPADC_CAL_2 0x10
#define AB8500_GPADC_CAL_3 0x11 #define AB8500_GPADC_CAL_3 0x11
#define AB8500_GPADC_CAL_4 0x12 #define AB8500_GPADC_CAL_4 0x12
#define AB8500_GPADC_CAL_5 0x13 #define AB8500_GPADC_CAL_5 0x13
#define AB8500_GPADC_CAL_6 0x14 #define AB8500_GPADC_CAL_6 0x14
#define AB8500_GPADC_CAL_7 0x15 #define AB8500_GPADC_CAL_7 0x15
/* New calibration for 8540 */ /* New calibration for 8540 */
#define AB8540_GPADC_OTP4_REG_7 0x38 #define AB8540_GPADC_OTP4_REG_7 0x38
#define AB8540_GPADC_OTP4_REG_6 0x39 #define AB8540_GPADC_OTP4_REG_6 0x39
#define AB8540_GPADC_OTP4_REG_5 0x3A #define AB8540_GPADC_OTP4_REG_5 0x3A
/* gpadc constants */ /* gpadc constants */
#define EN_VINTCORE12 0x04 #define EN_VINTCORE12 0x04
#define EN_VTVOUT 0x02 #define EN_VTVOUT 0x02
#define EN_GPADC 0x01 #define EN_GPADC 0x01
#define DIS_GPADC 0x00 #define DIS_GPADC 0x00
#define AVG_1 0x00 #define AVG_1 0x00
#define AVG_4 0x20 #define AVG_4 0x20
#define AVG_8 0x40 #define AVG_8 0x40
#define AVG_16 0x60 #define AVG_16 0x60
#define ADC_SW_CONV 0x04 #define ADC_SW_CONV 0x04
#define EN_ICHAR 0x80 #define EN_ICHAR 0x80
#define BTEMP_PULL_UP 0x08 #define BTEMP_PULL_UP 0x08
#define EN_BUF 0x40 #define EN_BUF 0x40
#define DIS_ZERO 0x00 #define DIS_ZERO 0x00
#define GPADC_BUSY 0x01 #define GPADC_BUSY 0x01
#define EN_FALLING 0x10 #define EN_FALLING 0x10
#define EN_TRIG_EDGE 0x02 #define EN_TRIG_EDGE 0x02
#define EN_VBIAS_XTAL_TEMP 0x02 #define EN_VBIAS_XTAL_TEMP 0x02
/* GPADC constants from AB8500 spec, UM0836 */ /* GPADC constants from AB8500 spec, UM0836 */
#define ADC_RESOLUTION 1024 #define ADC_RESOLUTION 1024
#define ADC_CH_BTEMP_MIN 0 #define ADC_CH_BTEMP_MIN 0
#define ADC_CH_BTEMP_MAX 1350 #define ADC_CH_BTEMP_MAX 1350
#define ADC_CH_DIETEMP_MIN 0 #define ADC_CH_DIETEMP_MIN 0
#define ADC_CH_DIETEMP_MAX 1350 #define ADC_CH_DIETEMP_MAX 1350
#define ADC_CH_CHG_V_MIN 0 #define ADC_CH_CHG_V_MIN 0
#define ADC_CH_CHG_V_MAX 20030 #define ADC_CH_CHG_V_MAX 20030
#define ADC_CH_ACCDET2_MIN 0 #define ADC_CH_ACCDET2_MIN 0
#define ADC_CH_ACCDET2_MAX 2500 #define ADC_CH_ACCDET2_MAX 2500
#define ADC_CH_VBAT_MIN 2300 #define ADC_CH_VBAT_MIN 2300
#define ADC_CH_VBAT_MAX 4800 #define ADC_CH_VBAT_MAX 4800
#define ADC_CH_CHG_I_MIN 0 #define ADC_CH_CHG_I_MIN 0
#define ADC_CH_CHG_I_MAX 1500 #define ADC_CH_CHG_I_MAX 1500
#define ADC_CH_BKBAT_MIN 0 #define ADC_CH_BKBAT_MIN 0
#define ADC_CH_BKBAT_MAX 3200 #define ADC_CH_BKBAT_MAX 3200
/* GPADC constants from AB8540 spec */ /* GPADC constants from AB8540 spec */
#define ADC_CH_IBAT_MIN (-6000) /* mA range measured by ADC for ibat*/ #define ADC_CH_IBAT_MIN (-6000) /* mA range measured by ADC for ibat */
#define ADC_CH_IBAT_MAX 6000 #define ADC_CH_IBAT_MAX 6000
#define ADC_CH_IBAT_MIN_V (-60) /* mV range measured by ADC for ibat*/ #define ADC_CH_IBAT_MIN_V (-60) /* mV range measured by ADC for ibat */
#define ADC_CH_IBAT_MAX_V 60 #define ADC_CH_IBAT_MAX_V 60
#define IBAT_VDROP_L (-56) /* mV */ #define IBAT_VDROP_L (-56) /* mV */
#define IBAT_VDROP_H 56 #define IBAT_VDROP_H 56
/* This is used to not lose precision when dividing to get gain and offset */ /* This is used to not lose precision when dividing to get gain and offset */
#define CALIB_SCALE 1000 #define CALIB_SCALE 1000
...@@ -179,7 +179,7 @@ struct ab8500_gpadc *ab8500_gpadc_get(char *name) ...@@ -179,7 +179,7 @@ struct ab8500_gpadc *ab8500_gpadc_get(char *name)
list_for_each_entry(gpadc, &ab8500_gpadc_list, node) { list_for_each_entry(gpadc, &ab8500_gpadc_list, node) {
if (!strcmp(name, dev_name(gpadc->dev))) if (!strcmp(name, dev_name(gpadc->dev)))
return gpadc; return gpadc;
} }
return ERR_PTR(-ENOENT); return ERR_PTR(-ENOENT);
...@@ -315,11 +315,12 @@ int ab8500_gpadc_sw_hw_convert(struct ab8500_gpadc *gpadc, u8 channel, ...@@ -315,11 +315,12 @@ int ab8500_gpadc_sw_hw_convert(struct ab8500_gpadc *gpadc, u8 channel,
ad_value = ab8500_gpadc_read_raw(gpadc, channel, avg_sample, ad_value = ab8500_gpadc_read_raw(gpadc, channel, avg_sample,
trig_edge, trig_timer, conv_type); trig_edge, trig_timer, conv_type);
/* On failure retry a second time */
/* On failure retry a second time */
if (ad_value < 0) if (ad_value < 0)
ad_value = ab8500_gpadc_read_raw(gpadc, channel, avg_sample, ad_value = ab8500_gpadc_read_raw(gpadc, channel, avg_sample,
trig_edge, trig_timer, conv_type); trig_edge, trig_timer, conv_type);
if (ad_value < 0) { if (ad_value < 0) {
dev_err(gpadc->dev, "GPADC raw value failed ch: %d\n", dev_err(gpadc->dev, "GPADC raw value failed ch: %d\n",
channel); channel);
return ad_value; return ad_value;
...@@ -327,8 +328,9 @@ if (ad_value < 0) { ...@@ -327,8 +328,9 @@ if (ad_value < 0) {
voltage = ab8500_gpadc_ad_to_voltage(gpadc, channel, ad_value); voltage = ab8500_gpadc_ad_to_voltage(gpadc, channel, ad_value);
if (voltage < 0) if (voltage < 0)
dev_err(gpadc->dev, "GPADC to voltage conversion failed ch:" dev_err(gpadc->dev,
" %d AD: 0x%x\n", channel, ad_value); "GPADC to voltage conversion failed ch: %d AD: 0x%x\n",
channel, ad_value);
return voltage; return voltage;
} }
...@@ -348,10 +350,9 @@ EXPORT_SYMBOL(ab8500_gpadc_sw_hw_convert); ...@@ -348,10 +350,9 @@ EXPORT_SYMBOL(ab8500_gpadc_sw_hw_convert);
int ab8500_gpadc_read_raw(struct ab8500_gpadc *gpadc, u8 channel, int ab8500_gpadc_read_raw(struct ab8500_gpadc *gpadc, u8 channel,
u8 avg_sample, u8 trig_edge, u8 trig_timer, u8 conv_type) u8 avg_sample, u8 trig_edge, u8 trig_timer, u8 conv_type)
{ {
int raw_data; return ab8500_gpadc_double_read_raw(gpadc, channel, avg_sample,
raw_data = ab8500_gpadc_double_read_raw(gpadc, channel, trig_edge, trig_timer, conv_type,
avg_sample, trig_edge, trig_timer, conv_type, NULL); NULL);
return raw_data;
} }
int ab8500_gpadc_double_read_raw(struct ab8500_gpadc *gpadc, u8 channel, int ab8500_gpadc_double_read_raw(struct ab8500_gpadc *gpadc, u8 channel,
...@@ -388,7 +389,7 @@ int ab8500_gpadc_double_read_raw(struct ab8500_gpadc *gpadc, u8 channel, ...@@ -388,7 +389,7 @@ int ab8500_gpadc_double_read_raw(struct ab8500_gpadc *gpadc, u8 channel,
goto out; goto out;
if (!(val & GPADC_BUSY)) if (!(val & GPADC_BUSY))
break; break;
msleep(10); msleep(20);
} while (++looplimit < 10); } while (++looplimit < 10);
if (looplimit >= 10 && (val & GPADC_BUSY)) { if (looplimit >= 10 && (val & GPADC_BUSY)) {
dev_err(gpadc->dev, "gpadc_conversion: GPADC busy"); dev_err(gpadc->dev, "gpadc_conversion: GPADC busy");
...@@ -421,8 +422,7 @@ int ab8500_gpadc_double_read_raw(struct ab8500_gpadc *gpadc, u8 channel, ...@@ -421,8 +422,7 @@ int ab8500_gpadc_double_read_raw(struct ab8500_gpadc *gpadc, u8 channel,
val_reg1 |= EN_TRIG_EDGE; val_reg1 |= EN_TRIG_EDGE;
if (trig_edge) if (trig_edge)
val_reg1 |= EN_FALLING; val_reg1 |= EN_FALLING;
} } else
else
ret = abx500_set_register_interruptible(gpadc->dev, ret = abx500_set_register_interruptible(gpadc->dev,
AB8500_GPADC, AB8500_GPADC_CTRL2_REG, val); AB8500_GPADC, AB8500_GPADC_CTRL2_REG, val);
if (ret < 0) { if (ret < 0) {
...@@ -449,7 +449,7 @@ int ab8500_gpadc_double_read_raw(struct ab8500_gpadc *gpadc, u8 channel, ...@@ -449,7 +449,7 @@ int ab8500_gpadc_double_read_raw(struct ab8500_gpadc *gpadc, u8 channel,
* remove when hardware will be availible * remove when hardware will be availible
*/ */
delay_min = 1000; /* Delay in micro seconds */ delay_min = 1000; /* Delay in micro seconds */
delay_max = 10000; /* large range to optimise sleep mode */ delay_max = 10000; /* large range optimises sleepmode */
break; break;
} }
/* Intentional fallthrough */ /* Intentional fallthrough */
...@@ -785,9 +785,10 @@ static void ab8500_gpadc_read_calibration_data(struct ab8500_gpadc *gpadc) ...@@ -785,9 +785,10 @@ static void ab8500_gpadc_read_calibration_data(struct ab8500_gpadc *gpadc)
<< CALIB_SHIFT_IBAT) << CALIB_SHIFT_IBAT)
/ (ADC_CH_IBAT_MAX_V - ADC_CH_IBAT_MIN_V); / (ADC_CH_IBAT_MAX_V - ADC_CH_IBAT_MIN_V);
gpadc->cal_data[ADC_INPUT_IBAT].gain = V_gain * V2A_gain; gpadc->cal_data[ADC_INPUT_IBAT].gain =
gpadc->cal_data[ADC_INPUT_IBAT].offset = V_offset * V_gain * V2A_gain;
V2A_gain + V2A_offset; gpadc->cal_data[ADC_INPUT_IBAT].offset =
V_offset * V2A_gain + V2A_offset;
} else { } else {
gpadc->cal_data[ADC_INPUT_IBAT].gain = 0; gpadc->cal_data[ADC_INPUT_IBAT].gain = 0;
} }
...@@ -923,11 +924,10 @@ static int ab8500_gpadc_probe(struct platform_device *pdev) ...@@ -923,11 +924,10 @@ static int ab8500_gpadc_probe(struct platform_device *pdev)
int ret = 0; int ret = 0;
struct ab8500_gpadc *gpadc; struct ab8500_gpadc *gpadc;
gpadc = devm_kzalloc(&pdev->dev, sizeof(struct ab8500_gpadc), GFP_KERNEL); gpadc = devm_kzalloc(&pdev->dev,
if (!gpadc) { sizeof(struct ab8500_gpadc), GFP_KERNEL);
dev_err(&pdev->dev, "Error: No memory\n"); if (!gpadc)
return -ENOMEM; return -ENOMEM;
}
gpadc->irq_sw = platform_get_irq_byname(pdev, "SW_CONV_END"); gpadc->irq_sw = platform_get_irq_byname(pdev, "SW_CONV_END");
if (gpadc->irq_sw < 0) if (gpadc->irq_sw < 0)
...@@ -1072,18 +1072,19 @@ void ab8540_gpadc_get_otp(struct ab8500_gpadc *gpadc, ...@@ -1072,18 +1072,19 @@ void ab8540_gpadc_get_otp(struct ab8500_gpadc *gpadc,
*vmain_h = gpadc->cal_data[ADC_INPUT_VMAIN].otp_calib_hi; *vmain_h = gpadc->cal_data[ADC_INPUT_VMAIN].otp_calib_hi;
*btemp_l = gpadc->cal_data[ADC_INPUT_BTEMP].otp_calib_lo; *btemp_l = gpadc->cal_data[ADC_INPUT_BTEMP].otp_calib_lo;
*btemp_h = gpadc->cal_data[ADC_INPUT_BTEMP].otp_calib_hi; *btemp_h = gpadc->cal_data[ADC_INPUT_BTEMP].otp_calib_hi;
*vbat_l = gpadc->cal_data[ADC_INPUT_VBAT].otp_calib_lo; *vbat_l = gpadc->cal_data[ADC_INPUT_VBAT].otp_calib_lo;
*vbat_h = gpadc->cal_data[ADC_INPUT_VBAT].otp_calib_hi; *vbat_h = gpadc->cal_data[ADC_INPUT_VBAT].otp_calib_hi;
*ibat_l = gpadc->cal_data[ADC_INPUT_IBAT].otp_calib_lo; *ibat_l = gpadc->cal_data[ADC_INPUT_IBAT].otp_calib_lo;
*ibat_h = gpadc->cal_data[ADC_INPUT_IBAT].otp_calib_hi; *ibat_h = gpadc->cal_data[ADC_INPUT_IBAT].otp_calib_hi;
return ;
} }
subsys_initcall_sync(ab8500_gpadc_init); subsys_initcall_sync(ab8500_gpadc_init);
module_exit(ab8500_gpadc_exit); module_exit(ab8500_gpadc_exit);
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("Arun R Murthy, Daniel Willerud, Johan Palsson," MODULE_AUTHOR("Arun R Murthy");
"M'boumba Cedric Madianga"); MODULE_AUTHOR("Daniel Willerud");
MODULE_AUTHOR("Johan Palsson");
MODULE_AUTHOR("M'boumba Cedric Madianga");
MODULE_ALIAS("platform:ab8500_gpadc"); MODULE_ALIAS("platform:ab8500_gpadc");
MODULE_DESCRIPTION("AB8500 GPADC driver"); MODULE_DESCRIPTION("AB8500 GPADC driver");
...@@ -27,7 +27,7 @@ static void ab8500_power_off(void) ...@@ -27,7 +27,7 @@ static void ab8500_power_off(void)
{ {
sigset_t old; sigset_t old;
sigset_t all; sigset_t all;
static char *pss[] = {"ab8500_ac", "pm2301", "ab8500_usb"}; static const char * const pss[] = {"ab8500_ac", "pm2301", "ab8500_usb"};
int i; int i;
bool charger_present = false; bool charger_present = false;
union power_supply_propval val; union power_supply_propval val;
...@@ -68,10 +68,9 @@ static void ab8500_power_off(void) ...@@ -68,10 +68,9 @@ static void ab8500_power_off(void)
ret = power_supply_get_property(psy, ret = power_supply_get_property(psy,
POWER_SUPPLY_PROP_TECHNOLOGY, &val); POWER_SUPPLY_PROP_TECHNOLOGY, &val);
if (!ret && val.intval != POWER_SUPPLY_TECHNOLOGY_UNKNOWN) { if (!ret && val.intval != POWER_SUPPLY_TECHNOLOGY_UNKNOWN) {
printk(KERN_INFO pr_info("Charger '%s' is connected with known battery",
"Charger \"%s\" is connected with known battery." pss[i]);
" Rebooting.\n", pr_info(" - Rebooting.\n");
pss[i]);
machine_restart("charging"); machine_restart("charging");
} }
power_supply_put(psy); power_supply_put(psy);
...@@ -161,8 +160,8 @@ static int ab8500_sysctrl_probe(struct platform_device *pdev) ...@@ -161,8 +160,8 @@ static int ab8500_sysctrl_probe(struct platform_device *pdev)
pdata->initial_req_buf_config[j]); pdata->initial_req_buf_config[j]);
if (ret < 0) { if (ret < 0) {
dev_err(&pdev->dev, dev_err(&pdev->dev,
"unable to set sysClkReq%dRfClkBuf: " "Can't set sysClkReq%dRfClkBuf: %d\n",
"%d\n", j + 1, ret); j + 1, ret);
} }
} }
} }
......
...@@ -9,10 +9,10 @@ ...@@ -9,10 +9,10 @@
* *
* Derived from da903x: * Derived from da903x:
* Copyright (C) 2008 Compulab, Ltd. * Copyright (C) 2008 Compulab, Ltd.
* Mike Rapoport <mike@compulab.co.il> * Mike Rapoport <mike@compulab.co.il>
* *
* Copyright (C) 2006-2008 Marvell International Ltd. * Copyright (C) 2006-2008 Marvell International Ltd.
* Eric Miao <eric.miao@marvell.com> * Eric Miao <eric.miao@marvell.com>
* *
* Licensed under the GPL-2 or later. * Licensed under the GPL-2 or later.
*/ */
...@@ -355,7 +355,7 @@ static struct i2c_driver adp5520_driver = { ...@@ -355,7 +355,7 @@ static struct i2c_driver adp5520_driver = {
}, },
.probe = adp5520_probe, .probe = adp5520_probe,
.remove = adp5520_remove, .remove = adp5520_remove,
.id_table = adp5520_id, .id_table = adp5520_id,
}; };
module_i2c_driver(adp5520_driver); module_i2c_driver(adp5520_driver);
......
...@@ -238,7 +238,7 @@ static int arizona_poll_reg(struct arizona *arizona, ...@@ -238,7 +238,7 @@ static int arizona_poll_reg(struct arizona *arizona,
if ((val & mask) == target) if ((val & mask) == target)
return 0; return 0;
msleep(1); usleep_range(1000, 5000);
} }
dev_err(arizona->dev, "Polling reg %u timed out: %x\n", reg, val); dev_err(arizona->dev, "Polling reg %u timed out: %x\n", reg, val);
...@@ -279,14 +279,14 @@ static void arizona_disable_reset(struct arizona *arizona) ...@@ -279,14 +279,14 @@ static void arizona_disable_reset(struct arizona *arizona)
case WM5110: case WM5110:
case WM8280: case WM8280:
/* Meet requirements for minimum reset duration */ /* Meet requirements for minimum reset duration */
msleep(5); usleep_range(5000, 10000);
break; break;
default: default:
break; break;
} }
gpio_set_value_cansleep(arizona->pdata.reset, 1); gpio_set_value_cansleep(arizona->pdata.reset, 1);
msleep(1); usleep_range(1000, 5000);
} }
} }
...@@ -598,6 +598,12 @@ static int arizona_runtime_resume(struct device *dev) ...@@ -598,6 +598,12 @@ static int arizona_runtime_resume(struct device *dev)
goto err; goto err;
} }
break; break;
case WM1831:
case CS47L24:
ret = arizona_wait_for_boot(arizona);
if (ret != 0)
goto err;
break;
default: default:
ret = arizona_wait_for_boot(arizona); ret = arizona_wait_for_boot(arizona);
if (ret != 0) if (ret != 0)
...@@ -682,6 +688,9 @@ static int arizona_runtime_suspend(struct device *dev) ...@@ -682,6 +688,9 @@ static int arizona_runtime_suspend(struct device *dev)
} }
} }
break; break;
case WM1831:
case CS47L24:
break;
default: default:
jd_active = arizona_is_jack_det_active(arizona); jd_active = arizona_is_jack_det_active(arizona);
if (jd_active < 0) if (jd_active < 0)
...@@ -852,6 +861,16 @@ static int arizona_of_get_core_pdata(struct arizona *arizona) ...@@ -852,6 +861,16 @@ static int arizona_of_get_core_pdata(struct arizona *arizona)
count++; count++;
} }
count = 0;
of_property_for_each_u32(arizona->dev->of_node, "wlf,out-mono", prop,
cur, val) {
if (count == ARRAY_SIZE(pdata->out_mono))
break;
pdata->out_mono[count] = !!val;
count++;
}
return 0; return 0;
} }
...@@ -862,6 +881,8 @@ const struct of_device_id arizona_of_match[] = { ...@@ -862,6 +881,8 @@ const struct of_device_id arizona_of_match[] = {
{ .compatible = "wlf,wm8997", .data = (void *)WM8997 }, { .compatible = "wlf,wm8997", .data = (void *)WM8997 },
{ .compatible = "wlf,wm8998", .data = (void *)WM8998 }, { .compatible = "wlf,wm8998", .data = (void *)WM8998 },
{ .compatible = "wlf,wm1814", .data = (void *)WM1814 }, { .compatible = "wlf,wm1814", .data = (void *)WM1814 },
{ .compatible = "wlf,wm1831", .data = (void *)WM1831 },
{ .compatible = "cirrus,cs47l24", .data = (void *)CS47L24 },
{}, {},
}; };
EXPORT_SYMBOL_GPL(arizona_of_match); EXPORT_SYMBOL_GPL(arizona_of_match);
...@@ -919,6 +940,23 @@ static const struct mfd_cell wm5110_devs[] = { ...@@ -919,6 +940,23 @@ static const struct mfd_cell wm5110_devs[] = {
}, },
}; };
static const char * const cs47l24_supplies[] = {
"MICVDD",
"CPVDD",
"SPKVDD",
};
static const struct mfd_cell cs47l24_devs[] = {
{ .name = "arizona-gpio" },
{ .name = "arizona-haptics" },
{ .name = "arizona-pwm" },
{
.name = "cs47l24-codec",
.parent_supplies = cs47l24_supplies,
.num_parent_supplies = ARRAY_SIZE(cs47l24_supplies),
},
};
static const char * const wm8997_supplies[] = { static const char * const wm8997_supplies[] = {
"MICVDD", "MICVDD",
"DBVDD2", "DBVDD2",
...@@ -963,7 +1001,7 @@ static const struct mfd_cell wm8998_devs[] = { ...@@ -963,7 +1001,7 @@ static const struct mfd_cell wm8998_devs[] = {
int arizona_dev_init(struct arizona *arizona) int arizona_dev_init(struct arizona *arizona)
{ {
struct device *dev = arizona->dev; struct device *dev = arizona->dev;
const char *type_name; const char *type_name = NULL;
unsigned int reg, val, mask; unsigned int reg, val, mask;
int (*apply_patch)(struct arizona *) = NULL; int (*apply_patch)(struct arizona *) = NULL;
const struct mfd_cell *subdevs = NULL; const struct mfd_cell *subdevs = NULL;
...@@ -987,6 +1025,8 @@ int arizona_dev_init(struct arizona *arizona) ...@@ -987,6 +1025,8 @@ int arizona_dev_init(struct arizona *arizona)
case WM8997: case WM8997:
case WM8998: case WM8998:
case WM1814: case WM1814:
case WM1831:
case CS47L24:
for (i = 0; i < ARRAY_SIZE(wm5102_core_supplies); i++) for (i = 0; i < ARRAY_SIZE(wm5102_core_supplies); i++)
arizona->core_supplies[i].supply arizona->core_supplies[i].supply
= wm5102_core_supplies[i]; = wm5102_core_supplies[i];
...@@ -1001,11 +1041,18 @@ int arizona_dev_init(struct arizona *arizona) ...@@ -1001,11 +1041,18 @@ int arizona_dev_init(struct arizona *arizona)
/* Mark DCVDD as external, LDO1 driver will clear if internal */ /* Mark DCVDD as external, LDO1 driver will clear if internal */
arizona->external_dcvdd = true; arizona->external_dcvdd = true;
ret = mfd_add_devices(arizona->dev, -1, early_devs, switch (arizona->type) {
ARRAY_SIZE(early_devs), NULL, 0, NULL); case WM1831:
if (ret != 0) { case CS47L24:
dev_err(dev, "Failed to add early children: %d\n", ret); break; /* No LDO1 regulator */
return ret; default:
ret = mfd_add_devices(arizona->dev, -1, early_devs,
ARRAY_SIZE(early_devs), NULL, 0, NULL);
if (ret != 0) {
dev_err(dev, "Failed to add early children: %d\n", ret);
return ret;
}
break;
} }
ret = devm_regulator_bulk_get(dev, arizona->num_core_supplies, ret = devm_regulator_bulk_get(dev, arizona->num_core_supplies,
...@@ -1069,6 +1116,7 @@ int arizona_dev_init(struct arizona *arizona) ...@@ -1069,6 +1116,7 @@ int arizona_dev_init(struct arizona *arizona)
case 0x5102: case 0x5102:
case 0x5110: case 0x5110:
case 0x6349: case 0x6349:
case 0x6363:
case 0x8997: case 0x8997:
break; break;
default: default:
...@@ -1084,7 +1132,7 @@ int arizona_dev_init(struct arizona *arizona) ...@@ -1084,7 +1132,7 @@ int arizona_dev_init(struct arizona *arizona)
goto err_reset; goto err_reset;
} }
msleep(1); usleep_range(1000, 5000);
} }
/* Ensure device startup is complete */ /* Ensure device startup is complete */
...@@ -1167,6 +1215,30 @@ int arizona_dev_init(struct arizona *arizona) ...@@ -1167,6 +1215,30 @@ int arizona_dev_init(struct arizona *arizona)
n_subdevs = ARRAY_SIZE(wm5110_devs); n_subdevs = ARRAY_SIZE(wm5110_devs);
} }
break; break;
case 0x6363:
if (IS_ENABLED(CONFIG_MFD_CS47L24)) {
switch (arizona->type) {
case CS47L24:
type_name = "CS47L24";
break;
case WM1831:
type_name = "WM1831";
break;
default:
dev_warn(arizona->dev,
"CS47L24 registered as %d\n",
arizona->type);
arizona->type = CS47L24;
break;
}
apply_patch = cs47l24_patch;
subdevs = cs47l24_devs;
n_subdevs = ARRAY_SIZE(cs47l24_devs);
}
break;
case 0x8997: case 0x8997:
if (IS_ENABLED(CONFIG_MFD_WM8997)) { if (IS_ENABLED(CONFIG_MFD_WM8997)) {
type_name = "WM8997"; type_name = "WM8997";
......
...@@ -88,7 +88,9 @@ static int arizona_i2c_probe(struct i2c_client *i2c, ...@@ -88,7 +88,9 @@ static int arizona_i2c_probe(struct i2c_client *i2c,
static int arizona_i2c_remove(struct i2c_client *i2c) static int arizona_i2c_remove(struct i2c_client *i2c)
{ {
struct arizona *arizona = dev_get_drvdata(&i2c->dev); struct arizona *arizona = dev_get_drvdata(&i2c->dev);
arizona_dev_exit(arizona); arizona_dev_exit(arizona);
return 0; return 0;
} }
......
...@@ -30,11 +30,13 @@ static int arizona_map_irq(struct arizona *arizona, int irq) ...@@ -30,11 +30,13 @@ static int arizona_map_irq(struct arizona *arizona, int irq)
{ {
int ret; int ret;
ret = regmap_irq_get_virq(arizona->aod_irq_chip, irq); if (arizona->aod_irq_chip) {
if (ret < 0) ret = regmap_irq_get_virq(arizona->aod_irq_chip, irq);
ret = regmap_irq_get_virq(arizona->irq_chip, irq); if (ret >= 0)
return ret;
}
return ret; return regmap_irq_get_virq(arizona->irq_chip, irq);
} }
int arizona_request_irq(struct arizona *arizona, int irq, char *name, int arizona_request_irq(struct arizona *arizona, int irq, char *name,
...@@ -107,8 +109,8 @@ static irqreturn_t arizona_irq_thread(int irq, void *data) ...@@ -107,8 +109,8 @@ static irqreturn_t arizona_irq_thread(int irq, void *data)
do { do {
poll = false; poll = false;
/* Always handle the AoD domain */ if (arizona->aod_irq_chip)
handle_nested_irq(irq_find_mapping(arizona->virq, 0)); handle_nested_irq(irq_find_mapping(arizona->virq, 0));
/* /*
* Check if one of the main interrupts is asserted and only * Check if one of the main interrupts is asserted and only
...@@ -219,6 +221,15 @@ int arizona_irq_init(struct arizona *arizona) ...@@ -219,6 +221,15 @@ int arizona_irq_init(struct arizona *arizona)
arizona->ctrlif_error = false; arizona->ctrlif_error = false;
break; break;
#endif #endif
#ifdef CONFIG_MFD_CS47L24
case WM1831:
case CS47L24:
aod = NULL;
irq = &cs47l24_irq;
arizona->ctrlif_error = false;
break;
#endif
#ifdef CONFIG_MFD_WM8997 #ifdef CONFIG_MFD_WM8997
case WM8997: case WM8997:
aod = &wm8997_aod; aod = &wm8997_aod;
...@@ -291,13 +302,16 @@ int arizona_irq_init(struct arizona *arizona) ...@@ -291,13 +302,16 @@ int arizona_irq_init(struct arizona *arizona)
goto err; goto err;
} }
ret = regmap_add_irq_chip(arizona->regmap, if (aod) {
irq_create_mapping(arizona->virq, 0), ret = regmap_add_irq_chip(arizona->regmap,
IRQF_ONESHOT, 0, aod, irq_create_mapping(arizona->virq, 0),
&arizona->aod_irq_chip); IRQF_ONESHOT, 0, aod,
if (ret != 0) { &arizona->aod_irq_chip);
dev_err(arizona->dev, "Failed to add AOD IRQs: %d\n", ret); if (ret != 0) {
goto err_domain; dev_err(arizona->dev,
"Failed to add AOD IRQs: %d\n", ret);
goto err;
}
} }
ret = regmap_add_irq_chip(arizona->regmap, ret = regmap_add_irq_chip(arizona->regmap,
...@@ -309,30 +323,6 @@ int arizona_irq_init(struct arizona *arizona) ...@@ -309,30 +323,6 @@ int arizona_irq_init(struct arizona *arizona)
goto err_aod; goto err_aod;
} }
/* Make sure the boot done IRQ is unmasked for resumes */
i = arizona_map_irq(arizona, ARIZONA_IRQ_BOOT_DONE);
ret = request_threaded_irq(i, NULL, arizona_boot_done, IRQF_ONESHOT,
"Boot done", arizona);
if (ret != 0) {
dev_err(arizona->dev, "Failed to request boot done %d: %d\n",
arizona->irq, ret);
goto err_boot_done;
}
/* Handle control interface errors in the core */
if (arizona->ctrlif_error) {
i = arizona_map_irq(arizona, ARIZONA_IRQ_CTRLIF_ERR);
ret = request_threaded_irq(i, NULL, arizona_ctrlif_err,
IRQF_ONESHOT,
"Control interface error", arizona);
if (ret != 0) {
dev_err(arizona->dev,
"Failed to request CTRLIF_ERR %d: %d\n",
arizona->irq, ret);
goto err_ctrlif;
}
}
/* Used to emulate edge trigger and to work around broken pinmux */ /* Used to emulate edge trigger and to work around broken pinmux */
if (arizona->pdata.irq_gpio) { if (arizona->pdata.irq_gpio) {
if (gpio_to_irq(arizona->pdata.irq_gpio) != arizona->irq) { if (gpio_to_irq(arizona->pdata.irq_gpio) != arizona->irq) {
...@@ -362,21 +352,42 @@ int arizona_irq_init(struct arizona *arizona) ...@@ -362,21 +352,42 @@ int arizona_irq_init(struct arizona *arizona)
goto err_main_irq; goto err_main_irq;
} }
/* Make sure the boot done IRQ is unmasked for resumes */
i = arizona_map_irq(arizona, ARIZONA_IRQ_BOOT_DONE);
ret = request_threaded_irq(i, NULL, arizona_boot_done, IRQF_ONESHOT,
"Boot done", arizona);
if (ret != 0) {
dev_err(arizona->dev, "Failed to request boot done %d: %d\n",
arizona->irq, ret);
goto err_boot_done;
}
/* Handle control interface errors in the core */
if (arizona->ctrlif_error) {
i = arizona_map_irq(arizona, ARIZONA_IRQ_CTRLIF_ERR);
ret = request_threaded_irq(i, NULL, arizona_ctrlif_err,
IRQF_ONESHOT,
"Control interface error", arizona);
if (ret != 0) {
dev_err(arizona->dev,
"Failed to request CTRLIF_ERR %d: %d\n",
arizona->irq, ret);
goto err_ctrlif;
}
}
return 0; return 0;
err_main_irq:
if (arizona->ctrlif_error)
free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_CTRLIF_ERR),
arizona);
err_ctrlif: err_ctrlif:
free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_BOOT_DONE), arizona); free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_BOOT_DONE), arizona);
err_boot_done: err_boot_done:
free_irq(arizona->irq, arizona);
err_main_irq:
regmap_del_irq_chip(irq_create_mapping(arizona->virq, 1), regmap_del_irq_chip(irq_create_mapping(arizona->virq, 1),
arizona->irq_chip); arizona->irq_chip);
err_aod: err_aod:
regmap_del_irq_chip(irq_create_mapping(arizona->virq, 0), regmap_del_irq_chip(irq_create_mapping(arizona->virq, 0),
arizona->aod_irq_chip); arizona->aod_irq_chip);
err_domain:
err: err:
return ret; return ret;
} }
......
...@@ -46,6 +46,11 @@ static int arizona_spi_probe(struct spi_device *spi) ...@@ -46,6 +46,11 @@ static int arizona_spi_probe(struct spi_device *spi)
if (IS_ENABLED(CONFIG_MFD_WM5110)) if (IS_ENABLED(CONFIG_MFD_WM5110))
regmap_config = &wm5110_spi_regmap; regmap_config = &wm5110_spi_regmap;
break; break;
case WM1831:
case CS47L24:
if (IS_ENABLED(CONFIG_MFD_CS47L24))
regmap_config = &cs47l24_spi_regmap;
break;
default: default:
dev_err(&spi->dev, "Unknown device type %ld\n", type); dev_err(&spi->dev, "Unknown device type %ld\n", type);
return -EINVAL; return -EINVAL;
...@@ -89,6 +94,8 @@ static const struct spi_device_id arizona_spi_ids[] = { ...@@ -89,6 +94,8 @@ static const struct spi_device_id arizona_spi_ids[] = {
{ "wm5102", WM5102 }, { "wm5102", WM5102 },
{ "wm5110", WM5110 }, { "wm5110", WM5110 },
{ "wm8280", WM8280 }, { "wm8280", WM8280 },
{ "wm1831", WM1831 },
{ "cs47l24", CS47L24 },
{ }, { },
}; };
MODULE_DEVICE_TABLE(spi, arizona_spi_ids); MODULE_DEVICE_TABLE(spi, arizona_spi_ids);
......
...@@ -25,6 +25,8 @@ extern const struct regmap_config wm5102_spi_regmap; ...@@ -25,6 +25,8 @@ extern const struct regmap_config wm5102_spi_regmap;
extern const struct regmap_config wm5110_i2c_regmap; extern const struct regmap_config wm5110_i2c_regmap;
extern const struct regmap_config wm5110_spi_regmap; extern const struct regmap_config wm5110_spi_regmap;
extern const struct regmap_config cs47l24_spi_regmap;
extern const struct regmap_config wm8997_i2c_regmap; extern const struct regmap_config wm8997_i2c_regmap;
extern const struct regmap_config wm8998_i2c_regmap; extern const struct regmap_config wm8998_i2c_regmap;
...@@ -40,6 +42,8 @@ extern const struct regmap_irq_chip wm5110_aod; ...@@ -40,6 +42,8 @@ extern const struct regmap_irq_chip wm5110_aod;
extern const struct regmap_irq_chip wm5110_irq; extern const struct regmap_irq_chip wm5110_irq;
extern const struct regmap_irq_chip wm5110_revd_irq; extern const struct regmap_irq_chip wm5110_revd_irq;
extern const struct regmap_irq_chip cs47l24_irq;
extern const struct regmap_irq_chip wm8997_aod; extern const struct regmap_irq_chip wm8997_aod;
extern const struct regmap_irq_chip wm8997_irq; extern const struct regmap_irq_chip wm8997_irq;
......
...@@ -136,17 +136,13 @@ static int as3711_i2c_probe(struct i2c_client *client, ...@@ -136,17 +136,13 @@ static int as3711_i2c_probe(struct i2c_client *client,
} else { } else {
pdata = devm_kzalloc(&client->dev, pdata = devm_kzalloc(&client->dev,
sizeof(*pdata), GFP_KERNEL); sizeof(*pdata), GFP_KERNEL);
if (!pdata) { if (!pdata)
dev_err(&client->dev, "Failed to allocate pdata\n");
return -ENOMEM; return -ENOMEM;
}
} }
as3711 = devm_kzalloc(&client->dev, sizeof(struct as3711), GFP_KERNEL); as3711 = devm_kzalloc(&client->dev, sizeof(struct as3711), GFP_KERNEL);
if (!as3711) { if (!as3711)
dev_err(&client->dev, "Memory allocation failed\n");
return -ENOMEM; return -ENOMEM;
}
as3711->dev = &client->dev; as3711->dev = &client->dev;
i2c_set_clientdata(client, as3711); i2c_set_clientdata(client, as3711);
...@@ -157,7 +153,8 @@ static int as3711_i2c_probe(struct i2c_client *client, ...@@ -157,7 +153,8 @@ static int as3711_i2c_probe(struct i2c_client *client,
as3711->regmap = devm_regmap_init_i2c(client, &as3711_regmap_config); as3711->regmap = devm_regmap_init_i2c(client, &as3711_regmap_config);
if (IS_ERR(as3711->regmap)) { if (IS_ERR(as3711->regmap)) {
ret = PTR_ERR(as3711->regmap); ret = PTR_ERR(as3711->regmap);
dev_err(&client->dev, "regmap initialization failed: %d\n", ret); dev_err(&client->dev,
"regmap initialization failed: %d\n", ret);
return ret; return ret;
} }
...@@ -172,12 +169,19 @@ static int as3711_i2c_probe(struct i2c_client *client, ...@@ -172,12 +169,19 @@ static int as3711_i2c_probe(struct i2c_client *client,
return -ENODEV; return -ENODEV;
dev_info(as3711->dev, "AS3711 detected: %x:%x\n", id1, id2); dev_info(as3711->dev, "AS3711 detected: %x:%x\n", id1, id2);
/* We can reuse as3711_subdevs[], it will be copied in mfd_add_devices() */ /*
* We can reuse as3711_subdevs[],
* it will be copied in mfd_add_devices()
*/
if (pdata) { if (pdata) {
as3711_subdevs[AS3711_REGULATOR].platform_data = &pdata->regulator; as3711_subdevs[AS3711_REGULATOR].platform_data =
as3711_subdevs[AS3711_REGULATOR].pdata_size = sizeof(pdata->regulator); &pdata->regulator;
as3711_subdevs[AS3711_BACKLIGHT].platform_data = &pdata->backlight; as3711_subdevs[AS3711_REGULATOR].pdata_size =
as3711_subdevs[AS3711_BACKLIGHT].pdata_size = sizeof(pdata->backlight); sizeof(pdata->regulator);
as3711_subdevs[AS3711_BACKLIGHT].platform_data =
&pdata->backlight;
as3711_subdevs[AS3711_BACKLIGHT].pdata_size =
sizeof(pdata->backlight);
} else { } else {
as3711_subdevs[AS3711_REGULATOR].platform_data = NULL; as3711_subdevs[AS3711_REGULATOR].platform_data = NULL;
as3711_subdevs[AS3711_REGULATOR].pdata_size = 0; as3711_subdevs[AS3711_REGULATOR].pdata_size = 0;
......
...@@ -405,6 +405,8 @@ static int as3722_i2c_probe(struct i2c_client *i2c, ...@@ -405,6 +405,8 @@ static int as3722_i2c_probe(struct i2c_client *i2c,
goto scrub; goto scrub;
} }
device_init_wakeup(as3722->dev, true);
dev_dbg(as3722->dev, "AS3722 core driver initialized successfully\n"); dev_dbg(as3722->dev, "AS3722 core driver initialized successfully\n");
return 0; return 0;
...@@ -422,6 +424,29 @@ static int as3722_i2c_remove(struct i2c_client *i2c) ...@@ -422,6 +424,29 @@ static int as3722_i2c_remove(struct i2c_client *i2c)
return 0; return 0;
} }
static int __maybe_unused as3722_i2c_suspend(struct device *dev)
{
struct as3722 *as3722 = dev_get_drvdata(dev);
if (device_may_wakeup(dev))
enable_irq_wake(as3722->chip_irq);
disable_irq(as3722->chip_irq);
return 0;
}
static int __maybe_unused as3722_i2c_resume(struct device *dev)
{
struct as3722 *as3722 = dev_get_drvdata(dev);
enable_irq(as3722->chip_irq);
if (device_may_wakeup(dev))
disable_irq_wake(as3722->chip_irq);
return 0;
}
static const struct of_device_id as3722_of_match[] = { static const struct of_device_id as3722_of_match[] = {
{ .compatible = "ams,as3722", }, { .compatible = "ams,as3722", },
{}, {},
...@@ -434,10 +459,15 @@ static const struct i2c_device_id as3722_i2c_id[] = { ...@@ -434,10 +459,15 @@ static const struct i2c_device_id as3722_i2c_id[] = {
}; };
MODULE_DEVICE_TABLE(i2c, as3722_i2c_id); MODULE_DEVICE_TABLE(i2c, as3722_i2c_id);
static const struct dev_pm_ops as3722_pm_ops = {
SET_SYSTEM_SLEEP_PM_OPS(as3722_i2c_suspend, as3722_i2c_resume)
};
static struct i2c_driver as3722_i2c_driver = { static struct i2c_driver as3722_i2c_driver = {
.driver = { .driver = {
.name = "as3722", .name = "as3722",
.of_match_table = as3722_of_match, .of_match_table = as3722_of_match,
.pm = &as3722_pm_ops,
}, },
.probe = as3722_i2c_probe, .probe = as3722_i2c_probe,
.remove = as3722_i2c_remove, .remove = as3722_i2c_remove,
......
...@@ -167,7 +167,6 @@ static void asic3_irq_demux(struct irq_desc *desc) ...@@ -167,7 +167,6 @@ static void asic3_irq_demux(struct irq_desc *desc)
base = ASIC3_GPIO_A_BASE base = ASIC3_GPIO_A_BASE
+ bank * ASIC3_GPIO_BASE_INCR; + bank * ASIC3_GPIO_BASE_INCR;
spin_lock_irqsave(&asic->lock, flags); spin_lock_irqsave(&asic->lock, flags);
istat = asic3_read_register(asic, istat = asic3_read_register(asic,
base + base +
...@@ -502,7 +501,8 @@ static int asic3_gpio_get(struct gpio_chip *chip, ...@@ -502,7 +501,8 @@ static int asic3_gpio_get(struct gpio_chip *chip,
return -EINVAL; return -EINVAL;
} }
return asic3_read_register(asic, gpio_base + ASIC3_GPIO_STATUS) & mask; return !!(asic3_read_register(asic,
gpio_base + ASIC3_GPIO_STATUS) & mask);
} }
static void asic3_gpio_set(struct gpio_chip *chip, static void asic3_gpio_set(struct gpio_chip *chip,
...@@ -536,8 +536,6 @@ static void asic3_gpio_set(struct gpio_chip *chip, ...@@ -536,8 +536,6 @@ static void asic3_gpio_set(struct gpio_chip *chip,
asic3_write_register(asic, gpio_base + ASIC3_GPIO_OUT, out_reg); asic3_write_register(asic, gpio_base + ASIC3_GPIO_OUT, out_reg);
spin_unlock_irqrestore(&asic->lock, flags); spin_unlock_irqrestore(&asic->lock, flags);
return;
} }
static int asic3_gpio_to_irq(struct gpio_chip *chip, unsigned offset) static int asic3_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
...@@ -665,18 +663,18 @@ static int ds1wm_enable(struct platform_device *pdev) ...@@ -665,18 +663,18 @@ static int ds1wm_enable(struct platform_device *pdev)
asic3_clk_enable(asic, &asic->clocks[ASIC3_CLOCK_EX0]); asic3_clk_enable(asic, &asic->clocks[ASIC3_CLOCK_EX0]);
asic3_clk_enable(asic, &asic->clocks[ASIC3_CLOCK_EX1]); asic3_clk_enable(asic, &asic->clocks[ASIC3_CLOCK_EX1]);
asic3_clk_enable(asic, &asic->clocks[ASIC3_CLOCK_OWM]); asic3_clk_enable(asic, &asic->clocks[ASIC3_CLOCK_OWM]);
msleep(1); usleep_range(1000, 5000);
/* Reset and enable DS1WM */ /* Reset and enable DS1WM */
asic3_set_register(asic, ASIC3_OFFSET(EXTCF, RESET), asic3_set_register(asic, ASIC3_OFFSET(EXTCF, RESET),
ASIC3_EXTCF_OWM_RESET, 1); ASIC3_EXTCF_OWM_RESET, 1);
msleep(1); usleep_range(1000, 5000);
asic3_set_register(asic, ASIC3_OFFSET(EXTCF, RESET), asic3_set_register(asic, ASIC3_OFFSET(EXTCF, RESET),
ASIC3_EXTCF_OWM_RESET, 0); ASIC3_EXTCF_OWM_RESET, 0);
msleep(1); usleep_range(1000, 5000);
asic3_set_register(asic, ASIC3_OFFSET(EXTCF, SELECT), asic3_set_register(asic, ASIC3_OFFSET(EXTCF, SELECT),
ASIC3_EXTCF_OWM_EN, 1); ASIC3_EXTCF_OWM_EN, 1);
msleep(1); usleep_range(1000, 5000);
return 0; return 0;
} }
...@@ -757,7 +755,7 @@ static int asic3_mmc_enable(struct platform_device *pdev) ...@@ -757,7 +755,7 @@ static int asic3_mmc_enable(struct platform_device *pdev)
* when HCLK is stopped. * when HCLK is stopped.
*/ */
asic3_clk_enable(asic, &asic->clocks[ASIC3_CLOCK_EX1]); asic3_clk_enable(asic, &asic->clocks[ASIC3_CLOCK_EX1]);
msleep(1); usleep_range(1000, 5000);
/* HCLK 24.576 MHz, BCLK 12.288 MHz: */ /* HCLK 24.576 MHz, BCLK 12.288 MHz: */
asic3_write_register(asic, ASIC3_OFFSET(CLOCK, SEL), asic3_write_register(asic, ASIC3_OFFSET(CLOCK, SEL),
...@@ -765,7 +763,7 @@ static int asic3_mmc_enable(struct platform_device *pdev) ...@@ -765,7 +763,7 @@ static int asic3_mmc_enable(struct platform_device *pdev)
asic3_clk_enable(asic, &asic->clocks[ASIC3_CLOCK_SD_HOST]); asic3_clk_enable(asic, &asic->clocks[ASIC3_CLOCK_SD_HOST]);
asic3_clk_enable(asic, &asic->clocks[ASIC3_CLOCK_SD_BUS]); asic3_clk_enable(asic, &asic->clocks[ASIC3_CLOCK_SD_BUS]);
msleep(1); usleep_range(1000, 5000);
asic3_set_register(asic, ASIC3_OFFSET(EXTCF, SELECT), asic3_set_register(asic, ASIC3_OFFSET(EXTCF, SELECT),
ASIC3_EXTCF_SD_MEM_ENABLE, 1); ASIC3_EXTCF_SD_MEM_ENABLE, 1);
...@@ -841,7 +839,7 @@ static int asic3_leds_suspend(struct platform_device *pdev) ...@@ -841,7 +839,7 @@ static int asic3_leds_suspend(struct platform_device *pdev)
struct asic3 *asic = dev_get_drvdata(pdev->dev.parent); struct asic3 *asic = dev_get_drvdata(pdev->dev.parent);
while (asic3_gpio_get(&asic->gpio, ASIC3_GPIO(C, cell->id)) != 0) while (asic3_gpio_get(&asic->gpio, ASIC3_GPIO(C, cell->id)) != 0)
msleep(1); usleep_range(1000, 5000);
asic3_clk_disable(asic, &asic->clocks[clock_ledn[cell->id]]); asic3_clk_disable(asic, &asic->clocks[clock_ledn[cell->id]]);
...@@ -900,8 +898,8 @@ static int __init asic3_mfd_probe(struct platform_device *pdev, ...@@ -900,8 +898,8 @@ static int __init asic3_mfd_probe(struct platform_device *pdev,
/* MMC */ /* MMC */
if (mem_sdio) { if (mem_sdio) {
asic->tmio_cnf = ioremap((ASIC3_SD_CONFIG_BASE >> asic->bus_shift) + asic->tmio_cnf = ioremap((ASIC3_SD_CONFIG_BASE >>
mem_sdio->start, asic->bus_shift) + mem_sdio->start,
ASIC3_SD_CONFIG_SIZE >> asic->bus_shift); ASIC3_SD_CONFIG_SIZE >> asic->bus_shift);
if (!asic->tmio_cnf) { if (!asic->tmio_cnf) {
ret = -ENOMEM; ret = -ENOMEM;
...@@ -962,10 +960,8 @@ static int __init asic3_probe(struct platform_device *pdev) ...@@ -962,10 +960,8 @@ static int __init asic3_probe(struct platform_device *pdev)
asic = devm_kzalloc(&pdev->dev, asic = devm_kzalloc(&pdev->dev,
sizeof(struct asic3), GFP_KERNEL); sizeof(struct asic3), GFP_KERNEL);
if (asic == NULL) { if (!asic)
printk(KERN_ERR "kzalloc failed\n");
return -ENOMEM; return -ENOMEM;
}
spin_lock_init(&asic->lock); spin_lock_init(&asic->lock);
platform_set_drvdata(pdev, asic); platform_set_drvdata(pdev, asic);
...@@ -1074,7 +1070,9 @@ static struct platform_driver asic3_device_driver = { ...@@ -1074,7 +1070,9 @@ static struct platform_driver asic3_device_driver = {
static int __init asic3_init(void) static int __init asic3_init(void)
{ {
int retval = 0; int retval = 0;
retval = platform_driver_probe(&asic3_device_driver, asic3_probe); retval = platform_driver_probe(&asic3_device_driver, asic3_probe);
return retval; return retval;
} }
......
...@@ -292,7 +292,7 @@ static int cros_ec_i2c_probe(struct i2c_client *client, ...@@ -292,7 +292,7 @@ static int cros_ec_i2c_probe(struct i2c_client *client,
struct cros_ec_device *ec_dev = NULL; struct cros_ec_device *ec_dev = NULL;
int err; int err;
ec_dev = devm_kzalloc(dev, sizeof(*ec_dev), GFP_KERNEL); ec_dev = devm_kzalloc(dev, sizeof(*ec_dev), GFP_KERNEL);
if (!ec_dev) if (!ec_dev)
return -ENOMEM; return -ENOMEM;
......
...@@ -113,7 +113,7 @@ static int terminate_request(struct cros_ec_device *ec_dev) ...@@ -113,7 +113,7 @@ static int terminate_request(struct cros_ec_device *ec_dev)
trans.delay_usecs = ec_spi->end_of_msg_delay; trans.delay_usecs = ec_spi->end_of_msg_delay;
spi_message_add_tail(&trans, &msg); spi_message_add_tail(&trans, &msg);
ret = spi_sync(ec_spi->spi, &msg); ret = spi_sync_locked(ec_spi->spi, &msg);
/* Reset end-of-response timer */ /* Reset end-of-response timer */
ec_spi->last_transfer_ns = ktime_get_ns(); ec_spi->last_transfer_ns = ktime_get_ns();
...@@ -147,7 +147,7 @@ static int receive_n_bytes(struct cros_ec_device *ec_dev, u8 *buf, int n) ...@@ -147,7 +147,7 @@ static int receive_n_bytes(struct cros_ec_device *ec_dev, u8 *buf, int n)
spi_message_init(&msg); spi_message_init(&msg);
spi_message_add_tail(&trans, &msg); spi_message_add_tail(&trans, &msg);
ret = spi_sync(ec_spi->spi, &msg); ret = spi_sync_locked(ec_spi->spi, &msg);
if (ret < 0) if (ret < 0)
dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret); dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret);
...@@ -175,7 +175,7 @@ static int cros_ec_spi_receive_packet(struct cros_ec_device *ec_dev, ...@@ -175,7 +175,7 @@ static int cros_ec_spi_receive_packet(struct cros_ec_device *ec_dev,
unsigned long deadline; unsigned long deadline;
int todo; int todo;
BUG_ON(EC_MSG_PREAMBLE_COUNT > ec_dev->din_size); BUG_ON(ec_dev->din_size < EC_MSG_PREAMBLE_COUNT);
/* Receive data until we see the header byte */ /* Receive data until we see the header byte */
deadline = jiffies + msecs_to_jiffies(EC_MSG_DEADLINE_MS); deadline = jiffies + msecs_to_jiffies(EC_MSG_DEADLINE_MS);
...@@ -283,7 +283,7 @@ static int cros_ec_spi_receive_response(struct cros_ec_device *ec_dev, ...@@ -283,7 +283,7 @@ static int cros_ec_spi_receive_response(struct cros_ec_device *ec_dev,
unsigned long deadline; unsigned long deadline;
int todo; int todo;
BUG_ON(EC_MSG_PREAMBLE_COUNT > ec_dev->din_size); BUG_ON(ec_dev->din_size < EC_MSG_PREAMBLE_COUNT);
/* Receive data until we see the header byte */ /* Receive data until we see the header byte */
deadline = jiffies + msecs_to_jiffies(EC_MSG_DEADLINE_MS); deadline = jiffies + msecs_to_jiffies(EC_MSG_DEADLINE_MS);
...@@ -391,10 +391,10 @@ static int cros_ec_pkt_xfer_spi(struct cros_ec_device *ec_dev, ...@@ -391,10 +391,10 @@ static int cros_ec_pkt_xfer_spi(struct cros_ec_device *ec_dev,
} }
rx_buf = kzalloc(len, GFP_KERNEL); rx_buf = kzalloc(len, GFP_KERNEL);
if (!rx_buf) { if (!rx_buf)
ret = -ENOMEM; return -ENOMEM;
goto exit;
} spi_bus_lock(ec_spi->spi->master);
/* /*
* Leave a gap between CS assertion and clocking of data to allow the * Leave a gap between CS assertion and clocking of data to allow the
...@@ -414,7 +414,7 @@ static int cros_ec_pkt_xfer_spi(struct cros_ec_device *ec_dev, ...@@ -414,7 +414,7 @@ static int cros_ec_pkt_xfer_spi(struct cros_ec_device *ec_dev,
trans.len = len; trans.len = len;
trans.cs_change = 1; trans.cs_change = 1;
spi_message_add_tail(&trans, &msg); spi_message_add_tail(&trans, &msg);
ret = spi_sync(ec_spi->spi, &msg); ret = spi_sync_locked(ec_spi->spi, &msg);
/* Get the response */ /* Get the response */
if (!ret) { if (!ret) {
...@@ -440,6 +440,9 @@ static int cros_ec_pkt_xfer_spi(struct cros_ec_device *ec_dev, ...@@ -440,6 +440,9 @@ static int cros_ec_pkt_xfer_spi(struct cros_ec_device *ec_dev,
} }
final_ret = terminate_request(ec_dev); final_ret = terminate_request(ec_dev);
spi_bus_unlock(ec_spi->spi->master);
if (!ret) if (!ret)
ret = final_ret; ret = final_ret;
if (ret < 0) if (ret < 0)
...@@ -520,10 +523,10 @@ static int cros_ec_cmd_xfer_spi(struct cros_ec_device *ec_dev, ...@@ -520,10 +523,10 @@ static int cros_ec_cmd_xfer_spi(struct cros_ec_device *ec_dev,
} }
rx_buf = kzalloc(len, GFP_KERNEL); rx_buf = kzalloc(len, GFP_KERNEL);
if (!rx_buf) { if (!rx_buf)
ret = -ENOMEM; return -ENOMEM;
goto exit;
} spi_bus_lock(ec_spi->spi->master);
/* Transmit phase - send our message */ /* Transmit phase - send our message */
debug_packet(ec_dev->dev, "out", ec_dev->dout, len); debug_packet(ec_dev->dev, "out", ec_dev->dout, len);
...@@ -534,7 +537,7 @@ static int cros_ec_cmd_xfer_spi(struct cros_ec_device *ec_dev, ...@@ -534,7 +537,7 @@ static int cros_ec_cmd_xfer_spi(struct cros_ec_device *ec_dev,
trans.cs_change = 1; trans.cs_change = 1;
spi_message_init(&msg); spi_message_init(&msg);
spi_message_add_tail(&trans, &msg); spi_message_add_tail(&trans, &msg);
ret = spi_sync(ec_spi->spi, &msg); ret = spi_sync_locked(ec_spi->spi, &msg);
/* Get the response */ /* Get the response */
if (!ret) { if (!ret) {
...@@ -560,6 +563,9 @@ static int cros_ec_cmd_xfer_spi(struct cros_ec_device *ec_dev, ...@@ -560,6 +563,9 @@ static int cros_ec_cmd_xfer_spi(struct cros_ec_device *ec_dev,
} }
final_ret = terminate_request(ec_dev); final_ret = terminate_request(ec_dev);
spi_bus_unlock(ec_spi->spi->master);
if (!ret) if (!ret)
ret = final_ret; ret = final_ret;
if (ret < 0) if (ret < 0)
......
This diff is collapsed.
...@@ -60,6 +60,7 @@ static int cs5535_mfd_res_enable(struct platform_device *pdev) ...@@ -60,6 +60,7 @@ static int cs5535_mfd_res_enable(struct platform_device *pdev)
static int cs5535_mfd_res_disable(struct platform_device *pdev) static int cs5535_mfd_res_disable(struct platform_device *pdev)
{ {
struct resource *res; struct resource *res;
res = platform_get_resource(pdev, IORESOURCE_IO, 0); res = platform_get_resource(pdev, IORESOURCE_IO, 0);
if (!res) { if (!res) {
dev_err(&pdev->dev, "can't fetch device resource info\n"); dev_err(&pdev->dev, "can't fetch device resource info\n");
...@@ -114,7 +115,10 @@ static struct mfd_cell cs5535_mfd_cells[] = { ...@@ -114,7 +115,10 @@ static struct mfd_cell cs5535_mfd_cells[] = {
#ifdef CONFIG_OLPC #ifdef CONFIG_OLPC
static void cs5535_clone_olpc_cells(void) static void cs5535_clone_olpc_cells(void)
{ {
const char *acpi_clones[] = { "olpc-xo1-pm-acpi", "olpc-xo1-sci-acpi" }; static const char *acpi_clones[] = {
"olpc-xo1-pm-acpi",
"olpc-xo1-sci-acpi"
};
if (!machine_is_olpc()) if (!machine_is_olpc())
return; return;
......
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
* Base driver for Dialog Semiconductor DA9030/DA9034 * Base driver for Dialog Semiconductor DA9030/DA9034
* *
* Copyright (C) 2008 Compulab, Ltd. * Copyright (C) 2008 Compulab, Ltd.
* Mike Rapoport <mike@compulab.co.il> * Mike Rapoport <mike@compulab.co.il>
* *
* Copyright (C) 2006-2008 Marvell International Ltd. * Copyright (C) 2006-2008 Marvell International Ltd.
* Eric Miao <eric.miao@marvell.com> * Eric Miao <eric.miao@marvell.com>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as * it under the terms of the GNU General Public License version 2 as
...@@ -60,7 +60,7 @@ struct da903x_chip_ops { ...@@ -60,7 +60,7 @@ struct da903x_chip_ops {
struct da903x_chip { struct da903x_chip {
struct i2c_client *client; struct i2c_client *client;
struct device *dev; struct device *dev;
struct da903x_chip_ops *ops; const struct da903x_chip_ops *ops;
int type; int type;
uint32_t events_mask; uint32_t events_mask;
...@@ -424,7 +424,7 @@ static irqreturn_t da903x_irq_handler(int irq, void *data) ...@@ -424,7 +424,7 @@ static irqreturn_t da903x_irq_handler(int irq, void *data)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static struct da903x_chip_ops da903x_ops[] = { static const struct da903x_chip_ops da903x_ops[] = {
[0] = { [0] = {
.init_chip = da9030_init_chip, .init_chip = da9030_init_chip,
.unmask_events = da9030_unmask_events, .unmask_events = da9030_unmask_events,
...@@ -565,6 +565,6 @@ static void __exit da903x_exit(void) ...@@ -565,6 +565,6 @@ static void __exit da903x_exit(void)
module_exit(da903x_exit); module_exit(da903x_exit);
MODULE_DESCRIPTION("PMIC Driver for Dialog Semiconductor DA9034"); MODULE_DESCRIPTION("PMIC Driver for Dialog Semiconductor DA9034");
MODULE_AUTHOR("Eric Miao <eric.miao@marvell.com>" MODULE_AUTHOR("Eric Miao <eric.miao@marvell.com>");
"Mike Rapoport <mike@compulab.co.il>"); MODULE_AUTHOR("Mike Rapoport <mike@compulab.co.il>");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL v2");
...@@ -70,7 +70,7 @@ static int da9052_i2c_fix(struct da9052 *da9052, unsigned char reg) ...@@ -70,7 +70,7 @@ static int da9052_i2c_fix(struct da9052 *da9052, unsigned char reg)
case DA9053_BA: case DA9053_BA:
case DA9053_BB: case DA9053_BB:
/* A dummy read to a safe register address. */ /* A dummy read to a safe register address. */
if (!i2c_safe_reg(reg)) if (!i2c_safe_reg(reg))
return regmap_read(da9052->regmap, return regmap_read(da9052->regmap,
DA9052_PARK_REGISTER, DA9052_PARK_REGISTER,
&val); &val);
......
...@@ -283,7 +283,7 @@ int da9052_irq_init(struct da9052 *da9052) ...@@ -283,7 +283,7 @@ int da9052_irq_init(struct da9052 *da9052)
int da9052_irq_exit(struct da9052 *da9052) int da9052_irq_exit(struct da9052 *da9052)
{ {
da9052_free_irq(da9052, DA9052_IRQ_ADC_EOM , da9052); da9052_free_irq(da9052, DA9052_IRQ_ADC_EOM, da9052);
regmap_del_irq_chip(da9052->chip_irq, da9052->irq_data); regmap_del_irq_chip(da9052->chip_irq, da9052->irq_data);
return 0; return 0;
......
...@@ -47,11 +47,8 @@ static int __init davinci_vc_probe(struct platform_device *pdev) ...@@ -47,11 +47,8 @@ static int __init davinci_vc_probe(struct platform_device *pdev)
davinci_vc = devm_kzalloc(&pdev->dev, davinci_vc = devm_kzalloc(&pdev->dev,
sizeof(struct davinci_vc), GFP_KERNEL); sizeof(struct davinci_vc), GFP_KERNEL);
if (!davinci_vc) { if (!davinci_vc)
dev_dbg(&pdev->dev,
"could not allocate memory for private data\n");
return -ENOMEM; return -ENOMEM;
}
davinci_vc->clk = devm_clk_get(&pdev->dev, NULL); davinci_vc->clk = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(davinci_vc->clk)) { if (IS_ERR(davinci_vc->clk)) {
......
...@@ -147,7 +147,7 @@ static int msp_gpio_get(struct gpio_chip *chip, unsigned offset) ...@@ -147,7 +147,7 @@ static int msp_gpio_get(struct gpio_chip *chip, unsigned offset)
return status; return status;
if (reg == DM355EVM_MSP_LED) if (reg == DM355EVM_MSP_LED)
msp_led_cache = status; msp_led_cache = status;
return status & MSP_GPIO_MASK(offset); return !!(status & MSP_GPIO_MASK(offset));
} }
static int msp_gpio_out(struct gpio_chip *chip, unsigned offset, int value) static int msp_gpio_out(struct gpio_chip *chip, unsigned offset, int value)
......
...@@ -163,7 +163,7 @@ static int egpio_get(struct gpio_chip *chip, unsigned offset) ...@@ -163,7 +163,7 @@ static int egpio_get(struct gpio_chip *chip, unsigned offset)
value = egpio_readw(ei, reg); value = egpio_readw(ei, reg);
pr_debug("readw(%p + %x) = %x\n", pr_debug("readw(%p + %x) = %x\n",
ei->base_addr, reg << ei->bus_shift, value); ei->base_addr, reg << ei->bus_shift, value);
return value & bit; return !!(value & bit);
} }
static int egpio_direction_input(struct gpio_chip *chip, unsigned offset) static int egpio_direction_input(struct gpio_chip *chip, unsigned offset)
......
...@@ -55,6 +55,7 @@ ...@@ -55,6 +55,7 @@
* document number TBD : Coleto Creek * document number TBD : Coleto Creek
* document number TBD : Wildcat Point-LP * document number TBD : Wildcat Point-LP
* document number TBD : 9 Series * document number TBD : 9 Series
* document number TBD : Lewisburg
*/ */
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
...@@ -213,6 +214,7 @@ enum lpc_chipsets { ...@@ -213,6 +214,7 @@ enum lpc_chipsets {
LPC_COLETO, /* Coleto Creek */ LPC_COLETO, /* Coleto Creek */
LPC_WPT_LP, /* Wildcat Point-LP */ LPC_WPT_LP, /* Wildcat Point-LP */
LPC_BRASWELL, /* Braswell SoC */ LPC_BRASWELL, /* Braswell SoC */
LPC_LEWISBURG, /* Lewisburg */
LPC_9S, /* 9 Series */ LPC_9S, /* 9 Series */
}; };
...@@ -521,6 +523,10 @@ static struct lpc_ich_info lpc_chipset_info[] = { ...@@ -521,6 +523,10 @@ static struct lpc_ich_info lpc_chipset_info[] = {
.name = "Braswell SoC", .name = "Braswell SoC",
.iTCO_version = 3, .iTCO_version = 3,
}, },
[LPC_LEWISBURG] = {
.name = "Lewisburg",
.iTCO_version = 2,
},
[LPC_9S] = { [LPC_9S] = {
.name = "9 Series", .name = "9 Series",
.iTCO_version = 2, .iTCO_version = 2,
...@@ -757,6 +763,15 @@ static const struct pci_device_id lpc_ich_ids[] = { ...@@ -757,6 +763,15 @@ static const struct pci_device_id lpc_ich_ids[] = {
{ PCI_VDEVICE(INTEL, 0x9cc6), LPC_WPT_LP}, { PCI_VDEVICE(INTEL, 0x9cc6), LPC_WPT_LP},
{ PCI_VDEVICE(INTEL, 0x9cc7), LPC_WPT_LP}, { PCI_VDEVICE(INTEL, 0x9cc7), LPC_WPT_LP},
{ PCI_VDEVICE(INTEL, 0x9cc9), LPC_WPT_LP}, { PCI_VDEVICE(INTEL, 0x9cc9), LPC_WPT_LP},
{ PCI_VDEVICE(INTEL, 0xa1c1), LPC_LEWISBURG},
{ PCI_VDEVICE(INTEL, 0xa1c2), LPC_LEWISBURG},
{ PCI_VDEVICE(INTEL, 0xa1c3), LPC_LEWISBURG},
{ PCI_VDEVICE(INTEL, 0xa1c4), LPC_LEWISBURG},
{ PCI_VDEVICE(INTEL, 0xa1c5), LPC_LEWISBURG},
{ PCI_VDEVICE(INTEL, 0xa1c6), LPC_LEWISBURG},
{ PCI_VDEVICE(INTEL, 0xa1c7), LPC_LEWISBURG},
{ PCI_VDEVICE(INTEL, 0xa242), LPC_LEWISBURG},
{ PCI_VDEVICE(INTEL, 0xa243), LPC_LEWISBURG},
{ 0, }, /* End of list */ { 0, }, /* End of list */
}; };
MODULE_DEVICE_TABLE(pci, lpc_ich_ids); MODULE_DEVICE_TABLE(pci, lpc_ich_ids);
......
...@@ -495,7 +495,7 @@ MODULE_DEVICE_TABLE(i2c, max14577_i2c_id); ...@@ -495,7 +495,7 @@ MODULE_DEVICE_TABLE(i2c, max14577_i2c_id);
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
static int max14577_suspend(struct device *dev) static int max14577_suspend(struct device *dev)
{ {
struct i2c_client *i2c = container_of(dev, struct i2c_client, dev); struct i2c_client *i2c = to_i2c_client(dev);
struct max14577 *max14577 = i2c_get_clientdata(i2c); struct max14577 *max14577 = i2c_get_clientdata(i2c);
if (device_may_wakeup(dev)) if (device_may_wakeup(dev))
...@@ -516,7 +516,7 @@ static int max14577_suspend(struct device *dev) ...@@ -516,7 +516,7 @@ static int max14577_suspend(struct device *dev)
static int max14577_resume(struct device *dev) static int max14577_resume(struct device *dev)
{ {
struct i2c_client *i2c = container_of(dev, struct i2c_client, dev); struct i2c_client *i2c = to_i2c_client(dev);
struct max14577 *max14577 = i2c_get_clientdata(i2c); struct max14577 *max14577 = i2c_get_clientdata(i2c);
if (device_may_wakeup(dev)) if (device_may_wakeup(dev))
......
...@@ -352,7 +352,7 @@ MODULE_DEVICE_TABLE(i2c, max77686_i2c_id); ...@@ -352,7 +352,7 @@ MODULE_DEVICE_TABLE(i2c, max77686_i2c_id);
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
static int max77686_suspend(struct device *dev) static int max77686_suspend(struct device *dev)
{ {
struct i2c_client *i2c = container_of(dev, struct i2c_client, dev); struct i2c_client *i2c = to_i2c_client(dev);
struct max77686_dev *max77686 = i2c_get_clientdata(i2c); struct max77686_dev *max77686 = i2c_get_clientdata(i2c);
if (device_may_wakeup(dev)) if (device_may_wakeup(dev))
...@@ -374,7 +374,7 @@ static int max77686_suspend(struct device *dev) ...@@ -374,7 +374,7 @@ static int max77686_suspend(struct device *dev)
static int max77686_resume(struct device *dev) static int max77686_resume(struct device *dev)
{ {
struct i2c_client *i2c = container_of(dev, struct i2c_client, dev); struct i2c_client *i2c = to_i2c_client(dev);
struct max77686_dev *max77686 = i2c_get_clientdata(i2c); struct max77686_dev *max77686 = i2c_get_clientdata(i2c);
if (device_may_wakeup(dev)) if (device_may_wakeup(dev))
......
...@@ -334,7 +334,7 @@ MODULE_DEVICE_TABLE(i2c, max77693_i2c_id); ...@@ -334,7 +334,7 @@ MODULE_DEVICE_TABLE(i2c, max77693_i2c_id);
static int max77693_suspend(struct device *dev) static int max77693_suspend(struct device *dev)
{ {
struct i2c_client *i2c = container_of(dev, struct i2c_client, dev); struct i2c_client *i2c = to_i2c_client(dev);
struct max77693_dev *max77693 = i2c_get_clientdata(i2c); struct max77693_dev *max77693 = i2c_get_clientdata(i2c);
if (device_may_wakeup(dev)) { if (device_may_wakeup(dev)) {
...@@ -347,7 +347,7 @@ static int max77693_suspend(struct device *dev) ...@@ -347,7 +347,7 @@ static int max77693_suspend(struct device *dev)
static int max77693_resume(struct device *dev) static int max77693_resume(struct device *dev)
{ {
struct i2c_client *i2c = container_of(dev, struct i2c_client, dev); struct i2c_client *i2c = to_i2c_client(dev);
struct max77693_dev *max77693 = i2c_get_clientdata(i2c); struct max77693_dev *max77693 = i2c_get_clientdata(i2c);
if (device_may_wakeup(dev)) { if (device_may_wakeup(dev)) {
......
...@@ -197,7 +197,7 @@ MODULE_DEVICE_TABLE(i2c, max77843_id); ...@@ -197,7 +197,7 @@ MODULE_DEVICE_TABLE(i2c, max77843_id);
static int __maybe_unused max77843_suspend(struct device *dev) static int __maybe_unused max77843_suspend(struct device *dev)
{ {
struct i2c_client *i2c = container_of(dev, struct i2c_client, dev); struct i2c_client *i2c = to_i2c_client(dev);
struct max77693_dev *max77843 = i2c_get_clientdata(i2c); struct max77693_dev *max77843 = i2c_get_clientdata(i2c);
disable_irq(max77843->irq); disable_irq(max77843->irq);
...@@ -209,7 +209,7 @@ static int __maybe_unused max77843_suspend(struct device *dev) ...@@ -209,7 +209,7 @@ static int __maybe_unused max77843_suspend(struct device *dev)
static int __maybe_unused max77843_resume(struct device *dev) static int __maybe_unused max77843_resume(struct device *dev)
{ {
struct i2c_client *i2c = container_of(dev, struct i2c_client, dev); struct i2c_client *i2c = to_i2c_client(dev);
struct max77693_dev *max77843 = i2c_get_clientdata(i2c); struct max77693_dev *max77843 = i2c_get_clientdata(i2c);
if (device_may_wakeup(dev)) if (device_may_wakeup(dev))
......
...@@ -215,7 +215,7 @@ static int max8925_remove(struct i2c_client *client) ...@@ -215,7 +215,7 @@ static int max8925_remove(struct i2c_client *client)
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
static int max8925_suspend(struct device *dev) static int max8925_suspend(struct device *dev)
{ {
struct i2c_client *client = container_of(dev, struct i2c_client, dev); struct i2c_client *client = to_i2c_client(dev);
struct max8925_chip *chip = i2c_get_clientdata(client); struct max8925_chip *chip = i2c_get_clientdata(client);
if (device_may_wakeup(dev) && chip->wakeup_flag) if (device_may_wakeup(dev) && chip->wakeup_flag)
...@@ -225,7 +225,7 @@ static int max8925_suspend(struct device *dev) ...@@ -225,7 +225,7 @@ static int max8925_suspend(struct device *dev)
static int max8925_resume(struct device *dev) static int max8925_resume(struct device *dev)
{ {
struct i2c_client *client = container_of(dev, struct i2c_client, dev); struct i2c_client *client = to_i2c_client(dev);
struct max8925_chip *chip = i2c_get_clientdata(client); struct max8925_chip *chip = i2c_get_clientdata(client);
if (device_may_wakeup(dev) && chip->wakeup_flag) if (device_may_wakeup(dev) && chip->wakeup_flag)
......
...@@ -437,7 +437,7 @@ static u8 max8997_dumpaddr_haptic[] = { ...@@ -437,7 +437,7 @@ static u8 max8997_dumpaddr_haptic[] = {
static int max8997_freeze(struct device *dev) static int max8997_freeze(struct device *dev)
{ {
struct i2c_client *i2c = container_of(dev, struct i2c_client, dev); struct i2c_client *i2c = to_i2c_client(dev);
struct max8997_dev *max8997 = i2c_get_clientdata(i2c); struct max8997_dev *max8997 = i2c_get_clientdata(i2c);
int i; int i;
...@@ -459,7 +459,7 @@ static int max8997_freeze(struct device *dev) ...@@ -459,7 +459,7 @@ static int max8997_freeze(struct device *dev)
static int max8997_restore(struct device *dev) static int max8997_restore(struct device *dev)
{ {
struct i2c_client *i2c = container_of(dev, struct i2c_client, dev); struct i2c_client *i2c = to_i2c_client(dev);
struct max8997_dev *max8997 = i2c_get_clientdata(i2c); struct max8997_dev *max8997 = i2c_get_clientdata(i2c);
int i; int i;
...@@ -481,7 +481,7 @@ static int max8997_restore(struct device *dev) ...@@ -481,7 +481,7 @@ static int max8997_restore(struct device *dev)
static int max8997_suspend(struct device *dev) static int max8997_suspend(struct device *dev)
{ {
struct i2c_client *i2c = container_of(dev, struct i2c_client, dev); struct i2c_client *i2c = to_i2c_client(dev);
struct max8997_dev *max8997 = i2c_get_clientdata(i2c); struct max8997_dev *max8997 = i2c_get_clientdata(i2c);
if (device_may_wakeup(dev)) if (device_may_wakeup(dev))
...@@ -491,7 +491,7 @@ static int max8997_suspend(struct device *dev) ...@@ -491,7 +491,7 @@ static int max8997_suspend(struct device *dev)
static int max8997_resume(struct device *dev) static int max8997_resume(struct device *dev)
{ {
struct i2c_client *i2c = container_of(dev, struct i2c_client, dev); struct i2c_client *i2c = to_i2c_client(dev);
struct max8997_dev *max8997 = i2c_get_clientdata(i2c); struct max8997_dev *max8997 = i2c_get_clientdata(i2c);
if (device_may_wakeup(dev)) if (device_may_wakeup(dev))
......
...@@ -274,7 +274,7 @@ MODULE_DEVICE_TABLE(i2c, max8998_i2c_id); ...@@ -274,7 +274,7 @@ MODULE_DEVICE_TABLE(i2c, max8998_i2c_id);
static int max8998_suspend(struct device *dev) static int max8998_suspend(struct device *dev)
{ {
struct i2c_client *i2c = container_of(dev, struct i2c_client, dev); struct i2c_client *i2c = to_i2c_client(dev);
struct max8998_dev *max8998 = i2c_get_clientdata(i2c); struct max8998_dev *max8998 = i2c_get_clientdata(i2c);
if (device_may_wakeup(dev)) if (device_may_wakeup(dev))
...@@ -284,7 +284,7 @@ static int max8998_suspend(struct device *dev) ...@@ -284,7 +284,7 @@ static int max8998_suspend(struct device *dev)
static int max8998_resume(struct device *dev) static int max8998_resume(struct device *dev)
{ {
struct i2c_client *i2c = container_of(dev, struct i2c_client, dev); struct i2c_client *i2c = to_i2c_client(dev);
struct max8998_dev *max8998 = i2c_get_clientdata(i2c); struct max8998_dev *max8998 = i2c_get_clientdata(i2c);
if (device_may_wakeup(dev)) if (device_may_wakeup(dev))
...@@ -344,7 +344,7 @@ static struct max8998_reg_dump max8998_dump[] = { ...@@ -344,7 +344,7 @@ static struct max8998_reg_dump max8998_dump[] = {
/* Save registers before hibernation */ /* Save registers before hibernation */
static int max8998_freeze(struct device *dev) static int max8998_freeze(struct device *dev)
{ {
struct i2c_client *i2c = container_of(dev, struct i2c_client, dev); struct i2c_client *i2c = to_i2c_client(dev);
int i; int i;
for (i = 0; i < ARRAY_SIZE(max8998_dump); i++) for (i = 0; i < ARRAY_SIZE(max8998_dump); i++)
...@@ -357,7 +357,7 @@ static int max8998_freeze(struct device *dev) ...@@ -357,7 +357,7 @@ static int max8998_freeze(struct device *dev)
/* Restore registers after hibernation */ /* Restore registers after hibernation */
static int max8998_restore(struct device *dev) static int max8998_restore(struct device *dev)
{ {
struct i2c_client *i2c = container_of(dev, struct i2c_client, dev); struct i2c_client *i2c = to_i2c_client(dev);
int i; int i;
for (i = 0; i < ARRAY_SIZE(max8998_dump); i++) for (i = 0; i < ARRAY_SIZE(max8998_dump); i++)
......
...@@ -383,16 +383,16 @@ static int mc13xxx_probe_flags_dt(struct mc13xxx *mc13xxx) ...@@ -383,16 +383,16 @@ static int mc13xxx_probe_flags_dt(struct mc13xxx *mc13xxx)
if (!np) if (!np)
return -ENODEV; return -ENODEV;
if (of_get_property(np, "fsl,mc13xxx-uses-adc", NULL)) if (of_property_read_bool(np, "fsl,mc13xxx-uses-adc"))
mc13xxx->flags |= MC13XXX_USE_ADC; mc13xxx->flags |= MC13XXX_USE_ADC;
if (of_get_property(np, "fsl,mc13xxx-uses-codec", NULL)) if (of_property_read_bool(np, "fsl,mc13xxx-uses-codec"))
mc13xxx->flags |= MC13XXX_USE_CODEC; mc13xxx->flags |= MC13XXX_USE_CODEC;
if (of_get_property(np, "fsl,mc13xxx-uses-rtc", NULL)) if (of_property_read_bool(np, "fsl,mc13xxx-uses-rtc"))
mc13xxx->flags |= MC13XXX_USE_RTC; mc13xxx->flags |= MC13XXX_USE_RTC;
if (of_get_property(np, "fsl,mc13xxx-uses-touch", NULL)) if (of_property_read_bool(np, "fsl,mc13xxx-uses-touch"))
mc13xxx->flags |= MC13XXX_USE_TOUCHSCREEN; mc13xxx->flags |= MC13XXX_USE_TOUCHSCREEN;
return 0; return 0;
......
...@@ -127,7 +127,9 @@ static int pmic_spmi_probe(struct spmi_device *sdev) ...@@ -127,7 +127,9 @@ static int pmic_spmi_probe(struct spmi_device *sdev)
if (IS_ERR(regmap)) if (IS_ERR(regmap))
return PTR_ERR(regmap); return PTR_ERR(regmap);
pmic_spmi_show_revid(regmap, &sdev->dev); /* Only the first slave id for a PMIC contains this information */
if (sdev->usid % 2 == 0)
pmic_spmi_show_revid(regmap, &sdev->dev);
return of_platform_populate(root, NULL, NULL, &sdev->dev); return of_platform_populate(root, NULL, NULL, &sdev->dev);
} }
......
...@@ -495,6 +495,8 @@ static int qcom_rpm_probe(struct platform_device *pdev) ...@@ -495,6 +495,8 @@ static int qcom_rpm_probe(struct platform_device *pdev)
} }
match = of_match_device(qcom_rpm_of_match, &pdev->dev); match = of_match_device(qcom_rpm_of_match, &pdev->dev);
if (!match)
return -ENODEV;
rpm->data = match->data; rpm->data = match->data;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <linux/mfd/samsung/s2mps11.h> #include <linux/mfd/samsung/s2mps11.h>
#include <linux/mfd/samsung/s2mps13.h> #include <linux/mfd/samsung/s2mps13.h>
#include <linux/mfd/samsung/s2mps14.h> #include <linux/mfd/samsung/s2mps14.h>
#include <linux/mfd/samsung/s2mps15.h>
#include <linux/mfd/samsung/s2mpu02.h> #include <linux/mfd/samsung/s2mpu02.h>
#include <linux/mfd/samsung/s5m8763.h> #include <linux/mfd/samsung/s5m8763.h>
#include <linux/mfd/samsung/s5m8767.h> #include <linux/mfd/samsung/s5m8767.h>
...@@ -67,7 +68,7 @@ static const struct mfd_cell s5m8767_devs[] = { ...@@ -67,7 +68,7 @@ static const struct mfd_cell s5m8767_devs[] = {
static const struct mfd_cell s2mps11_devs[] = { static const struct mfd_cell s2mps11_devs[] = {
{ {
.name = "s2mps11-pmic", .name = "s2mps11-regulator",
}, { }, {
.name = "s2mps14-rtc", .name = "s2mps14-rtc",
}, { }, {
...@@ -77,7 +78,7 @@ static const struct mfd_cell s2mps11_devs[] = { ...@@ -77,7 +78,7 @@ static const struct mfd_cell s2mps11_devs[] = {
}; };
static const struct mfd_cell s2mps13_devs[] = { static const struct mfd_cell s2mps13_devs[] = {
{ .name = "s2mps13-pmic", }, { .name = "s2mps13-regulator", },
{ .name = "s2mps13-rtc", }, { .name = "s2mps13-rtc", },
{ {
.name = "s2mps13-clk", .name = "s2mps13-clk",
...@@ -87,7 +88,7 @@ static const struct mfd_cell s2mps13_devs[] = { ...@@ -87,7 +88,7 @@ static const struct mfd_cell s2mps13_devs[] = {
static const struct mfd_cell s2mps14_devs[] = { static const struct mfd_cell s2mps14_devs[] = {
{ {
.name = "s2mps14-pmic", .name = "s2mps14-regulator",
}, { }, {
.name = "s2mps14-rtc", .name = "s2mps14-rtc",
}, { }, {
...@@ -96,6 +97,17 @@ static const struct mfd_cell s2mps14_devs[] = { ...@@ -96,6 +97,17 @@ static const struct mfd_cell s2mps14_devs[] = {
} }
}; };
static const struct mfd_cell s2mps15_devs[] = {
{
.name = "s2mps15-regulator",
}, {
.name = "s2mps15-rtc",
}, {
.name = "s2mps13-clk",
.of_compatible = "samsung,s2mps13-clk",
},
};
static const struct mfd_cell s2mpa01_devs[] = { static const struct mfd_cell s2mpa01_devs[] = {
{ {
.name = "s2mpa01-pmic", .name = "s2mpa01-pmic",
...@@ -104,7 +116,7 @@ static const struct mfd_cell s2mpa01_devs[] = { ...@@ -104,7 +116,7 @@ static const struct mfd_cell s2mpa01_devs[] = {
static const struct mfd_cell s2mpu02_devs[] = { static const struct mfd_cell s2mpu02_devs[] = {
{ {
.name = "s2mpu02-pmic", .name = "s2mpu02-regulator",
}, },
}; };
...@@ -121,6 +133,9 @@ static const struct of_device_id sec_dt_match[] = { ...@@ -121,6 +133,9 @@ static const struct of_device_id sec_dt_match[] = {
}, { }, {
.compatible = "samsung,s2mps14-pmic", .compatible = "samsung,s2mps14-pmic",
.data = (void *)S2MPS14X, .data = (void *)S2MPS14X,
}, {
.compatible = "samsung,s2mps15-pmic",
.data = (void *)S2MPS15X,
}, { }, {
.compatible = "samsung,s2mpa01-pmic", .compatible = "samsung,s2mpa01-pmic",
.data = (void *)S2MPA01, .data = (void *)S2MPA01,
...@@ -223,6 +238,15 @@ static const struct regmap_config s2mps14_regmap_config = { ...@@ -223,6 +238,15 @@ static const struct regmap_config s2mps14_regmap_config = {
.cache_type = REGCACHE_FLAT, .cache_type = REGCACHE_FLAT,
}; };
static const struct regmap_config s2mps15_regmap_config = {
.reg_bits = 8,
.val_bits = 8,
.max_register = S2MPS15_REG_LDODSCH4,
.volatile_reg = s2mps11_volatile,
.cache_type = REGCACHE_FLAT,
};
static const struct regmap_config s2mpu02_regmap_config = { static const struct regmap_config s2mpu02_regmap_config = {
.reg_bits = 8, .reg_bits = 8,
.val_bits = 8, .val_bits = 8,
...@@ -384,6 +408,9 @@ static int sec_pmic_probe(struct i2c_client *i2c, ...@@ -384,6 +408,9 @@ static int sec_pmic_probe(struct i2c_client *i2c,
case S2MPS14X: case S2MPS14X:
regmap = &s2mps14_regmap_config; regmap = &s2mps14_regmap_config;
break; break;
case S2MPS15X:
regmap = &s2mps15_regmap_config;
break;
case S5M8763X: case S5M8763X:
regmap = &s5m8763_regmap_config; regmap = &s5m8763_regmap_config;
break; break;
...@@ -442,6 +469,10 @@ static int sec_pmic_probe(struct i2c_client *i2c, ...@@ -442,6 +469,10 @@ static int sec_pmic_probe(struct i2c_client *i2c,
sec_devs = s2mps14_devs; sec_devs = s2mps14_devs;
num_sec_devs = ARRAY_SIZE(s2mps14_devs); num_sec_devs = ARRAY_SIZE(s2mps14_devs);
break; break;
case S2MPS15X:
sec_devs = s2mps15_devs;
num_sec_devs = ARRAY_SIZE(s2mps15_devs);
break;
case S2MPU02: case S2MPU02:
sec_devs = s2mpu02_devs; sec_devs = s2mpu02_devs;
num_sec_devs = ARRAY_SIZE(s2mpu02_devs); num_sec_devs = ARRAY_SIZE(s2mpu02_devs);
...@@ -505,7 +536,7 @@ static void sec_pmic_shutdown(struct i2c_client *i2c) ...@@ -505,7 +536,7 @@ static void sec_pmic_shutdown(struct i2c_client *i2c)
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
static int sec_pmic_suspend(struct device *dev) static int sec_pmic_suspend(struct device *dev)
{ {
struct i2c_client *i2c = container_of(dev, struct i2c_client, dev); struct i2c_client *i2c = to_i2c_client(dev);
struct sec_pmic_dev *sec_pmic = i2c_get_clientdata(i2c); struct sec_pmic_dev *sec_pmic = i2c_get_clientdata(i2c);
if (device_may_wakeup(dev)) if (device_may_wakeup(dev))
...@@ -526,7 +557,7 @@ static int sec_pmic_suspend(struct device *dev) ...@@ -526,7 +557,7 @@ static int sec_pmic_suspend(struct device *dev)
static int sec_pmic_resume(struct device *dev) static int sec_pmic_resume(struct device *dev)
{ {
struct i2c_client *i2c = container_of(dev, struct i2c_client, dev); struct i2c_client *i2c = to_i2c_client(dev);
struct sec_pmic_dev *sec_pmic = i2c_get_clientdata(i2c); struct sec_pmic_dev *sec_pmic = i2c_get_clientdata(i2c);
if (device_may_wakeup(dev)) if (device_may_wakeup(dev))
......
...@@ -407,6 +407,11 @@ static const struct regmap_irq_chip s2mps14_irq_chip = { ...@@ -407,6 +407,11 @@ static const struct regmap_irq_chip s2mps14_irq_chip = {
S2MPS1X_IRQ_CHIP_COMMON_DATA, S2MPS1X_IRQ_CHIP_COMMON_DATA,
}; };
static const struct regmap_irq_chip s2mps15_irq_chip = {
.name = "s2mps15",
S2MPS1X_IRQ_CHIP_COMMON_DATA,
};
static const struct regmap_irq_chip s2mpu02_irq_chip = { static const struct regmap_irq_chip s2mpu02_irq_chip = {
.name = "s2mpu02", .name = "s2mpu02",
.irqs = s2mpu02_irqs, .irqs = s2mpu02_irqs,
...@@ -466,6 +471,9 @@ int sec_irq_init(struct sec_pmic_dev *sec_pmic) ...@@ -466,6 +471,9 @@ int sec_irq_init(struct sec_pmic_dev *sec_pmic)
case S2MPS14X: case S2MPS14X:
sec_irq_chip = &s2mps14_irq_chip; sec_irq_chip = &s2mps14_irq_chip;
break; break;
case S2MPS15X:
sec_irq_chip = &s2mps15_irq_chip;
break;
case S2MPU02: case S2MPU02:
sec_irq_chip = &s2mpu02_irq_chip; sec_irq_chip = &s2mpu02_irq_chip;
break; break;
......
...@@ -372,12 +372,6 @@ static struct platform_driver sta2x11_sctl_platform_driver = { ...@@ -372,12 +372,6 @@ static struct platform_driver sta2x11_sctl_platform_driver = {
.probe = sta2x11_sctl_probe, .probe = sta2x11_sctl_probe,
}; };
static int __init sta2x11_sctl_init(void)
{
pr_info("%s\n", __func__);
return platform_driver_register(&sta2x11_sctl_platform_driver);
}
static struct platform_driver sta2x11_platform_driver = { static struct platform_driver sta2x11_platform_driver = {
.driver = { .driver = {
.name = STA2X11_MFD_APBREG_NAME, .name = STA2X11_MFD_APBREG_NAME,
...@@ -385,12 +379,6 @@ static struct platform_driver sta2x11_platform_driver = { ...@@ -385,12 +379,6 @@ static struct platform_driver sta2x11_platform_driver = {
.probe = sta2x11_apbreg_probe, .probe = sta2x11_apbreg_probe,
}; };
static int __init sta2x11_apbreg_init(void)
{
pr_info("%s\n", __func__);
return platform_driver_register(&sta2x11_platform_driver);
}
static struct platform_driver sta2x11_apb_soc_regs_platform_driver = { static struct platform_driver sta2x11_apb_soc_regs_platform_driver = {
.driver = { .driver = {
.name = STA2X11_MFD_APB_SOC_REGS_NAME, .name = STA2X11_MFD_APB_SOC_REGS_NAME,
...@@ -398,12 +386,6 @@ static struct platform_driver sta2x11_apb_soc_regs_platform_driver = { ...@@ -398,12 +386,6 @@ static struct platform_driver sta2x11_apb_soc_regs_platform_driver = {
.probe = sta2x11_apb_soc_regs_probe, .probe = sta2x11_apb_soc_regs_probe,
}; };
static int __init sta2x11_apb_soc_regs_init(void)
{
pr_info("%s\n", __func__);
return platform_driver_register(&sta2x11_apb_soc_regs_platform_driver);
}
static struct platform_driver sta2x11_scr_platform_driver = { static struct platform_driver sta2x11_scr_platform_driver = {
.driver = { .driver = {
.name = STA2X11_MFD_SCR_NAME, .name = STA2X11_MFD_SCR_NAME,
...@@ -411,13 +393,18 @@ static struct platform_driver sta2x11_scr_platform_driver = { ...@@ -411,13 +393,18 @@ static struct platform_driver sta2x11_scr_platform_driver = {
.probe = sta2x11_scr_probe, .probe = sta2x11_scr_probe,
}; };
static int __init sta2x11_scr_init(void) static struct platform_driver * const drivers[] = {
&sta2x11_platform_driver,
&sta2x11_sctl_platform_driver,
&sta2x11_apb_soc_regs_platform_driver,
&sta2x11_scr_platform_driver,
};
static int __init sta2x11_drivers_init(void)
{ {
pr_info("%s\n", __func__); return platform_register_drivers(drivers, ARRAY_SIZE(drivers));
return platform_driver_register(&sta2x11_scr_platform_driver);
} }
/* /*
* What follows are the PCI devices that host the above pdevs. * What follows are the PCI devices that host the above pdevs.
* Each logic block is 4kB and they are all consecutive: we use this info. * Each logic block is 4kB and they are all consecutive: we use this info.
...@@ -664,10 +651,7 @@ static int __init sta2x11_mfd_init(void) ...@@ -664,10 +651,7 @@ static int __init sta2x11_mfd_init(void)
* prepares platform drivers very early and probe the PCI device later, * prepares platform drivers very early and probe the PCI device later,
* but before other PCI devices. * but before other PCI devices.
*/ */
subsys_initcall(sta2x11_apbreg_init); subsys_initcall(sta2x11_drivers_init);
subsys_initcall(sta2x11_sctl_init);
subsys_initcall(sta2x11_apb_soc_regs_init);
subsys_initcall(sta2x11_scr_init);
rootfs_initcall(sta2x11_mfd_init); rootfs_initcall(sta2x11_mfd_init);
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
......
...@@ -47,6 +47,7 @@ static struct syscon *of_syscon_register(struct device_node *np) ...@@ -47,6 +47,7 @@ static struct syscon *of_syscon_register(struct device_node *np)
struct syscon *syscon; struct syscon *syscon;
struct regmap *regmap; struct regmap *regmap;
void __iomem *base; void __iomem *base;
u32 reg_io_width;
int ret; int ret;
struct regmap_config syscon_config = syscon_regmap_config; struct regmap_config syscon_config = syscon_regmap_config;
...@@ -69,6 +70,18 @@ static struct syscon *of_syscon_register(struct device_node *np) ...@@ -69,6 +70,18 @@ static struct syscon *of_syscon_register(struct device_node *np)
else if (of_property_read_bool(np, "little-endian")) else if (of_property_read_bool(np, "little-endian"))
syscon_config.val_format_endian = REGMAP_ENDIAN_LITTLE; syscon_config.val_format_endian = REGMAP_ENDIAN_LITTLE;
/*
* search for reg-io-width property in DT. If it is not provided,
* default to 4 bytes. regmap_init_mmio will return an error if values
* are invalid so there is no need to check them here.
*/
ret = of_property_read_u32(np, "reg-io-width", &reg_io_width);
if (ret)
reg_io_width = 4;
syscon_config.reg_stride = reg_io_width;
syscon_config.val_bits = reg_io_width * 8;
regmap = regmap_init_mmio(NULL, base, &syscon_config); regmap = regmap_init_mmio(NULL, base, &syscon_config);
if (IS_ERR(regmap)) { if (IS_ERR(regmap)) {
pr_err("regmap init failed\n"); pr_err("regmap init failed\n");
......
...@@ -437,8 +437,8 @@ static int tc6393xb_gpio_get(struct gpio_chip *chip, ...@@ -437,8 +437,8 @@ static int tc6393xb_gpio_get(struct gpio_chip *chip,
struct tc6393xb *tc6393xb = container_of(chip, struct tc6393xb, gpio); struct tc6393xb *tc6393xb = container_of(chip, struct tc6393xb, gpio);
/* XXX: does dsr also represent inputs? */ /* XXX: does dsr also represent inputs? */
return tmio_ioread8(tc6393xb->scr + SCR_GPO_DSR(offset / 8)) return !!(tmio_ioread8(tc6393xb->scr + SCR_GPO_DSR(offset / 8))
& TC_GPIO_BIT(offset); & TC_GPIO_BIT(offset));
} }
static void __tc6393xb_gpio_set(struct gpio_chip *chip, static void __tc6393xb_gpio_set(struct gpio_chip *chip,
......
...@@ -499,11 +499,11 @@ static int tps65010_gpio_get(struct gpio_chip *chip, unsigned offset) ...@@ -499,11 +499,11 @@ static int tps65010_gpio_get(struct gpio_chip *chip, unsigned offset)
if (offset < 4) { if (offset < 4) {
value = i2c_smbus_read_byte_data(tps->client, TPS_DEFGPIO); value = i2c_smbus_read_byte_data(tps->client, TPS_DEFGPIO);
if (value < 0) if (value < 0)
return 0; return value;
if (value & (1 << (offset + 4))) /* output */ if (value & (1 << (offset + 4))) /* output */
return !(value & (1 << offset)); return !(value & (1 << offset));
else /* input */ else /* input */
return (value & (1 << offset)); return !!(value & (1 << offset));
} }
/* REVISIT we *could* report LED1/nPG and LED2 state ... */ /* REVISIT we *could* report LED1/nPG and LED2 state ... */
......
...@@ -133,7 +133,7 @@ static int ucb1x00_gpio_get(struct gpio_chip *chip, unsigned offset) ...@@ -133,7 +133,7 @@ static int ucb1x00_gpio_get(struct gpio_chip *chip, unsigned offset)
val = ucb1x00_reg_read(ucb, UCB_IO_DATA); val = ucb1x00_reg_read(ucb, UCB_IO_DATA);
ucb1x00_disable(ucb); ucb1x00_disable(ucb);
return val & (1 << offset); return !!(val & (1 << offset));
} }
static int ucb1x00_gpio_direction_input(struct gpio_chip *chip, unsigned offset) static int ucb1x00_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
......
...@@ -762,9 +762,9 @@ static const struct reg_default wm5110_reg_default[] = { ...@@ -762,9 +762,9 @@ static const struct reg_default wm5110_reg_default[] = {
{ 0x00000200, 0x0006 }, /* R512 - Mic Charge Pump 1 */ { 0x00000200, 0x0006 }, /* R512 - Mic Charge Pump 1 */
{ 0x00000210, 0x0184 }, /* R528 - LDO1 Control 1 */ { 0x00000210, 0x0184 }, /* R528 - LDO1 Control 1 */
{ 0x00000213, 0x03E4 }, /* R531 - LDO2 Control 1 */ { 0x00000213, 0x03E4 }, /* R531 - LDO2 Control 1 */
{ 0x00000218, 0x01A6 }, /* R536 - Mic Bias Ctrl 1 */ { 0x00000218, 0x00E6 }, /* R536 - Mic Bias Ctrl 1 */
{ 0x00000219, 0x01A6 }, /* R537 - Mic Bias Ctrl 2 */ { 0x00000219, 0x00E6 }, /* R537 - Mic Bias Ctrl 2 */
{ 0x0000021A, 0x01A6 }, /* R538 - Mic Bias Ctrl 3 */ { 0x0000021A, 0x00E6 }, /* R538 - Mic Bias Ctrl 3 */
{ 0x00000293, 0x0000 }, /* R659 - Accessory Detect Mode 1 */ { 0x00000293, 0x0000 }, /* R659 - Accessory Detect Mode 1 */
{ 0x0000029B, 0x0028 }, /* R667 - Headphone Detect 1 */ { 0x0000029B, 0x0028 }, /* R667 - Headphone Detect 1 */
{ 0x000002A2, 0x0000 }, /* R674 - Micd clamp control */ { 0x000002A2, 0x0000 }, /* R674 - Micd clamp control */
......
...@@ -47,20 +47,14 @@ static ssize_t wm831x_unique_id_show(struct device *dev, ...@@ -47,20 +47,14 @@ static ssize_t wm831x_unique_id_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct wm831x *wm831x = dev_get_drvdata(dev); struct wm831x *wm831x = dev_get_drvdata(dev);
int i, rval; int rval;
char id[WM831X_UNIQUE_ID_LEN]; char id[WM831X_UNIQUE_ID_LEN];
ssize_t ret = 0;
rval = wm831x_unique_id_read(wm831x, id); rval = wm831x_unique_id_read(wm831x, id);
if (rval < 0) if (rval < 0)
return 0; return 0;
for (i = 0; i < WM831X_UNIQUE_ID_LEN; i++) return sprintf(buf, "%*phN\n", WM831X_UNIQUE_ID_LEN, id);
ret += sprintf(&buf[ret], "%02x", buf[i]);
ret += sprintf(&buf[ret], "\n");
return ret;
} }
static DEVICE_ATTR(unique_id, 0444, wm831x_unique_id_show, NULL); static DEVICE_ATTR(unique_id, 0444, wm831x_unique_id_show, NULL);
......
...@@ -588,10 +588,10 @@ config REGULATOR_S2MPA01 ...@@ -588,10 +588,10 @@ config REGULATOR_S2MPA01
via I2C bus. S2MPA01 has 10 Bucks and 26 LDO outputs. via I2C bus. S2MPA01 has 10 Bucks and 26 LDO outputs.
config REGULATOR_S2MPS11 config REGULATOR_S2MPS11
tristate "Samsung S2MPS11/S2MPS13/S2MPS14/S2MPU02 voltage regulator" tristate "Samsung S2MPS11/13/14/15/S2MPU02 voltage regulator"
depends on MFD_SEC_CORE depends on MFD_SEC_CORE
help help
This driver supports a Samsung S2MPS11/S2MPS13/S2MPS14/S2MPU02 voltage This driver supports a Samsung S2MPS11/13/14/15/S2MPU02 voltage
output regulator via I2C bus. The chip is comprised of high efficient output regulator via I2C bus. The chip is comprised of high efficient
Buck converters including Dual-Phase Buck converter, Buck-Boost Buck converters including Dual-Phase Buck converter, Buck-Boost
converter, various LDOs. converter, various LDOs.
......
This diff is collapsed.
This diff is collapsed.
...@@ -27,6 +27,8 @@ enum arizona_type { ...@@ -27,6 +27,8 @@ enum arizona_type {
WM8280 = 4, WM8280 = 4,
WM8998 = 5, WM8998 = 5,
WM1814 = 6, WM1814 = 6,
WM1831 = 7,
CS47L24 = 8,
}; };
#define ARIZONA_IRQ_GP1 0 #define ARIZONA_IRQ_GP1 0
...@@ -166,6 +168,7 @@ static inline int wm5102_patch(struct arizona *arizona) ...@@ -166,6 +168,7 @@ static inline int wm5102_patch(struct arizona *arizona)
#endif #endif
int wm5110_patch(struct arizona *arizona); int wm5110_patch(struct arizona *arizona);
int cs47l24_patch(struct arizona *arizona);
int wm8997_patch(struct arizona *arizona); int wm8997_patch(struct arizona *arizona);
int wm8998_patch(struct arizona *arizona); int wm8998_patch(struct arizona *arizona);
......
...@@ -171,7 +171,7 @@ struct arizona_pdata { ...@@ -171,7 +171,7 @@ struct arizona_pdata {
int inmode[ARIZONA_MAX_INPUT]; int inmode[ARIZONA_MAX_INPUT];
/** Mode for outputs */ /** Mode for outputs */
bool out_mono[ARIZONA_MAX_OUTPUT]; int out_mono[ARIZONA_MAX_OUTPUT];
/** PDM speaker mute setting */ /** PDM speaker mute setting */
unsigned int spk_mute[ARIZONA_MAX_PDM_SPK]; unsigned int spk_mute[ARIZONA_MAX_PDM_SPK];
......
...@@ -44,6 +44,7 @@ enum sec_device_type { ...@@ -44,6 +44,7 @@ enum sec_device_type {
S2MPS11X, S2MPS11X,
S2MPS13X, S2MPS13X,
S2MPS14X, S2MPS14X,
S2MPS15X,
S2MPU02, S2MPU02,
}; };
......
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment