• Home
  • Raw
  • Download

Lines Matching +full:cmd +full:- +full:db

1 // SPDX-License-Identifier: GPL-2.0-only
3 * RackMac vu-meter driver
8 * Support the CPU-meter LEDs of the Xserve G5
11 * interface for fun. Also, the CPU-meter could be made nicer by being
13 * time. Patches welcome :-)
24 #include <linux/dma-mapping.h>
44 struct dbdma_cmd cmd[4] ____cacheline_aligned; member
87 retval = kcpustat->cpustat[CPUTIME_IDLE] + in get_cpu_idle_time()
88 kcpustat->cpustat[CPUTIME_IOWAIT]; in get_cpu_idle_time()
98 struct macio_chip *macio = rm->mdev->bus->chip; in rackmeter_setup_i2s()
107 pmac_call_feature(PMAC_FTR_SOUND_CHIP_ENABLE, rm->i2s, 0, 1); in rackmeter_setup_i2s()
111 * handle that. snd-aoa needs that too in rackmeter_setup_i2s()
122 out_le32(rm->i2s_regs + 0x10, 0x01fa0000); in rackmeter_setup_i2s()
123 (void)in_le32(rm->i2s_regs + 0x10); in rackmeter_setup_i2s()
139 rm->ubuf[i] = (i & 1) * 255; in rackmeter_set_default_pattern()
141 rm->ubuf[i] = ((~i) & 1) * 255; in rackmeter_set_default_pattern()
147 struct rackmeter_dma *rdma = rm->dma_buf_v; in rackmeter_do_pause()
151 rm->paused = pause; in rackmeter_do_pause()
153 DBDMA_DO_STOP(rm->dma_regs); in rackmeter_do_pause()
156 memset(rdma->buf1, 0, sizeof(rdma->buf1)); in rackmeter_do_pause()
157 memset(rdma->buf2, 0, sizeof(rdma->buf2)); in rackmeter_do_pause()
159 rm->dma_buf_v->mark = 0; in rackmeter_do_pause()
162 out_le32(&rm->dma_regs->cmdptr_hi, 0); in rackmeter_do_pause()
163 out_le32(&rm->dma_regs->cmdptr, rm->dma_buf_p); in rackmeter_do_pause()
164 out_le32(&rm->dma_regs->control, (RUN << 16) | RUN); in rackmeter_do_pause()
169 struct rackmeter_dma *db = rm->dma_buf_v; in rackmeter_setup_dbdma() local
170 struct dbdma_cmd *cmd = db->cmd; in rackmeter_setup_dbdma() local
173 DBDMA_DO_RESET(rm->dma_regs); in rackmeter_setup_dbdma()
183 memset(cmd, 0, 4 * sizeof(struct dbdma_cmd)); in rackmeter_setup_dbdma()
184 cmd->req_count = cpu_to_le16(4); in rackmeter_setup_dbdma()
185 cmd->command = cpu_to_le16(STORE_WORD | INTR_ALWAYS | KEY_SYSTEM); in rackmeter_setup_dbdma()
186 cmd->phy_addr = cpu_to_le32(rm->dma_buf_p + in rackmeter_setup_dbdma()
188 cmd->cmd_dep = cpu_to_le32(0x02000000); in rackmeter_setup_dbdma()
189 cmd++; in rackmeter_setup_dbdma()
191 cmd->req_count = cpu_to_le16(SAMPLE_COUNT * 4); in rackmeter_setup_dbdma()
192 cmd->command = cpu_to_le16(OUTPUT_MORE); in rackmeter_setup_dbdma()
193 cmd->phy_addr = cpu_to_le32(rm->dma_buf_p + in rackmeter_setup_dbdma()
195 cmd++; in rackmeter_setup_dbdma()
197 cmd->req_count = cpu_to_le16(4); in rackmeter_setup_dbdma()
198 cmd->command = cpu_to_le16(STORE_WORD | INTR_ALWAYS | KEY_SYSTEM); in rackmeter_setup_dbdma()
199 cmd->phy_addr = cpu_to_le32(rm->dma_buf_p + in rackmeter_setup_dbdma()
201 cmd->cmd_dep = cpu_to_le32(0x01000000); in rackmeter_setup_dbdma()
202 cmd++; in rackmeter_setup_dbdma()
204 cmd->req_count = cpu_to_le16(SAMPLE_COUNT * 4); in rackmeter_setup_dbdma()
205 cmd->command = cpu_to_le16(OUTPUT_MORE | BR_ALWAYS); in rackmeter_setup_dbdma()
206 cmd->phy_addr = cpu_to_le32(rm->dma_buf_p + in rackmeter_setup_dbdma()
208 cmd->cmd_dep = cpu_to_le32(rm->dma_buf_p); in rackmeter_setup_dbdma()
217 struct rackmeter *rm = rcpu->rm; in rackmeter_do_timer()
224 total_nsecs = cur_nsecs - rcpu->prev_wall; in rackmeter_do_timer()
225 rcpu->prev_wall = cur_nsecs; in rackmeter_do_timer()
228 idle_nsecs = total_idle_nsecs - rcpu->prev_idle; in rackmeter_do_timer()
230 rcpu->prev_idle = total_idle_nsecs; in rackmeter_do_timer()
235 load = div64_u64(9 * (total_nsecs - idle_nsecs), total_nsecs); in rackmeter_do_timer()
241 rm->ubuf[i + offset] = ub; in rackmeter_do_timer()
244 rcpu->zero = (cumm == 0); in rackmeter_do_timer()
247 pause = (rm->cpu[0].zero && rm->cpu[1].zero); in rackmeter_do_timer()
248 if (pause != rm->paused) { in rackmeter_do_timer()
249 mutex_lock(&rm->sem); in rackmeter_do_timer()
250 pause = (rm->cpu[0].zero && rm->cpu[1].zero); in rackmeter_do_timer()
252 mutex_unlock(&rm->sem); in rackmeter_do_timer()
254 schedule_delayed_work_on(cpu, &rcpu->sniffer, in rackmeter_do_timer()
268 rm->cpu[0].rm = rm; in rackmeter_init_cpu_sniffer()
269 INIT_DELAYED_WORK(&rm->cpu[0].sniffer, rackmeter_do_timer); in rackmeter_init_cpu_sniffer()
270 rm->cpu[1].rm = rm; in rackmeter_init_cpu_sniffer()
271 INIT_DELAYED_WORK(&rm->cpu[1].sniffer, rackmeter_do_timer); in rackmeter_init_cpu_sniffer()
278 rcpu = &rm->cpu[cpu]; in rackmeter_init_cpu_sniffer()
279 rcpu->prev_idle = get_cpu_idle_time(cpu); in rackmeter_init_cpu_sniffer()
280 rcpu->prev_wall = jiffies64_to_nsecs(get_jiffies_64()); in rackmeter_init_cpu_sniffer()
281 schedule_delayed_work_on(cpu, &rm->cpu[cpu].sniffer, in rackmeter_init_cpu_sniffer()
288 cancel_delayed_work_sync(&rm->cpu[0].sniffer); in rackmeter_stop_cpu_sniffer()
289 cancel_delayed_work_sync(&rm->cpu[1].sniffer); in rackmeter_stop_cpu_sniffer()
319 sample |= ((rm->ubuf[led] >= 0x80) << 15); in rackmeter_calc_sample()
327 struct rackmeter_dma *db = rm->dma_buf_v; in rackmeter_irq() local
335 (void)in_le32(&rm->dma_regs->status); in rackmeter_irq()
341 mark = db->mark; in rackmeter_irq()
346 if (++rm->stale_irq > 3) { in rackmeter_irq()
349 DBDMA_DO_RESET(rm->dma_regs); in rackmeter_irq()
355 buf = mark == 1 ? db->buf1 : db->buf2; in rackmeter_irq()
373 int rc = -ENODEV; in rackmeter_probe()
377 /* Get i2s-a node */ in rackmeter_probe()
378 for_each_child_of_node(mdev->ofdev.dev.of_node, i2s) in rackmeter_probe()
379 if (of_node_name_eq(i2s, "i2s-a")) in rackmeter_probe()
383 pr_debug(" i2s-a child not found\n"); in rackmeter_probe()
403 rc = -ENOMEM; in rackmeter_probe()
406 rm->mdev = mdev; in rackmeter_probe()
407 rm->i2s = i2s; in rackmeter_probe()
408 mutex_init(&rm->sem); in rackmeter_probe()
409 dev_set_drvdata(&mdev->ofdev.dev, rm); in rackmeter_probe()
411 #if 0 /* Use that when i2s-a is finally an mdev per-se */ in rackmeter_probe()
416 mdev->ofdev.dev.of_node); in rackmeter_probe()
417 rc = -ENXIO; in rackmeter_probe()
423 mdev->ofdev.dev.of_node); in rackmeter_probe()
424 rc = -EBUSY; in rackmeter_probe()
427 rm->irq = macio_irq(mdev, 1); in rackmeter_probe()
429 rm->irq = irq_of_parse_and_map(i2s, 1); in rackmeter_probe()
430 if (!rm->irq || in rackmeter_probe()
435 mdev->ofdev.dev.of_node); in rackmeter_probe()
436 rc = -ENXIO; in rackmeter_probe()
443 pr_debug(" irq %d\n", rm->irq); in rackmeter_probe()
445 rm->ubuf = (u8 *)__get_free_page(GFP_KERNEL); in rackmeter_probe()
446 if (rm->ubuf == NULL) { in rackmeter_probe()
449 rc = -ENOMEM; in rackmeter_probe()
453 rm->dma_buf_v = dma_alloc_coherent(&macio_get_pci_dev(mdev)->dev, in rackmeter_probe()
455 &rm->dma_buf_p, GFP_KERNEL); in rackmeter_probe()
456 if (rm->dma_buf_v == NULL) { in rackmeter_probe()
459 rc = -ENOMEM; in rackmeter_probe()
463 rm->i2s_regs = ioremap(macio_resource_start(mdev, 0), 0x1000); in rackmeter_probe()
465 rm->i2s_regs = ioremap(ri2s.start, 0x1000); in rackmeter_probe()
467 if (rm->i2s_regs == NULL) { in rackmeter_probe()
470 rc = -ENXIO; in rackmeter_probe()
474 rm->dma_regs = ioremap(macio_resource_start(mdev, 1), 0x100); in rackmeter_probe()
476 rm->dma_regs = ioremap(rdma.start, 0x100); in rackmeter_probe()
478 if (rm->dma_regs == NULL) { in rackmeter_probe()
481 rc = -ENXIO; in rackmeter_probe()
489 rc = -ENXIO; in rackmeter_probe()
493 rc = request_irq(rm->irq, rackmeter_irq, 0, "rackmeter", rm); in rackmeter_probe()
503 DBDMA_DO_RESET(rm->dma_regs); in rackmeter_probe()
505 iounmap(rm->dma_regs); in rackmeter_probe()
507 iounmap(rm->i2s_regs); in rackmeter_probe()
509 dma_free_coherent(&macio_get_pci_dev(mdev)->dev, in rackmeter_probe()
511 rm->dma_buf_v, rm->dma_buf_p); in rackmeter_probe()
513 free_page((unsigned long)rm->ubuf); in rackmeter_probe()
523 dev_set_drvdata(&mdev->ofdev.dev, NULL); in rackmeter_probe()
529 struct rackmeter *rm = dev_get_drvdata(&mdev->ofdev.dev); in rackmeter_remove()
535 dev_set_drvdata(&mdev->ofdev.dev, NULL); in rackmeter_remove()
538 DBDMA_DO_RESET(rm->dma_regs); in rackmeter_remove()
541 free_irq(rm->irq, rm); in rackmeter_remove()
544 iounmap(rm->dma_regs); in rackmeter_remove()
545 iounmap(rm->i2s_regs); in rackmeter_remove()
548 dma_free_coherent(&macio_get_pci_dev(mdev)->dev, in rackmeter_remove()
550 rm->dma_buf_v, rm->dma_buf_p); in rackmeter_remove()
553 free_page((unsigned long)rm->ubuf); in rackmeter_remove()
568 struct rackmeter *rm = dev_get_drvdata(&mdev->ofdev.dev); in rackmeter_shutdown()
571 return -ENODEV; in rackmeter_shutdown()
577 DBDMA_DO_RESET(rm->dma_regs); in rackmeter_shutdown()
620 MODULE_DESCRIPTION("RackMeter: Support vu-meter on XServe front panel");