Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5ebdcbc2 authored by Dmitry Torokhov's avatar Dmitry Torokhov Committed by Greg Kroah-Hartman
Browse files

[PATCH] Input: convert sound/ppc/beep to dynamic input_dev allocation



Input: convert sound/ppc/beep to dynamic input_dev allocation

This is required for input_dev sysfs integration

Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 34abf91f
Loading
Loading
Loading
Loading
+37 −29
Original line number Diff line number Diff line
@@ -38,7 +38,7 @@ struct snd_pmac_beep {
	int nsamples;
	short *buf;		/* allocated wave buffer */
	dma_addr_t addr;	/* physical address of buffer */
	struct input_dev dev;
	struct input_dev *dev;
};

/*
@@ -212,47 +212,55 @@ static snd_kcontrol_new_t snd_pmac_beep_mixer = {
int __init snd_pmac_attach_beep(pmac_t *chip)
{
	pmac_beep_t *beep;
	int err;
	struct input_dev *input_dev;
	void *dmabuf;
	int err = -ENOMEM;

	beep = kmalloc(sizeof(*beep), GFP_KERNEL);
	if (! beep)
		return -ENOMEM;

	memset(beep, 0, sizeof(*beep));
	beep->buf = dma_alloc_coherent(&chip->pdev->dev, BEEP_BUFLEN * 4,
	beep = kzalloc(sizeof(*beep), GFP_KERNEL);
	dmabuf = dma_alloc_coherent(&chip->pdev->dev, BEEP_BUFLEN * 4,
				    &beep->addr, GFP_KERNEL);

	beep->dev.evbit[0] = BIT(EV_SND);
	beep->dev.sndbit[0] = BIT(SND_BELL) | BIT(SND_TONE);
	beep->dev.event = snd_pmac_beep_event;
	beep->dev.private = chip;
	input_dev = input_allocate_device();
	if (!beep || !dmabuf || !input_dev)
		goto fail;

	/* FIXME: set more better values */
	beep->dev.name = "PowerMac Beep";
	beep->dev.phys = "powermac/beep";
	beep->dev.id.bustype = BUS_ADB;
	beep->dev.id.vendor = 0x001f;
	beep->dev.id.product = 0x0001;
	beep->dev.id.version = 0x0100;
	input_dev->name = "PowerMac Beep";
	input_dev->phys = "powermac/beep";
	input_dev->id.bustype = BUS_ADB;
	input_dev->id.vendor = 0x001f;
	input_dev->id.product = 0x0001;
	input_dev->id.version = 0x0100;

	input_dev->evbit[0] = BIT(EV_SND);
	input_dev->sndbit[0] = BIT(SND_BELL) | BIT(SND_TONE);
	input_dev->event = snd_pmac_beep_event;
	input_dev->private = chip;
	input_dev->cdev.dev = &chip->pdev->dev;

	beep->dev = input_dev;
	beep->buf = dmabuf;
	beep->volume = BEEP_VOLUME;
	beep->running = 0;
	if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_pmac_beep_mixer, chip))) < 0) {
		kfree(beep->buf);
		kfree(beep);
		return err;
	}

	err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_pmac_beep_mixer, chip));
	if (err < 0)
		goto fail;

	chip->beep = beep;
	input_register_device(&beep->dev);
	input_register_device(beep->dev);

	return 0;

 fail:	input_free_device(input_dev);
	kfree(dmabuf);
	kfree(beep);
	return err;
}

void snd_pmac_detach_beep(pmac_t *chip)
{
	if (chip->beep) {
		input_unregister_device(&chip->beep->dev);
		input_unregister_device(chip->beep->dev);
		dma_free_coherent(&chip->pdev->dev, BEEP_BUFLEN * 4,
				  chip->beep->buf, chip->beep->addr);
		kfree(chip->beep);