The difference is partly historical and partly related to different mathematical models.
The event subsystem is designed for unidirectional notification of simple events from several authors to a system with very small (or missing) configuration parameters.
The tty subsystem is designed for bidirectional end-to-end transmission of potentially large amounts of data and provides a fairly flexible (albeit rather baroque) configuration mechanism.
Historically, the tty subsystem has been the main mechanism for communicating with the system: you connect your teletype to the serial port, and the bit went in and out. Different teletypes from different manufacturers used different protocols, and therefore the termios interface appeared. In order for the system to work well in a multi-user context, buffering was added to the kernel (and was configured). The tty subsystem wait model is a point-to-point connection between moderately intelligent endpoints that agrees with what the data flowing between them will look like.
Despite the fact that in the tty subsystem it makes sense to use “one writer, several readers” (the GPS receiver is connected to the serial port, for example, constantly reporting its position), this is not the main goal of the system, but you can easily do this “several readers "in user space.
The event system, on the other hand, is basically an interrupt mechanism for things like mice and keyboards. Unlike teletypes, input devices are unidirectional and have little control over the data they produce. There is also no data buffering. No one will be interested in where the mouse moved ten minutes ago.
Hope the answer to your first question.
For your second question: "it depends." What do you want to achieve? And what is the “longevity” of the data? You should also ask yourself if it makes sense to put complexity in the kernel or whether it would be impractical to put it in user space.
Retrieving data for multiple readers is not particularly difficult. You can create a receive buffer for each reader and fill each of them as data arrives. Everything becomes a little more interesting if the data arrives faster than readers can consume it, but even this is basically a problem. Look at the network stack for inspiration!
If your device is simple and just creates events, maybe you just want to be an input driver?
Your second question is much more difficult to answer without knowing more about what you want to achieve.
Update after adding your specific goal:
When I switch positions, I usually just create a personal device and implement poll and read . If you want to be a fantasy and have a lot of switches, you can do mmap , but I would not bother.
User space just opens your /dev/foo and reads the current state and starts polling. When your switches change state, you simply wake readers and they will read again. All your readers will wake up, they will all read the new state, and everyone will be happy.
Be careful only to wake readers when your switches are "set." Many position switches are very noisy and they will quickly bounce.
In other words: I would completely ignore the input system for this. As you may have guessed, position switches are not really “inputs”.