1
This series adds initial support for the Samsung S2MPG10 PMIC using the
1
This series adds initial support for the Samsung S2MPG10 PMIC using the
2
MFD framework. This is a PMIC for mobile applications and is used on
2
MFD framework. This is a PMIC for mobile applications and is used on
3
the Google Pixel 6 and 6 Pro (oriole / raven).
3
the Google Pixel 6 and 6 Pro (oriole / raven).
4
4
5
*** dependency note ***
5
*** dependency note ***
6
6
7
This depends on the Samsung ACPM driver in Linux next, and runtime
7
To compile, this depends on the Samsung ACPM driver in Linux next with
8
depends on some fixes for it:
8
the following additional patches:
9
https://lore.kernel.org/all/20250321-acpm-atomic-v1-0-fb887bde7e61@linaro.org/
9
https://lore.kernel.org/all/20250324-acpm-atomic-v2-0-7d87746e1765@linaro.org/
10
https://lore.kernel.org/all/20250319-acpm-fixes-v2-0-ac2c1bcf322b@linaro.org/
10
https://lore.kernel.org/all/20250319-acpm-fixes-v2-0-ac2c1bcf322b@linaro.org/
11
https://lore.kernel.org/all/20250327-acpm-children-v1-0-0afe15ee2ff7@linaro.org/
11
12
12
*** dependency note end ***
13
*** dependency note end ***
13
14
14
+++ Kconfig update +++
15
+++ Kconfig update +++
15
16
...
...
24
+++ Kconfig update end +++
25
+++ Kconfig update end +++
25
26
26
This series must be applied in-order, due to interdependencies of some
27
This series must be applied in-order, due to interdependencies of some
27
of the patches. There are also various cleanup patches to the S2M
28
of the patches. There are also various cleanup patches to the S2M
28
drivers. I've kept them ordered as:
29
drivers. I've kept them ordered as:
29
* DT bindings (patches 1 ... 2)
30
* DT bindings (patches 1 ... 3)
30
* EXPORT_SYMBOL ACPM's devm_acpm_get_by_phandle() (patch 3)
31
* s2m mfd prep for adding S2MPG10 support (patches 4 ... 7)
31
* S2M MFD prep for adding S2MPG10 to MFD core (patches 4 ... 11)
32
* split S2M mfd driver into s2m-core and s2m-i2c, including the
32
* S2MPG10 core driver (patch 12)
33
kconfig symbol update (patch 8)
33
* S2M MFD cleanup patches (patches 14 ... 25)
34
* S2MPG10 core driver (patch 9)
34
* S2MPG10 clock driver (patch 26)
35
* s2m mfd driver cleanup patches (patches 10 ... 23)
35
* S2M RTC prep for adding S2MPG10 (patch 27 ... 28)
36
* S2MPG10 clock driver (patch 24)
36
* S2MPG10 RTC driver (patch 29)
37
* s2m RTC prep for adding S2MPG10 (patch 25 ... 26)
37
* S2M RTC cleanup patches (patches 30 ... 33)
38
* S2MPG10 RTC driver (patch 27)
39
* s2m RTC cleanup patches (patches 28 ... 31)
38
40
39
I realise these are many, but since some prep-work was required to be
41
I realise these are many, but since some prep-work was required to be
40
able to add S2MPG anyway, I wanted to get the cleanup patches in as
42
able to add S2MPG anyway, I wanted to get the cleanup patches in as
41
well :-) Let me know if I should postpone them to a later date instead.
43
well :-) Let me know if I should postpone them to a later date instead.
42
44
...
...
54
Cheers,
56
Cheers,
55
Andre'
57
Andre'
56
58
57
Signed-off-by: André Draszik <andre.draszik@linaro.org>
59
Signed-off-by: André Draszik <andre.draszik@linaro.org>
58
---
60
---
59
André Draszik (34):
61
Changes in v4:
62
- various updates to sec-acpm (patch 9, Lee)
63
- cache enum type in patch 25 (Krzysztof)
64
- collect tags
65
- Link to v3: https://lore.kernel.org/r/20250403-s2mpg10-v3-0-b542b3505e68@linaro.org
66
67
Changes in v3:
68
- Krzysztof:
69
- keep 'regulators' subnode required even for s2mpg10
70
- drop '$ref' and 'unevaluatedProperties' from pmic subnode, use
71
'additionalProperties' instead
72
- add some regulators to examples since s2mpg10 requires them as of
73
v3
74
- sec-acpm:
75
- use an enum for struct sec_acpm_bus_context::type
76
- consistent name space for all functions sec_pmic_acpm_... to be
77
similar to i2c and consistent in this file
78
- Link to v2: https://lore.kernel.org/r/20250328-s2mpg10-v2-0-b54dee33fb6b@linaro.org
79
80
Changes in v2:
81
- Rob:
82
- make PMIC node a child of ACPM, and all related changes (binding,
83
driver)
84
- Krzysztof:
85
- merge defconfig updates into patch changing the symbols (patch 8)
86
- split MODULE_AUTHOR update into a separate patch
87
- better alignment fix (patch 11)
88
- merge two s2dos05/s2mpu05 related patches into one (patch 14)
89
- myself:
90
- keep PMIC DT parsing in core, not in transport driver
91
- several updates in sec-acpm.c, see separate entries in patch 9
92
- fix typo in patch 17
93
- collect tags
94
- Link to v1: https://lore.kernel.org/r/20250323-s2mpg10-v1-0-d08943702707@linaro.org
95
96
---
97
André Draszik (32):
60
dt-bindings: mfd: samsung,s2mps11: add s2mpg10
98
dt-bindings: mfd: samsung,s2mps11: add s2mpg10
61
dt-bindings: clock: samsung,s2mps11: add s2mpg10
99
dt-bindings: clock: samsung,s2mps11: add s2mpg10
62
firmware: exynos-acpm: export devm_acpm_get_by_phandle()
100
dt-bindings: firmware: google,gs101-acpm-ipc: add PMIC child node
63
mfd: sec: drop non-existing forward declarations
101
mfd: sec-core: Drop non-existing forward declarations
64
mfd: sec: sort includes alphabetically
102
mfd: sec: Sort includes alphabetically
65
mfd: sec: update includes to add missing and remove superfluous ones
103
mfd: sec: Update includes to add missing and remove superfluous ones
66
mfd: sec: move private internal API to internal header
104
mfd: sec: Move private internal API to internal header
67
mfd: sec: fix open parenthesis alignment (of_property_read_bool)
105
mfd: sec: Split into core and transport (i2c) drivers
68
mfd: sec: slightly rework runtime platform data allocation
106
mfd: sec: Add support for S2MPG10 PMIC
69
mfd: sec: split into core and transport (i2c) drivers
107
mfd: sec: Merge separate core and irq modules
70
defconfigs: rename CONFIG_MFD_SEC_CORE to CONFIG_MFD_SEC_I2C
108
mfd: sec-common: Fix multiple trivial whitespace issues
71
mfd: sec: add support for S2MPG10 PMIC
109
mfd: sec-i2c: Sort struct of_device_id entries and the device type switch
72
mfd: sec: merge separate core and irq modules
110
mfd: sec: Use dev_err_probe() where appropriate
73
mfd: sec: sort struct of_device_id entries and the device type switch
111
mfd: sec-i2c: s2dos05/s2mpu05: Use explicit regmap config and drop default
74
mfd: sec: use dev_err_probe() where appropriate
112
mfd: sec-irq: s2dos05 doesn't support interrupts
75
mfd: sec: s2dos05/s2mpu05: use explicit regmap config
113
mfd: sec-common: Don't ignore errors from sec_irq_init()
76
mfd: sec: drop generic regmap config
114
mfd: sec-i2c: Rework platform data and regmap instantiating
77
mfd: sec: s2dos05: doesn't support interrupts (it seems)
115
mfd: sec: Change device_type to int
78
mfd: sec: don't ignore errors from sec_irq_init()
116
mfd: sec: Don't compare against NULL / 0 for errors, use !
79
mfd: sec: rework platform data and regmap instantiating
117
mfd: sec-common: Use sizeof(*var), not sizeof(struct type_of_var)
80
mfd: sec: change device_type to int
118
mfd: sec-common: Convert to using MFD_CELL macros
81
mfd: sec: don't compare against NULL / 0 for errors, use !
119
mfd: sec-irq: Convert to using REGMAP_IRQ_REG() macros
82
mfd: sec: use sizeof(*var), not sizeof(struct type_of_var)
120
mfd: sec: Add myself as module author
83
mfd: sec: convert to using MFD_CELL macros
84
mfd: sec: convert to using REGMAP_IRQ_REG() macros
85
clk: s2mps11: add support for S2MPG10 PMIC clock
121
clk: s2mps11: add support for S2MPG10 PMIC clock
86
rtc: s5m: cache value of platform_get_device_id() during probe
122
rtc: s5m: cache device type during probe
87
rtc: s5m: prepare for external regmap
123
rtc: s5m: prepare for external regmap
88
rtc: s5m: add support for S2MPG10 RTC
124
rtc: s5m: add support for S2MPG10 RTC
89
rtc: s5m: fix a typo: peding -> pending
125
rtc: s5m: fix a typo: peding -> pending
90
rtc: s5m: switch to devm_device_init_wakeup
126
rtc: s5m: switch to devm_device_init_wakeup
91
rtc: s5m: replace regmap_update_bits with regmap_clear/set_bits
127
rtc: s5m: replace regmap_update_bits with regmap_clear/set_bits
92
rtc: s5m: replace open-coded read/modify/write registers with regmap helpers
128
rtc: s5m: replace open-coded read/modify/write registers with regmap helpers
93
MAINTAINERS: add myself as reviewer for Samsung S2M MFD
129
MAINTAINERS: add myself as reviewer for Samsung S2M MFD
94
130
95
.../devicetree/bindings/clock/samsung,s2mps11.yaml | 1 +
131
.../devicetree/bindings/clock/samsung,s2mps11.yaml | 1 +
96
.../devicetree/bindings/mfd/samsung,s2mps11.yaml | 34 +-
132
.../bindings/firmware/google,gs101-acpm-ipc.yaml | 35 ++
133
.../devicetree/bindings/mfd/samsung,s2mps11.yaml | 26 +-
97
MAINTAINERS | 3 +-
134
MAINTAINERS | 3 +-
98
arch/arm/configs/exynos_defconfig | 2 +-
135
arch/arm/configs/exynos_defconfig | 2 +-
99
arch/arm/configs/multi_v7_defconfig | 2 +-
136
arch/arm/configs/multi_v7_defconfig | 2 +-
100
arch/arm/configs/pxa_defconfig | 2 +-
137
arch/arm/configs/pxa_defconfig | 2 +-
101
arch/arm64/configs/defconfig | 2 +-
138
arch/arm64/configs/defconfig | 2 +-
102
drivers/clk/clk-s2mps11.c | 8 +
139
drivers/clk/clk-s2mps11.c | 8 +
103
drivers/firmware/samsung/exynos-acpm.c | 1 +
104
drivers/mfd/Kconfig | 35 +-
140
drivers/mfd/Kconfig | 35 +-
105
drivers/mfd/Makefile | 5 +-
141
drivers/mfd/Makefile | 5 +-
106
drivers/mfd/sec-acpm.c | 471 ++++++++++++++++++++
142
drivers/mfd/sec-acpm.c | 442 +++++++++++++++++++
107
drivers/mfd/sec-common.c | 284 ++++++++++++
143
drivers/mfd/sec-common.c | 301 +++++++++++++
108
drivers/mfd/sec-core.c | 481 ---------------------
144
drivers/mfd/sec-core.c | 481 ---------------------
109
drivers/mfd/sec-core.h | 32 ++
145
drivers/mfd/sec-core.h | 23 +
110
drivers/mfd/sec-i2c.c | 259 +++++++++++
146
drivers/mfd/sec-i2c.c | 239 ++++++++++
111
drivers/mfd/sec-irq.c | 461 +++++++-------------
147
drivers/mfd/sec-irq.c | 460 +++++++-------------
112
drivers/rtc/rtc-s5m.c | 197 ++++++---
148
drivers/rtc/rtc-s5m.c | 197 ++++++---
113
include/linux/mfd/samsung/core.h | 7 +-
149
include/linux/mfd/samsung/core.h | 7 +-
114
include/linux/mfd/samsung/irq.h | 103 +++++
150
include/linux/mfd/samsung/irq.h | 103 +++++
115
include/linux/mfd/samsung/rtc.h | 37 ++
151
include/linux/mfd/samsung/rtc.h | 37 ++
116
include/linux/mfd/samsung/s2mpg10.h | 310 +++++++++++++
152
include/linux/mfd/samsung/s2mpg10.h | 454 +++++++++++++++++++
117
22 files changed, 1872 insertions(+), 865 deletions(-)
153
22 files changed, 2001 insertions(+), 864 deletions(-)
118
---
154
---
119
base-commit: c4d4884b67802c41fd67399747165d65c770621a
155
base-commit: f58dd835f82a5dda6c9d3895ee6f15016431fb1f
120
change-id: 20250321-s2mpg10-ef5d1ebd3043
156
change-id: 20250321-s2mpg10-ef5d1ebd3043
121
157
122
Best regards,
158
Best regards,
123
--
159
--
124
André Draszik <andre.draszik@linaro.org>
160
André Draszik <andre.draszik@linaro.org>
125
161
diff view generated by jsdifflib
...
...
4
It is a Power Management IC for mobile applications with buck
4
It is a Power Management IC for mobile applications with buck
5
converters, various LDOs, power meters, RTC, clock outputs, and
5
converters, various LDOs, power meters, RTC, clock outputs, and
6
additional GPIOs interfaces.
6
additional GPIOs interfaces.
7
7
8
Unlike other Samsung PMICs, communication is not via I2C, but via the
8
Unlike other Samsung PMICs, communication is not via I2C, but via the
9
Samsung ACPM firmware, it therefore doesn't need a 'reg' property but a
9
Samsung ACPM firmware, it therefore doesn't need a 'reg' property but
10
handle to the ACPM firmware node instead.
10
needs to be a child of the ACPM firmware node instead.
11
11
12
S2MPG10 can also act as a system power controller allowing
12
S2MPG10 can also act as a system power controller allowing
13
implementation of a true cold-reset of the system.
13
implementation of a true cold-reset of the system.
14
14
15
Support for the other components will be added in subsequent future
15
Support for the other components like regulators and power meters will
16
patches.
16
be added in subsequent future patches.
17
17
18
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
18
Signed-off-by: André Draszik <andre.draszik@linaro.org>
19
Signed-off-by: André Draszik <andre.draszik@linaro.org>
19
---
20
---
20
.../devicetree/bindings/mfd/samsung,s2mps11.yaml | 34 ++++++++++++++++++++--
21
v3:
21
1 file changed, 32 insertions(+), 2 deletions(-)
22
* keep 'regulators' subnode required even for s2mpg10 (Krzysztof)
23
24
v2:
25
* drop ACPM phandle 'exynos,acpm-ipc', and expect this to be a child
26
node of ACPM directly instead
27
* allow, but still don't enforce, regulators subnode, to ease adding it
28
in the future
29
* deny 'reg' property, it's incorrect to optionally have it for S2MPG10
30
* enforce 'interrupts' or 'interrupts-extended' property. S2MPG10 can
31
not work without. Note this is done as-is using the oneOf, because
32
dtschema's fixups.py doesn't handle this nesting itself
33
---
34
.../devicetree/bindings/mfd/samsung,s2mps11.yaml | 26 +++++++++++++++++++++-
35
1 file changed, 25 insertions(+), 1 deletion(-)
22
36
23
diff --git a/Documentation/devicetree/bindings/mfd/samsung,s2mps11.yaml b/Documentation/devicetree/bindings/mfd/samsung,s2mps11.yaml
37
diff --git a/Documentation/devicetree/bindings/mfd/samsung,s2mps11.yaml b/Documentation/devicetree/bindings/mfd/samsung,s2mps11.yaml
24
index XXXXXXX..XXXXXXX 100644
38
index XXXXXXX..XXXXXXX 100644
25
--- a/Documentation/devicetree/bindings/mfd/samsung,s2mps11.yaml
39
--- a/Documentation/devicetree/bindings/mfd/samsung,s2mps11.yaml
26
+++ b/Documentation/devicetree/bindings/mfd/samsung,s2mps11.yaml
40
+++ b/Documentation/devicetree/bindings/mfd/samsung,s2mps11.yaml
...
...
31
+ - samsung,s2mpg10-pmic
45
+ - samsung,s2mpg10-pmic
32
- samsung,s2mps11-pmic
46
- samsung,s2mps11-pmic
33
- samsung,s2mps13-pmic
47
- samsung,s2mps13-pmic
34
- samsung,s2mps14-pmic
48
- samsung,s2mps14-pmic
35
@@ -XXX,XX +XXX,XX @@ properties:
49
@@ -XXX,XX +XXX,XX @@ properties:
36
description:
37
List of child nodes that specify the regulators.
38
39
+ exynos,acpm-ipc:
40
+ $ref: /schemas/types.yaml#/definitions/phandle
41
+ description: |
42
+ Phandle to the ACPM node for when ACPM is used to communicate with the
43
+ PMIC, rather than I2C.
44
+
45
samsung,s2mps11-acokb-ground:
46
description: |
47
Indicates that ACOKB pin of S2MPS11 PMIC is connected to the ground so
48
@@ -XXX,XX +XXX,XX @@ properties:
49
reset (setting buck voltages to default values).
50
reset (setting buck voltages to default values).
50
type: boolean
51
type: boolean
51
52
52
+ system-power-controller: true
53
+ system-power-controller: true
53
+
54
+
54
wakeup-source: true
55
wakeup-source: true
55
56
56
required:
57
required:
57
- compatible
58
- compatible
58
- - reg
59
- - reg
59
- - regulators
60
- regulators
60
61
61
additionalProperties: false
62
additionalProperties: false
62
63
63
allOf:
64
allOf:
64
+ - if:
65
+ - if:
65
+ properties:
66
+ properties:
66
+ compatible:
67
+ compatible:
67
+ contains:
68
+ contains:
68
+ const: samsung,s2mpg10-pmic
69
+ const: samsung,s2mpg10-pmic
69
+ then:
70
+ then:
70
+ properties:
71
+ properties:
71
+ regulators: false
72
+ reg: false
72
+ samsung,s2mps11-acokb-ground: false
73
+ samsung,s2mps11-acokb-ground: false
73
+ samsung,s2mps11-wrstbi-ground: false
74
+ samsung,s2mps11-wrstbi-ground: false
74
+
75
+
75
+ required:
76
+ oneOf:
76
+ - exynos,acpm-ipc
77
+ - required: [interrupts]
78
+ - required: [interrupts-extended]
77
+
79
+
78
+ else:
80
+ else:
79
+ properties:
81
+ properties:
80
+ exynos,acpm-ipc: false
81
+ system-power-controller: false
82
+ system-power-controller: false
82
+
83
+
83
+ required:
84
+ required:
84
+ - reg
85
+ - reg
85
+ - regulators
86
+
86
+
87
- if:
87
- if:
88
properties:
88
properties:
89
compatible:
89
compatible:
90
90
91
--
91
--
92
2.49.0.395.g12beb8f557-goog
92
2.49.0.604.gff1f9ca942-goog
93
93
diff view generated by jsdifflib
1
The Samsung S2MPG10 clock controller is similar to the existing clock
1
The Samsung S2MPG10 clock controller is similar to the existing clock
2
controllers supported by this binding. Register offsets / layout are
2
controllers supported by this binding. Register offsets / layout are
3
slightly different, so it needs its own compatible.
3
slightly different, so it needs its own compatible.
4
4
5
Acked-by: Stephen Boyd <sboyd@kernel.org>
6
Acked-by: Rob Herring (Arm) <robh@kernel.org>
5
Signed-off-by: André Draszik <andre.draszik@linaro.org>
7
Signed-off-by: André Draszik <andre.draszik@linaro.org>
6
---
8
---
7
Documentation/devicetree/bindings/clock/samsung,s2mps11.yaml | 1 +
9
Documentation/devicetree/bindings/clock/samsung,s2mps11.yaml | 1 +
8
1 file changed, 1 insertion(+)
10
1 file changed, 1 insertion(+)
9
11
...
...
19
- samsung,s2mps11-clk
21
- samsung,s2mps11-clk
20
- samsung,s2mps13-clk # S2MPS13 and S2MPS15
22
- samsung,s2mps13-clk # S2MPS13 and S2MPS15
21
- samsung,s2mps14-clk
23
- samsung,s2mps14-clk
22
24
23
--
25
--
24
2.49.0.395.g12beb8f557-goog
26
2.49.0.604.gff1f9ca942-goog
25
27
diff view generated by jsdifflib
Deleted patch
1
The upcoming Samsung S2MPG10 PMIC driver will need this symbol to
2
communicate with the IC.
3
1
4
Export it.
5
6
Signed-off-by: André Draszik <andre.draszik@linaro.org>
7
---
8
drivers/firmware/samsung/exynos-acpm.c | 1 +
9
1 file changed, 1 insertion(+)
10
11
diff --git a/drivers/firmware/samsung/exynos-acpm.c b/drivers/firmware/samsung/exynos-acpm.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/drivers/firmware/samsung/exynos-acpm.c
14
+++ b/drivers/firmware/samsung/exynos-acpm.c
15
@@ -XXX,XX +XXX,XX @@ const struct acpm_handle *devm_acpm_get_by_phandle(struct device *dev,
16
17
    return handle;
18
}
19
+EXPORT_SYMBOL_GPL(devm_acpm_get_by_phandle);
20
21
static const struct acpm_match_data acpm_gs101 = {
22
    .initdata_base = ACPM_GS101_INITDATA_BASE,
23
24
--
25
2.49.0.395.g12beb8f557-goog
26
diff view generated by jsdifflib
1
We are adding support for Samsung PMICs that aren't using I2C and
1
The PMIC is supposed to be a child of ACPM, add it here to describe the
2
therefore had to rename the Kconfig symbol.
2
connection.
3
3
4
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
4
Signed-off-by: André Draszik <andre.draszik@linaro.org>
5
Signed-off-by: André Draszik <andre.draszik@linaro.org>
5
---
6
---
6
arch/arm/configs/exynos_defconfig | 2 +-
7
v3:
7
arch/arm/configs/multi_v7_defconfig | 2 +-
8
- drop '$ref' and 'unevaluatedProperties' from pmic subnode, use
8
arch/arm/configs/pxa_defconfig | 2 +-
9
'additionalProperties' instead (Krzysztof)
9
arch/arm64/configs/defconfig | 2 +-
10
- add some regulators to examples since s2mpg10 requires them as of v3
10
4 files changed, 4 insertions(+), 4 deletions(-)
11
---
12
.../bindings/firmware/google,gs101-acpm-ipc.yaml | 35 ++++++++++++++++++++++
13
1 file changed, 35 insertions(+)
11
14
12
diff --git a/arch/arm/configs/exynos_defconfig b/arch/arm/configs/exynos_defconfig
15
diff --git a/Documentation/devicetree/bindings/firmware/google,gs101-acpm-ipc.yaml b/Documentation/devicetree/bindings/firmware/google,gs101-acpm-ipc.yaml
13
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
14
--- a/arch/arm/configs/exynos_defconfig
17
--- a/Documentation/devicetree/bindings/firmware/google,gs101-acpm-ipc.yaml
15
+++ b/arch/arm/configs/exynos_defconfig
18
+++ b/Documentation/devicetree/bindings/firmware/google,gs101-acpm-ipc.yaml
16
@@ -XXX,XX +XXX,XX @@ CONFIG_MFD_MAX77686=y
19
@@ -XXX,XX +XXX,XX @@ properties:
17
CONFIG_MFD_MAX77693=y
20
mboxes:
18
CONFIG_MFD_MAX8997=y
21
maxItems: 1
19
CONFIG_MFD_MAX8998=y
22
20
-CONFIG_MFD_SEC_CORE=y
23
+ pmic:
21
+CONFIG_MFD_SEC_I2C=y
24
+ description: Child node describing the main PMIC.
22
CONFIG_MFD_STMPE=y
25
+ type: object
23
CONFIG_STMPE_I2C=y
26
+ additionalProperties: true
24
CONFIG_MFD_TPS65090=y
27
+
25
diff --git a/arch/arm/configs/multi_v7_defconfig b/arch/arm/configs/multi_v7_defconfig
28
+ properties:
26
index XXXXXXX..XXXXXXX 100644
29
+ compatible:
27
--- a/arch/arm/configs/multi_v7_defconfig
30
+ const: samsung,s2mpg10-pmic
28
+++ b/arch/arm/configs/multi_v7_defconfig
31
+
29
@@ -XXX,XX +XXX,XX @@ CONFIG_MFD_QCOM_RPM=y
32
shmem:
30
CONFIG_MFD_SPMI_PMIC=y
33
description:
31
CONFIG_MFD_RK8XX_I2C=y
34
List of phandle pointing to the shared memory (SHM) area. The memory
32
CONFIG_MFD_RN5T618=y
35
@@ -XXX,XX +XXX,XX @@ additionalProperties: false
33
-CONFIG_MFD_SEC_CORE=y
36
34
+CONFIG_MFD_SEC_I2C=y
37
examples:
35
CONFIG_MFD_STMPE=y
38
- |
36
CONFIG_MFD_PALMAS=y
39
+ #include <dt-bindings/interrupt-controller/irq.h>
37
CONFIG_MFD_TPS65090=y
40
+
38
diff --git a/arch/arm/configs/pxa_defconfig b/arch/arm/configs/pxa_defconfig
41
power-management {
39
index XXXXXXX..XXXXXXX 100644
42
compatible = "google,gs101-acpm-ipc";
40
--- a/arch/arm/configs/pxa_defconfig
43
mboxes = <&ap2apm_mailbox>;
41
+++ b/arch/arm/configs/pxa_defconfig
44
shmem = <&apm_sram>;
42
@@ -XXX,XX +XXX,XX @@ CONFIG_MFD_MAX77693=y
45
+
43
CONFIG_MFD_MAX8907=m
46
+ pmic {
44
CONFIG_EZX_PCAP=y
47
+ compatible = "samsung,s2mpg10-pmic";
45
CONFIG_UCB1400_CORE=m
48
+ interrupts-extended = <&gpa0 6 IRQ_TYPE_LEVEL_LOW>;
46
-CONFIG_MFD_SEC_CORE=y
49
+
47
+CONFIG_MFD_SEC_I2C=y
50
+ regulators {
48
CONFIG_MFD_PALMAS=y
51
+ LDO1 {
49
CONFIG_MFD_TPS65090=y
52
+ regulator-name = "vdd_ldo1";
50
CONFIG_MFD_TPS6586X=y
53
+ regulator-min-microvolt = <700000>;
51
diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig
54
+ regulator-max-microvolt = <1300000>;
52
index XXXXXXX..XXXXXXX 100644
55
+ regulator-always-on;
53
--- a/arch/arm64/configs/defconfig
56
+ };
54
+++ b/arch/arm64/configs/defconfig
57
+
55
@@ -XXX,XX +XXX,XX @@ CONFIG_MFD_MT6397=y
58
+ // ...
56
CONFIG_MFD_SPMI_PMIC=y
59
+
57
CONFIG_MFD_RK8XX_I2C=y
60
+ BUCK1 {
58
CONFIG_MFD_RK8XX_SPI=y
61
+ regulator-name = "vdd_mif";
59
-CONFIG_MFD_SEC_CORE=y
62
+ regulator-min-microvolt = <450000>;
60
+CONFIG_MFD_SEC_I2C=y
63
+ regulator-max-microvolt = <1300000>;
61
CONFIG_MFD_SL28CPLD=y
64
+ regulator-always-on;
62
CONFIG_RZ_MTU3=y
65
+ regulator-boot-on;
63
CONFIG_MFD_TI_AM335X_TSCADC=m
66
+ };
67
+ };
68
+ };
69
};
64
70
65
--
71
--
66
2.49.0.395.g12beb8f557-goog
72
2.49.0.604.gff1f9ca942-goog
67
73
diff view generated by jsdifflib
...
...
3
devm_mfd_add_devices and devm_regmap_add_irq_chip") while the
3
devm_mfd_add_devices and devm_regmap_add_irq_chip") while the
4
prototypes were left. They should be removed.
4
prototypes were left. They should be removed.
5
5
6
Do so.
6
Do so.
7
7
8
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
8
Signed-off-by: André Draszik <andre.draszik@linaro.org>
9
Signed-off-by: André Draszik <andre.draszik@linaro.org>
9
---
10
---
10
include/linux/mfd/samsung/core.h | 2 --
11
include/linux/mfd/samsung/core.h | 2 --
11
1 file changed, 2 deletions(-)
12
1 file changed, 2 deletions(-)
12
13
...
...
23
24
24
struct sec_platform_data {
25
struct sec_platform_data {
25
    struct sec_regulator_data    *regulators;
26
    struct sec_regulator_data    *regulators;
26
27
27
--
28
--
28
2.49.0.395.g12beb8f557-goog
29
2.49.0.604.gff1f9ca942-goog
29
30
diff view generated by jsdifflib
1
Sorting headers alphabetically helps locating duplicates, and makes it
1
Sorting headers alphabetically helps locating duplicates, and makes it
2
easier to figure out where to insert new headers.
2
easier to figure out where to insert new headers.
3
3
4
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
4
Signed-off-by: André Draszik <andre.draszik@linaro.org>
5
Signed-off-by: André Draszik <andre.draszik@linaro.org>
5
---
6
---
6
drivers/mfd/sec-core.c | 14 +++++++-------
7
drivers/mfd/sec-core.c | 14 +++++++-------
7
drivers/mfd/sec-irq.c | 5 ++---
8
drivers/mfd/sec-irq.c | 5 ++---
8
2 files changed, 9 insertions(+), 10 deletions(-)
9
2 files changed, 9 insertions(+), 10 deletions(-)
...
...
66
67
67
static const struct regmap_irq s2mps11_irqs[] = {
68
static const struct regmap_irq s2mps11_irqs[] = {
68
    [S2MPS11_IRQ_PWRONF] = {
69
    [S2MPS11_IRQ_PWRONF] = {
69
70
70
--
71
--
71
2.49.0.395.g12beb8f557-goog
72
2.49.0.604.gff1f9ca942-goog
72
73
diff view generated by jsdifflib
...
...
6
implicit dependencies and spurious build breakage if someone rearranged
6
implicit dependencies and spurious build breakage if someone rearranged
7
headers, as this could cause the implicit includes to be dropped.
7
headers, as this could cause the implicit includes to be dropped.
8
8
9
Include the relevant headers explicitly and drop superfluous ones.
9
Include the relevant headers explicitly and drop superfluous ones.
10
10
11
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
11
Signed-off-by: André Draszik <andre.draszik@linaro.org>
12
Signed-off-by: André Draszik <andre.draszik@linaro.org>
12
---
13
---
13
drivers/mfd/sec-core.c | 7 +++----
14
drivers/mfd/sec-core.c | 7 +++----
14
drivers/mfd/sec-irq.c | 5 ++++-
15
drivers/mfd/sec-irq.c | 5 ++++-
15
2 files changed, 7 insertions(+), 5 deletions(-)
16
2 files changed, 7 insertions(+), 5 deletions(-)
...
...
61
#include <linux/interrupt.h>
62
#include <linux/interrupt.h>
62
#include <linux/irq.h>
63
#include <linux/irq.h>
63
#include <linux/mfd/samsung/core.h>
64
#include <linux/mfd/samsung/core.h>
64
65
65
--
66
--
66
2.49.0.395.g12beb8f557-goog
67
2.49.0.604.gff1f9ca942-goog
67
68
diff view generated by jsdifflib
...
...
5
we'll also be adding more internal APIs, which again shouldn't be in
5
we'll also be adding more internal APIs, which again shouldn't be in
6
the public header.
6
the public header.
7
7
8
Move it into a new internal include.
8
Move it into a new internal include.
9
9
10
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
10
Signed-off-by: André Draszik <andre.draszik@linaro.org>
11
Signed-off-by: André Draszik <andre.draszik@linaro.org>
11
---
12
---
12
MAINTAINERS | 2 +-
13
MAINTAINERS | 2 +-
13
drivers/mfd/sec-core.c | 1 +
14
drivers/mfd/sec-core.c | 1 +
14
drivers/mfd/sec-core.h | 15 +++++++++++++++
15
drivers/mfd/sec-core.h | 15 +++++++++++++++
...
...
87
struct sec_platform_data {
88
struct sec_platform_data {
88
    struct sec_regulator_data    *regulators;
89
    struct sec_regulator_data    *regulators;
89
    struct sec_opmode_data        *opmode;
90
    struct sec_opmode_data        *opmode;
90
91
91
--
92
--
92
2.49.0.395.g12beb8f557-goog
93
2.49.0.604.gff1f9ca942-goog
93
94
diff view generated by jsdifflib
1
As a preparation for adding support for Samsung's S2MPG10, which is
1
As a preparation for adding support for Samsung's S2MPG10, which is
2
connected via SPEEDY / ACPM rather than I2C, split out (move) all
2
connected via SPEEDY / ACPM rather than I2C, split out (move) all
3
I2C-specific driver code into its own kernel module, sec-i2c, and
3
I2C-specific driver code into its own kernel module, sec-i2c, and
4
make the existing sec-core module be just the transport-agnostic core
4
make the existing sec-core module be just the transport-agnostic core
5
driver kernel module.
5
driver kernel module.
6
6
7
Also add myself to MODULE_AUTHOR() and update file headers due to that
7
At the same time, update all defconfigs that reference the old kconfig
8
and all the follow-up rework.
8
symbol name.
9
9
10
While at it, also update file header comments and module description(s)
11
to drop references to 'mfd', and update comments to be C-style, not
12
C++.
13
14
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
10
Signed-off-by: André Draszik <andre.draszik@linaro.org>
15
Signed-off-by: André Draszik <andre.draszik@linaro.org>
11
16
---
12
--
13
Note: checkpatch complains about missing help for MFD_SEC_I2C here, but
17
Note: checkpatch complains about missing help for MFD_SEC_I2C here, but
14
that's a false-positive due to patch context.
18
that's a false-positive due to patch context.
15
It also suggests to update MAINTAINERS, but the new file is covered
19
It also suggests to update MAINTAINERS, but the new file is covered
16
already due to using a wildcard.
20
already due to using a wildcard.
21
22
v2:
23
* split MODULE_AUTHOR update out of this patch (Krzysztof)
24
* keep DT parsing in core, not in transport driver
25
(sec_pmic_i2c_parse_dt_pdata / sec_pmic_parse_dt_pdata)
26
* merge defconfig updates into this patch (Krzysztof)
17
---
27
---
18
drivers/mfd/Kconfig | 18 ++--
28
arch/arm/configs/exynos_defconfig | 2 +-
19
drivers/mfd/Makefile | 1 +
29
arch/arm/configs/multi_v7_defconfig | 2 +-
20
drivers/mfd/sec-core.c | 268 +++++++------------------------------------------
30
arch/arm/configs/pxa_defconfig | 2 +-
21
drivers/mfd/sec-core.h | 17 ++++
31
arch/arm64/configs/defconfig | 2 +-
22
drivers/mfd/sec-i2c.c | 252 ++++++++++++++++++++++++++++++++++++++++++++++
32
drivers/mfd/Kconfig | 18 ++-
23
5 files changed, 316 insertions(+), 240 deletions(-)
33
drivers/mfd/Makefile | 1 +
34
drivers/mfd/sec-core.c | 247 +++++-------------------------------
35
drivers/mfd/sec-core.h | 9 ++
36
drivers/mfd/sec-i2c.c | 231 +++++++++++++++++++++++++++++++++
37
9 files changed, 287 insertions(+), 227 deletions(-)
24
38
39
diff --git a/arch/arm/configs/exynos_defconfig b/arch/arm/configs/exynos_defconfig
40
index XXXXXXX..XXXXXXX 100644
41
--- a/arch/arm/configs/exynos_defconfig
42
+++ b/arch/arm/configs/exynos_defconfig
43
@@ -XXX,XX +XXX,XX @@ CONFIG_MFD_MAX77686=y
44
CONFIG_MFD_MAX77693=y
45
CONFIG_MFD_MAX8997=y
46
CONFIG_MFD_MAX8998=y
47
-CONFIG_MFD_SEC_CORE=y
48
+CONFIG_MFD_SEC_I2C=y
49
CONFIG_MFD_STMPE=y
50
CONFIG_STMPE_I2C=y
51
CONFIG_MFD_TPS65090=y
52
diff --git a/arch/arm/configs/multi_v7_defconfig b/arch/arm/configs/multi_v7_defconfig
53
index XXXXXXX..XXXXXXX 100644
54
--- a/arch/arm/configs/multi_v7_defconfig
55
+++ b/arch/arm/configs/multi_v7_defconfig
56
@@ -XXX,XX +XXX,XX @@ CONFIG_MFD_QCOM_RPM=y
57
CONFIG_MFD_SPMI_PMIC=y
58
CONFIG_MFD_RK8XX_I2C=y
59
CONFIG_MFD_RN5T618=y
60
-CONFIG_MFD_SEC_CORE=y
61
+CONFIG_MFD_SEC_I2C=y
62
CONFIG_MFD_STMPE=y
63
CONFIG_MFD_PALMAS=y
64
CONFIG_MFD_TPS65090=y
65
diff --git a/arch/arm/configs/pxa_defconfig b/arch/arm/configs/pxa_defconfig
66
index XXXXXXX..XXXXXXX 100644
67
--- a/arch/arm/configs/pxa_defconfig
68
+++ b/arch/arm/configs/pxa_defconfig
69
@@ -XXX,XX +XXX,XX @@ CONFIG_MFD_MAX77693=y
70
CONFIG_MFD_MAX8907=m
71
CONFIG_EZX_PCAP=y
72
CONFIG_UCB1400_CORE=m
73
-CONFIG_MFD_SEC_CORE=y
74
+CONFIG_MFD_SEC_I2C=y
75
CONFIG_MFD_PALMAS=y
76
CONFIG_MFD_TPS65090=y
77
CONFIG_MFD_TPS6586X=y
78
diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig
79
index XXXXXXX..XXXXXXX 100644
80
--- a/arch/arm64/configs/defconfig
81
+++ b/arch/arm64/configs/defconfig
82
@@ -XXX,XX +XXX,XX @@ CONFIG_MFD_MT6397=y
83
CONFIG_MFD_SPMI_PMIC=y
84
CONFIG_MFD_RK8XX_I2C=y
85
CONFIG_MFD_RK8XX_SPI=y
86
-CONFIG_MFD_SEC_CORE=y
87
+CONFIG_MFD_SEC_I2C=y
88
CONFIG_MFD_SL28CPLD=y
89
CONFIG_RZ_MTU3=y
90
CONFIG_MFD_TI_AM335X_TSCADC=m
25
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
91
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
26
index XXXXXXX..XXXXXXX 100644
92
index XXXXXXX..XXXXXXX 100644
27
--- a/drivers/mfd/Kconfig
93
--- a/drivers/mfd/Kconfig
28
+++ b/drivers/mfd/Kconfig
94
+++ b/drivers/mfd/Kconfig
29
@@ -XXX,XX +XXX,XX @@ config MFD_RN5T618
95
@@ -XXX,XX +XXX,XX @@ config MFD_RN5T618
...
...
103
-#include <linux/mfd/samsung/s2mps15.h>
169
-#include <linux/mfd/samsung/s2mps15.h>
104
-#include <linux/mfd/samsung/s2mpu02.h>
170
-#include <linux/mfd/samsung/s2mpu02.h>
105
-#include <linux/mfd/samsung/s5m8767.h>
171
-#include <linux/mfd/samsung/s5m8767.h>
106
-#include <linux/mod_devicetable.h>
172
-#include <linux/mod_devicetable.h>
107
#include <linux/module.h>
173
#include <linux/module.h>
108
-#include <linux/of.h>
174
#include <linux/of.h>
109
#include <linux/pm.h>
175
#include <linux/pm.h>
110
#include <linux/pm_runtime.h>
111
#include <linux/regmap.h>
112
@@ -XXX,XX +XXX,XX @@ static const struct mfd_cell s2mpu05_devs[] = {
176
@@ -XXX,XX +XXX,XX @@ static const struct mfd_cell s2mpu05_devs[] = {
113
    { .name = "s2mps15-rtc", },
177
    { .name = "s2mps15-rtc", },
114
};
178
};
115
179
116
-static const struct of_device_id sec_dt_match[] = {
180
-static const struct of_device_id sec_dt_match[] = {
...
...
253
-
317
-
254
static void sec_pmic_dump_rev(struct sec_pmic_dev *sec_pmic)
318
static void sec_pmic_dump_rev(struct sec_pmic_dev *sec_pmic)
255
{
319
{
256
    unsigned int val;
320
    unsigned int val;
257
@@ -XXX,XX +XXX,XX @@ static void sec_pmic_configure(struct sec_pmic_dev *sec_pmic)
321
@@ -XXX,XX +XXX,XX @@ static void sec_pmic_configure(struct sec_pmic_dev *sec_pmic)
258
    }
322
* platform data.
323
*/
324
static struct sec_platform_data *
325
-sec_pmic_i2c_parse_dt_pdata(struct device *dev)
326
+sec_pmic_parse_dt_pdata(struct device *dev)
327
{
328
    struct sec_platform_data *pd;
329
330
@@ -XXX,XX +XXX,XX @@ sec_pmic_i2c_parse_dt_pdata(struct device *dev)
331
    return pd;
259
}
332
}
260
333
261
-/*
334
-static int sec_pmic_probe(struct i2c_client *i2c)
262
- * Only the common platform data elements for s5m8767 are parsed here from the
263
- * device tree. Other sub-modules of s5m8767 such as pmic, rtc , charger and
264
- * others have to parse their own platform data elements from device tree.
265
- */
266
-static void sec_pmic_i2c_parse_dt_pdata(struct device *dev,
267
-                    struct sec_platform_data *pd)
268
+int sec_pmic_probe(struct device *dev, unsigned long device_type,
335
+int sec_pmic_probe(struct device *dev, unsigned long device_type,
269
+         unsigned int irq, struct regmap *regmap,
336
+         unsigned int irq, struct regmap *regmap,
270
+         const struct sec_pmic_probe_data *probedata,
271
+         struct i2c_client *client)
337
+         struct i2c_client *client)
272
{
338
{
273
-    pd->manual_poweroff =
274
-        of_property_read_bool(dev->of_node,
275
-                 "samsung,s2mps11-acokb-ground");
276
-    pd->disable_wrstbi =
277
-        of_property_read_bool(dev->of_node,
278
-                 "samsung,s2mps11-wrstbi-ground");
279
-}
280
-
281
-static int sec_pmic_probe(struct i2c_client *i2c)
282
-{
283
-    const struct regmap_config *regmap;
339
-    const struct regmap_config *regmap;
284
    struct sec_platform_data *pdata;
340
    struct sec_platform_data *pdata;
285
    const struct mfd_cell *sec_devs;
341
    const struct mfd_cell *sec_devs;
286
    struct sec_pmic_dev *sec_pmic;
342
    struct sec_pmic_dev *sec_pmic;
287
    int ret, num_sec_devs;
343
    int ret, num_sec_devs;
...
...
297
-    sec_pmic->i2c = i2c;
353
-    sec_pmic->i2c = i2c;
298
-    sec_pmic->irq = i2c->irq;
354
-    sec_pmic->irq = i2c->irq;
299
+    dev_set_drvdata(dev, sec_pmic);
355
+    dev_set_drvdata(dev, sec_pmic);
300
+    sec_pmic->dev = dev;
356
+    sec_pmic->dev = dev;
301
+    sec_pmic->device_type = device_type;
357
+    sec_pmic->device_type = device_type;
358
+    sec_pmic->i2c = client;
302
+    sec_pmic->irq = irq;
359
+    sec_pmic->irq = irq;
303
+    sec_pmic->regmap_pmic = regmap;
360
+    sec_pmic->regmap_pmic = regmap;
304
+    sec_pmic->i2c = client;
361
305
362
-    pdata = sec_pmic_i2c_parse_dt_pdata(sec_pmic->dev);
306
    /*
363
+    pdata = sec_pmic_parse_dt_pdata(sec_pmic->dev);
307
     * The s5m8767 platform data structure is instantiated here and the
364
    if (IS_ERR(pdata)) {
308
     * drivers for the sub-modules need not instantiate another instance
365
        ret = PTR_ERR(pdata);
309
     * while parsing their platform data.
366
        return ret;
310
     */
367
    }
311
-    pdata = devm_kzalloc(sec_pmic->dev, sizeof(*pdata), GFP_KERNEL);
368
312
+    pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
313
    if (!pdata)
314
        return -ENOMEM;
315
316
-    sec_pmic_i2c_parse_dt_pdata(sec_pmic->dev, pdata);
317
-
318
-    sec_pmic->device_type = (unsigned long)of_device_get_match_data(sec_pmic->dev);
369
-    sec_pmic->device_type = (unsigned long)of_device_get_match_data(sec_pmic->dev);
319
    sec_pmic->pdata = pdata;
370
    sec_pmic->pdata = pdata;
320
-
371
321
-    switch (sec_pmic->device_type) {
372
-    switch (sec_pmic->device_type) {
322
-    case S2MPA01:
373
-    case S2MPA01:
323
-        regmap = &s2mpa01_regmap_config;
374
-        regmap = &s2mpa01_regmap_config;
324
-        break;
375
-        break;
325
-    case S2MPS11X:
376
-    case S2MPS11X:
...
...
349
-    if (IS_ERR(sec_pmic->regmap_pmic)) {
400
-    if (IS_ERR(sec_pmic->regmap_pmic)) {
350
-        ret = PTR_ERR(sec_pmic->regmap_pmic);
401
-        ret = PTR_ERR(sec_pmic->regmap_pmic);
351
-        dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
402
-        dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
352
-            ret);
403
-            ret);
353
-        return ret;
404
-        return ret;
354
+    if (probedata) {
405
-    }
355
+        pdata->manual_poweroff = probedata->manual_poweroff;
406
-
356
+        pdata->disable_wrstbi = probedata->disable_wrstbi;
357
    }
358
359
    sec_irq_init(sec_pmic);
407
    sec_irq_init(sec_pmic);
408
409
    pm_runtime_set_active(sec_pmic->dev);
360
@@ -XXX,XX +XXX,XX @@ static int sec_pmic_probe(struct i2c_client *i2c)
410
@@ -XXX,XX +XXX,XX @@ static int sec_pmic_probe(struct i2c_client *i2c)
361
        num_sec_devs = ARRAY_SIZE(s2mpu05_devs);
411
        num_sec_devs = ARRAY_SIZE(s2mpu05_devs);
362
        break;
412
        break;
363
    default:
413
    default:
364
-        dev_err(&i2c->dev, "Unsupported device type (%lu)\n",
414
-        dev_err(&i2c->dev, "Unsupported device type (%lu)\n",
...
...
425
-};
475
-};
426
-module_i2c_driver(sec_pmic_driver);
476
-module_i2c_driver(sec_pmic_driver);
427
+DEFINE_SIMPLE_DEV_PM_OPS(sec_pmic_pm_ops, sec_pmic_suspend, sec_pmic_resume);
477
+DEFINE_SIMPLE_DEV_PM_OPS(sec_pmic_pm_ops, sec_pmic_suspend, sec_pmic_resume);
428
+EXPORT_SYMBOL_GPL(sec_pmic_pm_ops);
478
+EXPORT_SYMBOL_GPL(sec_pmic_pm_ops);
429
479
430
+MODULE_AUTHOR("André Draszik <andre.draszik@linaro.org>");
431
MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>");
480
MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>");
432
-MODULE_DESCRIPTION("Core support for the S5M MFD");
481
-MODULE_DESCRIPTION("Core support for the S5M MFD");
433
+MODULE_DESCRIPTION("Core driver for the Samsung S5M");
482
+MODULE_DESCRIPTION("Core driver for the Samsung S5M");
434
MODULE_LICENSE("GPL");
483
MODULE_LICENSE("GPL");
435
diff --git a/drivers/mfd/sec-core.h b/drivers/mfd/sec-core.h
484
diff --git a/drivers/mfd/sec-core.h b/drivers/mfd/sec-core.h
...
...
441
#define __SEC_CORE_INT_H
490
#define __SEC_CORE_INT_H
442
491
443
+struct i2c_client;
492
+struct i2c_client;
444
+
493
+
445
+extern const struct dev_pm_ops sec_pmic_pm_ops;
494
+extern const struct dev_pm_ops sec_pmic_pm_ops;
446
+
447
+struct sec_pmic_probe_data {
448
+    /* Whether or not manually set PWRHOLD to low during shutdown. */
449
+    bool manual_poweroff;
450
+    /* Disable the WRSTBI (buck voltage warm reset) when probing? */
451
+    bool disable_wrstbi;
452
+};
453
+
495
+
454
+int sec_pmic_probe(struct device *dev, unsigned long device_type,
496
+int sec_pmic_probe(struct device *dev, unsigned long device_type,
455
+         unsigned int irq, struct regmap *regmap,
497
+         unsigned int irq, struct regmap *regmap,
456
+         const struct sec_pmic_probe_data *probedata,
457
+         struct i2c_client *client);
498
+         struct i2c_client *client);
458
+void sec_pmic_shutdown(struct device *dev);
499
+void sec_pmic_shutdown(struct device *dev);
459
+
500
+
460
int sec_irq_init(struct sec_pmic_dev *sec_pmic);
501
int sec_irq_init(struct sec_pmic_dev *sec_pmic);
461
502
...
...
595
+    .max_register = S5M8767_REG_LDO28CTRL,
636
+    .max_register = S5M8767_REG_LDO28CTRL,
596
+    .volatile_reg = s2mps11_volatile,
637
+    .volatile_reg = s2mps11_volatile,
597
+    .cache_type = REGCACHE_FLAT,
638
+    .cache_type = REGCACHE_FLAT,
598
+};
639
+};
599
+
640
+
600
+/*
601
+ * Only the common platform data elements for s5m8767 are parsed here from the
602
+ * device tree. Other sub-modules of s5m8767 such as pmic, rtc , charger and
603
+ * others have to parse their own platform data elements from device tree.
604
+ */
605
+static void
606
+sec_pmic_i2c_parse_dt_pdata(struct device *dev,
607
+             struct sec_pmic_probe_data *pd)
608
+{
609
+    pd->manual_poweroff =
610
+        of_property_read_bool(dev->of_node,
611
+                 "samsung,s2mps11-acokb-ground");
612
+    pd->disable_wrstbi =
613
+        of_property_read_bool(dev->of_node,
614
+                 "samsung,s2mps11-wrstbi-ground");
615
+}
616
+
617
+static int sec_pmic_i2c_probe(struct i2c_client *client)
641
+static int sec_pmic_i2c_probe(struct i2c_client *client)
618
+{
642
+{
619
+    struct sec_pmic_probe_data probedata;
620
+    const struct regmap_config *regmap;
643
+    const struct regmap_config *regmap;
621
+    unsigned long device_type;
644
+    unsigned long device_type;
622
+    struct regmap *regmap_pmic;
645
+    struct regmap *regmap_pmic;
623
+    int ret;
646
+    int ret;
624
+
625
+    sec_pmic_i2c_parse_dt_pdata(&client->dev, &probedata);
626
+
647
+
627
+    device_type = (unsigned long)of_device_get_match_data(&client->dev);
648
+    device_type = (unsigned long)of_device_get_match_data(&client->dev);
628
+
649
+
629
+    switch (device_type) {
650
+    switch (device_type) {
630
+    case S2MPA01:
651
+    case S2MPA01:
...
...
660
+            ret);
681
+            ret);
661
+        return ret;
682
+        return ret;
662
+    }
683
+    }
663
+
684
+
664
+    return sec_pmic_probe(&client->dev, device_type, client->irq,
685
+    return sec_pmic_probe(&client->dev, device_type, client->irq,
665
+             regmap_pmic, &probedata, client);
686
+             regmap_pmic, client);
666
+}
687
+}
667
+
688
+
668
+static void sec_pmic_i2c_shutdown(struct i2c_client *i2c)
689
+static void sec_pmic_i2c_shutdown(struct i2c_client *i2c)
669
+{
690
+{
670
+    sec_pmic_shutdown(&i2c->dev);
691
+    sec_pmic_shutdown(&i2c->dev);
...
...
712
+    .probe = sec_pmic_i2c_probe,
733
+    .probe = sec_pmic_i2c_probe,
713
+    .shutdown = sec_pmic_i2c_shutdown,
734
+    .shutdown = sec_pmic_i2c_shutdown,
714
+};
735
+};
715
+module_i2c_driver(sec_pmic_i2c_driver);
736
+module_i2c_driver(sec_pmic_i2c_driver);
716
+
737
+
717
+MODULE_AUTHOR("André Draszik <andre.draszik@linaro.org>");
718
+MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>");
738
+MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>");
719
+MODULE_DESCRIPTION("I2C driver for the Samsung S5M");
739
+MODULE_DESCRIPTION("I2C driver for the Samsung S5M");
720
+MODULE_LICENSE("GPL");
740
+MODULE_LICENSE("GPL");
721
741
722
--
742
--
723
2.49.0.395.g12beb8f557-goog
743
2.49.0.604.gff1f9ca942-goog
724
744
diff view generated by jsdifflib
...
...
10
Signed-off-by: André Draszik <andre.draszik@linaro.org>
10
Signed-off-by: André Draszik <andre.draszik@linaro.org>
11
11
12
---
12
---
13
Checkpatch suggests to update MAINTAINERS, but the new file is covered
13
Checkpatch suggests to update MAINTAINERS, but the new file is covered
14
already due to using a wildcard.
14
already due to using a wildcard.
15
16
v4:
17
- Lee:
18
- consistently start comments with upper case
19
- use up to 100 chars wide lines throughout
20
- add more comments to regmap ranges
21
- introduce ACPM_ADDR_BITS and use where appropriate (regmap config,
22
sec_pmic_acpm_bus_write(), sec_pmic_acpm_bus_read()
23
- use dev_err_cast_probe() & dev_err_ptr_probe()
24
25
v3:
26
* use an enum for struct sec_acpm_bus_context::type
27
* consistent name space for all functions sec_pmic_acpm_... to be
28
similar to i2c and consistent in this file
29
30
v2:
31
* update to using devm_acpm_get_by_node() instead of
32
devm_acpm_get_by_phandle() as this is now expected to be a child of
33
the ACPM node
34
* use c-type file header
35
* updates to error messages
36
* drop s2mpg10_rtc_wr_table as everything in RTC is writeable
37
* rename s2mpg10_volatile_registers -> s2mpg10_rtc_volatile_registers
38
* fix incorrect regmap range in common block
39
* add comments to regmap ranges
40
* add all registers to header for all IP blocks
15
---
41
---
16
drivers/mfd/Kconfig | 17 ++
42
drivers/mfd/Kconfig | 17 ++
17
drivers/mfd/Makefile | 1 +
43
drivers/mfd/Makefile | 1 +
18
drivers/mfd/sec-acpm.c | 471 ++++++++++++++++++++++++++++++++++++
44
drivers/mfd/sec-acpm.c | 442 +++++++++++++++++++++++++++++++++++
19
drivers/mfd/sec-core.c | 16 ++
45
drivers/mfd/sec-core.c | 16 ++
20
drivers/mfd/sec-irq.c | 68 ++++++
46
drivers/mfd/sec-irq.c | 68 ++++++
21
include/linux/mfd/samsung/core.h | 1 +
47
include/linux/mfd/samsung/core.h | 1 +
22
include/linux/mfd/samsung/irq.h | 103 ++++++++
48
include/linux/mfd/samsung/irq.h | 103 ++++++++
23
include/linux/mfd/samsung/s2mpg10.h | 310 ++++++++++++++++++++++++
49
include/linux/mfd/samsung/rtc.h | 37 +++
24
8 files changed, 987 insertions(+)
50
include/linux/mfd/samsung/s2mpg10.h | 454 ++++++++++++++++++++++++++++++++++++
51
9 files changed, 1139 insertions(+)
25
52
26
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
53
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
27
index XXXXXXX..XXXXXXX 100644
54
index XXXXXXX..XXXXXXX 100644
28
--- a/drivers/mfd/Kconfig
55
--- a/drivers/mfd/Kconfig
29
+++ b/drivers/mfd/Kconfig
56
+++ b/drivers/mfd/Kconfig
...
...
68
index XXXXXXX..XXXXXXX
95
index XXXXXXX..XXXXXXX
69
--- /dev/null
96
--- /dev/null
70
+++ b/drivers/mfd/sec-acpm.c
97
+++ b/drivers/mfd/sec-acpm.c
71
@@ -XXX,XX +XXX,XX @@
98
@@ -XXX,XX +XXX,XX @@
72
+// SPDX-License-Identifier: GPL-2.0-only
99
+// SPDX-License-Identifier: GPL-2.0-only
73
+//
100
+/*
74
+// Copyright 2020 Google Inc
101
+ * Copyright 2020 Google Inc
75
+// Copyright 2025 Linaro Ltd.
102
+ * Copyright 2025 Linaro Ltd.
76
+//
103
+ *
77
+// Samsung S2MPG1x ACPM driver
104
+ * Samsung S2MPG1x ACPM driver
105
+ */
78
+
106
+
79
+#include <linux/array_size.h>
107
+#include <linux/array_size.h>
108
+#include <linux/bitops.h>
80
+#include <linux/device.h>
109
+#include <linux/device.h>
81
+#include <linux/firmware/samsung/exynos-acpm-protocol.h>
110
+#include <linux/firmware/samsung/exynos-acpm-protocol.h>
82
+#include <linux/mfd/samsung/core.h>
111
+#include <linux/mfd/samsung/core.h>
112
+#include <linux/mfd/samsung/rtc.h>
83
+#include <linux/mfd/samsung/s2mpg10.h>
113
+#include <linux/mfd/samsung/s2mpg10.h>
84
+#include <linux/mod_devicetable.h>
114
+#include <linux/mod_devicetable.h>
85
+#include <linux/module.h>
115
+#include <linux/module.h>
86
+#include <linux/of.h>
116
+#include <linux/of.h>
87
+#include <linux/platform_device.h>
117
+#include <linux/platform_device.h>
88
+#include <linux/pm.h>
118
+#include <linux/pm.h>
89
+#include <linux/property.h>
119
+#include <linux/property.h>
90
+#include <linux/regmap.h>
120
+#include <linux/regmap.h>
91
+#include "sec-core.h"
121
+#include "sec-core.h"
92
+
122
+
123
+#define ACPM_ADDR_BITS 8
93
+#define ACPM_MAX_BULK_DATA 8
124
+#define ACPM_MAX_BULK_DATA 8
94
+
125
+
95
+struct sec_pmic_acpm_platform_data {
126
+struct sec_pmic_acpm_platform_data {
96
+    int device_type;
127
+    int device_type;
97
+
128
+
...
...
103
+    const struct regmap_config *regmap_cfg_rtc;
134
+    const struct regmap_config *regmap_cfg_rtc;
104
+    const struct regmap_config *regmap_cfg_meter;
135
+    const struct regmap_config *regmap_cfg_meter;
105
+};
136
+};
106
+
137
+
107
+static const struct regmap_range s2mpg10_common_registers[] = {
138
+static const struct regmap_range s2mpg10_common_registers[] = {
108
+    regmap_reg_range(0x00, 0x02),
139
+    regmap_reg_range(0x00, 0x02), /* CHIP_ID_M, INT, INT_MASK */
109
+    regmap_reg_range(0x0a, 0x0c),
140
+    regmap_reg_range(0x0a, 0x0c), /* Speedy control */
110
+    regmap_reg_range(0x1a, 0x2a),
141
+    regmap_reg_range(0x1a, 0x2a), /* Debug */
111
+    regmap_reg_range(0x33, 0x3f),
112
+    regmap_reg_range(0x57, 0x7f),
113
+};
142
+};
114
+
143
+
115
+static const struct regmap_range s2mpg10_common_ro_registers[] = {
144
+static const struct regmap_range s2mpg10_common_ro_registers[] = {
116
+    regmap_reg_range(0x00, 0x01),
145
+    regmap_reg_range(0x00, 0x01), /* CHIP_ID_M, INT */
117
+    regmap_reg_range(0x28, 0x2a),
146
+    regmap_reg_range(0x28, 0x2a), /* Debug */
118
+    regmap_reg_range(0x33, 0x3f),
119
+    regmap_reg_range(0x57, 0x7f),
120
+};
147
+};
121
+
148
+
122
+static const struct regmap_range s2mpg10_common_nonvolatile_registers[] = {
149
+static const struct regmap_range s2mpg10_common_nonvolatile_registers[] = {
123
+    regmap_reg_range(0x00, 0x00), /* CHIP_ID_M */
150
+    regmap_reg_range(0x00, 0x00), /* CHIP_ID_M */
124
+    regmap_reg_range(0x02, 0x02), /* INT_MASK */
151
+    regmap_reg_range(0x02, 0x02), /* INT_MASK */
125
+    regmap_reg_range(0x0a, 0x0c), /* speedy control */
152
+    regmap_reg_range(0x0a, 0x0c), /* Speedy control */
126
+};
153
+};
127
+
154
+
128
+static const struct regmap_range s2mpg10_common_precious_registers[] = {
155
+static const struct regmap_range s2mpg10_common_precious_registers[] = {
129
+    regmap_reg_range(0x01, 0x01), /* INT */
156
+    regmap_reg_range(0x01, 0x01), /* INT */
130
+};
157
+};
...
...
151
+    .n_yes_ranges = ARRAY_SIZE(s2mpg10_common_precious_registers),
178
+    .n_yes_ranges = ARRAY_SIZE(s2mpg10_common_precious_registers),
152
+};
179
+};
153
+
180
+
154
+static const struct regmap_config s2mpg10_regmap_config_common = {
181
+static const struct regmap_config s2mpg10_regmap_config_common = {
155
+    .name = "common",
182
+    .name = "common",
156
+    .reg_bits = 8,
183
+    .reg_bits = ACPM_ADDR_BITS,
157
+    .val_bits = 8,
184
+    .val_bits = 8,
158
+    .max_register = 0x7f,
185
+    .max_register = S2MPG10_COMMON_SPD_DEBUG4,
159
+    .wr_table = &s2mpg10_common_wr_table,
186
+    .wr_table = &s2mpg10_common_wr_table,
160
+    .rd_table = &s2mpg10_common_rd_table,
187
+    .rd_table = &s2mpg10_common_rd_table,
161
+    .volatile_table = &s2mpg10_common_volatile_table,
188
+    .volatile_table = &s2mpg10_common_volatile_table,
162
+    .precious_table = &s2mpg10_common_precious_table,
189
+    .precious_table = &s2mpg10_common_precious_table,
163
+    .num_reg_defaults_raw = 0x7f + 1,
190
+    .num_reg_defaults_raw = S2MPG10_COMMON_SPD_DEBUG4 + 1,
164
+    .cache_type = REGCACHE_FLAT,
191
+    .cache_type = REGCACHE_FLAT,
165
+};
192
+};
166
+
193
+
167
+static const struct regmap_range s2mpg10_pmic_registers[] = {
194
+static const struct regmap_range s2mpg10_pmic_registers[] = {
168
+    regmap_reg_range(0x00, 0xf6),
195
+    regmap_reg_range(0x00, 0xf6), /* All PMIC registers */
169
+};
196
+};
170
+
197
+
171
+static const struct regmap_range s2mpg10_pmic_ro_registers[] = {
198
+static const struct regmap_range s2mpg10_pmic_ro_registers[] = {
172
+    regmap_reg_range(0x00, 0x05), /* INTx */
199
+    regmap_reg_range(0x00, 0x05), /* INTx */
173
+    regmap_reg_range(0x0c, 0x0f), /* STATUSx PWRONSRC OFFSRC */
200
+    regmap_reg_range(0x0c, 0x0f), /* STATUSx PWRONSRC OFFSRC */
...
...
204
+    .n_yes_ranges = ARRAY_SIZE(s2mpg10_pmic_precious_registers),
231
+    .n_yes_ranges = ARRAY_SIZE(s2mpg10_pmic_precious_registers),
205
+};
232
+};
206
+
233
+
207
+static const struct regmap_config s2mpg10_regmap_config_pmic = {
234
+static const struct regmap_config s2mpg10_regmap_config_pmic = {
208
+    .name = "pmic",
235
+    .name = "pmic",
209
+    .reg_bits = 8,
236
+    .reg_bits = ACPM_ADDR_BITS,
210
+    .val_bits = 8,
237
+    .val_bits = 8,
211
+    .max_register = 0xf6,
238
+    .max_register = S2MPG10_PMIC_LDO_SENSE4,
212
+    .wr_table = &s2mpg10_pmic_wr_table,
239
+    .wr_table = &s2mpg10_pmic_wr_table,
213
+    .rd_table = &s2mpg10_pmic_rd_table,
240
+    .rd_table = &s2mpg10_pmic_rd_table,
214
+    .volatile_table = &s2mpg10_pmic_volatile_table,
241
+    .volatile_table = &s2mpg10_pmic_volatile_table,
215
+    .precious_table = &s2mpg10_pmic_precious_table,
242
+    .precious_table = &s2mpg10_pmic_precious_table,
216
+    .num_reg_defaults_raw = 0xf6 + 1,
243
+    .num_reg_defaults_raw = S2MPG10_PMIC_LDO_SENSE4 + 1,
217
+    .cache_type = REGCACHE_FLAT,
244
+    .cache_type = REGCACHE_FLAT,
218
+};
245
+};
219
+
246
+
220
+static const struct regmap_range s2mpg10_rtc_registers[] = {
247
+static const struct regmap_range s2mpg10_rtc_registers[] = {
221
+    regmap_reg_range(0x00, 0x2b),
248
+    regmap_reg_range(0x00, 0x2b), /* All RTC registers */
222
+};
249
+};
223
+
250
+
224
+static const struct regmap_range s2mpg10_volatile_registers[] = {
251
+static const struct regmap_range s2mpg10_rtc_volatile_registers[] = {
225
+    regmap_reg_range(0x01, 0x01), /* RTC_UPDATE */
252
+    regmap_reg_range(0x01, 0x01), /* RTC_UPDATE */
226
+    regmap_reg_range(0x05, 0x0c), /* time / date */
253
+    regmap_reg_range(0x05, 0x0c), /* Time / date */
227
+};
228
+
229
+static const struct regmap_access_table s2mpg10_rtc_wr_table = {
230
+    .yes_ranges = s2mpg10_rtc_registers,
231
+    .n_yes_ranges = ARRAY_SIZE(s2mpg10_rtc_registers),
232
+    /* no r/o registers in RTC block */
233
+};
254
+};
234
+
255
+
235
+static const struct regmap_access_table s2mpg10_rtc_rd_table = {
256
+static const struct regmap_access_table s2mpg10_rtc_rd_table = {
236
+    .yes_ranges = s2mpg10_rtc_registers,
257
+    .yes_ranges = s2mpg10_rtc_registers,
237
+    .n_yes_ranges = ARRAY_SIZE(s2mpg10_rtc_registers),
258
+    .n_yes_ranges = ARRAY_SIZE(s2mpg10_rtc_registers),
238
+};
259
+};
239
+
260
+
240
+static const struct regmap_access_table s2mpg10_rtc_volatile_table = {
261
+static const struct regmap_access_table s2mpg10_rtc_volatile_table = {
241
+    .yes_ranges = s2mpg10_volatile_registers,
262
+    .yes_ranges = s2mpg10_rtc_volatile_registers,
242
+    .n_yes_ranges = ARRAY_SIZE(s2mpg10_volatile_registers),
263
+    .n_yes_ranges = ARRAY_SIZE(s2mpg10_rtc_volatile_registers),
243
+};
264
+};
244
+
265
+
245
+static const struct regmap_config s2mpg10_regmap_config_rtc = {
266
+static const struct regmap_config s2mpg10_regmap_config_rtc = {
246
+    .name = "rtc",
267
+    .name = "rtc",
247
+    .reg_bits = 8,
268
+    .reg_bits = ACPM_ADDR_BITS,
248
+    .val_bits = 8,
269
+    .val_bits = 8,
249
+    .reg_stride = 1,
270
+    .max_register = S2MPG10_RTC_OSC_CTRL,
250
+    .max_register = 0x2b,
251
+    .wr_table = &s2mpg10_rtc_wr_table,
252
+    .rd_table = &s2mpg10_rtc_rd_table,
271
+    .rd_table = &s2mpg10_rtc_rd_table,
253
+    .volatile_table = &s2mpg10_rtc_volatile_table,
272
+    .volatile_table = &s2mpg10_rtc_volatile_table,
254
+    .num_reg_defaults_raw = 0x2b + 1,
273
+    .num_reg_defaults_raw = S2MPG10_RTC_OSC_CTRL + 1,
255
+    .cache_type = REGCACHE_FLAT,
274
+    .cache_type = REGCACHE_FLAT,
256
+};
275
+};
257
+
276
+
258
+static const struct regmap_range s2mpg10_meter_registers[] = {
277
+static const struct regmap_range s2mpg10_meter_registers[] = {
259
+    regmap_reg_range(0x00, 0x21), /* meter config */
278
+    regmap_reg_range(0x00, 0x21), /* Meter config */
260
+    regmap_reg_range(0x40, 0x8a), /* meter data */
279
+    regmap_reg_range(0x40, 0x8a), /* Meter data */
261
+    regmap_reg_range(0xee, 0xee),
280
+    regmap_reg_range(0xee, 0xee), /* Offset */
262
+    regmap_reg_range(0xf1, 0xf1),
281
+    regmap_reg_range(0xf1, 0xf1), /* Trim */
263
+};
282
+};
264
+
283
+
265
+static const struct regmap_range s2mpg10_meter_ro_registers[] = {
284
+static const struct regmap_range s2mpg10_meter_ro_registers[] = {
266
+    regmap_reg_range(0x40, 0x8a),
285
+    regmap_reg_range(0x40, 0x8a), /* Meter data */
267
+};
286
+};
268
+
287
+
269
+static const struct regmap_access_table s2mpg10_meter_wr_table = {
288
+static const struct regmap_access_table s2mpg10_meter_wr_table = {
270
+    .yes_ranges = s2mpg10_meter_registers,
289
+    .yes_ranges = s2mpg10_meter_registers,
271
+    .n_yes_ranges = ARRAY_SIZE(s2mpg10_meter_registers),
290
+    .n_yes_ranges = ARRAY_SIZE(s2mpg10_meter_registers),
...
...
283
+    .n_yes_ranges = ARRAY_SIZE(s2mpg10_meter_ro_registers),
302
+    .n_yes_ranges = ARRAY_SIZE(s2mpg10_meter_ro_registers),
284
+};
303
+};
285
+
304
+
286
+static const struct regmap_config s2mpg10_regmap_config_meter = {
305
+static const struct regmap_config s2mpg10_regmap_config_meter = {
287
+    .name = "meter",
306
+    .name = "meter",
288
+    .reg_bits = 8,
307
+    .reg_bits = ACPM_ADDR_BITS,
289
+    .val_bits = 8,
308
+    .val_bits = 8,
290
+    .reg_stride = 1,
309
+    .max_register = S2MPG10_METER_BUCK_METER_TRIM3,
291
+    .max_register = 0xf1,
292
+    .wr_table = &s2mpg10_meter_wr_table,
310
+    .wr_table = &s2mpg10_meter_wr_table,
293
+    .rd_table = &s2mpg10_meter_rd_table,
311
+    .rd_table = &s2mpg10_meter_rd_table,
294
+    .volatile_table = &s2mpg10_meter_volatile_table,
312
+    .volatile_table = &s2mpg10_meter_volatile_table,
295
+    .num_reg_defaults_raw = 0xf1 + 1,
313
+    .num_reg_defaults_raw = S2MPG10_METER_BUCK_METER_TRIM3 + 1,
296
+    .cache_type = REGCACHE_FLAT,
314
+    .cache_type = REGCACHE_FLAT,
297
+};
315
+};
298
+
316
+
299
+struct sec_acpm_shared_bus_context {
317
+struct sec_pmic_acpm_shared_bus_context {
300
+    const struct acpm_handle *acpm;
318
+    const struct acpm_handle *acpm;
301
+    unsigned int acpm_chan_id;
319
+    unsigned int acpm_chan_id;
302
+    u8 speedy_channel;
320
+    u8 speedy_channel;
303
+};
321
+};
304
+
322
+
305
+struct sec_acpm_bus_context {
323
+enum sec_pmic_acpm_accesstype {
306
+    struct sec_acpm_shared_bus_context *shared;
324
+    SEC_PMIC_ACPM_ACCESSTYPE_COMMON = 0x00,
307
+    u8 type;
325
+    SEC_PMIC_ACPM_ACCESSTYPE_PMIC = 0x01,
308
+#define SEC_ACPM_TYPE_COMMON 0x00
326
+    SEC_PMIC_ACPM_ACCESSTYPE_RTC = 0x02,
309
+#define SEC_ACPM_TYPE_PMIC 0x01
327
+    SEC_PMIC_ACPM_ACCESSTYPE_METER = 0x0a,
310
+#define SEC_ACPM_TYPE_RTC 0x02
328
+    SEC_PMIC_ACPM_ACCESSTYPE_WLWP = 0x0b,
311
+#define SEC_ACPM_TYPE_METER 0x0a
329
+    SEC_PMIC_ACPM_ACCESSTYPE_TRIM = 0x0f,
312
+#define SEC_ACPM_TYPE_WLWP 0x0b
330
+};
313
+#define SEC_ACPM_TYPE_TRIM 0x0f
331
+
314
+};
332
+struct sec_pmic_acpm_bus_context {
315
+
333
+    struct sec_pmic_acpm_shared_bus_context *shared;
316
+static int sec_acpm_bus_write(void *context, const void *data, size_t count)
334
+    enum sec_pmic_acpm_accesstype type;
335
+};
336
+
337
+static int sec_pmic_acpm_bus_write(void *context, const void *data,
338
+                 size_t count)
317
+{
339
+{
318
+    struct sec_acpm_bus_context *ctx = context;
340
+    struct sec_pmic_acpm_bus_context *ctx = context;
319
+    const struct acpm_handle *acpm = ctx->shared->acpm;
341
+    const struct acpm_handle *acpm = ctx->shared->acpm;
320
+    const struct acpm_pmic_ops *pmic_ops = &acpm->ops.pmic_ops;
342
+    const struct acpm_pmic_ops *pmic_ops = &acpm->ops.pmic_ops;
343
+    size_t val_count = count - BITS_TO_BYTES(ACPM_ADDR_BITS);
344
+    const u8 *d = data;
345
+    const u8 *vals = &d[BITS_TO_BYTES(ACPM_ADDR_BITS)];
321
+    u8 reg;
346
+    u8 reg;
322
+
347
+
323
+    if (count < 2 || count > (ACPM_MAX_BULK_DATA + 1))
348
+    if (val_count < 1 || val_count > ACPM_MAX_BULK_DATA)
324
+        return -EINVAL;
349
+        return -EINVAL;
325
+
350
+
326
+    reg = *(u8 *)data;
351
+    reg = d[0];
327
+    ++data;
352
+
328
+    --count;
353
+    return pmic_ops->bulk_write(acpm, ctx->shared->acpm_chan_id, ctx->type, reg,
329
+
354
+                 ctx->shared->speedy_channel, val_count, vals);
330
+    return pmic_ops->bulk_write(acpm, ctx->shared->acpm_chan_id,
331
+                 ctx->type, reg,
332
+                 ctx->shared->speedy_channel, count, data);
333
+}
355
+}
334
+
356
+
335
+static int sec_acpm_bus_read(void *context, const void *reg_buf,
357
+static int sec_pmic_acpm_bus_read(void *context, const void *reg_buf, size_t reg_size,
336
+             size_t reg_size, void *val_buf,
358
+                 void *val_buf, size_t val_size)
337
+             size_t val_size)
338
+{
359
+{
339
+    struct sec_acpm_bus_context *ctx = context;
360
+    struct sec_pmic_acpm_bus_context *ctx = context;
340
+    const struct acpm_handle *acpm = ctx->shared->acpm;
361
+    const struct acpm_handle *acpm = ctx->shared->acpm;
341
+    const struct acpm_pmic_ops *pmic_ops = &acpm->ops.pmic_ops;
362
+    const struct acpm_pmic_ops *pmic_ops = &acpm->ops.pmic_ops;
363
+    const u8 *r = reg_buf;
342
+    u8 reg;
364
+    u8 reg;
343
+
365
+
344
+    if (reg_size != 1 || !val_size || val_size > ACPM_MAX_BULK_DATA)
366
+    if (reg_size != BITS_TO_BYTES(ACPM_ADDR_BITS) || !val_size ||
367
+     val_size > ACPM_MAX_BULK_DATA)
345
+        return -EINVAL;
368
+        return -EINVAL;
346
+
369
+
347
+    reg = *(u8 *)reg_buf;
370
+    reg = r[0];
348
+
371
+
349
+    return pmic_ops->bulk_read(acpm, ctx->shared->acpm_chan_id,
372
+    return pmic_ops->bulk_read(acpm, ctx->shared->acpm_chan_id, ctx->type, reg,
350
+                 ctx->type, reg,
373
+                 ctx->shared->speedy_channel, val_size, val_buf);
351
+                 ctx->shared->speedy_channel,
352
+                 val_size, val_buf);
353
+}
374
+}
354
+
375
+
355
+static int sec_acpm_bus_reg_update_bits(void *context, unsigned int reg,
376
+static int sec_pmic_acpm_bus_reg_update_bits(void *context, unsigned int reg, unsigned int mask,
356
+                    unsigned int mask, unsigned int val)
377
+                     unsigned int val)
357
+{
378
+{
358
+    struct sec_acpm_bus_context *ctx = context;
379
+    struct sec_pmic_acpm_bus_context *ctx = context;
359
+    const struct acpm_handle *acpm = ctx->shared->acpm;
380
+    const struct acpm_handle *acpm = ctx->shared->acpm;
360
+    const struct acpm_pmic_ops *pmic_ops = &acpm->ops.pmic_ops;
381
+    const struct acpm_pmic_ops *pmic_ops = &acpm->ops.pmic_ops;
361
+
382
+
362
+    return pmic_ops->update_reg(acpm, ctx->shared->acpm_chan_id,
383
+    return pmic_ops->update_reg(acpm, ctx->shared->acpm_chan_id, ctx->type, reg & 0xff,
363
+                 ctx->type, reg & 0xff,
384
+                 ctx->shared->speedy_channel, val, mask);
364
+                 ctx->shared->speedy_channel,
365
+                 val, mask);
366
+}
385
+}
367
+
386
+
368
+static const struct regmap_bus sec_pmic_acpm_regmap_bus = {
387
+static const struct regmap_bus sec_pmic_acpm_regmap_bus = {
369
+    .write = sec_acpm_bus_write,
388
+    .write = sec_pmic_acpm_bus_write,
370
+    .read = sec_acpm_bus_read,
389
+    .read = sec_pmic_acpm_bus_read,
371
+    .reg_update_bits = sec_acpm_bus_reg_update_bits,
390
+    .reg_update_bits = sec_pmic_acpm_bus_reg_update_bits,
372
+    .max_raw_read = ACPM_MAX_BULK_DATA,
391
+    .max_raw_read = ACPM_MAX_BULK_DATA,
373
+    .max_raw_write = ACPM_MAX_BULK_DATA,
392
+    .max_raw_write = ACPM_MAX_BULK_DATA,
374
+};
393
+};
375
+
394
+
376
+static struct regmap *
395
+static struct regmap *sec_pmic_acpm_regmap_init(struct device *dev,
377
+sec_pmic_acpm_regmap_init(struct device *dev,
396
+                        struct sec_pmic_acpm_shared_bus_context *shared_ctx,
378
+             struct sec_acpm_shared_bus_context *shared_ctx,
397
+                        enum sec_pmic_acpm_accesstype type,
379
+             u8 type, const struct regmap_config *cfg,
398
+                        const struct regmap_config *cfg, bool do_attach)
380
+             bool do_attach)
381
+{
399
+{
382
+    struct sec_acpm_bus_context *ctx;
400
+    struct sec_pmic_acpm_bus_context *ctx;
383
+    struct regmap *regmap;
401
+    struct regmap *regmap;
384
+
402
+
385
+    ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
403
+    ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
386
+    if (!ctx)
404
+    if (!ctx)
387
+        return ERR_PTR(-ENOMEM);
405
+        return ERR_PTR(-ENOMEM);
388
+
406
+
389
+    ctx->shared = shared_ctx;
407
+    ctx->shared = shared_ctx;
390
+    ctx->type = type;
408
+    ctx->type = type;
391
+
409
+
392
+    regmap = devm_regmap_init(dev, &sec_pmic_acpm_regmap_bus, ctx, cfg);
410
+    regmap = devm_regmap_init(dev, &sec_pmic_acpm_regmap_bus, ctx, cfg);
393
+    if (IS_ERR(regmap))
411
+    if (IS_ERR(regmap))
394
+        return ERR_PTR(dev_err_probe(dev, PTR_ERR(regmap),
412
+        return dev_err_cast_probe(dev, regmap, "regmap init (%s) failed\n", cfg->name);
395
+                     "regmap init (%s) failed\n",
396
+                     cfg->name));
397
+
413
+
398
+    if (do_attach) {
414
+    if (do_attach) {
399
+        int ret;
415
+        int ret;
400
+
416
+
401
+        ret = regmap_attach_dev(dev, regmap, cfg);
417
+        ret = regmap_attach_dev(dev, regmap, cfg);
402
+        if (ret)
418
+        if (ret)
403
+            return ERR_PTR(dev_err_probe(dev, ret,
419
+            return dev_err_ptr_probe(dev, ret, "regmap attach (%s) failed\n",
404
+                         "regmap attach (%s) failed\n",
420
+                         cfg->name);
405
+                         cfg->name));
406
+    }
421
+    }
407
+
422
+
408
+    return regmap;
423
+    return regmap;
409
+}
424
+}
410
+
425
+
411
+static void sec_acpm_mask_common_irqs(void *regmap_common)
426
+static void sec_pmic_acpm_mask_common_irqs(void *regmap_common)
412
+{
427
+{
413
+    /* Mask all interrupts from 'common' block on shutdown */
428
+    regmap_write(regmap_common, S2MPG10_COMMON_INT_MASK, S2MPG10_COMMON_INT_SRC);
414
+    regmap_write(regmap_common, S2MPG10_COMMON_INT_MASK,
415
+         S2MPG10_COMMON_INT_SRC_MASK);
416
+}
429
+}
417
+
430
+
418
+static int sec_pmic_acpm_probe(struct platform_device *pdev)
431
+static int sec_pmic_acpm_probe(struct platform_device *pdev)
419
+{
432
+{
420
+    const struct sec_pmic_acpm_platform_data *data;
433
+    struct regmap *regmap_common, *regmap_pmic, *regmap;
421
+    struct sec_acpm_shared_bus_context *shared_ctx;
434
+    const struct sec_pmic_acpm_platform_data *pdata;
435
+    struct sec_pmic_acpm_shared_bus_context *shared_ctx;
422
+    const struct acpm_handle *acpm;
436
+    const struct acpm_handle *acpm;
423
+    struct regmap *regmap_common, *regmap_pmic, *regmap;
437
+    struct device *dev = &pdev->dev;
424
+    struct device *dev;
425
+    int ret, irq;
438
+    int ret, irq;
426
+
439
+
427
+    dev = &pdev->dev;
440
+    pdata = device_get_match_data(dev);
428
+
441
+    if (!pdata)
429
+    data = device_get_match_data(dev);
442
+        return dev_err_probe(dev, -ENODEV, "unsupported device type\n");
430
+    if (!data)
443
+
431
+        return dev_err_probe(dev, -ENODEV,
444
+    acpm = devm_acpm_get_by_node(dev, dev->parent->of_node);
432
+                 "Unsupported device type\n");
433
+
434
+    acpm = devm_acpm_get_by_phandle(dev, "exynos,acpm-ipc");
435
+    if (IS_ERR(acpm))
445
+    if (IS_ERR(acpm))
436
+        return dev_err_probe(dev, PTR_ERR(acpm),
446
+        return dev_err_probe(dev, PTR_ERR(acpm), "failed to get acpm\n");
437
+                 "Failed to get acpm\n");
438
+
447
+
439
+    irq = platform_get_irq(pdev, 0);
448
+    irq = platform_get_irq(pdev, 0);
440
+    if (irq < 0)
449
+    if (irq < 0)
441
+        return irq;
450
+        return irq;
442
+
451
+
443
+    shared_ctx = devm_kzalloc(dev, sizeof(*shared_ctx), GFP_KERNEL);
452
+    shared_ctx = devm_kzalloc(dev, sizeof(*shared_ctx), GFP_KERNEL);
444
+    if (!shared_ctx)
453
+    if (!shared_ctx)
445
+        return -ENOMEM;
454
+        return -ENOMEM;
446
+
455
+
447
+    shared_ctx->acpm = acpm;
456
+    shared_ctx->acpm = acpm;
448
+    shared_ctx->acpm_chan_id = data->acpm_chan_id;
457
+    shared_ctx->acpm_chan_id = pdata->acpm_chan_id;
449
+    shared_ctx->speedy_channel = data->speedy_channel;
458
+    shared_ctx->speedy_channel = pdata->speedy_channel;
450
+
459
+
451
+    regmap_common = sec_pmic_acpm_regmap_init(dev, shared_ctx,
460
+    regmap_common = sec_pmic_acpm_regmap_init(dev, shared_ctx, SEC_PMIC_ACPM_ACCESSTYPE_COMMON,
452
+                         SEC_ACPM_TYPE_COMMON,
461
+                         pdata->regmap_cfg_common, false);
453
+                         data->regmap_cfg_common,
454
+                         false);
455
+    if (IS_ERR(regmap_common))
462
+    if (IS_ERR(regmap_common))
456
+        return PTR_ERR(regmap_common);
463
+        return PTR_ERR(regmap_common);
457
+
464
+
458
+    /* Mask all interrupts from 'common' block, until successful init */
465
+    /* Mask all interrupts from 'common' block, until successful init */
459
+    ret = regmap_write(regmap_common, S2MPG10_COMMON_INT_MASK,
466
+    ret = regmap_write(regmap_common, S2MPG10_COMMON_INT_MASK, S2MPG10_COMMON_INT_SRC);
460
+             S2MPG10_COMMON_INT_SRC_MASK);
461
+    if (ret)
467
+    if (ret)
462
+        return dev_err_probe(dev, ret,
468
+        return dev_err_probe(dev, ret, "failed to mask common block interrupts\n");
463
+                 "Failed to mask common block interrupts\n");
469
+
464
+
470
+    regmap_pmic = sec_pmic_acpm_regmap_init(dev, shared_ctx, SEC_PMIC_ACPM_ACCESSTYPE_PMIC,
465
+    regmap_pmic = sec_pmic_acpm_regmap_init(dev, shared_ctx,
471
+                        pdata->regmap_cfg_pmic, false);
466
+                        SEC_ACPM_TYPE_PMIC,
467
+                        data->regmap_cfg_pmic,
468
+                        false);
469
+    if (IS_ERR(regmap_pmic))
472
+    if (IS_ERR(regmap_pmic))
470
+        return PTR_ERR(regmap_pmic);
473
+        return PTR_ERR(regmap_pmic);
471
+
474
+
472
+    regmap = sec_pmic_acpm_regmap_init(dev, shared_ctx, SEC_ACPM_TYPE_RTC,
475
+    regmap = sec_pmic_acpm_regmap_init(dev, shared_ctx, SEC_PMIC_ACPM_ACCESSTYPE_RTC,
473
+                     data->regmap_cfg_rtc, true);
476
+                     pdata->regmap_cfg_rtc, true);
474
+    if (IS_ERR(regmap))
477
+    if (IS_ERR(regmap))
475
+        return PTR_ERR(regmap);
478
+        return PTR_ERR(regmap);
476
+
479
+
477
+    regmap = sec_pmic_acpm_regmap_init(dev, shared_ctx, SEC_ACPM_TYPE_METER,
480
+    regmap = sec_pmic_acpm_regmap_init(dev, shared_ctx, SEC_PMIC_ACPM_ACCESSTYPE_METER,
478
+                     data->regmap_cfg_meter, true);
481
+                     pdata->regmap_cfg_meter, true);
479
+    if (IS_ERR(regmap))
482
+    if (IS_ERR(regmap))
480
+        return PTR_ERR(regmap);
483
+        return PTR_ERR(regmap);
481
+
484
+
482
+    ret = sec_pmic_probe(dev, data->device_type, irq, regmap_pmic,
485
+    ret = sec_pmic_probe(dev, pdata->device_type, irq, regmap_pmic, NULL);
483
+             NULL, NULL);
484
+    if (ret)
486
+    if (ret)
485
+        return ret;
487
+        return ret;
486
+
488
+
487
+    if (device_property_read_bool(dev, "wakeup-source"))
489
+    if (device_property_read_bool(dev, "wakeup-source"))
488
+        devm_device_init_wakeup(dev);
490
+        devm_device_init_wakeup(dev);
489
+
491
+
490
+    /*
492
+    /* Unmask PMIC interrupt from 'common' block, now that everything is in place. */
491
+     * Unmask PMIC interrupt from 'common' block, now that everything is in
492
+     * place.
493
+     */
494
+    ret = regmap_clear_bits(regmap_common, S2MPG10_COMMON_INT_MASK,
493
+    ret = regmap_clear_bits(regmap_common, S2MPG10_COMMON_INT_MASK,
495
+                S2MPG10_COMMON_INT_SRC_PMIC);
494
+                S2MPG10_COMMON_INT_SRC_PMIC);
496
+    if (ret)
495
+    if (ret)
497
+        return dev_err_probe(dev, ret,
496
+        return dev_err_probe(dev, ret, "failed to unmask PMIC interrupt\n");
498
+                 "Failed to unmask PMIC interrupt\n");
497
+
499
+
498
+    /* Mask all interrupts from 'common' block on shutdown */
500
+    ret = devm_add_action_or_reset(dev, sec_acpm_mask_common_irqs,
499
+    ret = devm_add_action_or_reset(dev, sec_pmic_acpm_mask_common_irqs, regmap_common);
501
+                 regmap_common);
502
+    if (ret)
500
+    if (ret)
503
+        return ret;
501
+        return ret;
504
+
502
+
505
+    return 0;
503
+    return 0;
506
+}
504
+}
...
...
656
        .reg_offset = 0,
654
        .reg_offset = 0,
657
@@ -XXX,XX +XXX,XX @@ static const struct regmap_irq s5m8767_irqs[] = {
655
@@ -XXX,XX +XXX,XX @@ static const struct regmap_irq s5m8767_irqs[] = {
658
    },
656
    },
659
};
657
};
660
658
659
+/* All S2MPG10 interrupt sources are read-only and don't require clearing */
661
+static const struct regmap_irq_chip s2mpg10_irq_chip = {
660
+static const struct regmap_irq_chip s2mpg10_irq_chip = {
662
+    .name = "s2mpg10",
661
+    .name = "s2mpg10",
663
+    .irqs = s2mpg10_irqs,
662
+    .irqs = s2mpg10_irqs,
664
+    .num_irqs = ARRAY_SIZE(s2mpg10_irqs),
663
+    .num_irqs = ARRAY_SIZE(s2mpg10_irqs),
665
+    .num_regs = 6,
664
+    .num_regs = 6,
666
+    .status_base = S2MPG10_PMIC_INT1,
665
+    .status_base = S2MPG10_PMIC_INT1,
667
+    .mask_base = S2MPG10_PMIC_INT1M,
666
+    .mask_base = S2MPG10_PMIC_INT1M,
668
+    /* all interrupt sources are read-to-clear */
669
+};
667
+};
670
+
668
+
671
static const struct regmap_irq_chip s2mps11_irq_chip = {
669
static const struct regmap_irq_chip s2mps11_irq_chip = {
672
    .name = "s2mps11",
670
    .name = "s2mps11",
673
    .irqs = s2mps11_irqs,
671
    .irqs = s2mps11_irqs,
...
...
805
+};
803
+};
806
+
804
+
807
enum s2mps11_irq {
805
enum s2mps11_irq {
808
    S2MPS11_IRQ_PWRONF,
806
    S2MPS11_IRQ_PWRONF,
809
    S2MPS11_IRQ_PWRONR,
807
    S2MPS11_IRQ_PWRONR,
808
diff --git a/include/linux/mfd/samsung/rtc.h b/include/linux/mfd/samsung/rtc.h
809
index XXXXXXX..XXXXXXX 100644
810
--- a/include/linux/mfd/samsung/rtc.h
811
+++ b/include/linux/mfd/samsung/rtc.h
812
@@ -XXX,XX +XXX,XX @@ enum s2mps_rtc_reg {
813
    S2MPS_RTC_REG_MAX,
814
};
815
816
+enum s2mpg10_rtc_reg {
817
+    S2MPG10_RTC_CTRL,
818
+    S2MPG10_RTC_UPDATE,
819
+    S2MPG10_RTC_SMPL,
820
+    S2MPG10_RTC_WTSR,
821
+    S2MPG10_RTC_CAP_SEL,
822
+    S2MPG10_RTC_MSEC,
823
+    S2MPG10_RTC_SEC,
824
+    S2MPG10_RTC_MIN,
825
+    S2MPG10_RTC_HOUR,
826
+    S2MPG10_RTC_WEEK,
827
+    S2MPG10_RTC_DAY,
828
+    S2MPG10_RTC_MON,
829
+    S2MPG10_RTC_YEAR,
830
+    S2MPG10_RTC_A0SEC,
831
+    S2MPG10_RTC_A0MIN,
832
+    S2MPG10_RTC_A0HOUR,
833
+    S2MPG10_RTC_A0WEEK,
834
+    S2MPG10_RTC_A0DAY,
835
+    S2MPG10_RTC_A0MON,
836
+    S2MPG10_RTC_A0YEAR,
837
+    S2MPG10_RTC_A1SEC,
838
+    S2MPG10_RTC_A1MIN,
839
+    S2MPG10_RTC_A1HOUR,
840
+    S2MPG10_RTC_A1WEEK,
841
+    S2MPG10_RTC_A1DAY,
842
+    S2MPG10_RTC_A1MON,
843
+    S2MPG10_RTC_A1YEAR,
844
+    S2MPG10_RTC_OSC_CTRL,
845
+};
846
+
847
#define RTC_I2C_ADDR        (0x0C >> 1)
848
849
#define HOUR_12            (1 << 7)
850
@@ -XXX,XX +XXX,XX @@ enum s2mps_rtc_reg {
851
#define ALARM_ENABLE_SHIFT    7
852
#define ALARM_ENABLE_MASK    (1 << ALARM_ENABLE_SHIFT)
853
854
+/* WTSR & SMPL registers */
855
#define SMPL_ENABLE_SHIFT    7
856
#define SMPL_ENABLE_MASK    (1 << SMPL_ENABLE_SHIFT)
857
858
#define WTSR_ENABLE_SHIFT    6
859
#define WTSR_ENABLE_MASK    (1 << WTSR_ENABLE_SHIFT)
860
861
+#define S2MPG10_WTSR_COLDTIMER    GENMASK(6, 5)
862
+#define S2MPG10_WTSR_COLDRST    BIT(4)
863
+#define S2MPG10_WTSR_WTSRT    GENMASK(3, 1)
864
+#define S2MPG10_WTSR_WTSR_EN    BIT(0)
865
+
866
#endif /* __LINUX_MFD_SEC_RTC_H */
810
diff --git a/include/linux/mfd/samsung/s2mpg10.h b/include/linux/mfd/samsung/s2mpg10.h
867
diff --git a/include/linux/mfd/samsung/s2mpg10.h b/include/linux/mfd/samsung/s2mpg10.h
811
new file mode 100644
868
new file mode 100644
812
index XXXXXXX..XXXXXXX
869
index XXXXXXX..XXXXXXX
813
--- /dev/null
870
--- /dev/null
814
+++ b/include/linux/mfd/samsung/s2mpg10.h
871
+++ b/include/linux/mfd/samsung/s2mpg10.h
...
...
826
+/* Common registers (type 0x000) */
883
+/* Common registers (type 0x000) */
827
+enum s2mpg10_common_reg {
884
+enum s2mpg10_common_reg {
828
+    S2MPG10_COMMON_CHIPID,
885
+    S2MPG10_COMMON_CHIPID,
829
+    S2MPG10_COMMON_INT,
886
+    S2MPG10_COMMON_INT,
830
+    S2MPG10_COMMON_INT_MASK,
887
+    S2MPG10_COMMON_INT_MASK,
831
+#define S2MPG10_COMMON_INT_SRC_MASK GENMASK(7, 0)
888
+    S2MPG10_COMMON_SPD_CTRL1 = 0x0a,
832
+#define S2MPG10_COMMON_INT_SRC_PMIC BIT(0)
889
+    S2MPG10_COMMON_SPD_CTRL2,
833
+};
890
+    S2MPG10_COMMON_SPD_CTRL3,
891
+    S2MPG10_COMMON_MON1SEL = 0x1a,
892
+    S2MPG10_COMMON_MON2SEL,
893
+    S2MPG10_COMMON_MONR,
894
+    S2MPG10_COMMON_DEBUG_CTRL1,
895
+    S2MPG10_COMMON_DEBUG_CTRL2,
896
+    S2MPG10_COMMON_DEBUG_CTRL3,
897
+    S2MPG10_COMMON_DEBUG_CTRL4,
898
+    S2MPG10_COMMON_DEBUG_CTRL5,
899
+    S2MPG10_COMMON_DEBUG_CTRL6,
900
+    S2MPG10_COMMON_DEBUG_CTRL7,
901
+    S2MPG10_COMMON_DEBUG_CTRL8,
902
+    S2MPG10_COMMON_TEST_MODE1,
903
+    S2MPG10_COMMON_TEST_MODE2,
904
+    S2MPG10_COMMON_SPD_DEBUG1,
905
+    S2MPG10_COMMON_SPD_DEBUG2,
906
+    S2MPG10_COMMON_SPD_DEBUG3,
907
+    S2MPG10_COMMON_SPD_DEBUG4,
908
+};
909
+
910
+/* For S2MPG10_COMMON_INT and S2MPG10_COMMON_INT_MASK */
911
+#define S2MPG10_COMMON_INT_SRC GENMASK(7, 0)
912
+#define S2MPG10_COMMON_INT_SRC_PMIC BIT(0)
834
+
913
+
835
+/* PMIC registers (type 0x100) */
914
+/* PMIC registers (type 0x100) */
836
+enum s2mpg10_pmic_reg {
915
+enum s2mpg10_pmic_reg {
837
+    S2MPG10_PMIC_INT1,
916
+    S2MPG10_PMIC_INT1,
838
+    S2MPG10_PMIC_INT2,
917
+    S2MPG10_PMIC_INT2,
...
...
886
+    S2MPG10_PMIC_B9M_OUT1,
965
+    S2MPG10_PMIC_B9M_OUT1,
887
+    S2MPG10_PMIC_B9M_OUT2,
966
+    S2MPG10_PMIC_B9M_OUT2,
888
+    S2MPG10_PMIC_B10M_CTRL,
967
+    S2MPG10_PMIC_B10M_CTRL,
889
+    S2MPG10_PMIC_B10M_OUT1,
968
+    S2MPG10_PMIC_B10M_OUT1,
890
+    S2MPG10_PMIC_B10M_OUT2,
969
+    S2MPG10_PMIC_B10M_OUT2,
970
+    S2MPG10_PMIC_BUCK1M_USONIC,
971
+    S2MPG10_PMIC_BUCK2M_USONIC,
972
+    S2MPG10_PMIC_BUCK3M_USONIC,
973
+    S2MPG10_PMIC_BUCK4M_USONIC,
974
+    S2MPG10_PMIC_BUCK5M_USONIC,
975
+    S2MPG10_PMIC_BUCK6M_USONIC,
976
+    S2MPG10_PMIC_BUCK7M_USONIC,
977
+    S2MPG10_PMIC_BUCK8M_USONIC,
978
+    S2MPG10_PMIC_BUCK9M_USONIC,
979
+    S2MPG10_PMIC_BUCK10M_USONIC,
891
+    S2MPG10_PMIC_L1M_CTRL,
980
+    S2MPG10_PMIC_L1M_CTRL,
892
+    S2MPG10_PMIC_L2M_CTRL,
981
+    S2MPG10_PMIC_L2M_CTRL,
893
+    S2MPG10_PMIC_L3M_CTRL,
982
+    S2MPG10_PMIC_L3M_CTRL,
894
+    S2MPG10_PMIC_L4M_CTRL,
983
+    S2MPG10_PMIC_L4M_CTRL,
895
+    S2MPG10_PMIC_L5M_CTRL,
984
+    S2MPG10_PMIC_L5M_CTRL,
...
...
938
+    S2MPG10_PMIC_DVS_RAMP2,
1027
+    S2MPG10_PMIC_DVS_RAMP2,
939
+    S2MPG10_PMIC_DVS_RAMP3,
1028
+    S2MPG10_PMIC_DVS_RAMP3,
940
+    S2MPG10_PMIC_DVS_RAMP4,
1029
+    S2MPG10_PMIC_DVS_RAMP4,
941
+    S2MPG10_PMIC_DVS_RAMP5,
1030
+    S2MPG10_PMIC_DVS_RAMP5,
942
+    S2MPG10_PMIC_DVS_RAMP6,
1031
+    S2MPG10_PMIC_DVS_RAMP6,
943
+    S2MPG10_PMIC_DCTRLSEL7 = 0xc6,
1032
+    S2MPG10_PMIC_DVS_SYNC_CTRL1,
1033
+    S2MPG10_PMIC_DVS_SYNC_CTRL2,
1034
+    S2MPG10_PMIC_DVS_SYNC_CTRL3,
1035
+    S2MPG10_PMIC_DVS_SYNC_CTRL4,
1036
+    S2MPG10_PMIC_DVS_SYNC_CTRL5,
1037
+    S2MPG10_PMIC_DVS_SYNC_CTRL6,
1038
+    S2MPG10_PMIC_OFF_CTRL1,
1039
+    S2MPG10_PMIC_OFF_CTRL2,
1040
+    S2MPG10_PMIC_OFF_CTRL3,
1041
+    S2MPG10_PMIC_OFF_CTRL4,
1042
+    S2MPG10_PMIC_SEQ_CTRL1,
1043
+    S2MPG10_PMIC_SEQ_CTRL2,
1044
+    S2MPG10_PMIC_SEQ_CTRL3,
1045
+    S2MPG10_PMIC_SEQ_CTRL4,
1046
+    S2MPG10_PMIC_SEQ_CTRL5,
1047
+    S2MPG10_PMIC_SEQ_CTRL6,
1048
+    S2MPG10_PMIC_SEQ_CTRL7,
1049
+    S2MPG10_PMIC_SEQ_CTRL8,
1050
+    S2MPG10_PMIC_SEQ_CTRL9,
1051
+    S2MPG10_PMIC_SEQ_CTRL10,
1052
+    S2MPG10_PMIC_SEQ_CTRL11,
1053
+    S2MPG10_PMIC_SEQ_CTRL12,
1054
+    S2MPG10_PMIC_SEQ_CTRL13,
1055
+    S2MPG10_PMIC_SEQ_CTRL14,
1056
+    S2MPG10_PMIC_SEQ_CTRL15,
1057
+    S2MPG10_PMIC_SEQ_CTRL16,
1058
+    S2MPG10_PMIC_SEQ_CTRL17,
1059
+    S2MPG10_PMIC_SEQ_CTRL18,
1060
+    S2MPG10_PMIC_SEQ_CTRL19,
1061
+    S2MPG10_PMIC_SEQ_CTRL20,
1062
+    S2MPG10_PMIC_SEQ_CTRL21,
1063
+    S2MPG10_PMIC_SEQ_CTRL22,
1064
+    S2MPG10_PMIC_SEQ_CTRL23,
1065
+    S2MPG10_PMIC_SEQ_CTRL24,
1066
+    S2MPG10_PMIC_SEQ_CTRL25,
1067
+    S2MPG10_PMIC_SEQ_CTRL26,
1068
+    S2MPG10_PMIC_SEQ_CTRL27,
1069
+    S2MPG10_PMIC_SEQ_CTRL28,
1070
+    S2MPG10_PMIC_SEQ_CTRL29,
1071
+    S2MPG10_PMIC_SEQ_CTRL30,
1072
+    S2MPG10_PMIC_SEQ_CTRL31,
1073
+    S2MPG10_PMIC_SEQ_CTRL32,
1074
+    S2MPG10_PMIC_SEQ_CTRL33,
1075
+    S2MPG10_PMIC_SEQ_CTRL34,
1076
+    S2MPG10_PMIC_SEQ_CTRL35,
1077
+    S2MPG10_PMIC_OFF_SEQ_CTRL1,
1078
+    S2MPG10_PMIC_OFF_SEQ_CTRL2,
1079
+    S2MPG10_PMIC_OFF_SEQ_CTRL3,
1080
+    S2MPG10_PMIC_OFF_SEQ_CTRL4,
1081
+    S2MPG10_PMIC_OFF_SEQ_CTRL5,
1082
+    S2MPG10_PMIC_OFF_SEQ_CTRL6,
1083
+    S2MPG10_PMIC_OFF_SEQ_CTRL7,
1084
+    S2MPG10_PMIC_OFF_SEQ_CTRL8,
1085
+    S2MPG10_PMIC_OFF_SEQ_CTRL9,
1086
+    S2MPG10_PMIC_OFF_SEQ_CTRL10,
1087
+    S2MPG10_PMIC_OFF_SEQ_CTRL11,
1088
+    S2MPG10_PMIC_OFF_SEQ_CTRL12,
1089
+    S2MPG10_PMIC_OFF_SEQ_CTRL13,
1090
+    S2MPG10_PMIC_OFF_SEQ_CTRL14,
1091
+    S2MPG10_PMIC_OFF_SEQ_CTRL15,
1092
+    S2MPG10_PMIC_OFF_SEQ_CTRL16,
1093
+    S2MPG10_PMIC_OFF_SEQ_CTRL17,
1094
+    S2MPG10_PMIC_OFF_SEQ_CTRL18,
1095
+    S2MPG10_PMIC_PCTRLSEL1,
1096
+    S2MPG10_PMIC_PCTRLSEL2,
1097
+    S2MPG10_PMIC_PCTRLSEL3,
1098
+    S2MPG10_PMIC_PCTRLSEL4,
1099
+    S2MPG10_PMIC_PCTRLSEL5,
1100
+    S2MPG10_PMIC_PCTRLSEL6,
1101
+    S2MPG10_PMIC_PCTRLSEL7,
1102
+    S2MPG10_PMIC_PCTRLSEL8,
1103
+    S2MPG10_PMIC_PCTRLSEL9,
1104
+    S2MPG10_PMIC_PCTRLSEL10,
1105
+    S2MPG10_PMIC_PCTRLSEL11,
1106
+    S2MPG10_PMIC_PCTRLSEL12,
1107
+    S2MPG10_PMIC_PCTRLSEL13,
1108
+    S2MPG10_PMIC_DCTRLSEL1,
1109
+    S2MPG10_PMIC_DCTRLSEL2,
1110
+    S2MPG10_PMIC_DCTRLSEL3,
1111
+    S2MPG10_PMIC_DCTRLSEL4,
1112
+    S2MPG10_PMIC_DCTRLSEL5,
1113
+    S2MPG10_PMIC_DCTRLSEL6,
1114
+    S2MPG10_PMIC_DCTRLSEL7,
944
+    S2MPG10_PMIC_GPIO_CTRL1,
1115
+    S2MPG10_PMIC_GPIO_CTRL1,
945
+    S2MPG10_PMIC_GPIO_CTRL2,
1116
+    S2MPG10_PMIC_GPIO_CTRL2,
946
+    S2MPG10_PMIC_GPIO_CTRL3,
1117
+    S2MPG10_PMIC_GPIO_CTRL3,
947
+    S2MPG10_PMIC_GPIO_CTRL4,
1118
+    S2MPG10_PMIC_GPIO_CTRL4,
948
+    S2MPG10_PMIC_GPIO_CTRL5,
1119
+    S2MPG10_PMIC_GPIO_CTRL5,
949
+    S2MPG10_PMIC_GPIO_CTRL6,
1120
+    S2MPG10_PMIC_GPIO_CTRL6,
950
+    S2MPG10_PMIC_GPIO_CTRL7,
1121
+    S2MPG10_PMIC_GPIO_CTRL7,
951
+    S2MPG10_PMIC_B2M_OCP_WARN,
1122
+    S2MPG10_PMIC_B2M_OCP_WARN,
952
+    S2MPG10_PMIC_B3M_OCP_WARN = 0xd2,
1123
+    S2MPG10_PMIC_B2M_OCP_WARN_X,
953
+    S2MPG10_PMIC_B10M_OCP_WARN = 0xd6,
1124
+    S2MPG10_PMIC_B2M_OCP_WARN_Y,
954
+    S2MPG10_PMIC_B2M_SOFT_OCP_WARN = 0xda,
1125
+    S2MPG10_PMIC_B2M_OCP_WARN_Z,
955
+    S2MPG10_PMIC_B3M_SOFT_OCP_WARN = 0xde,
1126
+    S2MPG10_PMIC_B3M_OCP_WARN,
956
+    S2MPG10_PMIC_B10M_SOFT_OCP_WARN = 0xe2,
1127
+    S2MPG10_PMIC_B3M_OCP_WARN_X,
957
+    S2MPG10_PMIC_BUCK_OCP_CTRL1 = 0xea,
1128
+    S2MPG10_PMIC_B3M_OCP_WARN_Y,
1129
+    S2MPG10_PMIC_B3M_OCP_WARN_Z,
1130
+    S2MPG10_PMIC_B10M_OCP_WARN,
1131
+    S2MPG10_PMIC_B10M_OCP_WARN_X,
1132
+    S2MPG10_PMIC_B10M_OCP_WARN_Y,
1133
+    S2MPG10_PMIC_B10M_OCP_WARN_Z,
1134
+    S2MPG10_PMIC_B2M_SOFT_OCP_WARN,
1135
+    S2MPG10_PMIC_B2M_SOFT_OCP_WARN_X,
1136
+    S2MPG10_PMIC_B2M_SOFT_OCP_WARN_Y,
1137
+    S2MPG10_PMIC_B2M_SOFT_OCP_WARN_Z,
1138
+    S2MPG10_PMIC_B3M_SOFT_OCP_WARN,
1139
+    S2MPG10_PMIC_B3M_SOFT_OCP_WARN_X,
1140
+    S2MPG10_PMIC_B3M_SOFT_OCP_WARN_Y,
1141
+    S2MPG10_PMIC_B3M_SOFT_OCP_WARN_Z,
1142
+    S2MPG10_PMIC_B10M_SOFT_OCP_WARN,
1143
+    S2MPG10_PMIC_B10M_SOFT_OCP_WARN_X,
1144
+    S2MPG10_PMIC_B10M_SOFT_OCP_WARN_Y,
1145
+    S2MPG10_PMIC_B10M_SOFT_OCP_WARN_Z,
1146
+    S2MPG10_PMIC_BUCK_OCP_EN1,
1147
+    S2MPG10_PMIC_BUCK_OCP_EN2,
1148
+    S2MPG10_PMIC_BUCK_OCP_PD_EN1,
1149
+    S2MPG10_PMIC_BUCK_OCP_PD_EN2,
1150
+    S2MPG10_PMIC_BUCK_OCP_CTRL1,
958
+    S2MPG10_PMIC_BUCK_OCP_CTRL2,
1151
+    S2MPG10_PMIC_BUCK_OCP_CTRL2,
959
+    S2MPG10_PMIC_BUCK_OCP_CTRL3,
1152
+    S2MPG10_PMIC_BUCK_OCP_CTRL3,
960
+    S2MPG10_PMIC_BUCK_OCP_CTRL4,
1153
+    S2MPG10_PMIC_BUCK_OCP_CTRL4,
961
+    S2MPG10_PMIC_BUCK_OCP_CTRL5,
1154
+    S2MPG10_PMIC_BUCK_OCP_CTRL5,
1155
+    S2MPG10_PMIC_PIF_CTRL,
1156
+    S2MPG10_PMIC_BUCK_HR_MODE1,
1157
+    S2MPG10_PMIC_BUCK_HR_MODE2,
1158
+    S2MPG10_PMIC_FAULTOUT_CTRL,
1159
+    S2MPG10_PMIC_LDO_SENSE1,
1160
+    S2MPG10_PMIC_LDO_SENSE2,
1161
+    S2MPG10_PMIC_LDO_SENSE3,
1162
+    S2MPG10_PMIC_LDO_SENSE4,
962
+};
1163
+};
963
+
1164
+
964
+/* Meter registers (type 0xa00) */
1165
+/* Meter registers (type 0xa00) */
965
+enum s2mpg10_meter_reg {
1166
+enum s2mpg10_meter_reg {
966
+    S2MPG10_METER_CTRL1,
1167
+    S2MPG10_METER_CTRL1,
...
...
1123
+};
1324
+};
1124
+
1325
+
1125
+#endif /* __LINUX_MFD_S2MPG10_H */
1326
+#endif /* __LINUX_MFD_S2MPG10_H */
1126
1327
1127
--
1328
--
1128
2.49.0.395.g12beb8f557-goog
1329
2.49.0.604.gff1f9ca942-goog
1129
1330
diff view generated by jsdifflib
...
...
14
sec_core 6780 sec_core 13239
14
sec_core 6780 sec_core 13239
15
sec_irq 8046
15
sec_irq 8046
16
----------------
16
----------------
17
Total 14826
17
Total 14826
18
18
19
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
19
Signed-off-by: André Draszik <andre.draszik@linaro.org>
20
Signed-off-by: André Draszik <andre.draszik@linaro.org>
20
21
---
21
---
22
Checkpatch suggests to update MAINTAINERS, but the new file is covered
22
Checkpatch suggests to update MAINTAINERS, but the new file is covered
23
already due to using a wildcard.
23
already due to using a wildcard.
24
---
24
---
25
drivers/mfd/Makefile | 3 ++-
25
drivers/mfd/Makefile | 3 ++-
26
drivers/mfd/{sec-core.c => sec-common.c} | 2 ++
26
drivers/mfd/{sec-core.c => sec-common.c} | 2 ++
27
drivers/mfd/sec-irq.c | 8 --------
27
drivers/mfd/sec-irq.c | 9 ---------
28
3 files changed, 4 insertions(+), 9 deletions(-)
28
3 files changed, 4 insertions(+), 10 deletions(-)
29
29
30
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
30
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
31
index XXXXXXX..XXXXXXX 100644
31
index XXXXXXX..XXXXXXX 100644
32
--- a/drivers/mfd/Makefile
32
--- a/drivers/mfd/Makefile
33
+++ b/drivers/mfd/Makefile
33
+++ b/drivers/mfd/Makefile
...
...
46
rename from drivers/mfd/sec-core.c
46
rename from drivers/mfd/sec-core.c
47
rename to drivers/mfd/sec-common.c
47
rename to drivers/mfd/sec-common.c
48
index XXXXXXX..XXXXXXX 100644
48
index XXXXXXX..XXXXXXX 100644
49
--- a/drivers/mfd/sec-core.c
49
--- a/drivers/mfd/sec-core.c
50
+++ b/drivers/mfd/sec-common.c
50
+++ b/drivers/mfd/sec-common.c
51
@@ -XXX,XX +XXX,XX @@ DEFINE_SIMPLE_DEV_PM_OPS(sec_pmic_pm_ops, sec_pmic_suspend, sec_pmic_resume);
51
@@ -XXX,XX +XXX,XX @@ static int sec_pmic_resume(struct device *dev)
52
DEFINE_SIMPLE_DEV_PM_OPS(sec_pmic_pm_ops, sec_pmic_suspend, sec_pmic_resume);
52
EXPORT_SYMBOL_GPL(sec_pmic_pm_ops);
53
EXPORT_SYMBOL_GPL(sec_pmic_pm_ops);
53
54
54
MODULE_AUTHOR("André Draszik <andre.draszik@linaro.org>");
55
+MODULE_AUTHOR("Chanwoo Choi <cw00.choi@samsung.com>");
55
+MODULE_AUTHOR("Chanwoo Choi <cw00.choi@samsung.com>");
56
+MODULE_AUTHOR("Krzysztof Kozlowski <krzk@kernel.org>");
56
+MODULE_AUTHOR("Krzysztof Kozlowski <krzk@kernel.org>");
57
MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>");
57
MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>");
58
MODULE_DESCRIPTION("Core driver for the Samsung S5M");
58
MODULE_DESCRIPTION("Core driver for the Samsung S5M");
59
MODULE_LICENSE("GPL");
59
MODULE_LICENSE("GPL");
...
...
67
#include <linux/dev_printk.h>
67
#include <linux/dev_printk.h>
68
-#include <linux/export.h>
68
-#include <linux/export.h>
69
#include <linux/interrupt.h>
69
#include <linux/interrupt.h>
70
#include <linux/irq.h>
70
#include <linux/irq.h>
71
#include <linux/mfd/samsung/core.h>
71
#include <linux/mfd/samsung/core.h>
72
@@ -XXX,XX +XXX,XX @@
73
#include <linux/mfd/samsung/s2mpu02.h>
74
#include <linux/mfd/samsung/s2mpu05.h>
75
#include <linux/mfd/samsung/s5m8767.h>
76
-#include <linux/module.h>
77
#include <linux/regmap.h>
78
#include "sec-core.h"
79
72
@@ -XXX,XX +XXX,XX @@ int sec_irq_init(struct sec_pmic_dev *sec_pmic)
80
@@ -XXX,XX +XXX,XX @@ int sec_irq_init(struct sec_pmic_dev *sec_pmic)
73
81
74
    return 0;
82
    return 0;
75
}
83
}
76
-EXPORT_SYMBOL_GPL(sec_irq_init);
84
-EXPORT_SYMBOL_GPL(sec_irq_init);
...
...
80
-MODULE_AUTHOR("Krzysztof Kozlowski <krzk@kernel.org>");
88
-MODULE_AUTHOR("Krzysztof Kozlowski <krzk@kernel.org>");
81
-MODULE_DESCRIPTION("Interrupt support for the S5M MFD");
89
-MODULE_DESCRIPTION("Interrupt support for the S5M MFD");
82
-MODULE_LICENSE("GPL");
90
-MODULE_LICENSE("GPL");
83
91
84
--
92
--
85
2.49.0.395.g12beb8f557-goog
93
2.49.0.604.gff1f9ca942-goog
86
94
diff view generated by jsdifflib
1
As a preparation for adding support for Samsung's S2MPG10, which is
1
Rectify a couple of alignment problems reported by Checkpatch.
2
connected via SPEEDY / ACPM rather than I2C, we're going to split out
3
(move) all I2C-specific driver code into its own kernel module, and
4
create a (common) core transport-agnostic kernel module.
5
6
That move of code would highlight some unexpected alignment which
7
checkpatch would complain about. To avoid that, address the error now,
8
before the split, to keep the amount of unrelated changes to a minimum
9
when actually doing the split.
10
2
11
Signed-off-by: André Draszik <andre.draszik@linaro.org>
3
Signed-off-by: André Draszik <andre.draszik@linaro.org>
4
12
---
5
---
13
drivers/mfd/sec-core.c | 10 ++++++----
6
v4:
14
1 file changed, 6 insertions(+), 4 deletions(-)
7
- update commit message (Lee)
15
8
16
diff --git a/drivers/mfd/sec-core.c b/drivers/mfd/sec-core.c
9
v2:
10
- make new alignment more readable (Krzysztof)
11
---
12
drivers/mfd/sec-common.c | 8 ++++----
13
1 file changed, 4 insertions(+), 4 deletions(-)
14
15
diff --git a/drivers/mfd/sec-common.c b/drivers/mfd/sec-common.c
17
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
18
--- a/drivers/mfd/sec-core.c
17
--- a/drivers/mfd/sec-common.c
19
+++ b/drivers/mfd/sec-core.c
18
+++ b/drivers/mfd/sec-common.c
20
@@ -XXX,XX +XXX,XX @@ sec_pmic_i2c_parse_dt_pdata(struct device *dev)
19
@@ -XXX,XX +XXX,XX @@ sec_pmic_parse_dt_pdata(struct device *dev)
21
    if (!pd)
22
        return ERR_PTR(-ENOMEM);
20
        return ERR_PTR(-ENOMEM);
23
21
24
-    pd->manual_poweroff = of_property_read_bool(dev->of_node,
22
    pd->manual_poweroff = of_property_read_bool(dev->of_node,
25
-                        "samsung,s2mps11-acokb-ground");
23
-                        "samsung,s2mps11-acokb-ground");
26
-    pd->disable_wrstbi = of_property_read_bool(dev->of_node,
24
+                         "samsung,s2mps11-acokb-ground");
25
    pd->disable_wrstbi = of_property_read_bool(dev->of_node,
27
-                        "samsung,s2mps11-wrstbi-ground");
26
-                        "samsung,s2mps11-wrstbi-ground");
28
+    pd->manual_poweroff =
27
+                         "samsung,s2mps11-wrstbi-ground");
29
+        of_property_read_bool(dev->of_node,
30
+                 "samsung,s2mps11-acokb-ground");
31
+    pd->disable_wrstbi =
32
+        of_property_read_bool(dev->of_node,
33
+                 "samsung,s2mps11-wrstbi-ground");
34
    return pd;
28
    return pd;
35
}
29
}
36
30
31
@@ -XXX,XX +XXX,XX @@ void sec_pmic_shutdown(struct device *dev)
32
         * ignore the rest.
33
         */
34
        dev_warn(sec_pmic->dev,
35
-            "Unsupported device %lu for manual power off\n",
36
-            sec_pmic->device_type);
37
+             "Unsupported device %lu for manual power off\n",
38
+             sec_pmic->device_type);
39
        return;
40
    }
41
37
42
38
--
43
--
39
2.49.0.395.g12beb8f557-goog
44
2.49.0.604.gff1f9ca942-goog
40
45
diff view generated by jsdifflib
Deleted patch
1
As a preparation for adding support for Samsung's S2MPG10, which is
2
connected via SPEEDY / ACPM rather than I2C, we're going to split out
3
(move) all I2C-specific driver code into its own kernel module, and
4
create a (common) core transport-agnostic kernel module.
5
1
6
Transport drivers will have to do device tree parsing, and the core
7
driver will allocate its own additional memory as needed.
8
9
In preparation for that change, separate out runtime platform data
10
allocation from device tree parsing.
11
12
Having this change will create less churn in the upcoming split of the
13
transport-specific parts.
14
15
Signed-off-by: André Draszik <andre.draszik@linaro.org>
16
---
17
drivers/mfd/sec-core.c | 30 ++++++++++++------------------
18
1 file changed, 12 insertions(+), 18 deletions(-)
19
20
diff --git a/drivers/mfd/sec-core.c b/drivers/mfd/sec-core.c
21
index XXXXXXX..XXXXXXX 100644
22
--- a/drivers/mfd/sec-core.c
23
+++ b/drivers/mfd/sec-core.c
24
@@ -XXX,XX +XXX,XX @@ static void sec_pmic_configure(struct sec_pmic_dev *sec_pmic)
25
* Only the common platform data elements for s5m8767 are parsed here from the
26
* device tree. Other sub-modules of s5m8767 such as pmic, rtc , charger and
27
* others have to parse their own platform data elements from device tree.
28
- *
29
- * The s5m8767 platform data structure is instantiated here and the drivers for
30
- * the sub-modules need not instantiate another instance while parsing their
31
- * platform data.
32
*/
33
-static struct sec_platform_data *
34
-sec_pmic_i2c_parse_dt_pdata(struct device *dev)
35
+static void sec_pmic_i2c_parse_dt_pdata(struct device *dev,
36
+                    struct sec_platform_data *pd)
37
{
38
-    struct sec_platform_data *pd;
39
-
40
-    pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL);
41
-    if (!pd)
42
-        return ERR_PTR(-ENOMEM);
43
-
44
    pd->manual_poweroff =
45
        of_property_read_bool(dev->of_node,
46
                 "samsung,s2mps11-acokb-ground");
47
    pd->disable_wrstbi =
48
        of_property_read_bool(dev->of_node,
49
                 "samsung,s2mps11-wrstbi-ground");
50
-    return pd;
51
}
52
53
static int sec_pmic_probe(struct i2c_client *i2c)
54
@@ -XXX,XX +XXX,XX @@ static int sec_pmic_probe(struct i2c_client *i2c)
55
    sec_pmic->i2c = i2c;
