sound/ppc/keywest.c
Source file repositories/reference/linux-study-clean/sound/ppc/keywest.c
File Facts
- System
- Linux kernel
- Corpus path
sound/ppc/keywest.c- Extension
.c- Size
- 3453 bytes
- Lines
- 156
- Domain
- Driver Families
- Bucket
- sound/ppc
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/init.hlinux/i2c.hlinux/delay.hlinux/module.hsound/core.hpmac.h
Detected Declarations
function keywest_probefunction keywest_attach_adapterfunction keywest_removefunction snd_pmac_keywest_cleanupfunction snd_pmac_tumbler_post_initfunction snd_pmac_keywest_init
Annotated Snippet
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* common keywest i2c layer
*
* Copyright (c) by Takashi Iwai <tiwai@suse.de>
*/
#include <linux/init.h>
#include <linux/i2c.h>
#include <linux/delay.h>
#include <linux/module.h>
#include <sound/core.h>
#include "pmac.h"
static struct pmac_keywest *keywest_ctx;
static bool keywest_probed;
static int keywest_probe(struct i2c_client *client)
{
keywest_probed = true;
/* If instantiated via i2c-powermac, we still need to set the client */
if (!keywest_ctx->client)
keywest_ctx->client = client;
i2c_set_clientdata(client, keywest_ctx);
return 0;
}
/*
* This is kind of a hack, best would be to turn powermac to fixed i2c
* bus numbers and declare the sound device as part of platform
* initialization
*/
static int keywest_attach_adapter(struct i2c_adapter *adapter)
{
struct i2c_board_info info;
struct i2c_client *client;
if (! keywest_ctx)
return -EINVAL;
if (strncmp(adapter->name, "mac-io", 6))
return -EINVAL; /* ignored */
memset(&info, 0, sizeof(struct i2c_board_info));
strscpy(info.type, "keywest", I2C_NAME_SIZE);
info.addr = keywest_ctx->addr;
client = i2c_new_client_device(adapter, &info);
if (IS_ERR(client))
return PTR_ERR(client);
keywest_ctx->client = client;
/*
* We know the driver is already loaded, so the device should be
* already bound. If not it means binding failed, and then there
* is no point in keeping the device instantiated.
*/
if (!keywest_ctx->client->dev.driver) {
i2c_unregister_device(keywest_ctx->client);
keywest_ctx->client = NULL;
return -ENODEV;
}
return 0;
}
static void keywest_remove(struct i2c_client *client)
{
if (! keywest_ctx)
return;
if (client == keywest_ctx->client)
keywest_ctx->client = NULL;
}
static const struct i2c_device_id keywest_i2c_id[] = {
{ "MAC,tas3004" }, /* instantiated by i2c-powermac */
{ "keywest" }, /* instantiated by us if needed */
{ }
};
MODULE_DEVICE_TABLE(i2c, keywest_i2c_id);
static struct i2c_driver keywest_driver = {
.driver = {
.name = "PMac Keywest Audio",
},
.probe = keywest_probe,
.remove = keywest_remove,
.id_table = keywest_i2c_id,
};
Annotation
- Immediate include surface: `linux/init.h`, `linux/i2c.h`, `linux/delay.h`, `linux/module.h`, `sound/core.h`, `pmac.h`.
- Detected declarations: `function keywest_probe`, `function keywest_attach_adapter`, `function keywest_remove`, `function snd_pmac_keywest_cleanup`, `function snd_pmac_tumbler_post_init`, `function snd_pmac_keywest_init`.
- Atlas domain: Driver Families / sound/ppc.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.