Skip to content

Commit e2e01ba

Browse files
committed
Merge branch 'at91-4.9-trunk/ptc' into linux-4.9-at91
2 parents c8c3576 + 2bbed15 commit e2e01ba

1 file changed

Lines changed: 56 additions & 38 deletions

File tree

drivers/input/misc/atmel_ptc.c

Lines changed: 56 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -84,13 +84,22 @@ static char *firmware_file = ATMEL_PPP_FIRMWARE_NAME;
8484
static char *configuration_file = ATMEL_QTM_CONF_NAME;
8585
static 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 */
8898
struct 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

188197
static 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,
283291
static 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)
293300
static 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)
771800
static 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-
818836
out:
819837
release_firmware(fw);
820838
return ret;

0 commit comments

Comments
 (0)