56
    sec_pmic->irq = i2c->irq;
57
58
-    pdata = sec_pmic_i2c_parse_dt_pdata(sec_pmic->dev);
59
-    if (IS_ERR(pdata)) {
60
-        ret = PTR_ERR(pdata);
61
-        return ret;
62
-    }
63
+    /*
64
+     * The s5m8767 platform data structure is instantiated here and the
65
+     * drivers for the sub-modules need not instantiate another instance
66
+     * while parsing their platform data.
67
+     */
68
+    pdata = devm_kzalloc(sec_pmic->dev, sizeof(*pdata), GFP_KERNEL);
69
+    if (!pdata)
70
+        return -ENOMEM;
71
+
72
+    sec_pmic_i2c_parse_dt_pdata(sec_pmic->dev, pdata);
73
74
    sec_pmic->device_type = (unsigned long)of_device_get_match_data(sec_pmic->dev);
75
    sec_pmic->pdata = pdata;
76
77
--
78
2.49.0.395.g12beb8f557-goog
79
diff view generated by jsdifflib
1
Sort struct of_device_id entries and the device type switch in _probe()
1
Sort struct of_device_id entries and the device type switch in _probe()
2
alphabetically, which makes it easier to find the right place where to
2
alphabetically, which makes it easier to find the right place where to
3
insert new entries in the future.
3
insert new entries in the future.
4
4
5
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
5
Signed-off-by: André Draszik <andre.draszik@linaro.org>
6
Signed-off-by: André Draszik <andre.draszik@linaro.org>
6
---
7
---
7
drivers/mfd/sec-i2c.c | 18 +++++++++---------
8
drivers/mfd/sec-i2c.c | 18 +++++++++---------
8
1 file changed, 9 insertions(+), 9 deletions(-)
9
1 file changed, 9 insertions(+), 9 deletions(-)
9
10
...
...
61
    },
