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
242 unsigned char new_ids[fm->num_sockets]; in tifm_7xx1_resume()
254 for (rc = 0; rc < fm->num_sockets; rc++) in tifm_7xx1_resume()
256 tifm_7xx1_sock_addr(fm->addr, rc)); in tifm_7xx1_resume()
257 spin_lock_irqsave(&fm->lock, flags); in tifm_7xx1_resume()
258 for (rc = 0; rc < fm->num_sockets; rc++) { in tifm_7xx1_resume()
259 if (fm->sockets[rc]) { in tifm_7xx1_resume()
260 if (fm->sockets[rc]->type == new_ids[rc]) in tifm_7xx1_resume()
267 writel(TIFM_IRQ_ENABLE | TIFM_IRQ_SOCKMASK((1 << fm->num_sockets) - 1), in tifm_7xx1_resume()
268 fm->addr + FM_SET_INTERRUPT_ENABLE); in tifm_7xx1_resume()
272 fm->socket_change_set = 0; in tifm_7xx1_resume()
274 fm->finish_me = &finish_resume; in tifm_7xx1_resume()
275 spin_unlock_irqrestore(&fm->lock, flags); in tifm_7xx1_resume()
280 fm->addr + FM_CLEAR_INTERRUPT_ENABLE); in tifm_7xx1_resume()
283 fm->addr + FM_SET_INTERRUPT_ENABLE); in tifm_7xx1_resume()
284 spin_lock_irqsave(&fm->lock, flags); in tifm_7xx1_resume()
285 fm->finish_me = NULL; in tifm_7xx1_resume()
286 fm->socket_change_set ^= good_sockets & fm->socket_change_set; in tifm_7xx1_resume()
289 fm->socket_change_set |= bad_sockets; in tifm_7xx1_resume()
290 if (fm->socket_change_set) in tifm_7xx1_resume()
291 tifm_queue_work(&fm->media_switcher); in tifm_7xx1_resume()
293 spin_unlock_irqrestore(&fm->lock, flags); in tifm_7xx1_resume()
295 fm->addr + FM_SET_INTERRUPT_ENABLE); in tifm_7xx1_resume()
307 static int tifm_7xx1_dummy_has_ms_pif(struct tifm_adapter *fm, in tifm_7xx1_dummy_has_ms_pif() argument
313 static int tifm_7xx1_has_ms_pif(struct tifm_adapter *fm, struct tifm_dev *sock) in tifm_7xx1_has_ms_pif() argument
315 if (((fm->num_sockets == 4) && (sock->socket_id == 2)) in tifm_7xx1_has_ms_pif()
316 || ((fm->num_sockets == 2) && (sock->socket_id == 0))) in tifm_7xx1_has_ms_pif()
325 struct tifm_adapter *fm; in tifm_7xx1_probe() local
347 fm = tifm_alloc_adapter(dev->device == PCI_DEVICE_ID_TI_XX21_XX11_FM in tifm_7xx1_probe()
349 if (!fm) { in tifm_7xx1_probe()
354 INIT_WORK(&fm->media_switcher, tifm_7xx1_switch_media); in tifm_7xx1_probe()
355 fm->eject = tifm_7xx1_eject; in tifm_7xx1_probe()
356 fm->has_ms_pif = tifm_7xx1_has_ms_pif; in tifm_7xx1_probe()
357 pci_set_drvdata(dev, fm); in tifm_7xx1_probe()
359 fm->addr = pci_ioremap_bar(dev, 0); in tifm_7xx1_probe()
360 if (!fm->addr) { in tifm_7xx1_probe()
365 rc = request_irq(dev->irq, tifm_7xx1_isr, IRQF_SHARED, DRIVER_NAME, fm); in tifm_7xx1_probe()
369 rc = tifm_add_adapter(fm); in tifm_7xx1_probe()
373 writel(TIFM_IRQ_ENABLE | TIFM_IRQ_SOCKMASK((1 << fm->num_sockets) - 1), in tifm_7xx1_probe()
374 fm->addr + FM_CLEAR_INTERRUPT_ENABLE); in tifm_7xx1_probe()
375 writel(TIFM_IRQ_ENABLE | TIFM_IRQ_SOCKMASK((1 << fm->num_sockets) - 1), in tifm_7xx1_probe()
376 fm->addr + FM_SET_INTERRUPT_ENABLE); in tifm_7xx1_probe()
380 free_irq(dev->irq, fm); in tifm_7xx1_probe()
382 iounmap(fm->addr); in tifm_7xx1_probe()
384 tifm_free_adapter(fm); in tifm_7xx1_probe()
396 struct tifm_adapter *fm = pci_get_drvdata(dev); in tifm_7xx1_remove() local
399 fm->eject = tifm_7xx1_dummy_eject; in tifm_7xx1_remove()
400 fm->has_ms_pif = tifm_7xx1_dummy_has_ms_pif; in tifm_7xx1_remove()
401 writel(TIFM_IRQ_SETALL, fm->addr + FM_CLEAR_INTERRUPT_ENABLE); in tifm_7xx1_remove()
403 free_irq(dev->irq, fm); in tifm_7xx1_remove()
405 tifm_remove_adapter(fm); in tifm_7xx1_remove()
407 for (cnt = 0; cnt < fm->num_sockets; cnt++) in tifm_7xx1_remove()
408 tifm_7xx1_sock_power_off(tifm_7xx1_sock_addr(fm->addr, cnt)); in tifm_7xx1_remove()
410 iounmap(fm->addr); in tifm_7xx1_remove()
415 tifm_free_adapter(fm); in tifm_7xx1_remove()