Lines Matching refs:rm
52 struct rackmeter *rm;
96 static void rackmeter_setup_i2s(struct rackmeter *rm)
98 struct macio_chip *macio = rm->mdev->bus->chip;
107 pmac_call_feature(PMAC_FTR_SOUND_CHIP_ENABLE, rm->i2s, 0, 1);
122 out_le32(rm->i2s_regs + 0x10, 0x01fa0000);
123 (void)in_le32(rm->i2s_regs + 0x10);
133 static void rackmeter_set_default_pattern(struct rackmeter *rm)
139 rm->ubuf[i] = (i & 1) * 255;
141 rm->ubuf[i] = ((~i) & 1) * 255;
145 static void rackmeter_do_pause(struct rackmeter *rm, int pause)
147 struct rackmeter_dma *rdma = rm->dma_buf_v;
151 rm->paused = pause;
153 DBDMA_DO_STOP(rm->dma_regs);
159 rm->dma_buf_v->mark = 0;
162 out_le32(&rm->dma_regs->cmdptr_hi, 0);
163 out_le32(&rm->dma_regs->cmdptr, rm->dma_buf_p);
164 out_le32(&rm->dma_regs->control, (RUN << 16) | RUN);
167 static void rackmeter_setup_dbdma(struct rackmeter *rm)
169 struct rackmeter_dma *db = rm->dma_buf_v;
173 DBDMA_DO_RESET(rm->dma_regs);
186 cmd->phy_addr = cpu_to_le32(rm->dma_buf_p +
193 cmd->phy_addr = cpu_to_le32(rm->dma_buf_p +
199 cmd->phy_addr = cpu_to_le32(rm->dma_buf_p +
206 cmd->phy_addr = cpu_to_le32(rm->dma_buf_p +
208 cmd->cmd_dep = cpu_to_le32(rm->dma_buf_p);
210 rackmeter_do_pause(rm, 0);
217 struct rackmeter *rm = rcpu->rm;
241 rm->ubuf[i + offset] = ub;
247 pause = (rm->cpu[0].zero && rm->cpu[1].zero);
248 if (pause != rm->paused) {
249 mutex_lock(&rm->sem);
250 pause = (rm->cpu[0].zero && rm->cpu[1].zero);
251 rackmeter_do_pause(rm, pause);
252 mutex_unlock(&rm->sem);
258 static void rackmeter_init_cpu_sniffer(struct rackmeter *rm)
268 rm->cpu[0].rm = rm;
269 INIT_DELAYED_WORK(&rm->cpu[0].sniffer, rackmeter_do_timer);
270 rm->cpu[1].rm = rm;
271 INIT_DELAYED_WORK(&rm->cpu[1].sniffer, rackmeter_do_timer);
278 rcpu = &rm->cpu[cpu];
281 schedule_delayed_work_on(cpu, &rm->cpu[cpu].sniffer,
286 static void rackmeter_stop_cpu_sniffer(struct rackmeter *rm)
288 cancel_delayed_work_sync(&rm->cpu[0].sniffer);
289 cancel_delayed_work_sync(&rm->cpu[1].sniffer);
292 static int rackmeter_setup(struct rackmeter *rm)
295 rackmeter_setup_i2s(rm);
298 rackmeter_set_default_pattern(rm);
301 rackmeter_setup_dbdma(rm);
304 rackmeter_init_cpu_sniffer(rm);
312 static u32 rackmeter_calc_sample(struct rackmeter *rm, unsigned int index)
319 sample |= ((rm->ubuf[led] >= 0x80) << 15);
326 struct rackmeter *rm = arg;
327 struct rackmeter_dma *db = rm->dma_buf_v;
335 (void)in_le32(&rm->dma_regs->status);
346 if (++rm->stale_irq > 3) {
349 DBDMA_DO_RESET(rm->dma_regs);
361 buf[i] = rackmeter_calc_sample(rm, i);
371 struct rackmeter *rm = NULL;
400 rm = kzalloc(sizeof(*rm), GFP_KERNEL);
401 if (rm == NULL) {
406 rm->mdev = mdev;
407 rm->i2s = i2s;
408 mutex_init(&rm->sem);
409 dev_set_drvdata(&mdev->ofdev.dev, rm);
427 rm->irq = macio_irq(mdev, 1);
429 rm->irq = irq_of_parse_and_map(i2s, 1);
430 if (!rm->irq ||
443 pr_debug(" irq %d\n", rm->irq);
445 rm->ubuf = (u8 *)__get_free_page(GFP_KERNEL);
446 if (rm->ubuf == NULL) {
453 rm->dma_buf_v = dma_alloc_coherent(&macio_get_pci_dev(mdev)->dev,
455 &rm->dma_buf_p, GFP_KERNEL);
456 if (rm->dma_buf_v == NULL) {
463 rm->i2s_regs = ioremap(macio_resource_start(mdev, 0), 0x1000);
465 rm->i2s_regs = ioremap(ri2s.start, 0x1000);
467 if (rm->i2s_regs == NULL) {
474 rm->dma_regs = ioremap(macio_resource_start(mdev, 1), 0x100);
476 rm->dma_regs = ioremap(rdma.start, 0x100);
478 if (rm->dma_regs == NULL) {
485 rc = rackmeter_setup(rm);
493 rc = request_irq(rm->irq, rackmeter_irq, 0, "rackmeter", rm);
503 DBDMA_DO_RESET(rm->dma_regs);
505 iounmap(rm->dma_regs);
507 iounmap(rm->i2s_regs);
511 rm->dma_buf_v, rm->dma_buf_p);
513 free_page((unsigned long)rm->ubuf);
519 kfree(rm);
529 struct rackmeter *rm = dev_get_drvdata(&mdev->ofdev.dev);
532 rackmeter_stop_cpu_sniffer(rm);
538 DBDMA_DO_RESET(rm->dma_regs);
541 free_irq(rm->irq, rm);
544 iounmap(rm->dma_regs);
545 iounmap(rm->i2s_regs);
550 rm->dma_buf_v, rm->dma_buf_p);
553 free_page((unsigned long)rm->ubuf);
561 kfree(rm);
568 struct rackmeter *rm = dev_get_drvdata(&mdev->ofdev.dev);
570 if (rm == NULL)
574 rackmeter_stop_cpu_sniffer(rm);
577 DBDMA_DO_RESET(rm->dma_regs);