62
    },
62
    { },
63
    { },
63
};
64
};
64
65
65
--
66
--
66
2.49.0.395.g12beb8f557-goog
67
2.49.0.604.gff1f9ca942-goog
67
68
diff view generated by jsdifflib
1
dev_err_probe() exists to simplify code and harmonise error messages,
1
dev_err_probe() exists to simplify code and harmonise error messages,
2
there's no reason not to use it here.
2
there's no reason not to use it here.
3
3
4
While at it, harmonise some error messages.
4
While at it, harmonise some error messages.
5
5
6
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
6
Signed-off-by: André Draszik <andre.draszik@linaro.org>
7
Signed-off-by: André Draszik <andre.draszik@linaro.org>
7
---
8
---
8
drivers/mfd/sec-common.c | 6 +++---
9
drivers/mfd/sec-common.c | 6 +++---
9
drivers/mfd/sec-i2c.c | 10 +++-------
10
drivers/mfd/sec-i2c.c | 10 +++-------
10
drivers/mfd/sec-irq.c | 14 +++++++-------
11
drivers/mfd/sec-irq.c | 14 +++++++-------
...
...
35
    const struct regmap_config *regmap;
36
    const struct regmap_config *regmap;
36
    unsigned long device_type;
37
    unsigned long device_type;
