OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [sound/] [ppc/] [keywest.c] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 * common keywest i2c layer
3
 *
4
 * Copyright (c) by Takashi Iwai <tiwai@suse.de>
5
 *
6
 *   This program is free software; you can redistribute it and/or modify
7
 *   it under the terms of the GNU General Public License as published by
8
 *   the Free Software Foundation; either version 2 of the License, or
9
 *   (at your option) any later version.
10
 *
11
 *   This program is distributed in the hope that it will be useful,
12
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 *   GNU General Public License for more details.
15
 *
16
 *   You should have received a copy of the GNU General Public License
17
 *   along with this program; if not, write to the Free Software
18
 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19
 */
20
 
21
 
22
#include <sound/driver.h>
23
#include <linux/init.h>
24
#include <linux/i2c.h>
25
#include <linux/delay.h>
26
#include <linux/slab.h>
27
#include <sound/core.h>
28
#include "pmac.h"
29
 
30
/*
31
 * we have to keep a static variable here since i2c attach_adapter
32
 * callback cannot pass a private data.
33
 */
34
static struct pmac_keywest *keywest_ctx;
35
 
36
 
37
#define I2C_DRIVERID_KEYWEST    0xFEBA
38
 
39
static int keywest_attach_adapter(struct i2c_adapter *adapter);
40
static int keywest_detach_client(struct i2c_client *client);
41
 
42
struct i2c_driver keywest_driver = {
43
        .driver = {
44
                .name = "PMac Keywest Audio",
45
        },
46
        .id = I2C_DRIVERID_KEYWEST,
47
        .attach_adapter = &keywest_attach_adapter,
48
        .detach_client = &keywest_detach_client,
49
};
50
 
51
 
52
#ifndef i2c_device_name
53
#define i2c_device_name(x)      ((x)->name)
54
#endif
55
 
56
static int keywest_attach_adapter(struct i2c_adapter *adapter)
57
{
58
        int err;
59
        struct i2c_client *new_client;
60
 
61
        if (! keywest_ctx)
62
                return -EINVAL;
63
 
64
        if (strncmp(i2c_device_name(adapter), "mac-io", 6))
65
                return 0; /* ignored */
66
 
67
        new_client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
68
        if (! new_client)
69
                return -ENOMEM;
70
 
71
        new_client->addr = keywest_ctx->addr;
72
        i2c_set_clientdata(new_client, keywest_ctx);
73
        new_client->adapter = adapter;
74
        new_client->driver = &keywest_driver;
75
        new_client->flags = 0;
76
 
77
        strcpy(i2c_device_name(new_client), keywest_ctx->name);
78
        keywest_ctx->client = new_client;
79
 
80
        /* Tell the i2c layer a new client has arrived */
81
        if (i2c_attach_client(new_client)) {
82
                snd_printk(KERN_ERR "tumbler: cannot attach i2c client\n");
83
                err = -ENODEV;
84
                goto __err;
85
        }
86
 
87
        return 0;
88
 
89
 __err:
90
        kfree(new_client);
91
        keywest_ctx->client = NULL;
92
        return err;
93
}
94
 
95
static int keywest_detach_client(struct i2c_client *client)
96
{
97
        if (! keywest_ctx)
98
                return 0;
99
        if (client == keywest_ctx->client)
100
                keywest_ctx->client = NULL;
101
 
102
        i2c_detach_client(client);
103
        kfree(client);
104
        return 0;
105
}
106
 
107
/* exported */
108
void snd_pmac_keywest_cleanup(struct pmac_keywest *i2c)
109
{
110
        if (keywest_ctx && keywest_ctx == i2c) {
111
                i2c_del_driver(&keywest_driver);
112
                keywest_ctx = NULL;
113
        }
114
}
115
 
116
int __init snd_pmac_tumbler_post_init(void)
117
{
118
        int err;
119
 
120
        if (!keywest_ctx || !keywest_ctx->client)
121
                return -ENXIO;
122
 
123
        if ((err = keywest_ctx->init_client(keywest_ctx)) < 0) {
124
                snd_printk(KERN_ERR "tumbler: %i :cannot initialize the MCS\n", err);
125
                return err;
126
        }
127
        return 0;
128
}
129
 
130
/* exported */
131
int __init snd_pmac_keywest_init(struct pmac_keywest *i2c)
132
{
133
        int err;
134
 
135
        if (keywest_ctx)
136
                return -EBUSY;
137
 
138
        keywest_ctx = i2c;
139
 
140
        if ((err = i2c_add_driver(&keywest_driver))) {
141
                snd_printk(KERN_ERR "cannot register keywest i2c driver\n");
142
                return err;
143
        }
144
        return 0;
145
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.