• Home
  • Raw
  • Download

Lines Matching full:master

2  * A FSI master controller, using a simple GPIO bit-banging interface
17 #include "fsi-master.h"
23 struct fsi_master master; member
41 #define to_fsi_master_gpio(m) container_of(m, struct fsi_master_gpio, master)
48 static void clock_toggle(struct fsi_master_gpio *master, int count) in clock_toggle() argument
53 if (!master->no_delays) in clock_toggle()
55 gpiod_set_value(master->gpio_clk, 0); in clock_toggle()
56 if (!master->no_delays) in clock_toggle()
58 gpiod_set_value(master->gpio_clk, 1); in clock_toggle()
62 static int sda_clock_in(struct fsi_master_gpio *master) in sda_clock_in() argument
66 if (!master->no_delays) in sda_clock_in()
68 gpiod_set_value(master->gpio_clk, 0); in sda_clock_in()
71 gpiod_get_value(master->gpio_data); in sda_clock_in()
74 in = gpiod_get_value(master->gpio_data); in sda_clock_in()
75 if (!master->no_delays) in sda_clock_in()
77 gpiod_set_value(master->gpio_clk, 1); in sda_clock_in()
81 static void sda_out(struct fsi_master_gpio *master, int value) in sda_out() argument
83 gpiod_set_value(master->gpio_data, value); in sda_out()
86 static void set_sda_input(struct fsi_master_gpio *master) in set_sda_input() argument
88 gpiod_direction_input(master->gpio_data); in set_sda_input()
89 gpiod_set_value(master->gpio_trans, 0); in set_sda_input()
92 static void set_sda_output(struct fsi_master_gpio *master, int value) in set_sda_output() argument
94 gpiod_set_value(master->gpio_trans, 1); in set_sda_output()
95 gpiod_direction_output(master->gpio_data, value); in set_sda_output()
98 static void clock_zeros(struct fsi_master_gpio *master, int count) in clock_zeros() argument
100 trace_fsi_master_gpio_clock_zeros(master, count); in clock_zeros()
101 set_sda_output(master, 1); in clock_zeros()
102 clock_toggle(master, count); in clock_zeros()
105 static void echo_delay(struct fsi_master_gpio *master) in echo_delay() argument
107 clock_zeros(master, master->t_echo_delay); in echo_delay()
111 static void serial_in(struct fsi_master_gpio *master, struct fsi_gpio_msg *msg, in serial_in() argument
116 set_sda_input(master); in serial_in()
119 in_bit = sda_clock_in(master); in serial_in()
125 trace_fsi_master_gpio_in(master, num_bits, msg->msg); in serial_in()
128 static void serial_out(struct fsi_master_gpio *master, in serial_out() argument
137 trace_fsi_master_gpio_out(master, cmd->bits, cmd->msg); in serial_out()
140 dev_warn(master->dev, "trying to output 0 bits\n"); in serial_out()
143 set_sda_output(master, 0); in serial_out()
146 sda_out(master, 0); in serial_out()
147 clock_toggle(master, 1); in serial_out()
153 sda_out(master, next_bit); in serial_out()
156 clock_toggle(master, 1); in serial_out()
184 static bool check_same_address(struct fsi_master_gpio *master, int id, in check_same_address() argument
188 return master->last_addr == (((id & 0x3) << 21) | (addr & ~0x3)); in check_same_address()
191 static bool check_relative_address(struct fsi_master_gpio *master, int id, in check_relative_address() argument
194 uint32_t last_addr = master->last_addr; in check_relative_address()
221 static void last_address_update(struct fsi_master_gpio *master, in last_address_update() argument
225 master->last_addr = LAST_ADDR_INVALID; in last_address_update()
227 master->last_addr = ((id & 0x3) << 21) | (addr & ~0x3); in last_address_update()
233 static void build_ar_command(struct fsi_master_gpio *master, in build_ar_command() argument
251 if (check_same_address(master, id, addr)) { in build_ar_command()
256 trace_fsi_master_gpio_cmd_same_addr(master); in build_ar_command()
258 } else if (check_relative_address(master, id, addr, &rel_addr)) { in build_ar_command()
263 trace_fsi_master_gpio_cmd_rel_addr(master, rel_addr); in build_ar_command()
268 trace_fsi_master_gpio_cmd_abs_addr(master, addr); in build_ar_command()
333 static int read_one_response(struct fsi_master_gpio *master, in read_one_response() argument
348 serial_in(master, &msg, 1); in read_one_response()
353 dev_dbg(master->dev, in read_one_response()
354 "Master time out waiting for response\n"); in read_one_response()
363 serial_in(master, &msg, 4); in read_one_response()
369 serial_in(master, &msg, data_size * 8); in read_one_response()
372 serial_in(master, &msg, FSI_CRC_SIZE); in read_one_response()
383 dev_dbg(master->dev, "ERR response CRC msg: 0x%016llx (%d bits)\n", in read_one_response()
396 static int issue_term(struct fsi_master_gpio *master, uint8_t slave) in issue_term() argument
406 serial_out(master, &cmd); in issue_term()
407 echo_delay(master); in issue_term()
410 rc = read_one_response(master, 0, NULL, &tag); in issue_term()
412 dev_err(master->dev, in issue_term()
416 dev_err(master->dev, "TERM failed; response %d\n", tag); in issue_term()
423 static int poll_for_response(struct fsi_master_gpio *master, in poll_for_response() argument
433 rc = read_one_response(master, size, &response, &tag); in poll_for_response()
446 dev_dbg(master->dev, in poll_for_response()
448 trace_fsi_master_gpio_crc_rsp_error(master); in poll_for_response()
451 clock_zeros(master, FSI_MASTER_EPOLL_CLOCKS); in poll_for_response()
452 serial_out(master, &cmd); in poll_for_response()
453 echo_delay(master); in poll_for_response()
482 clock_zeros(master, FSI_MASTER_DPOLL_CLOCKS); in poll_for_response()
483 serial_out(master, &cmd); in poll_for_response()
484 echo_delay(master); in poll_for_response()
488 dev_warn(master->dev, in poll_for_response()
491 clock_zeros(master, FSI_MASTER_DPOLL_CLOCKS); in poll_for_response()
493 issue_term(master, slave); in poll_for_response()
498 dev_dbg(master->dev, "ERRA received: 0x%x\n", (int)response.msg); in poll_for_response()
502 dev_dbg(master->dev, "ERRC received: 0x%x\n", (int)response.msg); in poll_for_response()
503 trace_fsi_master_gpio_crc_cmd_error(master); in poll_for_response()
509 trace_fsi_master_gpio_poll_response_busy(master, busy_count); in poll_for_response()
516 clock_zeros(master, master->t_send_delay); in poll_for_response()
522 static int send_request(struct fsi_master_gpio *master, in send_request() argument
527 if (master->external_mode) in send_request()
531 serial_out(master, cmd); in send_request()
532 echo_delay(master); in send_request()
538 static int fsi_master_gpio_xfer(struct fsi_master_gpio *master, uint8_t slave, in fsi_master_gpio_xfer() argument
544 rc = send_request(master, cmd); in fsi_master_gpio_xfer()
547 rc = poll_for_response(master, slave, resp_len, resp); in fsi_master_gpio_xfer()
551 dev_warn(master->dev, "ECRC retry %d\n", retries); in fsi_master_gpio_xfer()
563 struct fsi_master_gpio *master = to_fsi_master_gpio(_master); in fsi_master_gpio_read() local
570 mutex_lock(&master->cmd_lock); in fsi_master_gpio_read()
571 build_ar_command(master, &cmd, id, addr, size, NULL); in fsi_master_gpio_read()
572 rc = fsi_master_gpio_xfer(master, id, &cmd, size, val); in fsi_master_gpio_read()
573 last_address_update(master, id, rc == 0, addr); in fsi_master_gpio_read()
574 mutex_unlock(&master->cmd_lock); in fsi_master_gpio_read()
582 struct fsi_master_gpio *master = to_fsi_master_gpio(_master); in fsi_master_gpio_write() local
589 mutex_lock(&master->cmd_lock); in fsi_master_gpio_write()
590 build_ar_command(master, &cmd, id, addr, size, val); in fsi_master_gpio_write()
591 rc = fsi_master_gpio_xfer(master, id, &cmd, 0, NULL); in fsi_master_gpio_write()
592 last_address_update(master, id, rc == 0, addr); in fsi_master_gpio_write()
593 mutex_unlock(&master->cmd_lock); in fsi_master_gpio_write()
601 struct fsi_master_gpio *master = to_fsi_master_gpio(_master); in fsi_master_gpio_term() local
608 mutex_lock(&master->cmd_lock); in fsi_master_gpio_term()
610 rc = fsi_master_gpio_xfer(master, id, &cmd, 0, NULL); in fsi_master_gpio_term()
611 last_address_update(master, id, false, 0); in fsi_master_gpio_term()
612 mutex_unlock(&master->cmd_lock); in fsi_master_gpio_term()
619 struct fsi_master_gpio *master = to_fsi_master_gpio(_master); in fsi_master_gpio_break() local
625 trace_fsi_master_gpio_break(master); in fsi_master_gpio_break()
627 mutex_lock(&master->cmd_lock); in fsi_master_gpio_break()
628 if (master->external_mode) { in fsi_master_gpio_break()
629 mutex_unlock(&master->cmd_lock); in fsi_master_gpio_break()
635 set_sda_output(master, 1); in fsi_master_gpio_break()
636 sda_out(master, 1); in fsi_master_gpio_break()
637 clock_toggle(master, FSI_PRE_BREAK_CLOCKS); in fsi_master_gpio_break()
638 sda_out(master, 0); in fsi_master_gpio_break()
639 clock_toggle(master, FSI_BREAK_CLOCKS); in fsi_master_gpio_break()
640 echo_delay(master); in fsi_master_gpio_break()
641 sda_out(master, 1); in fsi_master_gpio_break()
642 clock_toggle(master, FSI_POST_BREAK_CLOCKS); in fsi_master_gpio_break()
646 last_address_update(master, 0, false, 0); in fsi_master_gpio_break()
647 mutex_unlock(&master->cmd_lock); in fsi_master_gpio_break()
655 static void fsi_master_gpio_init(struct fsi_master_gpio *master) in fsi_master_gpio_init() argument
659 gpiod_direction_output(master->gpio_mux, 1); in fsi_master_gpio_init()
660 gpiod_direction_output(master->gpio_trans, 1); in fsi_master_gpio_init()
661 gpiod_direction_output(master->gpio_enable, 1); in fsi_master_gpio_init()
662 gpiod_direction_output(master->gpio_clk, 1); in fsi_master_gpio_init()
663 gpiod_direction_output(master->gpio_data, 1); in fsi_master_gpio_init()
667 clock_zeros(master, FSI_INIT_CLOCKS); in fsi_master_gpio_init()
671 static void fsi_master_gpio_init_external(struct fsi_master_gpio *master) in fsi_master_gpio_init_external() argument
673 gpiod_direction_output(master->gpio_mux, 0); in fsi_master_gpio_init_external()
674 gpiod_direction_output(master->gpio_trans, 0); in fsi_master_gpio_init_external()
675 gpiod_direction_output(master->gpio_enable, 1); in fsi_master_gpio_init_external()
676 gpiod_direction_input(master->gpio_clk); in fsi_master_gpio_init_external()
677 gpiod_direction_input(master->gpio_data); in fsi_master_gpio_init_external()
682 struct fsi_master_gpio *master = to_fsi_master_gpio(_master); in fsi_master_gpio_link_enable() local
688 mutex_lock(&master->cmd_lock); in fsi_master_gpio_link_enable()
689 if (!master->external_mode) { in fsi_master_gpio_link_enable()
690 gpiod_set_value(master->gpio_enable, 1); in fsi_master_gpio_link_enable()
693 mutex_unlock(&master->cmd_lock); in fsi_master_gpio_link_enable()
701 struct fsi_master_gpio *master = to_fsi_master_gpio(_master); in fsi_master_gpio_link_config() local
706 mutex_lock(&master->cmd_lock); in fsi_master_gpio_link_config()
707 master->t_send_delay = t_send_delay; in fsi_master_gpio_link_config()
708 master->t_echo_delay = t_echo_delay; in fsi_master_gpio_link_config()
709 mutex_unlock(&master->cmd_lock); in fsi_master_gpio_link_config()
717 struct fsi_master_gpio *master = dev_get_drvdata(dev); in external_mode_show() local
720 master->external_mode ? 1 : 0); in external_mode_show()
726 struct fsi_master_gpio *master = dev_get_drvdata(dev); in external_mode_store() local
737 mutex_lock(&master->cmd_lock); in external_mode_store()
739 if (external_mode == master->external_mode) { in external_mode_store()
740 mutex_unlock(&master->cmd_lock); in external_mode_store()
744 master->external_mode = external_mode; in external_mode_store()
745 if (master->external_mode) in external_mode_store()
746 fsi_master_gpio_init_external(master); in external_mode_store()
748 fsi_master_gpio_init(master); in external_mode_store()
750 mutex_unlock(&master->cmd_lock); in external_mode_store()
752 fsi_master_rescan(&master->master); in external_mode_store()
762 struct fsi_master_gpio *master = to_fsi_master_gpio(dev_to_fsi_master(dev)); in fsi_master_gpio_release() local
764 of_node_put(dev_of_node(master->dev)); in fsi_master_gpio_release()
766 kfree(master); in fsi_master_gpio_release()
771 struct fsi_master_gpio *master; in fsi_master_gpio_probe() local
775 master = kzalloc(sizeof(*master), GFP_KERNEL); in fsi_master_gpio_probe()
776 if (!master) in fsi_master_gpio_probe()
779 master->dev = &pdev->dev; in fsi_master_gpio_probe()
780 master->master.dev.parent = master->dev; in fsi_master_gpio_probe()
781 master->master.dev.of_node = of_node_get(dev_of_node(master->dev)); in fsi_master_gpio_probe()
782 master->master.dev.release = fsi_master_gpio_release; in fsi_master_gpio_probe()
783 master->last_addr = LAST_ADDR_INVALID; in fsi_master_gpio_probe()
791 master->gpio_clk = gpio; in fsi_master_gpio_probe()
799 master->gpio_data = gpio; in fsi_master_gpio_probe()
808 master->gpio_trans = gpio; in fsi_master_gpio_probe()
816 master->gpio_enable = gpio; in fsi_master_gpio_probe()
824 master->gpio_mux = gpio; in fsi_master_gpio_probe()
831 master->no_delays = device_property_present(&pdev->dev, "no-gpio-delays"); in fsi_master_gpio_probe()
834 master->t_send_delay = FSI_SEND_DELAY_CLOCKS; in fsi_master_gpio_probe()
835 master->t_echo_delay = FSI_ECHO_DELAY_CLOCKS; in fsi_master_gpio_probe()
837 master->master.n_links = 1; in fsi_master_gpio_probe()
838 master->master.flags = FSI_MASTER_FLAG_SWCLOCK; in fsi_master_gpio_probe()
839 master->master.read = fsi_master_gpio_read; in fsi_master_gpio_probe()
840 master->master.write = fsi_master_gpio_write; in fsi_master_gpio_probe()
841 master->master.term = fsi_master_gpio_term; in fsi_master_gpio_probe()
842 master->master.send_break = fsi_master_gpio_break; in fsi_master_gpio_probe()
843 master->master.link_enable = fsi_master_gpio_link_enable; in fsi_master_gpio_probe()
844 master->master.link_config = fsi_master_gpio_link_config; in fsi_master_gpio_probe()
845 platform_set_drvdata(pdev, master); in fsi_master_gpio_probe()
846 mutex_init(&master->cmd_lock); in fsi_master_gpio_probe()
848 fsi_master_gpio_init(master); in fsi_master_gpio_probe()
854 rc = fsi_master_register(&master->master); in fsi_master_gpio_probe()
857 put_device(&master->master.dev); in fsi_master_gpio_probe()
862 kfree(master); in fsi_master_gpio_probe()
870 struct fsi_master_gpio *master = platform_get_drvdata(pdev); in fsi_master_gpio_remove() local
874 fsi_master_unregister(&master->master); in fsi_master_gpio_remove()
880 { .compatible = "fsi-master-gpio" },
886 .name = "fsi-master-gpio",