37
    struct regmap *regmap_pmic;
38
    struct regmap *regmap_pmic;
38
-    int ret;
39
-    int ret;
39
40
40
    sec_pmic_i2c_parse_dt_pdata(&client->dev, &probedata);
41
    device_type = (unsigned long)of_device_get_match_data(&client->dev);
41
42
42
@@ -XXX,XX +XXX,XX @@ static int sec_pmic_i2c_probe(struct i2c_client *client)
43
@@ -XXX,XX +XXX,XX @@ static int sec_pmic_i2c_probe(struct i2c_client *client)
43
    }
44
    }
44
45
45
    regmap_pmic = devm_regmap_init_i2c(client, regmap);
46
    regmap_pmic = devm_regmap_init_i2c(client, regmap);
...
...
52
+    if (IS_ERR(regmap_pmic))
53
+    if (IS_ERR(regmap_pmic))
53
+        return dev_err_probe(&client->dev, PTR_ERR(regmap_pmic),
54
+        return dev_err_probe(&client->dev, PTR_ERR(regmap_pmic),
54
+                 "regmap init failed\n");
55
+                 "regmap init failed\n");
55
56
56
    return sec_pmic_probe(&client->dev, device_type, client->irq,
57
    return sec_pmic_probe(&client->dev, device_type, client->irq,
57
             regmap_pmic, &probedata, client);
58
             regmap_pmic, client);
