Lines Matching +full:address +full:- +full:data

1 // SPDX-License-Identifier: GPL-2.0-only
81 ACPI_SMB_ADDRESS = 2, /* address */
83 ACPI_SMB_DATA = 4, /* 32 data registers */
84 ACPI_SMB_BLOCK_COUNT = 0x24, /* number of data bytes */
85 ACPI_SMB_ALARM_ADDRESS = 0x25, /* alarm address */
86 ACPI_SMB_ALARM_DATA = 0x26, /* 2 bytes alarm data */
89 static inline int smb_hc_read(struct acpi_smb_hc *hc, u8 address, u8 *data) in smb_hc_read() argument
91 return ec_read(hc->offset + address, data); in smb_hc_read()
94 static inline int smb_hc_write(struct acpi_smb_hc *hc, u8 address, u8 data) in smb_hc_write() argument
96 return ec_write(hc->offset + address, data); in smb_hc_write()
101 if (wait_event_timeout(hc->wait, hc->done, msecs_to_jiffies(timeout))) in wait_transaction_complete()
103 return -ETIME; in wait_transaction_complete()
107 u8 address, u8 command, u8 *data, u8 length) in acpi_smbus_transaction() argument
109 int ret = -EFAULT, i; in acpi_smbus_transaction()
117 mutex_lock(&hc->lock); in acpi_smbus_transaction()
118 hc->done = false; in acpi_smbus_transaction()
122 ret = -EBUSY; in acpi_smbus_transaction()
129 smb_hc_write(hc, ACPI_SMB_DATA + i, data[i]); in acpi_smbus_transaction()
131 smb_hc_write(hc, ACPI_SMB_ADDRESS, address << 1); in acpi_smbus_transaction()
134 * Wait for completion. Save the status code, data size, in acpi_smbus_transaction()
135 * and data into the return package (if required by the protocol). in acpi_smbus_transaction()
150 ret = -EFAULT; in acpi_smbus_transaction()
157 smb_hc_read(hc, ACPI_SMB_DATA + i, &data[i]); in acpi_smbus_transaction()
159 mutex_unlock(&hc->lock); in acpi_smbus_transaction()
163 int acpi_smbus_read(struct acpi_smb_hc *hc, u8 protocol, u8 address, in acpi_smbus_read() argument
164 u8 command, u8 *data) in acpi_smbus_read() argument
166 return acpi_smbus_transaction(hc, protocol, address, command, data, 0); in acpi_smbus_read()
171 int acpi_smbus_write(struct acpi_smb_hc *hc, u8 protocol, u8 address, in acpi_smbus_write() argument
172 u8 command, u8 *data, u8 length) in acpi_smbus_write() argument
174 return acpi_smbus_transaction(hc, protocol, address, command, data, length); in acpi_smbus_write()
182 mutex_lock(&hc->lock); in acpi_smbus_register_callback()
183 hc->callback = callback; in acpi_smbus_register_callback()
184 hc->context = context; in acpi_smbus_register_callback()
185 mutex_unlock(&hc->lock); in acpi_smbus_register_callback()
193 mutex_lock(&hc->lock); in acpi_smbus_unregister_callback()
194 hc->callback = NULL; in acpi_smbus_unregister_callback()
195 hc->context = NULL; in acpi_smbus_unregister_callback()
196 mutex_unlock(&hc->lock); in acpi_smbus_unregister_callback()
206 if (hc->callback) in acpi_smbus_callback()
207 hc->callback(hc->context); in acpi_smbus_callback()
214 u8 address; in smbus_alarm() local
219 hc->done = true; in smbus_alarm()
220 wake_up(&hc->wait); in smbus_alarm()
224 mutex_lock(&hc->lock); in smbus_alarm()
225 smb_hc_read(hc, ACPI_SMB_ALARM_ADDRESS, &address); in smbus_alarm()
229 switch (address >> 1) { in smbus_alarm()
236 mutex_unlock(&hc->lock); in smbus_alarm()
247 return -EINVAL; in acpi_smbus_hc_add()
249 status = acpi_evaluate_integer(device->handle, "_EC", NULL, &val); in acpi_smbus_hc_add()
252 return -EIO; in acpi_smbus_hc_add()
260 return -ENOMEM; in acpi_smbus_hc_add()
261 mutex_init(&hc->lock); in acpi_smbus_hc_add()
262 init_waitqueue_head(&hc->wait); in acpi_smbus_hc_add()
264 hc->ec = acpi_driver_data(acpi_dev_parent(device)); in acpi_smbus_hc_add()
265 hc->offset = (val >> 8) & 0xff; in acpi_smbus_hc_add()
266 hc->query_bit = val & 0xff; in acpi_smbus_hc_add()
267 device->driver_data = hc; in acpi_smbus_hc_add()
269 acpi_ec_add_query_handler(hc->ec, hc->query_bit, NULL, smbus_alarm, hc); in acpi_smbus_hc_add()
270 dev_info(&device->dev, "SBS HC: offset = 0x%0x, query_bit = 0x%0x\n", in acpi_smbus_hc_add()
271 hc->offset, hc->query_bit); in acpi_smbus_hc_add()
284 acpi_ec_remove_query_handler(hc->ec, hc->query_bit); in acpi_smbus_hc_remove()
287 device->driver_data = NULL; in acpi_smbus_hc_remove()