* Free any resources associated with the given @p cpuirq state. * * @param sc BHND MIPS driver instance state. * @param cpuirq A CPU IRQ instance previously successfully initialized * via bcm_mips_init_cpuirq(). * * @retval 0 success * @retval non-zero if finalizing @p cpuirq otherwise fails, a regular * unix error code will be returned. */
| 230 | * unix error code will be returned. |
| 231 | */ |
| 232 | static int |
| 233 | bcm_mips_fini_cpuirq(struct bcm_mips_softc *sc, struct bcm_mips_cpuirq *cpuirq) |
| 234 | { |
| 235 | int error; |
| 236 | |
| 237 | BCM_MIPS_LOCK(sc); |
| 238 | |
| 239 | if (cpuirq->sc == NULL) { |
| 240 | KASSERT(cpuirq->irq_res == NULL, ("leaking cpuirq resource")); |
| 241 | |
| 242 | BCM_MIPS_UNLOCK(sc); |
| 243 | return (0); /* not initialized */ |
| 244 | } |
| 245 | |
| 246 | if (cpuirq->refs != 0) { |
| 247 | BCM_MIPS_UNLOCK(sc); |
| 248 | return (EBUSY); |
| 249 | } |
| 250 | |
| 251 | if (cpuirq->irq_cookie != NULL) { |
| 252 | KASSERT(cpuirq->irq_res != NULL, ("resource missing")); |
| 253 | |
| 254 | error = bus_teardown_intr(sc->dev, cpuirq->irq_res, |
| 255 | cpuirq->irq_cookie); |
| 256 | if (error) { |
| 257 | BCM_MIPS_UNLOCK(sc); |
| 258 | return (error); |
| 259 | } |
| 260 | |
| 261 | cpuirq->irq_cookie = NULL; |
| 262 | } |
| 263 | |
| 264 | if (cpuirq->irq_res != NULL) { |
| 265 | bus_release_resource(sc->dev, SYS_RES_IRQ, cpuirq->irq_rid, |
| 266 | cpuirq->irq_res); |
| 267 | cpuirq->irq_res = NULL; |
| 268 | } |
| 269 | |
| 270 | if (cpuirq->irq_rid != -1) { |
| 271 | bus_delete_resource(sc->dev, SYS_RES_IRQ, cpuirq->irq_rid); |
| 272 | cpuirq->irq_rid = -1; |
| 273 | } |
| 274 | |
| 275 | BCM_MIPS_UNLOCK(sc); |
| 276 | |
| 277 | return (0); |
| 278 | } |
| 279 | |
| 280 | static int |
| 281 | bcm_mips_attach_default(device_t dev) |
no test coverage detected