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 |