Lines Matching +full:0 +full:- +full:pwrkey
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
20 #define PON_REV2 0x01
22 #define PON_RT_STS 0x10
23 #define PON_KPDPWR_N_SET BIT(0)
26 #define PON_PS_HOLD_RST_CTL 0x5a
27 #define PON_PS_HOLD_RST_CTL2 0x5b
29 #define PON_PS_HOLD_TYPE_MASK 0x0f
33 #define PON_PULL_CTL 0x70
35 #define PON_RESIN_PULL_UP BIT(0)
37 #define PON_DBC_CTL 0x71
38 #define PON_DBC_DELAY_MASK 0x7
62 struct pm8941_pwrkey *pwrkey = container_of(nb, struct pm8941_pwrkey, in pm8941_reboot_notify() local
68 /* PMICs with revision 0 have the enable bit in same register as ctrl */ in pm8941_reboot_notify()
69 if (pwrkey->revision == 0) in pm8941_reboot_notify()
74 error = regmap_update_bits(pwrkey->regmap, in pm8941_reboot_notify()
75 pwrkey->baseaddr + enable_reg, in pm8941_reboot_notify()
77 0); in pm8941_reboot_notify()
79 dev_err(pwrkey->dev, in pm8941_reboot_notify()
100 error = regmap_update_bits(pwrkey->regmap, in pm8941_reboot_notify()
101 pwrkey->baseaddr + PON_PS_HOLD_RST_CTL, in pm8941_reboot_notify()
105 dev_err(pwrkey->dev, "unable to set ps hold reset type: %d\n", in pm8941_reboot_notify()
108 error = regmap_update_bits(pwrkey->regmap, in pm8941_reboot_notify()
109 pwrkey->baseaddr + enable_reg, in pm8941_reboot_notify()
113 dev_err(pwrkey->dev, "unable to re-set enable: %d\n", error); in pm8941_reboot_notify()
120 struct pm8941_pwrkey *pwrkey = _data; in pm8941_pwrkey_irq() local
124 error = regmap_read(pwrkey->regmap, in pm8941_pwrkey_irq()
125 pwrkey->baseaddr + PON_RT_STS, &sts); in pm8941_pwrkey_irq()
129 input_report_key(pwrkey->input, pwrkey->code, in pm8941_pwrkey_irq()
130 sts & pwrkey->data->status_bit); in pm8941_pwrkey_irq()
131 input_sync(pwrkey->input); in pm8941_pwrkey_irq()
138 struct pm8941_pwrkey *pwrkey = dev_get_drvdata(dev); in pm8941_pwrkey_suspend() local
141 enable_irq_wake(pwrkey->irq); in pm8941_pwrkey_suspend()
143 return 0; in pm8941_pwrkey_suspend()
148 struct pm8941_pwrkey *pwrkey = dev_get_drvdata(dev); in pm8941_pwrkey_resume() local
151 disable_irq_wake(pwrkey->irq); in pm8941_pwrkey_resume()
153 return 0; in pm8941_pwrkey_resume()
161 struct pm8941_pwrkey *pwrkey; in pm8941_pwrkey_probe() local
167 if (of_property_read_u32(pdev->dev.of_node, "debounce", &req_delay)) in pm8941_pwrkey_probe()
170 if (req_delay > 2000000 || req_delay == 0) { in pm8941_pwrkey_probe()
171 dev_err(&pdev->dev, "invalid debounce time: %u\n", req_delay); in pm8941_pwrkey_probe()
172 return -EINVAL; in pm8941_pwrkey_probe()
175 pull_up = of_property_read_bool(pdev->dev.of_node, "bias-pull-up"); in pm8941_pwrkey_probe()
177 pwrkey = devm_kzalloc(&pdev->dev, sizeof(*pwrkey), GFP_KERNEL); in pm8941_pwrkey_probe()
178 if (!pwrkey) in pm8941_pwrkey_probe()
179 return -ENOMEM; in pm8941_pwrkey_probe()
181 pwrkey->dev = &pdev->dev; in pm8941_pwrkey_probe()
182 pwrkey->data = of_device_get_match_data(&pdev->dev); in pm8941_pwrkey_probe()
184 parent = pdev->dev.parent; in pm8941_pwrkey_probe()
185 pwrkey->regmap = dev_get_regmap(parent, NULL); in pm8941_pwrkey_probe()
186 if (!pwrkey->regmap) { in pm8941_pwrkey_probe()
192 pwrkey->regmap = dev_get_regmap(parent->parent, NULL); in pm8941_pwrkey_probe()
193 if (!pwrkey->regmap) { in pm8941_pwrkey_probe()
194 dev_err(&pdev->dev, "failed to locate regmap\n"); in pm8941_pwrkey_probe()
195 return -ENODEV; in pm8941_pwrkey_probe()
198 error = of_property_read_u32(parent->of_node, in pm8941_pwrkey_probe()
199 "reg", &pwrkey->baseaddr); in pm8941_pwrkey_probe()
201 error = of_property_read_u32(pdev->dev.of_node, "reg", in pm8941_pwrkey_probe()
202 &pwrkey->baseaddr); in pm8941_pwrkey_probe()
207 pwrkey->irq = platform_get_irq(pdev, 0); in pm8941_pwrkey_probe()
208 if (pwrkey->irq < 0) in pm8941_pwrkey_probe()
209 return pwrkey->irq; in pm8941_pwrkey_probe()
211 error = regmap_read(pwrkey->regmap, pwrkey->baseaddr + PON_REV2, in pm8941_pwrkey_probe()
212 &pwrkey->revision); in pm8941_pwrkey_probe()
214 dev_err(&pdev->dev, "failed to set debounce: %d\n", error); in pm8941_pwrkey_probe()
218 error = of_property_read_u32(pdev->dev.of_node, "linux,code", in pm8941_pwrkey_probe()
219 &pwrkey->code); in pm8941_pwrkey_probe()
221 dev_dbg(&pdev->dev, in pm8941_pwrkey_probe()
223 pwrkey->code = KEY_POWER; in pm8941_pwrkey_probe()
226 pwrkey->input = devm_input_allocate_device(&pdev->dev); in pm8941_pwrkey_probe()
227 if (!pwrkey->input) { in pm8941_pwrkey_probe()
228 dev_dbg(&pdev->dev, "unable to allocate input device\n"); in pm8941_pwrkey_probe()
229 return -ENOMEM; in pm8941_pwrkey_probe()
232 input_set_capability(pwrkey->input, EV_KEY, pwrkey->code); in pm8941_pwrkey_probe()
234 pwrkey->input->name = "pm8941_pwrkey"; in pm8941_pwrkey_probe()
235 pwrkey->input->phys = "pm8941_pwrkey/input0"; in pm8941_pwrkey_probe()
240 error = regmap_update_bits(pwrkey->regmap, in pm8941_pwrkey_probe()
241 pwrkey->baseaddr + PON_DBC_CTL, in pm8941_pwrkey_probe()
245 dev_err(&pdev->dev, "failed to set debounce: %d\n", error); in pm8941_pwrkey_probe()
249 error = regmap_update_bits(pwrkey->regmap, in pm8941_pwrkey_probe()
250 pwrkey->baseaddr + PON_PULL_CTL, in pm8941_pwrkey_probe()
251 pwrkey->data->pull_up_bit, in pm8941_pwrkey_probe()
252 pull_up ? pwrkey->data->pull_up_bit : 0); in pm8941_pwrkey_probe()
254 dev_err(&pdev->dev, "failed to set pull: %d\n", error); in pm8941_pwrkey_probe()
258 error = devm_request_threaded_irq(&pdev->dev, pwrkey->irq, in pm8941_pwrkey_probe()
261 "pm8941_pwrkey", pwrkey); in pm8941_pwrkey_probe()
263 dev_err(&pdev->dev, "failed requesting IRQ: %d\n", error); in pm8941_pwrkey_probe()
267 error = input_register_device(pwrkey->input); in pm8941_pwrkey_probe()
269 dev_err(&pdev->dev, "failed to register input device: %d\n", in pm8941_pwrkey_probe()
274 pwrkey->reboot_notifier.notifier_call = pm8941_reboot_notify, in pm8941_pwrkey_probe()
275 error = register_reboot_notifier(&pwrkey->reboot_notifier); in pm8941_pwrkey_probe()
277 dev_err(&pdev->dev, "failed to register reboot notifier: %d\n", in pm8941_pwrkey_probe()
282 platform_set_drvdata(pdev, pwrkey); in pm8941_pwrkey_probe()
283 device_init_wakeup(&pdev->dev, 1); in pm8941_pwrkey_probe()
285 return 0; in pm8941_pwrkey_probe()
290 struct pm8941_pwrkey *pwrkey = platform_get_drvdata(pdev); in pm8941_pwrkey_remove() local
292 unregister_reboot_notifier(&pwrkey->reboot_notifier); in pm8941_pwrkey_remove()
294 return 0; in pm8941_pwrkey_remove()
308 { .compatible = "qcom,pm8941-pwrkey", .data = &pwrkey_data },
309 { .compatible = "qcom,pm8941-resin", .data = &resin_data },
318 .name = "pm8941-pwrkey",