aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/serio/hp_sdc_mlc.c
diff options
context:
space:
mode:
authorHelge Deller <deller@gmx.de>2007-02-28 23:51:29 -0500
committerDmitry Torokhov <dtor@insightbb.com>2007-02-28 23:51:29 -0500
commitffd51f46cdf856c0b453d2828a74d552cc15f881 (patch)
tree2322b5c7dbbbf876e549e40ff340240b6a59af20 /drivers/input/serio/hp_sdc_mlc.c
parent3acaf540a33199141695f2e2fcfa8829053159bf (diff)
Input: HIL - cleanup coding style
Signed-off-by: Helge Deller <deller@gmx.de> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Diffstat (limited to 'drivers/input/serio/hp_sdc_mlc.c')
-rw-r--r--drivers/input/serio/hp_sdc_mlc.c227
1 files changed, 117 insertions, 110 deletions
diff --git a/drivers/input/serio/hp_sdc_mlc.c b/drivers/input/serio/hp_sdc_mlc.c
index 1f131ff1f69e..cb0b28877e05 100644
--- a/drivers/input/serio/hp_sdc_mlc.c
+++ b/drivers/input/serio/hp_sdc_mlc.c
@@ -58,12 +58,13 @@ struct hp_sdc_mlc_priv_s {
58} hp_sdc_mlc_priv; 58} hp_sdc_mlc_priv;
59 59
60/************************* Interrupt context ******************************/ 60/************************* Interrupt context ******************************/
61static void hp_sdc_mlc_isr (int irq, void *dev_id, 61static void hp_sdc_mlc_isr (int irq, void *dev_id,
62 uint8_t status, uint8_t data) { 62 uint8_t status, uint8_t data)
63 int idx; 63{
64 int idx;
64 hil_mlc *mlc = &hp_sdc_mlc; 65 hil_mlc *mlc = &hp_sdc_mlc;
65 66
66 write_lock(&(mlc->lock)); 67 write_lock(&mlc->lock);
67 if (mlc->icount < 0) { 68 if (mlc->icount < 0) {
68 printk(KERN_WARNING PREFIX "HIL Overflow!\n"); 69 printk(KERN_WARNING PREFIX "HIL Overflow!\n");
69 up(&mlc->isem); 70 up(&mlc->isem);
@@ -73,239 +74,247 @@ static void hp_sdc_mlc_isr (int irq, void *dev_id,
73 if ((status & HP_SDC_STATUS_IRQMASK) == HP_SDC_STATUS_HILDATA) { 74 if ((status & HP_SDC_STATUS_IRQMASK) == HP_SDC_STATUS_HILDATA) {
74 mlc->ipacket[idx] |= data | HIL_ERR_INT; 75 mlc->ipacket[idx] |= data | HIL_ERR_INT;
75 mlc->icount--; 76 mlc->icount--;
76 if (hp_sdc_mlc_priv.got5x) goto check; 77 if (hp_sdc_mlc_priv.got5x || !idx)
77 if (!idx) goto check; 78 goto check;
78 if ((mlc->ipacket[idx-1] & HIL_PKT_ADDR_MASK) != 79 if ((mlc->ipacket[idx - 1] & HIL_PKT_ADDR_MASK) !=
79 (mlc->ipacket[idx] & HIL_PKT_ADDR_MASK)) { 80 (mlc->ipacket[idx] & HIL_PKT_ADDR_MASK)) {
80 mlc->ipacket[idx] &= ~HIL_PKT_ADDR_MASK; 81 mlc->ipacket[idx] &= ~HIL_PKT_ADDR_MASK;
81 mlc->ipacket[idx] |= (mlc->ipacket[idx-1] 82 mlc->ipacket[idx] |= (mlc->ipacket[idx - 1]
82 & HIL_PKT_ADDR_MASK); 83 & HIL_PKT_ADDR_MASK);
83 } 84 }
84 goto check; 85 goto check;
85 } 86 }
86 /* We know status is 5X */ 87 /* We know status is 5X */
87 if (data & HP_SDC_HIL_ISERR) goto err; 88 if (data & HP_SDC_HIL_ISERR)
88 mlc->ipacket[idx] = 89 goto err;
90 mlc->ipacket[idx] =
89 (data & HP_SDC_HIL_R1MASK) << HIL_PKT_ADDR_SHIFT; 91 (data & HP_SDC_HIL_R1MASK) << HIL_PKT_ADDR_SHIFT;
90 hp_sdc_mlc_priv.got5x = 1; 92 hp_sdc_mlc_priv.got5x = 1;
91 goto out; 93 goto out;
92 94
93 check: 95 check:
94 hp_sdc_mlc_priv.got5x = 0; 96 hp_sdc_mlc_priv.got5x = 0;
95 if (mlc->imatch == 0) goto done; 97 if (mlc->imatch == 0)
96 if ((mlc->imatch == (HIL_ERR_INT | HIL_PKT_CMD | HIL_CMD_POL)) 98 goto done;
97 && (mlc->ipacket[idx] == (mlc->imatch | idx))) goto done; 99 if ((mlc->imatch == (HIL_ERR_INT | HIL_PKT_CMD | HIL_CMD_POL))
98 if (mlc->ipacket[idx] == mlc->imatch) goto done; 100 && (mlc->ipacket[idx] == (mlc->imatch | idx)))
101 goto done;
102 if (mlc->ipacket[idx] == mlc->imatch)
103 goto done;
99 goto out; 104 goto out;
100 105
101 err: 106 err:
102 printk(KERN_DEBUG PREFIX "err code %x\n", data); 107 printk(KERN_DEBUG PREFIX "err code %x\n", data);
108
103 switch (data) { 109 switch (data) {
104 case HP_SDC_HIL_RC_DONE: 110 case HP_SDC_HIL_RC_DONE:
105 printk(KERN_WARNING PREFIX "Bastard SDC reconfigured loop!\n"); 111 printk(KERN_WARNING PREFIX "Bastard SDC reconfigured loop!\n");
106 break; 112 break;
113
107 case HP_SDC_HIL_ERR: 114 case HP_SDC_HIL_ERR:
108 mlc->ipacket[idx] |= HIL_ERR_INT | HIL_ERR_PERR | 115 mlc->ipacket[idx] |= HIL_ERR_INT | HIL_ERR_PERR |
109 HIL_ERR_FERR | HIL_ERR_FOF; 116 HIL_ERR_FERR | HIL_ERR_FOF;
110 break; 117 break;
118
111 case HP_SDC_HIL_TO: 119 case HP_SDC_HIL_TO:
112 mlc->ipacket[idx] |= HIL_ERR_INT | HIL_ERR_LERR; 120 mlc->ipacket[idx] |= HIL_ERR_INT | HIL_ERR_LERR;
113 break; 121 break;
122
114 case HP_SDC_HIL_RC: 123 case HP_SDC_HIL_RC:
115 printk(KERN_WARNING PREFIX "Bastard SDC decided to reconfigure loop!\n"); 124 printk(KERN_WARNING PREFIX "Bastard SDC decided to reconfigure loop!\n");
116 break; 125 break;
126
117 default: 127 default:
118 printk(KERN_WARNING PREFIX "Unkown HIL Error status (%x)!\n", data); 128 printk(KERN_WARNING PREFIX "Unkown HIL Error status (%x)!\n", data);
119 break; 129 break;
120 } 130 }
131
121 /* No more data will be coming due to an error. */ 132 /* No more data will be coming due to an error. */
122 done: 133 done:
123 tasklet_schedule(mlc->tasklet); 134 tasklet_schedule(mlc->tasklet);
124 up(&(mlc->isem)); 135 up(&mlc->isem);
125 out: 136 out:
126 write_unlock(&(mlc->lock)); 137 write_unlock(&mlc->lock);
127} 138}
128 139
129 140
130/******************** Tasklet or userspace context functions ****************/ 141/******************** Tasklet or userspace context functions ****************/
131 142
132static int hp_sdc_mlc_in (hil_mlc *mlc, suseconds_t timeout) { 143static int hp_sdc_mlc_in(hil_mlc *mlc, suseconds_t timeout)
144{
133 unsigned long flags; 145 unsigned long flags;
134 struct hp_sdc_mlc_priv_s *priv; 146 struct hp_sdc_mlc_priv_s *priv;
135 int rc = 2; 147 int rc = 2;
136 148
137 priv = mlc->priv; 149 priv = mlc->priv;
138 150
139 write_lock_irqsave(&(mlc->lock), flags); 151 write_lock_irqsave(&mlc->lock, flags);
140 152
141 /* Try to down the semaphore */ 153 /* Try to down the semaphore */
142 if (down_trylock(&(mlc->isem))) { 154 if (down_trylock(&mlc->isem)) {
143 struct timeval tv; 155 struct timeval tv;
144 if (priv->emtestmode) { 156 if (priv->emtestmode) {
145 mlc->ipacket[0] = 157 mlc->ipacket[0] =
146 HIL_ERR_INT | (mlc->opacket & 158 HIL_ERR_INT | (mlc->opacket &
147 (HIL_PKT_CMD | 159 (HIL_PKT_CMD |
148 HIL_PKT_ADDR_MASK | 160 HIL_PKT_ADDR_MASK |
149 HIL_PKT_DATA_MASK)); 161 HIL_PKT_DATA_MASK));
150 mlc->icount = 14; 162 mlc->icount = 14;
151 /* printk(KERN_DEBUG PREFIX ">[%x]\n", mlc->ipacket[0]); */ 163 /* printk(KERN_DEBUG PREFIX ">[%x]\n", mlc->ipacket[0]); */
152 goto wasup; 164 goto wasup;
153 } 165 }
154 do_gettimeofday(&tv); 166 do_gettimeofday(&tv);
155 tv.tv_usec += 1000000 * (tv.tv_sec - mlc->instart.tv_sec); 167 tv.tv_usec += USEC_PER_SEC * (tv.tv_sec - mlc->instart.tv_sec);
156 if (tv.tv_usec - mlc->instart.tv_usec > mlc->intimeout) { 168 if (tv.tv_usec - mlc->instart.tv_usec > mlc->intimeout) {
157 /* printk("!%i %i", 169 /* printk("!%i %i",
158 tv.tv_usec - mlc->instart.tv_usec, 170 tv.tv_usec - mlc->instart.tv_usec,
159 mlc->intimeout); 171 mlc->intimeout);
160 */ 172 */
161 rc = 1; 173 rc = 1;
162 up(&(mlc->isem)); 174 up(&mlc->isem);
163 } 175 }
164 goto done; 176 goto done;
165 } 177 }
166 wasup: 178 wasup:
167 up(&(mlc->isem)); 179 up(&mlc->isem);
168 rc = 0; 180 rc = 0;
169 goto done; 181 goto done;
170 done: 182 done:
171 write_unlock_irqrestore(&(mlc->lock), flags); 183 write_unlock_irqrestore(&mlc->lock, flags);
172 return rc; 184 return rc;
173} 185}
174 186
175static int hp_sdc_mlc_cts (hil_mlc *mlc) { 187static int hp_sdc_mlc_cts(hil_mlc *mlc)
188{
176 struct hp_sdc_mlc_priv_s *priv; 189 struct hp_sdc_mlc_priv_s *priv;
177 unsigned long flags; 190 unsigned long flags;
178 191
179 priv = mlc->priv; 192 priv = mlc->priv;
180 193
181 write_lock_irqsave(&(mlc->lock), flags); 194 write_lock_irqsave(&mlc->lock, flags);
182 195
183 /* Try to down the semaphores -- they should be up. */ 196 /* Try to down the semaphores -- they should be up. */
184 if (down_trylock(&(mlc->isem))) { 197 BUG_ON(down_trylock(&mlc->isem));
185 BUG(); 198 BUG_ON(down_trylock(&mlc->osem));
186 goto busy;
187 }
188 if (down_trylock(&(mlc->osem))) {
189 BUG();
190 up(&(mlc->isem));
191 goto busy;
192 }
193 up(&(mlc->isem));
194 up(&(mlc->osem));
195 199
196 if (down_trylock(&(mlc->csem))) { 200 up(&mlc->isem);
197 if (priv->trans.act.semaphore != &(mlc->csem)) goto poll; 201 up(&mlc->osem);
198 goto busy; 202
203 if (down_trylock(&mlc->csem)) {
204 if (priv->trans.act.semaphore != &mlc->csem)
205 goto poll;
206 else
207 goto busy;
199 } 208 }
200 if (!(priv->tseq[4] & HP_SDC_USE_LOOP)) goto done; 209
210 if (!(priv->tseq[4] & HP_SDC_USE_LOOP))
211 goto done;
201 212
202 poll: 213 poll:
203 priv->trans.act.semaphore = &(mlc->csem); 214 priv->trans.act.semaphore = &mlc->csem;
204 priv->trans.actidx = 0; 215 priv->trans.actidx = 0;
205 priv->trans.idx = 1; 216 priv->trans.idx = 1;
206 priv->trans.endidx = 5; 217 priv->trans.endidx = 5;
207 priv->tseq[0] = 218 priv->tseq[0] =
208 HP_SDC_ACT_POSTCMD | HP_SDC_ACT_DATAIN | HP_SDC_ACT_SEMAPHORE; 219 HP_SDC_ACT_POSTCMD | HP_SDC_ACT_DATAIN | HP_SDC_ACT_SEMAPHORE;
209 priv->tseq[1] = HP_SDC_CMD_READ_USE; 220 priv->tseq[1] = HP_SDC_CMD_READ_USE;
210 priv->tseq[2] = 1; 221 priv->tseq[2] = 1;
211 priv->tseq[3] = 0; 222 priv->tseq[3] = 0;
212 priv->tseq[4] = 0; 223 priv->tseq[4] = 0;
213 hp_sdc_enqueue_transaction(&(priv->trans)); 224 hp_sdc_enqueue_transaction(&priv->trans);
214 busy: 225 busy:
215 write_unlock_irqrestore(&(mlc->lock), flags); 226 write_unlock_irqrestore(&mlc->lock, flags);
216 return 1; 227 return 1;
217 done: 228 done:
218 priv->trans.act.semaphore = &(mlc->osem); 229 priv->trans.act.semaphore = &mlc->osem;
219 up(&(mlc->csem)); 230 up(&mlc->csem);
220 write_unlock_irqrestore(&(mlc->lock), flags); 231 write_unlock_irqrestore(&mlc->lock, flags);
221 return 0; 232 return 0;
222} 233}
223 234
224static void hp_sdc_mlc_out (hil_mlc *mlc) { 235static void hp_sdc_mlc_out(hil_mlc *mlc)
236{
225 struct hp_sdc_mlc_priv_s *priv; 237 struct hp_sdc_mlc_priv_s *priv;
226 unsigned long flags; 238 unsigned long flags;
227 239
228 priv = mlc->priv; 240 priv = mlc->priv;
229 241
230 write_lock_irqsave(&(mlc->lock), flags); 242 write_lock_irqsave(&mlc->lock, flags);
231 243
232 /* Try to down the semaphore -- it should be up. */ 244 /* Try to down the semaphore -- it should be up. */
233 if (down_trylock(&(mlc->osem))) { 245 BUG_ON(down_trylock(&mlc->osem));
234 BUG();
235 goto done;
236 }
237 246
238 if (mlc->opacket & HIL_DO_ALTER_CTRL) goto do_control; 247 if (mlc->opacket & HIL_DO_ALTER_CTRL)
248 goto do_control;
239 249
240 do_data: 250 do_data:
241 if (priv->emtestmode) { 251 if (priv->emtestmode) {
242 up(&(mlc->osem)); 252 up(&mlc->osem);
243 goto done; 253 goto done;
244 } 254 }
245 /* Shouldn't be sending commands when loop may be busy */ 255 /* Shouldn't be sending commands when loop may be busy */
246 if (down_trylock(&(mlc->csem))) { 256 BUG_ON(down_trylock(&mlc->csem));
247 BUG(); 257 up(&mlc->csem);
248 goto done;
249 }
250 up(&(mlc->csem));
251 258
252 priv->trans.actidx = 0; 259 priv->trans.actidx = 0;
253 priv->trans.idx = 1; 260 priv->trans.idx = 1;
254 priv->trans.act.semaphore = &(mlc->osem); 261 priv->trans.act.semaphore = &mlc->osem;
255 priv->trans.endidx = 6; 262 priv->trans.endidx = 6;
256 priv->tseq[0] = 263 priv->tseq[0] =
257 HP_SDC_ACT_DATAREG | HP_SDC_ACT_POSTCMD | HP_SDC_ACT_SEMAPHORE; 264 HP_SDC_ACT_DATAREG | HP_SDC_ACT_POSTCMD | HP_SDC_ACT_SEMAPHORE;
258 priv->tseq[1] = 0x7; 265 priv->tseq[1] = 0x7;
259 priv->tseq[2] = 266 priv->tseq[2] =
260 (mlc->opacket & 267 (mlc->opacket &
261 (HIL_PKT_ADDR_MASK | HIL_PKT_CMD)) 268 (HIL_PKT_ADDR_MASK | HIL_PKT_CMD))
262 >> HIL_PKT_ADDR_SHIFT; 269 >> HIL_PKT_ADDR_SHIFT;
263 priv->tseq[3] = 270 priv->tseq[3] =
264 (mlc->opacket & HIL_PKT_DATA_MASK) 271 (mlc->opacket & HIL_PKT_DATA_MASK)
265 >> HIL_PKT_DATA_SHIFT; 272 >> HIL_PKT_DATA_SHIFT;
266 priv->tseq[4] = 0; /* No timeout */ 273 priv->tseq[4] = 0; /* No timeout */
267 if (priv->tseq[3] == HIL_CMD_DHR) priv->tseq[4] = 1; 274 if (priv->tseq[3] == HIL_CMD_DHR)
275 priv->tseq[4] = 1;
268 priv->tseq[5] = HP_SDC_CMD_DO_HIL; 276 priv->tseq[5] = HP_SDC_CMD_DO_HIL;
269 goto enqueue; 277 goto enqueue;
270 278
271 do_control: 279 do_control:
272 priv->emtestmode = mlc->opacket & HIL_CTRL_TEST; 280 priv->emtestmode = mlc->opacket & HIL_CTRL_TEST;
273 281
274 /* we cannot emulate this, it should not be used. */ 282 /* we cannot emulate this, it should not be used. */
275 BUG_ON((mlc->opacket & (HIL_CTRL_APE | HIL_CTRL_IPF)) == HIL_CTRL_APE); 283 BUG_ON((mlc->opacket & (HIL_CTRL_APE | HIL_CTRL_IPF)) == HIL_CTRL_APE);
276 284
277 if ((mlc->opacket & HIL_CTRL_ONLY) == HIL_CTRL_ONLY) goto control_only; 285 if ((mlc->opacket & HIL_CTRL_ONLY) == HIL_CTRL_ONLY)
278 if (mlc->opacket & HIL_CTRL_APE) { 286 goto control_only;
279 BUG(); /* Should not send command/data after engaging APE */ 287
280 goto done; 288 /* Should not send command/data after engaging APE */
281 } 289 BUG_ON(mlc->opacket & HIL_CTRL_APE);
282 /* Disengaging APE this way would not be valid either since 290
291 /* Disengaging APE this way would not be valid either since
283 * the loop must be allowed to idle. 292 * the loop must be allowed to idle.
284 * 293 *
285 * So, it works out that we really never actually send control 294 * So, it works out that we really never actually send control
286 * and data when using SDC, we just send the data. 295 * and data when using SDC, we just send the data.
287 */ 296 */
288 goto do_data; 297 goto do_data;
289 298
290 control_only: 299 control_only:
291 priv->trans.actidx = 0; 300 priv->trans.actidx = 0;
292 priv->trans.idx = 1; 301 priv->trans.idx = 1;
293 priv->trans.act.semaphore = &(mlc->osem); 302 priv->trans.act.semaphore = &mlc->osem;
294 priv->trans.endidx = 4; 303 priv->trans.endidx = 4;
295 priv->tseq[0] = 304 priv->tseq[0] =
296 HP_SDC_ACT_PRECMD | HP_SDC_ACT_DATAOUT | HP_SDC_ACT_SEMAPHORE; 305 HP_SDC_ACT_PRECMD | HP_SDC_ACT_DATAOUT | HP_SDC_ACT_SEMAPHORE;
297 priv->tseq[1] = HP_SDC_CMD_SET_LPC; 306 priv->tseq[1] = HP_SDC_CMD_SET_LPC;
298 priv->tseq[2] = 1; 307 priv->tseq[2] = 1;
299 // priv->tseq[3] = (mlc->ddc + 1) | HP_SDC_LPS_ACSUCC; 308 /* priv->tseq[3] = (mlc->ddc + 1) | HP_SDC_LPS_ACSUCC; */
300 priv->tseq[3] = 0; 309 priv->tseq[3] = 0;
301 if (mlc->opacket & HIL_CTRL_APE) { 310 if (mlc->opacket & HIL_CTRL_APE) {
302 priv->tseq[3] |= HP_SDC_LPC_APE_IPF; 311 priv->tseq[3] |= HP_SDC_LPC_APE_IPF;
303 down_trylock(&(mlc->csem)); 312 down_trylock(&mlc->csem);
304 } 313 }
305 enqueue: 314 enqueue:
306 hp_sdc_enqueue_transaction(&(priv->trans)); 315 hp_sdc_enqueue_transaction(&priv->trans);
307 done: 316 done:
308 write_unlock_irqrestore(&(mlc->lock), flags); 317 write_unlock_irqrestore(&mlc->lock, flags);
309} 318}
310 319
311static int __init hp_sdc_mlc_init(void) 320static int __init hp_sdc_mlc_init(void)
@@ -316,14 +325,13 @@ static int __init hp_sdc_mlc_init(void)
316 325
317 hp_sdc_mlc_priv.emtestmode = 0; 326 hp_sdc_mlc_priv.emtestmode = 0;
318 hp_sdc_mlc_priv.trans.seq = hp_sdc_mlc_priv.tseq; 327 hp_sdc_mlc_priv.trans.seq = hp_sdc_mlc_priv.tseq;
319 hp_sdc_mlc_priv.trans.act.semaphore = &(mlc->osem); 328 hp_sdc_mlc_priv.trans.act.semaphore = &mlc->osem;
320 hp_sdc_mlc_priv.got5x = 0; 329 hp_sdc_mlc_priv.got5x = 0;
321 330
322 mlc->cts = &hp_sdc_mlc_cts; 331 mlc->cts = &hp_sdc_mlc_cts;
323 mlc->in = &hp_sdc_mlc_in; 332 mlc->in = &hp_sdc_mlc_in;
324 mlc->out = &hp_sdc_mlc_out; 333 mlc->out = &hp_sdc_mlc_out;
325 334 mlc->priv = &hp_sdc_mlc_priv;
326 mlc->priv = &hp_sdc_mlc_priv;
327 335
328 if (hil_mlc_register(mlc)) { 336 if (hil_mlc_register(mlc)) {
329 printk(KERN_WARNING PREFIX "Failed to register MLC structure with hil_mlc\n"); 337 printk(KERN_WARNING PREFIX "Failed to register MLC structure with hil_mlc\n");
@@ -336,10 +344,9 @@ static int __init hp_sdc_mlc_init(void)
336 } 344 }
337 return 0; 345 return 0;
338 err1: 346 err1:
339 if (hil_mlc_unregister(mlc)) { 347 if (hil_mlc_unregister(mlc))
340 printk(KERN_ERR PREFIX "Failed to unregister MLC structure with hil_mlc.\n" 348 printk(KERN_ERR PREFIX "Failed to unregister MLC structure with hil_mlc.\n"
341 "This is bad. Could cause an oops.\n"); 349 "This is bad. Could cause an oops.\n");
342 }
343 err0: 350 err0:
344 return -EBUSY; 351 return -EBUSY;
345} 352}
@@ -347,14 +354,14 @@ static int __init hp_sdc_mlc_init(void)
347static void __exit hp_sdc_mlc_exit(void) 354static void __exit hp_sdc_mlc_exit(void)
348{ 355{
349 hil_mlc *mlc = &hp_sdc_mlc; 356 hil_mlc *mlc = &hp_sdc_mlc;
350 if (hp_sdc_release_hil_irq(&hp_sdc_mlc_isr)) { 357
358 if (hp_sdc_release_hil_irq(&hp_sdc_mlc_isr))
351 printk(KERN_ERR PREFIX "Failed to release the raw HIL ISR hook.\n" 359 printk(KERN_ERR PREFIX "Failed to release the raw HIL ISR hook.\n"
352 "This is bad. Could cause an oops.\n"); 360 "This is bad. Could cause an oops.\n");
353 } 361
354 if (hil_mlc_unregister(mlc)) { 362 if (hil_mlc_unregister(mlc))
355 printk(KERN_ERR PREFIX "Failed to unregister MLC structure with hil_mlc.\n" 363 printk(KERN_ERR PREFIX "Failed to unregister MLC structure with hil_mlc.\n"
356 "This is bad. Could cause an oops.\n"); 364 "This is bad. Could cause an oops.\n");
357 }
358} 365}
359 366
360module_init(hp_sdc_mlc_init); 367module_init(hp_sdc_mlc_init);