drivers/w1/masters/ds2490.c

Source file repositories/reference/linux-study-clean/drivers/w1/masters/ds2490.c

File Facts

System
Linux kernel
Corpus path
drivers/w1/masters/ds2490.c
Extension
.c
Size
26888 bytes
Lines
1126
Domain
Driver Families
Bucket
drivers/w1
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

struct ds_device {
	struct list_head	ds_entry;

	struct usb_device	*udev;
	struct usb_interface	*intf;

	int			ep[NUM_EP];

	/* Strong PullUp
	 * 0: pullup not active, else duration in milliseconds
	 */
	int			spu_sleep;
	/* spu_bit contains COMM_SPU or 0 depending on if the strong pullup
	 * should be active or not for writes.
	 */
	u16			spu_bit;

	u8			st_buf[ST_SIZE];
	u8			byte_buf;

	struct w1_bus_master	master;
};

struct ds_status {
	u8			enable;
	u8			speed;
	u8			pullup_dur;
	u8			ppuls_dur;
	u8			pulldown_slew;
	u8			write1_time;
	u8			write0_time;
	u8			reserved0;
	u8			status;
	u8			command0;
	u8			command1;
	u8			command_buffer_status;
	u8			data_out_buffer_status;
	u8			data_in_buffer_status;
	u8			reserved1;
	u8			reserved2;
};

static LIST_HEAD(ds_devices);
static DEFINE_MUTEX(ds_mutex);

static int ds_send_control_cmd(struct ds_device *dev, u16 value, u16 index)
{
	int err;

	err = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, dev->ep[EP_CONTROL]),
			CONTROL_CMD, VENDOR, value, index, NULL, 0, 1000);
	if (err < 0) {
		dev_err(&dev->udev->dev,
			"Failed to send command control message %x.%x: err=%d.\n",
			value, index, err);
		return err;
	}

	return err;
}

static int ds_send_control_mode(struct ds_device *dev, u16 value, u16 index)
{
	int err;

	err = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, dev->ep[EP_CONTROL]),
			MODE_CMD, VENDOR, value, index, NULL, 0, 1000);
	if (err < 0) {
		dev_err(&dev->udev->dev,
			"Failed to send mode control message %x.%x: err=%d.\n",
			value, index, err);
		return err;
	}

	return err;
}

static int ds_send_control(struct ds_device *dev, u16 value, u16 index)
{
	int err;

	err = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, dev->ep[EP_CONTROL]),
			COMM_CMD, VENDOR, value, index, NULL, 0, 1000);
	if (err < 0) {
		dev_err(&dev->udev->dev,
			"Failed to send control message %x.%x: err=%d.\n",
			value, index, err);
		return err;
	}

Annotation

Implementation Notes