Lines Matching refs:pt1
73 struct pt1 { struct
90 struct pt1 *pt1; argument
112 static void pt1_write_reg(struct pt1 *pt1, int reg, u32 data) in pt1_write_reg() argument
114 writel(data, pt1->regs + reg * 4); in pt1_write_reg()
117 static u32 pt1_read_reg(struct pt1 *pt1, int reg) in pt1_read_reg() argument
119 return readl(pt1->regs + reg * 4); in pt1_read_reg()
125 static void pt1_increment_table_count(struct pt1 *pt1) in pt1_increment_table_count() argument
127 pt1_write_reg(pt1, 0, 0x00000020); in pt1_increment_table_count()
130 static void pt1_init_table_count(struct pt1 *pt1) in pt1_init_table_count() argument
132 pt1_write_reg(pt1, 0, 0x00000010); in pt1_init_table_count()
135 static void pt1_register_tables(struct pt1 *pt1, u32 first_pfn) in pt1_register_tables() argument
137 pt1_write_reg(pt1, 5, first_pfn); in pt1_register_tables()
138 pt1_write_reg(pt1, 0, 0x0c000040); in pt1_register_tables()
141 static void pt1_unregister_tables(struct pt1 *pt1) in pt1_unregister_tables() argument
143 pt1_write_reg(pt1, 0, 0x08080000); in pt1_unregister_tables()
146 static int pt1_sync(struct pt1 *pt1) in pt1_sync() argument
150 if (pt1_read_reg(pt1, 0) & 0x20000000) in pt1_sync()
152 pt1_write_reg(pt1, 0, 0x00000008); in pt1_sync()
154 dev_err(&pt1->pdev->dev, "could not sync\n"); in pt1_sync()
158 static u64 pt1_identify(struct pt1 *pt1) in pt1_identify() argument
164 id |= (u64)(pt1_read_reg(pt1, 0) >> 30 & 1) << i; in pt1_identify()
165 pt1_write_reg(pt1, 0, 0x00000008); in pt1_identify()
170 static int pt1_unlock(struct pt1 *pt1) in pt1_unlock() argument
173 pt1_write_reg(pt1, 0, 0x00000008); in pt1_unlock()
175 if (pt1_read_reg(pt1, 0) & 0x80000000) in pt1_unlock()
179 dev_err(&pt1->pdev->dev, "could not unlock\n"); in pt1_unlock()
183 static int pt1_reset_pci(struct pt1 *pt1) in pt1_reset_pci() argument
186 pt1_write_reg(pt1, 0, 0x01010000); in pt1_reset_pci()
187 pt1_write_reg(pt1, 0, 0x01000000); in pt1_reset_pci()
189 if (pt1_read_reg(pt1, 0) & 0x00000001) in pt1_reset_pci()
193 dev_err(&pt1->pdev->dev, "could not reset PCI\n"); in pt1_reset_pci()
197 static int pt1_reset_ram(struct pt1 *pt1) in pt1_reset_ram() argument
200 pt1_write_reg(pt1, 0, 0x02020000); in pt1_reset_ram()
201 pt1_write_reg(pt1, 0, 0x02000000); in pt1_reset_ram()
203 if (pt1_read_reg(pt1, 0) & 0x00000002) in pt1_reset_ram()
207 dev_err(&pt1->pdev->dev, "could not reset RAM\n"); in pt1_reset_ram()
211 static int pt1_do_enable_ram(struct pt1 *pt1) in pt1_do_enable_ram() argument
215 status = pt1_read_reg(pt1, 0) & 0x00000004; in pt1_do_enable_ram()
216 pt1_write_reg(pt1, 0, 0x00000002); in pt1_do_enable_ram()
219 if ((pt1_read_reg(pt1, 0) & 0x00000004) != status) in pt1_do_enable_ram()
224 dev_err(&pt1->pdev->dev, "could not enable RAM\n"); in pt1_do_enable_ram()
228 static int pt1_enable_ram(struct pt1 *pt1) in pt1_enable_ram() argument
233 phase = pt1->pdev->device == 0x211a ? 128 : 166; in pt1_enable_ram()
235 ret = pt1_do_enable_ram(pt1); in pt1_enable_ram()
242 static void pt1_disable_ram(struct pt1 *pt1) in pt1_disable_ram() argument
244 pt1_write_reg(pt1, 0, 0x0b0b0000); in pt1_disable_ram()
247 static void pt1_set_stream(struct pt1 *pt1, int index, int enabled) in pt1_set_stream() argument
249 pt1_write_reg(pt1, 2, 1 << (index + 8) | enabled << index); in pt1_set_stream()
252 static void pt1_init_streams(struct pt1 *pt1) in pt1_init_streams() argument
256 pt1_set_stream(pt1, i, 0); in pt1_init_streams()
259 static int pt1_filter(struct pt1 *pt1, struct pt1_buffer_page *page) in pt1_filter() argument
278 adap = pt1->adaps[index]; in pt1_filter()
287 pt1->table_index, pt1->buf_index); in pt1_filter()
316 struct pt1 *pt1; in pt1_thread() local
319 pt1 = data; in pt1_thread()
325 page = pt1->tables[pt1->table_index].bufs[pt1->buf_index].page; in pt1_thread()
326 if (!pt1_filter(pt1, page)) { in pt1_thread()
331 if (++pt1->buf_index >= PT1_NR_BUFS) { in pt1_thread()
332 pt1_increment_table_count(pt1); in pt1_thread()
333 pt1->buf_index = 0; in pt1_thread()
334 if (++pt1->table_index >= pt1_nr_tables) in pt1_thread()
335 pt1->table_index = 0; in pt1_thread()
342 static void pt1_free_page(struct pt1 *pt1, void *page, dma_addr_t addr) in pt1_free_page() argument
344 dma_free_coherent(&pt1->pdev->dev, PT1_PAGE_SIZE, page, addr); in pt1_free_page()
347 static void *pt1_alloc_page(struct pt1 *pt1, dma_addr_t *addrp, u32 *pfnp) in pt1_alloc_page() argument
352 page = dma_alloc_coherent(&pt1->pdev->dev, PT1_PAGE_SIZE, &addr, in pt1_alloc_page()
365 static void pt1_cleanup_buffer(struct pt1 *pt1, struct pt1_buffer *buf) in pt1_cleanup_buffer() argument
367 pt1_free_page(pt1, buf->page, buf->addr); in pt1_cleanup_buffer()
371 pt1_init_buffer(struct pt1 *pt1, struct pt1_buffer *buf, u32 *pfnp) in pt1_init_buffer() argument
376 page = pt1_alloc_page(pt1, &addr, pfnp); in pt1_init_buffer()
387 static void pt1_cleanup_table(struct pt1 *pt1, struct pt1_table *table) in pt1_cleanup_table() argument
392 pt1_cleanup_buffer(pt1, &table->bufs[i]); in pt1_cleanup_table()
394 pt1_free_page(pt1, table->page, table->addr); in pt1_cleanup_table()
398 pt1_init_table(struct pt1 *pt1, struct pt1_table *table, u32 *pfnp) in pt1_init_table() argument
405 page = pt1_alloc_page(pt1, &addr, pfnp); in pt1_init_table()
410 ret = pt1_init_buffer(pt1, &table->bufs[i], &buf_pfn); in pt1_init_table()
417 pt1_increment_table_count(pt1); in pt1_init_table()
424 pt1_cleanup_buffer(pt1, &table->bufs[i]); in pt1_init_table()
426 pt1_free_page(pt1, page, addr); in pt1_init_table()
430 static void pt1_cleanup_tables(struct pt1 *pt1) in pt1_cleanup_tables() argument
435 tables = pt1->tables; in pt1_cleanup_tables()
436 pt1_unregister_tables(pt1); in pt1_cleanup_tables()
439 pt1_cleanup_table(pt1, &tables[i]); in pt1_cleanup_tables()
444 static int pt1_init_tables(struct pt1 *pt1) in pt1_init_tables() argument
454 pt1_init_table_count(pt1); in pt1_init_tables()
458 ret = pt1_init_table(pt1, &tables[0], &first_pfn); in pt1_init_tables()
465 ret = pt1_init_table(pt1, &tables[i], &pfn); in pt1_init_tables()
474 pt1_register_tables(pt1, first_pfn); in pt1_init_tables()
475 pt1->tables = tables; in pt1_init_tables()
480 pt1_cleanup_table(pt1, &tables[i]); in pt1_init_tables()
486 static int pt1_start_polling(struct pt1 *pt1) in pt1_start_polling() argument
490 mutex_lock(&pt1->lock); in pt1_start_polling()
491 if (!pt1->kthread) { in pt1_start_polling()
492 pt1->kthread = kthread_run(pt1_thread, pt1, "earth-pt1"); in pt1_start_polling()
493 if (IS_ERR(pt1->kthread)) { in pt1_start_polling()
494 ret = PTR_ERR(pt1->kthread); in pt1_start_polling()
495 pt1->kthread = NULL; in pt1_start_polling()
498 mutex_unlock(&pt1->lock); in pt1_start_polling()
509 ret = pt1_start_polling(adap->pt1); in pt1_start_feed()
512 pt1_set_stream(adap->pt1, adap->index, 1); in pt1_start_feed()
517 static void pt1_stop_polling(struct pt1 *pt1) in pt1_stop_polling() argument
521 mutex_lock(&pt1->lock); in pt1_stop_polling()
523 count += pt1->adaps[i]->users; in pt1_stop_polling()
525 if (count == 0 && pt1->kthread) { in pt1_stop_polling()
526 kthread_stop(pt1->kthread); in pt1_stop_polling()
527 pt1->kthread = NULL; in pt1_stop_polling()
529 mutex_unlock(&pt1->lock); in pt1_stop_polling()
537 pt1_set_stream(adap->pt1, adap->index, 0); in pt1_stop_feed()
538 pt1_stop_polling(adap->pt1); in pt1_stop_feed()
544 pt1_update_power(struct pt1 *pt1) in pt1_update_power() argument
556 bits = pt1->power | !pt1->reset << 3; in pt1_update_power()
557 mutex_lock(&pt1->lock); in pt1_update_power()
559 adap = pt1->adaps[i]; in pt1_update_power()
574 pt1_write_reg(pt1, 1, bits); in pt1_update_power()
575 mutex_unlock(&pt1->lock); in pt1_update_power()
584 pt1_update_power(adap->pt1); in pt1_set_voltage()
598 pt1_update_power(adap->pt1); in pt1_sleep()
612 pt1_update_power(adap->pt1); in pt1_wakeup()
634 pt1_alloc_adapter(struct pt1 *pt1) in pt1_alloc_adapter() argument
649 adap->pt1 = pt1; in pt1_alloc_adapter()
668 &pt1->pdev->dev, adapter_nr); in pt1_alloc_adapter()
706 static void pt1_cleanup_adapters(struct pt1 *pt1) in pt1_cleanup_adapters() argument
710 pt1_free_adapter(pt1->adaps[i]); in pt1_cleanup_adapters()
713 static int pt1_init_adapters(struct pt1 *pt1) in pt1_init_adapters() argument
720 adap = pt1_alloc_adapter(pt1); in pt1_init_adapters()
727 pt1->adaps[i] = adap; in pt1_init_adapters()
733 pt1_free_adapter(pt1->adaps[i]); in pt1_init_adapters()
762 static void pt1_cleanup_frontends(struct pt1 *pt1) in pt1_cleanup_frontends() argument
766 pt1_cleanup_frontend(pt1->adaps[i]); in pt1_cleanup_frontends()
818 static int pt1_init_frontends(struct pt1 *pt1) in pt1_init_frontends() argument
829 i2c_adap = &pt1->i2c_adap; in pt1_init_frontends()
830 configs = pt1->pdev->device == 0x211a ? pt1_configs : pt2_configs; in pt1_init_frontends()
861 ret = pt1_init_frontend(pt1->adaps[j], fe[j]); in pt1_init_frontends()
878 static void pt1_i2c_emit(struct pt1 *pt1, int addr, int busy, int read_enable, in pt1_i2c_emit() argument
881 pt1_write_reg(pt1, 4, addr << 18 | busy << 13 | read_enable << 12 | in pt1_i2c_emit()
885 static void pt1_i2c_write_bit(struct pt1 *pt1, int addr, int *addrp, int data) in pt1_i2c_write_bit() argument
887 pt1_i2c_emit(pt1, addr, 1, 0, 0, data, addr + 1); in pt1_i2c_write_bit()
888 pt1_i2c_emit(pt1, addr + 1, 1, 0, 1, data, addr + 2); in pt1_i2c_write_bit()
889 pt1_i2c_emit(pt1, addr + 2, 1, 0, 0, data, addr + 3); in pt1_i2c_write_bit()
893 static void pt1_i2c_read_bit(struct pt1 *pt1, int addr, int *addrp) in pt1_i2c_read_bit() argument
895 pt1_i2c_emit(pt1, addr, 1, 0, 0, 1, addr + 1); in pt1_i2c_read_bit()
896 pt1_i2c_emit(pt1, addr + 1, 1, 0, 1, 1, addr + 2); in pt1_i2c_read_bit()
897 pt1_i2c_emit(pt1, addr + 2, 1, 1, 1, 1, addr + 3); in pt1_i2c_read_bit()
898 pt1_i2c_emit(pt1, addr + 3, 1, 0, 0, 1, addr + 4); in pt1_i2c_read_bit()
902 static void pt1_i2c_write_byte(struct pt1 *pt1, int addr, int *addrp, int data) in pt1_i2c_write_byte() argument
906 pt1_i2c_write_bit(pt1, addr, &addr, data >> (7 - i) & 1); in pt1_i2c_write_byte()
907 pt1_i2c_write_bit(pt1, addr, &addr, 1); in pt1_i2c_write_byte()
911 static void pt1_i2c_read_byte(struct pt1 *pt1, int addr, int *addrp, int last) in pt1_i2c_read_byte() argument
915 pt1_i2c_read_bit(pt1, addr, &addr); in pt1_i2c_read_byte()
916 pt1_i2c_write_bit(pt1, addr, &addr, last); in pt1_i2c_read_byte()
920 static void pt1_i2c_prepare(struct pt1 *pt1, int addr, int *addrp) in pt1_i2c_prepare() argument
922 pt1_i2c_emit(pt1, addr, 1, 0, 1, 1, addr + 1); in pt1_i2c_prepare()
923 pt1_i2c_emit(pt1, addr + 1, 1, 0, 1, 0, addr + 2); in pt1_i2c_prepare()
924 pt1_i2c_emit(pt1, addr + 2, 1, 0, 0, 0, addr + 3); in pt1_i2c_prepare()
929 pt1_i2c_write_msg(struct pt1 *pt1, int addr, int *addrp, struct i2c_msg *msg) in pt1_i2c_write_msg() argument
932 pt1_i2c_prepare(pt1, addr, &addr); in pt1_i2c_write_msg()
933 pt1_i2c_write_byte(pt1, addr, &addr, msg->addr << 1); in pt1_i2c_write_msg()
935 pt1_i2c_write_byte(pt1, addr, &addr, msg->buf[i]); in pt1_i2c_write_msg()
940 pt1_i2c_read_msg(struct pt1 *pt1, int addr, int *addrp, struct i2c_msg *msg) in pt1_i2c_read_msg() argument
943 pt1_i2c_prepare(pt1, addr, &addr); in pt1_i2c_read_msg()
944 pt1_i2c_write_byte(pt1, addr, &addr, msg->addr << 1 | 1); in pt1_i2c_read_msg()
946 pt1_i2c_read_byte(pt1, addr, &addr, i == msg->len - 1); in pt1_i2c_read_msg()
950 static int pt1_i2c_end(struct pt1 *pt1, int addr) in pt1_i2c_end() argument
952 pt1_i2c_emit(pt1, addr, 1, 0, 0, 0, addr + 1); in pt1_i2c_end()
953 pt1_i2c_emit(pt1, addr + 1, 1, 0, 1, 0, addr + 2); in pt1_i2c_end()
954 pt1_i2c_emit(pt1, addr + 2, 1, 0, 1, 1, 0); in pt1_i2c_end()
956 pt1_write_reg(pt1, 0, 0x00000004); in pt1_i2c_end()
961 } while (pt1_read_reg(pt1, 0) & 0x00000080); in pt1_i2c_end()
965 static void pt1_i2c_begin(struct pt1 *pt1, int *addrp) in pt1_i2c_begin() argument
970 pt1_i2c_emit(pt1, addr, 0, 0, 1, 1, addr /* itself */); in pt1_i2c_begin()
973 if (!pt1->i2c_running) { in pt1_i2c_begin()
974 pt1_i2c_emit(pt1, addr, 1, 0, 1, 1, addr + 1); in pt1_i2c_begin()
975 pt1_i2c_emit(pt1, addr + 1, 1, 0, 1, 0, addr + 2); in pt1_i2c_begin()
977 pt1->i2c_running = 1; in pt1_i2c_begin()
984 struct pt1 *pt1; in pt1_i2c_xfer() local
991 pt1 = i2c_get_adapdata(adap); in pt1_i2c_xfer()
1010 pt1_i2c_begin(pt1, &addr); in pt1_i2c_xfer()
1011 pt1_i2c_write_msg(pt1, addr, &addr, msg); in pt1_i2c_xfer()
1012 pt1_i2c_read_msg(pt1, addr, &addr, next_msg); in pt1_i2c_xfer()
1013 ret = pt1_i2c_end(pt1, addr); in pt1_i2c_xfer()
1017 word = pt1_read_reg(pt1, 2); in pt1_i2c_xfer()
1023 pt1_i2c_begin(pt1, &addr); in pt1_i2c_xfer()
1024 pt1_i2c_write_msg(pt1, addr, &addr, msg); in pt1_i2c_xfer()
1025 ret = pt1_i2c_end(pt1, addr); in pt1_i2c_xfer()
1044 static void pt1_i2c_wait(struct pt1 *pt1) in pt1_i2c_wait() argument
1048 pt1_i2c_emit(pt1, 0, 0, 0, 1, 1, 0); in pt1_i2c_wait()
1051 static void pt1_i2c_init(struct pt1 *pt1) in pt1_i2c_init() argument
1055 pt1_i2c_emit(pt1, i, 0, 0, 1, 1, 0); in pt1_i2c_init()
1060 struct pt1 *pt1; in pt1_remove() local
1063 pt1 = pci_get_drvdata(pdev); in pt1_remove()
1064 regs = pt1->regs; in pt1_remove()
1066 if (pt1->kthread) in pt1_remove()
1067 kthread_stop(pt1->kthread); in pt1_remove()
1068 pt1_cleanup_tables(pt1); in pt1_remove()
1069 pt1_cleanup_frontends(pt1); in pt1_remove()
1070 pt1_disable_ram(pt1); in pt1_remove()
1071 pt1->power = 0; in pt1_remove()
1072 pt1->reset = 1; in pt1_remove()
1073 pt1_update_power(pt1); in pt1_remove()
1074 pt1_cleanup_adapters(pt1); in pt1_remove()
1075 i2c_del_adapter(&pt1->i2c_adap); in pt1_remove()
1076 kfree(pt1); in pt1_remove()
1086 struct pt1 *pt1; in pt1_probe() local
1109 pt1 = kzalloc(sizeof(struct pt1), GFP_KERNEL); in pt1_probe()
1110 if (!pt1) { in pt1_probe()
1115 mutex_init(&pt1->lock); in pt1_probe()
1116 pt1->pdev = pdev; in pt1_probe()
1117 pt1->regs = regs; in pt1_probe()
1118 pci_set_drvdata(pdev, pt1); in pt1_probe()
1120 ret = pt1_init_adapters(pt1); in pt1_probe()
1124 mutex_init(&pt1->lock); in pt1_probe()
1126 pt1->power = 0; in pt1_probe()
1127 pt1->reset = 1; in pt1_probe()
1128 pt1_update_power(pt1); in pt1_probe()
1130 i2c_adap = &pt1->i2c_adap; in pt1_probe()
1135 i2c_set_adapdata(i2c_adap, pt1); in pt1_probe()
1140 pt1_i2c_init(pt1); in pt1_probe()
1141 pt1_i2c_wait(pt1); in pt1_probe()
1143 ret = pt1_sync(pt1); in pt1_probe()
1147 pt1_identify(pt1); in pt1_probe()
1149 ret = pt1_unlock(pt1); in pt1_probe()
1153 ret = pt1_reset_pci(pt1); in pt1_probe()
1157 ret = pt1_reset_ram(pt1); in pt1_probe()
1161 ret = pt1_enable_ram(pt1); in pt1_probe()
1165 pt1_init_streams(pt1); in pt1_probe()
1167 pt1->power = 1; in pt1_probe()
1168 pt1_update_power(pt1); in pt1_probe()
1171 pt1->reset = 0; in pt1_probe()
1172 pt1_update_power(pt1); in pt1_probe()
1175 ret = pt1_init_frontends(pt1); in pt1_probe()
1179 ret = pt1_init_tables(pt1); in pt1_probe()
1186 pt1_cleanup_frontends(pt1); in pt1_probe()
1188 pt1_disable_ram(pt1); in pt1_probe()
1189 pt1->power = 0; in pt1_probe()
1190 pt1->reset = 1; in pt1_probe()
1191 pt1_update_power(pt1); in pt1_probe()
1195 pt1_cleanup_adapters(pt1); in pt1_probe()
1197 kfree(pt1); in pt1_probe()