Lines Matching full:data
53 static struct pmi_data *data; variable
60 spin_lock(&data->pmi_spinlock); in pmi_irq_handler()
62 type = ioread8(data->pmi_reg + PMI_READ_TYPE); in pmi_irq_handler()
65 if (type & PMI_ACK && !data->completion) { in pmi_irq_handler()
71 if (data->completion && !(type & PMI_ACK)) { in pmi_irq_handler()
77 data->msg.type = type; in pmi_irq_handler()
78 data->msg.data0 = ioread8(data->pmi_reg + PMI_READ_DATA0); in pmi_irq_handler()
79 data->msg.data1 = ioread8(data->pmi_reg + PMI_READ_DATA1); in pmi_irq_handler()
80 data->msg.data2 = ioread8(data->pmi_reg + PMI_READ_DATA2); in pmi_irq_handler()
83 spin_unlock(&data->pmi_spinlock); in pmi_irq_handler()
90 if (data->msg.type & PMI_ACK) { in pmi_irq_handler()
91 complete(data->completion); in pmi_irq_handler()
96 schedule_work(&data->work); in pmi_irq_handler()
116 spin_lock(&data->handler_spinlock); in pmi_notify_handlers()
117 list_for_each_entry(handler, &data->handler, node) { in pmi_notify_handlers()
119 if (handler->type == data->msg.type) in pmi_notify_handlers()
120 handler->handle_pmi_message(data->msg); in pmi_notify_handlers()
122 spin_unlock(&data->handler_spinlock); in pmi_notify_handlers()
130 if (data) { in pmi_of_probe()
136 data = kzalloc(sizeof(struct pmi_data), GFP_KERNEL); in pmi_of_probe()
137 if (!data) { in pmi_of_probe()
143 data->pmi_reg = of_iomap(np, 0); in pmi_of_probe()
144 if (!data->pmi_reg) { in pmi_of_probe()
150 INIT_LIST_HEAD(&data->handler); in pmi_of_probe()
152 mutex_init(&data->msg_mutex); in pmi_of_probe()
153 spin_lock_init(&data->pmi_spinlock); in pmi_of_probe()
154 spin_lock_init(&data->handler_spinlock); in pmi_of_probe()
156 INIT_WORK(&data->work, pmi_notify_handlers); in pmi_of_probe()
158 data->dev = dev; in pmi_of_probe()
160 data->irq = irq_of_parse_and_map(np, 0); in pmi_of_probe()
161 if (data->irq == NO_IRQ) { in pmi_of_probe()
167 rc = request_irq(data->irq, pmi_irq_handler, 0, "pmi", NULL); in pmi_of_probe()
170 data->irq, rc); in pmi_of_probe()
174 printk(KERN_INFO "pmi: found pmi device at addr %p.\n", data->pmi_reg); in pmi_of_probe()
179 iounmap(data->pmi_reg); in pmi_of_probe()
182 kfree(data); in pmi_of_probe()
192 free_irq(data->irq, NULL); in pmi_of_remove()
193 iounmap(data->pmi_reg); in pmi_of_remove()
195 spin_lock(&data->handler_spinlock); in pmi_of_remove()
197 list_for_each_entry_safe(handler, tmp, &data->handler, node) in pmi_of_remove()
200 spin_unlock(&data->handler_spinlock); in pmi_of_remove()
202 kfree(data); in pmi_of_remove()
203 data = NULL; in pmi_of_remove()
235 if (!data) in pmi_send_message()
238 mutex_lock(&data->msg_mutex); in pmi_send_message()
240 data->msg = msg; in pmi_send_message()
243 data->completion = &completion; in pmi_send_message()
245 spin_lock_irqsave(&data->pmi_spinlock, flags); in pmi_send_message()
246 iowrite8(msg.data0, data->pmi_reg + PMI_WRITE_DATA0); in pmi_send_message()
247 iowrite8(msg.data1, data->pmi_reg + PMI_WRITE_DATA1); in pmi_send_message()
248 iowrite8(msg.data2, data->pmi_reg + PMI_WRITE_DATA2); in pmi_send_message()
249 iowrite8(msg.type, data->pmi_reg + PMI_WRITE_TYPE); in pmi_send_message()
250 spin_unlock_irqrestore(&data->pmi_spinlock, flags); in pmi_send_message()
254 wait_for_completion_interruptible_timeout(data->completion, in pmi_send_message()
257 data->completion = NULL; in pmi_send_message()
259 mutex_unlock(&data->msg_mutex); in pmi_send_message()
267 if (!data) in pmi_register_handler()
270 spin_lock(&data->handler_spinlock); in pmi_register_handler()
271 list_add_tail(&handler->node, &data->handler); in pmi_register_handler()
272 spin_unlock(&data->handler_spinlock); in pmi_register_handler()
280 if (!data) in pmi_unregister_handler()
285 spin_lock(&data->handler_spinlock); in pmi_unregister_handler()
287 spin_unlock(&data->handler_spinlock); in pmi_unregister_handler()