Lines Matching +full:client +full:- +full:id
2 * qt2160.c - Atmel AT42QT2160 Touch Sense Controller
63 int id; member
69 struct i2c_client *client; member
81 static int qt2160_read(struct i2c_client *client, u8 reg);
82 static int qt2160_write(struct i2c_client *client, u8 reg, u8 data);
89 struct qt2160_data *qt2160 = led->qt2160; in qt2160_led_work()
90 struct i2c_client *client = qt2160->client; in qt2160_led_work() local
91 int value = led->new_brightness; in qt2160_led_work()
94 mutex_lock(&qt2160->led_lock); in qt2160_led_work()
96 drive = qt2160_read(client, QT2160_CMD_DRIVE_X); in qt2160_led_work()
97 pwmen = qt2160_read(client, QT2160_CMD_PWMEN_X); in qt2160_led_work()
99 drive |= (1 << led->id); in qt2160_led_work()
100 pwmen |= (1 << led->id); in qt2160_led_work()
103 drive &= ~(1 << led->id); in qt2160_led_work()
104 pwmen &= ~(1 << led->id); in qt2160_led_work()
106 qt2160_write(client, QT2160_CMD_DRIVE_X, drive); in qt2160_led_work()
107 qt2160_write(client, QT2160_CMD_PWMEN_X, pwmen); in qt2160_led_work()
114 qt2160_write(client, QT2160_CMD_PWM_DUTY, value); in qt2160_led_work()
116 mutex_unlock(&qt2160->led_lock); in qt2160_led_work()
124 led->new_brightness = value; in qt2160_led_set()
125 schedule_work(&led->work); in qt2160_led_set()
130 static int qt2160_read_block(struct i2c_client *client, in qt2160_read_block() argument
140 if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { in qt2160_read_block()
142 error = i2c_smbus_write_byte(client, inireg + idx); in qt2160_read_block()
144 dev_err(&client->dev, in qt2160_read_block()
149 error = i2c_master_recv(client, buffer, count); in qt2160_read_block()
151 dev_err(&client->dev, in qt2160_read_block()
157 while (count--) { in qt2160_read_block()
160 error = i2c_smbus_write_byte(client, inireg + idx); in qt2160_read_block()
162 dev_err(&client->dev, in qt2160_read_block()
167 data = i2c_smbus_read_byte(client); in qt2160_read_block()
169 dev_err(&client->dev, in qt2160_read_block()
183 struct i2c_client *client = qt2160->client; in qt2160_get_key_matrix() local
184 struct input_dev *input = qt2160->input; in qt2160_get_key_matrix()
189 dev_dbg(&client->dev, "requesting keys...\n"); in qt2160_get_key_matrix()
195 ret = qt2160_read_block(client, QT2160_CMD_GSTAT, regs, 6); in qt2160_get_key_matrix()
197 dev_err(&client->dev, in qt2160_get_key_matrix()
202 old_matrix = qt2160->key_matrix; in qt2160_get_key_matrix()
203 qt2160->key_matrix = new_matrix = (regs[2] << 8) | regs[1]; in qt2160_get_key_matrix()
210 input_report_key(input, qt2160->keycodes[i], keyval); in qt2160_get_key_matrix()
211 dev_dbg(&client->dev, "key %d %s\n", in qt2160_get_key_matrix()
226 spin_lock_irqsave(&qt2160->lock, flags); in qt2160_irq()
228 mod_delayed_work(system_wq, &qt2160->dwork, 0); in qt2160_irq()
230 spin_unlock_irqrestore(&qt2160->lock, flags); in qt2160_irq()
237 spin_lock_irq(&qt2160->lock); in qt2160_schedule_read()
238 schedule_delayed_work(&qt2160->dwork, QT2160_CYCLE_INTERVAL); in qt2160_schedule_read()
239 spin_unlock_irq(&qt2160->lock); in qt2160_schedule_read()
247 dev_dbg(&qt2160->client->dev, "worker\n"); in qt2160_worker()
255 static int qt2160_read(struct i2c_client *client, u8 reg) in qt2160_read() argument
259 ret = i2c_smbus_write_byte(client, reg); in qt2160_read()
261 dev_err(&client->dev, in qt2160_read()
266 ret = i2c_smbus_read_byte(client); in qt2160_read()
268 dev_err(&client->dev, in qt2160_read()
276 static int qt2160_write(struct i2c_client *client, u8 reg, u8 data) in qt2160_write() argument
280 ret = i2c_smbus_write_byte_data(client, reg, data); in qt2160_write()
282 dev_err(&client->dev, in qt2160_write()
292 struct i2c_client *client = qt2160->client; in qt2160_register_leds() local
296 mutex_init(&qt2160->led_lock); in qt2160_register_leds()
299 struct qt2160_led *led = &qt2160->leds[i]; in qt2160_register_leds()
301 snprintf(led->name, sizeof(led->name), "qt2160:x%d", i); in qt2160_register_leds()
302 led->cdev.name = led->name; in qt2160_register_leds()
303 led->cdev.brightness_set = qt2160_led_set; in qt2160_register_leds()
304 led->cdev.brightness = LED_OFF; in qt2160_register_leds()
305 led->id = i; in qt2160_register_leds()
306 led->qt2160 = qt2160; in qt2160_register_leds()
308 INIT_WORK(&led->work, qt2160_led_work); in qt2160_register_leds()
310 ret = led_classdev_register(&client->dev, &led->cdev); in qt2160_register_leds()
316 qt2160_write(client, QT2160_CMD_DRIVE_X, 0); in qt2160_register_leds()
317 qt2160_write(client, QT2160_CMD_PWMEN_X, 0); in qt2160_register_leds()
318 qt2160_write(client, QT2160_CMD_PWM_DUTY, 0); in qt2160_register_leds()
328 led_classdev_unregister(&qt2160->leds[i].cdev); in qt2160_unregister_leds()
329 cancel_work_sync(&qt2160->leds[i].work); in qt2160_unregister_leds()
346 static bool qt2160_identify(struct i2c_client *client) in qt2160_identify() argument
348 int id, ver, rev; in qt2160_identify() local
350 /* Read Chid ID to check if chip is valid */ in qt2160_identify()
351 id = qt2160_read(client, QT2160_CMD_CHIPID); in qt2160_identify()
352 if (id != QT2160_VALID_CHIPID) { in qt2160_identify()
353 dev_err(&client->dev, "ID %d not supported\n", id); in qt2160_identify()
358 ver = qt2160_read(client, QT2160_CMD_CODEVER); in qt2160_identify()
360 dev_err(&client->dev, "could not get firmware version\n"); in qt2160_identify()
365 rev = qt2160_read(client, QT2160_CMD_SUBVER); in qt2160_identify()
367 dev_err(&client->dev, "could not get firmware revision\n"); in qt2160_identify()
371 dev_info(&client->dev, "AT42QT2160 firmware version %d.%d.%d\n", in qt2160_identify()
377 static int qt2160_probe(struct i2c_client *client, in qt2160_probe() argument
378 const struct i2c_device_id *id) in qt2160_probe() argument
386 error = i2c_check_functionality(client->adapter, in qt2160_probe()
389 dev_err(&client->dev, "%s adapter not supported\n", in qt2160_probe()
390 dev_driver_string(&client->adapter->dev)); in qt2160_probe()
391 return -ENODEV; in qt2160_probe()
394 if (!qt2160_identify(client)) in qt2160_probe()
395 return -ENODEV; in qt2160_probe()
401 dev_err(&client->dev, "insufficient memory\n"); in qt2160_probe()
402 error = -ENOMEM; in qt2160_probe()
406 qt2160->client = client; in qt2160_probe()
407 qt2160->input = input; in qt2160_probe()
408 INIT_DELAYED_WORK(&qt2160->dwork, qt2160_worker); in qt2160_probe()
409 spin_lock_init(&qt2160->lock); in qt2160_probe()
411 input->name = "AT42QT2160 Touch Sense Keyboard"; in qt2160_probe()
412 input->id.bustype = BUS_I2C; in qt2160_probe()
414 input->keycode = qt2160->keycodes; in qt2160_probe()
415 input->keycodesize = sizeof(qt2160->keycodes[0]); in qt2160_probe()
416 input->keycodemax = ARRAY_SIZE(qt2160_key2code); in qt2160_probe()
418 __set_bit(EV_KEY, input->evbit); in qt2160_probe()
419 __clear_bit(EV_REP, input->evbit); in qt2160_probe()
421 qt2160->keycodes[i] = qt2160_key2code[i]; in qt2160_probe()
422 __set_bit(qt2160_key2code[i], input->keybit); in qt2160_probe()
424 __clear_bit(KEY_RESERVED, input->keybit); in qt2160_probe()
427 error = qt2160_write(client, QT2160_CMD_CALIBRATE, 1); in qt2160_probe()
429 dev_err(&client->dev, "failed to calibrate device\n"); in qt2160_probe()
433 if (client->irq) { in qt2160_probe()
434 error = request_irq(client->irq, qt2160_irq, in qt2160_probe()
437 dev_err(&client->dev, in qt2160_probe()
438 "failed to allocate irq %d\n", client->irq); in qt2160_probe()
445 dev_err(&client->dev, "Failed to register leds\n"); in qt2160_probe()
449 error = input_register_device(qt2160->input); in qt2160_probe()
451 dev_err(&client->dev, in qt2160_probe()
456 i2c_set_clientdata(client, qt2160); in qt2160_probe()
464 if (client->irq) in qt2160_probe()
465 free_irq(client->irq, qt2160); in qt2160_probe()
472 static int qt2160_remove(struct i2c_client *client) in qt2160_remove() argument
474 struct qt2160_data *qt2160 = i2c_get_clientdata(client); in qt2160_remove()
479 if (client->irq) in qt2160_remove()
480 free_irq(client->irq, qt2160); in qt2160_remove()
482 cancel_delayed_work_sync(&qt2160->dwork); in qt2160_remove()
484 input_unregister_device(qt2160->input); in qt2160_remove()