58
diff --git a/drivers/mfd/sec-irq.c b/drivers/mfd/sec-irq.c
59
diff --git a/drivers/mfd/sec-irq.c b/drivers/mfd/sec-irq.c
59
index XXXXXXX..XXXXXXX 100644
60
index XXXXXXX..XXXXXXX 100644
60
--- a/drivers/mfd/sec-irq.c
61
--- a/drivers/mfd/sec-irq.c
61
+++ b/drivers/mfd/sec-irq.c
62
+++ b/drivers/mfd/sec-irq.c
62
@@ -XXX,XX +XXX,XX @@ int sec_irq_init(struct sec_pmic_dev *sec_pmic)
63
@@ -XXX,XX +XXX,XX @@ int sec_irq_init(struct sec_pmic_dev *sec_pmic)
...
...
85
86
86
    /*
87
    /*
87
     * The rtc-s5m driver requests S2MPS14_IRQ_RTCA0 also for S2MPS11
88
     * The rtc-s5m driver requests S2MPS14_IRQ_RTCA0 also for S2MPS11
88
89
89
--
90
--
90
2.49.0.395.g12beb8f557-goog
91
2.49.0.604.gff1f9ca942-goog
91
92
diff view generated by jsdifflib
...
...
12
effect again.
12
effect again.
13
13
14
To make things more obvious, and to help the reader of this code while
14
To make things more obvious, and to help the reader of this code while
15
reasoning about what the intention might be here, and to ensure future
15
reasoning about what the intention might be here, and to ensure future
16
additions to support new devices in this driver don't forget to add a
16
additions to support new devices in this driver don't forget to add a
17
regmap config, add an explicit regmap config for these two devices, so
17
regmap config, add an explicit regmap config for these two devices, and
18
that we can ultimately remove the generic regmap config.
18
completely remove the generic regmap config as it becomes an orphan
19
again that shouldn't be used by any device.
19
20
20
Note that this commit doesn't fix the issue that s2dos05_regmap_config
21
Note that this commit doesn't fix the issue that s2dos05_regmap_config
21
ands2mpu05_regmap_config really are incomplete, but I have no
22
ands2mpu05_regmap_config really are incomplete, but I have no
22
documentation on them.
23
documentation on them.
23
24
25
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
24
Signed-off-by: André Draszik <andre.draszik@linaro.org>
26
Signed-off-by: André Draszik <andre.draszik@linaro.org>
25
---
27
---
26
drivers/mfd/sec-i2c.c | 16 ++++++++++++++++
28
v2:
27
1 file changed, 16 insertions(+)
29
* squash two previously separate patches into this one (Krzysztof)
30
---
31
drivers/mfd/sec-i2c.c | 18 +++++++++++++++---
32
1 file changed, 15 insertions(+), 3 deletions(-)
28
33
29
diff --git a/drivers/mfd/sec-i2c.c b/drivers/mfd/sec-i2c.c
34
diff --git a/drivers/mfd/sec-i2c.c b/drivers/mfd/sec-i2c.c
30
index XXXXXXX..XXXXXXX 100644
35
index XXXXXXX..XXXXXXX 100644
31
--- a/drivers/mfd/sec-i2c.c
36
--- a/drivers/mfd/sec-i2c.c
32
+++ b/drivers/mfd/sec-i2c.c
37
+++ b/drivers/mfd/sec-i2c.c
33
@@ -XXX,XX +XXX,XX @@ static const struct regmap_config sec_regmap_config = {
38
@@ -XXX,XX +XXX,XX @@ static bool s2mpu02_volatile(struct device *dev, unsigned int reg)
39
    }
40
}
41
42
-static const struct regmap_config sec_regmap_config = {
43
+static const struct regmap_config s2dos05_regmap_config = {
44
    .reg_bits = 8,
34
    .val_bits = 8,
45
    .val_bits = 8,
35
};
46
};
36
37
+static const struct regmap_config s2dos05_regmap_config = {
38
+    .reg_bits = 8,
39
+    .val_bits = 8,
40
+};
41
+
42
static const struct regmap_config s2mpa01_regmap_config = {
43
    .reg_bits = 8,
44
    .val_bits = 8,
45
@@ -XXX,XX +XXX,XX @@ static const struct regmap_config s2mpu02_regmap_config = {
47
@@ -XXX,XX +XXX,XX @@ static const struct regmap_config s2mpu02_regmap_config = {
46
    .cache_type = REGCACHE_FLAT,
48
    .cache_type = REGCACHE_FLAT,
47
};
49
};
48
50
49
+static const struct regmap_config s2mpu05_regmap_config = {
51
+static const struct regmap_config s2mpu05_regmap_config = {
...
...
72
+        regmap = &s2mpu05_regmap_config;
74
+        regmap = &s2mpu05_regmap_config;
73
+        break;
75
+        break;
74
    case S5M8767X:
76
    case S5M8767X:
75
        regmap = &s5m8767_regmap_config;
77
        regmap = &s5m8767_regmap_config;
76
        break;
78
        break;
79
    default:
80
-        regmap = &sec_regmap_config;
81
-        break;
82
+        return dev_err_probe(&client->dev, -ENODEV,
83
+                 "Unsupported device type %lu\n",
84
+                 device_type);
85
    }
86
87
    regmap_pmic = devm_regmap_init_i2c(client, regmap);
77
88
78
--
89
--
79
2.49.0.395.g12beb8f557-goog
90
2.49.0.604.gff1f9ca942-goog
80
91
diff view generated by jsdifflib
...
...
8
8
9
This will become particularly important once errors from sec_irq_init()
9
This will become particularly important once errors from sec_irq_init()
10
aren't ignored anymore in an upcoming patch and helps the reader of
10
aren't ignored anymore in an upcoming patch and helps the reader of
11
this code while reasoning about what the intention might be here.
11
this code while reasoning about what the intention might be here.
12
12
13
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
13
Signed-off-by: André Draszik <andre.draszik@linaro.org>
14
Signed-off-by: André Draszik <andre.draszik@linaro.org>
14
---
15
---
15
drivers/mfd/sec-irq.c | 14 ++++++++------
16
drivers/mfd/sec-irq.c | 14 ++++++++------
16
1 file changed, 8 insertions(+), 6 deletions(-)
17
1 file changed, 8 insertions(+), 6 deletions(-)
17
18
...
...
51
    ret = devm_regmap_add_irq_chip(sec_pmic->dev, sec_pmic->regmap_pmic,
52
    ret = devm_regmap_add_irq_chip(sec_pmic->dev, sec_pmic->regmap_pmic,
52
                 sec_pmic->irq, IRQF_ONESHOT,
53
                 sec_pmic->irq, IRQF_ONESHOT,
53
                 0, sec_irq_chip, &sec_pmic->irq_data);
54
                 0, sec_irq_chip, &sec_pmic->irq_data);
54
55
55
--
56
--
56
2.49.0.395.g12beb8f557-goog
57
2.49.0.604.gff1f9ca942-goog
57
58
diff view generated by jsdifflib
1
sec_irq_init() can fail, we shouldn't continue and ignore the error in
1
sec_irq_init() can fail, we shouldn't continue and ignore the error in
2
that case, but actually error out.
2
that case, but actually error out.
3
3
4
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
4
Signed-off-by: André Draszik <andre.draszik@linaro.org>
5
Signed-off-by: André Draszik <andre.draszik@linaro.org>
5
---
6
---
6
drivers/mfd/sec-common.c | 4 +++-
7
drivers/mfd/sec-common.c | 4 +++-
7
1 file changed, 3 insertions(+), 1 deletion(-)
8
1 file changed, 3 insertions(+), 1 deletion(-)
8
9
9
diff --git a/drivers/mfd/sec-common.c b/drivers/mfd/sec-common.c
10
diff --git a/drivers/mfd/sec-common.c b/drivers/mfd/sec-common.c
10
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
11
--- a/drivers/mfd/sec-common.c
12
--- a/drivers/mfd/sec-common.c
12
+++ b/drivers/mfd/sec-common.c
13
+++ b/drivers/mfd/sec-common.c
13
@@ -XXX,XX +XXX,XX @@ int sec_pmic_probe(struct device *dev, unsigned long device_type,
14
@@ -XXX,XX +XXX,XX @@ int sec_pmic_probe(struct device *dev, unsigned long device_type,
14
        pdata->disable_wrstbi = probedata->disable_wrstbi;
15
15
    }
16
    sec_pmic->pdata = pdata;
16
17
17
-    sec_irq_init(sec_pmic);
18
-    sec_irq_init(sec_pmic);
18
+    ret = sec_irq_init(sec_pmic);
19
+    ret = sec_irq_init(sec_pmic);
19
+    if (ret)
20
+    if (ret)
20
+        return ret;
21
+        return ret;
21
22
22
    pm_runtime_set_active(sec_pmic->dev);
23
    pm_runtime_set_active(sec_pmic->dev);
23
24
24
25
25
--
26
--
26
2.49.0.395.g12beb8f557-goog
27
2.49.0.604.gff1f9ca942-goog
27
28
diff view generated by jsdifflib
1
Instead of a large open-coded switch statement, just add both regmap
1
Instead of a large open-coded switch statement, just add both regmap
2
config and device type to the OF match data. This allows us to have all
2
config and device type to the OF match data. This allows us to have all
3
related information in one place, and avoids a long switch() statement.
3
related information in one place, and avoids a long switch() statement.
4
4
5
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
5
Signed-off-by: André Draszik <andre.draszik@linaro.org>
6
Signed-off-by: André Draszik <andre.draszik@linaro.org>
6
---
7
---
7
drivers/mfd/sec-i2c.c | 137 +++++++++++++++++++++++++-------------------------
8
v2: fix typo in platform data for "samsung,s2mps14-pmic"
8
1 file changed, 68 insertions(+), 69 deletions(-)
9
---
10
drivers/mfd/sec-i2c.c | 133 +++++++++++++++++++++++++-------------------------
11
1 file changed, 66 insertions(+), 67 deletions(-)
9
12
10
diff --git a/drivers/mfd/sec-i2c.c b/drivers/mfd/sec-i2c.c
13
diff --git a/drivers/mfd/sec-i2c.c b/drivers/mfd/sec-i2c.c
11
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
12
--- a/drivers/mfd/sec-i2c.c
15
--- a/drivers/mfd/sec-i2c.c
13
+++ b/drivers/mfd/sec-i2c.c
16
+++ b/drivers/mfd/sec-i2c.c
...
...
27
+};
30
+};
28
+
31
+
29
static bool s2mpa01_volatile(struct device *dev, unsigned int reg)
32
static bool s2mpa01_volatile(struct device *dev, unsigned int reg)
30
{
33
{
31
    switch (reg) {
34
    switch (reg) {
32
@@ -XXX,XX +XXX,XX @@ sec_pmic_i2c_parse_dt_pdata(struct device *dev,
35
@@ -XXX,XX +XXX,XX @@ static const struct regmap_config s5m8767_regmap_config = {
33
36
34
static int sec_pmic_i2c_probe(struct i2c_client *client)
37
static int sec_pmic_i2c_probe(struct i2c_client *client)
35
{
38
{
36
+    const struct sec_pmic_i2c_platform_data *pdata;
37
    struct sec_pmic_probe_data probedata;
38
-    const struct regmap_config *regmap;
39
-    const struct regmap_config *regmap;
39
-    unsigned long device_type;
40
-    unsigned long device_type;
41
+    const struct sec_pmic_i2c_platform_data *pdata;
40
    struct regmap *regmap_pmic;
42
    struct regmap *regmap_pmic;
41
43
42
-    sec_pmic_i2c_parse_dt_pdata(&client->dev, &probedata);
43
-
44
-    device_type = (unsigned long)of_device_get_match_data(&client->dev);
44
-    device_type = (unsigned long)of_device_get_match_data(&client->dev);
45
-
45
-
46
-    switch (device_type) {
46
-    switch (device_type) {
47
-    case S2DOS05:
47
-    case S2DOS05:
48
-        regmap = &s2dos05_regmap_config;
48
-        regmap = &s2dos05_regmap_config;
...
...
79
-                 device_type);
79
-                 device_type);
80
-    }
80
-    }
81
+                 "Unsupported device type\n");
81
+                 "Unsupported device type\n");
82
82
83
-    regmap_pmic = devm_regmap_init_i2c(client, regmap);
83
-    regmap_pmic = devm_regmap_init_i2c(client, regmap);
84
+    sec_pmic_i2c_parse_dt_pdata(&client->dev, &probedata);
85
+
86
+    regmap_pmic = devm_regmap_init_i2c(client, pdata->regmap_cfg);
84
+    regmap_pmic = devm_regmap_init_i2c(client, pdata->regmap_cfg);
87
    if (IS_ERR(regmap_pmic))
85
    if (IS_ERR(regmap_pmic))
88
        return dev_err_probe(&client->dev, PTR_ERR(regmap_pmic),
86
        return dev_err_probe(&client->dev, PTR_ERR(regmap_pmic),
89
                 "regmap init failed\n");
87
                 "regmap init failed\n");
90
88
91
-    return sec_pmic_probe(&client->dev, device_type, client->irq,
89
-    return sec_pmic_probe(&client->dev, device_type, client->irq,
92
+    return sec_pmic_probe(&client->dev, pdata->device_type, client->irq,
90
+    return sec_pmic_probe(&client->dev, pdata->device_type, client->irq,
93
             regmap_pmic, &probedata, client);
91
             regmap_pmic, client);
94
}
92
}
95
93
96
@@ -XXX,XX +XXX,XX @@ static void sec_pmic_i2c_shutdown(struct i2c_client *i2c)
94
@@ -XXX,XX +XXX,XX @@ static void sec_pmic_i2c_shutdown(struct i2c_client *i2c)
97
    sec_pmic_shutdown(&i2c->dev);
95
    sec_pmic_shutdown(&i2c->dev);
98
}
96
}
...
...
173
-    },
171
-    },
174
+    { .compatible = "samsung,s2dos05", .data = &s2dos05_data, },
172
+    { .compatible = "samsung,s2dos05", .data = &s2dos05_data, },
175
+    { .compatible = "samsung,s2mpa01-pmic", .data = &s2mpa01_data, },
173
+    { .compatible = "samsung,s2mpa01-pmic", .data = &s2mpa01_data, },
176
+    { .compatible = "samsung,s2mps11-pmic", .data = &s2mps11_data, },
174
+    { .compatible = "samsung,s2mps11-pmic", .data = &s2mps11_data, },
177
+    { .compatible = "samsung,s2mps13-pmic", .data = &s2mps13_data, },
175
+    { .compatible = "samsung,s2mps13-pmic", .data = &s2mps13_data, },
178
+    { .compatible = "samsung,s2mps14-pmic", .data = &s2mps15_data, },
176
+    { .compatible = "samsung,s2mps14-pmic", .data = &s2mps14_data, },
179
+    { .compatible = "samsung,s2mps15-pmic", .data = &s2mps15_data, },
177
+    { .compatible = "samsung,s2mps15-pmic", .data = &s2mps15_data, },
180
+    { .compatible = "samsung,s2mpu02-pmic", .data = &s2mpu02_data, },
178
+    { .compatible = "samsung,s2mpu02-pmic", .data = &s2mpu02_data, },
181
+    { .compatible = "samsung,s2mpu05-pmic", .data = &s2mpu05_data, },
179
+    { .compatible = "samsung,s2mpu05-pmic", .data = &s2mpu05_data, },
182
+    { .compatible = "samsung,s5m8767-pmic", .data = &s5m8767_data, },
180
+    { .compatible = "samsung,s5m8767-pmic", .data = &s5m8767_data, },
183
    { },
181
    { },
184
};
182
};
185
MODULE_DEVICE_TABLE(of, sec_pmic_i2c_of_match);
183
MODULE_DEVICE_TABLE(of, sec_pmic_i2c_of_match);
186
184
187
--
185
--
188
2.49.0.395.g12beb8f557-goog
186
2.49.0.604.gff1f9ca942-goog
189
187
diff view generated by jsdifflib
...
...
3
3
4
This saves a few bytes in struct sec_pmic_dev due to member alignment.
4
This saves a few bytes in struct sec_pmic_dev due to member alignment.
5
5
6
Signed-off-by: André Draszik <andre.draszik@linaro.org>
6
Signed-off-by: André Draszik <andre.draszik@linaro.org>
7
---
7
---
8
drivers/mfd/sec-common.c | 8 ++++----
8
drivers/mfd/sec-common.c | 9 ++++-----
9
drivers/mfd/sec-core.h | 4 ++--
9
drivers/mfd/sec-core.h | 5 ++---
10
drivers/mfd/sec-i2c.c | 2 +-
10
drivers/mfd/sec-i2c.c | 2 +-
11
drivers/mfd/sec-irq.c | 5 ++---
11
drivers/mfd/sec-irq.c | 5 ++---
12
include/linux/mfd/samsung/core.h | 2 +-
12
include/linux/mfd/samsung/core.h | 2 +-
13
5 files changed, 10 insertions(+), 11 deletions(-)
13
5 files changed, 10 insertions(+), 13 deletions(-)
14
14
15
diff --git a/drivers/mfd/sec-common.c b/drivers/mfd/sec-common.c
15
diff --git a/drivers/mfd/sec-common.c b/drivers/mfd/sec-common.c
16
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
17
--- a/drivers/mfd/sec-common.c
17
--- a/drivers/mfd/sec-common.c
18
+++ b/drivers/mfd/sec-common.c
18
+++ b/drivers/mfd/sec-common.c
19
@@ -XXX,XX +XXX,XX @@ static void sec_pmic_configure(struct sec_pmic_dev *sec_pmic)
19
@@ -XXX,XX +XXX,XX @@ sec_pmic_parse_dt_pdata(struct device *dev)
20
    }
20
    return pd;
21
}
21
}
22
22
23
-int sec_pmic_probe(struct device *dev, unsigned long device_type,
23
-int sec_pmic_probe(struct device *dev, unsigned long device_type,
24
-         unsigned int irq, struct regmap *regmap,
24
-         unsigned int irq, struct regmap *regmap,
25
-         struct i2c_client *client)
25
+int sec_pmic_probe(struct device *dev, int device_type, unsigned int irq,
26
+int sec_pmic_probe(struct device *dev, int device_type, unsigned int irq,
26
+         struct regmap *regmap,
27
+         struct regmap *regmap, struct i2c_client *client)
27
         const struct sec_pmic_probe_data *probedata,
28
         struct i2c_client *client)
29
{
28
{
29
    struct sec_platform_data *pdata;
30
    const struct mfd_cell *sec_devs;
30
@@ -XXX,XX +XXX,XX @@ int sec_pmic_probe(struct device *dev, unsigned long device_type,
31
@@ -XXX,XX +XXX,XX @@ int sec_pmic_probe(struct device *dev, unsigned long device_type,
31
        break;
32
        break;
32
    default:
33
    default:
33
        return dev_err_probe(sec_pmic->dev, -EINVAL,
34
        return dev_err_probe(sec_pmic->dev, -EINVAL,
34
-                 "Unsupported device type %lu\n",
35
-                 "Unsupported device type %lu\n",
...
...
38
    ret = devm_mfd_add_devices(sec_pmic->dev, -1, sec_devs, num_sec_devs,
39
    ret = devm_mfd_add_devices(sec_pmic->dev, -1, sec_devs, num_sec_devs,
39
@@ -XXX,XX +XXX,XX @@ void sec_pmic_shutdown(struct device *dev)
40
@@ -XXX,XX +XXX,XX @@ void sec_pmic_shutdown(struct device *dev)
40
         * ignore the rest.
41
         * ignore the rest.
41
         */
