Lines Matching defs:scu

123  * @scu: SCU IPC instance
129 void intel_scu_ipc_dev_put(struct intel_scu_ipc_dev *scu)
131 if (scu) {
132 module_put(scu->owner);
133 put_device(&scu->dev);
139 struct intel_scu_ipc_dev *scu;
145 struct intel_scu_ipc_dev *scu = dr->scu;
147 intel_scu_ipc_dev_put(scu);
164 struct intel_scu_ipc_dev *scu;
170 scu = intel_scu_ipc_dev_get();
171 if (!scu) {
176 dr->scu = scu;
179 return scu;
190 static inline void ipc_command(struct intel_scu_ipc_dev *scu, u32 cmd)
192 reinit_completion(&scu->cmd_complete);
193 writel(cmd | IPC_IOC, scu->ipc_base);
202 static inline void ipc_data_writel(struct intel_scu_ipc_dev *scu, u32 data, u32 offset)
204 writel(data, scu->ipc_base + IPC_WRITE_BUFFER + offset);
214 static inline u8 ipc_read_status(struct intel_scu_ipc_dev *scu)
216 return __raw_readl(scu->ipc_base + IPC_STATUS);
220 static inline u32 ipc_data_readl(struct intel_scu_ipc_dev *scu, u32 offset)
222 return readl(scu->ipc_base + IPC_READ_BUFFER + offset);
225 /* Wait till scu status is busy */
226 static inline int busy_loop(struct intel_scu_ipc_dev *scu)
231 err = readx_poll_timeout(ipc_read_status, scu, status, !(status & IPC_STATUS_BUSY),
240 static inline int ipc_wait_for_interrupt(struct intel_scu_ipc_dev *scu)
244 wait_for_completion_timeout(&scu->cmd_complete, IPC_TIMEOUT);
246 status = ipc_read_status(scu);
256 static int intel_scu_ipc_check_status(struct intel_scu_ipc_dev *scu)
258 return scu->data.irq > 0 ? ipc_wait_for_interrupt(scu) : busy_loop(scu);
261 static struct intel_scu_ipc_dev *intel_scu_ipc_get(struct intel_scu_ipc_dev *scu)
265 if (!scu)
266 scu = ipcdev;
267 if (!scu)
270 status = ipc_read_status(scu);
272 dev_dbg(&scu->dev, "device is busy\n");
276 return scu;
280 static int pwr_reg_rdwr(struct intel_scu_ipc_dev *scu, u16 *addr, u8 *data,
293 scu = intel_scu_ipc_get(scu);
294 if (IS_ERR(scu))
295 return PTR_ERR(scu);
304 ipc_data_writel(scu, wbuf[nc], offset);
305 ipc_command(scu, (count * 2) << 16 | id << 12 | 0 << 8 | op);
310 ipc_data_writel(scu, wbuf[nc], offset);
311 ipc_command(scu, (count * 3) << 16 | id << 12 | 0 << 8 | op);
315 ipc_data_writel(scu, wbuf[0], 0); /* Write wbuff */
316 ipc_command(scu, 4 << 16 | id << 12 | 0 << 8 | op);
319 err = intel_scu_ipc_check_status(scu);
325 wbuf[nc] = ipc_data_readl(scu, offset);
333 * @scu: Optional SCU IPC instance
342 int intel_scu_ipc_dev_ioread8(struct intel_scu_ipc_dev *scu, u16 addr, u8 *data)
344 return pwr_reg_rdwr(scu, &addr, data, 1, IPCMSG_PCNTRL, IPC_CMD_PCNTRL_R);
350 * @scu: Optional SCU IPC instance
359 int intel_scu_ipc_dev_iowrite8(struct intel_scu_ipc_dev *scu, u16 addr, u8 data)
361 return pwr_reg_rdwr(scu, &addr, &data, 1, IPCMSG_PCNTRL, IPC_CMD_PCNTRL_W);
367 * @scu: Optional SCU IPC instance
379 int intel_scu_ipc_dev_readv(struct intel_scu_ipc_dev *scu, u16 *addr, u8 *data,
382 return pwr_reg_rdwr(scu, addr, data, len, IPCMSG_PCNTRL, IPC_CMD_PCNTRL_R);
388 * @scu: Optional SCU IPC instance
400 int intel_scu_ipc_dev_writev(struct intel_scu_ipc_dev *scu, u16 *addr, u8 *data,
403 return pwr_reg_rdwr(scu, addr, data, len, IPCMSG_PCNTRL, IPC_CMD_PCNTRL_W);
409 * @scu: Optional SCU IPC instance
422 int intel_scu_ipc_dev_update(struct intel_scu_ipc_dev *scu, u16 addr, u8 data,
426 return pwr_reg_rdwr(scu, &addr, tmp, 1, IPCMSG_PCNTRL, IPC_CMD_PCNTRL_M);
432 * @scu: Optional SCU IPC instance
443 int intel_scu_ipc_dev_simple_command(struct intel_scu_ipc_dev *scu, int cmd,
451 scu = intel_scu_ipc_get(scu);
452 if (IS_ERR(scu))
453 return PTR_ERR(scu);
456 ipc_command(scu, cmdval);
457 err = intel_scu_ipc_check_status(scu);
459 dev_err(&scu->dev, "IPC command %#x failed with %d\n", cmdval, err);
466 * @scu: Optional SCU IPC instance
480 int intel_scu_ipc_dev_command_with_size(struct intel_scu_ipc_dev *scu, int cmd,
494 scu = intel_scu_ipc_get(scu);
495 if (IS_ERR(scu))
496 return PTR_ERR(scu);
500 ipc_data_writel(scu, inbuf[i], 4 * i);
503 ipc_command(scu, cmdval);
504 err = intel_scu_ipc_check_status(scu);
506 dev_err(&scu->dev, "IPC command %#x failed with %d\n", cmdval, err);
511 outbuf[i] = ipc_data_readl(scu, 4 * i);
528 struct intel_scu_ipc_dev *scu = dev_id;
529 int status = ipc_read_status(scu);
531 writel(status | IPC_STATUS_IRQ, scu->ipc_base + IPC_STATUS);
532 complete(&scu->cmd_complete);
539 struct intel_scu_ipc_dev *scu = container_of(dev, struct intel_scu_ipc_dev, dev);
540 struct intel_scu_ipc_data *data = &scu->data;
543 free_irq(data->irq, scu);
544 iounmap(scu->ipc_base);
546 kfree(scu);
567 struct intel_scu_ipc_dev *scu;
576 scu = kzalloc(sizeof(*scu), GFP_KERNEL);
577 if (!scu)
580 scu->owner = owner;
581 scu->dev.parent = parent;
582 scu->dev.class = &intel_scu_ipc_class;
583 scu->dev.release = intel_scu_ipc_release;
585 memcpy(&scu->data, scu_data, sizeof(scu->data));
586 data = &scu->data;
599 scu->ipc_base = ipc_base;
600 init_completion(&scu->cmd_complete);
603 err = request_irq(data->irq, ioc, 0, "intel_scu_ipc", scu);
612 dev_set_name(&scu->dev, "intel_scu_ipc");
613 err = device_register(&scu->dev);
615 put_device(&scu->dev);
620 ipcdev = scu;
621 return scu;
628 kfree(scu);
635 * @scu: SCU IPC handle
640 void intel_scu_ipc_unregister(struct intel_scu_ipc_dev *scu)
646 device_unregister(&scu->dev);
654 struct intel_scu_ipc_dev *scu = dr->scu;
656 intel_scu_ipc_unregister(scu);
676 struct intel_scu_ipc_dev *scu;
682 scu = __intel_scu_ipc_register(parent, scu_data, owner);
683 if (IS_ERR(scu)) {
685 return scu;
688 dr->scu = scu;
691 return scu;