1 /******************************************************************************
\r
2 * C O M P I L E R F L A G S
\r
3 *******************************************************************************
\r
6 /******************************************************************************
\r
7 * E X T E R N A L R E F E R E N C E S
\r
8 *******************************************************************************
\r
10 #include <linux/init.h>
\r
11 #include <linux/ioctl.h>
\r
12 #include <linux/module.h>
\r
13 #include <linux/types.h>
\r
14 #include <linux/kernel.h>
\r
15 #include <linux/fs.h>
\r
16 #include <linux/cdev.h>
\r
17 #include <linux/sched.h>
\r
18 #include <linux/poll.h>
\r
19 #include <linux/delay.h>
\r
20 #include <asm/current.h>
\r
21 #include <asm/uaccess.h>
\r
23 //#include <mach/mt_combo.h>
\r
24 //#include <mach/mt6575_gpio.h>
\r
25 //#include <mach/board.h>
\r
29 #include <mach/chip-misc.h>
\r
30 #include <mach/chip-gpio.h>
\r
31 #include <mach/chip-pin.h>
\r
32 #include <mach/chip-rtc.h>
\r
35 #include "hw_test.h"
\r
37 /******************************************************************************
\r
39 *******************************************************************************
\r
41 #define GPIO_PMU_PIN GPD27
\r
42 #define GPIO_RST_PIN GPD29
\r
43 #define GPIO_RTC_PIN GPD14
\r
44 #define GPIO_BGF_INT GPF20
\r
45 #define GPIO_WIF_INT GPF21
\r
47 #define HWTEST_DEV_MAJOR 194 // never used number
\r
48 #define HWTEST_DEV_NUM 1
\r
50 /* Linux char device */
\r
51 static int HWTEST_major = HWTEST_DEV_MAJOR;
\r
52 static struct cdev HWTEST_cdev;
\r
53 static atomic_t HWTEST_ref_cnt = ATOMIC_INIT(0);
\r
55 unsigned char** g_read_card_info_bysdio;
\r
56 unsigned char** g_test;
\r
58 UINT8 g_read_current_io_isready_from_sdio_card;
\r
59 UINT16 g_read_function_blksize_from_sdio_card;
\r
60 UINT32 g_read_int_from_sdio_card;
\r
62 /*******************************************************************************
\r
64 ********************************************************************************
\r
66 #define HWTEST_SUPPORT_PHONE 0
\r
67 #define HWTEST_SUPPORT_SDIO 1
\r
70 int porting_6620_sdio_card_detect()
\r
74 //ret = mt_combo_sdio_ctrl(2,1);
\r
77 ret = sdio_card_detect();
\r
82 HWTEST_INFO_FUNC("sdio card detect fail");
\r
86 int porting_6620_sdio_card_remove()
\r
90 //ret = mt_combo_sdio_ctrl(2,0);
\r
93 ret = sdio_card_remove();
\r
98 HWTEST_INFO_FUNC("sdio card remove fail");
\r
104 int chip_power_on(void)
\r
107 #define MT6620_OFF_TIME (10) /* in ms, workable value */
\r
108 #define MT6620_RST_TIME (30) /* in ms, workable value */
\r
109 #define MT6620_STABLE_TIME (30) /* in ms, workable value */
\r
110 #define MT6620_EXT_INT_TIME (5) /* in ms, workable value */
\r
111 #define MT6620_32K_STABLE_TIME (100) /* in ms, test value */
\r
114 #if (HWTEST_SUPPORT_PHONE)
\r
115 /* disable pull */
\r
116 mt_set_gpio_pull_enable(GPIO_COMBO_6620_LDO_EN_PIN, GPIO_PULL_DISABLE);
\r
118 mt_set_gpio_dir(GPIO_COMBO_6620_LDO_EN_PIN, GPIO_DIR_OUT);
\r
119 /* set gpio mode */
\r
120 mt_set_gpio_mode(GPIO_COMBO_6620_LDO_EN_PIN, GPIO_MODE_GPIO);
\r
121 /* external LDO_EN high */
\r
122 mt_set_gpio_out(GPIO_COMBO_6620_LDO_EN_PIN, GPIO_OUT_ONE);
\r
125 #if (HWTEST_SUPPORT_SDIO) && (CONFIG_MTK_COMBO_SDIO_SLOT == 0)
\r
126 printk(KERN_INFO "[mt6620] pull up sd0 bus(gpio169~gpio175(exclude gpio174))\n");
\r
127 mt_set_gpio_pull_enable(GPIO172, GPIO_PULL_ENABLE); //->CLK
\r
128 mt_set_gpio_pull_select(GPIO172, GPIO_PULL_UP);
\r
129 mt_set_gpio_pull_enable(GPIO171, GPIO_PULL_ENABLE); //->CMD
\r
130 mt_set_gpio_pull_select(GPIO171, GPIO_PULL_UP);
\r
131 mt_set_gpio_pull_enable(GPIO175, GPIO_PULL_ENABLE); //->DAT0
\r
132 mt_set_gpio_pull_select(GPIO175, GPIO_PULL_UP);
\r
133 mt_set_gpio_pull_enable(GPIO173, GPIO_PULL_ENABLE); //->DAT1
\r
134 mt_set_gpio_pull_select(GPIO173, GPIO_PULL_UP);
\r
135 mt_set_gpio_pull_enable(GPIO169, GPIO_PULL_ENABLE); //->DAT2
\r
136 mt_set_gpio_pull_select(GPIO169, GPIO_PULL_UP);
\r
137 mt_set_gpio_pull_enable(GPIO170, GPIO_PULL_ENABLE); //->DAT3
\r
138 mt_set_gpio_pull_select(GPIO170, GPIO_PULL_UP);
\r
139 #elif (CONFIG_MTK_COMBO_SDIO_SLOT == 1)
\r
140 #error "error:MSDC1 is not reserved for MT6620 on MT6575EVB"
\r
141 #elif (CONFIG_MTK_COMBO_SDIO_SLOT == 2)
\r
142 printk(KERN_INFO "[mt6620] pull up sd2 bus(gpio182~187)\n");
\r
143 mt_set_gpio_pull_enable(GPIO182, GPIO_PULL_ENABLE); //->CLK
\r
144 mt_set_gpio_pull_select(GPIO182, GPIO_PULL_UP);
\r
145 mt_set_gpio_pull_enable(GPIO184, GPIO_PULL_ENABLE); //->CMD
\r
146 mt_set_gpio_pull_select(GPIO184, GPIO_PULL_UP);
\r
147 mt_set_gpio_pull_enable(GPIO186, GPIO_PULL_ENABLE); //->DAT0
\r
148 mt_set_gpio_pull_select(GPIO186, GPIO_PULL_UP);
\r
149 mt_set_gpio_pull_enable(GPIO187, GPIO_PULL_ENABLE); //->DAT1
\r
150 mt_set_gpio_pull_select(GPIO187, GPIO_PULL_UP);
\r
151 mt_set_gpio_pull_enable(GPIO185, GPIO_PULL_ENABLE); //->DAT2
\r
152 mt_set_gpio_pull_select(GPIO185, GPIO_PULL_UP);
\r
153 mt_set_gpio_pull_enable(GPIO183, GPIO_PULL_ENABLE); //->DAT3
\r
154 mt_set_gpio_pull_select(GPIO183, GPIO_PULL_UP);
\r
155 #elif (CONFIG_MTK_COMBO_SDIO_SLOT == 3)
\r
156 printk(KERN_INFO "[mt6620] pull up sd3 bus (GPIO89~GPIO94)\n");
\r
157 mt_set_gpio_pull_enable(GPIO92, GPIO_PULL_ENABLE); //->CLK
\r
158 mt_set_gpio_pull_select(GPIO92, GPIO_PULL_UP);
\r
159 mt_set_gpio_pull_enable(GPIO91, GPIO_PULL_ENABLE); //->CMD
\r
160 mt_set_gpio_pull_select(GPIO91, GPIO_PULL_UP);
\r
161 mt_set_gpio_pull_enable(GPIO94, GPIO_PULL_ENABLE); //->DAT0
\r
162 mt_set_gpio_pull_select(GPIO94, GPIO_PULL_UP);
\r
163 mt_set_gpio_pull_enable(GPIO90, GPIO_PULL_ENABLE); //->DAT1
\r
164 mt_set_gpio_pull_select(GPIO90, GPIO_PULL_UP);
\r
165 mt_set_gpio_pull_enable(GPIO89, GPIO_PULL_ENABLE); //->DAT2
\r
166 mt_set_gpio_pull_select(GPIO89, GPIO_PULL_UP);
\r
167 mt_set_gpio_pull_enable(GPIO93, GPIO_PULL_ENABLE); //->DAT3
\r
168 mt_set_gpio_pull_select(GPIO93, GPIO_PULL_UP);
\r
170 #error "error:unsupported CONFIG_MTK_COMBO_SDIO_SLOT" CONFIG_MTK_COMBO_SDIO_SLOT
\r
174 ret = mt_set_gpio_mode(GPIO_UART_URXD3_PIN, GPIO_UART_URXD3_PIN_M_URXD);//GPIO_MODE_01->GPIO_UART_URXD3_PIN_M_URXD
\r
175 ret += mt_set_gpio_mode(GPIO_UART_UTXD3_PIN, GPIO_UART_UTXD3_PIN_M_UTXD);//GPIO_MODE_01->GPIO_UART_UTXD3_PIN_M_UTXD
\r
176 //printk(KERN_INFO "[mt6620] set UART GPIO Mode [%d]\n", result);
\r
178 /* disable pull */
\r
179 #if (HWTEST_SUPPORT_PHONE)
\r
180 mt_set_gpio_pull_enable(GPIO25, GPIO_PULL_DISABLE);
\r
182 ret += mt_set_gpio_pull_enable(GPIO_COMBO_PMU_EN_PIN, GPIO_PULL_DISABLE);
\r
183 ret += mt_set_gpio_pull_enable(GPIO_COMBO_RST_PIN, GPIO_PULL_DISABLE);
\r
186 #if (HWTEST_SUPPORT_PHONE)
\r
187 mt_set_gpio_dir(GPIO25, GPIO_DIR_OUT);
\r
189 ret += mt_set_gpio_dir(GPIO_COMBO_PMU_EN_PIN, GPIO_DIR_OUT);
\r
190 ret += mt_set_gpio_dir(GPIO_COMBO_RST_PIN, GPIO_DIR_OUT);
\r
192 /* set gpio mode */
\r
193 #if defined(HWTEST_SUPPORT_PHONE)
\r
194 mt_set_gpio_mode(GPIO25, GPIO_MODE_GPIO);
\r
196 ret += mt_set_gpio_mode(GPIO_COMBO_PMU_EN_PIN, GPIO_MODE_GPIO);
\r
197 ret += mt_set_gpio_mode(GPIO_COMBO_RST_PIN, GPIO_MODE_GPIO);
\r
200 ret += mt_set_gpio_out(GPIO_COMBO_RST_PIN, GPIO_OUT_ZERO);
\r
202 #if (HWTEST_SUPPORT_PHONE)
\r
203 mt_set_gpio_out(GPIO25, GPIO_OUT_ZERO);
\r
205 ret += mt_set_gpio_out(GPIO_COMBO_PMU_EN_PIN, GPIO_OUT_ZERO);
\r
207 msleep(MT6620_OFF_TIME);
\r
209 /* PMU_EN high, SYSRST_B low */
\r
210 #if (HWTEST_SUPPORT_PHONE)
\r
211 mt_set_gpio_out(GPIO25, GPIO_OUT_ONE);
\r
213 ret += mt_set_gpio_out(GPIO_COMBO_PMU_EN_PIN, GPIO_OUT_ONE);
\r
214 msleep(MT6620_RST_TIME);
\r
216 /* SYSRST_B high */
\r
217 ret += mt_set_gpio_out(GPIO_COMBO_RST_PIN, GPIO_OUT_ONE);
\r
218 msleep(MT6620_STABLE_TIME);
\r
222 rtc_enable_clk32k();
\r
223 msleep(MT6620_32K_STABLE_TIME);
\r
228 __gpio_enable_pull(GPIO_PMU_PIN);
\r
229 __gpio_as_output(GPIO_PMU_PIN);
\r
230 __gpio_clear_pin(GPIO_PMU_PIN);
\r
232 __gpio_enable_pull(GPIO_RST_PIN);
\r
233 __gpio_as_output(GPIO_RST_PIN);
\r
234 __gpio_clear_pin(GPIO_RST_PIN);
\r
236 msleep(MT6620_OFF_TIME);
\r
238 __gpio_set_pin(GPIO_PMU);
\r
239 msleep(MT6620_RST_TIME);
\r
241 __gpio_enable_pull(GPIO_RST_PIN);
\r
242 __gpio_as_output(GPIO_RST_PIN);
\r
243 __gpio_set_pin(GPIO_RST_PIN);
\r
245 msleep(MT6620_STABLE_TIME);
\r
246 printk(KERN_INFO "[mt6620] power on \n");
\r
252 int chip_power_off(void)
\r
255 printk(KERN_INFO "[mt6620] power off\n");
\r
258 mt_set_gpio_out(GPIO_COMBO_RST_PIN, GPIO_OUT_ZERO);
\r
260 #if (HWTEST_SUPPORT_PHONE)
\r
261 mt_set_gpio_out(GPIO25, GPIO_OUT_ZERO);
\r
263 mt_set_gpio_out(GPIO_COMBO_PMU_EN_PIN, GPIO_OUT_ZERO);
\r
265 #if (HWTEST_SUPPORT_SDIO) && (CONFIG_MTK_COMBO_SDIO_SLOT == 0)
\r
266 printk(KERN_INFO "[mt6620] pull down sd0 bus(gpio169~gpio175(exclude gpio174))\n");
\r
267 mt_set_gpio_pull_enable(GPIO172, GPIO_PULL_DOWN); //->CLK
\r
268 mt_set_gpio_pull_select(GPIO172, GPIO_PULL_ENABLE);
\r
269 mt_set_gpio_pull_enable(GPIO171, GPIO_PULL_DOWN); //->CMD
\r
270 mt_set_gpio_pull_select(GPIO171, GPIO_PULL_ENABLE);
\r
271 mt_set_gpio_pull_enable(GPIO175, GPIO_PULL_DOWN); //->DAT0
\r
272 mt_set_gpio_pull_select(GPIO175, GPIO_PULL_ENABLE);
\r
273 mt_set_gpio_pull_enable(GPIO173, GPIO_PULL_DOWN); //->DAT1
\r
274 mt_set_gpio_pull_select(GPIO173, GPIO_PULL_ENABLE);
\r
275 mt_set_gpio_pull_enable(GPIO169, GPIO_PULL_DOWN); //->DAT2
\r
276 mt_set_gpio_pull_select(GPIO169, GPIO_PULL_ENABLE);
\r
277 mt_set_gpio_pull_enable(GPIO170, GPIO_PULL_DOWN); //->DAT3
\r
278 mt_set_gpio_pull_select(GPIO170, GPIO_PULL_ENABLE);
\r
279 #elif (CONFIG_MTK_COMBO_SDIO_SLOT == 1)
\r
280 #error "error:MSDC1 is not reserved for MT6620 on MT6575EVB"
\r
281 #elif (CONFIG_MTK_COMBO_SDIO_SLOT == 2)
\r
282 printk(KERN_INFO "[mt6620] pull down sd2 bus(gpio182~187)\n");
\r
283 mt_set_gpio_pull_enable(GPIO182, GPIO_PULL_DOWN); //->CLK
\r
284 mt_set_gpio_pull_select(GPIO182, GPIO_PULL_ENABLE);
\r
285 mt_set_gpio_pull_enable(GPIO184, GPIO_PULL_DOWN); //->CMD
\r
286 mt_set_gpio_pull_select(GPIO184, GPIO_PULL_ENABLE);
\r
287 mt_set_gpio_pull_enable(GPIO186, GPIO_PULL_DOWN); //->DAT0
\r
288 mt_set_gpio_pull_select(GPIO186, GPIO_PULL_ENABLE);
\r
289 mt_set_gpio_pull_enable(GPIO187, GPIO_PULL_DOWN); //->DAT1
\r
290 mt_set_gpio_pull_select(GPIO187, GPIO_PULL_ENABLE);
\r
291 mt_set_gpio_pull_enable(GPIO185, GPIO_PULL_DOWN); //->DAT2
\r
292 mt_set_gpio_pull_select(GPIO185, GPIO_PULL_ENABLE);
\r
293 mt_set_gpio_pull_enable(GPIO183, GPIO_PULL_DOWN); //->DAT3
\r
294 mt_set_gpio_pull_select(GPIO183, GPIO_PULL_ENABLE);
\r
295 #elif (CONFIG_MTK_COMBO_SDIO_SLOT == 3)
\r
296 printk(KERN_INFO "[mt6620] pull down sd3 bus (GPIO89~GPIO94)\n");
\r
297 mt_set_gpio_pull_enable(GPIO92, GPIO_PULL_DOWN); //->CLK
\r
298 mt_set_gpio_pull_select(GPIO92, GPIO_PULL_ENABLE);
\r
299 mt_set_gpio_pull_enable(GPIO91, GPIO_PULL_DOWN); //->CMD
\r
300 mt_set_gpio_pull_select(GPIO91, GPIO_PULL_ENABLE);
\r
301 mt_set_gpio_pull_enable(GPIO94, GPIO_PULL_DOWN); //->DAT0
\r
302 mt_set_gpio_pull_select(GPIO94, GPIO_PULL_ENABLE);
\r
303 mt_set_gpio_pull_enable(GPIO90, GPIO_PULL_DOWN); //->DAT1
\r
304 mt_set_gpio_pull_select(GPIO90, GPIO_PULL_ENABLE);
\r
305 mt_set_gpio_pull_enable(GPIO89, GPIO_PULL_DOWN); //->DAT2
\r
306 mt_set_gpio_pull_select(GPIO89, GPIO_PULL_ENABLE);
\r
307 mt_set_gpio_pull_enable(GPIO93, GPIO_PULL_DOWN); //->DAT3
\r
308 mt_set_gpio_pull_select(GPIO93, GPIO_PULL_ENABLE);
\r
310 #error "error:unsupported CONFIG_MTK_COMBO_SDIO_SLOT" CONFIG_MTK_COMBO_SDIO_SLOT
\r
314 //printk(KERN_INFO "[mt6620] set UART GPIO Mode output 0\n");
\r
315 ret = mt_set_gpio_mode(GPIO_UART_URXD3_PIN, GPIO_UART_URXD3_PIN_M_GPIO);
\r
316 ret += mt_set_gpio_dir(GPIO_UART_URXD3_PIN, GPIO_DIR_OUT);
\r
317 ret += mt_set_gpio_out(GPIO_UART_URXD3_PIN, GPIO_OUT_ZERO);
\r
319 ret += mt_set_gpio_mode(GPIO_UART_UTXD3_PIN, GPIO_UART_UTXD3_PIN_M_GPIO);
\r
320 ret += mt_set_gpio_dir(GPIO_UART_UTXD3_PIN, GPIO_DIR_OUT);
\r
321 ret += mt_set_gpio_out(GPIO_UART_UTXD3_PIN, GPIO_OUT_ZERO);
\r
323 #if (HWTEST_SUPPORT_PHONE)
\r
324 mt_set_gpio_out(GPIO_COMBO_6620_LDO_EN_PIN, GPIO_OUT_ZERO);
\r
328 printk(KERN_INFO "[mt6620] power off\n");
\r
329 __gpio_clear_pin(GPIO_RST_PIN);
\r
330 __gpio_clear_pin(GPIO_PMU_PIN);
\r
331 rtc_disable_clk32k();
\r
335 ssize_t HWTEST_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos)
\r
340 ssize_t HWTEST_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
\r
343 char local_buf[256] = {'\0'};
\r
345 HWTEST_INFO_FUNC("read card by sdio!\n");
\r
347 if(!g_sdio_init_count){
\r
348 HWTEST_INFO_FUNC("sdio card still not initiliaztion yet!\n");
\r
351 if(!g_read_card_info_bysdio[0][0]){
\r
352 HWTEST_INFO_FUNC("read sdio card buffer is null\n");
\r
355 HWTEST_INFO_FUNC("%s,%s",g_read_card_info_bysdio[0],g_read_card_info_bysdio[1]);
\r
356 sprintf(local_buf,"%s\n%s",g_read_card_info_bysdio[0],g_read_card_info_bysdio[1]);
\r
357 //strncpy(local_buf,g_read_card_info_bysdio[0],strlen(g_read_card_info_bysdio[0]));
\r
359 if(copy_to_user(buf,local_buf,strlen(g_read_card_info_bysdio[0]) + 1 + strlen(g_read_card_info_bysdio[1]))){
\r
361 HWTEST_INFO_FUNC("copy info to user error!\n");
\r
364 return strlen(g_read_card_info_bysdio[0]) + strlen(g_read_card_info_bysdio[1])+1;
\r
367 unsigned int HWTEST_poll(struct file *filp, poll_table *wait)
\r
371 //retval:odd is exception,even is error!
\r
372 int HWTEST_unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
\r
377 HWTEST_INFO_FUNC("cmd (0x%04x), arg (%d)\n", cmd, (int)arg);
\r
380 case HWTEST_IOCTL_POWER_ON:
\r
381 HWTEST_INFO_FUNC("power on!\n");
\r
383 HWTEST_INFO_FUNC("already power on!\n");
\r
386 ret = chip_power_on();
\r
389 HWTEST_INFO_FUNC("power on OK!\n");
\r
391 HWTEST_INFO_FUNC("power on fail!\n");
\r
397 case HWTEST_IOCTL_POWER_OFF:
\r
398 HWTEST_INFO_FUNC("power off!\n");
\r
400 HWTEST_INFO_FUNC("already power off!\n");
\r
403 ret = chip_power_off();
\r
406 HWTEST_INFO_FUNC("power off OK!\n");
\r
408 HWTEST_INFO_FUNC("power off fail!\n");
\r
414 case HWTEST_IOCTL_CHIP_RESET:
\r
415 HWTEST_INFO_FUNC("chip reset!\n");
\r
417 ret = chip_power_off();
\r
418 ret += chip_power_on();
\r
420 HWTEST_INFO_FUNC("chip reset OK!\n");
\r
422 HWTEST_INFO_FUNC("chip rest fail!\n");
\r
426 HWTEST_INFO_FUNC("chip is power off now!\n");
\r
430 case HWTEST_IOCTL_SDIO_INIT:
\r
431 HWTEST_INFO_FUNC("init sdio card!\n");
\r
432 if(g_sdio_init_count){
\r
433 HWTEST_INFO_FUNC("SDIO card already exist!\n");
\r
436 ret = porting_6620_sdio_card_detect();
\r
438 HWTEST_INFO_FUNC("hwtest sdio init finish!\n");
\r
440 HWTEST_INFO_FUNC("hwtest sdio init fail!\n");
\r
443 g_sdio_init_count = 1;
\r
446 case HWTEST_IOCTL_SDIO_REMOVE:
\r
447 HWTEST_INFO_FUNC("remove sdio card!\n");
\r
448 if(!g_sdio_init_count){
\r
449 HWTEST_INFO_FUNC("sdio card not exist!\n");
\r
452 ret = porting_6620_sdio_card_remove();
\r
454 HWTEST_INFO_FUNC("hwtest sdio card remove finish!\n");
\r
456 HWTEST_INFO_FUNC("hwtest sdio card remove fail!\n");
\r
459 g_sdio_init_count = 0;
\r
462 case HWTEST_IOCTL_SDIO_READ_IOISREADY:
\r
463 if(!g_read_current_io_isready_from_sdio_card){
\r
464 HWTEST_INFO_FUNC("sdio card current io is not ready!\n");
\r
467 if (copy_to_user((void *)arg, &g_read_current_io_isready_from_sdio_card, sizeof(g_read_current_io_isready_from_sdio_card)) < 0) {
\r
468 HWTEST_INFO_FUNC("copy to user space fail!\n");
\r
473 case HWTEST_IOCTL_SDIO_READ_BLKSIZE:
\r
474 if(!g_read_function_blksize_from_sdio_card){
\r
475 HWTEST_INFO_FUNC("sdio card current function blksize is not set!\n");
\r
478 if (copy_to_user((void *)arg, &g_read_function_blksize_from_sdio_card, sizeof(g_read_function_blksize_from_sdio_card)) < 0) {
\r
479 HWTEST_INFO_FUNC("copy to user space fail!\n");
\r
484 case HWTEST_IOCTL_SDIO_READ_INT:
\r
485 if(!g_read_int_from_sdio_card){
\r
486 HWTEST_INFO_FUNC("sdio card current register has not valuse!\n");
\r
489 if (copy_to_user((void *)arg, &g_read_int_from_sdio_card, sizeof(g_read_int_from_sdio_card)) < 0) {
\r
490 HWTEST_INFO_FUNC("copy to user space fail!\n");
\r
497 HWTEST_INFO_FUNC("unknown cmd (%d)\n", cmd);
\r
501 HWTEST_INFO_FUNC("retval = (%d)\n",retval);
\r
507 static int HWTEST_open(struct inode *inode, struct file *file)
\r
509 HWTEST_INFO_FUNC("major %d minor %d (pid %d)\n",
\r
515 if (atomic_inc_return(&HWTEST_ref_cnt) == 1) {
\r
516 HWTEST_INFO_FUNC("1st call \n");
\r
522 static int HWTEST_close(struct inode *inode, struct file *file)
\r
524 HWTEST_INFO_FUNC("major %d minor %d (pid %d)\n",
\r
530 if (atomic_dec_return(&HWTEST_ref_cnt) == 0) {
\r
531 HWTEST_INFO_FUNC("last call \n");
\r
538 struct file_operations HWTEST_fops = {
\r
539 .open = HWTEST_open,
\r
540 .release = HWTEST_close,
\r
541 .read = HWTEST_read,
\r
542 .write = HWTEST_write,
\r
543 .unlocked_ioctl = HWTEST_unlocked_ioctl,
\r
544 .poll = HWTEST_poll,
\r
548 static int HWTEST_init(void)
\r
550 dev_t dev = MKDEV(HWTEST_major, 0);
\r
553 /* Prepare a char device */
\r
554 /*static allocate chrdev*/
\r
555 ret = register_chrdev_region(dev, HWTEST_DEV_NUM, HWTEST_DRIVER_NAME);
\r
557 HWTEST_ERR_FUNC("fail to register chrdev\n");
\r
561 cdev_init(&HWTEST_cdev, &HWTEST_fops);
\r
562 HWTEST_cdev.owner = THIS_MODULE;
\r
564 cdev_err = cdev_add(&HWTEST_cdev, dev, HWTEST_DEV_NUM);
\r
566 HWTEST_ERR_FUNC("cdev_add() fails (%d) \n", cdev_err);
\r
570 HWTEST_INFO_FUNC("driver(major %d) installed \n", HWTEST_major);
\r
572 HWTEST_INFO_FUNC("success \n");
\r
577 if (cdev_err == 0) {
\r
578 cdev_del(&HWTEST_cdev);
\r
582 unregister_chrdev_region(dev, HWTEST_DEV_NUM);
\r
586 HWTEST_ERR_FUNC("fail \n");
\r
591 static void HWTEST_exit (void)
\r
593 dev_t dev = MKDEV(HWTEST_major, 0);
\r
594 cdev_del(&HWTEST_cdev);
\r
595 unregister_chrdev_region(dev, HWTEST_DEV_NUM);
\r
598 g_sdio_init_count = 0;
\r
599 HWTEST_INFO_FUNC("done\n");
\r
602 MODULE_LICENSE("GPL");
\r
603 EXPORT_SYMBOL_GPL(g_read_card_info_bysdio);
\r
604 EXPORT_SYMBOL_GPL(g_read_current_io_isready_from_sdio_card);
\r
605 EXPORT_SYMBOL_GPL(g_read_function_blksize_from_sdio_card);
\r
606 EXPORT_SYMBOL_GPL(g_read_int_from_sdio_card);
\r
609 module_init(HWTEST_init);
\r
610 module_exit(HWTEST_exit);
\r