42
         */
42
        dev_warn(sec_pmic->dev,
43
        dev_warn(sec_pmic->dev,
43
-            "Unsupported device %lu for manual power off\n",
44
-             "Unsupported device %lu for manual power off\n",
44
+            "Unsupported device %d for manual power off\n",
45
+             "Unsupported device %d for manual power off\n",
45
            sec_pmic->device_type);
46
             sec_pmic->device_type);
46
        return;
47
        return;
47
    }
48
    }
48
diff --git a/drivers/mfd/sec-core.h b/drivers/mfd/sec-core.h
49
diff --git a/drivers/mfd/sec-core.h b/drivers/mfd/sec-core.h
49
index XXXXXXX..XXXXXXX 100644
50
index XXXXXXX..XXXXXXX 100644
50
--- a/drivers/mfd/sec-core.h
51
--- a/drivers/mfd/sec-core.h
51
+++ b/drivers/mfd/sec-core.h
52
+++ b/drivers/mfd/sec-core.h
52
@@ -XXX,XX +XXX,XX @@ struct sec_pmic_probe_data {
53
@@ -XXX,XX +XXX,XX @@ struct i2c_client;
53
    bool disable_wrstbi;
54
54
};
55
extern const struct dev_pm_ops sec_pmic_pm_ops;
55
56
56
-int sec_pmic_probe(struct device *dev, unsigned long device_type,
57
-int sec_pmic_probe(struct device *dev, unsigned long device_type,
57
-         unsigned int irq, struct regmap *regmap,
58
-         unsigned int irq, struct regmap *regmap,
59
-         struct i2c_client *client);
58
+int sec_pmic_probe(struct device *dev, int device_type, unsigned int irq,
60
+int sec_pmic_probe(struct device *dev, int device_type, unsigned int irq,
59
+         struct regmap *regmap,
61
+         struct regmap *regmap, struct i2c_client *client);
60
         const struct sec_pmic_probe_data *probedata,
61
         struct i2c_client *client);
62
void sec_pmic_shutdown(struct device *dev);
62
void sec_pmic_shutdown(struct device *dev);
63
64
int sec_irq_init(struct sec_pmic_dev *sec_pmic);
63
diff --git a/drivers/mfd/sec-i2c.c b/drivers/mfd/sec-i2c.c
65
diff --git a/drivers/mfd/sec-i2c.c b/drivers/mfd/sec-i2c.c
64
index XXXXXXX..XXXXXXX 100644
66
index XXXXXXX..XXXXXXX 100644
65
--- a/drivers/mfd/sec-i2c.c
67
--- a/drivers/mfd/sec-i2c.c
66
+++ b/drivers/mfd/sec-i2c.c
68
+++ b/drivers/mfd/sec-i2c.c
67
@@ -XXX,XX +XXX,XX @@
69
@@ -XXX,XX +XXX,XX @@
...
...
111
    int irq;
113
    int irq;
112
    struct regmap_irq_chip_data *irq_data;
114
    struct regmap_irq_chip_data *irq_data;
113
};
115
};
114
116
115
--
117
--
116
2.49.0.395.g12beb8f557-goog
118
2.49.0.604.gff1f9ca942-goog
117
119
diff view generated by jsdifflib
...
...
45
        return dev_err_probe(sec_pmic->dev, ret,
45
        return dev_err_probe(sec_pmic->dev, ret,
46
                 "Failed to add %s IRQ chip\n",
46
                 "Failed to add %s IRQ chip\n",
47
                 sec_irq_chip->name);
47
                 sec_irq_chip->name);
