int linedisp_register()

in line-display.c [205:244]


int linedisp_register(struct linedisp *linedisp, struct device *parent,
		      unsigned int num_chars, char *buf,
		      void (*update)(struct linedisp *linedisp))
{
	static atomic_t linedisp_id = ATOMIC_INIT(-1);
	int err;

	memset(linedisp, 0, sizeof(*linedisp));
	linedisp->dev.parent = parent;
	linedisp->dev.type = &linedisp_type;
	linedisp->update = update;
	linedisp->buf = buf;
	linedisp->num_chars = num_chars;
	linedisp->scroll_rate = DEFAULT_SCROLL_RATE;

	device_initialize(&linedisp->dev);
	dev_set_name(&linedisp->dev, "linedisp.%lu",
		     (unsigned long)atomic_inc_return(&linedisp_id));

	/* initialise a timer for scrolling the message */
	timer_setup(&linedisp->timer, linedisp_scroll, 0);

	err = device_add(&linedisp->dev);
	if (err)
		goto out_del_timer;

	/* display a default message */
	err = linedisp_display(linedisp, "Linux " UTS_RELEASE "       ", -1);
	if (err)
		goto out_del_dev;

	return 0;

out_del_dev:
	device_del(&linedisp->dev);
out_del_timer:
	del_timer_sync(&linedisp->timer);
	put_device(&linedisp->dev);
	return err;
}