Lines Matching refs:rm

51 	struct rackmeter	*rm;
95 static void rackmeter_setup_i2s(struct rackmeter *rm)
97 struct macio_chip *macio = rm->mdev->bus->chip;
106 pmac_call_feature(PMAC_FTR_SOUND_CHIP_ENABLE, rm->i2s, 0, 1);
121 out_le32(rm->i2s_regs + 0x10, 0x01fa0000);
122 (void)in_le32(rm->i2s_regs + 0x10);
132 static void rackmeter_set_default_pattern(struct rackmeter *rm)
138 rm->ubuf[i] = (i & 1) * 255;
140 rm->ubuf[i] = ((~i) & 1) * 255;
144 static void rackmeter_do_pause(struct rackmeter *rm, int pause)
146 struct rackmeter_dma *rdma = rm->dma_buf_v;
150 rm->paused = pause;
152 DBDMA_DO_STOP(rm->dma_regs);
158 rm->dma_buf_v->mark = 0;
161 out_le32(&rm->dma_regs->cmdptr_hi, 0);
162 out_le32(&rm->dma_regs->cmdptr, rm->dma_buf_p);
163 out_le32(&rm->dma_regs->control, (RUN << 16) | RUN);
166 static void rackmeter_setup_dbdma(struct rackmeter *rm)
168 struct rackmeter_dma *db = rm->dma_buf_v;
172 DBDMA_DO_RESET(rm->dma_regs);
185 cmd->phy_addr = cpu_to_le32(rm->dma_buf_p +
192 cmd->phy_addr = cpu_to_le32(rm->dma_buf_p +
198 cmd->phy_addr = cpu_to_le32(rm->dma_buf_p +
205 cmd->phy_addr = cpu_to_le32(rm->dma_buf_p +
207 cmd->cmd_dep = cpu_to_le32(rm->dma_buf_p);
209 rackmeter_do_pause(rm, 0);
216 struct rackmeter *rm = rcpu->rm;
240 rm->ubuf[i + offset] = ub;
246 pause = (rm->cpu[0].zero && rm->cpu[1].zero);
247 if (pause != rm->paused) {
248 mutex_lock(&rm->sem);
249 pause = (rm->cpu[0].zero && rm->cpu[1].zero);
250 rackmeter_do_pause(rm, pause);
251 mutex_unlock(&rm->sem);
257 static void rackmeter_init_cpu_sniffer(struct rackmeter *rm)
267 rm->cpu[0].rm = rm;
268 INIT_DELAYED_WORK(&rm->cpu[0].sniffer, rackmeter_do_timer);
269 rm->cpu[1].rm = rm;
270 INIT_DELAYED_WORK(&rm->cpu[1].sniffer, rackmeter_do_timer);
277 rcpu = &rm->cpu[cpu];
280 schedule_delayed_work_on(cpu, &rm->cpu[cpu].sniffer,
285 static void rackmeter_stop_cpu_sniffer(struct rackmeter *rm)
287 cancel_delayed_work_sync(&rm->cpu[0].sniffer);
288 cancel_delayed_work_sync(&rm->cpu[1].sniffer);
291 static int rackmeter_setup(struct rackmeter *rm)
294 rackmeter_setup_i2s(rm);
297 rackmeter_set_default_pattern(rm);
300 rackmeter_setup_dbdma(rm);
303 rackmeter_init_cpu_sniffer(rm);
311 static u32 rackmeter_calc_sample(struct rackmeter *rm, unsigned int index)
318 sample |= ((rm->ubuf[led] >= 0x80) << 15);
325 struct rackmeter *rm = arg;
326 struct rackmeter_dma *db = rm->dma_buf_v;
334 (void)in_le32(&rm->dma_regs->status);
345 if (++rm->stale_irq > 3) {
348 DBDMA_DO_RESET(rm->dma_regs);
360 buf[i] = rackmeter_calc_sample(rm, i);
370 struct rackmeter *rm = NULL;
399 rm = kzalloc(sizeof(*rm), GFP_KERNEL);
400 if (rm == NULL) {
405 rm->mdev = mdev;
406 rm->i2s = i2s;
407 mutex_init(&rm->sem);
408 dev_set_drvdata(&mdev->ofdev.dev, rm);
426 rm->irq = macio_irq(mdev, 1);
428 rm->irq = irq_of_parse_and_map(i2s, 1);
429 if (!rm->irq ||
442 pr_debug(" irq %d\n", rm->irq);
444 rm->ubuf = (u8 *)__get_free_page(GFP_KERNEL);
445 if (rm->ubuf == NULL) {
452 rm->dma_buf_v = dma_alloc_coherent(&macio_get_pci_dev(mdev)->dev,
454 &rm->dma_buf_p, GFP_KERNEL);
455 if (rm->dma_buf_v == NULL) {
462 rm->i2s_regs = ioremap(macio_resource_start(mdev, 0), 0x1000);
464 rm->i2s_regs = ioremap(ri2s.start, 0x1000);
466 if (rm->i2s_regs == NULL) {
473 rm->dma_regs = ioremap(macio_resource_start(mdev, 1), 0x100);
475 rm->dma_regs = ioremap(rdma.start, 0x100);
477 if (rm->dma_regs == NULL) {
484 rc = rackmeter_setup(rm);
492 rc = request_irq(rm->irq, rackmeter_irq, 0, "rackmeter", rm);
502 DBDMA_DO_RESET(rm->dma_regs);
504 iounmap(rm->dma_regs);
506 iounmap(rm->i2s_regs);
510 rm->dma_buf_v, rm->dma_buf_p);
512 free_page((unsigned long)rm->ubuf);
518 kfree(rm);
528 struct rackmeter *rm = dev_get_drvdata(&mdev->ofdev.dev);
531 rackmeter_stop_cpu_sniffer(rm);
537 DBDMA_DO_RESET(rm->dma_regs);
540 free_irq(rm->irq, rm);
543 iounmap(rm->dma_regs);
544 iounmap(rm->i2s_regs);
549 rm->dma_buf_v, rm->dma_buf_p);
552 free_page((unsigned long)rm->ubuf);
560 kfree(rm);
567 struct rackmeter *rm = dev_get_drvdata(&mdev->ofdev.dev);
569 if (rm == NULL)
573 rackmeter_stop_cpu_sniffer(rm);
576 DBDMA_DO_RESET(rm->dma_regs);