diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-09-07 16:51:13 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-09-07 16:51:13 -0400 |
commit | 968c61f7da3cf6d58a49587cfe00d899ca72c1ad (patch) | |
tree | b5f7adb38c01234d34e000f6f7ad9da432e663e5 | |
parent | 9d71941d39fb876271df72394518a98ae079e5a3 (diff) | |
parent | b01e9348e106544e50691252bf58cde239681f19 (diff) |
Merge tag 'mfd-next-4.14' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd
Pull MFD updates from Lee Jones:
"New Drivers
- RK805 Power Management IC (PMIC)
- ROHM BD9571MWV-M MFD Power Management IC (PMIC)
- Texas Instruments TPS68470 Power Management IC (PMIC) & LEDs
New Device Support:
- Add support for HiSilicon Hi6421v530 to hi6421-pmic-core
- Add support for X-Powers AXP806 to axp20x
- Add support for X-Powers AXP813 to axp20x
- Add support for Intel Sunrise Point LPSS to intel-lpss-pci
New Functionality:
- Amend API to provide register layout; atmel-smc
Fix-ups:
- DT re-work; omap, nokia
- Header file location change {I2C => MFD}; dm355evm_msp, tps65010
- Fix chip ID formatting issue(s); rk808
- Optionally register touchscreen devices; da9052-core
- Documentation improvements; twl-core
- Constification; rtsx_pcr, ab8500-core, da9055-i2c, da9052-spi
- Drop unnecessary static declaration; max8925-i2c
- Kconfig changes (missing deps and remove module support)
- Slim down oversized licence statement; hi6421-pmic-core
- Use managed resources (devm_*); lp87565
- Supply proper error checking/handling; t7l66xb
Bug Fixes:
- Fix counter duplication issue; da9052-core
- Fix potential NULL deference issue; max8998
- Leave SPI-NOR write-protection bit alone; lpc_ich
- Ensure device is put into reset during suspend; intel-lpss
- Correct register offset variable size; omap-usb-tll"
* tag 'mfd-next-4.14' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd: (61 commits)
mfd: intel_soc_pmic: Differentiate between Bay and Cherry Trail CRC variants
mfd: intel_soc_pmic: Export separate mfd-cell configs for BYT and CHT
dt-bindings: mfd: Add bindings for ZII RAVE devices
mfd: omap-usb-tll: Fix register offsets
mfd: da9052: Constify spi_device_id
mfd: intel-lpss: Put I2C and SPI controllers into reset state on suspend
mfd: da9055: Constify i2c_device_id
mfd: intel-lpss: Add missing PCI ID for Intel Sunrise Point LPSS devices
mfd: t7l66xb: Handle return value of clk_prepare_enable
mfd: Add ROHM BD9571MWV-M PMIC DT bindings
mfd: intel_soc_pmic_chtwc: Turn Kconfig option into a bool
mfd: lp87565: Convert to use devm_mfd_add_devices()
mfd: Add support for TPS68470 device
mfd: lpc_ich: Do not touch SPI-NOR write protection bit on Haswell/Broadwell
mfd: syscon: atmel-smc: Add helper to retrieve register layout
mfd: axp20x: Use correct platform device ID for many PEK
dt-bindings: mfd: axp20x: Introduce bindings for AXP813
mfd: axp20x: Add support for AXP813 PMIC
dt-bindings: mfd: axp20x: Add AXP806 to supported list of chips
mfd: Add ROHM BD9571MWV-M MFD PMIC driver
...
113 files changed, 3318 insertions, 182 deletions
diff --git a/Documentation/ABI/testing/sysfs-bus-iio-lptimer-stm32 b/Documentation/ABI/testing/sysfs-bus-iio-lptimer-stm32 new file mode 100644 index 000000000000..ad2cc63e4bf8 --- /dev/null +++ b/Documentation/ABI/testing/sysfs-bus-iio-lptimer-stm32 | |||
@@ -0,0 +1,57 @@ | |||
1 | What: /sys/bus/iio/devices/iio:deviceX/in_count0_preset | ||
2 | KernelVersion: 4.13 | ||
3 | Contact: fabrice.gasnier@st.com | ||
4 | Description: | ||
5 | Reading returns the current preset value. Writing sets the | ||
6 | preset value. Encoder counts continuously from 0 to preset | ||
7 | value, depending on direction (up/down). | ||
8 | |||
9 | What: /sys/bus/iio/devices/iio:deviceX/in_count_quadrature_mode_available | ||
10 | KernelVersion: 4.13 | ||
11 | Contact: fabrice.gasnier@st.com | ||
12 | Description: | ||
13 | Reading returns the list possible quadrature modes. | ||
14 | |||
15 | What: /sys/bus/iio/devices/iio:deviceX/in_count0_quadrature_mode | ||
16 | KernelVersion: 4.13 | ||
17 | Contact: fabrice.gasnier@st.com | ||
18 | Description: | ||
19 | Configure the device counter quadrature modes: | ||
20 | - non-quadrature: | ||
21 | Encoder IN1 input servers as the count input (up | ||
22 | direction). | ||
23 | - quadrature: | ||
24 | Encoder IN1 and IN2 inputs are mixed to get direction | ||
25 | and count. | ||
26 | |||
27 | What: /sys/bus/iio/devices/iio:deviceX/in_count_polarity_available | ||
28 | KernelVersion: 4.13 | ||
29 | Contact: fabrice.gasnier@st.com | ||
30 | Description: | ||
31 | Reading returns the list possible active edges. | ||
32 | |||
33 | What: /sys/bus/iio/devices/iio:deviceX/in_count0_polarity | ||
34 | KernelVersion: 4.13 | ||
35 | Contact: fabrice.gasnier@st.com | ||
36 | Description: | ||
37 | Configure the device encoder/counter active edge: | ||
38 | - rising-edge | ||
39 | - falling-edge | ||
40 | - both-edges | ||
41 | |||
42 | In non-quadrature mode, device counts up on active edge. | ||
43 | In quadrature mode, encoder counting scenarios are as follows: | ||
44 | ---------------------------------------------------------------- | ||
45 | | Active | Level on | IN1 signal | IN2 signal | | ||
46 | | edge | opposite |------------------------------------------ | ||
47 | | | signal | Rising | Falling | Rising | Falling | | ||
48 | ---------------------------------------------------------------- | ||
49 | | Rising | High -> | Down | - | Up | - | | ||
50 | | edge | Low -> | Up | - | Down | - | | ||
51 | ---------------------------------------------------------------- | ||
52 | | Falling | High -> | - | Up | - | Down | | ||
53 | | edge | Low -> | - | Down | - | Up | | ||
54 | ---------------------------------------------------------------- | ||
55 | | Both | High -> | Down | Up | Up | Down | | ||
56 | | edges | Low -> | Up | Down | Down | Up | | ||
57 | ---------------------------------------------------------------- | ||
diff --git a/Documentation/devicetree/bindings/i2c/i2c-cbus-gpio.txt b/Documentation/devicetree/bindings/i2c/i2c-cbus-gpio.txt index 8ce9cd2855b5..c143948b2a37 100644 --- a/Documentation/devicetree/bindings/i2c/i2c-cbus-gpio.txt +++ b/Documentation/devicetree/bindings/i2c/i2c-cbus-gpio.txt | |||
@@ -20,8 +20,8 @@ i2c@0 { | |||
20 | #address-cells = <1>; | 20 | #address-cells = <1>; |
21 | #size-cells = <0>; | 21 | #size-cells = <0>; |
22 | 22 | ||
23 | retu-mfd: retu@1 { | 23 | retu: retu@1 { |
24 | compatible = "retu-mfd"; | 24 | compatible = "nokia,retu"; |
25 | reg = <0x1>; | 25 | reg = <0x1>; |
26 | }; | 26 | }; |
27 | }; | 27 | }; |
diff --git a/Documentation/devicetree/bindings/iio/counter/stm32-lptimer-cnt.txt b/Documentation/devicetree/bindings/iio/counter/stm32-lptimer-cnt.txt new file mode 100644 index 000000000000..a04aa5c04103 --- /dev/null +++ b/Documentation/devicetree/bindings/iio/counter/stm32-lptimer-cnt.txt | |||
@@ -0,0 +1,27 @@ | |||
1 | STMicroelectronics STM32 Low-Power Timer quadrature encoder and counter | ||
2 | |||
3 | STM32 Low-Power Timer provides several counter modes. It can be used as: | ||
4 | - quadrature encoder to detect angular position and direction of rotary | ||
5 | elements, from IN1 and IN2 input signals. | ||
6 | - simple counter from IN1 input signal. | ||
7 | |||
8 | Must be a sub-node of an STM32 Low-Power Timer device tree node. | ||
9 | See ../mfd/stm32-lptimer.txt for details about the parent node. | ||
10 | |||
11 | Required properties: | ||
12 | - compatible: Must be "st,stm32-lptimer-counter". | ||
13 | - pinctrl-names: Set to "default". | ||
14 | - pinctrl-0: List of phandles pointing to pin configuration nodes, | ||
15 | to set IN1/IN2 pins in mode of operation for Low-Power | ||
16 | Timer input on external pin. | ||
17 | |||
18 | Example: | ||
19 | timer@40002400 { | ||
20 | compatible = "st,stm32-lptimer"; | ||
21 | ... | ||
22 | counter { | ||
23 | compatible = "st,stm32-lptimer-counter"; | ||
24 | pinctrl-names = "default"; | ||
25 | pinctrl-0 = <&lptim1_in_pins>; | ||
26 | }; | ||
27 | }; | ||
diff --git a/Documentation/devicetree/bindings/iio/timer/stm32-lptimer-trigger.txt b/Documentation/devicetree/bindings/iio/timer/stm32-lptimer-trigger.txt new file mode 100644 index 000000000000..85e6806b17d7 --- /dev/null +++ b/Documentation/devicetree/bindings/iio/timer/stm32-lptimer-trigger.txt | |||
@@ -0,0 +1,23 @@ | |||
1 | STMicroelectronics STM32 Low-Power Timer Trigger | ||
2 | |||
3 | STM32 Low-Power Timer provides trigger source (LPTIM output) that can be used | ||
4 | by STM32 internal ADC and/or DAC. | ||
5 | |||
6 | Must be a sub-node of an STM32 Low-Power Timer device tree node. | ||
7 | See ../mfd/stm32-lptimer.txt for details about the parent node. | ||
8 | |||
9 | Required properties: | ||
10 | - compatible: Must be "st,stm32-lptimer-trigger". | ||
11 | - reg: Identify trigger hardware block. Must be 0, 1 or 2 | ||
12 | respectively for lptimer1, lptimer2 or lptimer3 | ||
13 | trigger output. | ||
14 | |||
15 | Example: | ||
16 | timer@40002400 { | ||
17 | compatible = "st,stm32-lptimer"; | ||
18 | ... | ||
19 | trigger@0 { | ||
20 | compatible = "st,stm32-lptimer-trigger"; | ||
21 | reg = <0>; | ||
22 | }; | ||
23 | }; | ||
diff --git a/Documentation/devicetree/bindings/mfd/atmel-smc.txt b/Documentation/devicetree/bindings/mfd/atmel-smc.txt index 26eeed373934..1103ce2030fb 100644 --- a/Documentation/devicetree/bindings/mfd/atmel-smc.txt +++ b/Documentation/devicetree/bindings/mfd/atmel-smc.txt | |||
@@ -8,6 +8,7 @@ Required properties: | |||
8 | - compatible: Should be one of the following | 8 | - compatible: Should be one of the following |
9 | "atmel,at91sam9260-smc", "syscon" | 9 | "atmel,at91sam9260-smc", "syscon" |
10 | "atmel,sama5d3-smc", "syscon" | 10 | "atmel,sama5d3-smc", "syscon" |
11 | "atmel,sama5d2-smc", "syscon" | ||
11 | - reg: Contains offset/length value of the SMC memory | 12 | - reg: Contains offset/length value of the SMC memory |
12 | region. | 13 | region. |
13 | 14 | ||
diff --git a/Documentation/devicetree/bindings/mfd/axp20x.txt b/Documentation/devicetree/bindings/mfd/axp20x.txt index aca09af66514..9455503b0299 100644 --- a/Documentation/devicetree/bindings/mfd/axp20x.txt +++ b/Documentation/devicetree/bindings/mfd/axp20x.txt | |||
@@ -7,7 +7,14 @@ axp209 (X-Powers) | |||
7 | axp221 (X-Powers) | 7 | axp221 (X-Powers) |
8 | axp223 (X-Powers) | 8 | axp223 (X-Powers) |
9 | axp803 (X-Powers) | 9 | axp803 (X-Powers) |
10 | axp806 (X-Powers) | ||
10 | axp809 (X-Powers) | 11 | axp809 (X-Powers) |
12 | axp813 (X-Powers) | ||
13 | |||
14 | The AXP813 is 2 chips packaged into 1. The 2 chips do not share anything | ||
15 | other than the packaging. Pins are routed separately. As such they should | ||
16 | be treated as separate entities. The other half is an AC100 RTC/codec | ||
17 | combo chip. Please see ./ac100.txt for its bindings. | ||
11 | 18 | ||
12 | Required properties: | 19 | Required properties: |
13 | - compatible: should be one of: | 20 | - compatible: should be one of: |
@@ -19,6 +26,7 @@ Required properties: | |||
19 | * "x-powers,axp803" | 26 | * "x-powers,axp803" |
20 | * "x-powers,axp806" | 27 | * "x-powers,axp806" |
21 | * "x-powers,axp809" | 28 | * "x-powers,axp809" |
29 | * "x-powers,axp813" | ||
22 | - reg: The I2C slave address or RSB hardware address for the AXP chip | 30 | - reg: The I2C slave address or RSB hardware address for the AXP chip |
23 | - interrupt-parent: The parent interrupt controller | 31 | - interrupt-parent: The parent interrupt controller |
24 | - interrupts: SoC NMI / GPIO interrupt connected to the PMIC's IRQ pin | 32 | - interrupts: SoC NMI / GPIO interrupt connected to the PMIC's IRQ pin |
@@ -28,12 +36,14 @@ Required properties: | |||
28 | Optional properties: | 36 | Optional properties: |
29 | - x-powers,dcdc-freq: defines the work frequency of DC-DC in KHz | 37 | - x-powers,dcdc-freq: defines the work frequency of DC-DC in KHz |
30 | AXP152/20X: range: 750-1875, Default: 1.5 MHz | 38 | AXP152/20X: range: 750-1875, Default: 1.5 MHz |
31 | AXP22X/80X: range: 1800-4050, Default: 3 MHz | 39 | AXP22X/8XX: range: 1800-4050, Default: 3 MHz |
32 | 40 | ||
33 | - x-powers,drive-vbus-en: axp221 / axp223 only boolean, set this when the | 41 | - x-powers,drive-vbus-en: boolean, set this when the N_VBUSEN pin is |
34 | N_VBUSEN pin is used as an output pin to control an external | 42 | used as an output pin to control an external |
35 | regulator to drive the OTG VBus, rather then as an input pin | 43 | regulator to drive the OTG VBus, rather then |
36 | which signals whether the board is driving OTG VBus or not. | 44 | as an input pin which signals whether the |
45 | board is driving OTG VBus or not. | ||
46 | (axp221 / axp223 / axp813 only) | ||
37 | 47 | ||
38 | - x-powers,master-mode: Boolean (axp806 only). Set this when the PMIC is | 48 | - x-powers,master-mode: Boolean (axp806 only). Set this when the PMIC is |
39 | wired for master mode. The default is slave mode. | 49 | wired for master mode. The default is slave mode. |
@@ -171,6 +181,36 @@ LDO_IO1 : LDO : ips-supply : GPIO 1 | |||
171 | RTC_LDO : LDO : ips-supply : always on | 181 | RTC_LDO : LDO : ips-supply : always on |
172 | SW : On/Off Switch : swin-supply | 182 | SW : On/Off Switch : swin-supply |
173 | 183 | ||
184 | AXP813 regulators, type, and corresponding input supply names: | ||
185 | |||
186 | Regulator Type Supply Name Notes | ||
187 | --------- ---- ----------- ----- | ||
188 | DCDC1 : DC-DC buck : vin1-supply | ||
189 | DCDC2 : DC-DC buck : vin2-supply : poly-phase capable | ||
190 | DCDC3 : DC-DC buck : vin3-supply : poly-phase capable | ||
191 | DCDC4 : DC-DC buck : vin4-supply | ||
192 | DCDC5 : DC-DC buck : vin5-supply : poly-phase capable | ||
193 | DCDC6 : DC-DC buck : vin6-supply : poly-phase capable | ||
194 | DCDC7 : DC-DC buck : vin7-supply | ||
195 | ALDO1 : LDO : aldoin-supply : shared supply | ||
196 | ALDO2 : LDO : aldoin-supply : shared supply | ||
197 | ALDO3 : LDO : aldoin-supply : shared supply | ||
198 | DLDO1 : LDO : dldoin-supply : shared supply | ||
199 | DLDO2 : LDO : dldoin-supply : shared supply | ||
200 | DLDO3 : LDO : dldoin-supply : shared supply | ||
201 | DLDO4 : LDO : dldoin-supply : shared supply | ||
202 | ELDO1 : LDO : eldoin-supply : shared supply | ||
203 | ELDO2 : LDO : eldoin-supply : shared supply | ||
204 | ELDO3 : LDO : eldoin-supply : shared supply | ||
205 | FLDO1 : LDO : fldoin-supply : shared supply | ||
206 | FLDO2 : LDO : fldoin-supply : shared supply | ||
207 | FLDO3 : LDO : fldoin-supply : shared supply | ||
208 | LDO_IO0 : LDO : ips-supply : GPIO 0 | ||
209 | LDO_IO1 : LDO : ips-supply : GPIO 1 | ||
210 | RTC_LDO : LDO : ips-supply : always on | ||
211 | SW : On/Off Switch : swin-supply | ||
212 | DRIVEVBUS : Enable output : drivevbus-supply : external regulator | ||
213 | |||
174 | Example: | 214 | Example: |
175 | 215 | ||
176 | axp209: pmic@34 { | 216 | axp209: pmic@34 { |
diff --git a/Documentation/devicetree/bindings/mfd/bd9571mwv.txt b/Documentation/devicetree/bindings/mfd/bd9571mwv.txt new file mode 100644 index 000000000000..9ab216a851d5 --- /dev/null +++ b/Documentation/devicetree/bindings/mfd/bd9571mwv.txt | |||
@@ -0,0 +1,49 @@ | |||
1 | * ROHM BD9571MWV Power Management Integrated Circuit (PMIC) bindings | ||
2 | |||
3 | Required properties: | ||
4 | - compatible : Should be "rohm,bd9571mwv". | ||
5 | - reg : I2C slave address. | ||
6 | - interrupt-parent : Phandle to the parent interrupt controller. | ||
7 | - interrupts : The interrupt line the device is connected to. | ||
8 | - interrupt-controller : Marks the device node as an interrupt controller. | ||
9 | - #interrupt-cells : The number of cells to describe an IRQ, should be 2. | ||
10 | The first cell is the IRQ number. | ||
11 | The second cell is the flags, encoded as trigger | ||
12 | masks from ../interrupt-controller/interrupts.txt. | ||
13 | - gpio-controller : Marks the device node as a GPIO Controller. | ||
14 | - #gpio-cells : Should be two. The first cell is the pin number and | ||
15 | the second cell is used to specify flags. | ||
16 | See ../gpio/gpio.txt for more information. | ||
17 | - regulators: : List of child nodes that specify the regulator | ||
18 | initialization data. Child nodes must be named | ||
19 | after their hardware counterparts: | ||
20 | - vd09 | ||
21 | - vd18 | ||
22 | - vd25 | ||
23 | - vd33 | ||
24 | - dvfs | ||
25 | Each child node is defined using the standard | ||
26 | binding for regulators. | ||
27 | |||
28 | Example: | ||
29 | |||
30 | pmic: pmic@30 { | ||
31 | compatible = "rohm,bd9571mwv"; | ||
32 | reg = <0x30>; | ||
33 | interrupt-parent = <&gpio2>; | ||
34 | interrupts = <0 IRQ_TYPE_LEVEL_LOW>; | ||
35 | interrupt-controller; | ||
36 | #interrupt-cells = <2>; | ||
37 | gpio-controller; | ||
38 | #gpio-cells = <2>; | ||
39 | |||
40 | regulators { | ||
41 | dvfs: dvfs { | ||
42 | regulator-name = "dvfs"; | ||
43 | regulator-min-microvolt = <750000>; | ||
44 | regulator-max-microvolt = <1030000>; | ||
45 | regulator-boot-on; | ||
46 | regulator-always-on; | ||
47 | }; | ||
48 | }; | ||
49 | }; | ||
diff --git a/Documentation/devicetree/bindings/mfd/da9052-i2c.txt b/Documentation/devicetree/bindings/mfd/da9052-i2c.txt index 9554292dc6cb..57fa74e65664 100644 --- a/Documentation/devicetree/bindings/mfd/da9052-i2c.txt +++ b/Documentation/devicetree/bindings/mfd/da9052-i2c.txt | |||
@@ -4,6 +4,14 @@ Required properties: | |||
4 | - compatible : Should be "dlg,da9052", "dlg,da9053-aa", | 4 | - compatible : Should be "dlg,da9052", "dlg,da9053-aa", |
5 | "dlg,da9053-ab", or "dlg,da9053-bb" | 5 | "dlg,da9053-ab", or "dlg,da9053-bb" |
6 | 6 | ||
7 | Optional properties: | ||
8 | - dlg,tsi-as-adc : Boolean, if set the X+, X-, Y+, Y- touchscreen | ||
9 | input lines are used as general purpose analogue | ||
10 | input. | ||
11 | - tsiref-supply: Phandle to the regulator, which provides the reference | ||
12 | voltage for the TSIREF pin. Must be provided when the | ||
13 | touchscreen pins are used for ADC purposes. | ||
14 | |||
7 | Sub-nodes: | 15 | Sub-nodes: |
8 | - regulators : Contain the regulator nodes. The DA9052/53 regulators are | 16 | - regulators : Contain the regulator nodes. The DA9052/53 regulators are |
9 | bound using their names as listed below: | 17 | bound using their names as listed below: |
diff --git a/Documentation/devicetree/bindings/mfd/retu.txt b/Documentation/devicetree/bindings/mfd/retu.txt new file mode 100644 index 000000000000..876242394a16 --- /dev/null +++ b/Documentation/devicetree/bindings/mfd/retu.txt | |||
@@ -0,0 +1,25 @@ | |||
1 | * Device tree bindings for Nokia Retu and Tahvo multi-function device | ||
2 | |||
3 | Retu and Tahvo are a multi-function devices found on Nokia Internet | ||
4 | Tablets (770, N800 and N810). The Retu chip provides watchdog timer | ||
5 | and power button control functionalities while Tahvo chip provides | ||
6 | USB transceiver functionality. | ||
7 | |||
8 | Required properties: | ||
9 | - compatible: "nokia,retu" or "nokia,tahvo" | ||
10 | - reg: Specifies the CBUS slave address of the ASIC chip | ||
11 | - interrupts: The interrupt line the device is connected to | ||
12 | - interrupt-parent: The parent interrupt controller | ||
13 | |||
14 | Example: | ||
15 | |||
16 | cbus0 { | ||
17 | compatible = "i2c-cbus-gpio"; | ||
18 | ... | ||
19 | retu: retu@1 { | ||
20 | compatible = "nokia,retu"; | ||
21 | interrupt-parent = <&gpio4>; | ||
22 | interrupts = <12 IRQ_TYPE_EDGE_RISING>; | ||
23 | reg = <0x1>; | ||
24 | }; | ||
25 | }; | ||
diff --git a/Documentation/devicetree/bindings/mfd/rk808.txt b/Documentation/devicetree/bindings/mfd/rk808.txt index 9636ae8d8d41..91b65227afeb 100644 --- a/Documentation/devicetree/bindings/mfd/rk808.txt +++ b/Documentation/devicetree/bindings/mfd/rk808.txt | |||
@@ -1,11 +1,14 @@ | |||
1 | RK8XX Power Management Integrated Circuit | 1 | RK8XX Power Management Integrated Circuit |
2 | 2 | ||
3 | The rk8xx family current members: | 3 | The rk8xx family current members: |
4 | rk805 | ||
4 | rk808 | 5 | rk808 |
5 | rk818 | 6 | rk818 |
6 | 7 | ||
7 | Required properties: | 8 | Required properties: |
8 | - compatible: "rockchip,rk808", "rockchip,rk818" | 9 | - compatible: "rockchip,rk805" |
10 | - compatible: "rockchip,rk808" | ||
11 | - compatible: "rockchip,rk818" | ||
9 | - reg: I2C slave address | 12 | - reg: I2C slave address |
10 | - interrupt-parent: The parent interrupt controller. | 13 | - interrupt-parent: The parent interrupt controller. |
11 | - interrupts: the interrupt outputs of the controller. | 14 | - interrupts: the interrupt outputs of the controller. |
@@ -18,6 +21,14 @@ Optional properties: | |||
18 | - rockchip,system-power-controller: Telling whether or not this pmic is controlling | 21 | - rockchip,system-power-controller: Telling whether or not this pmic is controlling |
19 | the system power. | 22 | the system power. |
20 | 23 | ||
24 | Optional RK805 properties: | ||
25 | - vcc1-supply: The input supply for DCDC_REG1 | ||
26 | - vcc2-supply: The input supply for DCDC_REG2 | ||
27 | - vcc3-supply: The input supply for DCDC_REG3 | ||
28 | - vcc4-supply: The input supply for DCDC_REG4 | ||
29 | - vcc5-supply: The input supply for LDO_REG1 and LDO_REG2 | ||
30 | - vcc6-supply: The input supply for LDO_REG3 | ||
31 | |||
21 | Optional RK808 properties: | 32 | Optional RK808 properties: |
22 | - vcc1-supply: The input supply for DCDC_REG1 | 33 | - vcc1-supply: The input supply for DCDC_REG1 |
23 | - vcc2-supply: The input supply for DCDC_REG2 | 34 | - vcc2-supply: The input supply for DCDC_REG2 |
@@ -56,6 +67,15 @@ by a child node of the 'regulators' node. | |||
56 | /* standard regulator bindings here */ | 67 | /* standard regulator bindings here */ |
57 | }; | 68 | }; |
58 | 69 | ||
70 | Following regulators of the RK805 PMIC regulators are supported. Note that | ||
71 | the 'n' in regulator name, as in DCDC_REGn or LDOn, represents the DCDC or LDO | ||
72 | number as described in RK805 datasheet. | ||
73 | |||
74 | - DCDC_REGn | ||
75 | - valid values for n are 1 to 4. | ||
76 | - LDO_REGn | ||
77 | - valid values for n are 1 to 3 | ||
78 | |||
59 | Following regulators of the RK808 PMIC block are supported. Note that | 79 | Following regulators of the RK808 PMIC block are supported. Note that |
60 | the 'n' in regulator name, as in DCDC_REGn or LDOn, represents the DCDC or LDO | 80 | the 'n' in regulator name, as in DCDC_REGn or LDOn, represents the DCDC or LDO |
61 | number as described in RK808 datasheet. | 81 | number as described in RK808 datasheet. |
diff --git a/Documentation/devicetree/bindings/mfd/stm32-lptimer.txt b/Documentation/devicetree/bindings/mfd/stm32-lptimer.txt new file mode 100644 index 000000000000..2a9ff29db9c9 --- /dev/null +++ b/Documentation/devicetree/bindings/mfd/stm32-lptimer.txt | |||
@@ -0,0 +1,48 @@ | |||
1 | STMicroelectronics STM32 Low-Power Timer | ||
2 | |||
3 | The STM32 Low-Power Timer (LPTIM) is a 16-bit timer that provides several | ||
4 | functions: | ||
5 | - PWM output (with programmable prescaler, configurable polarity) | ||
6 | - Quadrature encoder, counter | ||
7 | - Trigger source for STM32 ADC/DAC (LPTIM_OUT) | ||
8 | |||
9 | Required properties: | ||
10 | - compatible: Must be "st,stm32-lptimer". | ||
11 | - reg: Offset and length of the device's register set. | ||
12 | - clocks: Phandle to the clock used by the LP Timer module. | ||
13 | - clock-names: Must be "mux". | ||
14 | - #address-cells: Should be '<1>'. | ||
15 | - #size-cells: Should be '<0>'. | ||
16 | |||
17 | Optional subnodes: | ||
18 | - pwm: See ../pwm/pwm-stm32-lp.txt | ||
19 | - counter: See ../iio/timer/stm32-lptimer-cnt.txt | ||
20 | - trigger: See ../iio/timer/stm32-lptimer-trigger.txt | ||
21 | |||
22 | Example: | ||
23 | |||
24 | timer@40002400 { | ||
25 | compatible = "st,stm32-lptimer"; | ||
26 | reg = <0x40002400 0x400>; | ||
27 | clocks = <&timer_clk>; | ||
28 | clock-names = "mux"; | ||
29 | #address-cells = <1>; | ||
30 | #size-cells = <0>; | ||
31 | |||
32 | pwm { | ||
33 | compatible = "st,stm32-pwm-lp"; | ||
34 | pinctrl-names = "default"; | ||
35 | pinctrl-0 = <&lppwm1_pins>; | ||
36 | }; | ||
37 | |||
38 | trigger@0 { | ||
39 | compatible = "st,stm32-lptimer-trigger"; | ||
40 | reg = <0>; | ||
41 | }; | ||
42 | |||
43 | counter { | ||
44 | compatible = "st,stm32-lptimer-counter"; | ||
45 | pinctrl-names = "default"; | ||
46 | pinctrl-0 = <&lptim1_in_pins>; | ||
47 | }; | ||
48 | }; | ||
diff --git a/Documentation/devicetree/bindings/mfd/tps6105x.txt b/Documentation/devicetree/bindings/mfd/tps6105x.txt new file mode 100644 index 000000000000..93602c7a19c8 --- /dev/null +++ b/Documentation/devicetree/bindings/mfd/tps6105x.txt | |||
@@ -0,0 +1,17 @@ | |||
1 | * Device tree bindings for TI TPS61050/61052 Boost Converters | ||
2 | |||
3 | The TP61050/TPS61052 is a high-power "white LED driver". The | ||
4 | device provides LED, GPIO and regulator functionalities. | ||
5 | |||
6 | Required properties: | ||
7 | - compatible: "ti,tps61050" or "ti,tps61052" | ||
8 | - reg: Specifies the I2C slave address | ||
9 | |||
10 | Example: | ||
11 | |||
12 | i2c0 { | ||
13 | tps61052@33 { | ||
14 | compatible = "ti,tps61052"; | ||
15 | reg = <0x33>; | ||
16 | }; | ||
17 | }; | ||
diff --git a/Documentation/devicetree/bindings/mfd/zii,rave-sp.txt b/Documentation/devicetree/bindings/mfd/zii,rave-sp.txt new file mode 100644 index 000000000000..088eff9ddb78 --- /dev/null +++ b/Documentation/devicetree/bindings/mfd/zii,rave-sp.txt | |||
@@ -0,0 +1,39 @@ | |||
1 | Zodiac Inflight Innovations RAVE Supervisory Processor | ||
2 | |||
3 | RAVE Supervisory Processor communicates with SoC over UART. It is | ||
4 | expected that its Device Tree node is specified as a child of a node | ||
5 | corresponding to UART controller used for communication. | ||
6 | |||
7 | Required parent device properties: | ||
8 | |||
9 | - compatible: Should be one of: | ||
10 | - "zii,rave-sp-niu" | ||
11 | - "zii,rave-sp-mezz" | ||
12 | - "zii,rave-sp-esb" | ||
13 | - "zii,rave-sp-rdu1" | ||
14 | - "zii,rave-sp-rdu2" | ||
15 | |||
16 | - current-speed: Should be set to baud rate SP device is using | ||
17 | |||
18 | RAVE SP consists of the following sub-devices: | ||
19 | |||
20 | Device Description | ||
21 | ------ ----------- | ||
22 | rave-sp-wdt : Watchdog | ||
23 | rave-sp-nvmem : Interface to onborad EEPROM | ||
24 | rave-sp-backlight : Display backlight | ||
25 | rave-sp-hwmon : Interface to onboard hardware sensors | ||
26 | rave-sp-leds : Interface to onboard LEDs | ||
27 | rave-sp-input : Interface to onboard power button | ||
28 | |||
29 | Example of usage: | ||
30 | |||
31 | rdu { | ||
32 | compatible = "zii,rave-sp-rdu2"; | ||
33 | current-speed = <1000000>; | ||
34 | |||
35 | watchdog { | ||
36 | compatible = "zii,rave-sp-watchdog"; | ||
37 | }; | ||
38 | }; | ||
39 | |||
diff --git a/Documentation/devicetree/bindings/pinctrl/pinctrl-rk805.txt b/Documentation/devicetree/bindings/pinctrl/pinctrl-rk805.txt new file mode 100644 index 000000000000..eee3dc260934 --- /dev/null +++ b/Documentation/devicetree/bindings/pinctrl/pinctrl-rk805.txt | |||
@@ -0,0 +1,63 @@ | |||
1 | Pincontrol driver for RK805 Power management IC. | ||
2 | |||
3 | RK805 has 2 pins which can be configured as GPIO output only. | ||
4 | |||
5 | Please refer file <devicetree/bindings/pinctrl/pinctrl-bindings.txt> | ||
6 | for details of the common pinctrl bindings used by client devices, | ||
7 | including the meaning of the phrase "pin configuration node". | ||
8 | |||
9 | Optional Pinmux properties: | ||
10 | -------------------------- | ||
11 | Following properties are required if default setting of pins are required | ||
12 | at boot. | ||
13 | - pinctrl-names: A pinctrl state named per <pinctrl-binding.txt>. | ||
14 | - pinctrl[0...n]: Properties to contain the phandle for pinctrl states per | ||
15 | <pinctrl-binding.txt>. | ||
16 | |||
17 | The pin configurations are defined as child of the pinctrl states node. Each | ||
18 | sub-node have following properties: | ||
19 | |||
20 | Required properties: | ||
21 | ------------------ | ||
22 | - #gpio-cells: Should be two. The first cell is the pin number and the | ||
23 | second is the GPIO flags. | ||
24 | |||
25 | - gpio-controller: Marks the device node as a GPIO controller. | ||
26 | |||
27 | - pins: List of pins. Valid values of pins properties are: gpio0, gpio1. | ||
28 | |||
29 | First 2 properties must be added in the RK805 PMIC node, documented in | ||
30 | Documentation/devicetree/bindings/mfd/rk808.txt | ||
31 | |||
32 | Optional properties: | ||
33 | ------------------- | ||
34 | Following are optional properties defined as pinmux DT binding document | ||
35 | <pinctrl-bindings.txt>. Absence of properties will leave the configuration | ||
36 | on default. | ||
37 | function, | ||
38 | output-low, | ||
39 | output-high. | ||
40 | |||
41 | Valid values for function properties are: gpio. | ||
42 | |||
43 | Theres is also not customised properties for any GPIO. | ||
44 | |||
45 | Example: | ||
46 | -------- | ||
47 | rk805: rk805@18 { | ||
48 | compatible = "rockchip,rk805"; | ||
49 | ... | ||
50 | gpio-controller; | ||
51 | #gpio-cells = <2>; | ||
52 | |||
53 | pinctrl-names = "default"; | ||
54 | pinctrl-0 = <&pmic_int_l>, <&rk805_default>; | ||
55 | |||
56 | rk805_default: pinmux { | ||
57 | gpio01 { | ||
58 | pins = "gpio0", "gpio1"; | ||
59 | function = "gpio"; | ||
60 | output-high; | ||
61 | }; | ||
62 | }; | ||
63 | }; | ||
diff --git a/Documentation/devicetree/bindings/pwm/pwm-stm32-lp.txt b/Documentation/devicetree/bindings/pwm/pwm-stm32-lp.txt new file mode 100644 index 000000000000..f8338d11fd2b --- /dev/null +++ b/Documentation/devicetree/bindings/pwm/pwm-stm32-lp.txt | |||
@@ -0,0 +1,24 @@ | |||
1 | STMicroelectronics STM32 Low-Power Timer PWM | ||
2 | |||
3 | STM32 Low-Power Timer provides single channel PWM. | ||
4 | |||
5 | Must be a sub-node of an STM32 Low-Power Timer device tree node. | ||
6 | See ../mfd/stm32-lptimer.txt for details about the parent node. | ||
7 | |||
8 | Required parameters: | ||
9 | - compatible: Must be "st,stm32-pwm-lp". | ||
10 | |||
11 | Optional properties: | ||
12 | - pinctrl-names: Set to "default". | ||
13 | - pinctrl-0: Phandle pointing to pin configuration node for PWM. | ||
14 | |||
15 | Example: | ||
16 | timer@40002400 { | ||
17 | compatible = "st,stm32-lptimer"; | ||
18 | ... | ||
19 | pwm { | ||
20 | compatible = "st,stm32-pwm-lp"; | ||
21 | pinctrl-names = "default"; | ||
22 | pinctrl-0 = <&lppwm1_pins>; | ||
23 | }; | ||
24 | }; | ||
diff --git a/MAINTAINERS b/MAINTAINERS index b07232679a66..ac2dfb26d899 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -11432,6 +11432,17 @@ L: linux-serial@vger.kernel.org | |||
11432 | S: Odd Fixes | 11432 | S: Odd Fixes |
11433 | F: drivers/tty/serial/rp2.* | 11433 | F: drivers/tty/serial/rp2.* |
11434 | 11434 | ||
11435 | ROHM MULTIFUNCTION BD9571MWV-M PMIC DEVICE DRIVERS | ||
11436 | M: Marek Vasut <marek.vasut+renesas@gmail.com> | ||
11437 | L: linux-kernel@vger.kernel.org | ||
11438 | L: linux-renesas-soc@vger.kernel.org | ||
11439 | S: Supported | ||
11440 | F: drivers/mfd/bd9571mwv.c | ||
11441 | F: drivers/regulator/bd9571mwv-regulator.c | ||
11442 | F: drivers/gpio/gpio-bd9571mwv.c | ||
11443 | F: include/linux/mfd/bd9571mwv.h | ||
11444 | F: Documentation/devicetree/bindings/mfd/bd9571mwv.txt | ||
11445 | |||
11435 | ROSE NETWORK LAYER | 11446 | ROSE NETWORK LAYER |
11436 | M: Ralf Baechle <ralf@linux-mips.org> | 11447 | M: Ralf Baechle <ralf@linux-mips.org> |
11437 | L: linux-hams@vger.kernel.org | 11448 | L: linux-hams@vger.kernel.org |
diff --git a/arch/arm/boot/dts/omap2420-n8x0-common.dtsi b/arch/arm/boot/dts/omap2420-n8x0-common.dtsi index 7e5ffc583c90..91886231e5a8 100644 --- a/arch/arm/boot/dts/omap2420-n8x0-common.dtsi +++ b/arch/arm/boot/dts/omap2420-n8x0-common.dtsi | |||
@@ -15,8 +15,8 @@ | |||
15 | >; | 15 | >; |
16 | #address-cells = <1>; | 16 | #address-cells = <1>; |
17 | #size-cells = <0>; | 17 | #size-cells = <0>; |
18 | retu_mfd: retu@1 { | 18 | retu: retu@1 { |
19 | compatible = "retu-mfd"; | 19 | compatible = "nokia,retu"; |
20 | interrupt-parent = <&gpio4>; | 20 | interrupt-parent = <&gpio4>; |
21 | interrupts = <12 IRQ_TYPE_EDGE_RISING>; | 21 | interrupts = <12 IRQ_TYPE_EDGE_RISING>; |
22 | reg = <0x1>; | 22 | reg = <0x1>; |
diff --git a/arch/arm/boot/dts/ste-hrefprev60.dtsi b/arch/arm/boot/dts/ste-hrefprev60.dtsi index 5882a2606ac3..3f14b4df69b4 100644 --- a/arch/arm/boot/dts/ste-hrefprev60.dtsi +++ b/arch/arm/boot/dts/ste-hrefprev60.dtsi | |||
@@ -30,7 +30,7 @@ | |||
30 | 30 | ||
31 | i2c@80004000 { | 31 | i2c@80004000 { |
32 | tps61052@33 { | 32 | tps61052@33 { |
33 | compatible = "tps61052"; | 33 | compatible = "ti,tps61052"; |
34 | reg = <0x33>; | 34 | reg = <0x33>; |
35 | }; | 35 | }; |
36 | 36 | ||
diff --git a/arch/arm/mach-omap1/board-h2-mmc.c b/arch/arm/mach-omap1/board-h2-mmc.c index 357be2debc9d..91bda9c802ff 100644 --- a/arch/arm/mach-omap1/board-h2-mmc.c +++ b/arch/arm/mach-omap1/board-h2-mmc.c | |||
@@ -14,7 +14,7 @@ | |||
14 | #include <linux/gpio.h> | 14 | #include <linux/gpio.h> |
15 | #include <linux/platform_device.h> | 15 | #include <linux/platform_device.h> |
16 | #include <linux/platform_data/gpio-omap.h> | 16 | #include <linux/platform_data/gpio-omap.h> |
17 | #include <linux/i2c/tps65010.h> | 17 | #include <linux/mfd/tps65010.h> |
18 | 18 | ||
19 | #include "board-h2.h" | 19 | #include "board-h2.h" |
20 | #include "mmc.h" | 20 | #include "mmc.h" |
diff --git a/arch/arm/mach-omap1/board-h2.c b/arch/arm/mach-omap1/board-h2.c index 675254ee4b1e..dece47d76282 100644 --- a/arch/arm/mach-omap1/board-h2.c +++ b/arch/arm/mach-omap1/board-h2.c | |||
@@ -28,7 +28,7 @@ | |||
28 | #include <linux/mtd/partitions.h> | 28 | #include <linux/mtd/partitions.h> |
29 | #include <linux/mtd/physmap.h> | 29 | #include <linux/mtd/physmap.h> |
30 | #include <linux/input.h> | 30 | #include <linux/input.h> |
31 | #include <linux/i2c/tps65010.h> | 31 | #include <linux/mfd/tps65010.h> |
32 | #include <linux/smc91x.h> | 32 | #include <linux/smc91x.h> |
33 | #include <linux/omapfb.h> | 33 | #include <linux/omapfb.h> |
34 | #include <linux/platform_data/gpio-omap.h> | 34 | #include <linux/platform_data/gpio-omap.h> |
diff --git a/arch/arm/mach-omap1/board-h3-mmc.c b/arch/arm/mach-omap1/board-h3-mmc.c index 4f58bfa5e754..692c267a9a90 100644 --- a/arch/arm/mach-omap1/board-h3-mmc.c +++ b/arch/arm/mach-omap1/board-h3-mmc.c | |||
@@ -14,7 +14,7 @@ | |||
14 | #include <linux/gpio.h> | 14 | #include <linux/gpio.h> |
15 | #include <linux/platform_device.h> | 15 | #include <linux/platform_device.h> |
16 | 16 | ||
17 | #include <linux/i2c/tps65010.h> | 17 | #include <linux/mfd/tps65010.h> |
18 | 18 | ||
19 | #include "common.h" | 19 | #include "common.h" |
20 | #include "board-h3.h" | 20 | #include "board-h3.h" |
diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c index e62f9d454f10..6d32beeb2d88 100644 --- a/arch/arm/mach-omap1/board-h3.c +++ b/arch/arm/mach-omap1/board-h3.c | |||
@@ -28,7 +28,7 @@ | |||
28 | #include <linux/mtd/physmap.h> | 28 | #include <linux/mtd/physmap.h> |
29 | #include <linux/input.h> | 29 | #include <linux/input.h> |
30 | #include <linux/spi/spi.h> | 30 | #include <linux/spi/spi.h> |
31 | #include <linux/i2c/tps65010.h> | 31 | #include <linux/mfd/tps65010.h> |
32 | #include <linux/smc91x.h> | 32 | #include <linux/smc91x.h> |
33 | #include <linux/omapfb.h> | 33 | #include <linux/omapfb.h> |
34 | #include <linux/platform_data/gpio-omap.h> | 34 | #include <linux/platform_data/gpio-omap.h> |
diff --git a/arch/arm/mach-omap1/board-nokia770.c b/arch/arm/mach-omap1/board-nokia770.c index ee8d9f553db4..06243c0b12d2 100644 --- a/arch/arm/mach-omap1/board-nokia770.c +++ b/arch/arm/mach-omap1/board-nokia770.c | |||
@@ -233,10 +233,10 @@ static struct platform_device nokia770_cbus_device = { | |||
233 | 233 | ||
234 | static struct i2c_board_info nokia770_i2c_board_info_2[] __initdata = { | 234 | static struct i2c_board_info nokia770_i2c_board_info_2[] __initdata = { |
235 | { | 235 | { |
236 | I2C_BOARD_INFO("retu-mfd", 0x01), | 236 | I2C_BOARD_INFO("retu", 0x01), |
237 | }, | 237 | }, |
238 | { | 238 | { |
239 | I2C_BOARD_INFO("tahvo-mfd", 0x02), | 239 | I2C_BOARD_INFO("tahvo", 0x02), |
240 | }, | 240 | }, |
241 | }; | 241 | }; |
242 | 242 | ||
diff --git a/arch/arm/mach-omap1/board-osk.c b/arch/arm/mach-omap1/board-osk.c index 95ac1929aede..d579f4e04137 100644 --- a/arch/arm/mach-omap1/board-osk.c +++ b/arch/arm/mach-omap1/board-osk.c | |||
@@ -38,7 +38,7 @@ | |||
38 | #include <linux/mtd/mtd.h> | 38 | #include <linux/mtd/mtd.h> |
39 | #include <linux/mtd/partitions.h> | 39 | #include <linux/mtd/partitions.h> |
40 | #include <linux/mtd/physmap.h> | 40 | #include <linux/mtd/physmap.h> |
41 | #include <linux/i2c/tps65010.h> | 41 | #include <linux/mfd/tps65010.h> |
42 | #include <linux/platform_data/gpio-omap.h> | 42 | #include <linux/platform_data/gpio-omap.h> |
43 | #include <linux/platform_data/omap1_bl.h> | 43 | #include <linux/platform_data/omap1_bl.h> |
44 | 44 | ||
diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h index 8cc6338fcb12..b5ad7fcb80ed 100644 --- a/arch/arm/mach-omap2/common.h +++ b/arch/arm/mach-omap2/common.h | |||
@@ -29,7 +29,7 @@ | |||
29 | #include <linux/irq.h> | 29 | #include <linux/irq.h> |
30 | #include <linux/delay.h> | 30 | #include <linux/delay.h> |
31 | #include <linux/i2c.h> | 31 | #include <linux/i2c.h> |
32 | #include <linux/i2c/twl.h> | 32 | #include <linux/mfd/twl.h> |
33 | #include <linux/i2c-omap.h> | 33 | #include <linux/i2c-omap.h> |
34 | #include <linux/reboot.h> | 34 | #include <linux/reboot.h> |
35 | #include <linux/irqchip/irq-omap-intc.h> | 35 | #include <linux/irqchip/irq-omap-intc.h> |
diff --git a/arch/arm/mach-omap2/omap_twl.c b/arch/arm/mach-omap2/omap_twl.c index 1346b3ab34a5..295124b248ae 100644 --- a/arch/arm/mach-omap2/omap_twl.c +++ b/arch/arm/mach-omap2/omap_twl.c | |||
@@ -16,7 +16,7 @@ | |||
16 | #include <linux/err.h> | 16 | #include <linux/err.h> |
17 | #include <linux/io.h> | 17 | #include <linux/io.h> |
18 | #include <linux/kernel.h> | 18 | #include <linux/kernel.h> |
19 | #include <linux/i2c/twl.h> | 19 | #include <linux/mfd/twl.h> |
20 | 20 | ||
21 | #include "soc.h" | 21 | #include "soc.h" |
22 | #include "voltage.h" | 22 | #include "voltage.h" |
diff --git a/arch/arm/mach-s3c24xx/mach-osiris-dvs.c b/arch/arm/mach-s3c24xx/mach-osiris-dvs.c index 262ab0744748..6cac7da15e2b 100644 --- a/arch/arm/mach-s3c24xx/mach-osiris-dvs.c +++ b/arch/arm/mach-s3c24xx/mach-osiris-dvs.c | |||
@@ -17,7 +17,7 @@ | |||
17 | #include <linux/cpufreq.h> | 17 | #include <linux/cpufreq.h> |
18 | #include <linux/gpio.h> | 18 | #include <linux/gpio.h> |
19 | 19 | ||
20 | #include <linux/i2c/tps65010.h> | 20 | #include <linux/mfd/tps65010.h> |
21 | 21 | ||
22 | #include <plat/cpu-freq.h> | 22 | #include <plat/cpu-freq.h> |
23 | #include <mach/gpio-samsung.h> | 23 | #include <mach/gpio-samsung.h> |
diff --git a/arch/arm/mach-s3c24xx/mach-osiris.c b/arch/arm/mach-s3c24xx/mach-osiris.c index 70b0eb7d3134..64b1a0b7b803 100644 --- a/arch/arm/mach-s3c24xx/mach-osiris.c +++ b/arch/arm/mach-s3c24xx/mach-osiris.c | |||
@@ -24,7 +24,7 @@ | |||
24 | #include <linux/io.h> | 24 | #include <linux/io.h> |
25 | #include <linux/platform_device.h> | 25 | #include <linux/platform_device.h> |
26 | 26 | ||
27 | #include <linux/i2c/tps65010.h> | 27 | #include <linux/mfd/tps65010.h> |
28 | 28 | ||
29 | #include <asm/mach-types.h> | 29 | #include <asm/mach-types.h> |
30 | #include <asm/mach/arch.h> | 30 | #include <asm/mach/arch.h> |
diff --git a/drivers/gpio/gpio-twl4030.c b/drivers/gpio/gpio-twl4030.c index 24f388ed46d4..9b511df5450e 100644 --- a/drivers/gpio/gpio-twl4030.c +++ b/drivers/gpio/gpio-twl4030.c | |||
@@ -35,7 +35,7 @@ | |||
35 | #include <linux/of.h> | 35 | #include <linux/of.h> |
36 | #include <linux/irqdomain.h> | 36 | #include <linux/irqdomain.h> |
37 | 37 | ||
38 | #include <linux/i2c/twl.h> | 38 | #include <linux/mfd/twl.h> |
39 | 39 | ||
40 | /* | 40 | /* |
41 | * The GPIO "subchip" supports 18 GPIOs which can be configured as | 41 | * The GPIO "subchip" supports 18 GPIOs which can be configured as |
diff --git a/drivers/iio/adc/stm32-adc.c b/drivers/iio/adc/stm32-adc.c index 6bc602891f2f..e3c15f88075f 100644 --- a/drivers/iio/adc/stm32-adc.c +++ b/drivers/iio/adc/stm32-adc.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/dmaengine.h> | 25 | #include <linux/dmaengine.h> |
26 | #include <linux/iio/iio.h> | 26 | #include <linux/iio/iio.h> |
27 | #include <linux/iio/buffer.h> | 27 | #include <linux/iio/buffer.h> |
28 | #include <linux/iio/timer/stm32-lptim-trigger.h> | ||
28 | #include <linux/iio/timer/stm32-timer-trigger.h> | 29 | #include <linux/iio/timer/stm32-timer-trigger.h> |
29 | #include <linux/iio/trigger.h> | 30 | #include <linux/iio/trigger.h> |
30 | #include <linux/iio/trigger_consumer.h> | 31 | #include <linux/iio/trigger_consumer.h> |
@@ -185,6 +186,11 @@ enum stm32_adc_extsel { | |||
185 | STM32_EXT13, | 186 | STM32_EXT13, |
186 | STM32_EXT14, | 187 | STM32_EXT14, |
187 | STM32_EXT15, | 188 | STM32_EXT15, |
189 | STM32_EXT16, | ||
190 | STM32_EXT17, | ||
191 | STM32_EXT18, | ||
192 | STM32_EXT19, | ||
193 | STM32_EXT20, | ||
188 | }; | 194 | }; |
189 | 195 | ||
190 | /** | 196 | /** |
@@ -526,6 +532,9 @@ static struct stm32_adc_trig_info stm32h7_adc_trigs[] = { | |||
526 | { TIM4_TRGO, STM32_EXT12 }, | 532 | { TIM4_TRGO, STM32_EXT12 }, |
527 | { TIM6_TRGO, STM32_EXT13 }, | 533 | { TIM6_TRGO, STM32_EXT13 }, |
528 | { TIM3_CH4, STM32_EXT15 }, | 534 | { TIM3_CH4, STM32_EXT15 }, |
535 | { LPTIM1_OUT, STM32_EXT18 }, | ||
536 | { LPTIM2_OUT, STM32_EXT19 }, | ||
537 | { LPTIM3_OUT, STM32_EXT20 }, | ||
529 | {}, | 538 | {}, |
530 | }; | 539 | }; |
531 | 540 | ||
@@ -1082,7 +1091,8 @@ static int stm32_adc_get_trig_extsel(struct iio_dev *indio_dev, | |||
1082 | * Checking both stm32 timer trigger type and trig name | 1091 | * Checking both stm32 timer trigger type and trig name |
1083 | * should be safe against arbitrary trigger names. | 1092 | * should be safe against arbitrary trigger names. |
1084 | */ | 1093 | */ |
1085 | if (is_stm32_timer_trigger(trig) && | 1094 | if ((is_stm32_timer_trigger(trig) || |
1095 | is_stm32_lptim_trigger(trig)) && | ||
1086 | !strcmp(adc->cfg->trigs[i].name, trig->name)) { | 1096 | !strcmp(adc->cfg->trigs[i].name, trig->name)) { |
1087 | return adc->cfg->trigs[i].extsel; | 1097 | return adc->cfg->trigs[i].extsel; |
1088 | } | 1098 | } |
@@ -1764,7 +1774,7 @@ static int stm32_adc_probe(struct platform_device *pdev) | |||
1764 | indio_dev->dev.parent = &pdev->dev; | 1774 | indio_dev->dev.parent = &pdev->dev; |
1765 | indio_dev->dev.of_node = pdev->dev.of_node; | 1775 | indio_dev->dev.of_node = pdev->dev.of_node; |
1766 | indio_dev->info = &stm32_adc_iio_info; | 1776 | indio_dev->info = &stm32_adc_iio_info; |
1767 | indio_dev->modes = INDIO_DIRECT_MODE; | 1777 | indio_dev->modes = INDIO_DIRECT_MODE | INDIO_HARDWARE_TRIGGERED; |
1768 | 1778 | ||
1769 | platform_set_drvdata(pdev, adc); | 1779 | platform_set_drvdata(pdev, adc); |
1770 | 1780 | ||
diff --git a/drivers/iio/adc/twl4030-madc.c b/drivers/iio/adc/twl4030-madc.c index bd3d37fc2144..1edd99f0c5e5 100644 --- a/drivers/iio/adc/twl4030-madc.c +++ b/drivers/iio/adc/twl4030-madc.c | |||
@@ -35,7 +35,7 @@ | |||
35 | #include <linux/delay.h> | 35 | #include <linux/delay.h> |
36 | #include <linux/platform_device.h> | 36 | #include <linux/platform_device.h> |
37 | #include <linux/slab.h> | 37 | #include <linux/slab.h> |
38 | #include <linux/i2c/twl.h> | 38 | #include <linux/mfd/twl.h> |
39 | #include <linux/module.h> | 39 | #include <linux/module.h> |
40 | #include <linux/stddef.h> | 40 | #include <linux/stddef.h> |
41 | #include <linux/mutex.h> | 41 | #include <linux/mutex.h> |
diff --git a/drivers/iio/adc/twl6030-gpadc.c b/drivers/iio/adc/twl6030-gpadc.c index becbb0aef232..bc0e60b9da45 100644 --- a/drivers/iio/adc/twl6030-gpadc.c +++ b/drivers/iio/adc/twl6030-gpadc.c | |||
@@ -33,7 +33,7 @@ | |||
33 | #include <linux/module.h> | 33 | #include <linux/module.h> |
34 | #include <linux/platform_device.h> | 34 | #include <linux/platform_device.h> |
35 | #include <linux/of_platform.h> | 35 | #include <linux/of_platform.h> |
36 | #include <linux/i2c/twl.h> | 36 | #include <linux/mfd/twl.h> |
37 | #include <linux/iio/iio.h> | 37 | #include <linux/iio/iio.h> |
38 | #include <linux/iio/sysfs.h> | 38 | #include <linux/iio/sysfs.h> |
39 | 39 | ||
diff --git a/drivers/iio/counter/Kconfig b/drivers/iio/counter/Kconfig index b37e5fc03149..474e1ac4e7c0 100644 --- a/drivers/iio/counter/Kconfig +++ b/drivers/iio/counter/Kconfig | |||
@@ -21,4 +21,13 @@ config 104_QUAD_8 | |||
21 | The base port addresses for the devices may be configured via the base | 21 | The base port addresses for the devices may be configured via the base |
22 | array module parameter. | 22 | array module parameter. |
23 | 23 | ||
24 | config STM32_LPTIMER_CNT | ||
25 | tristate "STM32 LP Timer encoder counter driver" | ||
26 | depends on MFD_STM32_LPTIMER || COMPILE_TEST | ||
27 | help | ||
28 | Select this option to enable STM32 Low-Power Timer quadrature encoder | ||
29 | and counter driver. | ||
30 | |||
31 | To compile this driver as a module, choose M here: the | ||
32 | module will be called stm32-lptimer-cnt. | ||
24 | endmenu | 33 | endmenu |
diff --git a/drivers/iio/counter/Makefile b/drivers/iio/counter/Makefile index 007e88411648..1b9a896eb488 100644 --- a/drivers/iio/counter/Makefile +++ b/drivers/iio/counter/Makefile | |||
@@ -5,3 +5,4 @@ | |||
5 | # When adding new entries keep the list in alphabetical order | 5 | # When adding new entries keep the list in alphabetical order |
6 | 6 | ||
7 | obj-$(CONFIG_104_QUAD_8) += 104-quad-8.o | 7 | obj-$(CONFIG_104_QUAD_8) += 104-quad-8.o |
8 | obj-$(CONFIG_STM32_LPTIMER_CNT) += stm32-lptimer-cnt.o | ||
diff --git a/drivers/iio/counter/stm32-lptimer-cnt.c b/drivers/iio/counter/stm32-lptimer-cnt.c new file mode 100644 index 000000000000..1c5909bb1605 --- /dev/null +++ b/drivers/iio/counter/stm32-lptimer-cnt.c | |||
@@ -0,0 +1,383 @@ | |||
1 | /* | ||
2 | * STM32 Low-Power Timer Encoder and Counter driver | ||
3 | * | ||
4 | * Copyright (C) STMicroelectronics 2017 | ||
5 | * | ||
6 | * Author: Fabrice Gasnier <fabrice.gasnier@st.com> | ||
7 | * | ||
8 | * Inspired by 104-quad-8 and stm32-timer-trigger drivers. | ||
9 | * | ||
10 | * License terms: GNU General Public License (GPL), version 2 | ||
11 | */ | ||
12 | |||
13 | #include <linux/bitfield.h> | ||
14 | #include <linux/iio/iio.h> | ||
15 | #include <linux/mfd/stm32-lptimer.h> | ||
16 | #include <linux/module.h> | ||
17 | #include <linux/platform_device.h> | ||
18 | |||
19 | struct stm32_lptim_cnt { | ||
20 | struct device *dev; | ||
21 | struct regmap *regmap; | ||
22 | struct clk *clk; | ||
23 | u32 preset; | ||
24 | u32 polarity; | ||
25 | u32 quadrature_mode; | ||
26 | }; | ||
27 | |||
28 | static int stm32_lptim_is_enabled(struct stm32_lptim_cnt *priv) | ||
29 | { | ||
30 | u32 val; | ||
31 | int ret; | ||
32 | |||
33 | ret = regmap_read(priv->regmap, STM32_LPTIM_CR, &val); | ||
34 | if (ret) | ||
35 | return ret; | ||
36 | |||
37 | return FIELD_GET(STM32_LPTIM_ENABLE, val); | ||
38 | } | ||
39 | |||
40 | static int stm32_lptim_set_enable_state(struct stm32_lptim_cnt *priv, | ||
41 | int enable) | ||
42 | { | ||
43 | int ret; | ||
44 | u32 val; | ||
45 | |||
46 | val = FIELD_PREP(STM32_LPTIM_ENABLE, enable); | ||
47 | ret = regmap_write(priv->regmap, STM32_LPTIM_CR, val); | ||
48 | if (ret) | ||
49 | return ret; | ||
50 | |||
51 | if (!enable) { | ||
52 | clk_disable(priv->clk); | ||
53 | return 0; | ||
54 | } | ||
55 | |||
56 | /* LP timer must be enabled before writing CMP & ARR */ | ||
57 | ret = regmap_write(priv->regmap, STM32_LPTIM_ARR, priv->preset); | ||
58 | if (ret) | ||
59 | return ret; | ||
60 | |||
61 | ret = regmap_write(priv->regmap, STM32_LPTIM_CMP, 0); | ||
62 | if (ret) | ||
63 | return ret; | ||
64 | |||
65 | /* ensure CMP & ARR registers are properly written */ | ||
66 | ret = regmap_read_poll_timeout(priv->regmap, STM32_LPTIM_ISR, val, | ||
67 | (val & STM32_LPTIM_CMPOK_ARROK), | ||
68 | 100, 1000); | ||
69 | if (ret) | ||
70 | return ret; | ||
71 | |||
72 | ret = regmap_write(priv->regmap, STM32_LPTIM_ICR, | ||
73 | STM32_LPTIM_CMPOKCF_ARROKCF); | ||
74 | if (ret) | ||
75 | return ret; | ||
76 | |||
77 | ret = clk_enable(priv->clk); | ||
78 | if (ret) { | ||
79 | regmap_write(priv->regmap, STM32_LPTIM_CR, 0); | ||
80 | return ret; | ||
81 | } | ||
82 | |||
83 | /* Start LP timer in continuous mode */ | ||
84 | return regmap_update_bits(priv->regmap, STM32_LPTIM_CR, | ||
85 | STM32_LPTIM_CNTSTRT, STM32_LPTIM_CNTSTRT); | ||
86 | } | ||
87 | |||
88 | static int stm32_lptim_setup(struct stm32_lptim_cnt *priv, int enable) | ||
89 | { | ||
90 | u32 mask = STM32_LPTIM_ENC | STM32_LPTIM_COUNTMODE | | ||
91 | STM32_LPTIM_CKPOL | STM32_LPTIM_PRESC; | ||
92 | u32 val; | ||
93 | |||
94 | /* Setup LP timer encoder/counter and polarity, without prescaler */ | ||
95 | if (priv->quadrature_mode) | ||
96 | val = enable ? STM32_LPTIM_ENC : 0; | ||
97 | else | ||
98 | val = enable ? STM32_LPTIM_COUNTMODE : 0; | ||
99 | val |= FIELD_PREP(STM32_LPTIM_CKPOL, enable ? priv->polarity : 0); | ||
100 | |||
101 | return regmap_update_bits(priv->regmap, STM32_LPTIM_CFGR, mask, val); | ||
102 | } | ||
103 | |||
104 | static int stm32_lptim_write_raw(struct iio_dev *indio_dev, | ||
105 | struct iio_chan_spec const *chan, | ||
106 | int val, int val2, long mask) | ||
107 | { | ||
108 | struct stm32_lptim_cnt *priv = iio_priv(indio_dev); | ||
109 | int ret; | ||
110 | |||
111 | switch (mask) { | ||
112 | case IIO_CHAN_INFO_ENABLE: | ||
113 | if (val < 0 || val > 1) | ||
114 | return -EINVAL; | ||
115 | |||
116 | /* Check nobody uses the timer, or already disabled/enabled */ | ||
117 | ret = stm32_lptim_is_enabled(priv); | ||
118 | if ((ret < 0) || (!ret && !val)) | ||
119 | return ret; | ||
120 | if (val && ret) | ||
121 | return -EBUSY; | ||
122 | |||
123 | ret = stm32_lptim_setup(priv, val); | ||
124 | if (ret) | ||
125 | return ret; | ||
126 | return stm32_lptim_set_enable_state(priv, val); | ||
127 | |||
128 | default: | ||
129 | return -EINVAL; | ||
130 | } | ||
131 | } | ||
132 | |||
133 | static int stm32_lptim_read_raw(struct iio_dev *indio_dev, | ||
134 | struct iio_chan_spec const *chan, | ||
135 | int *val, int *val2, long mask) | ||
136 | { | ||
137 | struct stm32_lptim_cnt *priv = iio_priv(indio_dev); | ||
138 | u32 dat; | ||
139 | int ret; | ||
140 | |||
141 | switch (mask) { | ||
142 | case IIO_CHAN_INFO_RAW: | ||
143 | ret = regmap_read(priv->regmap, STM32_LPTIM_CNT, &dat); | ||
144 | if (ret) | ||
145 | return ret; | ||
146 | *val = dat; | ||
147 | return IIO_VAL_INT; | ||
148 | |||
149 | case IIO_CHAN_INFO_ENABLE: | ||
150 | ret = stm32_lptim_is_enabled(priv); | ||
151 | if (ret < 0) | ||
152 | return ret; | ||
153 | *val = ret; | ||
154 | return IIO_VAL_INT; | ||
155 | |||
156 | case IIO_CHAN_INFO_SCALE: | ||
157 | /* Non-quadrature mode: scale = 1 */ | ||
158 | *val = 1; | ||
159 | *val2 = 0; | ||
160 | if (priv->quadrature_mode) { | ||
161 | /* | ||
162 | * Quadrature encoder mode: | ||
163 | * - both edges, quarter cycle, scale is 0.25 | ||
164 | * - either rising/falling edge scale is 0.5 | ||
165 | */ | ||
166 | if (priv->polarity > 1) | ||
167 | *val2 = 2; | ||
168 | else | ||
169 | *val2 = 1; | ||
170 | } | ||
171 | return IIO_VAL_FRACTIONAL_LOG2; | ||
172 | |||
173 | default: | ||
174 | return -EINVAL; | ||
175 | } | ||
176 | } | ||
177 | |||
178 | static const struct iio_info stm32_lptim_cnt_iio_info = { | ||
179 | .read_raw = stm32_lptim_read_raw, | ||
180 | .write_raw = stm32_lptim_write_raw, | ||
181 | .driver_module = THIS_MODULE, | ||
182 | }; | ||
183 | |||
184 | static const char *const stm32_lptim_quadrature_modes[] = { | ||
185 | "non-quadrature", | ||
186 | "quadrature", | ||
187 | }; | ||
188 | |||
189 | static int stm32_lptim_get_quadrature_mode(struct iio_dev *indio_dev, | ||
190 | const struct iio_chan_spec *chan) | ||
191 | { | ||
192 | struct stm32_lptim_cnt *priv = iio_priv(indio_dev); | ||
193 | |||
194 | return priv->quadrature_mode; | ||
195 | } | ||
196 | |||
197 | static int stm32_lptim_set_quadrature_mode(struct iio_dev *indio_dev, | ||
198 | const struct iio_chan_spec *chan, | ||
199 | unsigned int type) | ||
200 | { | ||
201 | struct stm32_lptim_cnt *priv = iio_priv(indio_dev); | ||
202 | |||
203 | if (stm32_lptim_is_enabled(priv)) | ||
204 | return -EBUSY; | ||
205 | |||
206 | priv->quadrature_mode = type; | ||
207 | |||
208 | return 0; | ||
209 | } | ||
210 | |||
211 | static const struct iio_enum stm32_lptim_quadrature_mode_en = { | ||
212 | .items = stm32_lptim_quadrature_modes, | ||
213 | .num_items = ARRAY_SIZE(stm32_lptim_quadrature_modes), | ||
214 | .get = stm32_lptim_get_quadrature_mode, | ||
215 | .set = stm32_lptim_set_quadrature_mode, | ||
216 | }; | ||
217 | |||
218 | static const char * const stm32_lptim_cnt_polarity[] = { | ||
219 | "rising-edge", "falling-edge", "both-edges", | ||
220 | }; | ||
221 | |||
222 | static int stm32_lptim_cnt_get_polarity(struct iio_dev *indio_dev, | ||
223 | const struct iio_chan_spec *chan) | ||
224 | { | ||
225 | struct stm32_lptim_cnt *priv = iio_priv(indio_dev); | ||
226 | |||
227 | return priv->polarity; | ||
228 | } | ||
229 | |||
230 | static int stm32_lptim_cnt_set_polarity(struct iio_dev *indio_dev, | ||
231 | const struct iio_chan_spec *chan, | ||
232 | unsigned int type) | ||
233 | { | ||
234 | struct stm32_lptim_cnt *priv = iio_priv(indio_dev); | ||
235 | |||
236 | if (stm32_lptim_is_enabled(priv)) | ||
237 | return -EBUSY; | ||
238 | |||
239 | priv->polarity = type; | ||
240 | |||
241 | return 0; | ||
242 | } | ||
243 | |||
244 | static const struct iio_enum stm32_lptim_cnt_polarity_en = { | ||
245 | .items = stm32_lptim_cnt_polarity, | ||
246 | .num_items = ARRAY_SIZE(stm32_lptim_cnt_polarity), | ||
247 | .get = stm32_lptim_cnt_get_polarity, | ||
248 | .set = stm32_lptim_cnt_set_polarity, | ||
249 | }; | ||
250 | |||
251 | static ssize_t stm32_lptim_cnt_get_preset(struct iio_dev *indio_dev, | ||
252 | uintptr_t private, | ||
253 | const struct iio_chan_spec *chan, | ||
254 | char *buf) | ||
255 | { | ||
256 | struct stm32_lptim_cnt *priv = iio_priv(indio_dev); | ||
257 | |||
258 | return snprintf(buf, PAGE_SIZE, "%u\n", priv->preset); | ||
259 | } | ||
260 | |||
261 | static ssize_t stm32_lptim_cnt_set_preset(struct iio_dev *indio_dev, | ||
262 | uintptr_t private, | ||
263 | const struct iio_chan_spec *chan, | ||
264 | const char *buf, size_t len) | ||
265 | { | ||
266 | struct stm32_lptim_cnt *priv = iio_priv(indio_dev); | ||
267 | int ret; | ||
268 | |||
269 | if (stm32_lptim_is_enabled(priv)) | ||
270 | return -EBUSY; | ||
271 | |||
272 | ret = kstrtouint(buf, 0, &priv->preset); | ||
273 | if (ret) | ||
274 | return ret; | ||
275 | |||
276 | if (priv->preset > STM32_LPTIM_MAX_ARR) | ||
277 | return -EINVAL; | ||
278 | |||
279 | return len; | ||
280 | } | ||
281 | |||
282 | /* LP timer with encoder */ | ||
283 | static const struct iio_chan_spec_ext_info stm32_lptim_enc_ext_info[] = { | ||
284 | { | ||
285 | .name = "preset", | ||
286 | .shared = IIO_SEPARATE, | ||
287 | .read = stm32_lptim_cnt_get_preset, | ||
288 | .write = stm32_lptim_cnt_set_preset, | ||
289 | }, | ||
290 | IIO_ENUM("polarity", IIO_SEPARATE, &stm32_lptim_cnt_polarity_en), | ||
291 | IIO_ENUM_AVAILABLE("polarity", &stm32_lptim_cnt_polarity_en), | ||
292 | IIO_ENUM("quadrature_mode", IIO_SEPARATE, | ||
293 | &stm32_lptim_quadrature_mode_en), | ||
294 | IIO_ENUM_AVAILABLE("quadrature_mode", &stm32_lptim_quadrature_mode_en), | ||
295 | {} | ||
296 | }; | ||
297 | |||
298 | static const struct iio_chan_spec stm32_lptim_enc_channels = { | ||
299 | .type = IIO_COUNT, | ||
300 | .channel = 0, | ||
301 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | | ||
302 | BIT(IIO_CHAN_INFO_ENABLE) | | ||
303 | BIT(IIO_CHAN_INFO_SCALE), | ||
304 | .ext_info = stm32_lptim_enc_ext_info, | ||
305 | .indexed = 1, | ||
306 | }; | ||
307 | |||
308 | /* LP timer without encoder (counter only) */ | ||
309 | static const struct iio_chan_spec_ext_info stm32_lptim_cnt_ext_info[] = { | ||
310 | { | ||
311 | .name = "preset", | ||
312 | .shared = IIO_SEPARATE, | ||
313 | .read = stm32_lptim_cnt_get_preset, | ||
314 | .write = stm32_lptim_cnt_set_preset, | ||
315 | }, | ||
316 | IIO_ENUM("polarity", IIO_SEPARATE, &stm32_lptim_cnt_polarity_en), | ||
317 | IIO_ENUM_AVAILABLE("polarity", &stm32_lptim_cnt_polarity_en), | ||
318 | {} | ||
319 | }; | ||
320 | |||
321 | static const struct iio_chan_spec stm32_lptim_cnt_channels = { | ||
322 | .type = IIO_COUNT, | ||
323 | .channel = 0, | ||
324 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | | ||
325 | BIT(IIO_CHAN_INFO_ENABLE) | | ||
326 | BIT(IIO_CHAN_INFO_SCALE), | ||
327 | .ext_info = stm32_lptim_cnt_ext_info, | ||
328 | .indexed = 1, | ||
329 | }; | ||
330 | |||
331 | static int stm32_lptim_cnt_probe(struct platform_device *pdev) | ||
332 | { | ||
333 | struct stm32_lptimer *ddata = dev_get_drvdata(pdev->dev.parent); | ||
334 | struct stm32_lptim_cnt *priv; | ||
335 | struct iio_dev *indio_dev; | ||
336 | |||
337 | if (IS_ERR_OR_NULL(ddata)) | ||
338 | return -EINVAL; | ||
339 | |||
340 | indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*priv)); | ||
341 | if (!indio_dev) | ||
342 | return -ENOMEM; | ||
343 | |||
344 | priv = iio_priv(indio_dev); | ||
345 | priv->dev = &pdev->dev; | ||
346 | priv->regmap = ddata->regmap; | ||
347 | priv->clk = ddata->clk; | ||
348 | priv->preset = STM32_LPTIM_MAX_ARR; | ||
349 | |||
350 | indio_dev->name = dev_name(&pdev->dev); | ||
351 | indio_dev->dev.parent = &pdev->dev; | ||
352 | indio_dev->dev.of_node = pdev->dev.of_node; | ||
353 | indio_dev->info = &stm32_lptim_cnt_iio_info; | ||
354 | if (ddata->has_encoder) | ||
355 | indio_dev->channels = &stm32_lptim_enc_channels; | ||
356 | else | ||
357 | indio_dev->channels = &stm32_lptim_cnt_channels; | ||
358 | indio_dev->num_channels = 1; | ||
359 | |||
360 | platform_set_drvdata(pdev, priv); | ||
361 | |||
362 | return devm_iio_device_register(&pdev->dev, indio_dev); | ||
363 | } | ||
364 | |||
365 | static const struct of_device_id stm32_lptim_cnt_of_match[] = { | ||
366 | { .compatible = "st,stm32-lptimer-counter", }, | ||
367 | {}, | ||
368 | }; | ||
369 | MODULE_DEVICE_TABLE(of, stm32_lptim_cnt_of_match); | ||
370 | |||
371 | static struct platform_driver stm32_lptim_cnt_driver = { | ||
372 | .probe = stm32_lptim_cnt_probe, | ||
373 | .driver = { | ||
374 | .name = "stm32-lptimer-counter", | ||
375 | .of_match_table = stm32_lptim_cnt_of_match, | ||
376 | }, | ||
377 | }; | ||
378 | module_platform_driver(stm32_lptim_cnt_driver); | ||
379 | |||
380 | MODULE_AUTHOR("Fabrice Gasnier <fabrice.gasnier@st.com>"); | ||
381 | MODULE_ALIAS("platform:stm32-lptimer-counter"); | ||
382 | MODULE_DESCRIPTION("STMicroelectronics STM32 LPTIM counter driver"); | ||
383 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/iio/trigger/Kconfig b/drivers/iio/trigger/Kconfig index e4d4e63434db..a633d2c8e805 100644 --- a/drivers/iio/trigger/Kconfig +++ b/drivers/iio/trigger/Kconfig | |||
@@ -24,6 +24,17 @@ config IIO_INTERRUPT_TRIGGER | |||
24 | To compile this driver as a module, choose M here: the | 24 | To compile this driver as a module, choose M here: the |
25 | module will be called iio-trig-interrupt. | 25 | module will be called iio-trig-interrupt. |
26 | 26 | ||
27 | config IIO_STM32_LPTIMER_TRIGGER | ||
28 | tristate "STM32 Low-Power Timer Trigger" | ||
29 | depends on MFD_STM32_LPTIMER || COMPILE_TEST | ||
30 | help | ||
31 | Select this option to enable STM32 Low-Power Timer Trigger. | ||
32 | This can be used as trigger source for STM32 internal ADC | ||
33 | and/or DAC. | ||
34 | |||
35 | To compile this driver as a module, choose M here: the | ||
36 | module will be called stm32-lptimer-trigger. | ||
37 | |||
27 | config IIO_STM32_TIMER_TRIGGER | 38 | config IIO_STM32_TIMER_TRIGGER |
28 | tristate "STM32 Timer Trigger" | 39 | tristate "STM32 Timer Trigger" |
29 | depends on (ARCH_STM32 && OF && MFD_STM32_TIMERS) || COMPILE_TEST | 40 | depends on (ARCH_STM32 && OF && MFD_STM32_TIMERS) || COMPILE_TEST |
diff --git a/drivers/iio/trigger/Makefile b/drivers/iio/trigger/Makefile index 5c4ecd380653..0a72a2a76cb2 100644 --- a/drivers/iio/trigger/Makefile +++ b/drivers/iio/trigger/Makefile | |||
@@ -6,6 +6,7 @@ | |||
6 | 6 | ||
7 | obj-$(CONFIG_IIO_HRTIMER_TRIGGER) += iio-trig-hrtimer.o | 7 | obj-$(CONFIG_IIO_HRTIMER_TRIGGER) += iio-trig-hrtimer.o |
8 | obj-$(CONFIG_IIO_INTERRUPT_TRIGGER) += iio-trig-interrupt.o | 8 | obj-$(CONFIG_IIO_INTERRUPT_TRIGGER) += iio-trig-interrupt.o |
9 | obj-$(CONFIG_IIO_STM32_LPTIMER_TRIGGER) += stm32-lptimer-trigger.o | ||
9 | obj-$(CONFIG_IIO_STM32_TIMER_TRIGGER) += stm32-timer-trigger.o | 10 | obj-$(CONFIG_IIO_STM32_TIMER_TRIGGER) += stm32-timer-trigger.o |
10 | obj-$(CONFIG_IIO_SYSFS_TRIGGER) += iio-trig-sysfs.o | 11 | obj-$(CONFIG_IIO_SYSFS_TRIGGER) += iio-trig-sysfs.o |
11 | obj-$(CONFIG_IIO_TIGHTLOOP_TRIGGER) += iio-trig-loop.o | 12 | obj-$(CONFIG_IIO_TIGHTLOOP_TRIGGER) += iio-trig-loop.o |
diff --git a/drivers/iio/trigger/stm32-lptimer-trigger.c b/drivers/iio/trigger/stm32-lptimer-trigger.c new file mode 100644 index 000000000000..241eae6a4306 --- /dev/null +++ b/drivers/iio/trigger/stm32-lptimer-trigger.c | |||
@@ -0,0 +1,118 @@ | |||
1 | /* | ||
2 | * STM32 Low-Power Timer Trigger driver | ||
3 | * | ||
4 | * Copyright (C) STMicroelectronics 2017 | ||
5 | * | ||
6 | * Author: Fabrice Gasnier <fabrice.gasnier@st.com>. | ||
7 | * | ||
8 | * License terms: GNU General Public License (GPL), version 2 | ||
9 | * | ||
10 | * Inspired by Benjamin Gaignard's stm32-timer-trigger driver | ||
11 | */ | ||
12 | |||
13 | #include <linux/iio/timer/stm32-lptim-trigger.h> | ||
14 | #include <linux/mfd/stm32-lptimer.h> | ||
15 | #include <linux/module.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | |||
18 | /* List Low-Power Timer triggers */ | ||
19 | static const char * const stm32_lptim_triggers[] = { | ||
20 | LPTIM1_OUT, | ||
21 | LPTIM2_OUT, | ||
22 | LPTIM3_OUT, | ||
23 | }; | ||
24 | |||
25 | struct stm32_lptim_trigger { | ||
26 | struct device *dev; | ||
27 | const char *trg; | ||
28 | }; | ||
29 | |||
30 | static int stm32_lptim_validate_device(struct iio_trigger *trig, | ||
31 | struct iio_dev *indio_dev) | ||
32 | { | ||
33 | if (indio_dev->modes & INDIO_HARDWARE_TRIGGERED) | ||
34 | return 0; | ||
35 | |||
36 | return -EINVAL; | ||
37 | } | ||
38 | |||
39 | static const struct iio_trigger_ops stm32_lptim_trigger_ops = { | ||
40 | .owner = THIS_MODULE, | ||
41 | .validate_device = stm32_lptim_validate_device, | ||
42 | }; | ||
43 | |||
44 | /** | ||
45 | * is_stm32_lptim_trigger | ||
46 | * @trig: trigger to be checked | ||
47 | * | ||
48 | * return true if the trigger is a valid STM32 IIO Low-Power Timer Trigger | ||
49 | * either return false | ||
50 | */ | ||
51 | bool is_stm32_lptim_trigger(struct iio_trigger *trig) | ||
52 | { | ||
53 | return (trig->ops == &stm32_lptim_trigger_ops); | ||
54 | } | ||
55 | EXPORT_SYMBOL(is_stm32_lptim_trigger); | ||
56 | |||
57 | static int stm32_lptim_setup_trig(struct stm32_lptim_trigger *priv) | ||
58 | { | ||
59 | struct iio_trigger *trig; | ||
60 | |||
61 | trig = devm_iio_trigger_alloc(priv->dev, "%s", priv->trg); | ||
62 | if (!trig) | ||
63 | return -ENOMEM; | ||
64 | |||
65 | trig->dev.parent = priv->dev->parent; | ||
66 | trig->ops = &stm32_lptim_trigger_ops; | ||
67 | iio_trigger_set_drvdata(trig, priv); | ||
68 | |||
69 | return devm_iio_trigger_register(priv->dev, trig); | ||
70 | } | ||
71 | |||
72 | static int stm32_lptim_trigger_probe(struct platform_device *pdev) | ||
73 | { | ||
74 | struct stm32_lptim_trigger *priv; | ||
75 | u32 index; | ||
76 | int ret; | ||
77 | |||
78 | priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); | ||
79 | if (!priv) | ||
80 | return -ENOMEM; | ||
81 | |||
82 | if (of_property_read_u32(pdev->dev.of_node, "reg", &index)) | ||
83 | return -EINVAL; | ||
84 | |||
85 | if (index >= ARRAY_SIZE(stm32_lptim_triggers)) | ||
86 | return -EINVAL; | ||
87 | |||
88 | priv->dev = &pdev->dev; | ||
89 | priv->trg = stm32_lptim_triggers[index]; | ||
90 | |||
91 | ret = stm32_lptim_setup_trig(priv); | ||
92 | if (ret) | ||
93 | return ret; | ||
94 | |||
95 | platform_set_drvdata(pdev, priv); | ||
96 | |||
97 | return 0; | ||
98 | } | ||
99 | |||
100 | static const struct of_device_id stm32_lptim_trig_of_match[] = { | ||
101 | { .compatible = "st,stm32-lptimer-trigger", }, | ||
102 | {}, | ||
103 | }; | ||
104 | MODULE_DEVICE_TABLE(of, stm32_lptim_trig_of_match); | ||
105 | |||
106 | static struct platform_driver stm32_lptim_trigger_driver = { | ||
107 | .probe = stm32_lptim_trigger_probe, | ||
108 | .driver = { | ||
109 | .name = "stm32-lptimer-trigger", | ||
110 | .of_match_table = stm32_lptim_trig_of_match, | ||
111 | }, | ||
112 | }; | ||
113 | module_platform_driver(stm32_lptim_trigger_driver); | ||
114 | |||
115 | MODULE_AUTHOR("Fabrice Gasnier <fabrice.gasnier@st.com>"); | ||
116 | MODULE_ALIAS("platform:stm32-lptimer-trigger"); | ||
117 | MODULE_DESCRIPTION("STMicroelectronics STM32 LPTIM trigger driver"); | ||
118 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/input/keyboard/twl4030_keypad.c b/drivers/input/keyboard/twl4030_keypad.c index 39e72b3219d8..f9f98ef1d98e 100644 --- a/drivers/input/keyboard/twl4030_keypad.c +++ b/drivers/input/keyboard/twl4030_keypad.c | |||
@@ -30,7 +30,7 @@ | |||
30 | #include <linux/interrupt.h> | 30 | #include <linux/interrupt.h> |
31 | #include <linux/input.h> | 31 | #include <linux/input.h> |
32 | #include <linux/platform_device.h> | 32 | #include <linux/platform_device.h> |
33 | #include <linux/i2c/twl.h> | 33 | #include <linux/mfd/twl.h> |
34 | #include <linux/slab.h> | 34 | #include <linux/slab.h> |
35 | #include <linux/of.h> | 35 | #include <linux/of.h> |
36 | 36 | ||
diff --git a/drivers/input/misc/dm355evm_keys.c b/drivers/input/misc/dm355evm_keys.c index bab256ef32b9..c803db64a376 100644 --- a/drivers/input/misc/dm355evm_keys.c +++ b/drivers/input/misc/dm355evm_keys.c | |||
@@ -15,7 +15,7 @@ | |||
15 | #include <linux/platform_device.h> | 15 | #include <linux/platform_device.h> |
16 | #include <linux/interrupt.h> | 16 | #include <linux/interrupt.h> |
17 | 17 | ||
18 | #include <linux/i2c/dm355evm_msp.h> | 18 | #include <linux/mfd/dm355evm_msp.h> |
19 | #include <linux/module.h> | 19 | #include <linux/module.h> |
20 | 20 | ||
21 | 21 | ||
diff --git a/drivers/input/misc/twl4030-pwrbutton.c b/drivers/input/misc/twl4030-pwrbutton.c index 1c13005b228f..b307cca17022 100644 --- a/drivers/input/misc/twl4030-pwrbutton.c +++ b/drivers/input/misc/twl4030-pwrbutton.c | |||
@@ -27,7 +27,7 @@ | |||
27 | #include <linux/input.h> | 27 | #include <linux/input.h> |
28 | #include <linux/interrupt.h> | 28 | #include <linux/interrupt.h> |
29 | #include <linux/platform_device.h> | 29 | #include <linux/platform_device.h> |
30 | #include <linux/i2c/twl.h> | 30 | #include <linux/mfd/twl.h> |
31 | 31 | ||
32 | #define PWR_PWRON_IRQ (1 << 0) | 32 | #define PWR_PWRON_IRQ (1 << 0) |
33 | 33 | ||
diff --git a/drivers/input/misc/twl4030-vibra.c b/drivers/input/misc/twl4030-vibra.c index caa5a62c42fb..6c51d404874b 100644 --- a/drivers/input/misc/twl4030-vibra.c +++ b/drivers/input/misc/twl4030-vibra.c | |||
@@ -28,7 +28,7 @@ | |||
28 | #include <linux/platform_device.h> | 28 | #include <linux/platform_device.h> |
29 | #include <linux/of.h> | 29 | #include <linux/of.h> |
30 | #include <linux/workqueue.h> | 30 | #include <linux/workqueue.h> |
31 | #include <linux/i2c/twl.h> | 31 | #include <linux/mfd/twl.h> |
32 | #include <linux/mfd/twl4030-audio.h> | 32 | #include <linux/mfd/twl4030-audio.h> |
33 | #include <linux/input.h> | 33 | #include <linux/input.h> |
34 | #include <linux/slab.h> | 34 | #include <linux/slab.h> |
diff --git a/drivers/memory/atmel-ebi.c b/drivers/memory/atmel-ebi.c index ebf69ff48ae2..c00a7c7f460a 100644 --- a/drivers/memory/atmel-ebi.c +++ b/drivers/memory/atmel-ebi.c | |||
@@ -51,6 +51,7 @@ struct atmel_ebi { | |||
51 | struct { | 51 | struct { |
52 | struct regmap *regmap; | 52 | struct regmap *regmap; |
53 | struct clk *clk; | 53 | struct clk *clk; |
54 | const struct atmel_hsmc_reg_layout *layout; | ||
54 | } smc; | 55 | } smc; |
55 | 56 | ||
56 | struct device *dev; | 57 | struct device *dev; |
@@ -84,8 +85,8 @@ static void at91sam9_ebi_get_config(struct atmel_ebi_dev *ebid, | |||
84 | static void sama5_ebi_get_config(struct atmel_ebi_dev *ebid, | 85 | static void sama5_ebi_get_config(struct atmel_ebi_dev *ebid, |
85 | struct atmel_ebi_dev_config *conf) | 86 | struct atmel_ebi_dev_config *conf) |
86 | { | 87 | { |
87 | atmel_hsmc_cs_conf_get(ebid->ebi->smc.regmap, conf->cs, | 88 | atmel_hsmc_cs_conf_get(ebid->ebi->smc.regmap, ebid->ebi->smc.layout, |
88 | &conf->smcconf); | 89 | conf->cs, &conf->smcconf); |
89 | } | 90 | } |
90 | 91 | ||
91 | static const struct atmel_smc_timing_xlate timings_xlate_table[] = { | 92 | static const struct atmel_smc_timing_xlate timings_xlate_table[] = { |
@@ -287,8 +288,8 @@ static void at91sam9_ebi_apply_config(struct atmel_ebi_dev *ebid, | |||
287 | static void sama5_ebi_apply_config(struct atmel_ebi_dev *ebid, | 288 | static void sama5_ebi_apply_config(struct atmel_ebi_dev *ebid, |
288 | struct atmel_ebi_dev_config *conf) | 289 | struct atmel_ebi_dev_config *conf) |
289 | { | 290 | { |
290 | atmel_hsmc_cs_conf_apply(ebid->ebi->smc.regmap, conf->cs, | 291 | atmel_hsmc_cs_conf_apply(ebid->ebi->smc.regmap, ebid->ebi->smc.layout, |
291 | &conf->smcconf); | 292 | conf->cs, &conf->smcconf); |
292 | } | 293 | } |
293 | 294 | ||
294 | static int atmel_ebi_dev_setup(struct atmel_ebi *ebi, struct device_node *np, | 295 | static int atmel_ebi_dev_setup(struct atmel_ebi *ebi, struct device_node *np, |
@@ -527,6 +528,10 @@ static int atmel_ebi_probe(struct platform_device *pdev) | |||
527 | if (IS_ERR(ebi->smc.regmap)) | 528 | if (IS_ERR(ebi->smc.regmap)) |
528 | return PTR_ERR(ebi->smc.regmap); | 529 | return PTR_ERR(ebi->smc.regmap); |
529 | 530 | ||
531 | ebi->smc.layout = atmel_hsmc_get_reg_layout(smc_np); | ||
532 | if (IS_ERR(ebi->smc.layout)) | ||
533 | return PTR_ERR(ebi->smc.layout); | ||
534 | |||
530 | ebi->smc.clk = of_clk_get(smc_np, 0); | 535 | ebi->smc.clk = of_clk_get(smc_np, 0); |
531 | if (IS_ERR(ebi->smc.clk)) { | 536 | if (IS_ERR(ebi->smc.clk)) { |
532 | if (PTR_ERR(ebi->smc.clk) != -ENOENT) | 537 | if (PTR_ERR(ebi->smc.clk) != -ENOENT) |
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig index 94ad2c1c3d90..fc5e4fef89d2 100644 --- a/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig | |||
@@ -133,6 +133,20 @@ config MFD_BCM590XX | |||
133 | help | 133 | help |
134 | Support for the BCM590xx PMUs from Broadcom | 134 | Support for the BCM590xx PMUs from Broadcom |
135 | 135 | ||
136 | config MFD_BD9571MWV | ||
137 | tristate "ROHM BD9571MWV PMIC" | ||
138 | select MFD_CORE | ||
139 | select REGMAP_I2C | ||
140 | select REGMAP_IRQ | ||
141 | depends on I2C | ||
142 | help | ||
143 | Support for the ROHM BD9571MWV PMIC, which contains single | ||
144 | voltage regulator, voltage sampling units, GPIO block and | ||
145 | watchdog block. | ||
146 | |||
147 | This driver can also be built as a module. If so, the module | ||
148 | will be called bd9571mwv. | ||
149 | |||
136 | config MFD_AC100 | 150 | config MFD_AC100 |
137 | tristate "X-Powers AC100" | 151 | tristate "X-Powers AC100" |
138 | select MFD_CORE | 152 | select MFD_CORE |
@@ -453,12 +467,12 @@ config LPC_SCH | |||
453 | 467 | ||
454 | config INTEL_SOC_PMIC | 468 | config INTEL_SOC_PMIC |
455 | bool "Support for Crystal Cove PMIC" | 469 | bool "Support for Crystal Cove PMIC" |
456 | depends on HAS_IOMEM && I2C=y && GPIOLIB && COMMON_CLK | 470 | depends on ACPI && HAS_IOMEM && I2C=y && GPIOLIB && COMMON_CLK |
457 | depends on X86 || COMPILE_TEST | 471 | depends on X86 || COMPILE_TEST |
458 | select MFD_CORE | 472 | select MFD_CORE |
459 | select REGMAP_I2C | 473 | select REGMAP_I2C |
460 | select REGMAP_IRQ | 474 | select REGMAP_IRQ |
461 | select I2C_DESIGNWARE_PLATFORM if ACPI | 475 | select I2C_DESIGNWARE_PLATFORM |
462 | help | 476 | help |
463 | Select this option to enable support for Crystal Cove PMIC | 477 | Select this option to enable support for Crystal Cove PMIC |
464 | on some Intel SoC systems. The PMIC provides ADC, GPIO, | 478 | on some Intel SoC systems. The PMIC provides ADC, GPIO, |
@@ -481,7 +495,7 @@ config INTEL_SOC_PMIC_BXTWC | |||
481 | on these systems. | 495 | on these systems. |
482 | 496 | ||
483 | config INTEL_SOC_PMIC_CHTWC | 497 | config INTEL_SOC_PMIC_CHTWC |
484 | tristate "Support for Intel Cherry Trail Whiskey Cove PMIC" | 498 | bool "Support for Intel Cherry Trail Whiskey Cove PMIC" |
485 | depends on ACPI && HAS_IOMEM && I2C=y && COMMON_CLK | 499 | depends on ACPI && HAS_IOMEM && I2C=y && COMMON_CLK |
486 | depends on X86 || COMPILE_TEST | 500 | depends on X86 || COMPILE_TEST |
487 | select MFD_CORE | 501 | select MFD_CORE |
@@ -951,13 +965,13 @@ config MFD_RC5T583 | |||
951 | different functionality of the device. | 965 | different functionality of the device. |
952 | 966 | ||
953 | config MFD_RK808 | 967 | config MFD_RK808 |
954 | tristate "Rockchip RK808/RK818 Power Management Chip" | 968 | tristate "Rockchip RK805/RK808/RK818 Power Management Chip" |
955 | depends on I2C && OF | 969 | depends on I2C && OF |
956 | select MFD_CORE | 970 | select MFD_CORE |
957 | select REGMAP_I2C | 971 | select REGMAP_I2C |
958 | select REGMAP_IRQ | 972 | select REGMAP_IRQ |
959 | help | 973 | help |
960 | If you say yes here you get support for the RK808 and RK818 | 974 | If you say yes here you get support for the RK805, RK808 and RK818 |
961 | Power Management chips. | 975 | Power Management chips. |
962 | This driver provides common support for accessing the device | 976 | This driver provides common support for accessing the device |
963 | through I2C interface. The device supports multiple sub-devices | 977 | through I2C interface. The device supports multiple sub-devices |
@@ -1294,6 +1308,7 @@ config TPS6507X | |||
1294 | 1308 | ||
1295 | config MFD_TPS65086 | 1309 | config MFD_TPS65086 |
1296 | tristate "TI TPS65086 Power Management Integrated Chips (PMICs)" | 1310 | tristate "TI TPS65086 Power Management Integrated Chips (PMICs)" |
1311 | select MFD_CORE | ||
1297 | select REGMAP | 1312 | select REGMAP |
1298 | select REGMAP_IRQ | 1313 | select REGMAP_IRQ |
1299 | select REGMAP_I2C | 1314 | select REGMAP_I2C |
@@ -1337,6 +1352,24 @@ config MFD_TPS65217 | |||
1337 | This driver can also be built as a module. If so, the module | 1352 | This driver can also be built as a module. If so, the module |
1338 | will be called tps65217. | 1353 | will be called tps65217. |
1339 | 1354 | ||
1355 | config MFD_TPS68470 | ||
1356 | bool "TI TPS68470 Power Management / LED chips" | ||
1357 | depends on ACPI && I2C=y | ||
1358 | select MFD_CORE | ||
1359 | select REGMAP_I2C | ||
1360 | select I2C_DESIGNWARE_PLATFORM | ||
1361 | help | ||
1362 | If you say yes here you get support for the TPS68470 series of | ||
1363 | Power Management / LED chips. | ||
1364 | |||
1365 | These include voltage regulators, LEDs and other features | ||
1366 | that are often used in portable devices. | ||
1367 | |||
1368 | This option is a bool as it provides an ACPI operation | ||
1369 | region, which must be available before any of the devices | ||
1370 | using this are probed. This option also configures the | ||
1371 | designware-i2c driver to be built-in, for the same reason. | ||
1372 | |||
1340 | config MFD_TI_LP873X | 1373 | config MFD_TI_LP873X |
1341 | tristate "TI LP873X Power Management IC" | 1374 | tristate "TI LP873X Power Management IC" |
1342 | depends on I2C | 1375 | depends on I2C |
@@ -1723,6 +1756,20 @@ config MFD_STW481X | |||
1723 | in various ST Microelectronics and ST-Ericsson embedded | 1756 | in various ST Microelectronics and ST-Ericsson embedded |
1724 | Nomadik series. | 1757 | Nomadik series. |
1725 | 1758 | ||
1759 | config MFD_STM32_LPTIMER | ||
1760 | tristate "Support for STM32 Low-Power Timer" | ||
1761 | depends on (ARCH_STM32 && OF) || COMPILE_TEST | ||
1762 | select MFD_CORE | ||
1763 | select REGMAP | ||
1764 | select REGMAP_MMIO | ||
1765 | help | ||
1766 | Select this option to enable STM32 Low-Power Timer driver | ||
1767 | used for PWM, IIO Trigger, IIO Encoder and Counter. Shared | ||
1768 | resources are also dealt with here. | ||
1769 | |||
1770 | To compile this driver as a module, choose M here: the | ||
1771 | module will be called stm32-lptimer. | ||
1772 | |||
1726 | config MFD_STM32_TIMERS | 1773 | config MFD_STM32_TIMERS |
1727 | tristate "Support for STM32 Timers" | 1774 | tristate "Support for STM32 Timers" |
1728 | depends on (ARCH_STM32 && OF) || COMPILE_TEST | 1775 | depends on (ARCH_STM32 && OF) || COMPILE_TEST |
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile index 080793b3fd0e..c3d0a1b39bb6 100644 --- a/drivers/mfd/Makefile +++ b/drivers/mfd/Makefile | |||
@@ -10,6 +10,7 @@ obj-$(CONFIG_MFD_ACT8945A) += act8945a.o | |||
10 | obj-$(CONFIG_MFD_SM501) += sm501.o | 10 | obj-$(CONFIG_MFD_SM501) += sm501.o |
11 | obj-$(CONFIG_MFD_ASIC3) += asic3.o tmio_core.o | 11 | obj-$(CONFIG_MFD_ASIC3) += asic3.o tmio_core.o |
12 | obj-$(CONFIG_MFD_BCM590XX) += bcm590xx.o | 12 | obj-$(CONFIG_MFD_BCM590XX) += bcm590xx.o |
13 | obj-$(CONFIG_MFD_BD9571MWV) += bd9571mwv.o | ||
13 | cros_ec_core-objs := cros_ec.o | 14 | cros_ec_core-objs := cros_ec.o |
14 | cros_ec_core-$(CONFIG_ACPI) += cros_ec_acpi_gpe.o | 15 | cros_ec_core-$(CONFIG_ACPI) += cros_ec_acpi_gpe.o |
15 | obj-$(CONFIG_MFD_CROS_EC) += cros_ec_core.o | 16 | obj-$(CONFIG_MFD_CROS_EC) += cros_ec_core.o |
@@ -83,6 +84,7 @@ obj-$(CONFIG_MFD_TPS65910) += tps65910.o | |||
83 | obj-$(CONFIG_MFD_TPS65912) += tps65912-core.o | 84 | obj-$(CONFIG_MFD_TPS65912) += tps65912-core.o |
84 | obj-$(CONFIG_MFD_TPS65912_I2C) += tps65912-i2c.o | 85 | obj-$(CONFIG_MFD_TPS65912_I2C) += tps65912-i2c.o |
85 | obj-$(CONFIG_MFD_TPS65912_SPI) += tps65912-spi.o | 86 | obj-$(CONFIG_MFD_TPS65912_SPI) += tps65912-spi.o |
87 | obj-$(CONFIG_MFD_TPS68470) += tps68470.o | ||
86 | obj-$(CONFIG_MFD_TPS80031) += tps80031.o | 88 | obj-$(CONFIG_MFD_TPS80031) += tps80031.o |
87 | obj-$(CONFIG_MENELAUS) += menelaus.o | 89 | obj-$(CONFIG_MENELAUS) += menelaus.o |
88 | 90 | ||
@@ -221,5 +223,6 @@ obj-$(CONFIG_MFD_MT6397) += mt6397-core.o | |||
221 | obj-$(CONFIG_MFD_ALTERA_A10SR) += altera-a10sr.o | 223 | obj-$(CONFIG_MFD_ALTERA_A10SR) += altera-a10sr.o |
222 | obj-$(CONFIG_MFD_SUN4I_GPADC) += sun4i-gpadc.o | 224 | obj-$(CONFIG_MFD_SUN4I_GPADC) += sun4i-gpadc.o |
223 | 225 | ||
226 | obj-$(CONFIG_MFD_STM32_LPTIMER) += stm32-lptimer.o | ||
224 | obj-$(CONFIG_MFD_STM32_TIMERS) += stm32-timers.o | 227 | obj-$(CONFIG_MFD_STM32_TIMERS) += stm32-timers.o |
225 | obj-$(CONFIG_MFD_MXS_LRADC) += mxs-lradc.o | 228 | obj-$(CONFIG_MFD_MXS_LRADC) += mxs-lradc.o |
diff --git a/drivers/mfd/ab8500-core.c b/drivers/mfd/ab8500-core.c index 8511c068a610..30d09d177171 100644 --- a/drivers/mfd/ab8500-core.c +++ b/drivers/mfd/ab8500-core.c | |||
@@ -1059,15 +1059,15 @@ static struct attribute *ab9540_sysfs_entries[] = { | |||
1059 | NULL, | 1059 | NULL, |
1060 | }; | 1060 | }; |
1061 | 1061 | ||
1062 | static struct attribute_group ab8500_attr_group = { | 1062 | static const struct attribute_group ab8500_attr_group = { |
1063 | .attrs = ab8500_sysfs_entries, | 1063 | .attrs = ab8500_sysfs_entries, |
1064 | }; | 1064 | }; |
1065 | 1065 | ||
1066 | static struct attribute_group ab8505_attr_group = { | 1066 | static const struct attribute_group ab8505_attr_group = { |
1067 | .attrs = ab8505_sysfs_entries, | 1067 | .attrs = ab8505_sysfs_entries, |
1068 | }; | 1068 | }; |
1069 | 1069 | ||
1070 | static struct attribute_group ab9540_attr_group = { | 1070 | static const struct attribute_group ab9540_attr_group = { |
1071 | .attrs = ab9540_sysfs_entries, | 1071 | .attrs = ab9540_sysfs_entries, |
1072 | }; | 1072 | }; |
1073 | 1073 | ||
diff --git a/drivers/mfd/atmel-smc.c b/drivers/mfd/atmel-smc.c index 20cc0ea470fa..7d77948567d7 100644 --- a/drivers/mfd/atmel-smc.c +++ b/drivers/mfd/atmel-smc.c | |||
@@ -258,19 +258,21 @@ EXPORT_SYMBOL_GPL(atmel_smc_cs_conf_apply); | |||
258 | * atmel_hsmc_cs_conf_apply - apply an SMC CS conf | 258 | * atmel_hsmc_cs_conf_apply - apply an SMC CS conf |
259 | * @regmap: the HSMC regmap | 259 | * @regmap: the HSMC regmap |
260 | * @cs: the CS id | 260 | * @cs: the CS id |
261 | * @layout: the layout of registers | ||
261 | * @conf the SMC CS conf to apply | 262 | * @conf the SMC CS conf to apply |
262 | * | 263 | * |
263 | * Applies an SMC CS configuration. | 264 | * Applies an SMC CS configuration. |
264 | * Only valid on post-sama5 SoCs. | 265 | * Only valid on post-sama5 SoCs. |
265 | */ | 266 | */ |
266 | void atmel_hsmc_cs_conf_apply(struct regmap *regmap, int cs, | 267 | void atmel_hsmc_cs_conf_apply(struct regmap *regmap, |
267 | const struct atmel_smc_cs_conf *conf) | 268 | const struct atmel_hsmc_reg_layout *layout, |
269 | int cs, const struct atmel_smc_cs_conf *conf) | ||
268 | { | 270 | { |
269 | regmap_write(regmap, ATMEL_HSMC_SETUP(cs), conf->setup); | 271 | regmap_write(regmap, ATMEL_HSMC_SETUP(layout, cs), conf->setup); |
270 | regmap_write(regmap, ATMEL_HSMC_PULSE(cs), conf->pulse); | 272 | regmap_write(regmap, ATMEL_HSMC_PULSE(layout, cs), conf->pulse); |
271 | regmap_write(regmap, ATMEL_HSMC_CYCLE(cs), conf->cycle); | 273 | regmap_write(regmap, ATMEL_HSMC_CYCLE(layout, cs), conf->cycle); |
272 | regmap_write(regmap, ATMEL_HSMC_TIMINGS(cs), conf->timings); | 274 | regmap_write(regmap, ATMEL_HSMC_TIMINGS(layout, cs), conf->timings); |
273 | regmap_write(regmap, ATMEL_HSMC_MODE(cs), conf->mode); | 275 | regmap_write(regmap, ATMEL_HSMC_MODE(layout, cs), conf->mode); |
274 | } | 276 | } |
275 | EXPORT_SYMBOL_GPL(atmel_hsmc_cs_conf_apply); | 277 | EXPORT_SYMBOL_GPL(atmel_hsmc_cs_conf_apply); |
276 | 278 | ||
@@ -297,18 +299,55 @@ EXPORT_SYMBOL_GPL(atmel_smc_cs_conf_get); | |||
297 | * atmel_hsmc_cs_conf_get - retrieve the current SMC CS conf | 299 | * atmel_hsmc_cs_conf_get - retrieve the current SMC CS conf |
298 | * @regmap: the HSMC regmap | 300 | * @regmap: the HSMC regmap |
299 | * @cs: the CS id | 301 | * @cs: the CS id |
302 | * @layout: the layout of registers | ||
300 | * @conf: the SMC CS conf object to store the current conf | 303 | * @conf: the SMC CS conf object to store the current conf |
301 | * | 304 | * |
302 | * Retrieve the SMC CS configuration. | 305 | * Retrieve the SMC CS configuration. |
303 | * Only valid on post-sama5 SoCs. | 306 | * Only valid on post-sama5 SoCs. |
304 | */ | 307 | */ |
305 | void atmel_hsmc_cs_conf_get(struct regmap *regmap, int cs, | 308 | void atmel_hsmc_cs_conf_get(struct regmap *regmap, |
306 | struct atmel_smc_cs_conf *conf) | 309 | const struct atmel_hsmc_reg_layout *layout, |
310 | int cs, struct atmel_smc_cs_conf *conf) | ||
307 | { | 311 | { |
308 | regmap_read(regmap, ATMEL_HSMC_SETUP(cs), &conf->setup); | 312 | regmap_read(regmap, ATMEL_HSMC_SETUP(layout, cs), &conf->setup); |
309 | regmap_read(regmap, ATMEL_HSMC_PULSE(cs), &conf->pulse); | 313 | regmap_read(regmap, ATMEL_HSMC_PULSE(layout, cs), &conf->pulse); |
310 | regmap_read(regmap, ATMEL_HSMC_CYCLE(cs), &conf->cycle); | 314 | regmap_read(regmap, ATMEL_HSMC_CYCLE(layout, cs), &conf->cycle); |
311 | regmap_read(regmap, ATMEL_HSMC_TIMINGS(cs), &conf->timings); | 315 | regmap_read(regmap, ATMEL_HSMC_TIMINGS(layout, cs), &conf->timings); |
312 | regmap_read(regmap, ATMEL_HSMC_MODE(cs), &conf->mode); | 316 | regmap_read(regmap, ATMEL_HSMC_MODE(layout, cs), &conf->mode); |
313 | } | 317 | } |
314 | EXPORT_SYMBOL_GPL(atmel_hsmc_cs_conf_get); | 318 | EXPORT_SYMBOL_GPL(atmel_hsmc_cs_conf_get); |
319 | |||
320 | static const struct atmel_hsmc_reg_layout sama5d3_reg_layout = { | ||
321 | .timing_regs_offset = 0x600, | ||
322 | }; | ||
323 | |||
324 | static const struct atmel_hsmc_reg_layout sama5d2_reg_layout = { | ||
325 | .timing_regs_offset = 0x700, | ||
326 | }; | ||
327 | |||
328 | static const struct of_device_id atmel_smc_ids[] = { | ||
329 | { .compatible = "atmel,at91sam9260-smc", .data = NULL }, | ||
330 | { .compatible = "atmel,sama5d3-smc", .data = &sama5d3_reg_layout }, | ||
331 | { .compatible = "atmel,sama5d2-smc", .data = &sama5d2_reg_layout }, | ||
332 | { /* sentinel */ }, | ||
333 | }; | ||
334 | |||
335 | /** | ||
336 | * atmel_hsmc_get_reg_layout - retrieve the layout of HSMC registers | ||
337 | * @np: the HSMC regmap | ||
338 | * | ||
339 | * Retrieve the layout of HSMC registers. | ||
340 | * | ||
341 | * Returns NULL in case of SMC, a struct atmel_hsmc_reg_layout pointer | ||
342 | * in HSMC case, otherwise ERR_PTR(-EINVAL). | ||
343 | */ | ||
344 | const struct atmel_hsmc_reg_layout * | ||
345 | atmel_hsmc_get_reg_layout(struct device_node *np) | ||
346 | { | ||
347 | const struct of_device_id *match; | ||
348 | |||
349 | match = of_match_node(atmel_smc_ids, np); | ||
350 | |||
351 | return match ? match->data : ERR_PTR(-EINVAL); | ||
352 | } | ||
353 | EXPORT_SYMBOL_GPL(atmel_hsmc_get_reg_layout); | ||
diff --git a/drivers/mfd/axp20x-rsb.c b/drivers/mfd/axp20x-rsb.c index fd5c7267b136..7ddbd9e8dd03 100644 --- a/drivers/mfd/axp20x-rsb.c +++ b/drivers/mfd/axp20x-rsb.c | |||
@@ -64,6 +64,7 @@ static const struct of_device_id axp20x_rsb_of_match[] = { | |||
64 | { .compatible = "x-powers,axp803", .data = (void *)AXP803_ID }, | 64 | { .compatible = "x-powers,axp803", .data = (void *)AXP803_ID }, |
65 | { .compatible = "x-powers,axp806", .data = (void *)AXP806_ID }, | 65 | { .compatible = "x-powers,axp806", .data = (void *)AXP806_ID }, |
66 | { .compatible = "x-powers,axp809", .data = (void *)AXP809_ID }, | 66 | { .compatible = "x-powers,axp809", .data = (void *)AXP809_ID }, |
67 | { .compatible = "x-powers,axp813", .data = (void *)AXP813_ID }, | ||
67 | { }, | 68 | { }, |
68 | }; | 69 | }; |
69 | MODULE_DEVICE_TABLE(of, axp20x_rsb_of_match); | 70 | MODULE_DEVICE_TABLE(of, axp20x_rsb_of_match); |
diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c index 917b6ddc4f15..336de66ca408 100644 --- a/drivers/mfd/axp20x.c +++ b/drivers/mfd/axp20x.c | |||
@@ -44,6 +44,7 @@ static const char * const axp20x_model_names[] = { | |||
44 | "AXP803", | 44 | "AXP803", |
45 | "AXP806", | 45 | "AXP806", |
46 | "AXP809", | 46 | "AXP809", |
47 | "AXP813", | ||
47 | }; | 48 | }; |
48 | 49 | ||
49 | static const struct regmap_range axp152_writeable_ranges[] = { | 50 | static const struct regmap_range axp152_writeable_ranges[] = { |
@@ -676,7 +677,7 @@ static struct mfd_cell axp20x_cells[] = { | |||
676 | 677 | ||
677 | static struct mfd_cell axp221_cells[] = { | 678 | static struct mfd_cell axp221_cells[] = { |
678 | { | 679 | { |
679 | .name = "axp20x-pek", | 680 | .name = "axp221-pek", |
680 | .num_resources = ARRAY_SIZE(axp22x_pek_resources), | 681 | .num_resources = ARRAY_SIZE(axp22x_pek_resources), |
681 | .resources = axp22x_pek_resources, | 682 | .resources = axp22x_pek_resources, |
682 | }, { | 683 | }, { |
@@ -701,7 +702,7 @@ static struct mfd_cell axp221_cells[] = { | |||
701 | 702 | ||
702 | static struct mfd_cell axp223_cells[] = { | 703 | static struct mfd_cell axp223_cells[] = { |
703 | { | 704 | { |
704 | .name = "axp20x-pek", | 705 | .name = "axp221-pek", |
705 | .num_resources = ARRAY_SIZE(axp22x_pek_resources), | 706 | .num_resources = ARRAY_SIZE(axp22x_pek_resources), |
706 | .resources = axp22x_pek_resources, | 707 | .resources = axp22x_pek_resources, |
707 | }, { | 708 | }, { |
@@ -834,7 +835,7 @@ static struct mfd_cell axp288_cells[] = { | |||
834 | .resources = axp288_fuel_gauge_resources, | 835 | .resources = axp288_fuel_gauge_resources, |
835 | }, | 836 | }, |
836 | { | 837 | { |
837 | .name = "axp20x-pek", | 838 | .name = "axp221-pek", |
838 | .num_resources = ARRAY_SIZE(axp288_power_button_resources), | 839 | .num_resources = ARRAY_SIZE(axp288_power_button_resources), |
839 | .resources = axp288_power_button_resources, | 840 | .resources = axp288_power_button_resources, |
840 | }, | 841 | }, |
@@ -845,7 +846,7 @@ static struct mfd_cell axp288_cells[] = { | |||
845 | 846 | ||
846 | static struct mfd_cell axp803_cells[] = { | 847 | static struct mfd_cell axp803_cells[] = { |
847 | { | 848 | { |
848 | .name = "axp20x-pek", | 849 | .name = "axp221-pek", |
849 | .num_resources = ARRAY_SIZE(axp803_pek_resources), | 850 | .num_resources = ARRAY_SIZE(axp803_pek_resources), |
850 | .resources = axp803_pek_resources, | 851 | .resources = axp803_pek_resources, |
851 | }, | 852 | }, |
@@ -861,7 +862,7 @@ static struct mfd_cell axp806_cells[] = { | |||
861 | 862 | ||
862 | static struct mfd_cell axp809_cells[] = { | 863 | static struct mfd_cell axp809_cells[] = { |
863 | { | 864 | { |
864 | .name = "axp20x-pek", | 865 | .name = "axp221-pek", |
865 | .num_resources = ARRAY_SIZE(axp809_pek_resources), | 866 | .num_resources = ARRAY_SIZE(axp809_pek_resources), |
866 | .resources = axp809_pek_resources, | 867 | .resources = axp809_pek_resources, |
867 | }, { | 868 | }, { |
@@ -870,6 +871,14 @@ static struct mfd_cell axp809_cells[] = { | |||
870 | }, | 871 | }, |
871 | }; | 872 | }; |
872 | 873 | ||
874 | static struct mfd_cell axp813_cells[] = { | ||
875 | { | ||
876 | .name = "axp221-pek", | ||
877 | .num_resources = ARRAY_SIZE(axp803_pek_resources), | ||
878 | .resources = axp803_pek_resources, | ||
879 | } | ||
880 | }; | ||
881 | |||
873 | static struct axp20x_dev *axp20x_pm_power_off; | 882 | static struct axp20x_dev *axp20x_pm_power_off; |
874 | static void axp20x_power_off(void) | 883 | static void axp20x_power_off(void) |
875 | { | 884 | { |
@@ -956,6 +965,19 @@ int axp20x_match_device(struct axp20x_dev *axp20x) | |||
956 | axp20x->regmap_cfg = &axp22x_regmap_config; | 965 | axp20x->regmap_cfg = &axp22x_regmap_config; |
957 | axp20x->regmap_irq_chip = &axp809_regmap_irq_chip; | 966 | axp20x->regmap_irq_chip = &axp809_regmap_irq_chip; |
958 | break; | 967 | break; |
968 | case AXP813_ID: | ||
969 | axp20x->nr_cells = ARRAY_SIZE(axp813_cells); | ||
970 | axp20x->cells = axp813_cells; | ||
971 | axp20x->regmap_cfg = &axp288_regmap_config; | ||
972 | /* | ||
973 | * The IRQ table given in the datasheet is incorrect. | ||
974 | * In IRQ enable/status registers 1, there are separate | ||
975 | * IRQs for ACIN and VBUS, instead of bits [7:5] being | ||
976 | * the same as bits [4:2]. So it shares the same IRQs | ||
977 | * as the AXP803, rather than the AXP288. | ||
978 | */ | ||
979 | axp20x->regmap_irq_chip = &axp803_regmap_irq_chip; | ||
980 | break; | ||
959 | default: | 981 | default: |
960 | dev_err(dev, "unsupported AXP20X ID %lu\n", axp20x->variant); | 982 | dev_err(dev, "unsupported AXP20X ID %lu\n", axp20x->variant); |
961 | return -EINVAL; | 983 | return -EINVAL; |
diff --git a/drivers/mfd/bd9571mwv.c b/drivers/mfd/bd9571mwv.c new file mode 100644 index 000000000000..64e088dfe7b0 --- /dev/null +++ b/drivers/mfd/bd9571mwv.c | |||
@@ -0,0 +1,230 @@ | |||
1 | /* | ||
2 | * ROHM BD9571MWV-M MFD driver | ||
3 | * | ||
4 | * Copyright (C) 2017 Marek Vasut <marek.vasut+renesas@gmail.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | * This program is distributed "as is" WITHOUT ANY WARRANTY of any | ||
11 | * kind, whether expressed or implied; without even the implied warranty | ||
12 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License version 2 for more details. | ||
14 | * | ||
15 | * Based on the TPS65086 driver | ||
16 | */ | ||
17 | |||
18 | #include <linux/i2c.h> | ||
19 | #include <linux/interrupt.h> | ||
20 | #include <linux/mfd/core.h> | ||
21 | #include <linux/module.h> | ||
22 | |||
23 | #include <linux/mfd/bd9571mwv.h> | ||
24 | |||
25 | static const struct mfd_cell bd9571mwv_cells[] = { | ||
26 | { .name = "bd9571mwv-regulator", }, | ||
27 | { .name = "bd9571mwv-gpio", }, | ||
28 | }; | ||
29 | |||
30 | static const struct regmap_range bd9571mwv_readable_yes_ranges[] = { | ||
31 | regmap_reg_range(BD9571MWV_VENDOR_CODE, BD9571MWV_PRODUCT_REVISION), | ||
32 | regmap_reg_range(BD9571MWV_AVS_SET_MONI, BD9571MWV_AVS_DVFS_VID(3)), | ||
33 | regmap_reg_range(BD9571MWV_VD18_VID, BD9571MWV_VD33_VID), | ||
34 | regmap_reg_range(BD9571MWV_DVFS_VINIT, BD9571MWV_DVFS_VINIT), | ||
35 | regmap_reg_range(BD9571MWV_DVFS_SETVMAX, BD9571MWV_DVFS_MONIVDAC), | ||
36 | regmap_reg_range(BD9571MWV_GPIO_IN, BD9571MWV_GPIO_IN), | ||
37 | regmap_reg_range(BD9571MWV_GPIO_INT, BD9571MWV_GPIO_INTMASK), | ||
38 | regmap_reg_range(BD9571MWV_INT_INTREQ, BD9571MWV_INT_INTMASK), | ||
39 | }; | ||
40 | |||
41 | static const struct regmap_access_table bd9571mwv_readable_table = { | ||
42 | .yes_ranges = bd9571mwv_readable_yes_ranges, | ||
43 | .n_yes_ranges = ARRAY_SIZE(bd9571mwv_readable_yes_ranges), | ||
44 | }; | ||
45 | |||
46 | static const struct regmap_range bd9571mwv_writable_yes_ranges[] = { | ||
47 | regmap_reg_range(BD9571MWV_AVS_VD09_VID(0), BD9571MWV_AVS_VD09_VID(3)), | ||
48 | regmap_reg_range(BD9571MWV_DVFS_SETVID, BD9571MWV_DVFS_SETVID), | ||
49 | regmap_reg_range(BD9571MWV_GPIO_DIR, BD9571MWV_GPIO_OUT), | ||
50 | regmap_reg_range(BD9571MWV_GPIO_INT_SET, BD9571MWV_GPIO_INTMASK), | ||
51 | regmap_reg_range(BD9571MWV_INT_INTREQ, BD9571MWV_INT_INTMASK), | ||
52 | }; | ||
53 | |||
54 | static const struct regmap_access_table bd9571mwv_writable_table = { | ||
55 | .yes_ranges = bd9571mwv_writable_yes_ranges, | ||
56 | .n_yes_ranges = ARRAY_SIZE(bd9571mwv_writable_yes_ranges), | ||
57 | }; | ||
58 | |||
59 | static const struct regmap_range bd9571mwv_volatile_yes_ranges[] = { | ||
60 | regmap_reg_range(BD9571MWV_GPIO_IN, BD9571MWV_GPIO_IN), | ||
61 | regmap_reg_range(BD9571MWV_GPIO_INT, BD9571MWV_GPIO_INT), | ||
62 | regmap_reg_range(BD9571MWV_INT_INTREQ, BD9571MWV_INT_INTREQ), | ||
63 | }; | ||
64 | |||
65 | static const struct regmap_access_table bd9571mwv_volatile_table = { | ||
66 | .yes_ranges = bd9571mwv_volatile_yes_ranges, | ||
67 | .n_yes_ranges = ARRAY_SIZE(bd9571mwv_volatile_yes_ranges), | ||
68 | }; | ||
69 | |||
70 | static const struct regmap_config bd9571mwv_regmap_config = { | ||
71 | .reg_bits = 8, | ||
72 | .val_bits = 8, | ||
73 | .cache_type = REGCACHE_RBTREE, | ||
74 | .rd_table = &bd9571mwv_readable_table, | ||
75 | .wr_table = &bd9571mwv_writable_table, | ||
76 | .volatile_table = &bd9571mwv_volatile_table, | ||
77 | .max_register = 0xff, | ||
78 | }; | ||
79 | |||
80 | static const struct regmap_irq bd9571mwv_irqs[] = { | ||
81 | REGMAP_IRQ_REG(BD9571MWV_IRQ_MD1, 0, | ||
82 | BD9571MWV_INT_INTREQ_MD1_INT), | ||
83 | REGMAP_IRQ_REG(BD9571MWV_IRQ_MD2_E1, 0, | ||
84 | BD9571MWV_INT_INTREQ_MD2_E1_INT), | ||
85 | REGMAP_IRQ_REG(BD9571MWV_IRQ_MD2_E2, 0, | ||
86 | BD9571MWV_INT_INTREQ_MD2_E2_INT), | ||
87 | REGMAP_IRQ_REG(BD9571MWV_IRQ_PROT_ERR, 0, | ||
88 | BD9571MWV_INT_INTREQ_PROT_ERR_INT), | ||
89 | REGMAP_IRQ_REG(BD9571MWV_IRQ_GP, 0, | ||
90 | BD9571MWV_INT_INTREQ_GP_INT), | ||
91 | REGMAP_IRQ_REG(BD9571MWV_IRQ_128H_OF, 0, | ||
92 | BD9571MWV_INT_INTREQ_128H_OF_INT), | ||
93 | REGMAP_IRQ_REG(BD9571MWV_IRQ_WDT_OF, 0, | ||
94 | BD9571MWV_INT_INTREQ_WDT_OF_INT), | ||
95 | REGMAP_IRQ_REG(BD9571MWV_IRQ_BKUP_TRG, 0, | ||
96 | BD9571MWV_INT_INTREQ_BKUP_TRG_INT), | ||
97 | }; | ||
98 | |||
99 | static struct regmap_irq_chip bd9571mwv_irq_chip = { | ||
100 | .name = "bd9571mwv", | ||
101 | .status_base = BD9571MWV_INT_INTREQ, | ||
102 | .mask_base = BD9571MWV_INT_INTMASK, | ||
103 | .ack_base = BD9571MWV_INT_INTREQ, | ||
104 | .init_ack_masked = true, | ||
105 | .num_regs = 1, | ||
106 | .irqs = bd9571mwv_irqs, | ||
107 | .num_irqs = ARRAY_SIZE(bd9571mwv_irqs), | ||
108 | }; | ||
109 | |||
110 | static int bd9571mwv_identify(struct bd9571mwv *bd) | ||
111 | { | ||
112 | struct device *dev = bd->dev; | ||
113 | unsigned int value; | ||
114 | int ret; | ||
115 | |||
116 | ret = regmap_read(bd->regmap, BD9571MWV_VENDOR_CODE, &value); | ||
117 | if (ret) { | ||
118 | dev_err(dev, "Failed to read vendor code register (ret=%i)\n", | ||
119 | ret); | ||
120 | return ret; | ||
121 | } | ||
122 | |||
123 | if (value != BD9571MWV_VENDOR_CODE_VAL) { | ||
124 | dev_err(dev, "Invalid vendor code ID %02x (expected %02x)\n", | ||
125 | value, BD9571MWV_VENDOR_CODE_VAL); | ||
126 | return -EINVAL; | ||
127 | } | ||
128 | |||
129 | ret = regmap_read(bd->regmap, BD9571MWV_PRODUCT_CODE, &value); | ||
130 | if (ret) { | ||
131 | dev_err(dev, "Failed to read product code register (ret=%i)\n", | ||
132 | ret); | ||
133 | return ret; | ||
134 | } | ||
135 | |||
136 | if (value != BD9571MWV_PRODUCT_CODE_VAL) { | ||
137 | dev_err(dev, "Invalid product code ID %02x (expected %02x)\n", | ||
138 | value, BD9571MWV_PRODUCT_CODE_VAL); | ||
139 | return -EINVAL; | ||
140 | } | ||
141 | |||
142 | ret = regmap_read(bd->regmap, BD9571MWV_PRODUCT_REVISION, &value); | ||
143 | if (ret) { | ||
144 | dev_err(dev, "Failed to read revision register (ret=%i)\n", | ||
145 | ret); | ||
146 | return ret; | ||
147 | } | ||
148 | |||
149 | dev_info(dev, "Device: BD9571MWV rev. %d\n", value & 0xff); | ||
150 | |||
151 | return 0; | ||
152 | } | ||
153 | |||
154 | static int bd9571mwv_probe(struct i2c_client *client, | ||
155 | const struct i2c_device_id *ids) | ||
156 | { | ||
157 | struct bd9571mwv *bd; | ||
158 | int ret; | ||
159 | |||
160 | bd = devm_kzalloc(&client->dev, sizeof(*bd), GFP_KERNEL); | ||
161 | if (!bd) | ||
162 | return -ENOMEM; | ||
163 | |||
164 | i2c_set_clientdata(client, bd); | ||
165 | bd->dev = &client->dev; | ||
166 | bd->irq = client->irq; | ||
167 | |||
168 | bd->regmap = devm_regmap_init_i2c(client, &bd9571mwv_regmap_config); | ||
169 | if (IS_ERR(bd->regmap)) { | ||
170 | dev_err(bd->dev, "Failed to initialize register map\n"); | ||
171 | return PTR_ERR(bd->regmap); | ||
172 | } | ||
173 | |||
174 | ret = bd9571mwv_identify(bd); | ||
175 | if (ret) | ||
176 | return ret; | ||
177 | |||
178 | ret = regmap_add_irq_chip(bd->regmap, bd->irq, IRQF_ONESHOT, 0, | ||
179 | &bd9571mwv_irq_chip, &bd->irq_data); | ||
180 | if (ret) { | ||
181 | dev_err(bd->dev, "Failed to register IRQ chip\n"); | ||
182 | return ret; | ||
183 | } | ||
184 | |||
185 | ret = mfd_add_devices(bd->dev, PLATFORM_DEVID_AUTO, bd9571mwv_cells, | ||
186 | ARRAY_SIZE(bd9571mwv_cells), NULL, 0, | ||
187 | regmap_irq_get_domain(bd->irq_data)); | ||
188 | if (ret) { | ||
189 | regmap_del_irq_chip(bd->irq, bd->irq_data); | ||
190 | return ret; | ||
191 | } | ||
192 | |||
193 | return 0; | ||
194 | } | ||
195 | |||
196 | static int bd9571mwv_remove(struct i2c_client *client) | ||
197 | { | ||
198 | struct bd9571mwv *bd = i2c_get_clientdata(client); | ||
199 | |||
200 | regmap_del_irq_chip(bd->irq, bd->irq_data); | ||
201 | |||
202 | return 0; | ||
203 | } | ||
204 | |||
205 | static const struct of_device_id bd9571mwv_of_match_table[] = { | ||
206 | { .compatible = "rohm,bd9571mwv", }, | ||
207 | { /* sentinel */ } | ||
208 | }; | ||
209 | MODULE_DEVICE_TABLE(of, bd9571mwv_of_match_table); | ||
210 | |||
211 | static const struct i2c_device_id bd9571mwv_id_table[] = { | ||
212 | { "bd9571mwv", 0 }, | ||
213 | { /* sentinel */ } | ||
214 | }; | ||
215 | MODULE_DEVICE_TABLE(i2c, bd9571mwv_id_table); | ||
216 | |||
217 | static struct i2c_driver bd9571mwv_driver = { | ||
218 | .driver = { | ||
219 | .name = "bd9571mwv", | ||
220 | .of_match_table = bd9571mwv_of_match_table, | ||
221 | }, | ||
222 | .probe = bd9571mwv_probe, | ||
223 | .remove = bd9571mwv_remove, | ||
224 | .id_table = bd9571mwv_id_table, | ||
225 | }; | ||
226 | module_i2c_driver(bd9571mwv_driver); | ||
227 | |||
228 | MODULE_AUTHOR("Marek Vasut <marek.vasut+renesas@gmail.com>"); | ||
229 | MODULE_DESCRIPTION("BD9571MWV PMIC Driver"); | ||
230 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/mfd/da9052-core.c b/drivers/mfd/da9052-core.c index a23a3a1c7061..433add43a0a9 100644 --- a/drivers/mfd/da9052-core.c +++ b/drivers/mfd/da9052-core.c | |||
@@ -387,6 +387,8 @@ int da9052_adc_manual_read(struct da9052 *da9052, unsigned char channel) | |||
387 | 387 | ||
388 | mutex_lock(&da9052->auxadc_lock); | 388 | mutex_lock(&da9052->auxadc_lock); |
389 | 389 | ||
390 | reinit_completion(&da9052->done); | ||
391 | |||
390 | /* Channel gets activated on enabling the Conversion bit */ | 392 | /* Channel gets activated on enabling the Conversion bit */ |
391 | mux_sel = chan_mux[channel] | DA9052_ADC_MAN_MAN_CONV; | 393 | mux_sel = chan_mux[channel] | DA9052_ADC_MAN_MAN_CONV; |
392 | 394 | ||
diff --git a/drivers/mfd/da9052-spi.c b/drivers/mfd/da9052-spi.c index b9ea1b27db64..abfb11818fdc 100644 --- a/drivers/mfd/da9052-spi.c +++ b/drivers/mfd/da9052-spi.c | |||
@@ -67,7 +67,7 @@ static int da9052_spi_remove(struct spi_device *spi) | |||
67 | return 0; | 67 | return 0; |
68 | } | 68 | } |
69 | 69 | ||
70 | static struct spi_device_id da9052_spi_id[] = { | 70 | static const struct spi_device_id da9052_spi_id[] = { |
71 | {"da9052", DA9052}, | 71 | {"da9052", DA9052}, |
72 | {"da9053-aa", DA9053_AA}, | 72 | {"da9053-aa", DA9053_AA}, |
73 | {"da9053-ba", DA9053_BA}, | 73 | {"da9053-ba", DA9053_BA}, |
diff --git a/drivers/mfd/da9055-i2c.c b/drivers/mfd/da9055-i2c.c index b53e100f577c..8169a5c2fa20 100644 --- a/drivers/mfd/da9055-i2c.c +++ b/drivers/mfd/da9055-i2c.c | |||
@@ -62,7 +62,7 @@ static int da9055_i2c_remove(struct i2c_client *i2c) | |||
62 | * purposes separate). As a result there are specific DA9055 ids for PMIC | 62 | * purposes separate). As a result there are specific DA9055 ids for PMIC |
63 | * and CODEC, which must be different to operate together. | 63 | * and CODEC, which must be different to operate together. |
64 | */ | 64 | */ |
65 | static struct i2c_device_id da9055_i2c_id[] = { | 65 | static const struct i2c_device_id da9055_i2c_id[] = { |
66 | {"da9055-pmic", 0}, | 66 | {"da9055-pmic", 0}, |
67 | { } | 67 | { } |
68 | }; | 68 | }; |
diff --git a/drivers/mfd/dm355evm_msp.c b/drivers/mfd/dm355evm_msp.c index 86eca614507b..2a2756709f22 100644 --- a/drivers/mfd/dm355evm_msp.c +++ b/drivers/mfd/dm355evm_msp.c | |||
@@ -18,7 +18,7 @@ | |||
18 | #include <linux/gpio.h> | 18 | #include <linux/gpio.h> |
19 | #include <linux/leds.h> | 19 | #include <linux/leds.h> |
20 | #include <linux/i2c.h> | 20 | #include <linux/i2c.h> |
21 | #include <linux/i2c/dm355evm_msp.h> | 21 | #include <linux/mfd/dm355evm_msp.h> |
22 | 22 | ||
23 | 23 | ||
24 | /* | 24 | /* |
diff --git a/drivers/mfd/hi6421-pmic-core.c b/drivers/mfd/hi6421-pmic-core.c index 3fd703fe3aba..6fb7ba272e09 100644 --- a/drivers/mfd/hi6421-pmic-core.c +++ b/drivers/mfd/hi6421-pmic-core.c | |||
@@ -1,40 +1,35 @@ | |||
1 | /* | 1 | /* |
2 | * Device driver for Hi6421 IC | 2 | * Device driver for Hi6421 PMIC |
3 | * | 3 | * |
4 | * Copyright (c) <2011-2014> HiSilicon Technologies Co., Ltd. | 4 | * Copyright (c) <2011-2014> HiSilicon Technologies Co., Ltd. |
5 | * http://www.hisilicon.com | 5 | * http://www.hisilicon.com |
6 | * Copyright (c) <2013-2014> Linaro Ltd. | 6 | * Copyright (c) <2013-2017> Linaro Ltd. |
7 | * http://www.linaro.org | 7 | * http://www.linaro.org |
8 | * | 8 | * |
9 | * Author: Guodong Xu <guodong.xu@linaro.org> | 9 | * Author: Guodong Xu <guodong.xu@linaro.org> |
10 | * | 10 | * |
11 | * This program is free software; you can redistribute it and/or modify | 11 | * This program is free software; you can redistribute it and/or modify |
12 | * it under the terms of the GNU General Public License as published by | 12 | * it under the terms of the GNU General Public License version 2 as |
13 | * the Free Software Foundation; either version 2 of the License, or | 13 | * published by the Free Software Foundation. |
14 | * (at your option) any later version. | ||
15 | * | ||
16 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
17 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
18 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
19 | * more details. | ||
20 | * | ||
21 | * You should have received a copy of the GNU General Public License | ||
22 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
23 | */ | 14 | */ |
24 | 15 | ||
25 | #include <linux/device.h> | 16 | #include <linux/device.h> |
26 | #include <linux/err.h> | 17 | #include <linux/err.h> |
27 | #include <linux/mfd/core.h> | 18 | #include <linux/mfd/core.h> |
19 | #include <linux/mfd/hi6421-pmic.h> | ||
28 | #include <linux/module.h> | 20 | #include <linux/module.h> |
29 | #include <linux/of.h> | 21 | #include <linux/of_device.h> |
30 | #include <linux/platform_device.h> | 22 | #include <linux/platform_device.h> |
31 | #include <linux/regmap.h> | 23 | #include <linux/regmap.h> |
32 | #include <linux/mfd/hi6421-pmic.h> | ||
33 | 24 | ||
34 | static const struct mfd_cell hi6421_devs[] = { | 25 | static const struct mfd_cell hi6421_devs[] = { |
35 | { .name = "hi6421-regulator", }, | 26 | { .name = "hi6421-regulator", }, |
36 | }; | 27 | }; |
37 | 28 | ||
29 | static const struct mfd_cell hi6421v530_devs[] = { | ||
30 | { .name = "hi6421v530-regulator", }, | ||
31 | }; | ||
32 | |||
38 | static const struct regmap_config hi6421_regmap_config = { | 33 | static const struct regmap_config hi6421_regmap_config = { |
39 | .reg_bits = 32, | 34 | .reg_bits = 32, |
40 | .reg_stride = 4, | 35 | .reg_stride = 4, |
@@ -42,12 +37,33 @@ static const struct regmap_config hi6421_regmap_config = { | |||
42 | .max_register = HI6421_REG_TO_BUS_ADDR(HI6421_REG_MAX), | 37 | .max_register = HI6421_REG_TO_BUS_ADDR(HI6421_REG_MAX), |
43 | }; | 38 | }; |
44 | 39 | ||
40 | static const struct of_device_id of_hi6421_pmic_match[] = { | ||
41 | { | ||
42 | .compatible = "hisilicon,hi6421-pmic", | ||
43 | .data = (void *)HI6421 | ||
44 | }, | ||
45 | { | ||
46 | .compatible = "hisilicon,hi6421v530-pmic", | ||
47 | .data = (void *)HI6421_V530 | ||
48 | }, | ||
49 | { }, | ||
50 | }; | ||
51 | MODULE_DEVICE_TABLE(of, of_hi6421_pmic_match); | ||
52 | |||
45 | static int hi6421_pmic_probe(struct platform_device *pdev) | 53 | static int hi6421_pmic_probe(struct platform_device *pdev) |
46 | { | 54 | { |
47 | struct hi6421_pmic *pmic; | 55 | struct hi6421_pmic *pmic; |
48 | struct resource *res; | 56 | struct resource *res; |
57 | const struct of_device_id *id; | ||
58 | const struct mfd_cell *subdevs; | ||
59 | enum hi6421_type type; | ||
49 | void __iomem *base; | 60 | void __iomem *base; |
50 | int ret; | 61 | int n_subdevs, ret; |
62 | |||
63 | id = of_match_device(of_hi6421_pmic_match, &pdev->dev); | ||
64 | if (!id) | ||
65 | return -EINVAL; | ||
66 | type = (enum hi6421_type)id->data; | ||
51 | 67 | ||
52 | pmic = devm_kzalloc(&pdev->dev, sizeof(*pmic), GFP_KERNEL); | 68 | pmic = devm_kzalloc(&pdev->dev, sizeof(*pmic), GFP_KERNEL); |
53 | if (!pmic) | 69 | if (!pmic) |
@@ -61,41 +77,50 @@ static int hi6421_pmic_probe(struct platform_device *pdev) | |||
61 | pmic->regmap = devm_regmap_init_mmio_clk(&pdev->dev, NULL, base, | 77 | pmic->regmap = devm_regmap_init_mmio_clk(&pdev->dev, NULL, base, |
62 | &hi6421_regmap_config); | 78 | &hi6421_regmap_config); |
63 | if (IS_ERR(pmic->regmap)) { | 79 | if (IS_ERR(pmic->regmap)) { |
64 | dev_err(&pdev->dev, | 80 | dev_err(&pdev->dev, "Failed to initialise Regmap: %ld\n", |
65 | "regmap init failed: %ld\n", PTR_ERR(pmic->regmap)); | 81 | PTR_ERR(pmic->regmap)); |
66 | return PTR_ERR(pmic->regmap); | 82 | return PTR_ERR(pmic->regmap); |
67 | } | 83 | } |
68 | 84 | ||
69 | /* set over-current protection debounce 8ms */ | 85 | platform_set_drvdata(pdev, pmic); |
70 | regmap_update_bits(pmic->regmap, HI6421_OCP_DEB_CTRL_REG, | 86 | |
87 | switch (type) { | ||
88 | case HI6421: | ||
89 | /* set over-current protection debounce 8ms */ | ||
90 | regmap_update_bits(pmic->regmap, HI6421_OCP_DEB_CTRL_REG, | ||
71 | (HI6421_OCP_DEB_SEL_MASK | 91 | (HI6421_OCP_DEB_SEL_MASK |
72 | | HI6421_OCP_EN_DEBOUNCE_MASK | 92 | | HI6421_OCP_EN_DEBOUNCE_MASK |
73 | | HI6421_OCP_AUTO_STOP_MASK), | 93 | | HI6421_OCP_AUTO_STOP_MASK), |
74 | (HI6421_OCP_DEB_SEL_8MS | 94 | (HI6421_OCP_DEB_SEL_8MS |
75 | | HI6421_OCP_EN_DEBOUNCE_ENABLE)); | 95 | | HI6421_OCP_EN_DEBOUNCE_ENABLE)); |
76 | 96 | ||
77 | platform_set_drvdata(pdev, pmic); | 97 | subdevs = hi6421_devs; |
98 | n_subdevs = ARRAY_SIZE(hi6421_devs); | ||
99 | break; | ||
100 | case HI6421_V530: | ||
101 | subdevs = hi6421v530_devs; | ||
102 | n_subdevs = ARRAY_SIZE(hi6421v530_devs); | ||
103 | break; | ||
104 | default: | ||
105 | dev_err(&pdev->dev, "Unknown device type %d\n", | ||
106 | (unsigned int)type); | ||
107 | return -EINVAL; | ||
108 | } | ||
78 | 109 | ||
79 | ret = devm_mfd_add_devices(&pdev->dev, 0, hi6421_devs, | 110 | ret = devm_mfd_add_devices(&pdev->dev, PLATFORM_DEVID_NONE, |
80 | ARRAY_SIZE(hi6421_devs), NULL, 0, NULL); | 111 | subdevs, n_subdevs, NULL, 0, NULL); |
81 | if (ret) { | 112 | if (ret) { |
82 | dev_err(&pdev->dev, "add mfd devices failed: %d\n", ret); | 113 | dev_err(&pdev->dev, "Failed to add child devices: %d\n", ret); |
83 | return ret; | 114 | return ret; |
84 | } | 115 | } |
85 | 116 | ||
86 | return 0; | 117 | return 0; |
87 | } | 118 | } |
88 | 119 | ||
89 | static const struct of_device_id of_hi6421_pmic_match_tbl[] = { | ||
90 | { .compatible = "hisilicon,hi6421-pmic", }, | ||
91 | { }, | ||
92 | }; | ||
93 | MODULE_DEVICE_TABLE(of, of_hi6421_pmic_match_tbl); | ||
94 | |||
95 | static struct platform_driver hi6421_pmic_driver = { | 120 | static struct platform_driver hi6421_pmic_driver = { |
96 | .driver = { | 121 | .driver = { |
97 | .name = "hi6421_pmic", | 122 | .name = "hi6421_pmic", |
98 | .of_match_table = of_hi6421_pmic_match_tbl, | 123 | .of_match_table = of_hi6421_pmic_match, |
99 | }, | 124 | }, |
100 | .probe = hi6421_pmic_probe, | 125 | .probe = hi6421_pmic_probe, |
101 | }; | 126 | }; |
diff --git a/drivers/mfd/intel-lpss-pci.c b/drivers/mfd/intel-lpss-pci.c index ad388bb056cd..d1c46de89eb4 100644 --- a/drivers/mfd/intel-lpss-pci.c +++ b/drivers/mfd/intel-lpss-pci.c | |||
@@ -221,6 +221,7 @@ static const struct pci_device_id intel_lpss_pci_ids[] = { | |||
221 | { PCI_VDEVICE(INTEL, 0xa12a), (kernel_ulong_t)&spt_info }, | 221 | { PCI_VDEVICE(INTEL, 0xa12a), (kernel_ulong_t)&spt_info }, |
222 | { PCI_VDEVICE(INTEL, 0xa160), (kernel_ulong_t)&spt_i2c_info }, | 222 | { PCI_VDEVICE(INTEL, 0xa160), (kernel_ulong_t)&spt_i2c_info }, |
223 | { PCI_VDEVICE(INTEL, 0xa161), (kernel_ulong_t)&spt_i2c_info }, | 223 | { PCI_VDEVICE(INTEL, 0xa161), (kernel_ulong_t)&spt_i2c_info }, |
224 | { PCI_VDEVICE(INTEL, 0xa162), (kernel_ulong_t)&spt_i2c_info }, | ||
224 | { PCI_VDEVICE(INTEL, 0xa166), (kernel_ulong_t)&spt_uart_info }, | 225 | { PCI_VDEVICE(INTEL, 0xa166), (kernel_ulong_t)&spt_uart_info }, |
225 | /* KBL-H */ | 226 | /* KBL-H */ |
226 | { PCI_VDEVICE(INTEL, 0xa2a7), (kernel_ulong_t)&spt_uart_info }, | 227 | { PCI_VDEVICE(INTEL, 0xa2a7), (kernel_ulong_t)&spt_uart_info }, |
diff --git a/drivers/mfd/intel-lpss.c b/drivers/mfd/intel-lpss.c index 70c646b0097d..0e0ab9bb1530 100644 --- a/drivers/mfd/intel-lpss.c +++ b/drivers/mfd/intel-lpss.c | |||
@@ -502,6 +502,14 @@ int intel_lpss_suspend(struct device *dev) | |||
502 | for (i = 0; i < LPSS_PRIV_REG_COUNT; i++) | 502 | for (i = 0; i < LPSS_PRIV_REG_COUNT; i++) |
503 | lpss->priv_ctx[i] = readl(lpss->priv + i * 4); | 503 | lpss->priv_ctx[i] = readl(lpss->priv + i * 4); |
504 | 504 | ||
505 | /* | ||
506 | * If the device type is not UART, then put the controller into | ||
507 | * reset. UART cannot be put into reset since S3/S0ix fail when | ||
508 | * no_console_suspend flag is enabled. | ||
509 | */ | ||
510 | if (lpss->type != LPSS_DEV_UART) | ||
511 | writel(0, lpss->priv + LPSS_PRIV_RESETS); | ||
512 | |||
505 | return 0; | 513 | return 0; |
506 | } | 514 | } |
507 | EXPORT_SYMBOL_GPL(intel_lpss_suspend); | 515 | EXPORT_SYMBOL_GPL(intel_lpss_suspend); |
diff --git a/drivers/mfd/intel_soc_pmic_core.c b/drivers/mfd/intel_soc_pmic_core.c index 13737be6df35..36adf9e8153e 100644 --- a/drivers/mfd/intel_soc_pmic_core.c +++ b/drivers/mfd/intel_soc_pmic_core.c | |||
@@ -16,6 +16,7 @@ | |||
16 | * Author: Zhu, Lejun <lejun.zhu@linux.intel.com> | 16 | * Author: Zhu, Lejun <lejun.zhu@linux.intel.com> |
17 | */ | 17 | */ |
18 | 18 | ||
19 | #include <linux/acpi.h> | ||
19 | #include <linux/module.h> | 20 | #include <linux/module.h> |
20 | #include <linux/mfd/core.h> | 21 | #include <linux/mfd/core.h> |
21 | #include <linux/i2c.h> | 22 | #include <linux/i2c.h> |
@@ -28,6 +29,10 @@ | |||
28 | #include <linux/pwm.h> | 29 | #include <linux/pwm.h> |
29 | #include "intel_soc_pmic_core.h" | 30 | #include "intel_soc_pmic_core.h" |
30 | 31 | ||
32 | /* Crystal Cove PMIC shares same ACPI ID between different platforms */ | ||
33 | #define BYT_CRC_HRV 2 | ||
34 | #define CHT_CRC_HRV 3 | ||
35 | |||
31 | /* Lookup table for the Panel Enable/Disable line as GPIO signals */ | 36 | /* Lookup table for the Panel Enable/Disable line as GPIO signals */ |
32 | static struct gpiod_lookup_table panel_gpio_table = { | 37 | static struct gpiod_lookup_table panel_gpio_table = { |
33 | /* Intel GFX is consumer */ | 38 | /* Intel GFX is consumer */ |
@@ -48,16 +53,33 @@ static int intel_soc_pmic_i2c_probe(struct i2c_client *i2c, | |||
48 | const struct i2c_device_id *i2c_id) | 53 | const struct i2c_device_id *i2c_id) |
49 | { | 54 | { |
50 | struct device *dev = &i2c->dev; | 55 | struct device *dev = &i2c->dev; |
51 | const struct acpi_device_id *id; | ||
52 | struct intel_soc_pmic_config *config; | 56 | struct intel_soc_pmic_config *config; |
53 | struct intel_soc_pmic *pmic; | 57 | struct intel_soc_pmic *pmic; |
58 | unsigned long long hrv; | ||
59 | acpi_status status; | ||
54 | int ret; | 60 | int ret; |
55 | 61 | ||
56 | id = acpi_match_device(dev->driver->acpi_match_table, dev); | 62 | /* |
57 | if (!id || !id->driver_data) | 63 | * There are 2 different Crystal Cove PMICs a Bay Trail and Cherry |
64 | * Trail version, use _HRV to differentiate between the 2. | ||
65 | */ | ||
66 | status = acpi_evaluate_integer(ACPI_HANDLE(dev), "_HRV", NULL, &hrv); | ||
67 | if (ACPI_FAILURE(status)) { | ||
68 | dev_err(dev, "Failed to get PMIC hardware revision\n"); | ||
58 | return -ENODEV; | 69 | return -ENODEV; |
59 | 70 | } | |
60 | config = (struct intel_soc_pmic_config *)id->driver_data; | 71 | |
72 | switch (hrv) { | ||
73 | case BYT_CRC_HRV: | ||
74 | config = &intel_soc_pmic_config_byt_crc; | ||
75 | break; | ||
76 | case CHT_CRC_HRV: | ||
77 | config = &intel_soc_pmic_config_cht_crc; | ||
78 | break; | ||
79 | default: | ||
80 | dev_warn(dev, "Unknown hardware rev %llu, assuming BYT\n", hrv); | ||
81 | config = &intel_soc_pmic_config_byt_crc; | ||
82 | } | ||
61 | 83 | ||
62 | pmic = devm_kzalloc(dev, sizeof(*pmic), GFP_KERNEL); | 84 | pmic = devm_kzalloc(dev, sizeof(*pmic), GFP_KERNEL); |
63 | if (!pmic) | 85 | if (!pmic) |
@@ -157,7 +179,7 @@ MODULE_DEVICE_TABLE(i2c, intel_soc_pmic_i2c_id); | |||
157 | 179 | ||
158 | #if defined(CONFIG_ACPI) | 180 | #if defined(CONFIG_ACPI) |
159 | static const struct acpi_device_id intel_soc_pmic_acpi_match[] = { | 181 | static const struct acpi_device_id intel_soc_pmic_acpi_match[] = { |
160 | {"INT33FD", (kernel_ulong_t)&intel_soc_pmic_config_crc}, | 182 | { "INT33FD" }, |
161 | { }, | 183 | { }, |
162 | }; | 184 | }; |
163 | MODULE_DEVICE_TABLE(acpi, intel_soc_pmic_acpi_match); | 185 | MODULE_DEVICE_TABLE(acpi, intel_soc_pmic_acpi_match); |
diff --git a/drivers/mfd/intel_soc_pmic_core.h b/drivers/mfd/intel_soc_pmic_core.h index ff2464bc172f..90a1416d4dac 100644 --- a/drivers/mfd/intel_soc_pmic_core.h +++ b/drivers/mfd/intel_soc_pmic_core.h | |||
@@ -27,6 +27,7 @@ struct intel_soc_pmic_config { | |||
27 | const struct regmap_irq_chip *irq_chip; | 27 | const struct regmap_irq_chip *irq_chip; |
28 | }; | 28 | }; |
29 | 29 | ||
30 | extern struct intel_soc_pmic_config intel_soc_pmic_config_crc; | 30 | extern struct intel_soc_pmic_config intel_soc_pmic_config_byt_crc; |
31 | extern struct intel_soc_pmic_config intel_soc_pmic_config_cht_crc; | ||
31 | 32 | ||
32 | #endif /* __INTEL_SOC_PMIC_CORE_H__ */ | 33 | #endif /* __INTEL_SOC_PMIC_CORE_H__ */ |
diff --git a/drivers/mfd/intel_soc_pmic_crc.c b/drivers/mfd/intel_soc_pmic_crc.c index 4a7494872da2..6d19a6d0fb97 100644 --- a/drivers/mfd/intel_soc_pmic_crc.c +++ b/drivers/mfd/intel_soc_pmic_crc.c | |||
@@ -80,7 +80,7 @@ static struct resource bcu_resources[] = { | |||
80 | }, | 80 | }, |
81 | }; | 81 | }; |
82 | 82 | ||
83 | static struct mfd_cell crystal_cove_dev[] = { | 83 | static struct mfd_cell crystal_cove_byt_dev[] = { |
84 | { | 84 | { |
85 | .name = "crystal_cove_pwrsrc", | 85 | .name = "crystal_cove_pwrsrc", |
86 | .num_resources = ARRAY_SIZE(pwrsrc_resources), | 86 | .num_resources = ARRAY_SIZE(pwrsrc_resources), |
@@ -114,6 +114,17 @@ static struct mfd_cell crystal_cove_dev[] = { | |||
114 | }, | 114 | }, |
115 | }; | 115 | }; |
116 | 116 | ||
117 | static struct mfd_cell crystal_cove_cht_dev[] = { | ||
118 | { | ||
119 | .name = "crystal_cove_gpio", | ||
120 | .num_resources = ARRAY_SIZE(gpio_resources), | ||
121 | .resources = gpio_resources, | ||
122 | }, | ||
123 | { | ||
124 | .name = "crystal_cove_pwm", | ||
125 | }, | ||
126 | }; | ||
127 | |||
117 | static const struct regmap_config crystal_cove_regmap_config = { | 128 | static const struct regmap_config crystal_cove_regmap_config = { |
118 | .reg_bits = 8, | 129 | .reg_bits = 8, |
119 | .val_bits = 8, | 130 | .val_bits = 8, |
@@ -155,10 +166,18 @@ static const struct regmap_irq_chip crystal_cove_irq_chip = { | |||
155 | .mask_base = CRYSTAL_COVE_REG_MIRQLVL1, | 166 | .mask_base = CRYSTAL_COVE_REG_MIRQLVL1, |
156 | }; | 167 | }; |
157 | 168 | ||
158 | struct intel_soc_pmic_config intel_soc_pmic_config_crc = { | 169 | struct intel_soc_pmic_config intel_soc_pmic_config_byt_crc = { |
170 | .irq_flags = IRQF_TRIGGER_RISING, | ||
171 | .cell_dev = crystal_cove_byt_dev, | ||
172 | .n_cell_devs = ARRAY_SIZE(crystal_cove_byt_dev), | ||
173 | .regmap_config = &crystal_cove_regmap_config, | ||
174 | .irq_chip = &crystal_cove_irq_chip, | ||
175 | }; | ||
176 | |||
177 | struct intel_soc_pmic_config intel_soc_pmic_config_cht_crc = { | ||
159 | .irq_flags = IRQF_TRIGGER_RISING, | 178 | .irq_flags = IRQF_TRIGGER_RISING, |
160 | .cell_dev = crystal_cove_dev, | 179 | .cell_dev = crystal_cove_cht_dev, |
161 | .n_cell_devs = ARRAY_SIZE(crystal_cove_dev), | 180 | .n_cell_devs = ARRAY_SIZE(crystal_cove_cht_dev), |
162 | .regmap_config = &crystal_cove_regmap_config, | 181 | .regmap_config = &crystal_cove_regmap_config, |
163 | .irq_chip = &crystal_cove_irq_chip, | 182 | .irq_chip = &crystal_cove_irq_chip, |
164 | }; | 183 | }; |
diff --git a/drivers/mfd/lp87565.c b/drivers/mfd/lp87565.c index 340ad0c63744..32d2a07d4354 100644 --- a/drivers/mfd/lp87565.c +++ b/drivers/mfd/lp87565.c | |||
@@ -73,10 +73,9 @@ static int lp87565_probe(struct i2c_client *client, | |||
73 | 73 | ||
74 | i2c_set_clientdata(client, lp87565); | 74 | i2c_set_clientdata(client, lp87565); |
75 | 75 | ||
76 | ret = mfd_add_devices(lp87565->dev, PLATFORM_DEVID_AUTO, lp87565_cells, | 76 | return devm_mfd_add_devices(lp87565->dev, PLATFORM_DEVID_AUTO, |
77 | ARRAY_SIZE(lp87565_cells), NULL, 0, NULL); | 77 | lp87565_cells, ARRAY_SIZE(lp87565_cells), |
78 | 78 | NULL, 0, NULL); | |
79 | return ret; | ||
80 | } | 79 | } |
81 | 80 | ||
82 | static const struct i2c_device_id lp87565_id_table[] = { | 81 | static const struct i2c_device_id lp87565_id_table[] = { |
diff --git a/drivers/mfd/lpc_ich.c b/drivers/mfd/lpc_ich.c index 773f1554d2f9..450ae36645aa 100644 --- a/drivers/mfd/lpc_ich.c +++ b/drivers/mfd/lpc_ich.c | |||
@@ -1119,17 +1119,7 @@ static int lpc_ich_init_spi(struct pci_dev *dev) | |||
1119 | res->start = spi_base + SPIBASE_LPT; | 1119 | res->start = spi_base + SPIBASE_LPT; |
1120 | res->end = res->start + SPIBASE_LPT_SZ - 1; | 1120 | res->end = res->start + SPIBASE_LPT_SZ - 1; |
1121 | 1121 | ||
1122 | /* | ||
1123 | * Try to make the flash chip writeable now by | ||
1124 | * setting BCR_WPD. It it fails we tell the driver | ||
1125 | * that it can only read the chip. | ||
1126 | */ | ||
1127 | pci_read_config_dword(dev, BCR, &bcr); | 1122 | pci_read_config_dword(dev, BCR, &bcr); |
1128 | if (!(bcr & BCR_WPD)) { | ||
1129 | bcr |= BCR_WPD; | ||
1130 | pci_write_config_dword(dev, BCR, bcr); | ||
1131 | pci_read_config_dword(dev, BCR, &bcr); | ||
1132 | } | ||
1133 | info->writeable = !!(bcr & BCR_WPD); | 1123 | info->writeable = !!(bcr & BCR_WPD); |
1134 | } | 1124 | } |
1135 | break; | 1125 | break; |
diff --git a/drivers/mfd/max8925-i2c.c b/drivers/mfd/max8925-i2c.c index 5c80aea3211f..10063236132c 100644 --- a/drivers/mfd/max8925-i2c.c +++ b/drivers/mfd/max8925-i2c.c | |||
@@ -151,7 +151,7 @@ static int max8925_probe(struct i2c_client *client, | |||
151 | const struct i2c_device_id *id) | 151 | const struct i2c_device_id *id) |
152 | { | 152 | { |
153 | struct max8925_platform_data *pdata = dev_get_platdata(&client->dev); | 153 | struct max8925_platform_data *pdata = dev_get_platdata(&client->dev); |
154 | static struct max8925_chip *chip; | 154 | struct max8925_chip *chip; |
155 | struct device_node *node = client->dev.of_node; | 155 | struct device_node *node = client->dev.of_node; |
156 | 156 | ||
157 | if (node && !pdata) { | 157 | if (node && !pdata) { |
diff --git a/drivers/mfd/max8998.c b/drivers/mfd/max8998.c index 4c33b8063bc3..b1d3f70782d9 100644 --- a/drivers/mfd/max8998.c +++ b/drivers/mfd/max8998.c | |||
@@ -192,10 +192,8 @@ static int max8998_i2c_probe(struct i2c_client *i2c, | |||
192 | 192 | ||
193 | if (IS_ENABLED(CONFIG_OF) && i2c->dev.of_node) { | 193 | if (IS_ENABLED(CONFIG_OF) && i2c->dev.of_node) { |
194 | pdata = max8998_i2c_parse_dt_pdata(&i2c->dev); | 194 | pdata = max8998_i2c_parse_dt_pdata(&i2c->dev); |
195 | if (IS_ERR(pdata)) { | 195 | if (IS_ERR(pdata)) |
196 | ret = PTR_ERR(pdata); | 196 | return PTR_ERR(pdata); |
197 | goto err; | ||
198 | } | ||
199 | } | 197 | } |
200 | 198 | ||
201 | i2c_set_clientdata(i2c, max8998); | 199 | i2c_set_clientdata(i2c, max8998); |
diff --git a/drivers/mfd/omap-usb-tll.c b/drivers/mfd/omap-usb-tll.c index 6f5300b0eb31..44a5d66314c6 100644 --- a/drivers/mfd/omap-usb-tll.c +++ b/drivers/mfd/omap-usb-tll.c | |||
@@ -131,12 +131,12 @@ static inline u32 usbtll_read(void __iomem *base, u32 reg) | |||
131 | return readl_relaxed(base + reg); | 131 | return readl_relaxed(base + reg); |
132 | } | 132 | } |
133 | 133 | ||
134 | static inline void usbtll_writeb(void __iomem *base, u8 reg, u8 val) | 134 | static inline void usbtll_writeb(void __iomem *base, u32 reg, u8 val) |
135 | { | 135 | { |
136 | writeb_relaxed(val, base + reg); | 136 | writeb_relaxed(val, base + reg); |
137 | } | 137 | } |
138 | 138 | ||
139 | static inline u8 usbtll_readb(void __iomem *base, u8 reg) | 139 | static inline u8 usbtll_readb(void __iomem *base, u32 reg) |
140 | { | 140 | { |
141 | return readb_relaxed(base + reg); | 141 | return readb_relaxed(base + reg); |
142 | } | 142 | } |
diff --git a/drivers/mfd/retu-mfd.c b/drivers/mfd/retu-mfd.c index d4c114abeb75..e7d27b7861c1 100644 --- a/drivers/mfd/retu-mfd.c +++ b/drivers/mfd/retu-mfd.c | |||
@@ -302,15 +302,23 @@ static int retu_remove(struct i2c_client *i2c) | |||
302 | } | 302 | } |
303 | 303 | ||
304 | static const struct i2c_device_id retu_id[] = { | 304 | static const struct i2c_device_id retu_id[] = { |
305 | { "retu-mfd", 0 }, | 305 | { "retu", 0 }, |
306 | { "tahvo-mfd", 0 }, | 306 | { "tahvo", 0 }, |
307 | { } | 307 | { } |
308 | }; | 308 | }; |
309 | MODULE_DEVICE_TABLE(i2c, retu_id); | 309 | MODULE_DEVICE_TABLE(i2c, retu_id); |
310 | 310 | ||
311 | static const struct of_device_id retu_of_match[] = { | ||
312 | { .compatible = "nokia,retu" }, | ||
313 | { .compatible = "nokia,tahvo" }, | ||
314 | { } | ||
315 | }; | ||
316 | MODULE_DEVICE_TABLE(of, retu_of_match); | ||
317 | |||
311 | static struct i2c_driver retu_driver = { | 318 | static struct i2c_driver retu_driver = { |
312 | .driver = { | 319 | .driver = { |
313 | .name = "retu-mfd", | 320 | .name = "retu-mfd", |
321 | .of_match_table = retu_of_match, | ||
314 | }, | 322 | }, |
315 | .probe = retu_probe, | 323 | .probe = retu_probe, |
316 | .remove = retu_remove, | 324 | .remove = retu_remove, |
diff --git a/drivers/mfd/rk808.c b/drivers/mfd/rk808.c index fd087cbb0bde..216fbf6adec9 100644 --- a/drivers/mfd/rk808.c +++ b/drivers/mfd/rk808.c | |||
@@ -70,6 +70,14 @@ static const struct regmap_config rk818_regmap_config = { | |||
70 | .volatile_reg = rk808_is_volatile_reg, | 70 | .volatile_reg = rk808_is_volatile_reg, |
71 | }; | 71 | }; |
72 | 72 | ||
73 | static const struct regmap_config rk805_regmap_config = { | ||
74 | .reg_bits = 8, | ||
75 | .val_bits = 8, | ||
76 | .max_register = RK805_OFF_SOURCE_REG, | ||
77 | .cache_type = REGCACHE_RBTREE, | ||
78 | .volatile_reg = rk808_is_volatile_reg, | ||
79 | }; | ||
80 | |||
73 | static const struct regmap_config rk808_regmap_config = { | 81 | static const struct regmap_config rk808_regmap_config = { |
74 | .reg_bits = 8, | 82 | .reg_bits = 8, |
75 | .val_bits = 8, | 83 | .val_bits = 8, |
@@ -86,6 +94,34 @@ static struct resource rtc_resources[] = { | |||
86 | } | 94 | } |
87 | }; | 95 | }; |
88 | 96 | ||
97 | static struct resource rk805_key_resources[] = { | ||
98 | { | ||
99 | .start = RK805_IRQ_PWRON_FALL, | ||
100 | .end = RK805_IRQ_PWRON_FALL, | ||
101 | .flags = IORESOURCE_IRQ, | ||
102 | }, | ||
103 | { | ||
104 | .start = RK805_IRQ_PWRON_RISE, | ||
105 | .end = RK805_IRQ_PWRON_RISE, | ||
106 | .flags = IORESOURCE_IRQ, | ||
107 | } | ||
108 | }; | ||
109 | |||
110 | static const struct mfd_cell rk805s[] = { | ||
111 | { .name = "rk808-clkout", }, | ||
112 | { .name = "rk808-regulator", }, | ||
113 | { .name = "rk805-pinctrl", }, | ||
114 | { | ||
115 | .name = "rk808-rtc", | ||
116 | .num_resources = ARRAY_SIZE(rtc_resources), | ||
117 | .resources = &rtc_resources[0], | ||
118 | }, | ||
119 | { .name = "rk805-pwrkey", | ||
120 | .num_resources = ARRAY_SIZE(rk805_key_resources), | ||
121 | .resources = &rk805_key_resources[0], | ||
122 | }, | ||
123 | }; | ||
124 | |||
89 | static const struct mfd_cell rk808s[] = { | 125 | static const struct mfd_cell rk808s[] = { |
90 | { .name = "rk808-clkout", }, | 126 | { .name = "rk808-clkout", }, |
91 | { .name = "rk808-regulator", }, | 127 | { .name = "rk808-regulator", }, |
@@ -106,6 +142,20 @@ static const struct mfd_cell rk818s[] = { | |||
106 | }, | 142 | }, |
107 | }; | 143 | }; |
108 | 144 | ||
145 | static const struct rk808_reg_data rk805_pre_init_reg[] = { | ||
146 | {RK805_BUCK1_CONFIG_REG, RK805_BUCK1_2_ILMAX_MASK, | ||
147 | RK805_BUCK1_2_ILMAX_4000MA}, | ||
148 | {RK805_BUCK2_CONFIG_REG, RK805_BUCK1_2_ILMAX_MASK, | ||
149 | RK805_BUCK1_2_ILMAX_4000MA}, | ||
150 | {RK805_BUCK3_CONFIG_REG, RK805_BUCK3_4_ILMAX_MASK, | ||
151 | RK805_BUCK3_ILMAX_3000MA}, | ||
152 | {RK805_BUCK4_CONFIG_REG, RK805_BUCK3_4_ILMAX_MASK, | ||
153 | RK805_BUCK4_ILMAX_3500MA}, | ||
154 | {RK805_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_400MA}, | ||
155 | {RK805_GPIO_IO_POL_REG, SLP_SD_MSK, SLEEP_FUN}, | ||
156 | {RK805_THERMAL_REG, TEMP_HOTDIE_MSK, TEMP115C}, | ||
157 | }; | ||
158 | |||
109 | static const struct rk808_reg_data rk808_pre_init_reg[] = { | 159 | static const struct rk808_reg_data rk808_pre_init_reg[] = { |
110 | { RK808_BUCK3_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_150MA }, | 160 | { RK808_BUCK3_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_150MA }, |
111 | { RK808_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_200MA }, | 161 | { RK808_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_200MA }, |
@@ -135,6 +185,41 @@ static const struct rk808_reg_data rk818_pre_init_reg[] = { | |||
135 | VB_LO_SEL_3500MV }, | 185 | VB_LO_SEL_3500MV }, |
136 | }; | 186 | }; |
137 | 187 | ||
188 | static const struct regmap_irq rk805_irqs[] = { | ||
189 | [RK805_IRQ_PWRON_RISE] = { | ||
190 | .mask = RK805_IRQ_PWRON_RISE_MSK, | ||
191 | .reg_offset = 0, | ||
192 | }, | ||
193 | [RK805_IRQ_VB_LOW] = { | ||
194 | .mask = RK805_IRQ_VB_LOW_MSK, | ||
195 | .reg_offset = 0, | ||
196 | }, | ||
197 | [RK805_IRQ_PWRON] = { | ||
198 | .mask = RK805_IRQ_PWRON_MSK, | ||
199 | .reg_offset = 0, | ||
200 | }, | ||
201 | [RK805_IRQ_PWRON_LP] = { | ||
202 | .mask = RK805_IRQ_PWRON_LP_MSK, | ||
203 | .reg_offset = 0, | ||
204 | }, | ||
205 | [RK805_IRQ_HOTDIE] = { | ||
206 | .mask = RK805_IRQ_HOTDIE_MSK, | ||
207 | .reg_offset = 0, | ||
208 | }, | ||
209 | [RK805_IRQ_RTC_ALARM] = { | ||
210 | .mask = RK805_IRQ_RTC_ALARM_MSK, | ||
211 | .reg_offset = 0, | ||
212 | }, | ||
213 | [RK805_IRQ_RTC_PERIOD] = { | ||
214 | .mask = RK805_IRQ_RTC_PERIOD_MSK, | ||
215 | .reg_offset = 0, | ||
216 | }, | ||
217 | [RK805_IRQ_PWRON_FALL] = { | ||
218 | .mask = RK805_IRQ_PWRON_FALL_MSK, | ||
219 | .reg_offset = 0, | ||
220 | }, | ||
221 | }; | ||
222 | |||
138 | static const struct regmap_irq rk808_irqs[] = { | 223 | static const struct regmap_irq rk808_irqs[] = { |
139 | /* INT_STS */ | 224 | /* INT_STS */ |
140 | [RK808_IRQ_VOUT_LO] = { | 225 | [RK808_IRQ_VOUT_LO] = { |
@@ -247,6 +332,17 @@ static const struct regmap_irq rk818_irqs[] = { | |||
247 | }, | 332 | }, |
248 | }; | 333 | }; |
249 | 334 | ||
335 | static struct regmap_irq_chip rk805_irq_chip = { | ||
336 | .name = "rk805", | ||
337 | .irqs = rk805_irqs, | ||
338 | .num_irqs = ARRAY_SIZE(rk805_irqs), | ||
339 | .num_regs = 1, | ||
340 | .status_base = RK805_INT_STS_REG, | ||
341 | .mask_base = RK805_INT_STS_MSK_REG, | ||
342 | .ack_base = RK805_INT_STS_REG, | ||
343 | .init_ack_masked = true, | ||
344 | }; | ||
345 | |||
250 | static const struct regmap_irq_chip rk808_irq_chip = { | 346 | static const struct regmap_irq_chip rk808_irq_chip = { |
251 | .name = "rk808", | 347 | .name = "rk808", |
252 | .irqs = rk808_irqs, | 348 | .irqs = rk808_irqs, |
@@ -272,6 +368,25 @@ static const struct regmap_irq_chip rk818_irq_chip = { | |||
272 | }; | 368 | }; |
273 | 369 | ||
274 | static struct i2c_client *rk808_i2c_client; | 370 | static struct i2c_client *rk808_i2c_client; |
371 | |||
372 | static void rk805_device_shutdown(void) | ||
373 | { | ||
374 | int ret; | ||
375 | struct rk808 *rk808 = i2c_get_clientdata(rk808_i2c_client); | ||
376 | |||
377 | if (!rk808) { | ||
378 | dev_warn(&rk808_i2c_client->dev, | ||
379 | "have no rk805, so do nothing here\n"); | ||
380 | return; | ||
381 | } | ||
382 | |||
383 | ret = regmap_update_bits(rk808->regmap, | ||
384 | RK805_DEV_CTRL_REG, | ||
385 | DEV_OFF, DEV_OFF); | ||
386 | if (ret) | ||
387 | dev_err(&rk808_i2c_client->dev, "power off error!\n"); | ||
388 | } | ||
389 | |||
275 | static void rk808_device_shutdown(void) | 390 | static void rk808_device_shutdown(void) |
276 | { | 391 | { |
277 | int ret; | 392 | int ret; |
@@ -309,6 +424,7 @@ static void rk818_device_shutdown(void) | |||
309 | } | 424 | } |
310 | 425 | ||
311 | static const struct of_device_id rk808_of_match[] = { | 426 | static const struct of_device_id rk808_of_match[] = { |
427 | { .compatible = "rockchip,rk805" }, | ||
312 | { .compatible = "rockchip,rk808" }, | 428 | { .compatible = "rockchip,rk808" }, |
313 | { .compatible = "rockchip,rk818" }, | 429 | { .compatible = "rockchip,rk818" }, |
314 | { }, | 430 | { }, |
@@ -325,7 +441,7 @@ static int rk808_probe(struct i2c_client *client, | |||
325 | void (*pm_pwroff_fn)(void); | 441 | void (*pm_pwroff_fn)(void); |
326 | int nr_pre_init_regs; | 442 | int nr_pre_init_regs; |
327 | int nr_cells; | 443 | int nr_cells; |
328 | int pm_off = 0; | 444 | int pm_off = 0, msb, lsb; |
329 | int ret; | 445 | int ret; |
330 | int i; | 446 | int i; |
331 | 447 | ||
@@ -333,16 +449,34 @@ static int rk808_probe(struct i2c_client *client, | |||
333 | if (!rk808) | 449 | if (!rk808) |
334 | return -ENOMEM; | 450 | return -ENOMEM; |
335 | 451 | ||
336 | rk808->variant = i2c_smbus_read_word_data(client, RK808_ID_MSB); | 452 | /* Read chip variant */ |
337 | if (rk808->variant < 0) { | 453 | msb = i2c_smbus_read_byte_data(client, RK808_ID_MSB); |
338 | dev_err(&client->dev, "Failed to read the chip id at 0x%02x\n", | 454 | if (msb < 0) { |
455 | dev_err(&client->dev, "failed to read the chip id at 0x%x\n", | ||
339 | RK808_ID_MSB); | 456 | RK808_ID_MSB); |
340 | return rk808->variant; | 457 | return msb; |
458 | } | ||
459 | |||
460 | lsb = i2c_smbus_read_byte_data(client, RK808_ID_LSB); | ||
461 | if (lsb < 0) { | ||
462 | dev_err(&client->dev, "failed to read the chip id at 0x%x\n", | ||
463 | RK808_ID_LSB); | ||
464 | return lsb; | ||
341 | } | 465 | } |
342 | 466 | ||
343 | dev_dbg(&client->dev, "Chip id: 0x%x\n", (unsigned int)rk808->variant); | 467 | rk808->variant = ((msb << 8) | lsb) & RK8XX_ID_MSK; |
468 | dev_info(&client->dev, "chip id: 0x%x\n", (unsigned int)rk808->variant); | ||
344 | 469 | ||
345 | switch (rk808->variant) { | 470 | switch (rk808->variant) { |
471 | case RK805_ID: | ||
472 | rk808->regmap_cfg = &rk805_regmap_config; | ||
473 | rk808->regmap_irq_chip = &rk805_irq_chip; | ||
474 | pre_init_reg = rk805_pre_init_reg; | ||
475 | nr_pre_init_regs = ARRAY_SIZE(rk805_pre_init_reg); | ||
476 | cells = rk805s; | ||
477 | nr_cells = ARRAY_SIZE(rk805s); | ||
478 | pm_pwroff_fn = rk805_device_shutdown; | ||
479 | break; | ||
346 | case RK808_ID: | 480 | case RK808_ID: |
347 | rk808->regmap_cfg = &rk808_regmap_config; | 481 | rk808->regmap_cfg = &rk808_regmap_config; |
348 | rk808->regmap_irq_chip = &rk808_irq_chip; | 482 | rk808->regmap_irq_chip = &rk808_irq_chip; |
@@ -435,6 +569,7 @@ static int rk808_remove(struct i2c_client *client) | |||
435 | } | 569 | } |
436 | 570 | ||
437 | static const struct i2c_device_id rk808_ids[] = { | 571 | static const struct i2c_device_id rk808_ids[] = { |
572 | { "rk805" }, | ||
438 | { "rk808" }, | 573 | { "rk808" }, |
439 | { "rk818" }, | 574 | { "rk818" }, |
440 | { }, | 575 | { }, |
diff --git a/drivers/mfd/rtsx_pcr.c b/drivers/mfd/rtsx_pcr.c index a0ac89dfdf0f..3cf69e5c5703 100644 --- a/drivers/mfd/rtsx_pcr.c +++ b/drivers/mfd/rtsx_pcr.c | |||
@@ -644,7 +644,7 @@ int rtsx_pci_switch_clock(struct rtsx_pcr *pcr, unsigned int card_clock, | |||
644 | { | 644 | { |
645 | int err, clk; | 645 | int err, clk; |
646 | u8 n, clk_divider, mcu_cnt, div; | 646 | u8 n, clk_divider, mcu_cnt, div; |
647 | u8 depth[] = { | 647 | static const u8 depth[] = { |
648 | [RTSX_SSC_DEPTH_4M] = SSC_DEPTH_4M, | 648 | [RTSX_SSC_DEPTH_4M] = SSC_DEPTH_4M, |
649 | [RTSX_SSC_DEPTH_2M] = SSC_DEPTH_2M, | 649 | [RTSX_SSC_DEPTH_2M] = SSC_DEPTH_2M, |
650 | [RTSX_SSC_DEPTH_1M] = SSC_DEPTH_1M, | 650 | [RTSX_SSC_DEPTH_1M] = SSC_DEPTH_1M, |
@@ -768,7 +768,7 @@ EXPORT_SYMBOL_GPL(rtsx_pci_card_power_off); | |||
768 | 768 | ||
769 | int rtsx_pci_card_exclusive_check(struct rtsx_pcr *pcr, int card) | 769 | int rtsx_pci_card_exclusive_check(struct rtsx_pcr *pcr, int card) |
770 | { | 770 | { |
771 | unsigned int cd_mask[] = { | 771 | static const unsigned int cd_mask[] = { |
772 | [RTSX_SD_CARD] = SD_EXIST, | 772 | [RTSX_SD_CARD] = SD_EXIST, |
773 | [RTSX_MS_CARD] = MS_EXIST | 773 | [RTSX_MS_CARD] = MS_EXIST |
774 | }; | 774 | }; |
diff --git a/drivers/mfd/stm32-lptimer.c b/drivers/mfd/stm32-lptimer.c new file mode 100644 index 000000000000..075330a25f61 --- /dev/null +++ b/drivers/mfd/stm32-lptimer.c | |||
@@ -0,0 +1,107 @@ | |||
1 | /* | ||
2 | * STM32 Low-Power Timer parent driver. | ||
3 | * | ||
4 | * Copyright (C) STMicroelectronics 2017 | ||
5 | * | ||
6 | * Author: Fabrice Gasnier <fabrice.gasnier@st.com> | ||
7 | * | ||
8 | * Inspired by Benjamin Gaignard's stm32-timers driver | ||
9 | * | ||
10 | * License terms: GNU General Public License (GPL), version 2 | ||
11 | */ | ||
12 | |||
13 | #include <linux/mfd/stm32-lptimer.h> | ||
14 | #include <linux/module.h> | ||
15 | #include <linux/of_platform.h> | ||
16 | |||
17 | #define STM32_LPTIM_MAX_REGISTER 0x3fc | ||
18 | |||
19 | static const struct regmap_config stm32_lptimer_regmap_cfg = { | ||
20 | .reg_bits = 32, | ||
21 | .val_bits = 32, | ||
22 | .reg_stride = sizeof(u32), | ||
23 | .max_register = STM32_LPTIM_MAX_REGISTER, | ||
24 | }; | ||
25 | |||
26 | static int stm32_lptimer_detect_encoder(struct stm32_lptimer *ddata) | ||
27 | { | ||
28 | u32 val; | ||
29 | int ret; | ||
30 | |||
31 | /* | ||
32 | * Quadrature encoder mode bit can only be written and read back when | ||
33 | * Low-Power Timer supports it. | ||
34 | */ | ||
35 | ret = regmap_update_bits(ddata->regmap, STM32_LPTIM_CFGR, | ||
36 | STM32_LPTIM_ENC, STM32_LPTIM_ENC); | ||
37 | if (ret) | ||
38 | return ret; | ||
39 | |||
40 | ret = regmap_read(ddata->regmap, STM32_LPTIM_CFGR, &val); | ||
41 | if (ret) | ||
42 | return ret; | ||
43 | |||
44 | ret = regmap_update_bits(ddata->regmap, STM32_LPTIM_CFGR, | ||
45 | STM32_LPTIM_ENC, 0); | ||
46 | if (ret) | ||
47 | return ret; | ||
48 | |||
49 | ddata->has_encoder = !!(val & STM32_LPTIM_ENC); | ||
50 | |||
51 | return 0; | ||
52 | } | ||
53 | |||
54 | static int stm32_lptimer_probe(struct platform_device *pdev) | ||
55 | { | ||
56 | struct device *dev = &pdev->dev; | ||
57 | struct stm32_lptimer *ddata; | ||
58 | struct resource *res; | ||
59 | void __iomem *mmio; | ||
60 | int ret; | ||
61 | |||
62 | ddata = devm_kzalloc(dev, sizeof(*ddata), GFP_KERNEL); | ||
63 | if (!ddata) | ||
64 | return -ENOMEM; | ||
65 | |||
66 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
67 | mmio = devm_ioremap_resource(dev, res); | ||
68 | if (IS_ERR(mmio)) | ||
69 | return PTR_ERR(mmio); | ||
70 | |||
71 | ddata->regmap = devm_regmap_init_mmio_clk(dev, "mux", mmio, | ||
72 | &stm32_lptimer_regmap_cfg); | ||
73 | if (IS_ERR(ddata->regmap)) | ||
74 | return PTR_ERR(ddata->regmap); | ||
75 | |||
76 | ddata->clk = devm_clk_get(dev, NULL); | ||
77 | if (IS_ERR(ddata->clk)) | ||
78 | return PTR_ERR(ddata->clk); | ||
79 | |||
80 | ret = stm32_lptimer_detect_encoder(ddata); | ||
81 | if (ret) | ||
82 | return ret; | ||
83 | |||
84 | platform_set_drvdata(pdev, ddata); | ||
85 | |||
86 | return devm_of_platform_populate(&pdev->dev); | ||
87 | } | ||
88 | |||
89 | static const struct of_device_id stm32_lptimer_of_match[] = { | ||
90 | { .compatible = "st,stm32-lptimer", }, | ||
91 | {}, | ||
92 | }; | ||
93 | MODULE_DEVICE_TABLE(of, stm32_lptimer_of_match); | ||
94 | |||
95 | static struct platform_driver stm32_lptimer_driver = { | ||
96 | .probe = stm32_lptimer_probe, | ||
97 | .driver = { | ||
98 | .name = "stm32-lptimer", | ||
99 | .of_match_table = stm32_lptimer_of_match, | ||
100 | }, | ||
101 | }; | ||
102 | module_platform_driver(stm32_lptimer_driver); | ||
103 | |||
104 | MODULE_AUTHOR("Fabrice Gasnier <fabrice.gasnier@st.com>"); | ||
105 | MODULE_DESCRIPTION("STMicroelectronics STM32 Low-Power Timer"); | ||
106 | MODULE_ALIAS("platform:stm32-lptimer"); | ||
107 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/mfd/t7l66xb.c b/drivers/mfd/t7l66xb.c index 22c811396edc..43d8683266de 100644 --- a/drivers/mfd/t7l66xb.c +++ b/drivers/mfd/t7l66xb.c | |||
@@ -86,8 +86,11 @@ static int t7l66xb_mmc_enable(struct platform_device *mmc) | |||
86 | struct t7l66xb *t7l66xb = platform_get_drvdata(dev); | 86 | struct t7l66xb *t7l66xb = platform_get_drvdata(dev); |
87 | unsigned long flags; | 87 | unsigned long flags; |
88 | u8 dev_ctl; | 88 | u8 dev_ctl; |
89 | int ret; | ||
89 | 90 | ||
90 | clk_prepare_enable(t7l66xb->clk32k); | 91 | ret = clk_prepare_enable(t7l66xb->clk32k); |
92 | if (ret) | ||
93 | return ret; | ||
91 | 94 | ||
92 | raw_spin_lock_irqsave(&t7l66xb->lock, flags); | 95 | raw_spin_lock_irqsave(&t7l66xb->lock, flags); |
93 | 96 | ||
@@ -286,8 +289,12 @@ static int t7l66xb_resume(struct platform_device *dev) | |||
286 | { | 289 | { |
287 | struct t7l66xb *t7l66xb = platform_get_drvdata(dev); | 290 | struct t7l66xb *t7l66xb = platform_get_drvdata(dev); |
288 | struct t7l66xb_platform_data *pdata = dev_get_platdata(&dev->dev); | 291 | struct t7l66xb_platform_data *pdata = dev_get_platdata(&dev->dev); |
292 | int ret; | ||
293 | |||
294 | ret = clk_prepare_enable(t7l66xb->clk48m); | ||
295 | if (ret) | ||
296 | return ret; | ||
289 | 297 | ||
290 | clk_prepare_enable(t7l66xb->clk48m); | ||
291 | if (pdata && pdata->resume) | 298 | if (pdata && pdata->resume) |
292 | pdata->resume(dev); | 299 | pdata->resume(dev); |
293 | 300 | ||
@@ -361,7 +368,9 @@ static int t7l66xb_probe(struct platform_device *dev) | |||
361 | goto err_ioremap; | 368 | goto err_ioremap; |
362 | } | 369 | } |
363 | 370 | ||
364 | clk_prepare_enable(t7l66xb->clk48m); | 371 | ret = clk_prepare_enable(t7l66xb->clk48m); |
372 | if (ret) | ||
373 | goto err_clk_enable; | ||
365 | 374 | ||
366 | if (pdata->enable) | 375 | if (pdata->enable) |
367 | pdata->enable(dev); | 376 | pdata->enable(dev); |
@@ -386,6 +395,8 @@ static int t7l66xb_probe(struct platform_device *dev) | |||
386 | return 0; | 395 | return 0; |
387 | 396 | ||
388 | t7l66xb_detach_irq(dev); | 397 | t7l66xb_detach_irq(dev); |
398 | clk_disable_unprepare(t7l66xb->clk48m); | ||
399 | err_clk_enable: | ||
389 | iounmap(t7l66xb->scr); | 400 | iounmap(t7l66xb->scr); |
390 | err_ioremap: | 401 | err_ioremap: |
391 | release_resource(&t7l66xb->rscr); | 402 | release_resource(&t7l66xb->rscr); |
diff --git a/drivers/mfd/tps6105x.c b/drivers/mfd/tps6105x.c index baa12ea666fb..187848c93779 100644 --- a/drivers/mfd/tps6105x.c +++ b/drivers/mfd/tps6105x.c | |||
@@ -173,9 +173,17 @@ static const struct i2c_device_id tps6105x_id[] = { | |||
173 | }; | 173 | }; |
174 | MODULE_DEVICE_TABLE(i2c, tps6105x_id); | 174 | MODULE_DEVICE_TABLE(i2c, tps6105x_id); |
175 | 175 | ||
176 | static const struct of_device_id tps6105x_of_match[] = { | ||
177 | { .compatible = "ti,tps61050" }, | ||
178 | { .compatible = "ti,tps61052" }, | ||
179 | { }, | ||
180 | }; | ||
181 | MODULE_DEVICE_TABLE(of, tps6105x_of_match); | ||
182 | |||
176 | static struct i2c_driver tps6105x_driver = { | 183 | static struct i2c_driver tps6105x_driver = { |
177 | .driver = { | 184 | .driver = { |
178 | .name = "tps6105x", | 185 | .name = "tps6105x", |
186 | .of_match_table = tps6105x_of_match, | ||
179 | }, | 187 | }, |
180 | .probe = tps6105x_probe, | 188 | .probe = tps6105x_probe, |
181 | .remove = tps6105x_remove, | 189 | .remove = tps6105x_remove, |
diff --git a/drivers/mfd/tps65010.c b/drivers/mfd/tps65010.c index d829a6131f09..2ab67386b4ef 100644 --- a/drivers/mfd/tps65010.c +++ b/drivers/mfd/tps65010.c | |||
@@ -32,7 +32,7 @@ | |||
32 | #include <linux/mutex.h> | 32 | #include <linux/mutex.h> |
33 | #include <linux/platform_device.h> | 33 | #include <linux/platform_device.h> |
34 | 34 | ||
35 | #include <linux/i2c/tps65010.h> | 35 | #include <linux/mfd/tps65010.h> |
36 | 36 | ||
37 | #include <linux/gpio/driver.h> | 37 | #include <linux/gpio/driver.h> |
38 | 38 | ||
diff --git a/drivers/mfd/tps68470.c b/drivers/mfd/tps68470.c new file mode 100644 index 000000000000..189efaea054c --- /dev/null +++ b/drivers/mfd/tps68470.c | |||
@@ -0,0 +1,106 @@ | |||
1 | /* | ||
2 | * TPS68470 chip Parent driver | ||
3 | * | ||
4 | * Copyright (C) 2017 Intel Corporation | ||
5 | * | ||
6 | * Authors: | ||
7 | * Rajmohan Mani <rajmohan.mani@intel.com> | ||
8 | * Tianshu Qiu <tian.shu.qiu@intel.com> | ||
9 | * Jian Xu Zheng <jian.xu.zheng@intel.com> | ||
10 | * Yuning Pu <yuning.pu@intel.com> | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or | ||
13 | * modify it under the terms of the GNU General Public License as | ||
14 | * published by the Free Software Foundation version 2. | ||
15 | * | ||
16 | * This program is distributed "as is" WITHOUT ANY WARRANTY of any | ||
17 | * kind, whether express or implied; without even the implied warranty | ||
18 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
19 | * GNU General Public License for more details. | ||
20 | */ | ||
21 | |||
22 | #include <linux/acpi.h> | ||
23 | #include <linux/delay.h> | ||
24 | #include <linux/i2c.h> | ||
25 | #include <linux/init.h> | ||
26 | #include <linux/mfd/core.h> | ||
27 | #include <linux/mfd/tps68470.h> | ||
28 | #include <linux/regmap.h> | ||
29 | |||
30 | static const struct mfd_cell tps68470s[] = { | ||
31 | { .name = "tps68470-gpio" }, | ||
32 | { .name = "tps68470_pmic_opregion" }, | ||
33 | }; | ||
34 | |||
35 | static const struct regmap_config tps68470_regmap_config = { | ||
36 | .reg_bits = 8, | ||
37 | .val_bits = 8, | ||
38 | .max_register = TPS68470_REG_MAX, | ||
39 | }; | ||
40 | |||
41 | static int tps68470_chip_init(struct device *dev, struct regmap *regmap) | ||
42 | { | ||
43 | unsigned int version; | ||
44 | int ret; | ||
45 | |||
46 | /* Force software reset */ | ||
47 | ret = regmap_write(regmap, TPS68470_REG_RESET, TPS68470_REG_RESET_MASK); | ||
48 | if (ret) | ||
49 | return ret; | ||
50 | |||
51 | ret = regmap_read(regmap, TPS68470_REG_REVID, &version); | ||
52 | if (ret) { | ||
53 | dev_err(dev, "Failed to read revision register: %d\n", ret); | ||
54 | return ret; | ||
55 | } | ||
56 | |||
57 | dev_info(dev, "TPS68470 REVID: 0x%x\n", version); | ||
58 | |||
59 | return 0; | ||
60 | } | ||
61 | |||
62 | static int tps68470_probe(struct i2c_client *client) | ||
63 | { | ||
64 | struct device *dev = &client->dev; | ||
65 | struct regmap *regmap; | ||
66 | int ret; | ||
67 | |||
68 | regmap = devm_regmap_init_i2c(client, &tps68470_regmap_config); | ||
69 | if (IS_ERR(regmap)) { | ||
70 | dev_err(dev, "devm_regmap_init_i2c Error %ld\n", | ||
71 | PTR_ERR(regmap)); | ||
72 | return PTR_ERR(regmap); | ||
73 | } | ||
74 | |||
75 | i2c_set_clientdata(client, regmap); | ||
76 | |||
77 | ret = tps68470_chip_init(dev, regmap); | ||
78 | if (ret < 0) { | ||
79 | dev_err(dev, "TPS68470 Init Error %d\n", ret); | ||
80 | return ret; | ||
81 | } | ||
82 | |||
83 | ret = devm_mfd_add_devices(dev, PLATFORM_DEVID_NONE, tps68470s, | ||
84 | ARRAY_SIZE(tps68470s), NULL, 0, NULL); | ||
85 | if (ret < 0) { | ||
86 | dev_err(dev, "devm_mfd_add_devices failed: %d\n", ret); | ||
87 | return ret; | ||
88 | } | ||
89 | |||
90 | return 0; | ||
91 | } | ||
92 | |||
93 | static const struct acpi_device_id tps68470_acpi_ids[] = { | ||
94 | {"INT3472"}, | ||
95 | {}, | ||
96 | }; | ||
97 | MODULE_DEVICE_TABLE(acpi, tps68470_acpi_ids); | ||
98 | |||
99 | static struct i2c_driver tps68470_driver = { | ||
100 | .driver = { | ||
101 | .name = "tps68470", | ||
102 | .acpi_match_table = tps68470_acpi_ids, | ||
103 | }, | ||
104 | .probe_new = tps68470_probe, | ||
105 | }; | ||
106 | builtin_i2c_driver(tps68470_driver); | ||
diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c index c64615dca2bd..d3133a371e27 100644 --- a/drivers/mfd/twl-core.c +++ b/drivers/mfd/twl-core.c | |||
@@ -44,7 +44,7 @@ | |||
44 | #include <linux/regulator/machine.h> | 44 | #include <linux/regulator/machine.h> |
45 | 45 | ||
46 | #include <linux/i2c.h> | 46 | #include <linux/i2c.h> |
47 | #include <linux/i2c/twl.h> | 47 | #include <linux/mfd/twl.h> |
48 | 48 | ||
49 | /* Register descriptions for audio */ | 49 | /* Register descriptions for audio */ |
50 | #include <linux/mfd/twl4030-audio.h> | 50 | #include <linux/mfd/twl4030-audio.h> |
@@ -173,7 +173,7 @@ static struct twl_private *twl_priv; | |||
173 | static struct twl_mapping twl4030_map[] = { | 173 | static struct twl_mapping twl4030_map[] = { |
174 | /* | 174 | /* |
175 | * NOTE: don't change this table without updating the | 175 | * NOTE: don't change this table without updating the |
176 | * <linux/i2c/twl.h> defines for TWL4030_MODULE_* | 176 | * <linux/mfd/twl.h> defines for TWL4030_MODULE_* |
177 | * so they continue to match the order in this table. | 177 | * so they continue to match the order in this table. |
178 | */ | 178 | */ |
179 | 179 | ||
@@ -344,7 +344,7 @@ static const struct regmap_config twl4030_regmap_config[4] = { | |||
344 | static struct twl_mapping twl6030_map[] = { | 344 | static struct twl_mapping twl6030_map[] = { |
345 | /* | 345 | /* |
346 | * NOTE: don't change this table without updating the | 346 | * NOTE: don't change this table without updating the |
347 | * <linux/i2c/twl.h> defines for TWL4030_MODULE_* | 347 | * <linux/mfd/twl.h> defines for TWL4030_MODULE_* |
348 | * so they continue to match the order in this table. | 348 | * so they continue to match the order in this table. |
349 | */ | 349 | */ |
350 | 350 | ||
@@ -448,7 +448,7 @@ static struct regmap *twl_get_regmap(u8 mod_no) | |||
448 | * @reg: register address (just offset will do) | 448 | * @reg: register address (just offset will do) |
449 | * @num_bytes: number of bytes to transfer | 449 | * @num_bytes: number of bytes to transfer |
450 | * | 450 | * |
451 | * Returns the result of operation - 0 is success | 451 | * Returns 0 on success or else a negative error code. |
452 | */ | 452 | */ |
453 | int twl_i2c_write(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes) | 453 | int twl_i2c_write(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes) |
454 | { | 454 | { |
@@ -476,7 +476,7 @@ EXPORT_SYMBOL(twl_i2c_write); | |||
476 | * @reg: register address (just offset will do) | 476 | * @reg: register address (just offset will do) |
477 | * @num_bytes: number of bytes to transfer | 477 | * @num_bytes: number of bytes to transfer |
478 | * | 478 | * |
479 | * Returns result of operation - num_bytes is success else failure. | 479 | * Returns 0 on success or else a negative error code. |
480 | */ | 480 | */ |
481 | int twl_i2c_read(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes) | 481 | int twl_i2c_read(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes) |
482 | { | 482 | { |
diff --git a/drivers/mfd/twl4030-audio.c b/drivers/mfd/twl4030-audio.c index 0a1606480023..da16bf45fab4 100644 --- a/drivers/mfd/twl4030-audio.c +++ b/drivers/mfd/twl4030-audio.c | |||
@@ -30,7 +30,7 @@ | |||
30 | #include <linux/platform_device.h> | 30 | #include <linux/platform_device.h> |
31 | #include <linux/of.h> | 31 | #include <linux/of.h> |
32 | #include <linux/of_platform.h> | 32 | #include <linux/of_platform.h> |
33 | #include <linux/i2c/twl.h> | 33 | #include <linux/mfd/twl.h> |
34 | #include <linux/mfd/core.h> | 34 | #include <linux/mfd/core.h> |
35 | #include <linux/mfd/twl4030-audio.h> | 35 | #include <linux/mfd/twl4030-audio.h> |
36 | 36 | ||
diff --git a/drivers/mfd/twl4030-irq.c b/drivers/mfd/twl4030-irq.c index 378c02d43bf7..b16c16f194fd 100644 --- a/drivers/mfd/twl4030-irq.c +++ b/drivers/mfd/twl4030-irq.c | |||
@@ -33,7 +33,7 @@ | |||
33 | #include <linux/slab.h> | 33 | #include <linux/slab.h> |
34 | #include <linux/of.h> | 34 | #include <linux/of.h> |
35 | #include <linux/irqdomain.h> | 35 | #include <linux/irqdomain.h> |
36 | #include <linux/i2c/twl.h> | 36 | #include <linux/mfd/twl.h> |
37 | 37 | ||
38 | #include "twl-core.h" | 38 | #include "twl-core.h" |
39 | 39 | ||
diff --git a/drivers/mfd/twl4030-power.c b/drivers/mfd/twl4030-power.c index f4b2c29d77e3..6b36932263ba 100644 --- a/drivers/mfd/twl4030-power.c +++ b/drivers/mfd/twl4030-power.c | |||
@@ -25,7 +25,7 @@ | |||
25 | 25 | ||
26 | #include <linux/module.h> | 26 | #include <linux/module.h> |
27 | #include <linux/pm.h> | 27 | #include <linux/pm.h> |
28 | #include <linux/i2c/twl.h> | 28 | #include <linux/mfd/twl.h> |
29 | #include <linux/platform_device.h> | 29 | #include <linux/platform_device.h> |
30 | #include <linux/of.h> | 30 | #include <linux/of.h> |
31 | #include <linux/of_device.h> | 31 | #include <linux/of_device.h> |
diff --git a/drivers/mfd/twl6030-irq.c b/drivers/mfd/twl6030-irq.c index 53574508a613..e3ec8dfa9f1e 100644 --- a/drivers/mfd/twl6030-irq.c +++ b/drivers/mfd/twl6030-irq.c | |||
@@ -35,7 +35,7 @@ | |||
35 | #include <linux/interrupt.h> | 35 | #include <linux/interrupt.h> |
36 | #include <linux/irq.h> | 36 | #include <linux/irq.h> |
37 | #include <linux/kthread.h> | 37 | #include <linux/kthread.h> |
38 | #include <linux/i2c/twl.h> | 38 | #include <linux/mfd/twl.h> |
39 | #include <linux/platform_device.h> | 39 | #include <linux/platform_device.h> |
40 | #include <linux/suspend.h> | 40 | #include <linux/suspend.h> |
41 | #include <linux/of.h> | 41 | #include <linux/of.h> |
diff --git a/drivers/mtd/nand/atmel/nand-controller.c b/drivers/mtd/nand/atmel/nand-controller.c index ceec21bd30c4..1913ce18fb1c 100644 --- a/drivers/mtd/nand/atmel/nand-controller.c +++ b/drivers/mtd/nand/atmel/nand-controller.c | |||
@@ -247,6 +247,7 @@ struct atmel_hsmc_nand_controller { | |||
247 | void __iomem *virt; | 247 | void __iomem *virt; |
248 | dma_addr_t dma; | 248 | dma_addr_t dma; |
249 | } sram; | 249 | } sram; |
250 | const struct atmel_hsmc_reg_layout *hsmc_layout; | ||
250 | struct regmap *io; | 251 | struct regmap *io; |
251 | struct atmel_nfc_op op; | 252 | struct atmel_nfc_op op; |
252 | struct completion complete; | 253 | struct completion complete; |
@@ -1442,12 +1443,12 @@ static int atmel_hsmc_nand_setup_data_interface(struct atmel_nand *nand, | |||
1442 | int csline, | 1443 | int csline, |
1443 | const struct nand_data_interface *conf) | 1444 | const struct nand_data_interface *conf) |
1444 | { | 1445 | { |
1445 | struct atmel_nand_controller *nc; | 1446 | struct atmel_hsmc_nand_controller *nc; |
1446 | struct atmel_smc_cs_conf smcconf; | 1447 | struct atmel_smc_cs_conf smcconf; |
1447 | struct atmel_nand_cs *cs; | 1448 | struct atmel_nand_cs *cs; |
1448 | int ret; | 1449 | int ret; |
1449 | 1450 | ||
1450 | nc = to_nand_controller(nand->base.controller); | 1451 | nc = to_hsmc_nand_controller(nand->base.controller); |
1451 | 1452 | ||
1452 | ret = atmel_smc_nand_prepare_smcconf(nand, conf, &smcconf); | 1453 | ret = atmel_smc_nand_prepare_smcconf(nand, conf, &smcconf); |
1453 | if (ret) | 1454 | if (ret) |
@@ -1462,7 +1463,8 @@ static int atmel_hsmc_nand_setup_data_interface(struct atmel_nand *nand, | |||
1462 | if (cs->rb.type == ATMEL_NAND_NATIVE_RB) | 1463 | if (cs->rb.type == ATMEL_NAND_NATIVE_RB) |
1463 | cs->smcconf.timings |= ATMEL_HSMC_TIMINGS_RBNSEL(cs->rb.id); | 1464 | cs->smcconf.timings |= ATMEL_HSMC_TIMINGS_RBNSEL(cs->rb.id); |
1464 | 1465 | ||
1465 | atmel_hsmc_cs_conf_apply(nc->smc, cs->id, &cs->smcconf); | 1466 | atmel_hsmc_cs_conf_apply(nc->base.smc, nc->hsmc_layout, cs->id, |
1467 | &cs->smcconf); | ||
1466 | 1468 | ||
1467 | return 0; | 1469 | return 0; |
1468 | } | 1470 | } |
@@ -2177,6 +2179,8 @@ atmel_hsmc_nand_controller_init(struct atmel_hsmc_nand_controller *nc) | |||
2177 | return -EINVAL; | 2179 | return -EINVAL; |
2178 | } | 2180 | } |
2179 | 2181 | ||
2182 | nc->hsmc_layout = atmel_hsmc_get_reg_layout(np); | ||
2183 | |||
2180 | nc->irq = of_irq_get(np, 0); | 2184 | nc->irq = of_irq_get(np, 0); |
2181 | of_node_put(np); | 2185 | of_node_put(np); |
2182 | if (nc->irq < 0) { | 2186 | if (nc->irq < 0) { |
diff --git a/drivers/phy/ti/phy-twl4030-usb.c b/drivers/phy/ti/phy-twl4030-usb.c index 0e9013868188..a44680d64f9b 100644 --- a/drivers/phy/ti/phy-twl4030-usb.c +++ b/drivers/phy/ti/phy-twl4030-usb.c | |||
@@ -36,7 +36,7 @@ | |||
36 | #include <linux/pm_runtime.h> | 36 | #include <linux/pm_runtime.h> |
37 | #include <linux/usb/musb.h> | 37 | #include <linux/usb/musb.h> |
38 | #include <linux/usb/ulpi.h> | 38 | #include <linux/usb/ulpi.h> |
39 | #include <linux/i2c/twl.h> | 39 | #include <linux/mfd/twl.h> |
40 | #include <linux/regulator/consumer.h> | 40 | #include <linux/regulator/consumer.h> |
41 | #include <linux/err.h> | 41 | #include <linux/err.h> |
42 | #include <linux/slab.h> | 42 | #include <linux/slab.h> |
diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig index 34ad10873452..1778cf4f81c7 100644 --- a/drivers/pinctrl/Kconfig +++ b/drivers/pinctrl/Kconfig | |||
@@ -338,6 +338,15 @@ config PINCTRL_INGENIC | |||
338 | select GENERIC_PINMUX_FUNCTIONS | 338 | select GENERIC_PINMUX_FUNCTIONS |
339 | select REGMAP_MMIO | 339 | select REGMAP_MMIO |
340 | 340 | ||
341 | config PINCTRL_RK805 | ||
342 | tristate "Pinctrl and GPIO driver for RK805 PMIC" | ||
343 | depends on MFD_RK808 | ||
344 | select GPIOLIB | ||
345 | select PINMUX | ||
346 | select GENERIC_PINCONF | ||
347 | help | ||
348 | This selects the pinctrl driver for RK805. | ||
349 | |||
341 | source "drivers/pinctrl/aspeed/Kconfig" | 350 | source "drivers/pinctrl/aspeed/Kconfig" |
342 | source "drivers/pinctrl/bcm/Kconfig" | 351 | source "drivers/pinctrl/bcm/Kconfig" |
343 | source "drivers/pinctrl/berlin/Kconfig" | 352 | source "drivers/pinctrl/berlin/Kconfig" |
diff --git a/drivers/pinctrl/Makefile b/drivers/pinctrl/Makefile index 4c44703ac97f..c16e27900dbb 100644 --- a/drivers/pinctrl/Makefile +++ b/drivers/pinctrl/Makefile | |||
@@ -43,6 +43,7 @@ obj-$(CONFIG_PINCTRL_TB10X) += pinctrl-tb10x.o | |||
43 | obj-$(CONFIG_PINCTRL_ST) += pinctrl-st.o | 43 | obj-$(CONFIG_PINCTRL_ST) += pinctrl-st.o |
44 | obj-$(CONFIG_PINCTRL_ZYNQ) += pinctrl-zynq.o | 44 | obj-$(CONFIG_PINCTRL_ZYNQ) += pinctrl-zynq.o |
45 | obj-$(CONFIG_PINCTRL_INGENIC) += pinctrl-ingenic.o | 45 | obj-$(CONFIG_PINCTRL_INGENIC) += pinctrl-ingenic.o |
46 | obj-$(CONFIG_PINCTRL_RK805) += pinctrl-rk805.o | ||
46 | 47 | ||
47 | obj-$(CONFIG_ARCH_ASPEED) += aspeed/ | 48 | obj-$(CONFIG_ARCH_ASPEED) += aspeed/ |
48 | obj-y += bcm/ | 49 | obj-y += bcm/ |
diff --git a/drivers/pinctrl/pinctrl-rk805.c b/drivers/pinctrl/pinctrl-rk805.c new file mode 100644 index 000000000000..b0bfd3082a1b --- /dev/null +++ b/drivers/pinctrl/pinctrl-rk805.c | |||
@@ -0,0 +1,493 @@ | |||
1 | /* | ||
2 | * Pinctrl driver for Rockchip RK805 PMIC | ||
3 | * | ||
4 | * Copyright (c) 2017, Fuzhou Rockchip Electronics Co., Ltd | ||
5 | * | ||
6 | * Author: Joseph Chen <chenjh@rock-chips.com> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License as published by the | ||
10 | * Free Software Foundation; either version 2 of the License, or (at your | ||
11 | * option) any later version. | ||
12 | * | ||
13 | * Based on the pinctrl-as3722 driver | ||
14 | */ | ||
15 | |||
16 | #include <linux/gpio/driver.h> | ||
17 | #include <linux/kernel.h> | ||
18 | #include <linux/module.h> | ||
19 | #include <linux/mfd/rk808.h> | ||
20 | #include <linux/of.h> | ||
21 | #include <linux/of_device.h> | ||
22 | #include <linux/platform_device.h> | ||
23 | #include <linux/pinctrl/consumer.h> | ||
24 | #include <linux/pinctrl/machine.h> | ||
25 | #include <linux/pinctrl/pinctrl.h> | ||
26 | #include <linux/pinctrl/pinconf-generic.h> | ||
27 | #include <linux/pinctrl/pinconf.h> | ||
28 | #include <linux/pinctrl/pinmux.h> | ||
29 | #include <linux/pm.h> | ||
30 | #include <linux/slab.h> | ||
31 | |||
32 | #include "core.h" | ||
33 | #include "pinconf.h" | ||
34 | #include "pinctrl-utils.h" | ||
35 | |||
36 | struct rk805_pin_function { | ||
37 | const char *name; | ||
38 | const char *const *groups; | ||
39 | unsigned int ngroups; | ||
40 | int mux_option; | ||
41 | }; | ||
42 | |||
43 | struct rk805_pin_group { | ||
44 | const char *name; | ||
45 | const unsigned int pins[1]; | ||
46 | unsigned int npins; | ||
47 | }; | ||
48 | |||
49 | /* | ||
50 | * @reg: gpio setting register; | ||
51 | * @fun_mask: functions select mask value, when set is gpio; | ||
52 | * @dir_mask: input or output mask value, when set is output, otherwise input; | ||
53 | * @val_mask: gpio set value, when set is level high, otherwise low; | ||
54 | * | ||
55 | * Different PMIC has different pin features, belowing 3 mask members are not | ||
56 | * all necessary for every PMIC. For example, RK805 has 2 pins that can be used | ||
57 | * as output only GPIOs, so func_mask and dir_mask are not needed. RK816 has 1 | ||
58 | * pin that can be used as TS/GPIO, so fun_mask, dir_mask and val_mask are all | ||
59 | * necessary. | ||
60 | */ | ||
61 | struct rk805_pin_config { | ||
62 | u8 reg; | ||
63 | u8 fun_msk; | ||
64 | u8 dir_msk; | ||
65 | u8 val_msk; | ||
66 | }; | ||
67 | |||
68 | struct rk805_pctrl_info { | ||
69 | struct rk808 *rk808; | ||
70 | struct device *dev; | ||
71 | struct pinctrl_dev *pctl; | ||
72 | struct gpio_chip gpio_chip; | ||
73 | struct pinctrl_desc pinctrl_desc; | ||
74 | const struct rk805_pin_function *functions; | ||
75 | unsigned int num_functions; | ||
76 | const struct rk805_pin_group *groups; | ||
77 | int num_pin_groups; | ||
78 | const struct pinctrl_pin_desc *pins; | ||
79 | unsigned int num_pins; | ||
80 | struct rk805_pin_config *pin_cfg; | ||
81 | }; | ||
82 | |||
83 | enum rk805_pinmux_option { | ||
84 | RK805_PINMUX_GPIO, | ||
85 | }; | ||
86 | |||
87 | enum { | ||
88 | RK805_GPIO0, | ||
89 | RK805_GPIO1, | ||
90 | }; | ||
91 | |||
92 | static const char *const rk805_gpio_groups[] = { | ||
93 | "gpio0", | ||
94 | "gpio1", | ||
95 | }; | ||
96 | |||
97 | /* RK805: 2 output only GPIOs */ | ||
98 | static const struct pinctrl_pin_desc rk805_pins_desc[] = { | ||
99 | PINCTRL_PIN(RK805_GPIO0, "gpio0"), | ||
100 | PINCTRL_PIN(RK805_GPIO1, "gpio1"), | ||
101 | }; | ||
102 | |||
103 | static const struct rk805_pin_function rk805_pin_functions[] = { | ||
104 | { | ||
105 | .name = "gpio", | ||
106 | .groups = rk805_gpio_groups, | ||
107 | .ngroups = ARRAY_SIZE(rk805_gpio_groups), | ||
108 | .mux_option = RK805_PINMUX_GPIO, | ||
109 | }, | ||
110 | }; | ||
111 | |||
112 | static const struct rk805_pin_group rk805_pin_groups[] = { | ||
113 | { | ||
114 | .name = "gpio0", | ||
115 | .pins = { RK805_GPIO0 }, | ||
116 | .npins = 1, | ||
117 | }, | ||
118 | { | ||
119 | .name = "gpio1", | ||
120 | .pins = { RK805_GPIO1 }, | ||
121 | .npins = 1, | ||
122 | }, | ||
123 | }; | ||
124 | |||
125 | #define RK805_GPIO0_VAL_MSK BIT(0) | ||
126 | #define RK805_GPIO1_VAL_MSK BIT(1) | ||
127 | |||
128 | static struct rk805_pin_config rk805_gpio_cfgs[] = { | ||
129 | { | ||
130 | .reg = RK805_OUT_REG, | ||
131 | .val_msk = RK805_GPIO0_VAL_MSK, | ||
132 | }, | ||
133 | { | ||
134 | .reg = RK805_OUT_REG, | ||
135 | .val_msk = RK805_GPIO1_VAL_MSK, | ||
136 | }, | ||
137 | }; | ||
138 | |||
139 | /* generic gpio chip */ | ||
140 | static int rk805_gpio_get(struct gpio_chip *chip, unsigned int offset) | ||
141 | { | ||
142 | struct rk805_pctrl_info *pci = gpiochip_get_data(chip); | ||
143 | int ret, val; | ||
144 | |||
145 | ret = regmap_read(pci->rk808->regmap, pci->pin_cfg[offset].reg, &val); | ||
146 | if (ret) { | ||
147 | dev_err(pci->dev, "get gpio%d value failed\n", offset); | ||
148 | return ret; | ||
149 | } | ||
150 | |||
151 | return !!(val & pci->pin_cfg[offset].val_msk); | ||
152 | } | ||
153 | |||
154 | static void rk805_gpio_set(struct gpio_chip *chip, | ||
155 | unsigned int offset, | ||
156 | int value) | ||
157 | { | ||
158 | struct rk805_pctrl_info *pci = gpiochip_get_data(chip); | ||
159 | int ret; | ||
160 | |||
161 | ret = regmap_update_bits(pci->rk808->regmap, | ||
162 | pci->pin_cfg[offset].reg, | ||
163 | pci->pin_cfg[offset].val_msk, | ||
164 | value ? pci->pin_cfg[offset].val_msk : 0); | ||
165 | if (ret) | ||
166 | dev_err(pci->dev, "set gpio%d value %d failed\n", | ||
167 | offset, value); | ||
168 | } | ||
169 | |||
170 | static int rk805_gpio_direction_input(struct gpio_chip *chip, | ||
171 | unsigned int offset) | ||
172 | { | ||
173 | return pinctrl_gpio_direction_input(chip->base + offset); | ||
174 | } | ||
175 | |||
176 | static int rk805_gpio_direction_output(struct gpio_chip *chip, | ||
177 | unsigned int offset, int value) | ||
178 | { | ||
179 | rk805_gpio_set(chip, offset, value); | ||
180 | return pinctrl_gpio_direction_output(chip->base + offset); | ||
181 | } | ||
182 | |||
183 | static int rk805_gpio_get_direction(struct gpio_chip *chip, unsigned int offset) | ||
184 | { | ||
185 | struct rk805_pctrl_info *pci = gpiochip_get_data(chip); | ||
186 | unsigned int val; | ||
187 | int ret; | ||
188 | |||
189 | /* default output*/ | ||
190 | if (!pci->pin_cfg[offset].dir_msk) | ||
191 | return 0; | ||
192 | |||
193 | ret = regmap_read(pci->rk808->regmap, | ||
194 | pci->pin_cfg[offset].reg, | ||
195 | &val); | ||
196 | if (ret) { | ||
197 | dev_err(pci->dev, "get gpio%d direction failed\n", offset); | ||
198 | return ret; | ||
199 | } | ||
200 | |||
201 | return !(val & pci->pin_cfg[offset].dir_msk); | ||
202 | } | ||
203 | |||
204 | static struct gpio_chip rk805_gpio_chip = { | ||
205 | .label = "rk805-gpio", | ||
206 | .request = gpiochip_generic_request, | ||
207 | .free = gpiochip_generic_free, | ||
208 | .get_direction = rk805_gpio_get_direction, | ||
209 | .get = rk805_gpio_get, | ||
210 | .set = rk805_gpio_set, | ||
211 | .direction_input = rk805_gpio_direction_input, | ||
212 | .direction_output = rk805_gpio_direction_output, | ||
213 | .can_sleep = true, | ||
214 | .base = -1, | ||
215 | .owner = THIS_MODULE, | ||
216 | }; | ||
217 | |||
218 | /* generic pinctrl */ | ||
219 | static int rk805_pinctrl_get_groups_count(struct pinctrl_dev *pctldev) | ||
220 | { | ||
221 | struct rk805_pctrl_info *pci = pinctrl_dev_get_drvdata(pctldev); | ||
222 | |||
223 | return pci->num_pin_groups; | ||
224 | } | ||
225 | |||
226 | static const char *rk805_pinctrl_get_group_name(struct pinctrl_dev *pctldev, | ||
227 | unsigned int group) | ||
228 | { | ||
229 | struct rk805_pctrl_info *pci = pinctrl_dev_get_drvdata(pctldev); | ||
230 | |||
231 | return pci->groups[group].name; | ||
232 | } | ||
233 | |||
234 | static int rk805_pinctrl_get_group_pins(struct pinctrl_dev *pctldev, | ||
235 | unsigned int group, | ||
236 | const unsigned int **pins, | ||
237 | unsigned int *num_pins) | ||
238 | { | ||
239 | struct rk805_pctrl_info *pci = pinctrl_dev_get_drvdata(pctldev); | ||
240 | |||
241 | *pins = pci->groups[group].pins; | ||
242 | *num_pins = pci->groups[group].npins; | ||
243 | |||
244 | return 0; | ||
245 | } | ||
246 | |||
247 | static const struct pinctrl_ops rk805_pinctrl_ops = { | ||
248 | .get_groups_count = rk805_pinctrl_get_groups_count, | ||
249 | .get_group_name = rk805_pinctrl_get_group_name, | ||
250 | .get_group_pins = rk805_pinctrl_get_group_pins, | ||
251 | .dt_node_to_map = pinconf_generic_dt_node_to_map_pin, | ||
252 | .dt_free_map = pinctrl_utils_free_map, | ||
253 | }; | ||
254 | |||
255 | static int rk805_pinctrl_get_funcs_count(struct pinctrl_dev *pctldev) | ||
256 | { | ||
257 | struct rk805_pctrl_info *pci = pinctrl_dev_get_drvdata(pctldev); | ||
258 | |||
259 | return pci->num_functions; | ||
260 | } | ||
261 | |||
262 | static const char *rk805_pinctrl_get_func_name(struct pinctrl_dev *pctldev, | ||
263 | unsigned int function) | ||
264 | { | ||
265 | struct rk805_pctrl_info *pci = pinctrl_dev_get_drvdata(pctldev); | ||
266 | |||
267 | return pci->functions[function].name; | ||
268 | } | ||
269 | |||
270 | static int rk805_pinctrl_get_func_groups(struct pinctrl_dev *pctldev, | ||
271 | unsigned int function, | ||
272 | const char *const **groups, | ||
273 | unsigned int *const num_groups) | ||
274 | { | ||
275 | struct rk805_pctrl_info *pci = pinctrl_dev_get_drvdata(pctldev); | ||
276 | |||
277 | *groups = pci->functions[function].groups; | ||
278 | *num_groups = pci->functions[function].ngroups; | ||
279 | |||
280 | return 0; | ||
281 | } | ||
282 | |||
283 | static int _rk805_pinctrl_set_mux(struct pinctrl_dev *pctldev, | ||
284 | unsigned int offset, | ||
285 | int mux) | ||
286 | { | ||
287 | struct rk805_pctrl_info *pci = pinctrl_dev_get_drvdata(pctldev); | ||
288 | int ret; | ||
289 | |||
290 | if (!pci->pin_cfg[offset].fun_msk) | ||
291 | return 0; | ||
292 | |||
293 | if (mux == RK805_PINMUX_GPIO) { | ||
294 | ret = regmap_update_bits(pci->rk808->regmap, | ||
295 | pci->pin_cfg[offset].reg, | ||
296 | pci->pin_cfg[offset].fun_msk, | ||
297 | pci->pin_cfg[offset].fun_msk); | ||
298 | if (ret) { | ||
299 | dev_err(pci->dev, "set gpio%d GPIO failed\n", offset); | ||
300 | return ret; | ||
301 | } | ||
302 | } else { | ||
303 | dev_err(pci->dev, "Couldn't find function mux %d\n", mux); | ||
304 | return -EINVAL; | ||
305 | } | ||
306 | |||
307 | return 0; | ||
308 | } | ||
309 | |||
310 | static int rk805_pinctrl_set_mux(struct pinctrl_dev *pctldev, | ||
311 | unsigned int function, | ||
312 | unsigned int group) | ||
313 | { | ||
314 | struct rk805_pctrl_info *pci = pinctrl_dev_get_drvdata(pctldev); | ||
315 | int mux = pci->functions[function].mux_option; | ||
316 | int offset = group; | ||
317 | |||
318 | return _rk805_pinctrl_set_mux(pctldev, offset, mux); | ||
319 | } | ||
320 | |||
321 | static int rk805_pmx_gpio_set_direction(struct pinctrl_dev *pctldev, | ||
322 | struct pinctrl_gpio_range *range, | ||
323 | unsigned int offset, bool input) | ||
324 | { | ||
325 | struct rk805_pctrl_info *pci = pinctrl_dev_get_drvdata(pctldev); | ||
326 | int ret; | ||
327 | |||
328 | /* switch to gpio function */ | ||
329 | ret = _rk805_pinctrl_set_mux(pctldev, offset, RK805_PINMUX_GPIO); | ||
330 | if (ret) { | ||
331 | dev_err(pci->dev, "set gpio%d mux failed\n", offset); | ||
332 | return ret; | ||
333 | } | ||
334 | |||
335 | /* set direction */ | ||
336 | if (!pci->pin_cfg[offset].dir_msk) | ||
337 | return 0; | ||
338 | |||
339 | ret = regmap_update_bits(pci->rk808->regmap, | ||
340 | pci->pin_cfg[offset].reg, | ||
341 | pci->pin_cfg[offset].dir_msk, | ||
342 | input ? 0 : pci->pin_cfg[offset].dir_msk); | ||
343 | if (ret) { | ||
344 | dev_err(pci->dev, "set gpio%d direction failed\n", offset); | ||
345 | return ret; | ||
346 | } | ||
347 | |||
348 | return ret; | ||
349 | } | ||
350 | |||
351 | static const struct pinmux_ops rk805_pinmux_ops = { | ||
352 | .get_functions_count = rk805_pinctrl_get_funcs_count, | ||
353 | .get_function_name = rk805_pinctrl_get_func_name, | ||
354 | .get_function_groups = rk805_pinctrl_get_func_groups, | ||
355 | .set_mux = rk805_pinctrl_set_mux, | ||
356 | .gpio_set_direction = rk805_pmx_gpio_set_direction, | ||
357 | }; | ||
358 | |||
359 | static int rk805_pinconf_get(struct pinctrl_dev *pctldev, | ||
360 | unsigned int pin, unsigned long *config) | ||
361 | { | ||
362 | struct rk805_pctrl_info *pci = pinctrl_dev_get_drvdata(pctldev); | ||
363 | enum pin_config_param param = pinconf_to_config_param(*config); | ||
364 | u32 arg = 0; | ||
365 | |||
366 | switch (param) { | ||
367 | case PIN_CONFIG_OUTPUT: | ||
368 | arg = rk805_gpio_get(&pci->gpio_chip, pin); | ||
369 | break; | ||
370 | default: | ||
371 | dev_err(pci->dev, "Properties not supported\n"); | ||
372 | return -ENOTSUPP; | ||
373 | } | ||
374 | |||
375 | *config = pinconf_to_config_packed(param, (u16)arg); | ||
376 | |||
377 | return 0; | ||
378 | } | ||
379 | |||
380 | static int rk805_pinconf_set(struct pinctrl_dev *pctldev, | ||
381 | unsigned int pin, unsigned long *configs, | ||
382 | unsigned int num_configs) | ||
383 | { | ||
384 | struct rk805_pctrl_info *pci = pinctrl_dev_get_drvdata(pctldev); | ||
385 | enum pin_config_param param; | ||
386 | u32 i, arg = 0; | ||
387 | |||
388 | for (i = 0; i < num_configs; i++) { | ||
389 | param = pinconf_to_config_param(configs[i]); | ||
390 | arg = pinconf_to_config_argument(configs[i]); | ||
391 | |||
392 | switch (param) { | ||
393 | case PIN_CONFIG_OUTPUT: | ||
394 | rk805_gpio_set(&pci->gpio_chip, pin, arg); | ||
395 | rk805_pmx_gpio_set_direction(pctldev, NULL, pin, false); | ||
396 | break; | ||
397 | default: | ||
398 | dev_err(pci->dev, "Properties not supported\n"); | ||
399 | return -ENOTSUPP; | ||
400 | } | ||
401 | } | ||
402 | |||
403 | return 0; | ||
404 | } | ||
405 | |||
406 | static const struct pinconf_ops rk805_pinconf_ops = { | ||
407 | .pin_config_get = rk805_pinconf_get, | ||
408 | .pin_config_set = rk805_pinconf_set, | ||
409 | }; | ||
410 | |||
411 | static struct pinctrl_desc rk805_pinctrl_desc = { | ||
412 | .name = "rk805-pinctrl", | ||
413 | .pctlops = &rk805_pinctrl_ops, | ||
414 | .pmxops = &rk805_pinmux_ops, | ||
415 | .confops = &rk805_pinconf_ops, | ||
416 | .owner = THIS_MODULE, | ||
417 | }; | ||
418 | |||
419 | static int rk805_pinctrl_probe(struct platform_device *pdev) | ||
420 | { | ||
421 | struct rk805_pctrl_info *pci; | ||
422 | int ret; | ||
423 | |||
424 | pci = devm_kzalloc(&pdev->dev, sizeof(*pci), GFP_KERNEL); | ||
425 | if (!pci) | ||
426 | return -ENOMEM; | ||
427 | |||
428 | pci->dev = &pdev->dev; | ||
429 | pci->dev->of_node = pdev->dev.parent->of_node; | ||
430 | pci->rk808 = dev_get_drvdata(pdev->dev.parent); | ||
431 | |||
432 | pci->pinctrl_desc = rk805_pinctrl_desc; | ||
433 | pci->gpio_chip = rk805_gpio_chip; | ||
434 | pci->gpio_chip.parent = &pdev->dev; | ||
435 | pci->gpio_chip.of_node = pdev->dev.parent->of_node; | ||
436 | |||
437 | platform_set_drvdata(pdev, pci); | ||
438 | |||
439 | switch (pci->rk808->variant) { | ||
440 | case RK805_ID: | ||
441 | pci->pins = rk805_pins_desc; | ||
442 | pci->num_pins = ARRAY_SIZE(rk805_pins_desc); | ||
443 | pci->functions = rk805_pin_functions; | ||
444 | pci->num_functions = ARRAY_SIZE(rk805_pin_functions); | ||
445 | pci->groups = rk805_pin_groups; | ||
446 | pci->num_pin_groups = ARRAY_SIZE(rk805_pin_groups); | ||
447 | pci->pinctrl_desc.pins = rk805_pins_desc; | ||
448 | pci->pinctrl_desc.npins = ARRAY_SIZE(rk805_pins_desc); | ||
449 | pci->pin_cfg = rk805_gpio_cfgs; | ||
450 | pci->gpio_chip.ngpio = ARRAY_SIZE(rk805_gpio_cfgs); | ||
451 | break; | ||
452 | default: | ||
453 | dev_err(&pdev->dev, "unsupported RK805 ID %lu\n", | ||
454 | pci->rk808->variant); | ||
455 | return -EINVAL; | ||
456 | } | ||
457 | |||
458 | /* Add gpio chip */ | ||
459 | ret = devm_gpiochip_add_data(&pdev->dev, &pci->gpio_chip, pci); | ||
460 | if (ret < 0) { | ||
461 | dev_err(&pdev->dev, "Couldn't add gpiochip\n"); | ||
462 | return ret; | ||
463 | } | ||
464 | |||
465 | /* Add pinctrl */ | ||
466 | pci->pctl = devm_pinctrl_register(&pdev->dev, &pci->pinctrl_desc, pci); | ||
467 | if (IS_ERR(pci->pctl)) { | ||
468 | dev_err(&pdev->dev, "Couldn't add pinctrl\n"); | ||
469 | return PTR_ERR(pci->pctl); | ||
470 | } | ||
471 | |||
472 | /* Add pin range */ | ||
473 | ret = gpiochip_add_pin_range(&pci->gpio_chip, dev_name(&pdev->dev), | ||
474 | 0, 0, pci->gpio_chip.ngpio); | ||
475 | if (ret < 0) { | ||
476 | dev_err(&pdev->dev, "Couldn't add gpiochip pin range\n"); | ||
477 | return ret; | ||
478 | } | ||
479 | |||
480 | return 0; | ||
481 | } | ||
482 | |||
483 | static struct platform_driver rk805_pinctrl_driver = { | ||
484 | .probe = rk805_pinctrl_probe, | ||
485 | .driver = { | ||
486 | .name = "rk805-pinctrl", | ||
487 | }, | ||
488 | }; | ||
489 | module_platform_driver(rk805_pinctrl_driver); | ||
490 | |||
491 | MODULE_DESCRIPTION("RK805 pin control and GPIO driver"); | ||
492 | MODULE_AUTHOR("Joseph Chen <chenjh@rock-chips.com>"); | ||
493 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/power/supply/twl4030_charger.c b/drivers/power/supply/twl4030_charger.c index 9dff1b4b85fc..a5915f498eea 100644 --- a/drivers/power/supply/twl4030_charger.c +++ b/drivers/power/supply/twl4030_charger.c | |||
@@ -18,7 +18,7 @@ | |||
18 | #include <linux/err.h> | 18 | #include <linux/err.h> |
19 | #include <linux/platform_device.h> | 19 | #include <linux/platform_device.h> |
20 | #include <linux/interrupt.h> | 20 | #include <linux/interrupt.h> |
21 | #include <linux/i2c/twl.h> | 21 | #include <linux/mfd/twl.h> |
22 | #include <linux/power_supply.h> | 22 | #include <linux/power_supply.h> |
23 | #include <linux/notifier.h> | 23 | #include <linux/notifier.h> |
24 | #include <linux/usb/otg.h> | 24 | #include <linux/usb/otg.h> |
diff --git a/drivers/pwm/Kconfig b/drivers/pwm/Kconfig index 313c10789ca2..7cb982b54c8c 100644 --- a/drivers/pwm/Kconfig +++ b/drivers/pwm/Kconfig | |||
@@ -417,6 +417,16 @@ config PWM_STM32 | |||
417 | To compile this driver as a module, choose M here: the module | 417 | To compile this driver as a module, choose M here: the module |
418 | will be called pwm-stm32. | 418 | will be called pwm-stm32. |
419 | 419 | ||
420 | config PWM_STM32_LP | ||
421 | tristate "STMicroelectronics STM32 PWM LP" | ||
422 | depends on MFD_STM32_LPTIMER || COMPILE_TEST | ||
423 | help | ||
424 | Generic PWM framework driver for STMicroelectronics STM32 SoCs | ||
425 | with Low-Power Timer (LPTIM). | ||
426 | |||
427 | To compile this driver as a module, choose M here: the module | ||
428 | will be called pwm-stm32-lp. | ||
429 | |||
420 | config PWM_STMPE | 430 | config PWM_STMPE |
421 | bool "STMPE expander PWM export" | 431 | bool "STMPE expander PWM export" |
422 | depends on MFD_STMPE | 432 | depends on MFD_STMPE |
diff --git a/drivers/pwm/Makefile b/drivers/pwm/Makefile index 93da1f79a3b8..a3a4beef6daa 100644 --- a/drivers/pwm/Makefile +++ b/drivers/pwm/Makefile | |||
@@ -40,6 +40,7 @@ obj-$(CONFIG_PWM_SAMSUNG) += pwm-samsung.o | |||
40 | obj-$(CONFIG_PWM_SPEAR) += pwm-spear.o | 40 | obj-$(CONFIG_PWM_SPEAR) += pwm-spear.o |
41 | obj-$(CONFIG_PWM_STI) += pwm-sti.o | 41 | obj-$(CONFIG_PWM_STI) += pwm-sti.o |
42 | obj-$(CONFIG_PWM_STM32) += pwm-stm32.o | 42 | obj-$(CONFIG_PWM_STM32) += pwm-stm32.o |
43 | obj-$(CONFIG_PWM_STM32_LP) += pwm-stm32-lp.o | ||
43 | obj-$(CONFIG_PWM_STMPE) += pwm-stmpe.o | 44 | obj-$(CONFIG_PWM_STMPE) += pwm-stmpe.o |
44 | obj-$(CONFIG_PWM_SUN4I) += pwm-sun4i.o | 45 | obj-$(CONFIG_PWM_SUN4I) += pwm-sun4i.o |
45 | obj-$(CONFIG_PWM_TEGRA) += pwm-tegra.o | 46 | obj-$(CONFIG_PWM_TEGRA) += pwm-tegra.o |
diff --git a/drivers/pwm/pwm-stm32-lp.c b/drivers/pwm/pwm-stm32-lp.c new file mode 100644 index 000000000000..9793b296108f --- /dev/null +++ b/drivers/pwm/pwm-stm32-lp.c | |||
@@ -0,0 +1,246 @@ | |||
1 | /* | ||
2 | * STM32 Low-Power Timer PWM driver | ||
3 | * | ||
4 | * Copyright (C) STMicroelectronics 2017 | ||
5 | * | ||
6 | * Author: Gerald Baeza <gerald.baeza@st.com> | ||
7 | * | ||
8 | * License terms: GNU General Public License (GPL), version 2 | ||
9 | * | ||
10 | * Inspired by Gerald Baeza's pwm-stm32 driver | ||
11 | */ | ||
12 | |||
13 | #include <linux/bitfield.h> | ||
14 | #include <linux/mfd/stm32-lptimer.h> | ||
15 | #include <linux/module.h> | ||
16 | #include <linux/of.h> | ||
17 | #include <linux/platform_device.h> | ||
18 | #include <linux/pwm.h> | ||
19 | |||
20 | struct stm32_pwm_lp { | ||
21 | struct pwm_chip chip; | ||
22 | struct clk *clk; | ||
23 | struct regmap *regmap; | ||
24 | }; | ||
25 | |||
26 | static inline struct stm32_pwm_lp *to_stm32_pwm_lp(struct pwm_chip *chip) | ||
27 | { | ||
28 | return container_of(chip, struct stm32_pwm_lp, chip); | ||
29 | } | ||
30 | |||
31 | /* STM32 Low-Power Timer is preceded by a configurable power-of-2 prescaler */ | ||
32 | #define STM32_LPTIM_MAX_PRESCALER 128 | ||
33 | |||
34 | static int stm32_pwm_lp_apply(struct pwm_chip *chip, struct pwm_device *pwm, | ||
35 | struct pwm_state *state) | ||
36 | { | ||
37 | struct stm32_pwm_lp *priv = to_stm32_pwm_lp(chip); | ||
38 | unsigned long long prd, div, dty; | ||
39 | struct pwm_state cstate; | ||
40 | u32 val, mask, cfgr, presc = 0; | ||
41 | bool reenable; | ||
42 | int ret; | ||
43 | |||
44 | pwm_get_state(pwm, &cstate); | ||
45 | reenable = !cstate.enabled; | ||
46 | |||
47 | if (!state->enabled) { | ||
48 | if (cstate.enabled) { | ||
49 | /* Disable LP timer */ | ||
50 | ret = regmap_write(priv->regmap, STM32_LPTIM_CR, 0); | ||
51 | if (ret) | ||
52 | return ret; | ||
53 | /* disable clock to PWM counter */ | ||
54 | clk_disable(priv->clk); | ||
55 | } | ||
56 | return 0; | ||
57 | } | ||
58 | |||
59 | /* Calculate the period and prescaler value */ | ||
60 | div = (unsigned long long)clk_get_rate(priv->clk) * state->period; | ||
61 | do_div(div, NSEC_PER_SEC); | ||
62 | prd = div; | ||
63 | while (div > STM32_LPTIM_MAX_ARR) { | ||
64 | presc++; | ||
65 | if ((1 << presc) > STM32_LPTIM_MAX_PRESCALER) { | ||
66 | dev_err(priv->chip.dev, "max prescaler exceeded\n"); | ||
67 | return -EINVAL; | ||
68 | } | ||
69 | div = prd >> presc; | ||
70 | } | ||
71 | prd = div; | ||
72 | |||
73 | /* Calculate the duty cycle */ | ||
74 | dty = prd * state->duty_cycle; | ||
75 | do_div(dty, state->period); | ||
76 | |||
77 | if (!cstate.enabled) { | ||
78 | /* enable clock to drive PWM counter */ | ||
79 | ret = clk_enable(priv->clk); | ||
80 | if (ret) | ||
81 | return ret; | ||
82 | } | ||
83 | |||
84 | ret = regmap_read(priv->regmap, STM32_LPTIM_CFGR, &cfgr); | ||
85 | if (ret) | ||
86 | goto err; | ||
87 | |||
88 | if ((FIELD_GET(STM32_LPTIM_PRESC, cfgr) != presc) || | ||
89 | (FIELD_GET(STM32_LPTIM_WAVPOL, cfgr) != state->polarity)) { | ||
90 | val = FIELD_PREP(STM32_LPTIM_PRESC, presc); | ||
91 | val |= FIELD_PREP(STM32_LPTIM_WAVPOL, state->polarity); | ||
92 | mask = STM32_LPTIM_PRESC | STM32_LPTIM_WAVPOL; | ||
93 | |||
94 | /* Must disable LP timer to modify CFGR */ | ||
95 | reenable = true; | ||
96 | ret = regmap_write(priv->regmap, STM32_LPTIM_CR, 0); | ||
97 | if (ret) | ||
98 | goto err; | ||
99 | |||
100 | ret = regmap_update_bits(priv->regmap, STM32_LPTIM_CFGR, mask, | ||
101 | val); | ||
102 | if (ret) | ||
103 | goto err; | ||
104 | } | ||
105 | |||
106 | if (reenable) { | ||
107 | /* Must (re)enable LP timer to modify CMP & ARR */ | ||
108 | ret = regmap_write(priv->regmap, STM32_LPTIM_CR, | ||
109 | STM32_LPTIM_ENABLE); | ||
110 | if (ret) | ||
111 | goto err; | ||
112 | } | ||
113 | |||
114 | ret = regmap_write(priv->regmap, STM32_LPTIM_ARR, prd - 1); | ||
115 | if (ret) | ||
116 | goto err; | ||
117 | |||
118 | ret = regmap_write(priv->regmap, STM32_LPTIM_CMP, prd - (1 + dty)); | ||
119 | if (ret) | ||
120 | goto err; | ||
121 | |||
122 | /* ensure CMP & ARR registers are properly written */ | ||
123 | ret = regmap_read_poll_timeout(priv->regmap, STM32_LPTIM_ISR, val, | ||
124 | (val & STM32_LPTIM_CMPOK_ARROK), | ||
125 | 100, 1000); | ||
126 | if (ret) { | ||
127 | dev_err(priv->chip.dev, "ARR/CMP registers write issue\n"); | ||
128 | goto err; | ||
129 | } | ||
130 | ret = regmap_write(priv->regmap, STM32_LPTIM_ICR, | ||
131 | STM32_LPTIM_CMPOKCF_ARROKCF); | ||
132 | if (ret) | ||
133 | goto err; | ||
134 | |||
135 | if (reenable) { | ||
136 | /* Start LP timer in continuous mode */ | ||
137 | ret = regmap_update_bits(priv->regmap, STM32_LPTIM_CR, | ||
138 | STM32_LPTIM_CNTSTRT, | ||
139 | STM32_LPTIM_CNTSTRT); | ||
140 | if (ret) { | ||
141 | regmap_write(priv->regmap, STM32_LPTIM_CR, 0); | ||
142 | goto err; | ||
143 | } | ||
144 | } | ||
145 | |||
146 | return 0; | ||
147 | err: | ||
148 | if (!cstate.enabled) | ||
149 | clk_disable(priv->clk); | ||
150 | |||
151 | return ret; | ||
152 | } | ||
153 | |||
154 | static void stm32_pwm_lp_get_state(struct pwm_chip *chip, | ||
155 | struct pwm_device *pwm, | ||
156 | struct pwm_state *state) | ||
157 | { | ||
158 | struct stm32_pwm_lp *priv = to_stm32_pwm_lp(chip); | ||
159 | unsigned long rate = clk_get_rate(priv->clk); | ||
160 | u32 val, presc, prd; | ||
161 | u64 tmp; | ||
162 | |||
163 | regmap_read(priv->regmap, STM32_LPTIM_CR, &val); | ||
164 | state->enabled = !!FIELD_GET(STM32_LPTIM_ENABLE, val); | ||
165 | /* Keep PWM counter clock refcount in sync with PWM initial state */ | ||
166 | if (state->enabled) | ||
167 | clk_enable(priv->clk); | ||
168 | |||
169 | regmap_read(priv->regmap, STM32_LPTIM_CFGR, &val); | ||
170 | presc = FIELD_GET(STM32_LPTIM_PRESC, val); | ||
171 | state->polarity = FIELD_GET(STM32_LPTIM_WAVPOL, val); | ||
172 | |||
173 | regmap_read(priv->regmap, STM32_LPTIM_ARR, &prd); | ||
174 | tmp = prd + 1; | ||
175 | tmp = (tmp << presc) * NSEC_PER_SEC; | ||
176 | state->period = DIV_ROUND_CLOSEST_ULL(tmp, rate); | ||
177 | |||
178 | regmap_read(priv->regmap, STM32_LPTIM_CMP, &val); | ||
179 | tmp = prd - val; | ||
180 | tmp = (tmp << presc) * NSEC_PER_SEC; | ||
181 | state->duty_cycle = DIV_ROUND_CLOSEST_ULL(tmp, rate); | ||
182 | } | ||
183 | |||
184 | static const struct pwm_ops stm32_pwm_lp_ops = { | ||
185 | .owner = THIS_MODULE, | ||
186 | .apply = stm32_pwm_lp_apply, | ||
187 | .get_state = stm32_pwm_lp_get_state, | ||
188 | }; | ||
189 | |||
190 | static int stm32_pwm_lp_probe(struct platform_device *pdev) | ||
191 | { | ||
192 | struct stm32_lptimer *ddata = dev_get_drvdata(pdev->dev.parent); | ||
193 | struct stm32_pwm_lp *priv; | ||
194 | int ret; | ||
195 | |||
196 | priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); | ||
197 | if (!priv) | ||
198 | return -ENOMEM; | ||
199 | |||
200 | priv->regmap = ddata->regmap; | ||
201 | priv->clk = ddata->clk; | ||
202 | priv->chip.base = -1; | ||
203 | priv->chip.dev = &pdev->dev; | ||
204 | priv->chip.ops = &stm32_pwm_lp_ops; | ||
205 | priv->chip.npwm = 1; | ||
206 | |||
207 | ret = pwmchip_add(&priv->chip); | ||
208 | if (ret < 0) | ||
209 | return ret; | ||
210 | |||
211 | platform_set_drvdata(pdev, priv); | ||
212 | |||
213 | return 0; | ||
214 | } | ||
215 | |||
216 | static int stm32_pwm_lp_remove(struct platform_device *pdev) | ||
217 | { | ||
218 | struct stm32_pwm_lp *priv = platform_get_drvdata(pdev); | ||
219 | unsigned int i; | ||
220 | |||
221 | for (i = 0; i < priv->chip.npwm; i++) | ||
222 | if (pwm_is_enabled(&priv->chip.pwms[i])) | ||
223 | pwm_disable(&priv->chip.pwms[i]); | ||
224 | |||
225 | return pwmchip_remove(&priv->chip); | ||
226 | } | ||
227 | |||
228 | static const struct of_device_id stm32_pwm_lp_of_match[] = { | ||
229 | { .compatible = "st,stm32-pwm-lp", }, | ||
230 | {}, | ||
231 | }; | ||
232 | MODULE_DEVICE_TABLE(of, stm32_pwm_lp_of_match); | ||
233 | |||
234 | static struct platform_driver stm32_pwm_lp_driver = { | ||
235 | .probe = stm32_pwm_lp_probe, | ||
236 | .remove = stm32_pwm_lp_remove, | ||
237 | .driver = { | ||
238 | .name = "stm32-pwm-lp", | ||
239 | .of_match_table = of_match_ptr(stm32_pwm_lp_of_match), | ||
240 | }, | ||
241 | }; | ||
242 | module_platform_driver(stm32_pwm_lp_driver); | ||
243 | |||
244 | MODULE_ALIAS("platform:stm32-pwm-lp"); | ||
245 | MODULE_DESCRIPTION("STMicroelectronics STM32 PWM LP driver"); | ||
246 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/pwm/pwm-twl-led.c b/drivers/pwm/pwm-twl-led.c index 21eff991d0e3..01153622778b 100644 --- a/drivers/pwm/pwm-twl-led.c +++ b/drivers/pwm/pwm-twl-led.c | |||
@@ -24,7 +24,7 @@ | |||
24 | #include <linux/of.h> | 24 | #include <linux/of.h> |
25 | #include <linux/platform_device.h> | 25 | #include <linux/platform_device.h> |
26 | #include <linux/pwm.h> | 26 | #include <linux/pwm.h> |
27 | #include <linux/i2c/twl.h> | 27 | #include <linux/mfd/twl.h> |
28 | #include <linux/slab.h> | 28 | #include <linux/slab.h> |
29 | 29 | ||
30 | /* | 30 | /* |
diff --git a/drivers/pwm/pwm-twl.c b/drivers/pwm/pwm-twl.c index 9de617b76680..b7a45be99815 100644 --- a/drivers/pwm/pwm-twl.c +++ b/drivers/pwm/pwm-twl.c | |||
@@ -21,7 +21,7 @@ | |||
21 | #include <linux/of.h> | 21 | #include <linux/of.h> |
22 | #include <linux/platform_device.h> | 22 | #include <linux/platform_device.h> |
23 | #include <linux/pwm.h> | 23 | #include <linux/pwm.h> |
24 | #include <linux/i2c/twl.h> | 24 | #include <linux/mfd/twl.h> |
25 | #include <linux/slab.h> | 25 | #include <linux/slab.h> |
26 | 26 | ||
27 | /* | 27 | /* |
diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig index e740a66cb1d6..0fd6195601ba 100644 --- a/drivers/regulator/Kconfig +++ b/drivers/regulator/Kconfig | |||
@@ -696,11 +696,11 @@ config REGULATOR_RC5T583 | |||
696 | outputs which can be controlled by i2c communication. | 696 | outputs which can be controlled by i2c communication. |
697 | 697 | ||
698 | config REGULATOR_RK808 | 698 | config REGULATOR_RK808 |
699 | tristate "Rockchip RK808/RK818 Power regulators" | 699 | tristate "Rockchip RK805/RK808/RK818 Power regulators" |
700 | depends on MFD_RK808 | 700 | depends on MFD_RK808 |
701 | help | 701 | help |
702 | Select this option to enable the power regulator of ROCKCHIP | 702 | Select this option to enable the power regulator of ROCKCHIP |
703 | PMIC RK808 and RK818. | 703 | PMIC RK805,RK808 and RK818. |
704 | This driver supports the control of different power rails of device | 704 | This driver supports the control of different power rails of device |
705 | through regulator interface. The device supports multiple DCDC/LDO | 705 | through regulator interface. The device supports multiple DCDC/LDO |
706 | outputs which can be controlled by i2c communication. | 706 | outputs which can be controlled by i2c communication. |
diff --git a/drivers/regulator/rk808-regulator.c b/drivers/regulator/rk808-regulator.c index a16d81420612..213b68743cc8 100644 --- a/drivers/regulator/rk808-regulator.c +++ b/drivers/regulator/rk808-regulator.c | |||
@@ -65,6 +65,27 @@ | |||
65 | /* max steps for increase voltage of Buck1/2, equal 100mv*/ | 65 | /* max steps for increase voltage of Buck1/2, equal 100mv*/ |
66 | #define MAX_STEPS_ONE_TIME 8 | 66 | #define MAX_STEPS_ONE_TIME 8 |
67 | 67 | ||
68 | #define RK805_DESC(_id, _match, _supply, _min, _max, _step, _vreg, \ | ||
69 | _vmask, _ereg, _emask, _etime) \ | ||
70 | [_id] = { \ | ||
71 | .name = (_match), \ | ||
72 | .supply_name = (_supply), \ | ||
73 | .of_match = of_match_ptr(_match), \ | ||
74 | .regulators_node = of_match_ptr("regulators"), \ | ||
75 | .type = REGULATOR_VOLTAGE, \ | ||
76 | .id = (_id), \ | ||
77 | .n_voltages = (((_max) - (_min)) / (_step) + 1), \ | ||
78 | .owner = THIS_MODULE, \ | ||
79 | .min_uV = (_min) * 1000, \ | ||
80 | .uV_step = (_step) * 1000, \ | ||
81 | .vsel_reg = (_vreg), \ | ||
82 | .vsel_mask = (_vmask), \ | ||
83 | .enable_reg = (_ereg), \ | ||
84 | .enable_mask = (_emask), \ | ||
85 | .enable_time = (_etime), \ | ||
86 | .ops = &rk805_reg_ops, \ | ||
87 | } | ||
88 | |||
68 | #define RK8XX_DESC(_id, _match, _supply, _min, _max, _step, _vreg, \ | 89 | #define RK8XX_DESC(_id, _match, _supply, _min, _max, _step, _vreg, \ |
69 | _vmask, _ereg, _emask, _etime) \ | 90 | _vmask, _ereg, _emask, _etime) \ |
70 | [_id] = { \ | 91 | [_id] = { \ |
@@ -298,6 +319,28 @@ static int rk808_set_suspend_voltage_range(struct regulator_dev *rdev, int uv) | |||
298 | sel); | 319 | sel); |
299 | } | 320 | } |
300 | 321 | ||
322 | static int rk805_set_suspend_enable(struct regulator_dev *rdev) | ||
323 | { | ||
324 | unsigned int reg; | ||
325 | |||
326 | reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET; | ||
327 | |||
328 | return regmap_update_bits(rdev->regmap, reg, | ||
329 | rdev->desc->enable_mask, | ||
330 | rdev->desc->enable_mask); | ||
331 | } | ||
332 | |||
333 | static int rk805_set_suspend_disable(struct regulator_dev *rdev) | ||
334 | { | ||
335 | unsigned int reg; | ||
336 | |||
337 | reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET; | ||
338 | |||
339 | return regmap_update_bits(rdev->regmap, reg, | ||
340 | rdev->desc->enable_mask, | ||
341 | 0); | ||
342 | } | ||
343 | |||
301 | static int rk808_set_suspend_enable(struct regulator_dev *rdev) | 344 | static int rk808_set_suspend_enable(struct regulator_dev *rdev) |
302 | { | 345 | { |
303 | unsigned int reg; | 346 | unsigned int reg; |
@@ -320,6 +363,27 @@ static int rk808_set_suspend_disable(struct regulator_dev *rdev) | |||
320 | rdev->desc->enable_mask); | 363 | rdev->desc->enable_mask); |
321 | } | 364 | } |
322 | 365 | ||
366 | static struct regulator_ops rk805_reg_ops = { | ||
367 | .list_voltage = regulator_list_voltage_linear, | ||
368 | .map_voltage = regulator_map_voltage_linear, | ||
369 | .get_voltage_sel = regulator_get_voltage_sel_regmap, | ||
370 | .set_voltage_sel = regulator_set_voltage_sel_regmap, | ||
371 | .enable = regulator_enable_regmap, | ||
372 | .disable = regulator_disable_regmap, | ||
373 | .is_enabled = regulator_is_enabled_regmap, | ||
374 | .set_suspend_voltage = rk808_set_suspend_voltage, | ||
375 | .set_suspend_enable = rk805_set_suspend_enable, | ||
376 | .set_suspend_disable = rk805_set_suspend_disable, | ||
377 | }; | ||
378 | |||
379 | static struct regulator_ops rk805_switch_ops = { | ||
380 | .enable = regulator_enable_regmap, | ||
381 | .disable = regulator_disable_regmap, | ||
382 | .is_enabled = regulator_is_enabled_regmap, | ||
383 | .set_suspend_enable = rk805_set_suspend_enable, | ||
384 | .set_suspend_disable = rk805_set_suspend_disable, | ||
385 | }; | ||
386 | |||
323 | static struct regulator_ops rk808_buck1_2_ops = { | 387 | static struct regulator_ops rk808_buck1_2_ops = { |
324 | .list_voltage = regulator_list_voltage_linear, | 388 | .list_voltage = regulator_list_voltage_linear, |
325 | .map_voltage = regulator_map_voltage_linear, | 389 | .map_voltage = regulator_map_voltage_linear, |
@@ -369,6 +433,68 @@ static struct regulator_ops rk808_switch_ops = { | |||
369 | .set_suspend_disable = rk808_set_suspend_disable, | 433 | .set_suspend_disable = rk808_set_suspend_disable, |
370 | }; | 434 | }; |
371 | 435 | ||
436 | static const struct regulator_desc rk805_reg[] = { | ||
437 | { | ||
438 | .name = "DCDC_REG1", | ||
439 | .supply_name = "vcc1", | ||
440 | .of_match = of_match_ptr("DCDC_REG1"), | ||
441 | .regulators_node = of_match_ptr("regulators"), | ||
442 | .id = RK805_ID_DCDC1, | ||
443 | .ops = &rk805_reg_ops, | ||
444 | .type = REGULATOR_VOLTAGE, | ||
445 | .min_uV = 712500, | ||
446 | .uV_step = 12500, | ||
447 | .n_voltages = 64, | ||
448 | .vsel_reg = RK805_BUCK1_ON_VSEL_REG, | ||
449 | .vsel_mask = RK818_BUCK_VSEL_MASK, | ||
450 | .enable_reg = RK805_DCDC_EN_REG, | ||
451 | .enable_mask = BIT(0), | ||
452 | .owner = THIS_MODULE, | ||
453 | }, { | ||
454 | .name = "DCDC_REG2", | ||
455 | .supply_name = "vcc2", | ||
456 | .of_match = of_match_ptr("DCDC_REG2"), | ||
457 | .regulators_node = of_match_ptr("regulators"), | ||
458 | .id = RK805_ID_DCDC2, | ||
459 | .ops = &rk805_reg_ops, | ||
460 | .type = REGULATOR_VOLTAGE, | ||
461 | .min_uV = 712500, | ||
462 | .uV_step = 12500, | ||
463 | .n_voltages = 64, | ||
464 | .vsel_reg = RK805_BUCK2_ON_VSEL_REG, | ||
465 | .vsel_mask = RK818_BUCK_VSEL_MASK, | ||
466 | .enable_reg = RK805_DCDC_EN_REG, | ||
467 | .enable_mask = BIT(1), | ||
468 | .owner = THIS_MODULE, | ||
469 | }, { | ||
470 | .name = "DCDC_REG3", | ||
471 | .supply_name = "vcc3", | ||
472 | .of_match = of_match_ptr("DCDC_REG3"), | ||
473 | .regulators_node = of_match_ptr("regulators"), | ||
474 | .id = RK805_ID_DCDC3, | ||
475 | .ops = &rk805_switch_ops, | ||
476 | .type = REGULATOR_VOLTAGE, | ||
477 | .n_voltages = 1, | ||
478 | .enable_reg = RK805_DCDC_EN_REG, | ||
479 | .enable_mask = BIT(2), | ||
480 | .owner = THIS_MODULE, | ||
481 | }, | ||
482 | |||
483 | RK805_DESC(RK805_ID_DCDC4, "DCDC_REG4", "vcc4", 800, 3400, 100, | ||
484 | RK805_BUCK4_ON_VSEL_REG, RK818_BUCK4_VSEL_MASK, | ||
485 | RK805_DCDC_EN_REG, BIT(3), 0), | ||
486 | |||
487 | RK805_DESC(RK805_ID_LDO1, "LDO_REG1", "vcc5", 800, 3400, 100, | ||
488 | RK805_LDO1_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK805_LDO_EN_REG, | ||
489 | BIT(0), 400), | ||
490 | RK805_DESC(RK805_ID_LDO2, "LDO_REG2", "vcc5", 800, 3400, 100, | ||
491 | RK805_LDO2_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK805_LDO_EN_REG, | ||
492 | BIT(1), 400), | ||
493 | RK805_DESC(RK805_ID_LDO3, "LDO_REG3", "vcc6", 800, 3400, 100, | ||
494 | RK805_LDO3_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK805_LDO_EN_REG, | ||
495 | BIT(2), 400), | ||
496 | }; | ||
497 | |||
372 | static const struct regulator_desc rk808_reg[] = { | 498 | static const struct regulator_desc rk808_reg[] = { |
373 | { | 499 | { |
374 | .name = "DCDC_REG1", | 500 | .name = "DCDC_REG1", |
@@ -625,6 +751,10 @@ static int rk808_regulator_probe(struct platform_device *pdev) | |||
625 | platform_set_drvdata(pdev, pdata); | 751 | platform_set_drvdata(pdev, pdata); |
626 | 752 | ||
627 | switch (rk808->variant) { | 753 | switch (rk808->variant) { |
754 | case RK805_ID: | ||
755 | regulators = rk805_reg; | ||
756 | nregulators = RK805_NUM_REGULATORS; | ||
757 | break; | ||
628 | case RK808_ID: | 758 | case RK808_ID: |
629 | regulators = rk808_reg; | 759 | regulators = rk808_reg; |
630 | nregulators = RK808_NUM_REGULATORS; | 760 | nregulators = RK808_NUM_REGULATORS; |
diff --git a/drivers/regulator/twl-regulator.c b/drivers/regulator/twl-regulator.c index 6c9ec84121bd..a4456db5849d 100644 --- a/drivers/regulator/twl-regulator.c +++ b/drivers/regulator/twl-regulator.c | |||
@@ -20,7 +20,7 @@ | |||
20 | #include <linux/regulator/driver.h> | 20 | #include <linux/regulator/driver.h> |
21 | #include <linux/regulator/machine.h> | 21 | #include <linux/regulator/machine.h> |
22 | #include <linux/regulator/of_regulator.h> | 22 | #include <linux/regulator/of_regulator.h> |
23 | #include <linux/i2c/twl.h> | 23 | #include <linux/mfd/twl.h> |
24 | #include <linux/delay.h> | 24 | #include <linux/delay.h> |
25 | 25 | ||
26 | /* | 26 | /* |
diff --git a/drivers/regulator/twl6030-regulator.c b/drivers/regulator/twl6030-regulator.c index 56aada387887..219cbd910dbf 100644 --- a/drivers/regulator/twl6030-regulator.c +++ b/drivers/regulator/twl6030-regulator.c | |||
@@ -21,7 +21,7 @@ | |||
21 | #include <linux/regulator/driver.h> | 21 | #include <linux/regulator/driver.h> |
22 | #include <linux/regulator/machine.h> | 22 | #include <linux/regulator/machine.h> |
23 | #include <linux/regulator/of_regulator.h> | 23 | #include <linux/regulator/of_regulator.h> |
24 | #include <linux/i2c/twl.h> | 24 | #include <linux/mfd/twl.h> |
25 | #include <linux/delay.h> | 25 | #include <linux/delay.h> |
26 | 26 | ||
27 | struct twlreg_info { | 27 | struct twlreg_info { |
diff --git a/drivers/rtc/rtc-dm355evm.c b/drivers/rtc/rtc-dm355evm.c index f225cd873ff6..97d8259b9494 100644 --- a/drivers/rtc/rtc-dm355evm.c +++ b/drivers/rtc/rtc-dm355evm.c | |||
@@ -13,7 +13,7 @@ | |||
13 | #include <linux/rtc.h> | 13 | #include <linux/rtc.h> |
14 | #include <linux/platform_device.h> | 14 | #include <linux/platform_device.h> |
15 | 15 | ||
16 | #include <linux/i2c/dm355evm_msp.h> | 16 | #include <linux/mfd/dm355evm_msp.h> |
17 | #include <linux/module.h> | 17 | #include <linux/module.h> |
18 | 18 | ||
19 | 19 | ||
diff --git a/drivers/rtc/rtc-twl.c b/drivers/rtc/rtc-twl.c index c18c39212ce6..3472e79f2b17 100644 --- a/drivers/rtc/rtc-twl.c +++ b/drivers/rtc/rtc-twl.c | |||
@@ -31,7 +31,7 @@ | |||
31 | #include <linux/interrupt.h> | 31 | #include <linux/interrupt.h> |
32 | #include <linux/of.h> | 32 | #include <linux/of.h> |
33 | 33 | ||
34 | #include <linux/i2c/twl.h> | 34 | #include <linux/mfd/twl.h> |
35 | 35 | ||
36 | enum twl_class { | 36 | enum twl_class { |
37 | TWL_4030 = 0, | 37 | TWL_4030 = 0, |
diff --git a/drivers/usb/host/ohci-omap.c b/drivers/usb/host/ohci-omap.c index a4d814b7f380..91393ec7d850 100644 --- a/drivers/usb/host/ohci-omap.c +++ b/drivers/usb/host/ohci-omap.c | |||
@@ -53,7 +53,7 @@ | |||
53 | #define DRIVER_DESC "OHCI OMAP driver" | 53 | #define DRIVER_DESC "OHCI OMAP driver" |
54 | 54 | ||
55 | #ifdef CONFIG_TPS65010 | 55 | #ifdef CONFIG_TPS65010 |
56 | #include <linux/i2c/tps65010.h> | 56 | #include <linux/mfd/tps65010.h> |
57 | #else | 57 | #else |
58 | 58 | ||
59 | #define LOW 0 | 59 | #define LOW 0 |
diff --git a/drivers/usb/phy/phy-isp1301-omap.c b/drivers/usb/phy/phy-isp1301-omap.c index 042c5a8fd423..c6052c814bcc 100644 --- a/drivers/usb/phy/phy-isp1301-omap.c +++ b/drivers/usb/phy/phy-isp1301-omap.c | |||
@@ -96,7 +96,7 @@ struct isp1301 { | |||
96 | 96 | ||
97 | #if IS_REACHABLE(CONFIG_TPS65010) | 97 | #if IS_REACHABLE(CONFIG_TPS65010) |
98 | 98 | ||
99 | #include <linux/i2c/tps65010.h> | 99 | #include <linux/mfd/tps65010.h> |
100 | 100 | ||
101 | #else | 101 | #else |
102 | 102 | ||
diff --git a/drivers/usb/phy/phy-twl6030-usb.c b/drivers/usb/phy/phy-twl6030-usb.c index 628b600b02b1..b5dc077ed7d3 100644 --- a/drivers/usb/phy/phy-twl6030-usb.c +++ b/drivers/usb/phy/phy-twl6030-usb.c | |||
@@ -28,7 +28,7 @@ | |||
28 | #include <linux/usb/musb.h> | 28 | #include <linux/usb/musb.h> |
29 | #include <linux/usb/phy_companion.h> | 29 | #include <linux/usb/phy_companion.h> |
30 | #include <linux/phy/omap_usb.h> | 30 | #include <linux/phy/omap_usb.h> |
31 | #include <linux/i2c/twl.h> | 31 | #include <linux/mfd/twl.h> |
32 | #include <linux/regulator/consumer.h> | 32 | #include <linux/regulator/consumer.h> |
33 | #include <linux/err.h> | 33 | #include <linux/err.h> |
34 | #include <linux/slab.h> | 34 | #include <linux/slab.h> |
diff --git a/drivers/video/backlight/pandora_bl.c b/drivers/video/backlight/pandora_bl.c index 5d8bb8b20183..a186bc677c7d 100644 --- a/drivers/video/backlight/pandora_bl.c +++ b/drivers/video/backlight/pandora_bl.c | |||
@@ -16,7 +16,7 @@ | |||
16 | #include <linux/delay.h> | 16 | #include <linux/delay.h> |
17 | #include <linux/fb.h> | 17 | #include <linux/fb.h> |
18 | #include <linux/backlight.h> | 18 | #include <linux/backlight.h> |
19 | #include <linux/i2c/twl.h> | 19 | #include <linux/mfd/twl.h> |
20 | #include <linux/err.h> | 20 | #include <linux/err.h> |
21 | 21 | ||
22 | #define TWL_PWM0_ON 0x00 | 22 | #define TWL_PWM0_ON 0x00 |
diff --git a/drivers/video/fbdev/omap/lcd_h3.c b/drivers/video/fbdev/omap/lcd_h3.c index 9d2da146813e..796f4634c4c6 100644 --- a/drivers/video/fbdev/omap/lcd_h3.c +++ b/drivers/video/fbdev/omap/lcd_h3.c | |||
@@ -21,7 +21,7 @@ | |||
21 | 21 | ||
22 | #include <linux/module.h> | 22 | #include <linux/module.h> |
23 | #include <linux/platform_device.h> | 23 | #include <linux/platform_device.h> |
24 | #include <linux/i2c/tps65010.h> | 24 | #include <linux/mfd/tps65010.h> |
25 | #include <linux/gpio.h> | 25 | #include <linux/gpio.h> |
26 | 26 | ||
27 | #include "omapfb.h" | 27 | #include "omapfb.h" |
diff --git a/drivers/watchdog/twl4030_wdt.c b/drivers/watchdog/twl4030_wdt.c index 9bf3cc0f3961..569fe85e52da 100644 --- a/drivers/watchdog/twl4030_wdt.c +++ b/drivers/watchdog/twl4030_wdt.c | |||
@@ -24,7 +24,7 @@ | |||
24 | #include <linux/kernel.h> | 24 | #include <linux/kernel.h> |
25 | #include <linux/watchdog.h> | 25 | #include <linux/watchdog.h> |
26 | #include <linux/platform_device.h> | 26 | #include <linux/platform_device.h> |
27 | #include <linux/i2c/twl.h> | 27 | #include <linux/mfd/twl.h> |
28 | 28 | ||
29 | #define TWL4030_WATCHDOG_CFG_REG_OFFS 0x3 | 29 | #define TWL4030_WATCHDOG_CFG_REG_OFFS 0x3 |
30 | 30 | ||
diff --git a/include/linux/iio/timer/stm32-lptim-trigger.h b/include/linux/iio/timer/stm32-lptim-trigger.h new file mode 100644 index 000000000000..34d59bfdce2d --- /dev/null +++ b/include/linux/iio/timer/stm32-lptim-trigger.h | |||
@@ -0,0 +1,27 @@ | |||
1 | /* | ||
2 | * Copyright (C) STMicroelectronics 2017 | ||
3 | * | ||
4 | * Author: Fabrice Gasnier <fabrice.gasnier@st.com> | ||
5 | * | ||
6 | * License terms: GNU General Public License (GPL), version 2 | ||
7 | */ | ||
8 | |||
9 | #ifndef _STM32_LPTIM_TRIGGER_H_ | ||
10 | #define _STM32_LPTIM_TRIGGER_H_ | ||
11 | |||
12 | #include <linux/iio/iio.h> | ||
13 | #include <linux/iio/trigger.h> | ||
14 | |||
15 | #define LPTIM1_OUT "lptim1_out" | ||
16 | #define LPTIM2_OUT "lptim2_out" | ||
17 | #define LPTIM3_OUT "lptim3_out" | ||
18 | |||
19 | #if IS_ENABLED(CONFIG_IIO_STM32_LPTIMER_TRIGGER) | ||
20 | bool is_stm32_lptim_trigger(struct iio_trigger *trig); | ||
21 | #else | ||
22 | static inline bool is_stm32_lptim_trigger(struct iio_trigger *trig) | ||
23 | { | ||
24 | return false; | ||
25 | } | ||
26 | #endif | ||
27 | #endif | ||
diff --git a/include/linux/mfd/axp20x.h b/include/linux/mfd/axp20x.h index 965b027e31b3..e9c908c4fba8 100644 --- a/include/linux/mfd/axp20x.h +++ b/include/linux/mfd/axp20x.h | |||
@@ -23,6 +23,7 @@ enum axp20x_variants { | |||
23 | AXP803_ID, | 23 | AXP803_ID, |
24 | AXP806_ID, | 24 | AXP806_ID, |
25 | AXP809_ID, | 25 | AXP809_ID, |
26 | AXP813_ID, | ||
26 | NR_AXP20X_VARIANTS, | 27 | NR_AXP20X_VARIANTS, |
27 | }; | 28 | }; |
28 | 29 | ||
@@ -387,6 +388,34 @@ enum { | |||
387 | AXP803_REG_ID_MAX, | 388 | AXP803_REG_ID_MAX, |
388 | }; | 389 | }; |
389 | 390 | ||
391 | enum { | ||
392 | AXP813_DCDC1 = 0, | ||
393 | AXP813_DCDC2, | ||
394 | AXP813_DCDC3, | ||
395 | AXP813_DCDC4, | ||
396 | AXP813_DCDC5, | ||
397 | AXP813_DCDC6, | ||
398 | AXP813_DCDC7, | ||
399 | AXP813_ALDO1, | ||
400 | AXP813_ALDO2, | ||
401 | AXP813_ALDO3, | ||
402 | AXP813_DLDO1, | ||
403 | AXP813_DLDO2, | ||
404 | AXP813_DLDO3, | ||
405 | AXP813_DLDO4, | ||
406 | AXP813_ELDO1, | ||
407 | AXP813_ELDO2, | ||
408 | AXP813_ELDO3, | ||
409 | AXP813_FLDO1, | ||
410 | AXP813_FLDO2, | ||
411 | AXP813_FLDO3, | ||
412 | AXP813_RTC_LDO, | ||
413 | AXP813_LDO_IO0, | ||
414 | AXP813_LDO_IO1, | ||
415 | AXP813_SW, | ||
416 | AXP813_REG_ID_MAX, | ||
417 | }; | ||
418 | |||
390 | /* IRQs */ | 419 | /* IRQs */ |
391 | enum { | 420 | enum { |
392 | AXP152_IRQ_LDO0IN_CONNECT = 1, | 421 | AXP152_IRQ_LDO0IN_CONNECT = 1, |
diff --git a/include/linux/mfd/bd9571mwv.h b/include/linux/mfd/bd9571mwv.h new file mode 100644 index 000000000000..f0708ba4cbba --- /dev/null +++ b/include/linux/mfd/bd9571mwv.h | |||
@@ -0,0 +1,115 @@ | |||
1 | /* | ||
2 | * ROHM BD9571MWV-M driver | ||
3 | * | ||
4 | * Copyright (C) 2017 Marek Vasut <marek.vasut+renesas@gmail.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | * This program is distributed "as is" WITHOUT ANY WARRANTY of any | ||
11 | * kind, whether expressed or implied; without even the implied warranty | ||
12 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License version 2 for more details. | ||
14 | * | ||
15 | * Based on the TPS65086 driver | ||
16 | */ | ||
17 | |||
18 | #ifndef __LINUX_MFD_BD9571MWV_H | ||
19 | #define __LINUX_MFD_BD9571MWV_H | ||
20 | |||
21 | #include <linux/device.h> | ||
22 | #include <linux/regmap.h> | ||
23 | |||
24 | /* List of registers for BD9571MWV */ | ||
25 | #define BD9571MWV_VENDOR_CODE 0x00 | ||
26 | #define BD9571MWV_VENDOR_CODE_VAL 0xdb | ||
27 | #define BD9571MWV_PRODUCT_CODE 0x01 | ||
28 | #define BD9571MWV_PRODUCT_CODE_VAL 0x60 | ||
29 | #define BD9571MWV_PRODUCT_REVISION 0x02 | ||
30 | |||
31 | #define BD9571MWV_I2C_FUSA_MODE 0x10 | ||
32 | #define BD9571MWV_I2C_MD2_E1_BIT_1 0x11 | ||
33 | #define BD9571MWV_I2C_MD2_E1_BIT_2 0x12 | ||
34 | |||
35 | #define BD9571MWV_BKUP_MODE_CNT 0x20 | ||
36 | #define BD9571MWV_BKUP_MODE_STATUS 0x21 | ||
37 | #define BD9571MWV_BKUP_RECOVERY_CNT 0x22 | ||
38 | #define BD9571MWV_BKUP_CTRL_TIM_CNT 0x23 | ||
39 | #define BD9571MWV_WAITBKUP_WDT_CNT 0x24 | ||
40 | #define BD9571MWV_128H_TIM_CNT 0x26 | ||
41 | #define BD9571MWV_QLLM_CNT 0x27 | ||
42 | |||
43 | #define BD9571MWV_AVS_SET_MONI 0x31 | ||
44 | #define BD9571MWV_AVS_SET_MONI_MASK 0x3 | ||
45 | #define BD9571MWV_AVS_VD09_VID(n) (0x32 + (n)) | ||
46 | #define BD9571MWV_AVS_DVFS_VID(n) (0x36 + (n)) | ||
47 | |||
48 | #define BD9571MWV_VD18_VID 0x42 | ||
49 | #define BD9571MWV_VD25_VID 0x43 | ||
50 | #define BD9571MWV_VD33_VID 0x44 | ||
51 | |||
52 | #define BD9571MWV_DVFS_VINIT 0x50 | ||
53 | #define BD9571MWV_DVFS_SETVMAX 0x52 | ||
54 | #define BD9571MWV_DVFS_BOOSTVID 0x53 | ||
55 | #define BD9571MWV_DVFS_SETVID 0x54 | ||
56 | #define BD9571MWV_DVFS_MONIVDAC 0x55 | ||
57 | #define BD9571MWV_DVFS_PGD_CNT 0x56 | ||
58 | |||
59 | #define BD9571MWV_GPIO_DIR 0x60 | ||
60 | #define BD9571MWV_GPIO_OUT 0x61 | ||
61 | #define BD9571MWV_GPIO_IN 0x62 | ||
62 | #define BD9571MWV_GPIO_DEB 0x63 | ||
63 | #define BD9571MWV_GPIO_INT_SET 0x64 | ||
64 | #define BD9571MWV_GPIO_INT 0x65 | ||
65 | #define BD9571MWV_GPIO_INTMASK 0x66 | ||
66 | |||
67 | #define BD9571MWV_REG_KEEP(n) (0x70 + (n)) | ||
68 | |||
69 | #define BD9571MWV_PMIC_INTERNAL_STATUS 0x80 | ||
70 | #define BD9571MWV_PROT_ERROR_STATUS0 0x81 | ||
71 | #define BD9571MWV_PROT_ERROR_STATUS1 0x82 | ||
72 | #define BD9571MWV_PROT_ERROR_STATUS2 0x83 | ||
73 | #define BD9571MWV_PROT_ERROR_STATUS3 0x84 | ||
74 | #define BD9571MWV_PROT_ERROR_STATUS4 0x85 | ||
75 | |||
76 | #define BD9571MWV_INT_INTREQ 0x90 | ||
77 | #define BD9571MWV_INT_INTREQ_MD1_INT BIT(0) | ||
78 | #define BD9571MWV_INT_INTREQ_MD2_E1_INT BIT(1) | ||
79 | #define BD9571MWV_INT_INTREQ_MD2_E2_INT BIT(2) | ||
80 | #define BD9571MWV_INT_INTREQ_PROT_ERR_INT BIT(3) | ||
81 | #define BD9571MWV_INT_INTREQ_GP_INT BIT(4) | ||
82 | #define BD9571MWV_INT_INTREQ_128H_OF_INT BIT(5) | ||
83 | #define BD9571MWV_INT_INTREQ_WDT_OF_INT BIT(6) | ||
84 | #define BD9571MWV_INT_INTREQ_BKUP_TRG_INT BIT(7) | ||
85 | #define BD9571MWV_INT_INTMASK 0x91 | ||
86 | |||
87 | #define BD9571MWV_ACCESS_KEY 0xff | ||
88 | |||
89 | /* Define the BD9571MWV IRQ numbers */ | ||
90 | enum bd9571mwv_irqs { | ||
91 | BD9571MWV_IRQ_MD1, | ||
92 | BD9571MWV_IRQ_MD2_E1, | ||
93 | BD9571MWV_IRQ_MD2_E2, | ||
94 | BD9571MWV_IRQ_PROT_ERR, | ||
95 | BD9571MWV_IRQ_GP, | ||
96 | BD9571MWV_IRQ_128H_OF, | ||
97 | BD9571MWV_IRQ_WDT_OF, | ||
98 | BD9571MWV_IRQ_BKUP_TRG, | ||
99 | }; | ||
100 | |||
101 | /** | ||
102 | * struct bd9571mwv - state holder for the bd9571mwv driver | ||
103 | * | ||
104 | * Device data may be used to access the BD9571MWV chip | ||
105 | */ | ||
106 | struct bd9571mwv { | ||
107 | struct device *dev; | ||
108 | struct regmap *regmap; | ||
109 | |||
110 | /* IRQ Data */ | ||
111 | int irq; | ||
112 | struct regmap_irq_chip_data *irq_data; | ||
113 | }; | ||
114 | |||
115 | #endif /* __LINUX_MFD_BD9571MWV_H */ | ||
diff --git a/include/linux/i2c/dm355evm_msp.h b/include/linux/mfd/dm355evm_msp.h index 372470350fab..372470350fab 100644 --- a/include/linux/i2c/dm355evm_msp.h +++ b/include/linux/mfd/dm355evm_msp.h | |||
diff --git a/include/linux/mfd/hi6421-pmic.h b/include/linux/mfd/hi6421-pmic.h index 587273e35acf..2580c08db7b1 100644 --- a/include/linux/mfd/hi6421-pmic.h +++ b/include/linux/mfd/hi6421-pmic.h | |||
@@ -38,4 +38,9 @@ struct hi6421_pmic { | |||
38 | struct regmap *regmap; | 38 | struct regmap *regmap; |
39 | }; | 39 | }; |
40 | 40 | ||
41 | enum hi6421_type { | ||
42 | HI6421 = 0, | ||
43 | HI6421_V530, | ||
44 | }; | ||
45 | |||
41 | #endif /* __HI6421_PMIC_H */ | 46 | #endif /* __HI6421_PMIC_H */ |
diff --git a/include/linux/mfd/rk808.h b/include/linux/mfd/rk808.h index 83701ef7d3c7..d3156594674c 100644 --- a/include/linux/mfd/rk808.h +++ b/include/linux/mfd/rk808.h | |||
@@ -206,6 +206,97 @@ enum rk818_reg { | |||
206 | #define RK818_USB_ILMIN_2000MA 0x7 | 206 | #define RK818_USB_ILMIN_2000MA 0x7 |
207 | #define RK818_USB_CHG_SD_VSEL_MASK 0x70 | 207 | #define RK818_USB_CHG_SD_VSEL_MASK 0x70 |
208 | 208 | ||
209 | /* RK805 */ | ||
210 | enum rk805_reg { | ||
211 | RK805_ID_DCDC1, | ||
212 | RK805_ID_DCDC2, | ||
213 | RK805_ID_DCDC3, | ||
214 | RK805_ID_DCDC4, | ||
215 | RK805_ID_LDO1, | ||
216 | RK805_ID_LDO2, | ||
217 | RK805_ID_LDO3, | ||
218 | }; | ||
219 | |||
220 | /* CONFIG REGISTER */ | ||
221 | #define RK805_VB_MON_REG 0x21 | ||
222 | #define RK805_THERMAL_REG 0x22 | ||
223 | |||
224 | /* POWER CHANNELS ENABLE REGISTER */ | ||
225 | #define RK805_DCDC_EN_REG 0x23 | ||
226 | #define RK805_SLP_DCDC_EN_REG 0x25 | ||
227 | #define RK805_SLP_LDO_EN_REG 0x26 | ||
228 | #define RK805_LDO_EN_REG 0x27 | ||
229 | |||
230 | /* BUCK AND LDO CONFIG REGISTER */ | ||
231 | #define RK805_BUCK_LDO_SLP_LP_EN_REG 0x2A | ||
232 | #define RK805_BUCK1_CONFIG_REG 0x2E | ||
233 | #define RK805_BUCK1_ON_VSEL_REG 0x2F | ||
234 | #define RK805_BUCK1_SLP_VSEL_REG 0x30 | ||
235 | #define RK805_BUCK2_CONFIG_REG 0x32 | ||
236 | #define RK805_BUCK2_ON_VSEL_REG 0x33 | ||
237 | #define RK805_BUCK2_SLP_VSEL_REG 0x34 | ||
238 | #define RK805_BUCK3_CONFIG_REG 0x36 | ||
239 | #define RK805_BUCK4_CONFIG_REG 0x37 | ||
240 | #define RK805_BUCK4_ON_VSEL_REG 0x38 | ||
241 | #define RK805_BUCK4_SLP_VSEL_REG 0x39 | ||
242 | #define RK805_LDO1_ON_VSEL_REG 0x3B | ||
243 | #define RK805_LDO1_SLP_VSEL_REG 0x3C | ||
244 | #define RK805_LDO2_ON_VSEL_REG 0x3D | ||
245 | #define RK805_LDO2_SLP_VSEL_REG 0x3E | ||
246 | #define RK805_LDO3_ON_VSEL_REG 0x3F | ||
247 | #define RK805_LDO3_SLP_VSEL_REG 0x40 | ||
248 | |||
249 | /* INTERRUPT REGISTER */ | ||
250 | #define RK805_PWRON_LP_INT_TIME_REG 0x47 | ||
251 | #define RK805_PWRON_DB_REG 0x48 | ||
252 | #define RK805_DEV_CTRL_REG 0x4B | ||
253 | #define RK805_INT_STS_REG 0x4C | ||
254 | #define RK805_INT_STS_MSK_REG 0x4D | ||
255 | #define RK805_GPIO_IO_POL_REG 0x50 | ||
256 | #define RK805_OUT_REG 0x52 | ||
257 | #define RK805_ON_SOURCE_REG 0xAE | ||
258 | #define RK805_OFF_SOURCE_REG 0xAF | ||
259 | |||
260 | #define RK805_NUM_REGULATORS 7 | ||
261 | |||
262 | #define RK805_PWRON_FALL_RISE_INT_EN 0x0 | ||
263 | #define RK805_PWRON_FALL_RISE_INT_MSK 0x81 | ||
264 | |||
265 | /* RK805 IRQ Definitions */ | ||
266 | #define RK805_IRQ_PWRON_RISE 0 | ||
267 | #define RK805_IRQ_VB_LOW 1 | ||
268 | #define RK805_IRQ_PWRON 2 | ||
269 | #define RK805_IRQ_PWRON_LP 3 | ||
270 | #define RK805_IRQ_HOTDIE 4 | ||
271 | #define RK805_IRQ_RTC_ALARM 5 | ||
272 | #define RK805_IRQ_RTC_PERIOD 6 | ||
273 | #define RK805_IRQ_PWRON_FALL 7 | ||
274 | |||
275 | #define RK805_IRQ_PWRON_RISE_MSK BIT(0) | ||
276 | #define RK805_IRQ_VB_LOW_MSK BIT(1) | ||
277 | #define RK805_IRQ_PWRON_MSK BIT(2) | ||
278 | #define RK805_IRQ_PWRON_LP_MSK BIT(3) | ||
279 | #define RK805_IRQ_HOTDIE_MSK BIT(4) | ||
280 | #define RK805_IRQ_RTC_ALARM_MSK BIT(5) | ||
281 | #define RK805_IRQ_RTC_PERIOD_MSK BIT(6) | ||
282 | #define RK805_IRQ_PWRON_FALL_MSK BIT(7) | ||
283 | |||
284 | #define RK805_PWR_RISE_INT_STATUS BIT(0) | ||
285 | #define RK805_VB_LOW_INT_STATUS BIT(1) | ||
286 | #define RK805_PWRON_INT_STATUS BIT(2) | ||
287 | #define RK805_PWRON_LP_INT_STATUS BIT(3) | ||
288 | #define RK805_HOTDIE_INT_STATUS BIT(4) | ||
289 | #define RK805_ALARM_INT_STATUS BIT(5) | ||
290 | #define RK805_PERIOD_INT_STATUS BIT(6) | ||
291 | #define RK805_PWR_FALL_INT_STATUS BIT(7) | ||
292 | |||
293 | #define RK805_BUCK1_2_ILMAX_MASK (3 << 6) | ||
294 | #define RK805_BUCK3_4_ILMAX_MASK (3 << 3) | ||
295 | #define RK805_RTC_PERIOD_INT_MASK (1 << 6) | ||
296 | #define RK805_RTC_ALARM_INT_MASK (1 << 5) | ||
297 | #define RK805_INT_ALARM_EN (1 << 3) | ||
298 | #define RK805_INT_TIMER_EN (1 << 2) | ||
299 | |||
209 | /* RK808 IRQ Definitions */ | 300 | /* RK808 IRQ Definitions */ |
210 | #define RK808_IRQ_VOUT_LO 0 | 301 | #define RK808_IRQ_VOUT_LO 0 |
211 | #define RK808_IRQ_VB_LO 1 | 302 | #define RK808_IRQ_VB_LO 1 |
@@ -298,6 +389,14 @@ enum rk818_reg { | |||
298 | #define VOUT_LO_INT BIT(0) | 389 | #define VOUT_LO_INT BIT(0) |
299 | #define CLK32KOUT2_EN BIT(0) | 390 | #define CLK32KOUT2_EN BIT(0) |
300 | 391 | ||
392 | #define TEMP115C 0x0c | ||
393 | #define TEMP_HOTDIE_MSK 0x0c | ||
394 | #define SLP_SD_MSK (0x3 << 2) | ||
395 | #define SHUTDOWN_FUN (0x2 << 2) | ||
396 | #define SLEEP_FUN (0x1 << 2) | ||
397 | #define RK8XX_ID_MSK 0xfff0 | ||
398 | #define FPWM_MODE BIT(7) | ||
399 | |||
301 | enum { | 400 | enum { |
302 | BUCK_ILMIN_50MA, | 401 | BUCK_ILMIN_50MA, |
303 | BUCK_ILMIN_100MA, | 402 | BUCK_ILMIN_100MA, |
@@ -321,6 +420,28 @@ enum { | |||
321 | }; | 420 | }; |
322 | 421 | ||
323 | enum { | 422 | enum { |
423 | RK805_BUCK1_2_ILMAX_2500MA, | ||
424 | RK805_BUCK1_2_ILMAX_3000MA, | ||
425 | RK805_BUCK1_2_ILMAX_3500MA, | ||
426 | RK805_BUCK1_2_ILMAX_4000MA, | ||
427 | }; | ||
428 | |||
429 | enum { | ||
430 | RK805_BUCK3_ILMAX_1500MA, | ||
431 | RK805_BUCK3_ILMAX_2000MA, | ||
432 | RK805_BUCK3_ILMAX_2500MA, | ||
433 | RK805_BUCK3_ILMAX_3000MA, | ||
434 | }; | ||
435 | |||
436 | enum { | ||
437 | RK805_BUCK4_ILMAX_2000MA, | ||
438 | RK805_BUCK4_ILMAX_2500MA, | ||
439 | RK805_BUCK4_ILMAX_3000MA, | ||
440 | RK805_BUCK4_ILMAX_3500MA, | ||
441 | }; | ||
442 | |||
443 | enum { | ||
444 | RK805_ID = 0x8050, | ||
324 | RK808_ID = 0x0000, | 445 | RK808_ID = 0x0000, |
325 | RK818_ID = 0x8181, | 446 | RK818_ID = 0x8181, |
326 | }; | 447 | }; |
diff --git a/include/linux/mfd/stm32-lptimer.h b/include/linux/mfd/stm32-lptimer.h new file mode 100644 index 000000000000..77c7cf40d9b4 --- /dev/null +++ b/include/linux/mfd/stm32-lptimer.h | |||
@@ -0,0 +1,62 @@ | |||
1 | /* | ||
2 | * STM32 Low-Power Timer parent driver. | ||
3 | * | ||
4 | * Copyright (C) STMicroelectronics 2017 | ||
5 | * | ||
6 | * Author: Fabrice Gasnier <fabrice.gasnier@st.com> | ||
7 | * | ||
8 | * Inspired by Benjamin Gaignard's stm32-timers driver | ||
9 | * | ||
10 | * License terms: GNU General Public License (GPL), version 2 | ||
11 | */ | ||
12 | |||
13 | #ifndef _LINUX_STM32_LPTIMER_H_ | ||
14 | #define _LINUX_STM32_LPTIMER_H_ | ||
15 | |||
16 | #include <linux/clk.h> | ||
17 | #include <linux/regmap.h> | ||
18 | |||
19 | #define STM32_LPTIM_ISR 0x00 /* Interrupt and Status Reg */ | ||
20 | #define STM32_LPTIM_ICR 0x04 /* Interrupt Clear Reg */ | ||
21 | #define STM32_LPTIM_IER 0x08 /* Interrupt Enable Reg */ | ||
22 | #define STM32_LPTIM_CFGR 0x0C /* Configuration Reg */ | ||
23 | #define STM32_LPTIM_CR 0x10 /* Control Reg */ | ||
24 | #define STM32_LPTIM_CMP 0x14 /* Compare Reg */ | ||
25 | #define STM32_LPTIM_ARR 0x18 /* Autoreload Reg */ | ||
26 | #define STM32_LPTIM_CNT 0x1C /* Counter Reg */ | ||
27 | |||
28 | /* STM32_LPTIM_ISR - bit fields */ | ||
29 | #define STM32_LPTIM_CMPOK_ARROK GENMASK(4, 3) | ||
30 | #define STM32_LPTIM_ARROK BIT(4) | ||
31 | #define STM32_LPTIM_CMPOK BIT(3) | ||
32 | |||
33 | /* STM32_LPTIM_ICR - bit fields */ | ||
34 | #define STM32_LPTIM_CMPOKCF_ARROKCF GENMASK(4, 3) | ||
35 | |||
36 | /* STM32_LPTIM_CR - bit fields */ | ||
37 | #define STM32_LPTIM_CNTSTRT BIT(2) | ||
38 | #define STM32_LPTIM_ENABLE BIT(0) | ||
39 | |||
40 | /* STM32_LPTIM_CFGR - bit fields */ | ||
41 | #define STM32_LPTIM_ENC BIT(24) | ||
42 | #define STM32_LPTIM_COUNTMODE BIT(23) | ||
43 | #define STM32_LPTIM_WAVPOL BIT(21) | ||
44 | #define STM32_LPTIM_PRESC GENMASK(11, 9) | ||
45 | #define STM32_LPTIM_CKPOL GENMASK(2, 1) | ||
46 | |||
47 | /* STM32_LPTIM_ARR */ | ||
48 | #define STM32_LPTIM_MAX_ARR 0xFFFF | ||
49 | |||
50 | /** | ||
51 | * struct stm32_lptimer - STM32 Low-Power Timer data assigned by parent device | ||
52 | * @clk: clock reference for this instance | ||
53 | * @regmap: register map reference for this instance | ||
54 | * @has_encoder: indicates this Low-Power Timer supports encoder mode | ||
55 | */ | ||
56 | struct stm32_lptimer { | ||
57 | struct clk *clk; | ||
58 | struct regmap *regmap; | ||
59 | bool has_encoder; | ||
60 | }; | ||
61 | |||
62 | #endif | ||
diff --git a/include/linux/mfd/syscon/atmel-smc.h b/include/linux/mfd/syscon/atmel-smc.h index afa266169800..7a367f34b66a 100644 --- a/include/linux/mfd/syscon/atmel-smc.h +++ b/include/linux/mfd/syscon/atmel-smc.h | |||
@@ -15,21 +15,26 @@ | |||
15 | #define _LINUX_MFD_SYSCON_ATMEL_SMC_H_ | 15 | #define _LINUX_MFD_SYSCON_ATMEL_SMC_H_ |
16 | 16 | ||
17 | #include <linux/kernel.h> | 17 | #include <linux/kernel.h> |
18 | #include <linux/of.h> | ||
18 | #include <linux/regmap.h> | 19 | #include <linux/regmap.h> |
19 | 20 | ||
20 | #define ATMEL_SMC_SETUP(cs) (((cs) * 0x10)) | 21 | #define ATMEL_SMC_SETUP(cs) (((cs) * 0x10)) |
21 | #define ATMEL_HSMC_SETUP(cs) (0x600 + ((cs) * 0x14)) | 22 | #define ATMEL_HSMC_SETUP(layout, cs) \ |
23 | ((layout)->timing_regs_offset + ((cs) * 0x14)) | ||
22 | #define ATMEL_SMC_PULSE(cs) (((cs) * 0x10) + 0x4) | 24 | #define ATMEL_SMC_PULSE(cs) (((cs) * 0x10) + 0x4) |
23 | #define ATMEL_HSMC_PULSE(cs) (0x600 + ((cs) * 0x14) + 0x4) | 25 | #define ATMEL_HSMC_PULSE(layout, cs) \ |
26 | ((layout)->timing_regs_offset + ((cs) * 0x14) + 0x4) | ||
24 | #define ATMEL_SMC_CYCLE(cs) (((cs) * 0x10) + 0x8) | 27 | #define ATMEL_SMC_CYCLE(cs) (((cs) * 0x10) + 0x8) |
25 | #define ATMEL_HSMC_CYCLE(cs) (0x600 + ((cs) * 0x14) + 0x8) | 28 | #define ATMEL_HSMC_CYCLE(layout, cs) \ |
29 | ((layout)->timing_regs_offset + ((cs) * 0x14) + 0x8) | ||
26 | #define ATMEL_SMC_NWE_SHIFT 0 | 30 | #define ATMEL_SMC_NWE_SHIFT 0 |
27 | #define ATMEL_SMC_NCS_WR_SHIFT 8 | 31 | #define ATMEL_SMC_NCS_WR_SHIFT 8 |
28 | #define ATMEL_SMC_NRD_SHIFT 16 | 32 | #define ATMEL_SMC_NRD_SHIFT 16 |
29 | #define ATMEL_SMC_NCS_RD_SHIFT 24 | 33 | #define ATMEL_SMC_NCS_RD_SHIFT 24 |
30 | 34 | ||
31 | #define ATMEL_SMC_MODE(cs) (((cs) * 0x10) + 0xc) | 35 | #define ATMEL_SMC_MODE(cs) (((cs) * 0x10) + 0xc) |
32 | #define ATMEL_HSMC_MODE(cs) (0x600 + ((cs) * 0x14) + 0x10) | 36 | #define ATMEL_HSMC_MODE(layout, cs) \ |
37 | ((layout)->timing_regs_offset + ((cs) * 0x14) + 0x10) | ||
33 | #define ATMEL_SMC_MODE_READMODE_MASK BIT(0) | 38 | #define ATMEL_SMC_MODE_READMODE_MASK BIT(0) |
34 | #define ATMEL_SMC_MODE_READMODE_NCS (0 << 0) | 39 | #define ATMEL_SMC_MODE_READMODE_NCS (0 << 0) |
35 | #define ATMEL_SMC_MODE_READMODE_NRD (1 << 0) | 40 | #define ATMEL_SMC_MODE_READMODE_NRD (1 << 0) |
@@ -59,7 +64,8 @@ | |||
59 | #define ATMEL_SMC_MODE_PS_16 (2 << 28) | 64 | #define ATMEL_SMC_MODE_PS_16 (2 << 28) |
60 | #define ATMEL_SMC_MODE_PS_32 (3 << 28) | 65 | #define ATMEL_SMC_MODE_PS_32 (3 << 28) |
61 | 66 | ||
62 | #define ATMEL_HSMC_TIMINGS(cs) (0x600 + ((cs) * 0x14) + 0xc) | 67 | #define ATMEL_HSMC_TIMINGS(layout, cs) \ |
68 | ((layout)->timing_regs_offset + ((cs) * 0x14) + 0xc) | ||
63 | #define ATMEL_HSMC_TIMINGS_OCMS BIT(12) | 69 | #define ATMEL_HSMC_TIMINGS_OCMS BIT(12) |
64 | #define ATMEL_HSMC_TIMINGS_RBNSEL(x) ((x) << 28) | 70 | #define ATMEL_HSMC_TIMINGS_RBNSEL(x) ((x) << 28) |
65 | #define ATMEL_HSMC_TIMINGS_NFSEL BIT(31) | 71 | #define ATMEL_HSMC_TIMINGS_NFSEL BIT(31) |
@@ -69,6 +75,10 @@ | |||
69 | #define ATMEL_HSMC_TIMINGS_TRR_SHIFT 16 | 75 | #define ATMEL_HSMC_TIMINGS_TRR_SHIFT 16 |
70 | #define ATMEL_HSMC_TIMINGS_TWB_SHIFT 24 | 76 | #define ATMEL_HSMC_TIMINGS_TWB_SHIFT 24 |
71 | 77 | ||
78 | struct atmel_hsmc_reg_layout { | ||
79 | unsigned int timing_regs_offset; | ||
80 | }; | ||
81 | |||
72 | /** | 82 | /** |
73 | * struct atmel_smc_cs_conf - SMC CS config as described in the datasheet. | 83 | * struct atmel_smc_cs_conf - SMC CS config as described in the datasheet. |
74 | * @setup: NCS/NWE/NRD setup timings (not applicable to at91rm9200) | 84 | * @setup: NCS/NWE/NRD setup timings (not applicable to at91rm9200) |
@@ -98,11 +108,15 @@ int atmel_smc_cs_conf_set_cycle(struct atmel_smc_cs_conf *conf, | |||
98 | unsigned int shift, unsigned int ncycles); | 108 | unsigned int shift, unsigned int ncycles); |
99 | void atmel_smc_cs_conf_apply(struct regmap *regmap, int cs, | 109 | void atmel_smc_cs_conf_apply(struct regmap *regmap, int cs, |
100 | const struct atmel_smc_cs_conf *conf); | 110 | const struct atmel_smc_cs_conf *conf); |
101 | void atmel_hsmc_cs_conf_apply(struct regmap *regmap, int cs, | 111 | void atmel_hsmc_cs_conf_apply(struct regmap *regmap, |
102 | const struct atmel_smc_cs_conf *conf); | 112 | const struct atmel_hsmc_reg_layout *reglayout, |
113 | int cs, const struct atmel_smc_cs_conf *conf); | ||
103 | void atmel_smc_cs_conf_get(struct regmap *regmap, int cs, | 114 | void atmel_smc_cs_conf_get(struct regmap *regmap, int cs, |
104 | struct atmel_smc_cs_conf *conf); | 115 | struct atmel_smc_cs_conf *conf); |
105 | void atmel_hsmc_cs_conf_get(struct regmap *regmap, int cs, | 116 | void atmel_hsmc_cs_conf_get(struct regmap *regmap, |
106 | struct atmel_smc_cs_conf *conf); | 117 | const struct atmel_hsmc_reg_layout *reglayout, |
118 | int cs, struct atmel_smc_cs_conf *conf); | ||
119 | const struct atmel_hsmc_reg_layout * | ||
120 | atmel_hsmc_get_reg_layout(struct device_node *np); | ||
107 | 121 | ||
108 | #endif /* _LINUX_MFD_SYSCON_ATMEL_SMC_H_ */ | 122 | #endif /* _LINUX_MFD_SYSCON_ATMEL_SMC_H_ */ |
diff --git a/include/linux/i2c/tps65010.h b/include/linux/mfd/tps65010.h index 08aa92278d71..a1fb9bc5311d 100644 --- a/include/linux/i2c/tps65010.h +++ b/include/linux/mfd/tps65010.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* linux/i2c/tps65010.h | 1 | /* linux/mfd/tps65010.h |
2 | * | 2 | * |
3 | * Functions to access TPS65010 power management device. | 3 | * Functions to access TPS65010 power management device. |
4 | * | 4 | * |
diff --git a/include/linux/mfd/tps68470.h b/include/linux/mfd/tps68470.h new file mode 100644 index 000000000000..44f9d9f647ed --- /dev/null +++ b/include/linux/mfd/tps68470.h | |||
@@ -0,0 +1,97 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2017 Intel Corporation | ||
3 | * | ||
4 | * Functions to access TPS68470 power management chip. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License as | ||
8 | * published by the Free Software Foundation version 2. | ||
9 | * | ||
10 | * This program is distributed "as is" WITHOUT ANY WARRANTY of any | ||
11 | * kind, whether express or implied; without even the implied warranty | ||
12 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | */ | ||
15 | |||
16 | #ifndef __LINUX_MFD_TPS68470_H | ||
17 | #define __LINUX_MFD_TPS68470_H | ||
18 | |||
19 | /* Register addresses */ | ||
20 | #define TPS68470_REG_POSTDIV2 0x06 | ||
21 | #define TPS68470_REG_BOOSTDIV 0x07 | ||
22 | #define TPS68470_REG_BUCKDIV 0x08 | ||
23 | #define TPS68470_REG_PLLSWR 0x09 | ||
24 | #define TPS68470_REG_XTALDIV 0x0A | ||
25 | #define TPS68470_REG_PLLDIV 0x0B | ||
26 | #define TPS68470_REG_POSTDIV 0x0C | ||
27 | #define TPS68470_REG_PLLCTL 0x0D | ||
28 | #define TPS68470_REG_PLLCTL2 0x0E | ||
29 | #define TPS68470_REG_CLKCFG1 0x0F | ||
30 | #define TPS68470_REG_CLKCFG2 0x10 | ||
31 | #define TPS68470_REG_GPCTL0A 0x14 | ||
32 | #define TPS68470_REG_GPCTL0B 0x15 | ||
33 | #define TPS68470_REG_GPCTL1A 0x16 | ||
34 | #define TPS68470_REG_GPCTL1B 0x17 | ||
35 | #define TPS68470_REG_GPCTL2A 0x18 | ||
36 | #define TPS68470_REG_GPCTL2B 0x19 | ||
37 | #define TPS68470_REG_GPCTL3A 0x1A | ||
38 | #define TPS68470_REG_GPCTL3B 0x1B | ||
39 | #define TPS68470_REG_GPCTL4A 0x1C | ||
40 | #define TPS68470_REG_GPCTL4B 0x1D | ||
41 | #define TPS68470_REG_GPCTL5A 0x1E | ||
42 | #define TPS68470_REG_GPCTL5B 0x1F | ||
43 | #define TPS68470_REG_GPCTL6A 0x20 | ||
44 | #define TPS68470_REG_GPCTL6B 0x21 | ||
45 | #define TPS68470_REG_SGPO 0x22 | ||
46 | #define TPS68470_REG_GPDI 0x26 | ||
47 | #define TPS68470_REG_GPDO 0x27 | ||
48 | #define TPS68470_REG_VCMVAL 0x3C | ||
49 | #define TPS68470_REG_VAUX1VAL 0x3D | ||
50 | #define TPS68470_REG_VAUX2VAL 0x3E | ||
51 | #define TPS68470_REG_VIOVAL 0x3F | ||
52 | #define TPS68470_REG_VSIOVAL 0x40 | ||
53 | #define TPS68470_REG_VAVAL 0x41 | ||
54 | #define TPS68470_REG_VDVAL 0x42 | ||
55 | #define TPS68470_REG_S_I2C_CTL 0x43 | ||
56 | #define TPS68470_REG_VCMCTL 0x44 | ||
57 | #define TPS68470_REG_VAUX1CTL 0x45 | ||
58 | #define TPS68470_REG_VAUX2CTL 0x46 | ||
59 | #define TPS68470_REG_VACTL 0x47 | ||
60 | #define TPS68470_REG_VDCTL 0x48 | ||
61 | #define TPS68470_REG_RESET 0x50 | ||
62 | #define TPS68470_REG_REVID 0xFF | ||
63 | |||
64 | #define TPS68470_REG_MAX TPS68470_REG_REVID | ||
65 | |||
66 | /* Register field definitions */ | ||
67 | |||
68 | #define TPS68470_REG_RESET_MASK GENMASK(7, 0) | ||
69 | #define TPS68470_VAVAL_AVOLT_MASK GENMASK(6, 0) | ||
70 | |||
71 | #define TPS68470_VDVAL_DVOLT_MASK GENMASK(5, 0) | ||
72 | #define TPS68470_VCMVAL_VCVOLT_MASK GENMASK(6, 0) | ||
73 | #define TPS68470_VIOVAL_IOVOLT_MASK GENMASK(6, 0) | ||
74 | #define TPS68470_VSIOVAL_IOVOLT_MASK GENMASK(6, 0) | ||
75 | #define TPS68470_VAUX1VAL_AUX1VOLT_MASK GENMASK(6, 0) | ||
76 | #define TPS68470_VAUX2VAL_AUX2VOLT_MASK GENMASK(6, 0) | ||
77 | |||
78 | #define TPS68470_VACTL_EN_MASK GENMASK(0, 0) | ||
79 | #define TPS68470_VDCTL_EN_MASK GENMASK(0, 0) | ||
80 | #define TPS68470_VCMCTL_EN_MASK GENMASK(0, 0) | ||
81 | #define TPS68470_S_I2C_CTL_EN_MASK GENMASK(1, 0) | ||
82 | #define TPS68470_VAUX1CTL_EN_MASK GENMASK(0, 0) | ||
83 | #define TPS68470_VAUX2CTL_EN_MASK GENMASK(0, 0) | ||
84 | #define TPS68470_PLL_EN_MASK GENMASK(0, 0) | ||
85 | |||
86 | #define TPS68470_CLKCFG1_MODE_A_MASK GENMASK(1, 0) | ||
87 | #define TPS68470_CLKCFG1_MODE_B_MASK GENMASK(3, 2) | ||
88 | |||
89 | #define TPS68470_GPIO_CTL_REG_A(x) (TPS68470_REG_GPCTL0A + (x) * 2) | ||
90 | #define TPS68470_GPIO_CTL_REG_B(x) (TPS68470_REG_GPCTL0B + (x) * 2) | ||
91 | #define TPS68470_GPIO_MODE_MASK GENMASK(1, 0) | ||
92 | #define TPS68470_GPIO_MODE_IN 0 | ||
93 | #define TPS68470_GPIO_MODE_IN_PULLUP 1 | ||
94 | #define TPS68470_GPIO_MODE_OUT_CMOS 2 | ||
95 | #define TPS68470_GPIO_MODE_OUT_ODRAIN 3 | ||
96 | |||
97 | #endif /* __LINUX_MFD_TPS68470_H */ | ||
diff --git a/include/linux/i2c/twl.h b/include/linux/mfd/twl.h index 9ad7828d9d34..9ad7828d9d34 100644 --- a/include/linux/i2c/twl.h +++ b/include/linux/mfd/twl.h | |||
diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c index d439c4c6fe50..c482b2e7a7d2 100644 --- a/sound/soc/codecs/twl4030.c +++ b/sound/soc/codecs/twl4030.c | |||
@@ -28,7 +28,7 @@ | |||
28 | #include <linux/platform_device.h> | 28 | #include <linux/platform_device.h> |
29 | #include <linux/of.h> | 29 | #include <linux/of.h> |
30 | #include <linux/of_gpio.h> | 30 | #include <linux/of_gpio.h> |
31 | #include <linux/i2c/twl.h> | 31 | #include <linux/mfd/twl.h> |
32 | #include <linux/slab.h> | 32 | #include <linux/slab.h> |
33 | #include <linux/gpio.h> | 33 | #include <linux/gpio.h> |
34 | #include <sound/core.h> | 34 | #include <sound/core.h> |