ALSA: line6: Let snd_card_new() allocate private data
Instead of allocating the private data individually in each driver's probe at first, let snd_card_new() allocate the data that is called in line6_probe(). This simplifies the primary probe functions. Tested-by: Chris Rorvick <chris@rorvick.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Родитель
f66fd990c5
Коммит
aca514b823
|
@ -418,11 +418,7 @@ EXPORT_SYMBOL_GPL(line6_read_serial_number);
|
||||||
static void line6_destruct(struct snd_card *card)
|
static void line6_destruct(struct snd_card *card)
|
||||||
{
|
{
|
||||||
struct usb_line6 *line6 = card->private_data;
|
struct usb_line6 *line6 = card->private_data;
|
||||||
struct usb_device *usbdev;
|
struct usb_device *usbdev = line6->usbdev;
|
||||||
|
|
||||||
if (!line6)
|
|
||||||
return;
|
|
||||||
usbdev = line6->usbdev;
|
|
||||||
|
|
||||||
/* free buffer memory first: */
|
/* free buffer memory first: */
|
||||||
kfree(line6->buffer_message);
|
kfree(line6->buffer_message);
|
||||||
|
@ -431,9 +427,6 @@ static void line6_destruct(struct snd_card *card)
|
||||||
/* then free URBs: */
|
/* then free URBs: */
|
||||||
usb_free_urb(line6->urb_listen);
|
usb_free_urb(line6->urb_listen);
|
||||||
|
|
||||||
/* free interface data: */
|
|
||||||
kfree(line6);
|
|
||||||
|
|
||||||
/* decrement reference counters: */
|
/* decrement reference counters: */
|
||||||
usb_put_dev(usbdev);
|
usb_put_dev(usbdev);
|
||||||
}
|
}
|
||||||
|
@ -489,24 +482,27 @@ static int line6_init_cap_control(struct usb_line6 *line6)
|
||||||
*/
|
*/
|
||||||
int line6_probe(struct usb_interface *interface,
|
int line6_probe(struct usb_interface *interface,
|
||||||
const struct usb_device_id *id,
|
const struct usb_device_id *id,
|
||||||
struct usb_line6 *line6,
|
|
||||||
const struct line6_properties *properties,
|
const struct line6_properties *properties,
|
||||||
int (*private_init)(struct usb_line6 *, const struct usb_device_id *id))
|
int (*private_init)(struct usb_line6 *, const struct usb_device_id *id),
|
||||||
|
size_t data_size)
|
||||||
{
|
{
|
||||||
struct usb_device *usbdev = interface_to_usbdev(interface);
|
struct usb_device *usbdev = interface_to_usbdev(interface);
|
||||||
struct snd_card *card;
|
struct snd_card *card;
|
||||||
|
struct usb_line6 *line6;
|
||||||
int interface_number;
|
int interface_number;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (WARN_ON(data_size < sizeof(*line6)))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
ret = snd_card_new(&interface->dev,
|
ret = snd_card_new(&interface->dev,
|
||||||
SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1,
|
SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1,
|
||||||
THIS_MODULE, 0, &card);
|
THIS_MODULE, data_size, &card);
|
||||||
if (ret < 0) {
|
if (ret < 0)
|
||||||
kfree(line6);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
|
||||||
|
|
||||||
/* store basic data: */
|
/* store basic data: */
|
||||||
|
line6 = card->private_data;
|
||||||
line6->card = card;
|
line6->card = card;
|
||||||
line6->properties = properties;
|
line6->properties = properties;
|
||||||
line6->usbdev = usbdev;
|
line6->usbdev = usbdev;
|
||||||
|
@ -517,7 +513,6 @@ int line6_probe(struct usb_interface *interface,
|
||||||
strcpy(card->shortname, line6->properties->name);
|
strcpy(card->shortname, line6->properties->name);
|
||||||
sprintf(card->longname, "Line 6 %s at USB %s", line6->properties->name,
|
sprintf(card->longname, "Line 6 %s at USB %s", line6->properties->name,
|
||||||
dev_name(line6->ifcdev));
|
dev_name(line6->ifcdev));
|
||||||
card->private_data = line6;
|
|
||||||
card->private_free = line6_destruct;
|
card->private_free = line6_destruct;
|
||||||
|
|
||||||
usb_set_intfdata(interface, line6);
|
usb_set_intfdata(interface, line6);
|
||||||
|
|
|
@ -181,9 +181,9 @@ extern int line6_write_data(struct usb_line6 *line6, int address, void *data,
|
||||||
|
|
||||||
int line6_probe(struct usb_interface *interface,
|
int line6_probe(struct usb_interface *interface,
|
||||||
const struct usb_device_id *id,
|
const struct usb_device_id *id,
|
||||||
struct usb_line6 *line6,
|
|
||||||
const struct line6_properties *properties,
|
const struct line6_properties *properties,
|
||||||
int (*private_init)(struct usb_line6 *, const struct usb_device_id *id));
|
int (*private_init)(struct usb_line6 *, const struct usb_device_id *id),
|
||||||
|
size_t data_size);
|
||||||
|
|
||||||
void line6_disconnect(struct usb_interface *interface);
|
void line6_disconnect(struct usb_interface *interface);
|
||||||
|
|
||||||
|
|
|
@ -591,14 +591,9 @@ static const struct line6_properties pod_properties_table[] = {
|
||||||
static int pod_probe(struct usb_interface *interface,
|
static int pod_probe(struct usb_interface *interface,
|
||||||
const struct usb_device_id *id)
|
const struct usb_device_id *id)
|
||||||
{
|
{
|
||||||
struct usb_line6_pod *pod;
|
return line6_probe(interface, id,
|
||||||
|
|
||||||
pod = kzalloc(sizeof(*pod), GFP_KERNEL);
|
|
||||||
if (!pod)
|
|
||||||
return -ENODEV;
|
|
||||||
return line6_probe(interface, id, &pod->line6,
|
|
||||||
&pod_properties_table[id->driver_info],
|
&pod_properties_table[id->driver_info],
|
||||||
pod_init);
|
pod_init, sizeof(struct usb_line6_pod));
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct usb_driver pod_driver = {
|
static struct usb_driver pod_driver = {
|
||||||
|
|
|
@ -177,14 +177,9 @@ static const struct line6_properties podhd_properties_table[] = {
|
||||||
static int podhd_probe(struct usb_interface *interface,
|
static int podhd_probe(struct usb_interface *interface,
|
||||||
const struct usb_device_id *id)
|
const struct usb_device_id *id)
|
||||||
{
|
{
|
||||||
struct usb_line6_podhd *podhd;
|
return line6_probe(interface, id,
|
||||||
|
|
||||||
podhd = kzalloc(sizeof(*podhd), GFP_KERNEL);
|
|
||||||
if (!podhd)
|
|
||||||
return -ENODEV;
|
|
||||||
return line6_probe(interface, id, &podhd->line6,
|
|
||||||
&podhd_properties_table[id->driver_info],
|
&podhd_properties_table[id->driver_info],
|
||||||
podhd_init);
|
podhd_init, sizeof(struct usb_line6_podhd));
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct usb_driver podhd_driver = {
|
static struct usb_driver podhd_driver = {
|
||||||
|
|
|
@ -558,14 +558,9 @@ static const struct line6_properties toneport_properties_table[] = {
|
||||||
static int toneport_probe(struct usb_interface *interface,
|
static int toneport_probe(struct usb_interface *interface,
|
||||||
const struct usb_device_id *id)
|
const struct usb_device_id *id)
|
||||||
{
|
{
|
||||||
struct usb_line6_toneport *toneport;
|
return line6_probe(interface, id,
|
||||||
|
|
||||||
toneport = kzalloc(sizeof(*toneport), GFP_KERNEL);
|
|
||||||
if (!toneport)
|
|
||||||
return -ENODEV;
|
|
||||||
return line6_probe(interface, id, &toneport->line6,
|
|
||||||
&toneport_properties_table[id->driver_info],
|
&toneport_properties_table[id->driver_info],
|
||||||
toneport_init);
|
toneport_init, sizeof(struct usb_line6_toneport));
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct usb_driver toneport_driver = {
|
static struct usb_driver toneport_driver = {
|
||||||
|
|
|
@ -296,14 +296,9 @@ static const struct line6_properties variax_properties_table[] = {
|
||||||
static int variax_probe(struct usb_interface *interface,
|
static int variax_probe(struct usb_interface *interface,
|
||||||
const struct usb_device_id *id)
|
const struct usb_device_id *id)
|
||||||
{
|
{
|
||||||
struct usb_line6_variax *variax;
|
return line6_probe(interface, id,
|
||||||
|
|
||||||
variax = kzalloc(sizeof(*variax), GFP_KERNEL);
|
|
||||||
if (!variax)
|
|
||||||
return -ENODEV;
|
|
||||||
return line6_probe(interface, id, &variax->line6,
|
|
||||||
&variax_properties_table[id->driver_info],
|
&variax_properties_table[id->driver_info],
|
||||||
variax_init);
|
variax_init, sizeof(struct usb_line6_variax));
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct usb_driver variax_driver = {
|
static struct usb_driver variax_driver = {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче