video: tegra: host: Move device data to nvhost_device
[linux-2.6.git] / include / linux / nvhost.h
1 /*
2  * include/linux/nvhost.h
3  *
4  * Tegra graphics host driver
5  *
6  * Copyright (c) 2009-2011, NVIDIA Corporation.
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful, but WITHOUT
14  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
16  * more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with this program; if not, write to the Free Software Foundation, Inc.,
20  * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21  */
22
23 #ifndef __LINUX_NVHOST_H
24 #define __LINUX_NVHOST_H
25
26 #include <linux/device.h>
27 #include <linux/types.h>
28
29 struct nvhost_master;
30
31 #define NVHOST_MODULE_MAX_CLOCKS 3
32 #define NVHOST_MODULE_MAX_POWERGATE_IDS 2
33 #define NVHOST_MODULE_NO_POWERGATE_IDS .powergate_ids = {-1, -1}
34 #define NVHOST_DEFAULT_CLOCKGATE_DELAY .clockgate_delay = 25
35
36 struct nvhost_clock {
37         char *name;
38         long default_rate;
39 };
40
41 enum nvhost_device_powerstate_t {
42         NVHOST_POWER_STATE_DEINIT,
43         NVHOST_POWER_STATE_RUNNING,
44         NVHOST_POWER_STATE_CLOCKGATED,
45         NVHOST_POWER_STATE_POWERGATED
46 };
47
48 struct nvhost_device {
49         const char      *name;          /* Device name */
50         struct device   dev;            /* Linux device struct */
51         int             id;             /* Separates clients of same hw */
52         u32             num_resources;  /* Number of resources following */
53         struct resource *resource;      /* Resources (IOMEM in particular) */
54
55         struct nvhost_master *host;     /* Access to host1x resources */
56         u32             syncpts;        /* Bitfield of sync points used */
57         u32             waitbases;      /* Bit field of wait bases */
58         u32             modulemutexes;  /* Bit field of module mutexes */
59         u32             class;          /* Device class */
60         bool            exclusive;      /* True if only one user at a time */
61         bool            keepalive;      /* Do not power gate when opened */
62         bool            waitbasesync;   /* Force sync of wait bases */
63
64         int             powergate_ids[NVHOST_MODULE_MAX_POWERGATE_IDS];
65         bool            can_powergate;  /* True if module can be power gated */
66         int             clockgate_delay;/* Delay before clock gated */
67         int             powergate_delay;/* Delay before power gated */
68         struct nvhost_clock clocks[NVHOST_MODULE_MAX_CLOCKS];/* Clock names */
69
70         struct delayed_work powerstate_down;/* Power state management */
71         int             num_clks;       /* Number of clocks opened for dev */
72         struct clk      *clk[NVHOST_MODULE_MAX_CLOCKS];
73         struct mutex    lock;           /* Power management lock */
74         int             powerstate;     /* Current power state */
75         int             refcount;       /* Number of tasks active */
76         wait_queue_head_t idle_wq;      /* Work queue for idle */
77         struct list_head client_list;   /* List of clients and rate requests */
78
79         struct nvhost_channel *channel; /* Channel assigned for the module */
80
81         /* Preparing for power off. Used for context save. */
82         int (*prepare_poweroff)(struct nvhost_device *dev);
83         /* Finalize power on. Can be used for context restore. */
84         void (*finalize_poweron)(struct nvhost_device *dev);
85         /* Device is busy. */
86         void (*busy)(struct nvhost_device *);
87         /* Device is idle. */
88         void (*idle)(struct nvhost_device *);
89         /* Device is going to be suspended */
90         void (*suspend)(struct nvhost_device *);
91         /* Device is initialized */
92         void (*init)(struct nvhost_device *dev);
93         /* Device is de-initialized. */
94         void (*deinit)(struct nvhost_device *dev);
95 };
96
97 /* Register device to nvhost bus */
98 extern int nvhost_device_register(struct nvhost_device *);
99 /* Deregister device from nvhost bus */
100 extern void nvhost_device_unregister(struct nvhost_device *);
101
102 extern struct bus_type nvhost_bus_type;
103
104 struct nvhost_driver {
105         int (*probe)(struct nvhost_device *);
106         int (*remove)(struct nvhost_device *);
107         void (*shutdown)(struct nvhost_device *);
108         int (*suspend)(struct nvhost_device *, pm_message_t state);
109         int (*resume)(struct nvhost_device *);
110         struct device_driver driver;
111 };
112
113 extern int nvhost_driver_register(struct nvhost_driver *);
114 extern void nvhost_driver_unregister(struct nvhost_driver *);
115 extern struct resource *nvhost_get_resource(struct nvhost_device *,
116                 unsigned int, unsigned int);
117 extern int nvhost_get_irq(struct nvhost_device *, unsigned int);
118 extern struct resource *nvhost_get_resource_byname(struct nvhost_device *,
119                 unsigned int, const char *);
120 extern int nvhost_get_irq_byname(struct nvhost_device *, const char *);
121
122 #define to_nvhost_device(x) container_of((x), struct nvhost_device, dev)
123 #define to_nvhost_driver(drv)   (container_of((drv), struct nvhost_driver, \
124                                  driver))
125
126 #define nvhost_get_drvdata(_dev) dev_get_drvdata(&(_dev)->dev)
127 #define nvhost_set_drvdata(_dev, data) dev_set_drvdata(&(_dev)->dev, (data))
128
129 int nvhost_bus_add_host(struct nvhost_master *host);
130
131 #endif