Blame view

sound/ppc/keywest.c 3.54 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  /*
   * common keywest i2c layer
   *
   * Copyright (c) by Takashi Iwai <tiwai@suse.de>
   *
   *   This program is free software; you can redistribute it and/or modify
   *   it under the terms of the GNU General Public License as published by
   *   the Free Software Foundation; either version 2 of the License, or
   *   (at your option) any later version.
   *
   *   This program is distributed in the hope that it will be useful,
   *   but WITHOUT ANY WARRANTY; without even the implied warranty of
   *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   *   GNU General Public License for more details.
   *
   *   You should have received a copy of the GNU General Public License
   *   along with this program; if not, write to the Free Software
   *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
20
21
22
  #include <linux/init.h>
  #include <linux/i2c.h>
  #include <linux/delay.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23
24
25
26
27
28
29
  #include <sound/core.h>
  #include "pmac.h"
  
  /*
   * we have to keep a static variable here since i2c attach_adapter
   * callback cannot pass a private data.
   */
65b29f503   Takashi Iwai   [ALSA] Remove xxx...
30
  static struct pmac_keywest *keywest_ctx;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31

5de4155bb   Jean Delvare   ALSA: keywest: Co...
32
33
34
35
36
37
38
39
40
41
42
43
  static int keywest_probe(struct i2c_client *client,
  			 const struct i2c_device_id *id)
  {
  	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
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
44
45
  static int keywest_attach_adapter(struct i2c_adapter *adapter)
  {
5de4155bb   Jean Delvare   ALSA: keywest: Co...
46
  	struct i2c_board_info info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
47
48
49
  
  	if (! keywest_ctx)
  		return -EINVAL;
903dba1ea   Jean Delvare   ALSA: keywest: Ge...
50
  	if (strncmp(adapter->name, "mac-io", 6))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51
  		return 0; /* ignored */
5de4155bb   Jean Delvare   ALSA: keywest: Co...
52
53
54
55
  	memset(&info, 0, sizeof(struct i2c_board_info));
  	strlcpy(info.type, "keywest", I2C_NAME_SIZE);
  	info.addr = keywest_ctx->addr;
  	keywest_ctx->client = i2c_new_device(adapter, &info);
18c407848   Takashi Iwai   ALSA: Don't assum...
56
57
58
59
60
61
62
63
64
65
66
67
  	if (!keywest_ctx->client)
  		return -ENODEV;
  	/*
  	 * 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->driver) {
  		i2c_unregister_device(keywest_ctx->client);
  		keywest_ctx->client = NULL;
  		return -ENODEV;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
68
  	
5de4155bb   Jean Delvare   ALSA: keywest: Co...
69
70
71
72
73
74
  	/*
  	 * Let i2c-core delete that device on driver removal.
  	 * This is safe because i2c-core holds the core_lock mutex for us.
  	 */
  	list_add_tail(&keywest_ctx->client->detected,
  		      &keywest_ctx->client->driver->clients);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
75
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
76
  }
5de4155bb   Jean Delvare   ALSA: keywest: Co...
77
  static int keywest_remove(struct i2c_client *client)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
78
79
80
81
82
  {
  	if (! keywest_ctx)
  		return 0;
  	if (client == keywest_ctx->client)
  		keywest_ctx->client = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
83
84
  	return 0;
  }
5de4155bb   Jean Delvare   ALSA: keywest: Co...
85
86
87
88
89
  
  static const struct i2c_device_id keywest_i2c_id[] = {
  	{ "keywest", 0 },
  	{ }
  };
a656cbf07   Jean Delvare   sound: Make keywe...
90
  static struct i2c_driver keywest_driver = {
5de4155bb   Jean Delvare   ALSA: keywest: Co...
91
92
93
94
95
96
97
98
  	.driver = {
  		.name = "PMac Keywest Audio",
  	},
  	.attach_adapter = keywest_attach_adapter,
  	.probe = keywest_probe,
  	.remove = keywest_remove,
  	.id_table = keywest_i2c_id,
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
99
  /* exported */
65b29f503   Takashi Iwai   [ALSA] Remove xxx...
100
  void snd_pmac_keywest_cleanup(struct pmac_keywest *i2c)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
101
102
103
104
105
106
  {
  	if (keywest_ctx && keywest_ctx == i2c) {
  		i2c_del_driver(&keywest_driver);
  		keywest_ctx = NULL;
  	}
  }
5c9b6e9e6   Stephen Rothwell   ALSA: sound/ppc: ...
107
  int __devinit snd_pmac_tumbler_post_init(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
108
109
110
  {
  	int err;
  	
783eaf467   Takashi Iwai   [ALSA] powermac -...
111
112
  	if (!keywest_ctx || !keywest_ctx->client)
  		return -ENXIO;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
113
114
115
116
117
118
119
120
121
  	if ((err = keywest_ctx->init_client(keywest_ctx)) < 0) {
  		snd_printk(KERN_ERR "tumbler: %i :cannot initialize the MCS
  ", err);
  		return err;
  	}
  	return 0;
  }
  
  /* exported */
5c9b6e9e6   Stephen Rothwell   ALSA: sound/ppc: ...
122
  int __devinit snd_pmac_keywest_init(struct pmac_keywest *i2c)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
  {
  	int err;
  
  	if (keywest_ctx)
  		return -EBUSY;
  
  	keywest_ctx = i2c;
  
  	if ((err = i2c_add_driver(&keywest_driver))) {
  		snd_printk(KERN_ERR "cannot register keywest i2c driver
  ");
  		return err;
  	}
  	return 0;
  }