Lines Matching refs:hc

91 static inline int smb_hc_read(struct acpi_smb_hc *hc, u8 address, u8 *data)  in smb_hc_read()  argument
93 return ec_read(hc->offset + address, data); in smb_hc_read()
96 static inline int smb_hc_write(struct acpi_smb_hc *hc, u8 address, u8 data) in smb_hc_write() argument
98 return ec_write(hc->offset + address, data); in smb_hc_write()
101 static int wait_transaction_complete(struct acpi_smb_hc *hc, int timeout) in wait_transaction_complete() argument
103 if (wait_event_timeout(hc->wait, hc->done, msecs_to_jiffies(timeout))) in wait_transaction_complete()
108 static int acpi_smbus_transaction(struct acpi_smb_hc *hc, u8 protocol, in acpi_smbus_transaction() argument
114 if (!hc) { in acpi_smbus_transaction()
119 mutex_lock(&hc->lock); in acpi_smbus_transaction()
120 hc->done = false; in acpi_smbus_transaction()
121 if (smb_hc_read(hc, ACPI_SMB_PROTOCOL, &temp)) in acpi_smbus_transaction()
127 smb_hc_write(hc, ACPI_SMB_COMMAND, command); in acpi_smbus_transaction()
129 smb_hc_write(hc, ACPI_SMB_BLOCK_COUNT, length); in acpi_smbus_transaction()
131 smb_hc_write(hc, ACPI_SMB_DATA + i, data[i]); in acpi_smbus_transaction()
133 smb_hc_write(hc, ACPI_SMB_ADDRESS, address << 1); in acpi_smbus_transaction()
134 smb_hc_write(hc, ACPI_SMB_PROTOCOL, protocol); in acpi_smbus_transaction()
139 ret = wait_transaction_complete(hc, 1000); in acpi_smbus_transaction()
151 if (smb_hc_read(hc, ACPI_SMB_BLOCK_COUNT, &sz)) { in acpi_smbus_transaction()
159 smb_hc_read(hc, ACPI_SMB_DATA + i, &data[i]); in acpi_smbus_transaction()
161 mutex_unlock(&hc->lock); in acpi_smbus_transaction()
165 int acpi_smbus_read(struct acpi_smb_hc *hc, u8 protocol, u8 address, in acpi_smbus_read() argument
168 return acpi_smbus_transaction(hc, protocol, address, command, data, 0); in acpi_smbus_read()
173 int acpi_smbus_write(struct acpi_smb_hc *hc, u8 protocol, u8 address, in acpi_smbus_write() argument
176 return acpi_smbus_transaction(hc, protocol, address, command, data, length); in acpi_smbus_write()
181 int acpi_smbus_register_callback(struct acpi_smb_hc *hc, in acpi_smbus_register_callback() argument
184 mutex_lock(&hc->lock); in acpi_smbus_register_callback()
185 hc->callback = callback; in acpi_smbus_register_callback()
186 hc->context = context; in acpi_smbus_register_callback()
187 mutex_unlock(&hc->lock); in acpi_smbus_register_callback()
193 int acpi_smbus_unregister_callback(struct acpi_smb_hc *hc) in acpi_smbus_unregister_callback() argument
195 mutex_lock(&hc->lock); in acpi_smbus_unregister_callback()
196 hc->callback = NULL; in acpi_smbus_unregister_callback()
197 hc->context = NULL; in acpi_smbus_unregister_callback()
198 mutex_unlock(&hc->lock); in acpi_smbus_unregister_callback()
206 struct acpi_smb_hc *hc = context; in acpi_smbus_callback() local
207 if (hc->callback) in acpi_smbus_callback()
208 hc->callback(hc->context); in acpi_smbus_callback()
213 struct acpi_smb_hc *hc = context; in smbus_alarm() local
216 if (smb_hc_read(hc, ACPI_SMB_STATUS, &status.raw)) in smbus_alarm()
220 hc->done = true; in smbus_alarm()
221 wake_up(&hc->wait); in smbus_alarm()
225 mutex_lock(&hc->lock); in smbus_alarm()
226 smb_hc_read(hc, ACPI_SMB_ALARM_ADDRESS, &address); in smbus_alarm()
228 smb_hc_write(hc, ACPI_SMB_STATUS, status.raw); in smbus_alarm()
235 acpi_smbus_callback, hc); in smbus_alarm()
238 mutex_unlock(&hc->lock); in smbus_alarm()
252 struct acpi_smb_hc *hc; in acpi_smbus_hc_add() local
266 hc = kzalloc(sizeof(struct acpi_smb_hc), GFP_KERNEL); in acpi_smbus_hc_add()
267 if (!hc) in acpi_smbus_hc_add()
269 mutex_init(&hc->lock); in acpi_smbus_hc_add()
270 init_waitqueue_head(&hc->wait); in acpi_smbus_hc_add()
272 hc->ec = acpi_driver_data(device->parent); in acpi_smbus_hc_add()
273 hc->offset = (val >> 8) & 0xff; in acpi_smbus_hc_add()
274 hc->query_bit = val & 0xff; in acpi_smbus_hc_add()
275 device->driver_data = hc; in acpi_smbus_hc_add()
277 acpi_ec_add_query_handler(hc->ec, hc->query_bit, NULL, smbus_alarm, hc); in acpi_smbus_hc_add()
279 hc->ec, hc->offset, hc->query_bit); in acpi_smbus_hc_add()
288 struct acpi_smb_hc *hc; in acpi_smbus_hc_remove() local
293 hc = acpi_driver_data(device); in acpi_smbus_hc_remove()
294 acpi_ec_remove_query_handler(hc->ec, hc->query_bit); in acpi_smbus_hc_remove()
295 kfree(hc); in acpi_smbus_hc_remove()