drivers/input/touchscreen/raydium_i2c_ts.c
Source file repositories/reference/linux-study-clean/drivers/input/touchscreen/raydium_i2c_ts.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/input/touchscreen/raydium_i2c_ts.c- Extension
.c- Size
- 30213 bytes
- Lines
- 1260
- Domain
- Driver Families
- Bucket
- drivers/input
- 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.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- 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/acpi.hlinux/delay.hlinux/firmware.hlinux/gpio/consumer.hlinux/i2c.hlinux/input.hlinux/input/mt.hlinux/interrupt.hlinux/module.hlinux/of.hlinux/pm_wakeirq.hlinux/regulator/consumer.hlinux/slab.hlinux/unaligned.h
Detected Declarations
struct raydium_data_infostruct raydium_infostruct raydium_dataenum raydium_bl_cmdenum raydium_bl_ackenum raydium_boot_modefunction raydium_i2c_xferfunction raydium_i2c_sendfunction raydium_i2c_readfunction raydium_i2c_sw_resetfunction raydium_i2c_query_ts_bootloader_infofunction raydium_i2c_query_ts_infofunction changedfunction raydium_i2c_check_fw_statusfunction raydium_i2c_initializefunction raydium_i2c_bl_chk_statefunction raydium_i2c_write_objectfunction raydium_i2c_boot_triggerfunction raydium_i2c_fw_triggerfunction raydium_i2c_check_pathfunction raydium_i2c_enter_blfunction raydium_i2c_leave_blfunction raydium_i2c_write_checksumfunction raydium_i2c_disable_watch_dogfunction raydium_i2c_fw_write_pagefunction raydium_calc_chksumfunction raydium_i2c_do_update_firmwarefunction raydium_i2c_fw_updatefunction raydium_mt_eventfunction raydium_i2c_irqfunction raydium_i2c_fw_ver_showfunction raydium_i2c_hw_ver_showfunction raydium_i2c_boot_mode_showfunction raydium_i2c_update_fw_storefunction scoped_guardfunction raydium_i2c_calibrate_storefunction scoped_guardfunction raydium_i2c_power_onfunction raydium_i2c_power_offfunction raydium_i2c_probefunction raydium_enter_sleepfunction raydium_i2c_suspendfunction raydium_i2c_resume
Annotated Snippet
struct raydium_data_info {
__le32 data_bank_addr;
u8 pkg_size;
u8 tp_info_size;
};
struct raydium_info {
__le32 hw_ver; /*device version */
u8 main_ver;
u8 sub_ver;
__le16 ft_ver; /* test version */
u8 x_num;
u8 y_num;
__le16 x_max;
__le16 y_max;
u8 x_res; /* units/mm */
u8 y_res; /* units/mm */
};
/* struct raydium_data - represents state of Raydium touchscreen device */
struct raydium_data {
struct i2c_client *client;
struct input_dev *input;
struct regulator *avdd;
struct regulator *vccio;
struct gpio_desc *reset_gpio;
struct raydium_info info;
struct mutex sysfs_mutex;
u8 *report_data;
u32 data_bank_addr;
u8 report_size;
u8 contact_size;
u8 pkg_size;
enum raydium_boot_mode boot_mode;
};
/*
* Header to be sent for RM_CMD_BANK_SWITCH command. This is used by
* raydium_i2c_{read|send} below.
*/
struct __packed raydium_bank_switch_header {
u8 cmd;
__be32 be_addr;
};
static int raydium_i2c_xfer(struct i2c_client *client, u32 addr,
struct i2c_msg *xfer, size_t xfer_count)
{
int ret;
/*
* If address is greater than 255, then RM_CMD_BANK_SWITCH needs to be
* sent first. Else, skip the header i.e. xfer[0].
*/
int xfer_start_idx = (addr > 0xff) ? 0 : 1;
xfer_count -= xfer_start_idx;
ret = i2c_transfer(client->adapter, &xfer[xfer_start_idx], xfer_count);
if (likely(ret == xfer_count))
return 0;
return ret < 0 ? ret : -EIO;
}
static int raydium_i2c_send(struct i2c_client *client,
u32 addr, const void *data, size_t len)
{
int tries = 0;
int error;
u8 reg_addr = addr & 0xff;
u8 *tx_buf __free(kfree) = kmalloc(len + 1, GFP_KERNEL);
if (!tx_buf)
return -ENOMEM;
tx_buf[0] = reg_addr;
memcpy(tx_buf + 1, data, len);
do {
struct raydium_bank_switch_header header = {
.cmd = RM_CMD_BANK_SWITCH,
.be_addr = cpu_to_be32(addr),
};
/*
Annotation
- Immediate include surface: `linux/acpi.h`, `linux/delay.h`, `linux/firmware.h`, `linux/gpio/consumer.h`, `linux/i2c.h`, `linux/input.h`, `linux/input/mt.h`, `linux/interrupt.h`.
- Detected declarations: `struct raydium_data_info`, `struct raydium_info`, `struct raydium_data`, `enum raydium_bl_cmd`, `enum raydium_bl_ack`, `enum raydium_boot_mode`, `function raydium_i2c_xfer`, `function raydium_i2c_send`, `function raydium_i2c_read`, `function raydium_i2c_sw_reset`.
- Atlas domain: Driver Families / drivers/input.
- Implementation status: source implementation candidate.
- IRQ or DMA behavior appears here, which is relevant to the selected PCIe/NVMe device path.
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.