Path: blob/master/arch/powerpc/platforms/512x/pdm360ng.c
26481 views
// SPDX-License-Identifier: GPL-2.0-or-later1/*2* Copyright (C) 2010 DENX Software Engineering3*4* Anatolij Gustschin, <[email protected]>5*6* PDM360NG board setup7*/89#include <linux/device.h>10#include <linux/kernel.h>11#include <linux/io.h>12#include <linux/of.h>13#include <linux/of_address.h>14#include <linux/of_fdt.h>1516#include <asm/machdep.h>17#include <asm/ipic.h>1819#include "mpc512x.h"2021#if defined(CONFIG_TOUCHSCREEN_ADS7846) || \22defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)23#include <linux/interrupt.h>24#include <linux/spi/ads7846.h>25#include <linux/spi/spi.h>26#include <linux/notifier.h>2728static void *pdm360ng_gpio_base;2930static int pdm360ng_get_pendown_state(void)31{32u32 reg;3334reg = in_be32(pdm360ng_gpio_base + 0xc);35if (reg & 0x40)36setbits32(pdm360ng_gpio_base + 0xc, 0x40);3738reg = in_be32(pdm360ng_gpio_base + 0x8);3940/* return 1 if pen is down */41return (reg & 0x40) == 0;42}4344static struct ads7846_platform_data pdm360ng_ads7846_pdata = {45.model = 7845,46.get_pendown_state = pdm360ng_get_pendown_state,47.irq_flags = IRQF_TRIGGER_LOW,48};4950static int __init pdm360ng_penirq_init(void)51{52struct device_node *np;5354np = of_find_compatible_node(NULL, NULL, "fsl,mpc5121-gpio");55if (!np) {56pr_err("%s: Can't find 'mpc5121-gpio' node\n", __func__);57return -ENODEV;58}5960pdm360ng_gpio_base = of_iomap(np, 0);61of_node_put(np);62if (!pdm360ng_gpio_base) {63pr_err("%s: Can't map gpio regs.\n", __func__);64return -ENODEV;65}66out_be32(pdm360ng_gpio_base + 0xc, 0xffffffff);67setbits32(pdm360ng_gpio_base + 0x18, 0x2000);68setbits32(pdm360ng_gpio_base + 0x10, 0x40);6970return 0;71}7273static int pdm360ng_touchscreen_notifier_call(struct notifier_block *nb,74unsigned long event, void *__dev)75{76struct device *dev = __dev;7778if ((event == BUS_NOTIFY_ADD_DEVICE) &&79of_device_is_compatible(dev->of_node, "ti,ads7846")) {80dev->platform_data = &pdm360ng_ads7846_pdata;81return NOTIFY_OK;82}83return NOTIFY_DONE;84}8586static struct notifier_block pdm360ng_touchscreen_nb = {87.notifier_call = pdm360ng_touchscreen_notifier_call,88};8990static void __init pdm360ng_touchscreen_init(void)91{92if (pdm360ng_penirq_init())93return;9495bus_register_notifier(&spi_bus_type, &pdm360ng_touchscreen_nb);96}97#else98static inline void __init pdm360ng_touchscreen_init(void)99{100}101#endif /* CONFIG_TOUCHSCREEN_ADS7846 */102103static void __init pdm360ng_init(void)104{105mpc512x_init();106pdm360ng_touchscreen_init();107}108109static int __init pdm360ng_probe(void)110{111mpc512x_init_early();112113return 1;114}115116define_machine(pdm360ng) {117.name = "PDM360NG",118.compatible = "ifm,pdm360ng",119.probe = pdm360ng_probe,120.setup_arch = mpc512x_setup_arch,121.init = pdm360ng_init,122.init_IRQ = mpc512x_init_IRQ,123.get_irq = ipic_get_irq,124.restart = mpc512x_restart,125};126127128