evdev: remove soft context from evdev methods parameter list.
Now softc should be retrieved from struct edvev * pointer with evdev_get_softc() helper. wmt(4) is a sample of driver that support both KPI. Reviewed by: hselasky, gonzo Differential Revision: https://reviews.freebsd.org/D16614
This commit is contained in:
parent
fa1752004a
commit
51b0af6028
@ -172,20 +172,22 @@ ft5406ts_callout(void *data)
|
||||
callout_reset(&sc->sc_callout, sc->sc_tick, ft5406ts_callout, sc);
|
||||
}
|
||||
|
||||
static void
|
||||
ft5406ts_ev_close(struct evdev_dev *evdev, void *data)
|
||||
static int
|
||||
ft5406ts_ev_close(struct evdev_dev *evdev)
|
||||
{
|
||||
struct ft5406ts_softc *sc = (struct ft5406ts_softc *)data;
|
||||
struct ft5406ts_softc *sc = evdev_get_softc(evdev);
|
||||
|
||||
FT5406_LOCK_ASSERT(sc);
|
||||
|
||||
callout_stop(&sc->sc_callout);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
ft5406ts_ev_open(struct evdev_dev *evdev, void *data)
|
||||
ft5406ts_ev_open(struct evdev_dev *evdev)
|
||||
{
|
||||
struct ft5406ts_softc *sc = (struct ft5406ts_softc *)data;
|
||||
struct ft5406ts_softc *sc = evdev_get_softc(evdev);
|
||||
|
||||
FT5406_LOCK_ASSERT(sc);
|
||||
|
||||
|
@ -2023,9 +2023,9 @@ psmdetach(device_t dev)
|
||||
|
||||
#ifdef EVDEV_SUPPORT
|
||||
static int
|
||||
psm_ev_open_r(struct evdev_dev *evdev, void *ev_softc)
|
||||
psm_ev_open_r(struct evdev_dev *evdev)
|
||||
{
|
||||
struct psm_softc *sc = (struct psm_softc *)ev_softc;
|
||||
struct psm_softc *sc = evdev_get_softc(evdev);
|
||||
int err = 0;
|
||||
|
||||
/* Get device data */
|
||||
@ -2043,24 +2043,27 @@ psm_ev_open_r(struct evdev_dev *evdev, void *ev_softc)
|
||||
return (err);
|
||||
}
|
||||
|
||||
static void
|
||||
psm_ev_close_r(struct evdev_dev *evdev, void *ev_softc)
|
||||
static int
|
||||
psm_ev_close_r(struct evdev_dev *evdev)
|
||||
{
|
||||
struct psm_softc *sc = (struct psm_softc *)ev_softc;
|
||||
struct psm_softc *sc = evdev_get_softc(evdev);
|
||||
int err = 0;
|
||||
|
||||
sc->state &= ~PSM_EV_OPEN_R;
|
||||
|
||||
if (sc->state & (PSM_OPEN | PSM_EV_OPEN_A))
|
||||
return;
|
||||
return (0);
|
||||
|
||||
if (sc->state & PSM_VALID)
|
||||
psmclose(sc);
|
||||
err = psmclose(sc);
|
||||
|
||||
return (err);
|
||||
}
|
||||
|
||||
static int
|
||||
psm_ev_open_a(struct evdev_dev *evdev, void *ev_softc)
|
||||
psm_ev_open_a(struct evdev_dev *evdev)
|
||||
{
|
||||
struct psm_softc *sc = (struct psm_softc *)ev_softc;
|
||||
struct psm_softc *sc = evdev_get_softc(evdev);
|
||||
int err = 0;
|
||||
|
||||
/* Get device data */
|
||||
@ -2078,18 +2081,21 @@ psm_ev_open_a(struct evdev_dev *evdev, void *ev_softc)
|
||||
return (err);
|
||||
}
|
||||
|
||||
static void
|
||||
psm_ev_close_a(struct evdev_dev *evdev, void *ev_softc)
|
||||
static int
|
||||
psm_ev_close_a(struct evdev_dev *evdev)
|
||||
{
|
||||
struct psm_softc *sc = (struct psm_softc *)ev_softc;
|
||||
struct psm_softc *sc = evdev_get_softc(evdev);
|
||||
int err = 0;
|
||||
|
||||
sc->state &= ~PSM_EV_OPEN_A;
|
||||
|
||||
if (sc->state & (PSM_OPEN | PSM_EV_OPEN_R))
|
||||
return;
|
||||
return (0);
|
||||
|
||||
if (sc->state & PSM_VALID)
|
||||
psmclose(sc);
|
||||
err = psmclose(sc);
|
||||
|
||||
return (err);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -419,7 +419,7 @@ evdev_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag,
|
||||
return (ENOTSUP);
|
||||
|
||||
ke = (struct input_keymap_entry *)data;
|
||||
evdev->ev_methods->ev_get_keycode(evdev, evdev->ev_softc, ke);
|
||||
evdev->ev_methods->ev_get_keycode(evdev, ke);
|
||||
return (0);
|
||||
|
||||
case EVIOCSKEYCODE:
|
||||
@ -432,7 +432,7 @@ evdev_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag,
|
||||
return (ENOTSUP);
|
||||
|
||||
ke = (struct input_keymap_entry *)data;
|
||||
evdev->ev_methods->ev_set_keycode(evdev, evdev->ev_softc, ke);
|
||||
evdev->ev_methods->ev_set_keycode(evdev, ke);
|
||||
return (0);
|
||||
|
||||
case EVIOCGABS(0) ... EVIOCGABS(ABS_MAX):
|
||||
|
@ -337,6 +337,13 @@ evdev_set_methods(struct evdev_dev *evdev, void *softc,
|
||||
evdev->ev_softc = softc;
|
||||
}
|
||||
|
||||
inline void *
|
||||
evdev_get_softc(struct evdev_dev *evdev)
|
||||
{
|
||||
|
||||
return (evdev->ev_softc);
|
||||
}
|
||||
|
||||
inline void
|
||||
evdev_support_prop(struct evdev_dev *evdev, uint16_t prop)
|
||||
{
|
||||
@ -798,8 +805,7 @@ evdev_inject_event(struct evdev_dev *evdev, uint16_t type, uint16_t code,
|
||||
case EV_FF:
|
||||
if (evdev->ev_methods != NULL &&
|
||||
evdev->ev_methods->ev_event != NULL)
|
||||
evdev->ev_methods->ev_event(evdev, evdev->ev_softc,
|
||||
type, code, value);
|
||||
evdev->ev_methods->ev_event(evdev, type, code, value);
|
||||
/*
|
||||
* Leds and driver repeats should be reported in ev_event
|
||||
* method body to interoperate with kbdmux states and rates
|
||||
@ -842,7 +848,7 @@ evdev_register_client(struct evdev_dev *evdev, struct evdev_client *client)
|
||||
evdev->ev_methods->ev_open != NULL) {
|
||||
debugf(evdev, "calling ev_open() on device %s",
|
||||
evdev->ev_shortname);
|
||||
ret = evdev->ev_methods->ev_open(evdev, evdev->ev_softc);
|
||||
ret = evdev->ev_methods->ev_open(evdev);
|
||||
}
|
||||
if (ret == 0)
|
||||
LIST_INSERT_HEAD(&evdev->ev_clients, client, ec_link);
|
||||
@ -860,7 +866,7 @@ evdev_dispose_client(struct evdev_dev *evdev, struct evdev_client *client)
|
||||
if (LIST_EMPTY(&evdev->ev_clients)) {
|
||||
if (evdev->ev_methods != NULL &&
|
||||
evdev->ev_methods->ev_close != NULL)
|
||||
evdev->ev_methods->ev_close(evdev, evdev->ev_softc);
|
||||
(void)evdev->ev_methods->ev_close(evdev);
|
||||
if (evdev_event_supported(evdev, EV_REP) &&
|
||||
bit_test(evdev->ev_flags, EVDEV_FLAG_SOFTREPEAT))
|
||||
evdev_stop_repeat(evdev);
|
||||
|
@ -38,11 +38,10 @@
|
||||
|
||||
struct evdev_dev;
|
||||
|
||||
typedef int (evdev_open_t)(struct evdev_dev *, void *);
|
||||
typedef void (evdev_close_t)(struct evdev_dev *, void *);
|
||||
typedef void (evdev_event_t)(struct evdev_dev *, void *, uint16_t,
|
||||
uint16_t, int32_t);
|
||||
typedef void (evdev_keycode_t)(struct evdev_dev *, void *,
|
||||
typedef int (evdev_open_t)(struct evdev_dev *);
|
||||
typedef int (evdev_close_t)(struct evdev_dev *);
|
||||
typedef void (evdev_event_t)(struct evdev_dev *, uint16_t, uint16_t, int32_t);
|
||||
typedef void (evdev_keycode_t)(struct evdev_dev *,
|
||||
struct input_keymap_entry *);
|
||||
|
||||
/*
|
||||
@ -126,6 +125,7 @@ void evdev_support_sw(struct evdev_dev *, uint16_t);
|
||||
void evdev_set_repeat_params(struct evdev_dev *, uint16_t, int);
|
||||
int evdev_set_report_size(struct evdev_dev *, size_t);
|
||||
void evdev_set_flag(struct evdev_dev *, uint16_t);
|
||||
void *evdev_get_softc(struct evdev_dev *);
|
||||
|
||||
/* Multitouch related functions: */
|
||||
int32_t evdev_get_mt_slot_by_tracking_id(struct evdev_dev *, int32_t);
|
||||
|
@ -301,10 +301,10 @@ evdev_push_repeats(struct evdev_dev *evdev, keyboard_t *kbd)
|
||||
}
|
||||
|
||||
void
|
||||
evdev_ev_kbd_event(struct evdev_dev *evdev, void *softc, uint16_t type,
|
||||
uint16_t code, int32_t value)
|
||||
evdev_ev_kbd_event(struct evdev_dev *evdev, uint16_t type, uint16_t code,
|
||||
int32_t value)
|
||||
{
|
||||
keyboard_t *kbd = (keyboard_t *)softc;
|
||||
keyboard_t *kbd = (keyboard_t *)evdev_get_softc(evdev);
|
||||
int delay[2], leds, oleds;
|
||||
size_t i;
|
||||
|
||||
|
@ -159,10 +159,10 @@ uinput_knl_assert_unlocked(void *arg)
|
||||
}
|
||||
|
||||
static void
|
||||
uinput_ev_event(struct evdev_dev *evdev, void *softc, uint16_t type,
|
||||
uint16_t code, int32_t value)
|
||||
uinput_ev_event(struct evdev_dev *evdev, uint16_t type, uint16_t code,
|
||||
int32_t value)
|
||||
{
|
||||
struct uinput_cdev_state *state = softc;
|
||||
struct uinput_cdev_state *state = evdev_get_softc(evdev);
|
||||
|
||||
if (type == EV_LED)
|
||||
evdev_push_event(evdev, type, code, value);
|
||||
|
@ -430,19 +430,21 @@ uep_detach(device_t dev)
|
||||
|
||||
#ifdef EVDEV_SUPPORT
|
||||
|
||||
static void
|
||||
uep_ev_close(struct evdev_dev *evdev, void *ev_softc)
|
||||
static int
|
||||
uep_ev_close(struct evdev_dev *evdev)
|
||||
{
|
||||
struct uep_softc *sc = (struct uep_softc *)ev_softc;
|
||||
struct uep_softc *sc = evdev_get_softc(evdev);
|
||||
|
||||
mtx_assert(&sc->mtx, MA_OWNED);
|
||||
usbd_transfer_stop(sc->xfer[UEP_INTR_DT]);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
uep_ev_open(struct evdev_dev *evdev, void *ev_softc)
|
||||
uep_ev_open(struct evdev_dev *evdev)
|
||||
{
|
||||
struct uep_softc *sc = (struct uep_softc *)ev_softc;
|
||||
struct uep_softc *sc = evdev_get_softc(evdev);
|
||||
|
||||
mtx_assert(&sc->mtx, MA_OWNED);
|
||||
usbd_transfer_start(sc->xfer[UEP_INTR_DT]);
|
||||
|
@ -950,9 +950,9 @@ ums_reset_buf(struct ums_softc *sc)
|
||||
|
||||
#ifdef EVDEV_SUPPORT
|
||||
static int
|
||||
ums_ev_open(struct evdev_dev *evdev, void *ev_softc)
|
||||
ums_ev_open(struct evdev_dev *evdev)
|
||||
{
|
||||
struct ums_softc *sc = (struct ums_softc *)ev_softc;
|
||||
struct ums_softc *sc = evdev_get_softc(evdev);
|
||||
|
||||
mtx_assert(&sc->sc_mtx, MA_OWNED);
|
||||
|
||||
@ -966,10 +966,10 @@ ums_ev_open(struct evdev_dev *evdev, void *ev_softc)
|
||||
return (0);
|
||||
}
|
||||
|
||||
static void
|
||||
ums_ev_close(struct evdev_dev *evdev, void *ev_softc)
|
||||
static int
|
||||
ums_ev_close(struct evdev_dev *evdev)
|
||||
{
|
||||
struct ums_softc *sc = (struct ums_softc *)ev_softc;
|
||||
struct ums_softc *sc = evdev_get_softc(evdev);
|
||||
|
||||
mtx_assert(&sc->sc_mtx, MA_OWNED);
|
||||
|
||||
@ -977,6 +977,8 @@ ums_ev_close(struct evdev_dev *evdev, void *ev_softc)
|
||||
|
||||
if (sc->sc_fflags == 0)
|
||||
ums_stop_rx(sc);
|
||||
|
||||
return (0);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -226,12 +226,22 @@ static device_probe_t wmt_probe;
|
||||
static device_attach_t wmt_attach;
|
||||
static device_detach_t wmt_detach;
|
||||
|
||||
#if __FreeBSD_version >= 1200077
|
||||
static evdev_open_t wmt_ev_open;
|
||||
static evdev_close_t wmt_ev_close;
|
||||
#else
|
||||
static evdev_open_t wmt_ev_open_11;
|
||||
static evdev_close_t wmt_ev_close_11;
|
||||
#endif
|
||||
|
||||
static const struct evdev_methods wmt_evdev_methods = {
|
||||
#if __FreeBSD_version >= 1200077
|
||||
.ev_open = &wmt_ev_open,
|
||||
.ev_close = &wmt_ev_close,
|
||||
#else
|
||||
.ev_open = &wmt_ev_open_11,
|
||||
.ev_close = &wmt_ev_close_11,
|
||||
#endif
|
||||
};
|
||||
|
||||
static const struct usb_config wmt_config[WMT_N_TRANSFER] = {
|
||||
@ -525,18 +535,18 @@ wmt_intr_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
}
|
||||
|
||||
static void
|
||||
wmt_ev_close(struct evdev_dev *evdev, void *ev_softc)
|
||||
wmt_ev_close_11(struct evdev_dev *evdev, void *ev_softc)
|
||||
{
|
||||
struct wmt_softc *sc = (struct wmt_softc *)ev_softc;
|
||||
struct wmt_softc *sc = ev_softc;
|
||||
|
||||
mtx_assert(&sc->mtx, MA_OWNED);
|
||||
usbd_transfer_stop(sc->xfer[WMT_INTR_DT]);
|
||||
}
|
||||
|
||||
static int
|
||||
wmt_ev_open(struct evdev_dev *evdev, void *ev_softc)
|
||||
wmt_ev_open_11(struct evdev_dev *evdev, void *ev_softc)
|
||||
{
|
||||
struct wmt_softc *sc = (struct wmt_softc *)ev_softc;
|
||||
struct wmt_softc *sc = ev_softc;
|
||||
|
||||
mtx_assert(&sc->mtx, MA_OWNED);
|
||||
usbd_transfer_start(sc->xfer[WMT_INTR_DT]);
|
||||
@ -544,6 +554,27 @@ wmt_ev_open(struct evdev_dev *evdev, void *ev_softc)
|
||||
return (0);
|
||||
}
|
||||
|
||||
#if __FreeBSD_version >= 1200077
|
||||
static int
|
||||
wmt_ev_close(struct evdev_dev *evdev)
|
||||
{
|
||||
struct wmt_softc *sc = evdev_get_softc(evdev);
|
||||
|
||||
wmt_ev_close_11(evdev, sc);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
wmt_ev_open(struct evdev_dev *evdev)
|
||||
{
|
||||
struct wmt_softc *sc = evdev_get_softc(evdev);
|
||||
|
||||
return (wmt_ev_open_11(evdev, sc));
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
/* port of userland hid_report_size() from usbhid(3) to kernel */
|
||||
static int
|
||||
wmt_hid_report_size(const void *buf, uint16_t len, enum hid_kind k, uint8_t id)
|
||||
|
Loading…
Reference in New Issue
Block a user