struct subchannel *cio_probe_console(void) { struct subchannel_id schid; struct subchannel *sch; int sch_no, ret; sch_no = cio_get_console_sch_no(); if (sch_no == -1) { pr_warning("No CCW console was found\n"); return ERR_PTR(-ENODEV); } init_subchannel_id(&schid); schid.sch_no = sch_no; sch = css_alloc_subchannel(schid); if (IS_ERR(sch)) return sch; lockdep_set_class(sch->lock, &console_sch_key); isc_register(CONSOLE_ISC); sch->config.isc = CONSOLE_ISC; sch->config.intparm = (u32)(addr_t)sch; ret = cio_commit_config(sch); if (ret) { isc_unregister(CONSOLE_ISC); put_device(&sch->dev); return ERR_PTR(ret); } console_sch = sch; return sch; }
struct subchannel *cio_probe_console(void) { struct subchannel_id schid; struct subchannel *sch; int sch_no, ret; sch_no = cio_get_console_sch_no(); if (sch_no == -1) { pr_warning("No CCW console was found\n"); return ERR_PTR(-ENODEV); } init_subchannel_id(&schid); schid.sch_no = sch_no; sch = css_alloc_subchannel(schid); if (IS_ERR(sch)) return sch; lockdep_set_class(sch->lock, &console_sch_key); isc_reg
struct subchannel * cio_probe_console(void) { int sch_no, ret; struct subchannel_id schid; if (xchg(&console_subchannel_in_use, 1) != 0) return ERR_PTR(-EBUSY); sch_no = cio_get_console_sch_no(); if (sch_no == -1) { console_subchannel_in_use = 0; pr_warning("No CCW console was found\n"); return ERR_PTR(-ENODEV); } memset(&console_subchannel, 0, sizeof(struct subchannel)); init_subchannel_id(&schid); schid.sch_no = sch_no; ret = cio_validate_subchannel(&console_subchannel, schid); if (ret) { console_subchannel_in_use = 0; return ERR_PTR(-ENODEV); } /* * enable console I/O-interrupt subclass */ isc_register(CONSOLE_ISC); console_subchannel.config.isc = CONSOLE_ISC; console_subchannel.config.intparm = (u32)(addr_t)&console_subchannel; ret = cio_commit_config(&console_subchannel); if (ret) { isc_unregister(CONSOLE_ISC); console_subchannel_in_use = 0; return ERR_PTR(ret); } return &console_subchannel; }
struct subchannel * cio_probe_console(void) { int sch_no, ret; struct subchannel_id schid; if (xchg(&console_subchannel_in_use, 1) != 0) return ERR_PTR(-EBUSY); sch_no = cio_get_console_sch_no(); if (sch_no == -1) { console_subchannel_in_use = 0; return ERR_PTR(-ENODEV); } memset(&console_subchannel, 0, sizeof(struct subchannel)); init_subchannel_id(&schid); schid.sch_no = sch_no; ret = cio_validate_subchannel(&console_subchannel, schid); if (ret) { console_subchannel_in_use = 0; return ERR_PTR(-ENODEV); } /* * enable console I/O-interrupt subclass 7 */ ctl_set_bit(6, 24); console_subchannel.schib.pmcw.isc = 7; console_subchannel.schib.pmcw.intparm = (__u32)(unsigned long)&console_subchannel; ret = cio_modify(&console_subchannel); if (ret) { console_subchannel_in_use = 0; return ERR_PTR(ret); } return &console_subchannel; }