48
48
49
--
49
--
50
2.49.0.395.g12beb8f557-goog
50
2.49.0.604.gff1f9ca942-goog
51
51
diff view generated by jsdifflib
...
...
25
    if (!sec_pmic)
25
    if (!sec_pmic)
26
        return -ENOMEM;
26
        return -ENOMEM;
27
27
28
28
29
--
29
--
30
2.49.0.395.g12beb8f557-goog
30
2.49.0.604.gff1f9ca942-goog
31
31
diff view generated by jsdifflib
...
...
102
};
102
};
103
103
104
static void sec_pmic_dump_rev(struct sec_pmic_dev *sec_pmic)
104
static void sec_pmic_dump_rev(struct sec_pmic_dev *sec_pmic)
105
105
106
--
106
--
107
2.49.0.395.g12beb8f557-goog
107
2.49.0.604.gff1f9ca942-goog
108
108
diff view generated by jsdifflib
...
...
370
+    REGMAP_IRQ_REG(S5M8767_IRQ_SMPL, 2, S5M8767_IRQ_SMPL_MASK),
370
+    REGMAP_IRQ_REG(S5M8767_IRQ_SMPL, 2, S5M8767_IRQ_SMPL_MASK),
371
+    REGMAP_IRQ_REG(S5M8767_IRQ_RTC1S, 2, S5M8767_IRQ_RTC1S_MASK),
371
+    REGMAP_IRQ_REG(S5M8767_IRQ_RTC1S, 2, S5M8767_IRQ_RTC1S_MASK),
372
+    REGMAP_IRQ_REG(S5M8767_IRQ_WTSR, 2, S5M8767_IRQ_WTSR_MASK),
372
+    REGMAP_IRQ_REG(S5M8767_IRQ_WTSR, 2, S5M8767_IRQ_WTSR_MASK),
373
};
373
};
374
374
375
static const struct regmap_irq_chip s2mpg10_irq_chip = {
375
/* All S2MPG10 interrupt sources are read-only and don't require clearing */
376
376
377
--
377
--
378
2.49.0.395.g12beb8f557-goog
378
2.49.0.604.gff1f9ca942-goog
379
379
diff view generated by jsdifflib
1
When support for PMICs without compatibles was removed in
1
Add myself as module author, so people know whom to complain to about
2
commit f736d2c0caa8 ("mfd: sec: Remove PMICs without compatibles"),
2
after the recent updates.
3
sec_regmap_config effectively became an orphan, because S5M8763X was
4
the only user left of it before removal, using the default: case of the
5
switch statement.
6
7
Subsequently, the accidental new users have been updated, so
8
sec_regmap_config is an orphan again, and can and should be removed
9
from the code. Doing so will also ensure future additions to support
10
new devices in this driver don't forget to add a regmap config.
11
12
Drop this fallback regmap config.
13
3
14
Signed-off-by: André Draszik <andre.draszik@linaro.org>
4
Signed-off-by: André Draszik <andre.draszik@linaro.org>
5
15
---
6
---
16
drivers/mfd/sec-i2c.c | 10 +++-------
7
v4:
17
1 file changed, 3 insertions(+), 7 deletions(-)
8
- Lee:
9
- don't sort module_author entries alphabetically
10
- update commit message
11
---
12
drivers/mfd/sec-common.c | 1 +
13
drivers/mfd/sec-i2c.c | 1 +
14
2 files changed, 2 insertions(+)
18
15
16
diff --git a/drivers/mfd/sec-common.c b/drivers/mfd/sec-common.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/drivers/mfd/sec-common.c
19
+++ b/drivers/mfd/sec-common.c
20
@@ -XXX,XX +XXX,XX @@ EXPORT_SYMBOL_GPL(sec_pmic_pm_ops);
21
MODULE_AUTHOR("Chanwoo Choi <cw00.choi@samsung.com>");
22
MODULE_AUTHOR("Krzysztof Kozlowski <krzk@kernel.org>");
23
MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>");
24
+MODULE_AUTHOR("André Draszik <andre.draszik@linaro.org>");
25
MODULE_DESCRIPTION("Core driver for the Samsung S5M");
26
MODULE_LICENSE("GPL");
19
diff --git a/drivers/mfd/sec-i2c.c b/drivers/mfd/sec-i2c.c
27
diff --git a/drivers/mfd/sec-i2c.c b/drivers/mfd/sec-i2c.c
20
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
21
--- a/drivers/mfd/sec-i2c.c
29
--- a/drivers/mfd/sec-i2c.c
22
+++ b/drivers/mfd/sec-i2c.c
30
+++ b/drivers/mfd/sec-i2c.c
23
@@ -XXX,XX +XXX,XX @@ static bool s2mpu02_volatile(struct device *dev, unsigned int reg)
31
@@ -XXX,XX +XXX,XX @@ static struct i2c_driver sec_pmic_i2c_driver = {
24
    }
32
module_i2c_driver(sec_pmic_i2c_driver);
25
}
33
26
34
MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>");
27
-static const struct regmap_config sec_regmap_config = {
35
+MODULE_AUTHOR("André Draszik <andre.draszik@linaro.org>");
28
-    .reg_bits = 8,
36
MODULE_DESCRIPTION("I2C driver for the Samsung S5M");
29
-    .val_bits = 8,
37
MODULE_LICENSE("GPL");
30
-};
31
-
32
static const struct regmap_config s2dos05_regmap_config = {
33
    .reg_bits = 8,
34
    .val_bits = 8,
35
@@ -XXX,XX +XXX,XX @@ static int sec_pmic_i2c_probe(struct i2c_client *client)
36
        regmap = &s5m8767_regmap_config;
37
        break;
38
    default:
39
-        regmap = &sec_regmap_config;
40
-        break;
41
+        return dev_err_probe(&client->dev, -ENODEV,
42
+                 "Unsupported device type %lu\n",
43
+                 device_type);
44
    }
45
46
    regmap_pmic = devm_regmap_init_i2c(client, regmap);
47
38
48
--
39
--
49
2.49.0.395.g12beb8f557-goog
40
2.49.0.604.gff1f9ca942-goog
50
41
diff view generated by jsdifflib
1
Add support for Samsung's S2MPG10 PMIC clock, which is similar to the
1
Add support for Samsung's S2MPG10 PMIC clock, which is similar to the
2
existing PMIC clocks supported by this driver.
2
existing PMIC clocks supported by this driver.
3
3
4
S2MPG10 has three clock outputs @ 32kHz: AP, peri1 and peri2.
4
S2MPG10 has three clock outputs @ 32kHz: AP, peri1 and peri2.
5
5
6
Acked-by: Stephen Boyd <sboyd@kernel.org>
7
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
6
Signed-off-by: André Draszik <andre.draszik@linaro.org>
8
Signed-off-by: André Draszik <andre.draszik@linaro.org>
7
---
9
---
8
drivers/clk/clk-s2mps11.c | 8 ++++++++
10
drivers/clk/clk-s2mps11.c | 8 ++++++++
9
1 file changed, 8 insertions(+)
11
1 file changed, 8 insertions(+)
10
12
...
...
19
+#include <linux/mfd/samsung/s2mpg10.h>
21
+#include <linux/mfd/samsung/s2mpg10.h>
20
#include <linux/mfd/samsung/s2mps11.h>
22
#include <linux/mfd/samsung/s2mps11.h>
21
#include <linux/mfd/samsung/s2mps13.h>
23
#include <linux/mfd/samsung/s2mps13.h>
22
#include <linux/mfd/samsung/s2mps14.h>
24
#include <linux/mfd/samsung/s2mps14.h>
23
@@ -XXX,XX +XXX,XX @@ static int s2mps11_clk_probe(struct platform_device *pdev)
25
@@ -XXX,XX +XXX,XX @@ static int s2mps11_clk_probe(struct platform_device *pdev)
24
        return -ENOMEM;
26
    clk_data->num = S2MPS11_CLKS_NUM;
