drivers/misc/ibmasm/remote.c

Source file repositories/reference/linux-study-clean/drivers/misc/ibmasm/remote.c

File Facts

System
Linux kernel
Corpus path
drivers/misc/ibmasm/remote.c
Extension
.c
Size
9623 bytes
Lines
274
Domain
Driver Families
Bucket
drivers/misc
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (reader >= REMOTE_QUEUE_SIZE || writer >= REMOTE_QUEUE_SIZE) {
			set_queue_reader(sp, 0);
			break;
		}

		memcpy_fromio(&input, get_queue_entry(sp, reader),
				sizeof(struct remote_input));

		print_input(&input);
		if (input.type == INPUT_TYPE_MOUSE) {
			send_mouse_event(sp->remote.mouse_dev, &input);
		} else if (input.type == INPUT_TYPE_KEYBOARD) {
			send_keyboard_event(sp->remote.keybd_dev, &input);
		} else
			break;

		reader = advance_queue_reader(sp, reader);
		writer = get_queue_writer(sp);
	}
}

int ibmasm_init_remote_input_dev(struct service_processor *sp)
{
	/* set up the mouse input device */
	struct input_dev *mouse_dev, *keybd_dev;
	struct pci_dev *pdev = to_pci_dev(sp->dev);
	int error = -ENOMEM;
	int i;

	sp->remote.mouse_dev = mouse_dev = input_allocate_device();
	sp->remote.keybd_dev = keybd_dev = input_allocate_device();

	if (!mouse_dev || !keybd_dev)
		goto err_free_devices;

	mouse_dev->id.bustype = BUS_PCI;
	mouse_dev->id.vendor = pdev->vendor;
	mouse_dev->id.product = pdev->device;
	mouse_dev->id.version = 1;
	mouse_dev->dev.parent = sp->dev;
	mouse_dev->evbit[0]  = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
	mouse_dev->keybit[BIT_WORD(BTN_MOUSE)] = BIT_MASK(BTN_LEFT) |
		BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE);
	set_bit(BTN_TOUCH, mouse_dev->keybit);
	mouse_dev->name = "ibmasm RSA I remote mouse";
	input_set_abs_params(mouse_dev, ABS_X, 0, MOUSE_X_MAX, 0, 0);
	input_set_abs_params(mouse_dev, ABS_Y, 0, MOUSE_Y_MAX, 0, 0);

	keybd_dev->id.bustype = BUS_PCI;
	keybd_dev->id.vendor = pdev->vendor;
	keybd_dev->id.product = pdev->device;
	keybd_dev->id.version = 2;
	keybd_dev->dev.parent = sp->dev;
	keybd_dev->evbit[0]  = BIT_MASK(EV_KEY);
	keybd_dev->name = "ibmasm RSA I remote keyboard";

	for (i = 0; i < XLATE_SIZE; i++) {
		if (xlate_high[i])
			set_bit(xlate_high[i], keybd_dev->keybit);
		if (xlate[i])
			set_bit(xlate[i], keybd_dev->keybit);
	}

	error = input_register_device(mouse_dev);
	if (error)
		goto err_free_devices;

	error = input_register_device(keybd_dev);
	if (error)
		goto err_unregister_mouse_dev;

	enable_mouse_interrupts(sp);

	printk(KERN_INFO "ibmasm remote responding to events on RSA card %d\n", sp->number);

	return 0;

 err_unregister_mouse_dev:
	input_unregister_device(mouse_dev);
	mouse_dev = NULL; /* so we don't try to free it again below */
 err_free_devices:
	input_free_device(mouse_dev);
	input_free_device(keybd_dev);

	return error;
}

void ibmasm_free_remote_input_dev(struct service_processor *sp)
{
	disable_mouse_interrupts(sp);

Annotation

Implementation Notes