Lines Matching refs:mcp
109 static int mcp_send_report(struct mcp2221 *mcp, in mcp_send_report() argument
120 ret = hid_hw_output_report(mcp->hdev, buf, len); in mcp_send_report()
133 static int mcp_send_data_req_status(struct mcp2221 *mcp, in mcp_send_data_req_status() argument
139 reinit_completion(&mcp->wait_in_report); in mcp_send_data_req_status()
141 ret = mcp_send_report(mcp, out_report, len); in mcp_send_data_req_status()
145 t = wait_for_completion_timeout(&mcp->wait_in_report, in mcp_send_data_req_status()
150 return mcp->status; in mcp_send_data_req_status()
154 static int mcp_chk_last_cmd_status(struct mcp2221 *mcp) in mcp_chk_last_cmd_status() argument
156 memset(mcp->txbuf, 0, 8); in mcp_chk_last_cmd_status()
157 mcp->txbuf[0] = MCP2221_I2C_PARAM_OR_STATUS; in mcp_chk_last_cmd_status()
159 return mcp_send_data_req_status(mcp, mcp->txbuf, 8); in mcp_chk_last_cmd_status()
163 static int mcp_cancel_last_cmd(struct mcp2221 *mcp) in mcp_cancel_last_cmd() argument
165 memset(mcp->txbuf, 0, 8); in mcp_cancel_last_cmd()
166 mcp->txbuf[0] = MCP2221_I2C_PARAM_OR_STATUS; in mcp_cancel_last_cmd()
167 mcp->txbuf[2] = MCP2221_I2C_CANCEL; in mcp_cancel_last_cmd()
169 return mcp_send_data_req_status(mcp, mcp->txbuf, 8); in mcp_cancel_last_cmd()
172 static int mcp_set_i2c_speed(struct mcp2221 *mcp) in mcp_set_i2c_speed() argument
176 memset(mcp->txbuf, 0, 8); in mcp_set_i2c_speed()
177 mcp->txbuf[0] = MCP2221_I2C_PARAM_OR_STATUS; in mcp_set_i2c_speed()
178 mcp->txbuf[3] = MCP2221_I2C_SET_SPEED; in mcp_set_i2c_speed()
179 mcp->txbuf[4] = mcp->cur_i2c_clk_div; in mcp_set_i2c_speed()
181 ret = mcp_send_data_req_status(mcp, mcp->txbuf, 8); in mcp_set_i2c_speed()
185 mcp_cancel_last_cmd(mcp); in mcp_set_i2c_speed()
199 static int mcp_i2c_write(struct mcp2221 *mcp, in mcp_i2c_write() argument
212 mcp->txbuf[0] = type; in mcp_i2c_write()
213 mcp->txbuf[1] = msg->len & 0xff; in mcp_i2c_write()
214 mcp->txbuf[2] = msg->len >> 8; in mcp_i2c_write()
215 mcp->txbuf[3] = (u8)(msg->addr << 1); in mcp_i2c_write()
217 memcpy(&mcp->txbuf[4], &msg->buf[idx], len); in mcp_i2c_write()
219 ret = mcp_send_data_req_status(mcp, mcp->txbuf, len + 4); in mcp_i2c_write()
226 ret = mcp_chk_last_cmd_status(mcp); in mcp_i2c_write()
257 static int mcp_i2c_smbus_read(struct mcp2221 *mcp, in mcp_i2c_smbus_read() argument
264 mcp->txbuf[0] = type; in mcp_i2c_smbus_read()
266 mcp->txbuf[1] = msg->len & 0xff; in mcp_i2c_smbus_read()
267 mcp->txbuf[2] = msg->len >> 8; in mcp_i2c_smbus_read()
268 mcp->txbuf[3] = (u8)(msg->addr << 1); in mcp_i2c_smbus_read()
270 mcp->rxbuf = msg->buf; in mcp_i2c_smbus_read()
272 mcp->txbuf[1] = smbus_len; in mcp_i2c_smbus_read()
273 mcp->txbuf[2] = 0; in mcp_i2c_smbus_read()
274 mcp->txbuf[3] = (u8)(smbus_addr << 1); in mcp_i2c_smbus_read()
276 mcp->rxbuf = smbus_buf; in mcp_i2c_smbus_read()
279 ret = mcp_send_data_req_status(mcp, mcp->txbuf, 4); in mcp_i2c_smbus_read()
283 mcp->rxbuf_idx = 0; in mcp_i2c_smbus_read()
286 memset(mcp->txbuf, 0, 4); in mcp_i2c_smbus_read()
287 mcp->txbuf[0] = MCP2221_I2C_GET_DATA; in mcp_i2c_smbus_read()
289 ret = mcp_send_data_req_status(mcp, mcp->txbuf, 1); in mcp_i2c_smbus_read()
293 ret = mcp_chk_last_cmd_status(mcp); in mcp_i2c_smbus_read()
298 } while (mcp->rxbuf_idx < total_len); in mcp_i2c_smbus_read()
307 struct mcp2221 *mcp = i2c_get_adapdata(adapter); in mcp_i2c_xfer() local
309 hid_hw_power(mcp->hdev, PM_HINT_FULLON); in mcp_i2c_xfer()
311 mutex_lock(&mcp->lock); in mcp_i2c_xfer()
314 ret = mcp_set_i2c_speed(mcp); in mcp_i2c_xfer()
320 ret = mcp_i2c_smbus_read(mcp, msgs, MCP2221_I2C_RD_DATA, in mcp_i2c_xfer()
323 ret = mcp_i2c_write(mcp, msgs, MCP2221_I2C_WR_DATA, 1); in mcp_i2c_xfer()
334 ret = mcp_i2c_write(mcp, &msgs[0], in mcp_i2c_xfer()
339 ret = mcp_i2c_smbus_read(mcp, &msgs[1], in mcp_i2c_xfer()
357 hid_hw_power(mcp->hdev, PM_HINT_NORMAL); in mcp_i2c_xfer()
358 mutex_unlock(&mcp->lock); in mcp_i2c_xfer()
362 static int mcp_smbus_write(struct mcp2221 *mcp, u16 addr, in mcp_smbus_write() argument
368 mcp->txbuf[0] = type; in mcp_smbus_write()
369 mcp->txbuf[1] = len + 1; /* 1 is due to command byte itself */ in mcp_smbus_write()
370 mcp->txbuf[2] = 0; in mcp_smbus_write()
371 mcp->txbuf[3] = (u8)(addr << 1); in mcp_smbus_write()
372 mcp->txbuf[4] = command; in mcp_smbus_write()
379 mcp->txbuf[5] = buf[0]; in mcp_smbus_write()
383 mcp->txbuf[5] = buf[0]; in mcp_smbus_write()
384 mcp->txbuf[6] = buf[1]; in mcp_smbus_write()
391 memcpy(&mcp->txbuf[5], buf, len); in mcp_smbus_write()
395 ret = mcp_send_data_req_status(mcp, mcp->txbuf, data_len); in mcp_smbus_write()
402 ret = mcp_chk_last_cmd_status(mcp); in mcp_smbus_write()
416 struct mcp2221 *mcp = i2c_get_adapdata(adapter); in mcp_smbus_xfer() local
418 hid_hw_power(mcp->hdev, PM_HINT_FULLON); in mcp_smbus_xfer()
420 mutex_lock(&mcp->lock); in mcp_smbus_xfer()
422 ret = mcp_set_i2c_speed(mcp); in mcp_smbus_xfer()
430 ret = mcp_i2c_smbus_read(mcp, NULL, MCP2221_I2C_RD_DATA, in mcp_smbus_xfer()
433 ret = mcp_smbus_write(mcp, addr, command, NULL, in mcp_smbus_xfer()
438 ret = mcp_i2c_smbus_read(mcp, NULL, MCP2221_I2C_RD_DATA, in mcp_smbus_xfer()
441 ret = mcp_smbus_write(mcp, addr, command, NULL, in mcp_smbus_xfer()
446 ret = mcp_smbus_write(mcp, addr, command, NULL, in mcp_smbus_xfer()
451 ret = mcp_i2c_smbus_read(mcp, NULL, in mcp_smbus_xfer()
455 ret = mcp_smbus_write(mcp, addr, command, &data->byte, in mcp_smbus_xfer()
461 ret = mcp_smbus_write(mcp, addr, command, NULL, in mcp_smbus_xfer()
466 ret = mcp_i2c_smbus_read(mcp, NULL, in mcp_smbus_xfer()
470 ret = mcp_smbus_write(mcp, addr, command, in mcp_smbus_xfer()
477 ret = mcp_smbus_write(mcp, addr, command, NULL, in mcp_smbus_xfer()
482 mcp->rxbuf_idx = 0; in mcp_smbus_xfer()
483 mcp->rxbuf = data->block; in mcp_smbus_xfer()
484 mcp->txbuf[0] = MCP2221_I2C_GET_DATA; in mcp_smbus_xfer()
485 ret = mcp_send_data_req_status(mcp, mcp->txbuf, 1); in mcp_smbus_xfer()
493 ret = mcp_smbus_write(mcp, addr, command, data->block, in mcp_smbus_xfer()
500 ret = mcp_smbus_write(mcp, addr, command, NULL, in mcp_smbus_xfer()
505 mcp->rxbuf_idx = 0; in mcp_smbus_xfer()
506 mcp->rxbuf = data->block; in mcp_smbus_xfer()
507 mcp->txbuf[0] = MCP2221_I2C_GET_DATA; in mcp_smbus_xfer()
508 ret = mcp_send_data_req_status(mcp, mcp->txbuf, 1); in mcp_smbus_xfer()
516 ret = mcp_smbus_write(mcp, addr, command, in mcp_smbus_xfer()
522 ret = mcp_smbus_write(mcp, addr, command, in mcp_smbus_xfer()
528 ret = mcp_i2c_smbus_read(mcp, NULL, in mcp_smbus_xfer()
533 ret = mcp_smbus_write(mcp, addr, command, data->block, in mcp_smbus_xfer()
539 ret = mcp_i2c_smbus_read(mcp, NULL, in mcp_smbus_xfer()
545 dev_err(&mcp->adapter.dev, in mcp_smbus_xfer()
551 hid_hw_power(mcp->hdev, PM_HINT_NORMAL); in mcp_smbus_xfer()
552 mutex_unlock(&mcp->lock); in mcp_smbus_xfer()
574 struct mcp2221 *mcp = gpiochip_get_data(gc); in mcp_gpio_get() local
576 mcp->txbuf[0] = MCP2221_GPIO_GET; in mcp_gpio_get()
578 mcp->gp_idx = offsetof(struct mcp_get_gpio, gpio[offset].value); in mcp_gpio_get()
580 mutex_lock(&mcp->lock); in mcp_gpio_get()
581 ret = mcp_send_data_req_status(mcp, mcp->txbuf, 1); in mcp_gpio_get()
582 mutex_unlock(&mcp->lock); in mcp_gpio_get()
590 struct mcp2221 *mcp = gpiochip_get_data(gc); in mcp_gpio_set() local
592 memset(mcp->txbuf, 0, 18); in mcp_gpio_set()
593 mcp->txbuf[0] = MCP2221_GPIO_SET; in mcp_gpio_set()
595 mcp->gp_idx = offsetof(struct mcp_set_gpio, gpio[offset].value); in mcp_gpio_set()
597 mcp->txbuf[mcp->gp_idx - 1] = 1; in mcp_gpio_set()
598 mcp->txbuf[mcp->gp_idx] = !!value; in mcp_gpio_set()
600 mutex_lock(&mcp->lock); in mcp_gpio_set()
601 mcp_send_data_req_status(mcp, mcp->txbuf, 18); in mcp_gpio_set()
602 mutex_unlock(&mcp->lock); in mcp_gpio_set()
605 static int mcp_gpio_dir_set(struct mcp2221 *mcp, in mcp_gpio_dir_set() argument
608 memset(mcp->txbuf, 0, 18); in mcp_gpio_dir_set()
609 mcp->txbuf[0] = MCP2221_GPIO_SET; in mcp_gpio_dir_set()
611 mcp->gp_idx = offsetof(struct mcp_set_gpio, gpio[offset].direction); in mcp_gpio_dir_set()
613 mcp->txbuf[mcp->gp_idx - 1] = 1; in mcp_gpio_dir_set()
614 mcp->txbuf[mcp->gp_idx] = val; in mcp_gpio_dir_set()
616 return mcp_send_data_req_status(mcp, mcp->txbuf, 18); in mcp_gpio_dir_set()
623 struct mcp2221 *mcp = gpiochip_get_data(gc); in mcp_gpio_direction_input() local
625 mutex_lock(&mcp->lock); in mcp_gpio_direction_input()
626 ret = mcp_gpio_dir_set(mcp, offset, MCP2221_DIR_IN); in mcp_gpio_direction_input()
627 mutex_unlock(&mcp->lock); in mcp_gpio_direction_input()
636 struct mcp2221 *mcp = gpiochip_get_data(gc); in mcp_gpio_direction_output() local
638 mutex_lock(&mcp->lock); in mcp_gpio_direction_output()
639 ret = mcp_gpio_dir_set(mcp, offset, MCP2221_DIR_OUT); in mcp_gpio_direction_output()
640 mutex_unlock(&mcp->lock); in mcp_gpio_direction_output()
655 struct mcp2221 *mcp = gpiochip_get_data(gc); in mcp_gpio_get_direction() local
657 mcp->txbuf[0] = MCP2221_GPIO_GET; in mcp_gpio_get_direction()
659 mcp->gp_idx = offsetof(struct mcp_get_gpio, gpio[offset].direction); in mcp_gpio_get_direction()
661 mutex_lock(&mcp->lock); in mcp_gpio_get_direction()
662 ret = mcp_send_data_req_status(mcp, mcp->txbuf, 1); in mcp_gpio_get_direction()
663 mutex_unlock(&mcp->lock); in mcp_gpio_get_direction()
668 if (mcp->gpio_dir == MCP2221_DIR_IN) in mcp_gpio_get_direction()
675 static int mcp_get_i2c_eng_state(struct mcp2221 *mcp, in mcp_get_i2c_eng_state() argument
717 struct mcp2221 *mcp = hid_get_drvdata(hdev); in mcp2221_raw_event() local
727 mcp->status = 0; in mcp2221_raw_event()
730 mcp->status = mcp_get_i2c_eng_state(mcp, data, 2); in mcp2221_raw_event()
732 complete(&mcp->wait_in_report); in mcp2221_raw_event()
738 if ((mcp->txbuf[3] == MCP2221_I2C_SET_SPEED) && in mcp2221_raw_event()
740 mcp->status = -EAGAIN; in mcp2221_raw_event()
744 mcp->status = -ENXIO; in mcp2221_raw_event()
747 mcp->status = mcp_get_i2c_eng_state(mcp, data, 8); in mcp2221_raw_event()
750 mcp->status = -EIO; in mcp2221_raw_event()
752 complete(&mcp->wait_in_report); in mcp2221_raw_event()
759 mcp->status = -ENXIO; in mcp2221_raw_event()
762 if (!mcp_get_i2c_eng_state(mcp, data, 2) in mcp2221_raw_event()
764 mcp->status = 0; in mcp2221_raw_event()
768 mcp->status = -EIO; in mcp2221_raw_event()
772 buf = mcp->rxbuf; in mcp2221_raw_event()
773 memcpy(&buf[mcp->rxbuf_idx], &data[4], data[3]); in mcp2221_raw_event()
774 mcp->rxbuf_idx = mcp->rxbuf_idx + data[3]; in mcp2221_raw_event()
775 mcp->status = 0; in mcp2221_raw_event()
778 mcp->status = -EIO; in mcp2221_raw_event()
781 mcp->status = -EIO; in mcp2221_raw_event()
783 complete(&mcp->wait_in_report); in mcp2221_raw_event()
789 if ((data[mcp->gp_idx] == MCP2221_ALT_F_NOT_GPIOV) || in mcp2221_raw_event()
790 (data[mcp->gp_idx + 1] == MCP2221_ALT_F_NOT_GPIOD)) { in mcp2221_raw_event()
791 mcp->status = -ENOENT; in mcp2221_raw_event()
793 mcp->status = !!data[mcp->gp_idx]; in mcp2221_raw_event()
794 mcp->gpio_dir = data[mcp->gp_idx + 1]; in mcp2221_raw_event()
798 mcp->status = -EAGAIN; in mcp2221_raw_event()
800 complete(&mcp->wait_in_report); in mcp2221_raw_event()
806 if ((data[mcp->gp_idx] == MCP2221_ALT_F_NOT_GPIOV) || in mcp2221_raw_event()
807 (data[mcp->gp_idx - 1] == MCP2221_ALT_F_NOT_GPIOV)) { in mcp2221_raw_event()
808 mcp->status = -ENOENT; in mcp2221_raw_event()
810 mcp->status = 0; in mcp2221_raw_event()
814 mcp->status = -EAGAIN; in mcp2221_raw_event()
816 complete(&mcp->wait_in_report); in mcp2221_raw_event()
820 mcp->status = -EIO; in mcp2221_raw_event()
821 complete(&mcp->wait_in_report); in mcp2221_raw_event()
831 struct mcp2221 *mcp; in mcp2221_probe() local
833 mcp = devm_kzalloc(&hdev->dev, sizeof(*mcp), GFP_KERNEL); in mcp2221_probe()
834 if (!mcp) in mcp2221_probe()
855 mutex_init(&mcp->lock); in mcp2221_probe()
856 init_completion(&mcp->wait_in_report); in mcp2221_probe()
857 hid_set_drvdata(hdev, mcp); in mcp2221_probe()
858 mcp->hdev = hdev; in mcp2221_probe()
865 mcp->cur_i2c_clk_div = (12000000 / (i2c_clk_freq * 1000)) - 3; in mcp2221_probe()
867 mcp->adapter.owner = THIS_MODULE; in mcp2221_probe()
868 mcp->adapter.class = I2C_CLASS_HWMON; in mcp2221_probe()
869 mcp->adapter.algo = &mcp_i2c_algo; in mcp2221_probe()
870 mcp->adapter.retries = 1; in mcp2221_probe()
871 mcp->adapter.dev.parent = &hdev->dev; in mcp2221_probe()
872 snprintf(mcp->adapter.name, sizeof(mcp->adapter.name), in mcp2221_probe()
876 ret = i2c_add_adapter(&mcp->adapter); in mcp2221_probe()
881 i2c_set_adapdata(&mcp->adapter, mcp); in mcp2221_probe()
884 mcp->gc = devm_kzalloc(&hdev->dev, sizeof(*mcp->gc), GFP_KERNEL); in mcp2221_probe()
885 if (!mcp->gc) { in mcp2221_probe()
890 mcp->gc->label = "mcp2221_gpio"; in mcp2221_probe()
891 mcp->gc->direction_input = mcp_gpio_direction_input; in mcp2221_probe()
892 mcp->gc->direction_output = mcp_gpio_direction_output; in mcp2221_probe()
893 mcp->gc->get_direction = mcp_gpio_get_direction; in mcp2221_probe()
894 mcp->gc->set = mcp_gpio_set; in mcp2221_probe()
895 mcp->gc->get = mcp_gpio_get; in mcp2221_probe()
896 mcp->gc->ngpio = MCP_NGPIO; in mcp2221_probe()
897 mcp->gc->base = -1; in mcp2221_probe()
898 mcp->gc->can_sleep = 1; in mcp2221_probe()
899 mcp->gc->parent = &hdev->dev; in mcp2221_probe()
901 ret = devm_gpiochip_add_data(&hdev->dev, mcp->gc, mcp); in mcp2221_probe()
908 i2c_del_adapter(&mcp->adapter); in mcp2221_probe()
910 hid_hw_close(mcp->hdev); in mcp2221_probe()
912 hid_hw_stop(mcp->hdev); in mcp2221_probe()
918 struct mcp2221 *mcp = hid_get_drvdata(hdev); in mcp2221_remove() local
920 i2c_del_adapter(&mcp->adapter); in mcp2221_remove()
921 hid_hw_close(mcp->hdev); in mcp2221_remove()
922 hid_hw_stop(mcp->hdev); in mcp2221_remove()