@@ -84,13 +84,22 @@ static char *firmware_file = ATMEL_PPP_FIRMWARE_NAME;
8484static char * configuration_file = ATMEL_QTM_CONF_NAME ;
8585static bool debug_mode ;
8686
87+ struct atmel_qtm_conf_header {
88+ u8 header_version_major ;
89+ u8 header_version_minor ;
90+ u32 header_size ;
91+ char * firmware_version ;
92+ char * tool_version ;
93+ char * date ;
94+ char * description ;
95+ };
96+
8797/* Depends on firmware version */
8898struct atmel_qtm_mailbox_map {
8999 unsigned int cmd_offset ;
90100 unsigned int cmd_id_offset ;
91101 unsigned int cmd_addr_offset ;
92102 unsigned int cmd_data_offset ;
93- unsigned int config_offset ;
94103 unsigned int node_group_config_offset ;
95104 unsigned int node_group_config_count_offset ;
96105 unsigned int node_config_offset ;
@@ -114,27 +123,26 @@ struct atmel_qtm_mailbox_map {
114123 unsigned int touch_events_scroller_event_id ;
115124};
116125
117- static struct atmel_qtm_mailbox_map mailbox_map_v61 = {
126+ static struct atmel_qtm_mailbox_map mailbox_map_v63 = {
118127 .cmd_offset = 0x0 ,
119128 .cmd_id_offset = 0 ,
120129 .cmd_addr_offset = 2 ,
121130 .cmd_data_offset = 4 ,
122- .config_offset = 0x100 ,
123- .node_group_config_offset = 0x0 ,
131+ .node_group_config_offset = 0x100 ,
124132 .node_group_config_count_offset = 0 ,
125133 .node_config_offset = 0x106 ,
126134 .node_config_size = 12 ,
127135 .node_config_mask_x_offset = 0 ,
128136 .node_config_mask_y_offset = 2 ,
129- .scroller_group_config_offset = 0x716 ,
137+ .scroller_group_config_offset = 0x816 ,
130138 .scroller_group_config_count_offset = 2 ,
131- .scroller_config_offset = 0x71a ,
139+ .scroller_config_offset = 0x81a ,
132140 .scroller_config_size = 10 ,
133141 .scroller_config_type_offset = 0 ,
134142 .scroller_config_key_start_offset = 2 ,
135143 .scroller_config_key_count_offset = 4 ,
136144 .scroller_config_resol_deadband_offset = 5 ,
137- .scroller_data_offset = 0x742 ,
145+ .scroller_data_offset = 0x842 ,
138146 .scroller_data_size = 10 ,
139147 .scroller_data_status_offset = 0 ,
140148 .scroller_data_position_offset = 6 ,
@@ -169,6 +177,7 @@ struct atmel_ptc {
169177 struct device * dev ;
170178 struct input_dev * buttons_input ;
171179 struct input_dev * scroller_input [ATMEL_PTC_MAX_SCROLLERS ];
180+ struct atmel_qtm_conf_header conf ;
172181 struct atmel_qtm_mailbox_map * mb_map ;
173182 const struct atmel_ptc_pins * pins ;
174183 bool * x_lines_requested ;
@@ -182,7 +191,7 @@ struct atmel_ptc {
182191 u32 button_event [ATMEL_PTC_MAX_NODES / 32 ];
183192 u32 button_state [ATMEL_PTC_MAX_NODES / 32 ];
184193 u32 scroller_event ;
185- u32 firmware_version ;
194+ char * firmware_version ;
186195};
187196
188197static void atmel_ppp_irq_enable (struct atmel_ptc * ptc , u8 mask )
@@ -261,7 +270,7 @@ static u16 atmel_qtm_get_node_mask_x(struct atmel_ptc *ptc,
261270 unsigned int index )
262271{
263272 void __iomem * addr = ptc -> qtm_mb
264- + ptc -> mb_map -> config_offset
273+ + ptc -> mb_map -> node_config_offset
265274 + ptc -> mb_map -> node_config_size * index
266275 + ptc -> mb_map -> node_config_mask_x_offset ;
267276
@@ -272,7 +281,6 @@ static u32 atmel_qtm_get_node_mask_y(struct atmel_ptc *ptc,
272281 unsigned int index )
273282{
274283 void __iomem * addr = ptc -> qtm_mb
275- + ptc -> mb_map -> config_offset
276284 + ptc -> mb_map -> node_config_offset
277285 + ptc -> mb_map -> node_config_size * index
278286 + ptc -> mb_map -> node_config_mask_y_offset ;
@@ -283,7 +291,6 @@ static u32 atmel_qtm_get_node_mask_y(struct atmel_ptc *ptc,
283291static u16 atmel_qtm_get_key_count (struct atmel_ptc * ptc )
284292{
285293 void __iomem * addr = ptc -> qtm_mb
286- + ptc -> mb_map -> config_offset
287294 + ptc -> mb_map -> node_group_config_offset
288295 + ptc -> mb_map -> node_group_config_count_offset ;
289296
@@ -293,7 +300,6 @@ static u16 atmel_qtm_get_key_count(struct atmel_ptc *ptc)
293300static u8 atmel_qtm_get_scroller_group_config_count (struct atmel_ptc * ptc )
294301{
295302 void __iomem * addr = ptc -> qtm_mb
296- + ptc -> mb_map -> config_offset
297303 + ptc -> mb_map -> scroller_group_config_offset
298304 + ptc -> mb_map -> scroller_group_config_count_offset ;
299305
@@ -304,7 +310,6 @@ static u8 atmel_qtm_get_scroller_type(struct atmel_ptc *ptc,
304310 unsigned int index )
305311{
306312 void __iomem * addr = ptc -> qtm_mb
307- + ptc -> mb_map -> config_offset
308313 + ptc -> mb_map -> scroller_config_offset
309314 + ptc -> mb_map -> scroller_config_size * index
310315 + ptc -> mb_map -> scroller_config_type_offset ;
@@ -316,7 +321,6 @@ static u16 atmel_qtm_get_scroller_key_start(struct atmel_ptc *ptc,
316321 unsigned int index )
317322{
318323 void __iomem * addr = ptc -> qtm_mb
319- + ptc -> mb_map -> config_offset
320324 + ptc -> mb_map -> scroller_config_offset
321325 + ptc -> mb_map -> scroller_config_size * index
322326 + ptc -> mb_map -> scroller_config_key_start_offset ;
@@ -328,7 +332,6 @@ static u8 atmel_qtm_get_scroller_key_count(struct atmel_ptc *ptc,
328332 unsigned int index )
329333{
330334 void __iomem * addr = ptc -> qtm_mb
331- + ptc -> mb_map -> config_offset
332335 + ptc -> mb_map -> scroller_config_offset
333336 + ptc -> mb_map -> scroller_config_size * index
334337 + ptc -> mb_map -> scroller_config_key_count_offset ;
@@ -340,7 +343,6 @@ static u8 atmel_qtm_get_scroller_resolution(struct atmel_ptc *ptc,
340343 unsigned int index )
341344{
342345 void __iomem * addr = ptc -> qtm_mb
343- + ptc -> mb_map -> config_offset
344346 + ptc -> mb_map -> scroller_config_offset
345347 + ptc -> mb_map -> scroller_config_size * index
346348 + ptc -> mb_map -> scroller_config_resol_deadband_offset ;
@@ -352,7 +354,6 @@ static u8 atmel_qtm_get_scroller_status(struct atmel_ptc *ptc,
352354 unsigned int index )
353355{
354356 void __iomem * addr = ptc -> qtm_mb
355- + ptc -> mb_map -> config_offset
356357 + ptc -> mb_map -> scroller_data_offset
357358 + ptc -> mb_map -> scroller_data_size * index
358359 + ptc -> mb_map -> scroller_data_status_offset ;
@@ -364,7 +365,6 @@ static u16 atmel_qtm_get_scroller_position(struct atmel_ptc *ptc,
364365 unsigned int index )
365366{
366367 void __iomem * addr = ptc -> qtm_mb
367- + ptc -> mb_map -> config_offset
368368 + ptc -> mb_map -> scroller_data_offset
369369 + ptc -> mb_map -> scroller_data_size * index
370370 + ptc -> mb_map -> scroller_data_position_offset ;
@@ -514,7 +514,7 @@ static int atmel_ptc_request_pins(struct atmel_ptc *ptc)
514514 u16 mask_x = atmel_qtm_get_node_mask_x (ptc , i );
515515 u32 mask_y = atmel_qtm_get_node_mask_y (ptc , i );
516516
517- for_each_set_bit (j , (unsigned long * )& mask_x , sizeof ( mask_x ) ) {
517+ for_each_set_bit (j , (unsigned long * )& mask_x , 16 ) {
518518 if (ptc -> x_lines_requested [j ])
519519 continue ;
520520
@@ -525,7 +525,7 @@ static int atmel_ptc_request_pins(struct atmel_ptc *ptc)
525525 ptc -> x_lines_requested [j ] = true;
526526 }
527527
528- for_each_set_bit (j , (unsigned long * )& mask_y , sizeof ( mask_y ) ) {
528+ for_each_set_bit (j , (unsigned long * )& mask_y , 32 ) {
529529 if (ptc -> y_lines_requested [j ])
530530 continue ;
531531
@@ -738,6 +738,34 @@ static int atmel_ptc_conf_load(struct atmel_ptc *ptc)
738738 return ret ;
739739 }
740740
741+ ptc -> conf .header_version_major = conf -> data [0 ];
742+ ptc -> conf .header_version_minor = conf -> data [1 ];
743+ switch (ptc -> conf .header_version_major ) {
744+ case (1 ):
745+ ptc -> conf .header_size = 96 ;
746+ ptc -> conf .firmware_version = (char * ) conf -> data + 16 ;
747+ ptc -> conf .tool_version = (char * ) conf -> data + 32 ;
748+ ptc -> conf .date = (char * ) conf -> data + 48 ;
749+ ptc -> conf .description = (char * ) conf -> data + 64 ;
750+ break ;
751+ default :
752+ release_firmware (conf );
753+ dev_err (ptc -> dev , "Unsupported header version: %u.%u\n" ,
754+ ptc -> conf .header_version_major ,
755+ ptc -> conf .header_version_minor );
756+ return - EINVAL ;
757+ };
758+
759+ dev_info (ptc -> dev , "firmware version: %s, tool version: %s\n" ,
760+ ptc -> conf .firmware_version , ptc -> conf .tool_version );
761+ dev_info (ptc -> dev , "date: %s, description: %s\n" ,
762+ ptc -> conf .date , ptc -> conf .description );
763+
764+ /*
765+ * TODO: check the version of the firmware loaded vs the version of the
766+ * firmware needed by the configuration file.
767+ */
768+
741769 atmel_ppp_irq_enable (ptc , ATMEL_PPP_IRQ1 );
742770 atmel_ppp_irq_disable (ptc , ATMEL_PPP_IRQ2 | ATMEL_PPP_IRQ3 );
743771
@@ -746,7 +774,8 @@ static int atmel_ptc_conf_load(struct atmel_ptc *ptc)
746774
747775 dst = (char * )ptc -> qtm_mb ;
748776 /* Need to use _memcpy_toio, otherwise configuration is not well loaded. */
749- _memcpy_toio (dst , conf -> data + 64 , conf -> size - 64 ); /* Header size, cleanup needed. */
777+ _memcpy_toio (dst , conf -> data + ptc -> conf .header_size ,
778+ conf -> size - ptc -> conf .header_size );
750779
751780 key_count = atmel_qtm_get_key_count (ptc );
752781
@@ -771,7 +800,6 @@ static int atmel_ptc_conf_load(struct atmel_ptc *ptc)
771800static int atmel_ptc_fw_load (struct atmel_ptc * ptc )
772801{
773802 const struct firmware * fw ;
774- struct atmel_qtm_cmd cmd ;
775803 int ret ;
776804
777805 dev_dbg (ptc -> dev , "loading firmware: %s\n" , firmware_file );
@@ -781,16 +809,13 @@ static int atmel_ptc_fw_load(struct atmel_ptc *ptc)
781809 return ret ;
782810 }
783811
784- /* TODO */
785- ptc -> firmware_version = 61 ;
786- dev_dbg (ptc -> dev , "firmware version: %u\n" , ptc -> firmware_version );
812+ /* TODO: ptc->firmware_version = */
813+ ptc -> firmware_version = "PPP_VER_6.3" ;
787814
788- switch (ptc -> firmware_version ) {
789- case 61 :
790- ptc -> mb_map = & mailbox_map_v61 ;
791- break ;
792- default :
793- dev_err (ptc -> dev , "unsupported firmware version: %u\n" , ptc -> firmware_version );
815+ if (!strcmp (ptc -> firmware_version , "PPP_VER_6.3" )) {
816+ ptc -> mb_map = & mailbox_map_v63 ;
817+ } else {
818+ dev_err (ptc -> dev , "unsupported firmware version: %s\n" , ptc -> firmware_version );
794819 ret = - EINVAL ;
795820 goto out ;
796821 }
@@ -808,13 +833,6 @@ static int atmel_ptc_fw_load(struct atmel_ptc *ptc)
808833
809834 atmel_ppp_cmd_send (ptc , ATMEL_PPP_CMD_RUN );
810835
811- cmd .id = ATMEL_QTM_CMD_FIRM_VERSION ;
812- atmel_ptc_cmd_send (ptc , & cmd );
813- if (cmd .data != ptc -> firmware_version ) {
814- dev_err (ptc -> dev , "invalid firmware\n" );
815- ret = - EINVAL ;
816- }
817-
818836out :
819837 release_firmware (fw );
820838 return ret ;
0 commit comments