25
27
26
    switch (hwid) {
28
    switch (hwid) {
27
+    case S2MPG10:
29
+    case S2MPG10:
28
+        s2mps11_reg = S2MPG10_PMIC_RTCBUF;
30
+        s2mps11_reg = S2MPG10_PMIC_RTCBUF;
29
+        break;
31
+        break;
...
...
48
        .compatible = "samsung,s2mps11-clk",
50
        .compatible = "samsung,s2mps11-clk",
49
        .data = (void *)S2MPS11X,
51
        .data = (void *)S2MPS11X,
50
    }, {
52
    }, {
51
53
52
--
54
--
53
2.49.0.395.g12beb8f557-goog
55
2.49.0.604.gff1f9ca942-goog
54
56
diff view generated by jsdifflib
1
platform_get_device_id() is called mulitple times during probe. This
1
platform_get_device_id() is called mulitple times during probe to
2
makes the code harder to read than necessary.
2
retrieve the device type. This makes the code harder to read than
3
necessary.
3
4
4
Just get the ID once, which also trims the lengths of the lines
5
Just get the type once, which also trims the lengths of the lines
5
involved.
6
involved.
6
7
7
Signed-off-by: André Draszik <andre.draszik@linaro.org>
8
Signed-off-by: André Draszik <andre.draszik@linaro.org>
9
8
---
10
---
9
drivers/rtc/rtc-s5m.c | 8 +++++---
11
v4:
10
1 file changed, 5 insertions(+), 3 deletions(-)
12
- cache the driver data, i.e. the enum type (Krzysztof)
13
---
14
drivers/rtc/rtc-s5m.c | 10 ++++++----
15
1 file changed, 6 insertions(+), 4 deletions(-)
11
16
12
diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c
17
diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c
13
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
14
--- a/drivers/rtc/rtc-s5m.c
19
--- a/drivers/rtc/rtc-s5m.c
15
+++ b/drivers/rtc/rtc-s5m.c
20
+++ b/drivers/rtc/rtc-s5m.c
16
@@ -XXX,XX +XXX,XX @@ static int s5m8767_rtc_init_reg(struct s5m_rtc_info *info)
21
@@ -XXX,XX +XXX,XX @@ static int s5m8767_rtc_init_reg(struct s5m_rtc_info *info)
17
static int s5m_rtc_probe(struct platform_device *pdev)
22
static int s5m_rtc_probe(struct platform_device *pdev)
18
{
23
{
19
    struct sec_pmic_dev *s5m87xx = dev_get_drvdata(pdev->dev.parent);
24
    struct sec_pmic_dev *s5m87xx = dev_get_drvdata(pdev->dev.parent);
20
+    const struct platform_device_id    * const id =
25
+    enum sec_device_type device_type =
21
+        platform_get_device_id(pdev);
26
+        platform_get_device_id(pdev)->driver_data;
22
    struct s5m_rtc_info *info;
27
    struct s5m_rtc_info *info;
23
    struct i2c_client *i2c;
28
    struct i2c_client *i2c;
24
    const struct regmap_config *regmap_cfg;
29
    const struct regmap_config *regmap_cfg;
25
@@ -XXX,XX +XXX,XX @@ static int s5m_rtc_probe(struct platform_device *pdev)
30
@@ -XXX,XX +XXX,XX @@ static int s5m_rtc_probe(struct platform_device *pdev)
26
    if (!info)
31
    if (!info)
27
        return -ENOMEM;
32
        return -ENOMEM;
28
33
29
-    switch (platform_get_device_id(pdev)->driver_data) {
34
-    switch (platform_get_device_id(pdev)->driver_data) {
30
+    switch (id->driver_data) {
35
+    switch (device_type) {
31
    case S2MPS15X:
36
    case S2MPS15X:
32
        regmap_cfg = &s2mps14_rtc_regmap_config;
37
        regmap_cfg = &s2mps14_rtc_regmap_config;
33
        info->regs = &s2mps15_rtc_regs;
38
        info->regs = &s2mps15_rtc_regs;
34
@@ -XXX,XX +XXX,XX @@ static int s5m_rtc_probe(struct platform_device *pdev)
39
@@ -XXX,XX +XXX,XX @@ static int s5m_rtc_probe(struct platform_device *pdev)
40
        break;
35
    default:
41
    default:
36
        return dev_err_probe(&pdev->dev, -ENODEV,
42
        return dev_err_probe(&pdev->dev, -ENODEV,
37
                 "Device type %lu is not supported by RTC driver\n",
43
-                 "Device type %lu is not supported by RTC driver\n",
38
-                 platform_get_device_id(pdev)->driver_data);
44
-                 platform_get_device_id(pdev)->driver_data);
39
+                 id_entry->driver_data);
45
+                 "Device type %d is not supported by RTC driver\n",
46
+                 device_type);
40
    }
47
    }
41
48
42
    i2c = devm_i2c_new_dummy_device(&pdev->dev, s5m87xx->i2c->adapter,
49
    i2c = devm_i2c_new_dummy_device(&pdev->dev, s5m87xx->i2c->adapter,
43
@@ -XXX,XX +XXX,XX @@ static int s5m_rtc_probe(struct platform_device *pdev)
50
@@ -XXX,XX +XXX,XX @@ static int s5m_rtc_probe(struct platform_device *pdev)
44
51
45
    info->dev = &pdev->dev;
52
    info->dev = &pdev->dev;
46
    info->s5m87xx = s5m87xx;
53
    info->s5m87xx = s5m87xx;
47
-    info->device_type = platform_get_device_id(pdev)->driver_data;
54
-    info->device_type = platform_get_device_id(pdev)->driver_data;
48
+    info->device_type = id->driver_data;
55
+    info->device_type = device_type;
49
56
50
    if (s5m87xx->irq_data) {
57
    if (s5m87xx->irq_data) {
51
        info->irq = regmap_irq_get_virq(s5m87xx->irq_data, alarm_irq);
58
        info->irq = regmap_irq_get_virq(s5m87xx->irq_data, alarm_irq);
52
59
53
--
60
--
54
2.49.0.395.g12beb8f557-goog
61
2.49.0.604.gff1f9ca942-goog
55
62
diff view generated by jsdifflib
...
...
9
No functional changes, since the parent doesn't provide a regmap for
9
No functional changes, since the parent doesn't provide a regmap for
10
any of the PMICs currently supported by this driver. Having this change
10
any of the PMICs currently supported by this driver. Having this change
11
separate will simply make the addition of S2MPG10 support more
11
separate will simply make the addition of S2MPG10 support more
12
self-contained, without additional restructuring.
12
self-contained, without additional restructuring.
13
13
14
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
14
Signed-off-by: André Draszik <andre.draszik@linaro.org>
15
Signed-off-by: André Draszik <andre.draszik@linaro.org>
15
---
16
---
16
drivers/rtc/rtc-s5m.c | 83 ++++++++++++++++++++++++++++-----------------------
17
drivers/rtc/rtc-s5m.c | 81 ++++++++++++++++++++++++++++-----------------------
17
1 file changed, 46 insertions(+), 37 deletions(-)
18
1 file changed, 45 insertions(+), 36 deletions(-)
18
19
19
diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c
20
diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c
20
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
21
--- a/drivers/rtc/rtc-s5m.c
22
--- a/drivers/rtc/rtc-s5m.c
22
+++ b/drivers/rtc/rtc-s5m.c
23
+++ b/drivers/rtc/rtc-s5m.c
23
@@ -XXX,XX +XXX,XX @@ static int s5m_rtc_probe(struct platform_device *pdev)
24
@@ -XXX,XX +XXX,XX @@ static int s5m_rtc_probe(struct platform_device *pdev)
24
    const struct platform_device_id    * const id =
25
    enum sec_device_type device_type =
25
        platform_get_device_id(pdev);
26
        platform_get_device_id(pdev)->driver_data;
26
    struct s5m_rtc_info *info;
27
    struct s5m_rtc_info *info;
27
-    struct i2c_client *i2c;
28
-    struct i2c_client *i2c;
28
-    const struct regmap_config *regmap_cfg;
29
-    const struct regmap_config *regmap_cfg;
29
    int ret, alarm_irq;
30
    int ret, alarm_irq;
30
31
31
    info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
32
    info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
32
    if (!info)
33
    if (!info)
33
        return -ENOMEM;
34
        return -ENOMEM;
34
35
35
-    switch (id->driver_data) {
36
-    switch (device_type) {
36
-    case S2MPS15X:
37
-    case S2MPS15X:
37
-        regmap_cfg = &s2mps14_rtc_regmap_config;
38
-        regmap_cfg = &s2mps14_rtc_regmap_config;
38
-        info->regs = &s2mps15_rtc_regs;
39
-        info->regs = &s2mps15_rtc_regs;
39
-        alarm_irq = S2MPS14_IRQ_RTCA0;
40
-        alarm_irq = S2MPS14_IRQ_RTCA0;
40
-        break;
41
-        break;
...
...
52
-        regmap_cfg = &s5m_rtc_regmap_config;
53
-        regmap_cfg = &s5m_rtc_regmap_config;
53
-        info->regs = &s5m_rtc_regs;
54
-        info->regs = &s5m_rtc_regs;
54
-        alarm_irq = S5M8767_IRQ_RTCA1;
55
-        alarm_irq = S5M8767_IRQ_RTCA1;
55
-        break;
56
-        break;
56
-    default:
57
-    default:
57
-        return dev_err_probe(&pdev->dev, -ENODEV,
58
-                 "Device type %lu is not supported by RTC driver\n",
59
-                 id_entry->driver_data);
60
-    }
61
+    info->regmap = dev_get_regmap(pdev->dev.parent, "rtc");
58
+    info->regmap = dev_get_regmap(pdev->dev.parent, "rtc");
62
+    if (!info->regmap) {
59
+    if (!info->regmap) {
63
+        const struct regmap_config *regmap_cfg;
60
+        const struct regmap_config *regmap_cfg;
64
+        struct i2c_client *i2c;
61
+        struct i2c_client *i2c;
65
62
+
66
-    i2c = devm_i2c_new_dummy_device(&pdev->dev, s5m87xx->i2c->adapter,
63
+        switch (device_type) {
67
-                    RTC_I2C_ADDR);
68
-    if (IS_ERR(i2c))
69
-        return dev_err_probe(&pdev->dev, PTR_ERR(i2c),
70
-                 "Failed to allocate I2C for RTC\n");
71
+        switch (id->driver_data) {
72
+        case S2MPS15X:
64
+        case S2MPS15X:
73
+            regmap_cfg = &s2mps14_rtc_regmap_config;
65
+            regmap_cfg = &s2mps14_rtc_regmap_config;
74
+            info->regs = &s2mps15_rtc_regs;
66
+            info->regs = &s2mps15_rtc_regs;
75
+            alarm_irq = S2MPS14_IRQ_RTCA0;
67
+            alarm_irq = S2MPS14_IRQ_RTCA0;
76
+            break;
68
+            break;
...
...
89
+            info->regs = &s5m_rtc_regs;
81
+            info->regs = &s5m_rtc_regs;
90
+            alarm_irq = S5M8767_IRQ_RTCA1;
82
+            alarm_irq = S5M8767_IRQ_RTCA1;
91
+            break;
83
+            break;
92
+        default:
84
+        default:
93
+            return dev_err_probe(&pdev->dev, -ENODEV,
85
+            return dev_err_probe(&pdev->dev, -ENODEV,
94
+                     "Unsupported device type %lu\n",
86
+                     "Unsupported device type %d\n",
95
+                     id->driver_data);
87
+                     device_type);
96
+        }
88
+        }
97
89
+
98
-    info->regmap = devm_regmap_init_i2c(i2c, regmap_cfg);
99
-    if (IS_ERR(info->regmap))
100
-        return dev_err_probe(&pdev->dev, PTR_ERR(info->regmap),
101
-                 "Failed to allocate RTC register map\n");
102
+        i2c = devm_i2c_new_dummy_device(&pdev->dev,
90
+        i2c = devm_i2c_new_dummy_device(&pdev->dev,
103
+                        s5m87xx->i2c->adapter,
91
+                        s5m87xx->i2c->adapter,
104
+                        RTC_I2C_ADDR);
92
+                        RTC_I2C_ADDR);
105
+        if (IS_ERR(i2c))
93
+        if (IS_ERR(i2c))
106
+            return dev_err_probe(&pdev->dev, PTR_ERR(i2c),
94
+            return dev_err_probe(&pdev->dev, PTR_ERR(i2c),
...
...
109
+        info->regmap = devm_regmap_init_i2c(i2c, regmap_cfg);
97
+        info->regmap = devm_regmap_init_i2c(i2c, regmap_cfg);
110
+        if (IS_ERR(info->regmap))
98
+        if (IS_ERR(info->regmap))
111
+            return dev_err_probe(&pdev->dev, PTR_ERR(info->regmap),
99
+            return dev_err_probe(&pdev->dev, PTR_ERR(info->regmap),
112
+                     "Failed to allocate regmap\n");
100
+                     "Failed to allocate regmap\n");
113
+    } else {
101
+    } else {
114
+        return dev_err_probe(&pdev->dev, -ENODEV,
102
        return dev_err_probe(&pdev->dev, -ENODEV,
115
+                 "Unsupported device type %lu\n",
103
-                 "Device type %d is not supported by RTC driver\n",
116
+                 id->driver_data);
104
+                 "Unsupported device type %d\n",
117
+    }
105
                 device_type);
118
106
    }
107
108
-    i2c = devm_i2c_new_dummy_device(&pdev->dev, s5m87xx->i2c->adapter,
109
-                    RTC_I2C_ADDR);
110
-    if (IS_ERR(i2c))
111
-        return dev_err_probe(&pdev->dev, PTR_ERR(i2c),
112
-                 "Failed to allocate I2C for RTC\n");
113
-
114
-    info->regmap = devm_regmap_init_i2c(i2c, regmap_cfg);
115
-    if (IS_ERR(info->regmap))
116
-        return dev_err_probe(&pdev->dev, PTR_ERR(info->regmap),
117
-                 "Failed to allocate RTC register map\n");
118
-
119
    info->dev = &pdev->dev;
119
    info->dev = &pdev->dev;
120
    info->s5m87xx = s5m87xx;
120
    info->s5m87xx = s5m87xx;
121
    info->device_type = device_type;
121
122
122
--
123
--
123
2.49.0.395.g12beb8f557-goog
124
2.49.0.604.gff1f9ca942-goog
124
125
diff view generated by jsdifflib
...
...
6
6
7
Additionally, it can be used for doing a cold-reset. If requested to do
7
Additionally, it can be used for doing a cold-reset. If requested to do
8
so (via DT), S2MPG10 is programmed with a watchdog configuration that
8
so (via DT), S2MPG10 is programmed with a watchdog configuration that
9
will perform a full power cycle upon watchdog expiry.
9
will perform a full power cycle upon watchdog expiry.
10
10
11
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
11
Signed-off-by: André Draszik <andre.draszik@linaro.org>
12
Signed-off-by: André Draszik <andre.draszik@linaro.org>
13
12
---
14
---
13
drivers/rtc/rtc-s5m.c | 60 +++++++++++++++++++++++++++++++++++++++++
15
v4:
14
include/linux/mfd/samsung/rtc.h | 37 +++++++++++++++++++++++++
16
- keep headers as alphabetical as possible (Krzysztof)
15
2 files changed, 97 insertions(+)
17
---
18
drivers/rtc/rtc-s5m.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++
19
1 file changed, 60 insertions(+)
16
20
17
diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c
21
diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c
18
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
19
--- a/drivers/rtc/rtc-s5m.c
23
--- a/drivers/rtc/rtc-s5m.c
20
+++ b/drivers/rtc/rtc-s5m.c
24
+++ b/drivers/rtc/rtc-s5m.c
21
@@ -XXX,XX +XXX,XX @@
25
@@ -XXX,XX +XXX,XX @@
26
#include <linux/module.h>
22
#include <linux/i2c.h>
27
#include <linux/i2c.h>
23
#include <linux/bcd.h>
28
#include <linux/bcd.h>
29
+#include <linux/reboot.h>
24
#include <linux/regmap.h>
30
#include <linux/regmap.h>
25
+#include <linux/reboot.h>
26
#include <linux/rtc.h>
31
#include <linux/rtc.h>
27
#include <linux/platform_device.h>
32
#include <linux/platform_device.h>
28
#include <linux/mfd/samsung/core.h>
29
@@ -XXX,XX +XXX,XX @@ enum {
33
@@ -XXX,XX +XXX,XX @@ enum {
30
* Device | Write time | Read time | Write alarm
34
* Device | Write time | Read time | Write alarm
31
* =================================================
35
* =================================================
32
* S5M8767 | UDR + TIME | | UDR
36
* S5M8767 | UDR + TIME | | UDR
33
+ * S2MPG10 | WUDR | RUDR | AUDR
37
+ * S2MPG10 | WUDR | RUDR | AUDR
...
...
155
    struct sec_pmic_dev *s5m87xx = dev_get_drvdata(pdev->dev.parent);
159
    struct sec_pmic_dev *s5m87xx = dev_get_drvdata(pdev->dev.parent);
156
@@ -XXX,XX +XXX,XX @@ static int s5m_rtc_probe(struct platform_device *pdev)
160
@@ -XXX,XX +XXX,XX @@ static int s5m_rtc_probe(struct platform_device *pdev)
157
        if (IS_ERR(info->regmap))
161
        if (IS_ERR(info->regmap))
158
            return dev_err_probe(&pdev->dev, PTR_ERR(info->regmap),
162
            return dev_err_probe(&pdev->dev, PTR_ERR(info->regmap),
159
                     "Failed to allocate regmap\n");
163
                     "Failed to allocate regmap\n");
160
+    } else if (id->driver_data == S2MPG10) {
164
+    } else if (device_type == S2MPG10) {
161
+        info->regs = &s2mpg10_rtc_regs;
165
+        info->regs = &s2mpg10_rtc_regs;
162
+        alarm_irq = S2MPG10_IRQ_RTCA0;
166
+        alarm_irq = S2MPG10_IRQ_RTCA0;
163
    } else {
167
    } else {
164
        return dev_err_probe(&pdev->dev, -ENODEV,
168
        return dev_err_probe(&pdev->dev, -ENODEV,
165
                 "Unsupported device type %lu\n",
169
                 "Unsupported device type %d\n",
166
@@ -XXX,XX +XXX,XX @@ static int s5m_rtc_probe(struct platform_device *pdev)
170
@@ -XXX,XX +XXX,XX @@ static int s5m_rtc_probe(struct platform_device *pdev)
167
        device_init_wakeup(&pdev->dev, true);
171
        device_init_wakeup(&pdev->dev, true);
168
    }
172
    }
169
173
170
+    if (of_device_is_system_power_controller(pdev->dev.parent->of_node) &&
174
+    if (of_device_is_system_power_controller(pdev->dev.parent->of_node) &&
...
...
188
    { "s5m-rtc",        S5M8767X },
192
    { "s5m-rtc",        S5M8767X },
189
+    { "s2mpg10-rtc",    S2MPG10 },
193
+    { "s2mpg10-rtc",    S2MPG10 },
190
    { "s2mps13-rtc",    S2MPS13X },
194
    { "s2mps13-rtc",    S2MPS13X },
191
    { "s2mps14-rtc",    S2MPS14X },
195
    { "s2mps14-rtc",    S2MPS14X },
192
    { "s2mps15-rtc",    S2MPS15X },
196
    { "s2mps15-rtc",    S2MPS15X },
193
diff --git a/include/linux/mfd/samsung/rtc.h b/include/linux/mfd/samsung/rtc.h
194
index XXXXXXX..XXXXXXX 100644
195
--- a/include/linux/mfd/samsung/rtc.h
196
+++ b/include/linux/mfd/samsung/rtc.h
197
@@ -XXX,XX +XXX,XX @@ enum s2mps_rtc_reg {
198
    S2MPS_RTC_REG_MAX,
199
};
200
201
+enum s2mpg10_rtc_reg {
202
+    S2MPG10_RTC_CTRL,
203
+    S2MPG10_RTC_UPDATE,
204
+    S2MPG10_RTC_SMPL,
205
+    S2MPG10_RTC_WTSR,
206
+    S2MPG10_RTC_CAP_SEL,
207
+    S2MPG10_RTC_MSEC,
208
+    S2MPG10_RTC_SEC,
209
+    S2MPG10_RTC_MIN,
210
+    S2MPG10_RTC_HOUR,
211
+    S2MPG10_RTC_WEEK,
212
+    S2MPG10_RTC_DAY,
213
+    S2MPG10_RTC_MON,
214
+    S2MPG10_RTC_YEAR,
215
+    S2MPG10_RTC_A0SEC,
216
+    S2MPG10_RTC_A0MIN,
217
+    S2MPG10_RTC_A0HOUR,
218
+    S2MPG10_RTC_A0WEEK,
219
+    S2MPG10_RTC_A0DAY,
220
+    S2MPG10_RTC_A0MON,
221
+    S2MPG10_RTC_A0YEAR,
222
+    S2MPG10_RTC_A1SEC,
223
+    S2MPG10_RTC_A1MIN,
224
+    S2MPG10_RTC_A1HOUR,
225
+    S2MPG10_RTC_A1WEEK,
226
+    S2MPG10_RTC_A1DAY,
227
+    S2MPG10_RTC_A1MON,
228
+    S2MPG10_RTC_A1YEAR,
229
+    S2MPG10_RTC_OSC_CTRL,
230
+};
231
+
232
#define RTC_I2C_ADDR        (0x0C >> 1)
233
234
#define HOUR_12            (1 << 7)
235
@@ -XXX,XX +XXX,XX @@ enum s2mps_rtc_reg {
236
#define ALARM_ENABLE_SHIFT    7
237
#define ALARM_ENABLE_MASK    (1 << ALARM_ENABLE_SHIFT)
238
239
+/* WTSR & SMPL registers */
240
#define SMPL_ENABLE_SHIFT    7
241
#define SMPL_ENABLE_MASK    (1 << SMPL_ENABLE_SHIFT)
242
243
#define WTSR_ENABLE_SHIFT    6
244
#define WTSR_ENABLE_MASK    (1 << WTSR_ENABLE_SHIFT)
245
246
+#define S2MPG10_WTSR_COLDTIMER    GENMASK(6, 5)
247
+#define S2MPG10_WTSR_COLDRST    BIT(4)
248
+#define S2MPG10_WTSR_WTSRT    GENMASK(3, 1)
249
+#define S2MPG10_WTSR_WTSR_EN    BIT(0)
250
+
251
#endif /* __LINUX_MFD_SEC_RTC_H */
252
197
253
--
198
--
254
2.49.0.395.g12beb8f557-goog
199
2.49.0.604.gff1f9ca942-goog
255
200
diff view generated by jsdifflib
1
Fix this minor typo, and adjust the a related incorrect alignment to
1
Fix this minor typo, and adjust the a related incorrect alignment to
2
avoid a checkpatch error.
2
avoid a checkpatch error.
3
3
4
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
4
Signed-off-by: André Draszik <andre.draszik@linaro.org>
5
Signed-off-by: André Draszik <andre.draszik@linaro.org>
5
---
6
---
6
drivers/rtc/rtc-s5m.c | 6 +++---
7
drivers/rtc/rtc-s5m.c | 6 +++---
7
1 file changed, 3 insertions(+), 3 deletions(-)
8
1 file changed, 3 insertions(+), 3 deletions(-)
8
9
...
...
30
}
31
}
31
32
32
static int s5m_rtc_stop_alarm(struct s5m_rtc_info *info)
33
static int s5m_rtc_stop_alarm(struct s5m_rtc_info *info)
33
34
34
--
35
--
35
2.49.0.395.g12beb8f557-goog
36
2.49.0.604.gff1f9ca942-goog
36
37
diff view generated by jsdifflib
1
To release memory allocated by device_init_wakeup(true), drivers have
1
To release memory allocated by device_init_wakeup(true), drivers have
2
to call device_init_wakeup(false) in error paths and unbind.
2
to call device_init_wakeup(false) in error paths and unbind.
3
3
4
Switch to the new devres managed version devm_device_init_wakeup() to
4
Switch to the new devres managed version devm_device_init_wakeup() to
5
plug this memleak.
5
plug this memleak.
6
6
7
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
7
Signed-off-by: André Draszik <andre.draszik@linaro.org>
8
Signed-off-by: André Draszik <andre.draszik@linaro.org>
8
---
9
---
9
drivers/rtc/rtc-s5m.c | 6 +++++-
10
drivers/rtc/rtc-s5m.c | 6 +++++-
10
1 file changed, 5 insertions(+), 1 deletion(-)
11
1 file changed, 5 insertions(+), 1 deletion(-)
11
12
...
...
26
    }
27
    }
27
28
28
    if (of_device_is_system_power_controller(pdev->dev.parent->of_node) &&
29
    if (of_device_is_system_power_controller(pdev->dev.parent->of_node) &&
29
30
30
--
31
--
31
2.49.0.395.g12beb8f557-goog
32
2.49.0.604.gff1f9ca942-goog
32
33
diff view generated by jsdifflib
1
The regmap_clear_bits() and regmap_set_bits() helper macros state the
1
The regmap_clear_bits() and regmap_set_bits() helper macros state the
2
intention a bit more obviously.
2
intention a bit more obviously.
3
3
4
Use those.
4
Use those.
5
5
6
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
6
Signed-off-by: André Draszik <andre.draszik@linaro.org>
7
Signed-off-by: André Draszik <andre.draszik@linaro.org>
7
---
8
---
8
drivers/rtc/rtc-s5m.c | 10 ++++------
9
drivers/rtc/rtc-s5m.c | 10 ++++------
9
1 file changed, 4 insertions(+), 6 deletions(-)
10
1 file changed, 4 insertions(+), 6 deletions(-)
10
11
...
...
36
        if (ret) {
37
        if (ret) {
37
            dev_err(dev,
38
            dev_err(dev,
38
                "Failed to prepare registers for time reading: %d\n",
39
                "Failed to prepare registers for time reading: %d\n",
39
40
40
--
41
--
41
2.49.0.395.g12beb8f557-goog
42
2.49.0.604.gff1f9ca942-goog
42
43
diff view generated by jsdifflib
1
Instead of the open-coded read/modify/write sequence, we can simply use
1
Instead of the open-coded read/modify/write sequence, we can simply use
2
the regmap helpers regmap_set_bits() and regmap_update_bits()
2
the regmap helpers regmap_set_bits() and regmap_update_bits()
3
respectively.
3
respectively.
4
4
5
This makes the code easier to read, and avoids extra works in case the
5
This makes the code easier to read, and avoids extra work in case the
6
underlying bus supports updating bits via
6
underlying bus supports updating bits via
7
struct regmap_bus::reg_update_bits() directly (which is the case for
7
struct regmap_bus::reg_update_bits() directly (which is the case for
8
S2MPG10 on gs101 where this driver communicates via ACPM).
8
S2MPG10 on gs101 where this driver communicates via ACPM).
9
9
10
Signed-off-by: André Draszik <andre.draszik@linaro.org>
10
Signed-off-by: André Draszik <andre.draszik@linaro.org>
...
...
69
    if (ret < 0) {
69
    if (ret < 0) {
70
        dev_err(info->dev, "%s: fail to write update reg(%d)\n",
70
        dev_err(info->dev, "%s: fail to write update reg(%d)\n",
71
            __func__, ret);
71
            __func__, ret);
72
72
73
--
73
--
74
2.49.0.395.g12beb8f557-goog
74
2.49.0.604.gff1f9ca942-goog
75
75
diff view generated by jsdifflib
...
...
19
L:    linux-kernel@vger.kernel.org
19
L:    linux-kernel@vger.kernel.org
20
L:    linux-samsung-soc@vger.kernel.org
20
L:    linux-samsung-soc@vger.kernel.org
21
S:    Maintained
21
S:    Maintained
22
22
23
--
23
--
24
2.49.0.395.g12beb8f557-goog
24
2.49.0.604.gff1f9ca942-goog
25
25
diff view generated by jsdifflib