diff options
Diffstat (limited to 'sound/ppc')
-rw-r--r-- | sound/ppc/keywest.c | 82 |
1 files changed, 41 insertions, 41 deletions
diff --git a/sound/ppc/keywest.c b/sound/ppc/keywest.c index 6ff99ed77516..a5afb2682e7f 100644 --- a/sound/ppc/keywest.c +++ b/sound/ppc/keywest.c | |||
@@ -33,26 +33,25 @@ | |||
33 | static struct pmac_keywest *keywest_ctx; | 33 | static struct pmac_keywest *keywest_ctx; |
34 | 34 | ||
35 | 35 | ||
36 | static int keywest_attach_adapter(struct i2c_adapter *adapter); | ||
37 | static int keywest_detach_client(struct i2c_client *client); | ||
38 | |||
39 | struct i2c_driver keywest_driver = { | ||
40 | .driver = { | ||
41 | .name = "PMac Keywest Audio", | ||
42 | }, | ||
43 | .attach_adapter = &keywest_attach_adapter, | ||
44 | .detach_client = &keywest_detach_client, | ||
45 | }; | ||
46 | |||
47 | |||
48 | #ifndef i2c_device_name | 36 | #ifndef i2c_device_name |
49 | #define i2c_device_name(x) ((x)->name) | 37 | #define i2c_device_name(x) ((x)->name) |
50 | #endif | 38 | #endif |
51 | 39 | ||
40 | static int keywest_probe(struct i2c_client *client, | ||
41 | const struct i2c_device_id *id) | ||
42 | { | ||
43 | i2c_set_clientdata(client, keywest_ctx); | ||
44 | return 0; | ||
45 | } | ||
46 | |||
47 | /* | ||
48 | * This is kind of a hack, best would be to turn powermac to fixed i2c | ||
49 | * bus numbers and declare the sound device as part of platform | ||
50 | * initialization | ||
51 | */ | ||
52 | static int keywest_attach_adapter(struct i2c_adapter *adapter) | 52 | static int keywest_attach_adapter(struct i2c_adapter *adapter) |
53 | { | 53 | { |
54 | int err; | 54 | struct i2c_board_info info; |
55 | struct i2c_client *new_client; | ||
56 | 55 | ||
57 | if (! keywest_ctx) | 56 | if (! keywest_ctx) |
58 | return -EINVAL; | 57 | return -EINVAL; |
@@ -60,46 +59,47 @@ static int keywest_attach_adapter(struct i2c_adapter *adapter) | |||
60 | if (strncmp(i2c_device_name(adapter), "mac-io", 6)) | 59 | if (strncmp(i2c_device_name(adapter), "mac-io", 6)) |
61 | return 0; /* ignored */ | 60 | return 0; /* ignored */ |
62 | 61 | ||
63 | new_client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL); | 62 | memset(&info, 0, sizeof(struct i2c_board_info)); |
64 | if (! new_client) | 63 | strlcpy(info.type, "keywest", I2C_NAME_SIZE); |
65 | return -ENOMEM; | 64 | info.addr = keywest_ctx->addr; |
66 | 65 | keywest_ctx->client = i2c_new_device(adapter, &info); | |
67 | new_client->addr = keywest_ctx->addr; | ||
68 | i2c_set_clientdata(new_client, keywest_ctx); | ||
69 | new_client->adapter = adapter; | ||
70 | new_client->driver = &keywest_driver; | ||
71 | new_client->flags = 0; | ||
72 | |||
73 | strcpy(i2c_device_name(new_client), keywest_ctx->name); | ||
74 | keywest_ctx->client = new_client; | ||
75 | 66 | ||
76 | /* Tell the i2c layer a new client has arrived */ | 67 | /* |
77 | if (i2c_attach_client(new_client)) { | 68 | * Let i2c-core delete that device on driver removal. |
78 | snd_printk(KERN_ERR "tumbler: cannot attach i2c client\n"); | 69 | * This is safe because i2c-core holds the core_lock mutex for us. |
79 | err = -ENODEV; | 70 | */ |
80 | goto __err; | 71 | list_add_tail(&keywest_ctx->client->detected, |
81 | } | 72 | &keywest_ctx->client->driver->clients); |
82 | |||
83 | return 0; | 73 | return 0; |
84 | |||
85 | __err: | ||
86 | kfree(new_client); | ||
87 | keywest_ctx->client = NULL; | ||
88 | return err; | ||
89 | } | 74 | } |
90 | 75 | ||
91 | static int keywest_detach_client(struct i2c_client *client) | 76 | static int keywest_remove(struct i2c_client *client) |
92 | { | 77 | { |
78 | i2c_set_clientdata(client, NULL); | ||
93 | if (! keywest_ctx) | 79 | if (! keywest_ctx) |
94 | return 0; | 80 | return 0; |
95 | if (client == keywest_ctx->client) | 81 | if (client == keywest_ctx->client) |
96 | keywest_ctx->client = NULL; | 82 | keywest_ctx->client = NULL; |
97 | 83 | ||
98 | i2c_detach_client(client); | ||
99 | kfree(client); | ||
100 | return 0; | 84 | return 0; |
101 | } | 85 | } |
102 | 86 | ||
87 | |||
88 | static const struct i2c_device_id keywest_i2c_id[] = { | ||
89 | { "keywest", 0 }, | ||
90 | { } | ||
91 | }; | ||
92 | |||
93 | struct i2c_driver keywest_driver = { | ||
94 | .driver = { | ||
95 | .name = "PMac Keywest Audio", | ||
96 | }, | ||
97 | .attach_adapter = keywest_attach_adapter, | ||
98 | .probe = keywest_probe, | ||
99 | .remove = keywest_remove, | ||
100 | .id_table = keywest_i2c_id, | ||
101 | }; | ||
102 | |||
103 | /* exported */ | 103 | /* exported */ |
104 | void snd_pmac_keywest_cleanup(struct pmac_keywest *i2c) | 104 | void snd_pmac_keywest_cleanup(struct pmac_keywest *i2c) |
105 | { | 105 | { |