Lines Matching full:rm
52 struct rackmeter *rm; member
96 static void rackmeter_setup_i2s(struct rackmeter *rm) in rackmeter_setup_i2s() argument
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()
122 out_le32(rm->i2s_regs + 0x10, 0x01fa0000); in rackmeter_setup_i2s()
123 (void)in_le32(rm->i2s_regs + 0x10); in rackmeter_setup_i2s()
133 static void rackmeter_set_default_pattern(struct rackmeter *rm) in rackmeter_set_default_pattern() argument
139 rm->ubuf[i] = (i & 1) * 255; in rackmeter_set_default_pattern()
141 rm->ubuf[i] = ((~i) & 1) * 255; in rackmeter_set_default_pattern()
145 static void rackmeter_do_pause(struct rackmeter *rm, int pause) in rackmeter_do_pause() argument
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()
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()
167 static void rackmeter_setup_dbdma(struct rackmeter *rm) in rackmeter_setup_dbdma() argument
169 struct rackmeter_dma *db = rm->dma_buf_v; in rackmeter_setup_dbdma()
173 DBDMA_DO_RESET(rm->dma_regs); in rackmeter_setup_dbdma()
186 cmd->phy_addr = cpu_to_le32(rm->dma_buf_p + in rackmeter_setup_dbdma()
193 cmd->phy_addr = cpu_to_le32(rm->dma_buf_p + in rackmeter_setup_dbdma()
199 cmd->phy_addr = cpu_to_le32(rm->dma_buf_p + 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()
210 rackmeter_do_pause(rm, 0); in rackmeter_setup_dbdma()
217 struct rackmeter *rm = rcpu->rm; in rackmeter_do_timer() local
241 rm->ubuf[i + offset] = ub; 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()
251 rackmeter_do_pause(rm, pause); in rackmeter_do_timer()
252 mutex_unlock(&rm->sem); in rackmeter_do_timer()
258 static void rackmeter_init_cpu_sniffer(struct rackmeter *rm) in rackmeter_init_cpu_sniffer() argument
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()
281 schedule_delayed_work_on(cpu, &rm->cpu[cpu].sniffer, in rackmeter_init_cpu_sniffer()
286 static void rackmeter_stop_cpu_sniffer(struct rackmeter *rm) in rackmeter_stop_cpu_sniffer() argument
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()
292 static int rackmeter_setup(struct rackmeter *rm) in rackmeter_setup() argument
295 rackmeter_setup_i2s(rm); in rackmeter_setup()
298 rackmeter_set_default_pattern(rm); in rackmeter_setup()
301 rackmeter_setup_dbdma(rm); in rackmeter_setup()
304 rackmeter_init_cpu_sniffer(rm); in rackmeter_setup()
312 static u32 rackmeter_calc_sample(struct rackmeter *rm, unsigned int index) in rackmeter_calc_sample() argument
319 sample |= ((rm->ubuf[led] >= 0x80) << 15); in rackmeter_calc_sample()
326 struct rackmeter *rm = arg; in rackmeter_irq() local
327 struct rackmeter_dma *db = rm->dma_buf_v; in rackmeter_irq()
335 (void)in_le32(&rm->dma_regs->status); in rackmeter_irq()
346 if (++rm->stale_irq > 3) { in rackmeter_irq()
349 DBDMA_DO_RESET(rm->dma_regs); in rackmeter_irq()
361 buf[i] = rackmeter_calc_sample(rm, i); in rackmeter_irq()
371 struct rackmeter *rm = NULL; in rackmeter_probe() local
400 rm = kzalloc(sizeof(*rm), GFP_KERNEL); in rackmeter_probe()
401 if (rm == NULL) { 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()
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()
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()
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()
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()
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()
485 rc = rackmeter_setup(rm); 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()
511 rm->dma_buf_v, rm->dma_buf_p); in rackmeter_probe()
513 free_page((unsigned long)rm->ubuf); in rackmeter_probe()
519 kfree(rm); in rackmeter_probe()
529 struct rackmeter *rm = dev_get_drvdata(&mdev->ofdev.dev); in rackmeter_remove() local
532 rackmeter_stop_cpu_sniffer(rm); 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()
550 rm->dma_buf_v, rm->dma_buf_p); in rackmeter_remove()
553 free_page((unsigned long)rm->ubuf); in rackmeter_remove()
561 kfree(rm); in rackmeter_remove()
568 struct rackmeter *rm = dev_get_drvdata(&mdev->ofdev.dev); in rackmeter_shutdown() local
570 if (rm == NULL) in rackmeter_shutdown()
574 rackmeter_stop_cpu_sniffer(rm); in rackmeter_shutdown()
577 DBDMA_DO_RESET(rm->dma_regs); in rackmeter_shutdown()