cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

powermac.c (4546B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * Driver for PowerMac AWACS
      4 * Copyright (c) 2001 by Takashi Iwai <tiwai@suse.de>
      5 *   based on dmasound.c.
      6 */
      7
      8#include <linux/init.h>
      9#include <linux/err.h>
     10#include <linux/platform_device.h>
     11#include <linux/module.h>
     12#include <sound/core.h>
     13#include <sound/initval.h>
     14#include "pmac.h"
     15#include "awacs.h"
     16#include "burgundy.h"
     17
     18#define CHIP_NAME "PMac"
     19
     20MODULE_DESCRIPTION("PowerMac");
     21MODULE_LICENSE("GPL");
     22
     23static int index = SNDRV_DEFAULT_IDX1;		/* Index 0-MAX */
     24static char *id = SNDRV_DEFAULT_STR1;		/* ID for this card */
     25static bool enable_beep = 1;
     26
     27module_param(index, int, 0444);
     28MODULE_PARM_DESC(index, "Index value for " CHIP_NAME " soundchip.");
     29module_param(id, charp, 0444);
     30MODULE_PARM_DESC(id, "ID string for " CHIP_NAME " soundchip.");
     31module_param(enable_beep, bool, 0444);
     32MODULE_PARM_DESC(enable_beep, "Enable beep using PCM.");
     33
     34static struct platform_device *device;
     35
     36
     37/*
     38 */
     39
     40static int snd_pmac_probe(struct platform_device *devptr)
     41{
     42	struct snd_card *card;
     43	struct snd_pmac *chip;
     44	char *name_ext;
     45	int err;
     46
     47	err = snd_card_new(&devptr->dev, index, id, THIS_MODULE, 0, &card);
     48	if (err < 0)
     49		return err;
     50
     51	err = snd_pmac_new(card, &chip);
     52	if (err < 0)
     53		goto __error;
     54	card->private_data = chip;
     55
     56	switch (chip->model) {
     57	case PMAC_BURGUNDY:
     58		strcpy(card->driver, "PMac Burgundy");
     59		strcpy(card->shortname, "PowerMac Burgundy");
     60		sprintf(card->longname, "%s (Dev %d) Sub-frame %d",
     61			card->shortname, chip->device_id, chip->subframe);
     62		err = snd_pmac_burgundy_init(chip);
     63		if (err < 0)
     64			goto __error;
     65		break;
     66	case PMAC_DACA:
     67		strcpy(card->driver, "PMac DACA");
     68		strcpy(card->shortname, "PowerMac DACA");
     69		sprintf(card->longname, "%s (Dev %d) Sub-frame %d",
     70			card->shortname, chip->device_id, chip->subframe);
     71		err = snd_pmac_daca_init(chip);
     72		if (err < 0)
     73			goto __error;
     74		break;
     75	case PMAC_TUMBLER:
     76	case PMAC_SNAPPER:
     77		name_ext = chip->model == PMAC_TUMBLER ? "Tumbler" : "Snapper";
     78		sprintf(card->driver, "PMac %s", name_ext);
     79		sprintf(card->shortname, "PowerMac %s", name_ext);
     80		sprintf(card->longname, "%s (Dev %d) Sub-frame %d",
     81			card->shortname, chip->device_id, chip->subframe);
     82		err = snd_pmac_tumbler_init(chip);
     83		if (err < 0)
     84			goto __error;
     85		err = snd_pmac_tumbler_post_init();
     86		if (err < 0)
     87			goto __error;
     88		break;
     89	case PMAC_AWACS:
     90	case PMAC_SCREAMER:
     91		name_ext = chip->model == PMAC_SCREAMER ? "Screamer" : "AWACS";
     92		sprintf(card->driver, "PMac %s", name_ext);
     93		sprintf(card->shortname, "PowerMac %s", name_ext);
     94		if (chip->is_pbook_3400)
     95			name_ext = " [PB3400]";
     96		else if (chip->is_pbook_G3)
     97			name_ext = " [PBG3]";
     98		else
     99			name_ext = "";
    100		sprintf(card->longname, "%s%s Rev %d",
    101			card->shortname, name_ext, chip->revision);
    102		err = snd_pmac_awacs_init(chip);
    103		if (err < 0)
    104			goto __error;
    105		break;
    106	default:
    107		snd_printk(KERN_ERR "unsupported hardware %d\n", chip->model);
    108		err = -EINVAL;
    109		goto __error;
    110	}
    111
    112	err = snd_pmac_pcm_new(chip);
    113	if (err < 0)
    114		goto __error;
    115
    116	chip->initialized = 1;
    117	if (enable_beep)
    118		snd_pmac_attach_beep(chip);
    119
    120	err = snd_card_register(card);
    121	if (err < 0)
    122		goto __error;
    123
    124	platform_set_drvdata(devptr, card);
    125	return 0;
    126
    127__error:
    128	snd_card_free(card);
    129	return err;
    130}
    131
    132
    133static int snd_pmac_remove(struct platform_device *devptr)
    134{
    135	snd_card_free(platform_get_drvdata(devptr));
    136	return 0;
    137}
    138
    139#ifdef CONFIG_PM_SLEEP
    140static int snd_pmac_driver_suspend(struct device *dev)
    141{
    142	struct snd_card *card = dev_get_drvdata(dev);
    143	snd_pmac_suspend(card->private_data);
    144	return 0;
    145}
    146
    147static int snd_pmac_driver_resume(struct device *dev)
    148{
    149	struct snd_card *card = dev_get_drvdata(dev);
    150	snd_pmac_resume(card->private_data);
    151	return 0;
    152}
    153
    154static SIMPLE_DEV_PM_OPS(snd_pmac_pm, snd_pmac_driver_suspend, snd_pmac_driver_resume);
    155#define SND_PMAC_PM_OPS	&snd_pmac_pm
    156#else
    157#define SND_PMAC_PM_OPS	NULL
    158#endif
    159
    160#define SND_PMAC_DRIVER		"snd_powermac"
    161
    162static struct platform_driver snd_pmac_driver = {
    163	.probe		= snd_pmac_probe,
    164	.remove		= snd_pmac_remove,
    165	.driver		= {
    166		.name	= SND_PMAC_DRIVER,
    167		.pm	= SND_PMAC_PM_OPS,
    168	},
    169};
    170
    171static int __init alsa_card_pmac_init(void)
    172{
    173	int err;
    174
    175	err = platform_driver_register(&snd_pmac_driver);
    176	if (err < 0)
    177		return err;
    178	device = platform_device_register_simple(SND_PMAC_DRIVER, -1, NULL, 0);
    179	return 0;
    180
    181}
    182
    183static void __exit alsa_card_pmac_exit(void)
    184{
    185	if (!IS_ERR(device))
    186		platform_device_unregister(device);
    187	platform_driver_unregister(&snd_pmac_driver);
    188}
    189
    190module_init(alsa_card_pmac_init)
    191module_exit(alsa_card_pmac_exit)