Lines Matching +full:module +full:- +full:instance
1 // SPDX-License-Identifier: GPL-2.0
5 * (C) Copyright 2008-2010,2015 Intel Corporation
10 * SCU has two IPC mechanism IPC-1 and IPC-2. IPC-1 is used between IA32 and
11 * SCU where IPC-2 is used between P-Unit and SCU. This driver delas with
12 * IPC-1 Driver provides an API for power control unit registers (e.g. MSIC)
23 #include <linux/module.h>
34 #define IPC_CMD_PCNTRL_M 2 /* Register read-modify-write */
40 * To read or write information to the SCU, driver writes to IPC-1 memory
47 * the IPC-1 register block, causing an interrupt to the SCU
60 struct module *owner;
89 * intel_scu_ipc_dev_get() - Get SCU IPC instance
91 * The recommended new API takes SCU IPC instance as parameter and this
92 * function can be called by driver to get the instance. This also makes
94 * while the caller has the instance.
96 * Call intel_scu_ipc_dev_put() to release the instance.
106 get_device(&ipcdev->dev); in intel_scu_ipc_dev_get()
111 if (!try_module_get(ipcdev->owner)) in intel_scu_ipc_dev_get()
112 put_device(&ipcdev->dev); in intel_scu_ipc_dev_get()
123 * intel_scu_ipc_dev_put() - Put SCU IPC instance
124 * @scu: SCU IPC instance
126 * This function releases the SCU IPC instance retrieved from
133 module_put(scu->owner); in intel_scu_ipc_dev_put()
134 put_device(&scu->dev); in intel_scu_ipc_dev_put()
146 struct intel_scu_ipc_dev *scu = dr->scu; in devm_intel_scu_ipc_dev_release()
152 * devm_intel_scu_ipc_dev_get() - Allocate managed SCU IPC device
155 * The recommended new API takes SCU IPC instance as parameter and this
156 * function can be called by driver to get the instance. This also makes
158 * while the caller has the instance.
177 dr->scu = scu; in devm_intel_scu_ipc_dev_get()
193 reinit_completion(&scu->cmd_complete); in ipc_command()
194 writel(cmd | IPC_IOC, scu->ipc_base); in ipc_command()
200 * 16-byte buffer for sending data associated with IPC command to
205 writel(data, scu->ipc_base + IPC_WRITE_BUFFER + offset); in ipc_data_writel()
217 return __raw_readl(scu->ipc_base + IPC_STATUS); in ipc_read_status()
223 return readb(scu->ipc_base + IPC_READ_BUFFER + offset); in ipc_data_readb()
229 return readl(scu->ipc_base + IPC_READ_BUFFER + offset); in ipc_data_readl()
243 return (status & IPC_STATUS_ERR) ? -EIO : 0; in busy_loop()
251 wait_for_completion_timeout(&scu->cmd_complete, IPC_TIMEOUT); in ipc_wait_for_interrupt()
255 return -ETIMEDOUT; in ipc_wait_for_interrupt()
258 return -EIO; in ipc_wait_for_interrupt()
265 return scu->irq > 0 ? ipc_wait_for_interrupt(scu) : busy_loop(scu); in intel_scu_ipc_check_status()
275 return ERR_PTR(-ENODEV); in intel_scu_ipc_get()
279 dev_dbg(&scu->dev, "device is busy\n"); in intel_scu_ipc_get()
280 return ERR_PTR(-EBUSY); in intel_scu_ipc_get()
330 memcpy_fromio(cbuf, scu->ipc_base + 0x90, 16); in pwr_reg_rdwr()
339 * intel_scu_ipc_dev_ioread8() - Read a byte via the SCU
340 * @scu: Optional SCU IPC instance
356 * intel_scu_ipc_dev_iowrite8() - Write a byte via the SCU
357 * @scu: Optional SCU IPC instance
373 * intel_scu_ipc_dev_readv() - Read a set of registers
374 * @scu: Optional SCU IPC instance
394 * intel_scu_ipc_dev_writev() - Write a set of registers
395 * @scu: Optional SCU IPC instance
415 * intel_scu_ipc_dev_update() - Update a register
416 * @scu: Optional SCU IPC instance
421 * Read-modify-write power control unit register. The first data argument
438 * intel_scu_ipc_dev_simple_command() - Send a simple command
439 * @scu: Optional SCU IPC instance
468 dev_err(&scu->dev, "IPC command %#x failed with %d\n", cmdval, err); in intel_scu_ipc_dev_simple_command()
474 * intel_scu_ipc_dev_command_with_size() - Command with data
475 * @scu: Optional SCU IPC instance
499 return -EINVAL; in intel_scu_ipc_dev_command_with_size()
527 dev_err(&scu->dev, "IPC command %#x failed with %d\n", cmdval, err); in intel_scu_ipc_dev_command_with_size()
544 writel(status | IPC_STATUS_IRQ, scu->ipc_base + IPC_STATUS); in ioc()
545 complete(&scu->cmd_complete); in ioc()
555 if (scu->irq > 0) in intel_scu_ipc_release()
556 free_irq(scu->irq, scu); in intel_scu_ipc_release()
557 iounmap(scu->ipc_base); in intel_scu_ipc_release()
558 release_mem_region(scu->mem.start, resource_size(&scu->mem)); in intel_scu_ipc_release()
563 * __intel_scu_ipc_register() - Register SCU IPC device
566 * @owner: Module registering the SCU IPC device
570 * failure. The caller may use the returned instance if it needs to do
576 struct module *owner) in __intel_scu_ipc_register()
585 err = -EBUSY; in __intel_scu_ipc_register()
591 err = -ENOMEM; in __intel_scu_ipc_register()
595 scu->owner = owner; in __intel_scu_ipc_register()
596 scu->dev.parent = parent; in __intel_scu_ipc_register()
597 scu->dev.class = &intel_scu_ipc_class; in __intel_scu_ipc_register()
598 scu->dev.release = intel_scu_ipc_release; in __intel_scu_ipc_register()
600 if (!request_mem_region(scu_data->mem.start, resource_size(&scu_data->mem), in __intel_scu_ipc_register()
602 err = -EBUSY; in __intel_scu_ipc_register()
606 ipc_base = ioremap(scu_data->mem.start, resource_size(&scu_data->mem)); in __intel_scu_ipc_register()
608 err = -ENOMEM; in __intel_scu_ipc_register()
612 scu->ipc_base = ipc_base; in __intel_scu_ipc_register()
613 scu->mem = scu_data->mem; in __intel_scu_ipc_register()
614 scu->irq = scu_data->irq; in __intel_scu_ipc_register()
615 init_completion(&scu->cmd_complete); in __intel_scu_ipc_register()
617 if (scu->irq > 0) { in __intel_scu_ipc_register()
618 err = request_irq(scu->irq, ioc, 0, "intel_scu_ipc", scu); in __intel_scu_ipc_register()
627 dev_set_name(&scu->dev, "intel_scu_ipc"); in __intel_scu_ipc_register()
628 err = device_register(&scu->dev); in __intel_scu_ipc_register()
630 put_device(&scu->dev); in __intel_scu_ipc_register()
643 release_mem_region(scu_data->mem.start, resource_size(&scu_data->mem)); in __intel_scu_ipc_register()
654 * intel_scu_ipc_unregister() - Unregister SCU IPC
665 device_unregister(&scu->dev); in intel_scu_ipc_unregister()
674 struct intel_scu_ipc_dev *scu = dr->scu; in devm_intel_scu_ipc_unregister()
680 * __devm_intel_scu_ipc_register() - Register managed SCU IPC device
683 * @owner: Module registering the SCU IPC device
687 * case of failure. The caller may use the returned instance if it needs
693 struct module *owner) in __devm_intel_scu_ipc_register()
708 dr->scu = scu; in __devm_intel_scu_ipc_register()