Lines Matching defs:kp

85 static int bcm_kp_get_keycode(struct bcm_kp *kp, int row, int col)
87 unsigned int row_shift = get_count_order(kp->n_cols);
88 unsigned short *keymap = kp->input_dev->keycode;
93 static void bcm_kp_report_keys(struct bcm_kp *kp, int reg_num, int pull_mode)
102 writel(0xFFFFFFFF, kp->base + KPICRN_OFFSET(reg_num));
104 state = readl(kp->base + KPSSRN_OFFSET(reg_num));
105 change = kp->last_state[reg_num] ^ state;
106 kp->last_state[reg_num] = state;
114 keycode = bcm_kp_get_keycode(kp, row, col);
115 input_report_key(kp->input_dev, keycode, key_press);
121 struct bcm_kp *kp = dev_id;
122 int pull_mode = (kp->kpcr >> KPCR_MODE_SHIFT) & KPCR_MODE_MASK;
126 bcm_kp_report_keys(kp, reg_num, pull_mode);
128 input_sync(kp->input_dev);
133 static int bcm_kp_start(struct bcm_kp *kp)
137 if (kp->clk) {
138 error = clk_prepare_enable(kp->clk);
143 writel(kp->kpior, kp->base + KPIOR_OFFSET);
145 writel(kp->imr0_val, kp->base + KPIMR0_OFFSET);
146 writel(kp->imr1_val, kp->base + KPIMR1_OFFSET);
148 writel(kp->kpemr, kp->base + KPEMR0_OFFSET);
149 writel(kp->kpemr, kp->base + KPEMR1_OFFSET);
150 writel(kp->kpemr, kp->base + KPEMR2_OFFSET);
151 writel(kp->kpemr, kp->base + KPEMR3_OFFSET);
153 writel(0xFFFFFFFF, kp->base + KPICR0_OFFSET);
154 writel(0xFFFFFFFF, kp->base + KPICR1_OFFSET);
156 kp->last_state[0] = readl(kp->base + KPSSR0_OFFSET);
157 kp->last_state[0] = readl(kp->base + KPSSR1_OFFSET);
159 writel(kp->kpcr | KPCR_ENABLE, kp->base + KPCR_OFFSET);
164 static void bcm_kp_stop(const struct bcm_kp *kp)
168 val = readl(kp->base + KPCR_OFFSET);
170 writel(0, kp->base + KPCR_OFFSET);
171 writel(0, kp->base + KPIMR0_OFFSET);
172 writel(0, kp->base + KPIMR1_OFFSET);
173 writel(0xFFFFFFFF, kp->base + KPICR0_OFFSET);
174 writel(0xFFFFFFFF, kp->base + KPICR1_OFFSET);
176 clk_disable_unprepare(kp->clk);
181 struct bcm_kp *kp = input_get_drvdata(dev);
183 return bcm_kp_start(kp);
188 struct bcm_kp *kp = input_get_drvdata(dev);
190 bcm_kp_stop(kp);
193 static int bcm_kp_matrix_key_parse_dt(struct bcm_kp *kp)
195 struct device *dev = kp->input_dev->dev.parent;
203 kp->kpcr = KPCR_STATUSFILTERENABLE | KPCR_COLFILTERENABLE;
205 error = matrix_keypad_parse_properties(dev, &kp->n_rows, &kp->n_cols);
207 dev_err(dev, "failed to parse kp params\n");
212 kp->kpcr |= (kp->n_rows - 1) << KPCR_ROWWIDTH_SHIFT;
215 kp->kpcr |= (kp->n_cols - 1) << KPCR_COLUMNWIDTH_SHIFT;
224 col_mask = (1 << (kp->n_cols)) - 1;
225 num_rows = kp->n_rows;
228 kp->imr0_val = col_mask;
232 kp->imr0_val |= kp->imr0_val << MAX_COLS;
235 kp->imr1_val = 0;
237 kp->imr1_val = col_mask;
239 kp->imr1_val |= kp->imr1_val << MAX_COLS;
244 kp->kpemr = 0;
246 kp->kpemr |= (KPEMR_EDGETYPE_BOTH << i);
260 kp->kpcr |= dt_val << KPCR_STATUSFILTERTYPE_SHIFT;
274 kp->kpcr |= dt_val << KPCR_COLFILTERTYPE_SHIFT;
285 kp->kpior = ((1 << kp->n_rows) - 1) <<
288 kp->kpior = ((1 << kp->n_cols) - 1) <<
296 kp->kpcr |= KPCR_MODE;
299 kp->n_rows, kp->n_cols,
300 kp->kpcr, kp->kpior, kp->kpemr);
308 struct bcm_kp *kp;
312 kp = devm_kzalloc(&pdev->dev, sizeof(*kp), GFP_KERNEL);
313 if (!kp)
339 input_set_drvdata(input_dev, kp);
341 kp->input_dev = input_dev;
343 error = bcm_kp_matrix_key_parse_dt(kp);
348 kp->n_rows, kp->n_cols,
355 kp->base = devm_platform_ioremap_resource(pdev, 0);
356 if (IS_ERR(kp->base))
357 return PTR_ERR(kp->base);
360 kp->clk = devm_clk_get_optional(&pdev->dev, "peri_clk");
361 if (IS_ERR(kp->clk)) {
362 return dev_err_probe(&pdev->dev, PTR_ERR(kp->clk), "Failed to get clock\n");
363 } else if (!kp->clk) {
374 actual_rate = clk_round_rate(kp->clk, desired_rate);
378 error = clk_set_rate(kp->clk, actual_rate);
382 error = clk_prepare_enable(kp->clk);
387 /* Put the kp into a known sane state */
388 bcm_kp_stop(kp);
390 kp->irq = platform_get_irq(pdev, 0);
391 if (kp->irq < 0)
394 error = devm_request_threaded_irq(&pdev->dev, kp->irq,
396 IRQF_ONESHOT, pdev->name, kp);