Lines Matching refs:fm

25 static void tifm_7xx1_dummy_eject(struct tifm_adapter *fm,  in tifm_7xx1_dummy_eject()  argument
30 static void tifm_7xx1_eject(struct tifm_adapter *fm, struct tifm_dev *sock) in tifm_7xx1_eject() argument
34 spin_lock_irqsave(&fm->lock, flags); in tifm_7xx1_eject()
35 fm->socket_change_set |= 1 << sock->socket_id; in tifm_7xx1_eject()
36 tifm_queue_work(&fm->media_switcher); in tifm_7xx1_eject()
37 spin_unlock_irqrestore(&fm->lock, flags); in tifm_7xx1_eject()
42 struct tifm_adapter *fm = dev_id; in tifm_7xx1_isr() local
46 spin_lock(&fm->lock); in tifm_7xx1_isr()
47 irq_status = readl(fm->addr + FM_INTERRUPT_STATUS); in tifm_7xx1_isr()
49 spin_unlock(&fm->lock); in tifm_7xx1_isr()
54 writel(TIFM_IRQ_ENABLE, fm->addr + FM_CLEAR_INTERRUPT_ENABLE); in tifm_7xx1_isr()
56 for (cnt = 0; cnt < fm->num_sockets; cnt++) { in tifm_7xx1_isr()
57 sock = fm->sockets[cnt]; in tifm_7xx1_isr()
66 fm->socket_change_set |= irq_status in tifm_7xx1_isr()
67 & ((1 << fm->num_sockets) - 1); in tifm_7xx1_isr()
69 writel(irq_status, fm->addr + FM_INTERRUPT_STATUS); in tifm_7xx1_isr()
71 if (fm->finish_me) in tifm_7xx1_isr()
72 complete_all(fm->finish_me); in tifm_7xx1_isr()
73 else if (!fm->socket_change_set) in tifm_7xx1_isr()
74 writel(TIFM_IRQ_ENABLE, fm->addr + FM_SET_INTERRUPT_ENABLE); in tifm_7xx1_isr()
76 tifm_queue_work(&fm->media_switcher); in tifm_7xx1_isr()
78 spin_unlock(&fm->lock); in tifm_7xx1_isr()
141 struct tifm_adapter *fm = container_of(work, struct tifm_adapter, in tifm_7xx1_switch_media() local
149 spin_lock_irqsave(&fm->lock, flags); in tifm_7xx1_switch_media()
150 socket_change_set = fm->socket_change_set; in tifm_7xx1_switch_media()
151 fm->socket_change_set = 0; in tifm_7xx1_switch_media()
153 dev_dbg(fm->dev.parent, "checking media set %x\n", in tifm_7xx1_switch_media()
157 spin_unlock_irqrestore(&fm->lock, flags); in tifm_7xx1_switch_media()
161 for (cnt = 0; cnt < fm->num_sockets; cnt++) { in tifm_7xx1_switch_media()
164 sock = fm->sockets[cnt]; in tifm_7xx1_switch_media()
168 dev_name(&fm->dev), fm->id, cnt); in tifm_7xx1_switch_media()
169 fm->sockets[cnt] = NULL; in tifm_7xx1_switch_media()
171 spin_unlock_irqrestore(&fm->lock, flags); in tifm_7xx1_switch_media()
173 spin_lock_irqsave(&fm->lock, flags); in tifm_7xx1_switch_media()
178 spin_unlock_irqrestore(&fm->lock, flags); in tifm_7xx1_switch_media()
181 tifm_7xx1_sock_addr(fm->addr, cnt)); in tifm_7xx1_switch_media()
184 sock = tifm_alloc_device(fm, cnt, media_id); in tifm_7xx1_switch_media()
186 sock->addr = tifm_7xx1_sock_addr(fm->addr, cnt); in tifm_7xx1_switch_media()
189 spin_lock_irqsave(&fm->lock, flags); in tifm_7xx1_switch_media()
190 if (!fm->sockets[cnt]) { in tifm_7xx1_switch_media()
191 fm->sockets[cnt] = sock; in tifm_7xx1_switch_media()
194 spin_unlock_irqrestore(&fm->lock, flags); in tifm_7xx1_switch_media()
199 spin_lock_irqsave(&fm->lock, flags); in tifm_7xx1_switch_media()
204 fm->addr + FM_CLEAR_INTERRUPT_ENABLE); in tifm_7xx1_switch_media()
208 fm->addr + FM_SET_INTERRUPT_ENABLE); in tifm_7xx1_switch_media()
210 writel(TIFM_IRQ_ENABLE, fm->addr + FM_SET_INTERRUPT_ENABLE); in tifm_7xx1_switch_media()
211 spin_unlock_irqrestore(&fm->lock, flags); in tifm_7xx1_switch_media()
218 struct tifm_adapter *fm = pci_get_drvdata(dev); in tifm_7xx1_suspend() local
223 for (cnt = 0; cnt < fm->num_sockets; cnt++) { in tifm_7xx1_suspend()
224 if (fm->sockets[cnt]) in tifm_7xx1_suspend()
225 tifm_7xx1_sock_power_off(fm->sockets[cnt]->addr); in tifm_7xx1_suspend()
237 struct tifm_adapter *fm = pci_get_drvdata(dev); in tifm_7xx1_resume() local
246 if (WARN_ON(fm->num_sockets > ARRAY_SIZE(new_ids))) in tifm_7xx1_resume()
258 for (rc = 0; rc < fm->num_sockets; rc++) in tifm_7xx1_resume()
260 tifm_7xx1_sock_addr(fm->addr, rc)); in tifm_7xx1_resume()
261 spin_lock_irqsave(&fm->lock, flags); in tifm_7xx1_resume()
262 for (rc = 0; rc < fm->num_sockets; rc++) { in tifm_7xx1_resume()
263 if (fm->sockets[rc]) { in tifm_7xx1_resume()
264 if (fm->sockets[rc]->type == new_ids[rc]) in tifm_7xx1_resume()
271 writel(TIFM_IRQ_ENABLE | TIFM_IRQ_SOCKMASK((1 << fm->num_sockets) - 1), in tifm_7xx1_resume()
272 fm->addr + FM_SET_INTERRUPT_ENABLE); in tifm_7xx1_resume()
276 fm->socket_change_set = 0; in tifm_7xx1_resume()
278 fm->finish_me = &finish_resume; in tifm_7xx1_resume()
279 spin_unlock_irqrestore(&fm->lock, flags); in tifm_7xx1_resume()
284 fm->addr + FM_CLEAR_INTERRUPT_ENABLE); in tifm_7xx1_resume()
287 fm->addr + FM_SET_INTERRUPT_ENABLE); in tifm_7xx1_resume()
288 spin_lock_irqsave(&fm->lock, flags); in tifm_7xx1_resume()
289 fm->finish_me = NULL; in tifm_7xx1_resume()
290 fm->socket_change_set ^= good_sockets & fm->socket_change_set; in tifm_7xx1_resume()
293 fm->socket_change_set |= bad_sockets; in tifm_7xx1_resume()
294 if (fm->socket_change_set) in tifm_7xx1_resume()
295 tifm_queue_work(&fm->media_switcher); in tifm_7xx1_resume()
297 spin_unlock_irqrestore(&fm->lock, flags); in tifm_7xx1_resume()
299 fm->addr + FM_SET_INTERRUPT_ENABLE); in tifm_7xx1_resume()
311 static int tifm_7xx1_dummy_has_ms_pif(struct tifm_adapter *fm, in tifm_7xx1_dummy_has_ms_pif() argument
317 static int tifm_7xx1_has_ms_pif(struct tifm_adapter *fm, struct tifm_dev *sock) in tifm_7xx1_has_ms_pif() argument
319 if (((fm->num_sockets == 4) && (sock->socket_id == 2)) in tifm_7xx1_has_ms_pif()
320 || ((fm->num_sockets == 2) && (sock->socket_id == 0))) in tifm_7xx1_has_ms_pif()
329 struct tifm_adapter *fm; in tifm_7xx1_probe() local
351 fm = tifm_alloc_adapter(dev->device == PCI_DEVICE_ID_TI_XX21_XX11_FM in tifm_7xx1_probe()
353 if (!fm) { in tifm_7xx1_probe()
358 INIT_WORK(&fm->media_switcher, tifm_7xx1_switch_media); in tifm_7xx1_probe()
359 fm->eject = tifm_7xx1_eject; in tifm_7xx1_probe()
360 fm->has_ms_pif = tifm_7xx1_has_ms_pif; in tifm_7xx1_probe()
361 pci_set_drvdata(dev, fm); in tifm_7xx1_probe()
363 fm->addr = pci_ioremap_bar(dev, 0); in tifm_7xx1_probe()
364 if (!fm->addr) { in tifm_7xx1_probe()
369 rc = request_irq(dev->irq, tifm_7xx1_isr, IRQF_SHARED, DRIVER_NAME, fm); in tifm_7xx1_probe()
373 rc = tifm_add_adapter(fm); in tifm_7xx1_probe()
377 writel(TIFM_IRQ_ENABLE | TIFM_IRQ_SOCKMASK((1 << fm->num_sockets) - 1), in tifm_7xx1_probe()
378 fm->addr + FM_CLEAR_INTERRUPT_ENABLE); in tifm_7xx1_probe()
379 writel(TIFM_IRQ_ENABLE | TIFM_IRQ_SOCKMASK((1 << fm->num_sockets) - 1), in tifm_7xx1_probe()
380 fm->addr + FM_SET_INTERRUPT_ENABLE); in tifm_7xx1_probe()
384 free_irq(dev->irq, fm); in tifm_7xx1_probe()
386 iounmap(fm->addr); in tifm_7xx1_probe()
388 tifm_free_adapter(fm); in tifm_7xx1_probe()
400 struct tifm_adapter *fm = pci_get_drvdata(dev); in tifm_7xx1_remove() local
403 fm->eject = tifm_7xx1_dummy_eject; in tifm_7xx1_remove()
404 fm->has_ms_pif = tifm_7xx1_dummy_has_ms_pif; in tifm_7xx1_remove()
405 writel(TIFM_IRQ_SETALL, fm->addr + FM_CLEAR_INTERRUPT_ENABLE); in tifm_7xx1_remove()
407 free_irq(dev->irq, fm); in tifm_7xx1_remove()
409 tifm_remove_adapter(fm); in tifm_7xx1_remove()
411 for (cnt = 0; cnt < fm->num_sockets; cnt++) in tifm_7xx1_remove()
412 tifm_7xx1_sock_power_off(tifm_7xx1_sock_addr(fm->addr, cnt)); in tifm_7xx1_remove()
414 iounmap(fm->addr); in tifm_7xx1_remove()
419 tifm_free_adapter(fm); in tifm_7xx1_remove()