Lines Matching refs:rm

54 	struct rackmeter	*rm;  member
97 static void rackmeter_setup_i2s(struct rackmeter *rm) in rackmeter_setup_i2s() argument
99 struct macio_chip *macio = rm->mdev->bus->chip; in rackmeter_setup_i2s()
108 pmac_call_feature(PMAC_FTR_SOUND_CHIP_ENABLE, rm->i2s, 0, 1); in rackmeter_setup_i2s()
123 out_le32(rm->i2s_regs + 0x10, 0x01fa0000); in rackmeter_setup_i2s()
124 (void)in_le32(rm->i2s_regs + 0x10); in rackmeter_setup_i2s()
134 static void rackmeter_set_default_pattern(struct rackmeter *rm) in rackmeter_set_default_pattern() argument
140 rm->ubuf[i] = (i & 1) * 255; in rackmeter_set_default_pattern()
142 rm->ubuf[i] = ((~i) & 1) * 255; in rackmeter_set_default_pattern()
146 static void rackmeter_do_pause(struct rackmeter *rm, int pause) in rackmeter_do_pause() argument
148 struct rackmeter_dma *rdma = rm->dma_buf_v; in rackmeter_do_pause()
152 rm->paused = pause; in rackmeter_do_pause()
154 DBDMA_DO_STOP(rm->dma_regs); in rackmeter_do_pause()
160 rm->dma_buf_v->mark = 0; in rackmeter_do_pause()
163 out_le32(&rm->dma_regs->cmdptr_hi, 0); in rackmeter_do_pause()
164 out_le32(&rm->dma_regs->cmdptr, rm->dma_buf_p); in rackmeter_do_pause()
165 out_le32(&rm->dma_regs->control, (RUN << 16) | RUN); in rackmeter_do_pause()
168 static void rackmeter_setup_dbdma(struct rackmeter *rm) in rackmeter_setup_dbdma() argument
170 struct rackmeter_dma *db = rm->dma_buf_v; in rackmeter_setup_dbdma()
174 DBDMA_DO_RESET(rm->dma_regs); in rackmeter_setup_dbdma()
187 cmd->phy_addr = cpu_to_le32(rm->dma_buf_p + in rackmeter_setup_dbdma()
194 cmd->phy_addr = cpu_to_le32(rm->dma_buf_p + in rackmeter_setup_dbdma()
200 cmd->phy_addr = cpu_to_le32(rm->dma_buf_p + in rackmeter_setup_dbdma()
207 cmd->phy_addr = cpu_to_le32(rm->dma_buf_p + in rackmeter_setup_dbdma()
209 cmd->cmd_dep = cpu_to_le32(rm->dma_buf_p); in rackmeter_setup_dbdma()
211 rackmeter_do_pause(rm, 0); in rackmeter_setup_dbdma()
218 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
399 rm = kzalloc(sizeof(struct rackmeter), GFP_KERNEL); in rackmeter_probe()
400 if (rm == NULL) { in rackmeter_probe()
405 rm->mdev = mdev; in rackmeter_probe()
406 rm->i2s = i2s; in rackmeter_probe()
407 mutex_init(&rm->sem); in rackmeter_probe()
408 dev_set_drvdata(&mdev->ofdev.dev, rm); in rackmeter_probe()
426 rm->irq = macio_irq(mdev, 1); in rackmeter_probe()
428 rm->irq = irq_of_parse_and_map(i2s, 1); in rackmeter_probe()
429 if (rm->irq == NO_IRQ || in rackmeter_probe()
442 pr_debug(" irq %d\n", rm->irq); in rackmeter_probe()
444 rm->ubuf = (u8 *)__get_free_page(GFP_KERNEL); in rackmeter_probe()
445 if (rm->ubuf == NULL) { in rackmeter_probe()
452 rm->dma_buf_v = dma_alloc_coherent(&macio_get_pci_dev(mdev)->dev, in rackmeter_probe()
454 &rm->dma_buf_p, GFP_KERNEL); in rackmeter_probe()
455 if (rm->dma_buf_v == NULL) { in rackmeter_probe()
462 rm->i2s_regs = ioremap(macio_resource_start(mdev, 0), 0x1000); in rackmeter_probe()
464 rm->i2s_regs = ioremap(ri2s.start, 0x1000); in rackmeter_probe()
466 if (rm->i2s_regs == NULL) { in rackmeter_probe()
473 rm->dma_regs = ioremap(macio_resource_start(mdev, 1), 0x100); in rackmeter_probe()
475 rm->dma_regs = ioremap(rdma.start, 0x100); in rackmeter_probe()
477 if (rm->dma_regs == NULL) { in rackmeter_probe()
484 rc = rackmeter_setup(rm); in rackmeter_probe()
492 rc = request_irq(rm->irq, rackmeter_irq, 0, "rackmeter", rm); in rackmeter_probe()
502 DBDMA_DO_RESET(rm->dma_regs); in rackmeter_probe()
504 iounmap(rm->dma_regs); in rackmeter_probe()
506 iounmap(rm->i2s_regs); in rackmeter_probe()
510 rm->dma_buf_v, rm->dma_buf_p); in rackmeter_probe()
512 free_page((unsigned long)rm->ubuf); in rackmeter_probe()
518 kfree(rm); in rackmeter_probe()
528 struct rackmeter *rm = dev_get_drvdata(&mdev->ofdev.dev); in rackmeter_remove() local
531 rackmeter_stop_cpu_sniffer(rm); in rackmeter_remove()
537 DBDMA_DO_RESET(rm->dma_regs); in rackmeter_remove()
540 free_irq(rm->irq, rm); in rackmeter_remove()
543 iounmap(rm->dma_regs); in rackmeter_remove()
544 iounmap(rm->i2s_regs); in rackmeter_remove()
549 rm->dma_buf_v, rm->dma_buf_p); in rackmeter_remove()
552 free_page((unsigned long)rm->ubuf); in rackmeter_remove()
560 kfree(rm); in rackmeter_remove()
567 struct rackmeter *rm = dev_get_drvdata(&mdev->ofdev.dev); in rackmeter_shutdown() local
569 if (rm == NULL) in rackmeter_shutdown()
573 rackmeter_stop_cpu_sniffer(rm); in rackmeter_shutdown()
576 DBDMA_DO_RESET(rm->dma_regs); in rackmeter_shutdown()