18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci	Mantis PCI bridge driver
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci	Copyright (C) Manu Abraham (abraham.manu@gmail.com)
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci*/
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#include <media/rc-core.h>
108c2ecf20Sopenharmony_ci#include <linux/pci.h>
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include <media/dmxdev.h>
138c2ecf20Sopenharmony_ci#include <media/dvbdev.h>
148c2ecf20Sopenharmony_ci#include <media/dvb_demux.h>
158c2ecf20Sopenharmony_ci#include <media/dvb_frontend.h>
168c2ecf20Sopenharmony_ci#include <media/dvb_net.h>
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci#include "mantis_common.h"
198c2ecf20Sopenharmony_ci#include "mantis_input.h"
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci#define MODULE_NAME "mantis_core"
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_civoid mantis_input_process(struct mantis_pci *mantis, int scancode)
248c2ecf20Sopenharmony_ci{
258c2ecf20Sopenharmony_ci	if (mantis->rc)
268c2ecf20Sopenharmony_ci		rc_keydown(mantis->rc, RC_PROTO_UNKNOWN, scancode, 0);
278c2ecf20Sopenharmony_ci}
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ciint mantis_input_init(struct mantis_pci *mantis)
308c2ecf20Sopenharmony_ci{
318c2ecf20Sopenharmony_ci	struct rc_dev *dev;
328c2ecf20Sopenharmony_ci	int err;
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci	dev = rc_allocate_device(RC_DRIVER_SCANCODE);
358c2ecf20Sopenharmony_ci	if (!dev) {
368c2ecf20Sopenharmony_ci		dprintk(MANTIS_ERROR, 1, "Remote device allocation failed");
378c2ecf20Sopenharmony_ci		err = -ENOMEM;
388c2ecf20Sopenharmony_ci		goto out;
398c2ecf20Sopenharmony_ci	}
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci	snprintf(mantis->device_name, sizeof(mantis->device_name),
428c2ecf20Sopenharmony_ci		 "Mantis %s IR receiver", mantis->hwconfig->model_name);
438c2ecf20Sopenharmony_ci	snprintf(mantis->input_phys, sizeof(mantis->input_phys),
448c2ecf20Sopenharmony_ci		 "pci-%s/ir0", pci_name(mantis->pdev));
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci	dev->device_name        = mantis->device_name;
478c2ecf20Sopenharmony_ci	dev->input_phys         = mantis->input_phys;
488c2ecf20Sopenharmony_ci	dev->input_id.bustype   = BUS_PCI;
498c2ecf20Sopenharmony_ci	dev->input_id.vendor    = mantis->vendor_id;
508c2ecf20Sopenharmony_ci	dev->input_id.product   = mantis->device_id;
518c2ecf20Sopenharmony_ci	dev->input_id.version   = 1;
528c2ecf20Sopenharmony_ci	dev->driver_name        = MODULE_NAME;
538c2ecf20Sopenharmony_ci	dev->map_name           = mantis->rc_map_name ? : RC_MAP_EMPTY;
548c2ecf20Sopenharmony_ci	dev->dev.parent         = &mantis->pdev->dev;
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci	err = rc_register_device(dev);
578c2ecf20Sopenharmony_ci	if (err) {
588c2ecf20Sopenharmony_ci		dprintk(MANTIS_ERROR, 1, "IR device registration failed, ret = %d", err);
598c2ecf20Sopenharmony_ci		goto out_dev;
608c2ecf20Sopenharmony_ci	}
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_ci	mantis->rc = dev;
638c2ecf20Sopenharmony_ci	return 0;
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_ciout_dev:
668c2ecf20Sopenharmony_ci	rc_free_device(dev);
678c2ecf20Sopenharmony_ciout:
688c2ecf20Sopenharmony_ci	return err;
698c2ecf20Sopenharmony_ci}
708c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(mantis_input_init);
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_civoid mantis_input_exit(struct mantis_pci *mantis)
738c2ecf20Sopenharmony_ci{
748c2ecf20Sopenharmony_ci	rc_unregister_device(mantis->rc);
758c2ecf20Sopenharmony_ci}
768c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(mantis_input_exit);
77