drivers/media/radio/dsbr100.c
Source file repositories/reference/linux-study-clean/drivers/media/radio/dsbr100.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/media/radio/dsbr100.c- Extension
.c- Size
- 11778 bytes
- Lines
- 421
- Domain
- Driver Families
- Bucket
- drivers/media
- 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.
- 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.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/kernel.hlinux/module.hlinux/init.hlinux/slab.hlinux/input.hlinux/videodev2.hlinux/usb.hmedia/v4l2-device.hmedia/v4l2-ioctl.hmedia/v4l2-ctrls.hmedia/v4l2-event.h
Detected Declarations
struct dsbr100_devicefunction dsbr100_setfreqfunction dsbr100_startfunction dsbr100_stopfunction dsbr100_getstatfunction vidioc_querycapfunction vidioc_g_tunerfunction vidioc_s_tunerfunction vidioc_s_frequencyfunction vidioc_g_frequencyfunction usb_dsbr100_s_ctrlfunction usb_dsbr100_disconnectfunction usb_dsbr100_suspendfunction usb_dsbr100_resumefunction usb_dsbr100_releasefunction usb_dsbr100_probe
Annotated Snippet
struct dsbr100_device {
struct usb_device *usbdev;
struct video_device videodev;
struct v4l2_device v4l2_dev;
struct v4l2_ctrl_handler hdl;
u8 *transfer_buffer;
struct mutex v4l2_lock;
int curfreq;
bool stereo;
bool muted;
};
/* Low-level device interface begins here */
/* set a frequency, freq is defined by v4l's TUNER_LOW, i.e. 1/16th kHz */
static int dsbr100_setfreq(struct dsbr100_device *radio, unsigned freq)
{
unsigned f = (freq / 16 * 80) / 1000 + 856;
int retval = 0;
if (!radio->muted) {
retval = usb_control_msg(radio->usbdev,
usb_rcvctrlpipe(radio->usbdev, 0),
DSB100_TUNE,
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
(f >> 8) & 0x00ff, f & 0xff,
radio->transfer_buffer, 8, 300);
if (retval >= 0)
mdelay(1);
}
if (retval >= 0) {
radio->curfreq = freq;
return 0;
}
dev_err(&radio->usbdev->dev,
"%s - usb_control_msg returned %i, request %i\n",
__func__, retval, DSB100_TUNE);
return retval;
}
/* switch on radio */
static int dsbr100_start(struct dsbr100_device *radio)
{
int retval = usb_control_msg(radio->usbdev,
usb_rcvctrlpipe(radio->usbdev, 0),
DSB100_ONOFF,
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
0x01, 0x00, radio->transfer_buffer, 8, 300);
if (retval >= 0)
return dsbr100_setfreq(radio, radio->curfreq);
dev_err(&radio->usbdev->dev,
"%s - usb_control_msg returned %i, request %i\n",
__func__, retval, DSB100_ONOFF);
return retval;
}
/* switch off radio */
static int dsbr100_stop(struct dsbr100_device *radio)
{
int retval = usb_control_msg(radio->usbdev,
usb_rcvctrlpipe(radio->usbdev, 0),
DSB100_ONOFF,
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
0x00, 0x00, radio->transfer_buffer, 8, 300);
if (retval >= 0)
return 0;
dev_err(&radio->usbdev->dev,
"%s - usb_control_msg returned %i, request %i\n",
__func__, retval, DSB100_ONOFF);
return retval;
}
/* return the device status. This is, in effect, just whether it
sees a stereo signal or not. Pity. */
static void dsbr100_getstat(struct dsbr100_device *radio)
{
int retval = usb_control_msg(radio->usbdev,
usb_rcvctrlpipe(radio->usbdev, 0),
USB_REQ_GET_STATUS,
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
0x00, 0x24, radio->transfer_buffer, 8, 300);
if (retval < 0) {
radio->stereo = false;
Annotation
- Immediate include surface: `linux/kernel.h`, `linux/module.h`, `linux/init.h`, `linux/slab.h`, `linux/input.h`, `linux/videodev2.h`, `linux/usb.h`, `media/v4l2-device.h`.
- Detected declarations: `struct dsbr100_device`, `function dsbr100_setfreq`, `function dsbr100_start`, `function dsbr100_stop`, `function dsbr100_getstat`, `function vidioc_querycap`, `function vidioc_g_tuner`, `function vidioc_s_tuner`, `function vidioc_s_frequency`, `function vidioc_g_frequency`.
- Atlas domain: Driver Families / drivers/media.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.