Lines Matching +full:da9063 +full:- +full:onkey

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * OnKey device driver for DA9063, DA9062 and DA9061 PMICs
7 #include <linux/devm-helpers.h>
17 #include <linux/mfd/da9063/core.h>
18 #include <linux/mfd/da9063/registers.h>
74 .name = "da9062-onkey",
78 { .compatible = "dlg,da9063-onkey", .data = &da9063_regs },
79 { .compatible = "dlg,da9062-onkey", .data = &da9062_regs },
86 struct da9063_onkey *onkey = container_of(work, in da9063_poll_on() local
89 const struct da906x_chip_config *config = onkey->config; in da9063_poll_on()
96 error = regmap_read(onkey->regmap, in da9063_poll_on()
97 config->onkey_status, in da9063_poll_on()
100 dev_err(onkey->dev, in da9063_poll_on()
105 if (!(val & config->onkey_nonkey_mask)) { in da9063_poll_on()
106 error = regmap_update_bits(onkey->regmap, in da9063_poll_on()
107 config->onkey_pwr_signalling, in da9063_poll_on()
108 config->onkey_nonkey_lock_mask, in da9063_poll_on()
111 dev_err(onkey->dev, in da9063_poll_on()
116 input_report_key(onkey->input, KEY_POWER, 0); in da9063_poll_on()
117 input_sync(onkey->input); in da9063_poll_on()
126 error = regmap_read(onkey->regmap, in da9063_poll_on()
127 config->onkey_fault_log, in da9063_poll_on()
130 dev_warn(&onkey->input->dev, in da9063_poll_on()
132 } else if (fault_log & config->onkey_key_reset_mask) { in da9063_poll_on()
133 error = regmap_write(onkey->regmap, in da9063_poll_on()
134 config->onkey_fault_log, in da9063_poll_on()
135 config->onkey_key_reset_mask); in da9063_poll_on()
137 dev_warn(&onkey->input->dev, in da9063_poll_on()
144 dev_dbg(&onkey->input->dev, in da9063_poll_on()
146 error = regmap_write(onkey->regmap, in da9063_poll_on()
147 config->onkey_shutdown, in da9063_poll_on()
148 config->onkey_shutdown_mask); in da9063_poll_on()
150 dev_err(&onkey->input->dev, in da9063_poll_on()
158 schedule_delayed_work(&onkey->work, msecs_to_jiffies(50)); in da9063_poll_on()
163 struct da9063_onkey *onkey = data; in da9063_onkey_irq_handler() local
164 const struct da906x_chip_config *config = onkey->config; in da9063_onkey_irq_handler()
168 error = regmap_read(onkey->regmap, in da9063_onkey_irq_handler()
169 config->onkey_status, in da9063_onkey_irq_handler()
171 if (onkey->key_power && !error && (val & config->onkey_nonkey_mask)) { in da9063_onkey_irq_handler()
172 input_report_key(onkey->input, KEY_POWER, 1); in da9063_onkey_irq_handler()
173 input_sync(onkey->input); in da9063_onkey_irq_handler()
174 schedule_delayed_work(&onkey->work, 0); in da9063_onkey_irq_handler()
175 dev_dbg(onkey->dev, "KEY_POWER long press.\n"); in da9063_onkey_irq_handler()
177 input_report_key(onkey->input, KEY_POWER, 1); in da9063_onkey_irq_handler()
178 input_sync(onkey->input); in da9063_onkey_irq_handler()
179 input_report_key(onkey->input, KEY_POWER, 0); in da9063_onkey_irq_handler()
180 input_sync(onkey->input); in da9063_onkey_irq_handler()
181 dev_dbg(onkey->dev, "KEY_POWER short press.\n"); in da9063_onkey_irq_handler()
189 struct da9063_onkey *onkey; in da9063_onkey_probe() local
195 pdev->dev.of_node); in da9063_onkey_probe()
197 return -ENXIO; in da9063_onkey_probe()
199 onkey = devm_kzalloc(&pdev->dev, sizeof(struct da9063_onkey), in da9063_onkey_probe()
201 if (!onkey) { in da9063_onkey_probe()
202 dev_err(&pdev->dev, "Failed to allocate memory.\n"); in da9063_onkey_probe()
203 return -ENOMEM; in da9063_onkey_probe()
206 onkey->config = match->data; in da9063_onkey_probe()
207 onkey->dev = &pdev->dev; in da9063_onkey_probe()
209 onkey->regmap = dev_get_regmap(pdev->dev.parent, NULL); in da9063_onkey_probe()
210 if (!onkey->regmap) { in da9063_onkey_probe()
211 dev_err(&pdev->dev, "Parent regmap unavailable.\n"); in da9063_onkey_probe()
212 return -ENXIO; in da9063_onkey_probe()
215 onkey->key_power = !of_property_read_bool(pdev->dev.of_node, in da9063_onkey_probe()
216 "dlg,disable-key-power"); in da9063_onkey_probe()
218 onkey->input = devm_input_allocate_device(&pdev->dev); in da9063_onkey_probe()
219 if (!onkey->input) { in da9063_onkey_probe()
220 dev_err(&pdev->dev, "Failed to allocated input device.\n"); in da9063_onkey_probe()
221 return -ENOMEM; in da9063_onkey_probe()
224 onkey->input->name = onkey->config->name; in da9063_onkey_probe()
225 snprintf(onkey->phys, sizeof(onkey->phys), "%s/input0", in da9063_onkey_probe()
226 onkey->config->name); in da9063_onkey_probe()
227 onkey->input->phys = onkey->phys; in da9063_onkey_probe()
228 onkey->input->dev.parent = &pdev->dev; in da9063_onkey_probe()
230 input_set_capability(onkey->input, EV_KEY, KEY_POWER); in da9063_onkey_probe()
232 error = devm_delayed_work_autocancel(&pdev->dev, &onkey->work, in da9063_onkey_probe()
235 dev_err(&pdev->dev, in da9063_onkey_probe()
241 irq = platform_get_irq_byname(pdev, "ONKEY"); in da9063_onkey_probe()
245 error = devm_request_threaded_irq(&pdev->dev, irq, in da9063_onkey_probe()
248 "ONKEY", onkey); in da9063_onkey_probe()
250 dev_err(&pdev->dev, in da9063_onkey_probe()
255 error = dev_pm_set_wake_irq(&pdev->dev, irq); in da9063_onkey_probe()
257 dev_warn(&pdev->dev, in da9063_onkey_probe()
261 device_init_wakeup(&pdev->dev, true); in da9063_onkey_probe()
263 error = input_register_device(onkey->input); in da9063_onkey_probe()
265 dev_err(&pdev->dev, in da9063_onkey_probe()
283 MODULE_DESCRIPTION("Onkey device driver for Dialog DA9063, DA9062 and DA9061");