diff options
author | Rob Clark <robdclark@gmail.com> | 2014-11-18 17:22:51 -0500 |
---|---|---|
committer | Rob Clark <robdclark@gmail.com> | 2014-11-21 08:57:21 -0500 |
commit | 32c0e3e24c885ffeecb6d3a67ecb607b8fe63129 (patch) | |
tree | 66c3b60ae6234be0185d6717b6ccbb23c54a89f7 | |
parent | 42238da8b10320420be19f056cc8e0d95cc606a3 (diff) |
drm/msm/mdp5: remove global mdp5_ctl_mgr
A bit cleaner.. and won't resulting in an attempt to kfree() a static
global in unload path.
Signed-off-by: Rob Clark <robdclark@gmail.com>
-rw-r--r-- | drivers/gpu/drm/msm/mdp/mdp5/mdp5_ctl.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_ctl.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_ctl.c index c5347a797ab6..dea4505ac963 100644 --- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_ctl.c +++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_ctl.c | |||
@@ -34,6 +34,8 @@ | |||
34 | */ | 34 | */ |
35 | 35 | ||
36 | struct mdp5_ctl { | 36 | struct mdp5_ctl { |
37 | struct mdp5_ctl_manager *ctlm; | ||
38 | |||
37 | u32 id; | 39 | u32 id; |
38 | 40 | ||
39 | /* whether this CTL has been allocated or not: */ | 41 | /* whether this CTL has been allocated or not: */ |
@@ -66,8 +68,6 @@ struct mdp5_ctl_manager { | |||
66 | struct mdp5_ctl ctls[MAX_CTL]; | 68 | struct mdp5_ctl ctls[MAX_CTL]; |
67 | }; | 69 | }; |
68 | 70 | ||
69 | static struct mdp5_ctl_manager mdp5_ctl_mgr; | ||
70 | |||
71 | static inline | 71 | static inline |
72 | struct mdp5_kms *get_kms(struct mdp5_ctl_manager *ctl_mgr) | 72 | struct mdp5_kms *get_kms(struct mdp5_ctl_manager *ctl_mgr) |
73 | { | 73 | { |
@@ -79,8 +79,7 @@ struct mdp5_kms *get_kms(struct mdp5_ctl_manager *ctl_mgr) | |||
79 | static inline | 79 | static inline |
80 | void ctl_write(struct mdp5_ctl *ctl, u32 reg, u32 data) | 80 | void ctl_write(struct mdp5_ctl *ctl, u32 reg, u32 data) |
81 | { | 81 | { |
82 | struct mdp5_ctl_manager *ctl_mgr = &mdp5_ctl_mgr; | 82 | struct mdp5_kms *mdp5_kms = get_kms(ctl->ctlm); |
83 | struct mdp5_kms *mdp5_kms = get_kms(ctl_mgr); | ||
84 | 83 | ||
85 | (void)ctl->reg_offset; /* TODO use this instead of mdp5_write */ | 84 | (void)ctl->reg_offset; /* TODO use this instead of mdp5_write */ |
86 | mdp5_write(mdp5_kms, reg, data); | 85 | mdp5_write(mdp5_kms, reg, data); |
@@ -89,8 +88,7 @@ void ctl_write(struct mdp5_ctl *ctl, u32 reg, u32 data) | |||
89 | static inline | 88 | static inline |
90 | u32 ctl_read(struct mdp5_ctl *ctl, u32 reg) | 89 | u32 ctl_read(struct mdp5_ctl *ctl, u32 reg) |
91 | { | 90 | { |
92 | struct mdp5_ctl_manager *ctl_mgr = &mdp5_ctl_mgr; | 91 | struct mdp5_kms *mdp5_kms = get_kms(ctl->ctlm); |
93 | struct mdp5_kms *mdp5_kms = get_kms(ctl_mgr); | ||
94 | 92 | ||
95 | (void)ctl->reg_offset; /* TODO use this instead of mdp5_write */ | 93 | (void)ctl->reg_offset; /* TODO use this instead of mdp5_write */ |
96 | return mdp5_read(mdp5_kms, reg); | 94 | return mdp5_read(mdp5_kms, reg); |
@@ -115,7 +113,7 @@ int mdp5_ctl_set_intf(struct mdp5_ctl *ctl, enum mdp5_intf intf) | |||
115 | 113 | ||
116 | int mdp5_ctl_set_cursor(struct mdp5_ctl *ctl, bool enable) | 114 | int mdp5_ctl_set_cursor(struct mdp5_ctl *ctl, bool enable) |
117 | { | 115 | { |
118 | struct mdp5_ctl_manager *ctl_mgr = &mdp5_ctl_mgr; | 116 | struct mdp5_ctl_manager *ctl_mgr = ctl->ctlm; |
119 | unsigned long flags; | 117 | unsigned long flags; |
120 | u32 blend_cfg; | 118 | u32 blend_cfg; |
121 | int lm; | 119 | int lm; |
@@ -164,7 +162,7 @@ int mdp5_ctl_blend(struct mdp5_ctl *ctl, u32 lm, u32 blend_cfg) | |||
164 | 162 | ||
165 | int mdp5_ctl_commit(struct mdp5_ctl *ctl, u32 flush_mask) | 163 | int mdp5_ctl_commit(struct mdp5_ctl *ctl, u32 flush_mask) |
166 | { | 164 | { |
167 | struct mdp5_ctl_manager *ctl_mgr = &mdp5_ctl_mgr; | 165 | struct mdp5_ctl_manager *ctl_mgr = ctl->ctlm; |
168 | unsigned long flags; | 166 | unsigned long flags; |
169 | 167 | ||
170 | if (flush_mask & MDP5_CTL_FLUSH_CURSOR_DUMMY) { | 168 | if (flush_mask & MDP5_CTL_FLUSH_CURSOR_DUMMY) { |
@@ -194,7 +192,7 @@ u32 mdp5_ctl_get_flush(struct mdp5_ctl *ctl) | |||
194 | 192 | ||
195 | void mdp5_ctl_release(struct mdp5_ctl *ctl) | 193 | void mdp5_ctl_release(struct mdp5_ctl *ctl) |
196 | { | 194 | { |
197 | struct mdp5_ctl_manager *ctl_mgr = &mdp5_ctl_mgr; | 195 | struct mdp5_ctl_manager *ctl_mgr = ctl->ctlm; |
198 | unsigned long flags; | 196 | unsigned long flags; |
199 | 197 | ||
200 | if (unlikely(WARN_ON(ctl->id >= MAX_CTL) || !ctl->busy)) { | 198 | if (unlikely(WARN_ON(ctl->id >= MAX_CTL) || !ctl->busy)) { |
@@ -268,11 +266,18 @@ void mdp5_ctlm_destroy(struct mdp5_ctl_manager *ctl_mgr) | |||
268 | struct mdp5_ctl_manager *mdp5_ctlm_init(struct drm_device *dev, | 266 | struct mdp5_ctl_manager *mdp5_ctlm_init(struct drm_device *dev, |
269 | void __iomem *mmio_base, const struct mdp5_cfg_hw *hw_cfg) | 267 | void __iomem *mmio_base, const struct mdp5_cfg_hw *hw_cfg) |
270 | { | 268 | { |
271 | struct mdp5_ctl_manager *ctl_mgr = &mdp5_ctl_mgr; | 269 | struct mdp5_ctl_manager *ctl_mgr; |
272 | const struct mdp5_sub_block *ctl_cfg = &hw_cfg->ctl; | 270 | const struct mdp5_sub_block *ctl_cfg = &hw_cfg->ctl; |
273 | unsigned long flags; | 271 | unsigned long flags; |
274 | int c, ret; | 272 | int c, ret; |
275 | 273 | ||
274 | ctl_mgr = kzalloc(sizeof(*ctl_mgr), GFP_KERNEL); | ||
275 | if (!ctl_mgr) { | ||
276 | dev_err(dev->dev, "failed to allocate CTL manager\n"); | ||
277 | ret = -ENOMEM; | ||
278 | goto fail; | ||
279 | } | ||
280 | |||
276 | if (unlikely(WARN_ON(ctl_cfg->count > MAX_CTL))) { | 281 | if (unlikely(WARN_ON(ctl_cfg->count > MAX_CTL))) { |
277 | dev_err(dev->dev, "Increase static pool size to at least %d\n", | 282 | dev_err(dev->dev, "Increase static pool size to at least %d\n", |
278 | ctl_cfg->count); | 283 | ctl_cfg->count); |
@@ -296,6 +301,7 @@ struct mdp5_ctl_manager *mdp5_ctlm_init(struct drm_device *dev, | |||
296 | ret = -EINVAL; | 301 | ret = -EINVAL; |
297 | goto fail; | 302 | goto fail; |
298 | } | 303 | } |
304 | ctl->ctlm = ctl_mgr; | ||
299 | ctl->id = c; | 305 | ctl->id = c; |
300 | ctl->mode = MODE_NONE; | 306 | ctl->mode = MODE_NONE; |
301 | ctl->reg_offset = ctl_cfg->base[c]; | 307 | ctl->reg_offset = ctl_cfg->base[c]; |