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

1 // SPDX-License-Identifier: GPL-2.0-only
80 ACPI_SMB_ADDRESS = 2, /* address */
82 ACPI_SMB_DATA = 4, /* 32 data registers */
83 ACPI_SMB_BLOCK_COUNT = 0x24, /* number of data bytes */
84 ACPI_SMB_ALARM_ADDRESS = 0x25, /* alarm address */
85 ACPI_SMB_ALARM_DATA = 0x26, /* 2 bytes alarm data */
88 static inline int smb_hc_read(struct acpi_smb_hc *hc, u8 address, u8 *data) in smb_hc_read() argument
90 return ec_read(hc->offset + address, data); in smb_hc_read()
93 static inline int smb_hc_write(struct acpi_smb_hc *hc, u8 address, u8 data) in smb_hc_write() argument
95 return ec_write(hc->offset + address, data); in smb_hc_write()
100 if (wait_event_timeout(hc->wait, hc->done, msecs_to_jiffies(timeout))) in wait_transaction_complete()
102 return -ETIME; in wait_transaction_complete()
106 u8 address, u8 command, u8 *data, u8 length) in acpi_smbus_transaction() argument
108 int ret = -EFAULT, i; in acpi_smbus_transaction()
116 mutex_lock(&hc->lock); in acpi_smbus_transaction()
117 hc->done = false; in acpi_smbus_transaction()
121 ret = -EBUSY; in acpi_smbus_transaction()
128 smb_hc_write(hc, ACPI_SMB_DATA + i, data[i]); in acpi_smbus_transaction()
130 smb_hc_write(hc, ACPI_SMB_ADDRESS, address << 1); in acpi_smbus_transaction()
133 * Wait for completion. Save the status code, data size, in acpi_smbus_transaction()
134 * and data into the return package (if required by the protocol). in acpi_smbus_transaction()
149 ret = -EFAULT; in acpi_smbus_transaction()
156 smb_hc_read(hc, ACPI_SMB_DATA + i, &data[i]); in acpi_smbus_transaction()
158 mutex_unlock(&hc->lock); in acpi_smbus_transaction()
162 int acpi_smbus_read(struct acpi_smb_hc *hc, u8 protocol, u8 address, in acpi_smbus_read() argument
163 u8 command, u8 *data) in acpi_smbus_read() argument
165 return acpi_smbus_transaction(hc, protocol, address, command, data, 0); in acpi_smbus_read()
170 int acpi_smbus_write(struct acpi_smb_hc *hc, u8 protocol, u8 address, in acpi_smbus_write() argument
171 u8 command, u8 *data, u8 length) in acpi_smbus_write() argument
173 return acpi_smbus_transaction(hc, protocol, address, command, data, length); in acpi_smbus_write()
181 mutex_lock(&hc->lock); in acpi_smbus_register_callback()
182 hc->callback = callback; in acpi_smbus_register_callback()
183 hc->context = context; in acpi_smbus_register_callback()
184 mutex_unlock(&hc->lock); in acpi_smbus_register_callback()
192 mutex_lock(&hc->lock); in acpi_smbus_unregister_callback()
193 hc->callback = NULL; in acpi_smbus_unregister_callback()
194 hc->context = NULL; in acpi_smbus_unregister_callback()
195 mutex_unlock(&hc->lock); in acpi_smbus_unregister_callback()
205 if (hc->callback) in acpi_smbus_callback()
206 hc->callback(hc->context); in acpi_smbus_callback()
213 u8 address; in smbus_alarm() local
218 hc->done = true; in smbus_alarm()
219 wake_up(&hc->wait); in smbus_alarm()
223 mutex_lock(&hc->lock); in smbus_alarm()
224 smb_hc_read(hc, ACPI_SMB_ALARM_ADDRESS, &address); in smbus_alarm()
228 switch (address >> 1) { in smbus_alarm()
235 mutex_unlock(&hc->lock); in smbus_alarm()
239 typedef int (*acpi_ec_query_func) (void *data);
243 void *data);
252 return -EINVAL; in acpi_smbus_hc_add()
254 status = acpi_evaluate_integer(device->handle, "_EC", NULL, &val); in acpi_smbus_hc_add()
257 return -EIO; in acpi_smbus_hc_add()
265 return -ENOMEM; in acpi_smbus_hc_add()
266 mutex_init(&hc->lock); in acpi_smbus_hc_add()
267 init_waitqueue_head(&hc->wait); in acpi_smbus_hc_add()
269 hc->ec = acpi_driver_data(acpi_dev_parent(device)); in acpi_smbus_hc_add()
270 hc->offset = (val >> 8) & 0xff; in acpi_smbus_hc_add()
271 hc->query_bit = val & 0xff; in acpi_smbus_hc_add()
272 device->driver_data = hc; in acpi_smbus_hc_add()
274 acpi_ec_add_query_handler(hc->ec, hc->query_bit, NULL, smbus_alarm, hc); in acpi_smbus_hc_add()
275 dev_info(&device->dev, "SBS HC: offset = 0x%0x, query_bit = 0x%0x\n", in acpi_smbus_hc_add()
276 hc->offset, hc->query_bit); in acpi_smbus_hc_add()
291 acpi_ec_remove_query_handler(hc->ec, hc->query_bit); in acpi_smbus_hc_remove()
294 device->driver_data = NULL; in acpi_smbus_hc_remove()