1 #include <linux/kernel.h>
\r
2 #include <linux/init.h>
\r
3 #include <linux/platform_device.h>
\r
4 #include <linux/input.h>
\r
5 #include <linux/io.h>
\r
6 #include <linux/delay.h>
\r
7 #include <linux/i2c.h>
\r
8 #include <linux/skbuff.h>
\r
10 #include <mach/board.h>
\r
11 #include <mach/io.h>
\r
12 #include <mach/gpio.h>
\r
13 #include <mach/iomux.h>
\r
15 #include <linux/rk_board_id.h>
\r
17 #define DBG(x...) printk(x)
\r
22 extern void kernel_restart(char *cmd);
\r
24 struct board_id_private_data {
\r
25 struct mutex id_mutex;
\r
28 struct board_id_platform_data *pdata;
\r
31 static struct board_id_private_data *g_id;
\r
34 enum rk_board_id rk_get_board_id(void)
\r
36 struct board_id_private_data *id = g_id;
\r
37 DBG("%s:id:0x%x\n",__func__,id->board_id);
\r
38 return id->board_id;
\r
40 EXPORT_SYMBOL(rk_get_board_id);
\r
42 static int _rk_get_board_id(struct board_id_private_data *id)
\r
45 int value1 = 0, value2 = 0, value3 = 0;
\r
50 for(i=0; i<id->pdata->num_gpio; i++)
\r
52 gpio_request(id->pdata->gpio_pin[i],"gpio_board_id");
\r
53 gpio_direction_input(id->pdata->gpio_pin[i]);
\r
54 gpio_pull_updown(id->pdata->gpio_pin[i], PullDisable);
\r
55 for(j=0; j<1000; j++)
\r
57 value1 = gpio_get_value(id->pdata->gpio_pin[i]);
\r
61 value2 = gpio_get_value(id->pdata->gpio_pin[i]);
\r
65 value3 = gpio_get_value(id->pdata->gpio_pin[i]);
\r
68 if((value1 == value2) && (value2 == value3))
\r
73 printk("%s:hareware error,gpio level changed always!\n");
\r
74 kernel_restart(NULL);
\r
77 result = (value1 << i) | result;
\r
79 DBG("%s:gpio:%d,value:%d\n",__func__,id->pdata->gpio_pin[i],value1);
\r
82 id->board_id = result;
\r
85 DBG("%s:num=%d,id=0x%x\n",__func__,id->pdata->num_gpio, id->board_id);
\r
91 static int __devinit rk_board_id_probe(struct platform_device *pdev)
\r
93 struct board_id_platform_data *pdata = pdev->dev.platform_data;
\r
94 struct board_id_private_data *id = NULL;
\r
100 id = kzalloc(sizeof(struct board_id_private_data), GFP_KERNEL);
\r
102 dev_err(&pdev->dev, "Unable to allocate private data\n");
\r
108 if(pdata->init_platform_hw)
\r
109 pdata->init_platform_hw();
\r
111 result = _rk_get_board_id(id);
\r
113 if(pdata->init_parameter)
\r
114 pdata->init_parameter(id->board_id);
\r
116 if(pdata->exit_platform_hw)
\r
117 pdata->exit_platform_hw();
\r
119 platform_set_drvdata(pdev, id);
\r
122 printk("%s:board id :0x%x\n",__func__,result);
\r
126 static int __devexit rk_board_id_remove(struct platform_device *pdev)
\r
128 //struct board_id_platform_data *pdata = pdev->dev.platform_data;
\r
129 struct board_id_private_data *id = platform_get_drvdata(pdev);
\r
136 static struct platform_driver rk_board_id_driver = {
\r
137 .probe = rk_board_id_probe,
\r
138 .remove = __devexit_p(rk_board_id_remove),
\r
140 .name = "rk-board-id",
\r
141 .owner = THIS_MODULE,
\r
145 static int __init rk_get_board_init(void)
\r
147 return platform_driver_register(&rk_board_id_driver);
\r
150 static void __exit rk_get_board_exit(void)
\r
152 platform_driver_unregister(&rk_board_id_driver);
\r
155 arch_initcall_sync(rk_get_board_init);
\r
156 module_exit(rk_get_board_exit);
\r
158 MODULE_AUTHOR("ROCKCHIP Corporation:lw@rock-chips.com");
\r
159 MODULE_DESCRIPTION("Interface for get board id");
\r
160 MODULE_LICENSE("GPL");
\r