From 7a8023a2d735a113a0701a6e84208bebe67c7404 Mon Sep 17 00:00:00 2001 From: Dom Cobley Date: Tue, 1 Oct 2024 13:17:18 +0100 Subject: [PATCH 1/5] Revert "dtoverlays: Add Sense Hat to hat_map" This reverts commit fcbde62fca5bf35c05aa85fb257fae9ccfe7f032. --- arch/arm/boot/dts/overlays/hat_map.dts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/arch/arm/boot/dts/overlays/hat_map.dts b/arch/arm/boot/dts/overlays/hat_map.dts index ae5d9925c5f4ef..cb96b680cb4f7b 100644 --- a/arch/arm/boot/dts/overlays/hat_map.dts +++ b/arch/arm/boot/dts/overlays/hat_map.dts @@ -95,14 +95,4 @@ uuid = [ 1c955808 681f 4bbc a2ef b7ea47cd388e ]; overlay = "recalboxrgbdual"; }; - - sensehat-v1 { - uuid = [ 5d960035 8e87 428f 95d8 59852d697754 ]; - overlay = "rpi-sense"; - }; - - sensehat-v2 { - uuid = [ 1aa9c428 72eb 48da 9306 8c3706ed3653 ]; - overlay = "rpi-sense-v2"; - }; }; From 608987dea790a4d935f7a70dc08588f94e671fa3 Mon Sep 17 00:00:00 2001 From: Dom Cobley Date: Tue, 1 Oct 2024 13:17:19 +0100 Subject: [PATCH 2/5] Revert "Input: sensehat-joystick : Revert to downstream keymap" This reverts commit 7343a026127ad201573a6244221973f1aaa23e10. --- drivers/input/joystick/sensehat-joystick.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/input/joystick/sensehat-joystick.c b/drivers/input/joystick/sensehat-joystick.c index f24beb98e44466..a84df39d3b2fa6 100644 --- a/drivers/input/joystick/sensehat-joystick.c +++ b/drivers/input/joystick/sensehat-joystick.c @@ -28,7 +28,7 @@ struct sensehat_joystick { }; static const unsigned int keymap[] = { - KEY_DOWN, KEY_RIGHT, KEY_UP, KEY_ENTER, KEY_LEFT + BTN_DPAD_DOWN, BTN_DPAD_RIGHT, BTN_DPAD_UP, BTN_SELECT, BTN_DPAD_LEFT, }; static irqreturn_t sensehat_joystick_report(int irq, void *cookie) From c4ca9857b698070881ad19ea4172d7d50df42423 Mon Sep 17 00:00:00 2001 From: Dom Cobley Date: Tue, 1 Oct 2024 13:17:20 +0100 Subject: [PATCH 3/5] Revert "defconfigs: Update to build new SenseHAT joystick driver" This reverts commit 5fb42a374f6f193f9352e075ba00bc30fda6fa09. --- arch/arm/configs/bcm2709_defconfig | 2 +- arch/arm/configs/bcm2711_defconfig | 2 +- arch/arm/configs/bcmrpi_defconfig | 2 +- arch/arm64/configs/bcm2711_defconfig | 2 +- arch/arm64/configs/bcm2712_defconfig | 2 +- arch/arm64/configs/bcmrpi3_defconfig | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/arch/arm/configs/bcm2709_defconfig b/arch/arm/configs/bcm2709_defconfig index 1309ce5f585b3b..91272897294e8e 100644 --- a/arch/arm/configs/bcm2709_defconfig +++ b/arch/arm/configs/bcm2709_defconfig @@ -627,7 +627,7 @@ CONFIG_JOYSTICK_XPAD_LEDS=y CONFIG_JOYSTICK_PSXPAD_SPI=m CONFIG_JOYSTICK_PSXPAD_SPI_FF=y CONFIG_JOYSTICK_FSIA6B=m -CONFIG_JOYSTICK_SENSEHAT=m +CONFIG_JOYSTICK_RPISENSE=m CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCREEN_ADS7846=m CONFIG_TOUCHSCREEN_EGALAX=m diff --git a/arch/arm/configs/bcm2711_defconfig b/arch/arm/configs/bcm2711_defconfig index 8e9cfd07a673e5..2f7c4bb21a4976 100644 --- a/arch/arm/configs/bcm2711_defconfig +++ b/arch/arm/configs/bcm2711_defconfig @@ -645,7 +645,7 @@ CONFIG_JOYSTICK_XPAD_LEDS=y CONFIG_JOYSTICK_PSXPAD_SPI=m CONFIG_JOYSTICK_PSXPAD_SPI_FF=y CONFIG_JOYSTICK_FSIA6B=m -CONFIG_JOYSTICK_SENSEHAT=m +CONFIG_JOYSTICK_RPISENSE=m CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCREEN_ADS7846=m CONFIG_TOUCHSCREEN_EGALAX=m diff --git a/arch/arm/configs/bcmrpi_defconfig b/arch/arm/configs/bcmrpi_defconfig index cc78bd5d187909..b1f646144b9dbd 100644 --- a/arch/arm/configs/bcmrpi_defconfig +++ b/arch/arm/configs/bcmrpi_defconfig @@ -622,7 +622,7 @@ CONFIG_JOYSTICK_XPAD_LEDS=y CONFIG_JOYSTICK_PSXPAD_SPI=m CONFIG_JOYSTICK_PSXPAD_SPI_FF=y CONFIG_JOYSTICK_FSIA6B=m -CONFIG_JOYSTICK_SENSEHAT=m +CONFIG_JOYSTICK_RPISENSE=m CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCREEN_ADS7846=m CONFIG_TOUCHSCREEN_EGALAX=m diff --git a/arch/arm64/configs/bcm2711_defconfig b/arch/arm64/configs/bcm2711_defconfig index 18fef72d0e6ae9..62e788a3d3ebf6 100644 --- a/arch/arm64/configs/bcm2711_defconfig +++ b/arch/arm64/configs/bcm2711_defconfig @@ -663,7 +663,7 @@ CONFIG_JOYSTICK_XPAD_LEDS=y CONFIG_JOYSTICK_PSXPAD_SPI=m CONFIG_JOYSTICK_PSXPAD_SPI_FF=y CONFIG_JOYSTICK_FSIA6B=m -CONFIG_JOYSTICK_SENSEHAT=m +CONFIG_JOYSTICK_RPISENSE=m CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCREEN_ADS7846=m CONFIG_TOUCHSCREEN_EGALAX=m diff --git a/arch/arm64/configs/bcm2712_defconfig b/arch/arm64/configs/bcm2712_defconfig index ae9c57e28ee2a1..2682c3f2832e58 100644 --- a/arch/arm64/configs/bcm2712_defconfig +++ b/arch/arm64/configs/bcm2712_defconfig @@ -666,7 +666,7 @@ CONFIG_JOYSTICK_XPAD_LEDS=y CONFIG_JOYSTICK_PSXPAD_SPI=m CONFIG_JOYSTICK_PSXPAD_SPI_FF=y CONFIG_JOYSTICK_FSIA6B=m -CONFIG_JOYSTICK_SENSEHAT=m +CONFIG_JOYSTICK_RPISENSE=m CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCREEN_ADS7846=m CONFIG_TOUCHSCREEN_EGALAX=m diff --git a/arch/arm64/configs/bcmrpi3_defconfig b/arch/arm64/configs/bcmrpi3_defconfig index aa2ba1a430a1c4..dbda81c8a21a2d 100644 --- a/arch/arm64/configs/bcmrpi3_defconfig +++ b/arch/arm64/configs/bcmrpi3_defconfig @@ -624,7 +624,7 @@ CONFIG_JOYSTICK_XPAD_LEDS=y CONFIG_JOYSTICK_PSXPAD_SPI=m CONFIG_JOYSTICK_PSXPAD_SPI_FF=y CONFIG_JOYSTICK_FSIA6B=m -CONFIG_JOYSTICK_SENSEHAT=m +CONFIG_JOYSTICK_RPISENSE=m CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCREEN_ADS7846=m CONFIG_TOUCHSCREEN_EGALAX=m From 1b81be255024bc9b8dfaccda0559cdab10f40975 Mon Sep 17 00:00:00 2001 From: Dom Cobley Date: Tue, 1 Oct 2024 13:17:21 +0100 Subject: [PATCH 4/5] Revert "drivers: Remove downstream SenseHAT core and joystick drivers" This reverts commit e698db3f4cec8c4d407f8b84e2afbd762c218b66. --- drivers/input/joystick/Kconfig | 8 ++ drivers/input/joystick/Makefile | 1 + drivers/input/joystick/rpisense-js.c | 153 +++++++++++++++++++++ drivers/mfd/Kconfig | 8 ++ drivers/mfd/Makefile | 1 + drivers/mfd/rpisense-core.c | 163 +++++++++++++++++++++++ drivers/video/fbdev/Kconfig | 4 +- drivers/video/fbdev/rpisense-fb.c | 53 ++++---- include/linux/mfd/rpisense/core.h | 47 +++++++ include/linux/mfd/rpisense/framebuffer.h | 5 +- 10 files changed, 411 insertions(+), 32 deletions(-) create mode 100644 drivers/input/joystick/rpisense-js.c create mode 100644 drivers/mfd/rpisense-core.c create mode 100644 include/linux/mfd/rpisense/core.h diff --git a/drivers/input/joystick/Kconfig b/drivers/input/joystick/Kconfig index ac6925ce836670..6e12fd8e4376a6 100644 --- a/drivers/input/joystick/Kconfig +++ b/drivers/input/joystick/Kconfig @@ -412,4 +412,12 @@ config JOYSTICK_SENSEHAT To compile this driver as a module, choose M here: the module will be called sensehat_joystick. +config JOYSTICK_RPISENSE + tristate "Raspberry Pi Sense HAT joystick" + depends on GPIOLIB && INPUT + select MFD_RPISENSE_CORE + + help + This is the joystick driver for the Raspberry Pi Sense HAT + endif diff --git a/drivers/input/joystick/Makefile b/drivers/input/joystick/Makefile index 3937535f00981e..038a76a2513a93 100644 --- a/drivers/input/joystick/Makefile +++ b/drivers/input/joystick/Makefile @@ -40,3 +40,4 @@ obj-$(CONFIG_JOYSTICK_WARRIOR) += warrior.o obj-$(CONFIG_JOYSTICK_WALKERA0701) += walkera0701.o obj-$(CONFIG_JOYSTICK_XPAD) += xpad.o obj-$(CONFIG_JOYSTICK_ZHENHUA) += zhenhua.o +obj-$(CONFIG_JOYSTICK_RPISENSE) += rpisense-js.o diff --git a/drivers/input/joystick/rpisense-js.c b/drivers/input/joystick/rpisense-js.c new file mode 100644 index 00000000000000..6a416769065d21 --- /dev/null +++ b/drivers/input/joystick/rpisense-js.c @@ -0,0 +1,153 @@ +/* + * Raspberry Pi Sense HAT joystick driver + * http://raspberrypi.org + * + * Copyright (C) 2015 Raspberry Pi + * + * Author: Serge Schneider + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + */ + +#include + +#include +#include + +static struct rpisense *rpisense; +static unsigned char keymap[5] = {KEY_DOWN, KEY_RIGHT, KEY_UP, KEY_ENTER, KEY_LEFT,}; + +static void keys_work_fn(struct work_struct *work) +{ + int i; + static s32 prev_keys; + struct rpisense_js *rpisense_js = &rpisense->joystick; + s32 keys = rpisense_reg_read(rpisense, RPISENSE_KEYS); + s32 changes = keys ^ prev_keys; + + prev_keys = keys; + for (i = 0; i < 5; i++) { + if (changes & 1) { + input_report_key(rpisense_js->keys_dev, + keymap[i], keys & 1); + } + changes >>= 1; + keys >>= 1; + } + input_sync(rpisense_js->keys_dev); +} + +static irqreturn_t keys_irq_handler(int irq, void *pdev) +{ + struct rpisense_js *rpisense_js = &rpisense->joystick; + + schedule_work(&rpisense_js->keys_work_s); + return IRQ_HANDLED; +} + +static int rpisense_js_probe(struct platform_device *pdev) +{ + int ret; + int i; + struct rpisense_js *rpisense_js; + + rpisense = rpisense_get_dev(); + rpisense_js = &rpisense->joystick; + + INIT_WORK(&rpisense_js->keys_work_s, keys_work_fn); + + rpisense_js->keys_dev = input_allocate_device(); + if (!rpisense_js->keys_dev) { + dev_err(&pdev->dev, "Could not allocate input device.\n"); + return -ENOMEM; + } + + rpisense_js->keys_dev->evbit[0] = BIT_MASK(EV_KEY); + for (i = 0; i < ARRAY_SIZE(keymap); i++) { + set_bit(keymap[i], + rpisense_js->keys_dev->keybit); + } + + rpisense_js->keys_dev->name = "Raspberry Pi Sense HAT Joystick"; + rpisense_js->keys_dev->phys = "rpi-sense-joy/input0"; + rpisense_js->keys_dev->id.bustype = BUS_I2C; + rpisense_js->keys_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); + rpisense_js->keys_dev->keycode = keymap; + rpisense_js->keys_dev->keycodesize = sizeof(unsigned char); + rpisense_js->keys_dev->keycodemax = ARRAY_SIZE(keymap); + + ret = input_register_device(rpisense_js->keys_dev); + if (ret) { + dev_err(&pdev->dev, "Could not register input device.\n"); + goto err_keys_alloc; + } + + ret = gpiod_direction_input(rpisense_js->keys_desc); + if (ret) { + dev_err(&pdev->dev, "Could not set keys-int direction.\n"); + goto err_keys_reg; + } + + rpisense_js->keys_irq = gpiod_to_irq(rpisense_js->keys_desc); + if (rpisense_js->keys_irq < 0) { + dev_err(&pdev->dev, "Could not determine keys-int IRQ.\n"); + ret = rpisense_js->keys_irq; + goto err_keys_reg; + } + + ret = devm_request_irq(&pdev->dev, rpisense_js->keys_irq, + keys_irq_handler, IRQF_TRIGGER_RISING, + "keys", &pdev->dev); + if (ret) { + dev_err(&pdev->dev, "IRQ request failed.\n"); + goto err_keys_reg; + } + return 0; +err_keys_reg: + input_unregister_device(rpisense_js->keys_dev); +err_keys_alloc: + input_free_device(rpisense_js->keys_dev); + return ret; +} + +static int rpisense_js_remove(struct platform_device *pdev) +{ + struct rpisense_js *rpisense_js = &rpisense->joystick; + + input_unregister_device(rpisense_js->keys_dev); + input_free_device(rpisense_js->keys_dev); + return 0; +} + +#ifdef CONFIG_OF +static const struct of_device_id rpisense_js_id[] = { + { .compatible = "rpi,rpi-sense-js" }, + { }, +}; +MODULE_DEVICE_TABLE(of, rpisense_js_id); +#endif + +static struct platform_device_id rpisense_js_device_id[] = { + { .name = "rpi-sense-js" }, + { }, +}; +MODULE_DEVICE_TABLE(platform, rpisense_js_device_id); + +static struct platform_driver rpisense_js_driver = { + .probe = rpisense_js_probe, + .remove = rpisense_js_remove, + .driver = { + .name = "rpi-sense-js", + .owner = THIS_MODULE, + }, +}; + +module_platform_driver(rpisense_js_driver); + +MODULE_DESCRIPTION("Raspberry Pi Sense HAT joystick driver"); +MODULE_AUTHOR("Serge Schneider "); +MODULE_LICENSE("GPL"); diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig index 9f493334ffdcae..6e37013aa2abd1 100644 --- a/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig @@ -11,6 +11,14 @@ config MFD_CORE select IRQ_DOMAIN default n +config MFD_RPISENSE_CORE + tristate "Raspberry Pi Sense HAT core functions" + depends on I2C + select MFD_CORE + help + This is the core driver for the Raspberry Pi Sense HAT. This provides + the necessary functions to communicate with the hardware. + config MFD_CS5535 tristate "AMD CS5535 and CS5536 southbridge core functions" select MFD_CORE diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile index 1d816d3ef00434..918044a2f1a8f0 100644 --- a/drivers/mfd/Makefile +++ b/drivers/mfd/Makefile @@ -268,6 +268,7 @@ obj-$(CONFIG_MFD_STMFX) += stmfx.o obj-$(CONFIG_MFD_KHADAS_MCU) += khadas-mcu.o obj-$(CONFIG_MFD_ACER_A500_EC) += acer-ec-a500.o obj-$(CONFIG_MFD_QCOM_PM8008) += qcom-pm8008.o +obj-$(CONFIG_MFD_RPISENSE_CORE) += rpisense-core.o obj-$(CONFIG_SGI_MFD_IOC3) += ioc3.o obj-$(CONFIG_MFD_SIMPLE_MFD_I2C) += simple-mfd-i2c.o diff --git a/drivers/mfd/rpisense-core.c b/drivers/mfd/rpisense-core.c new file mode 100644 index 00000000000000..87a319525a0f51 --- /dev/null +++ b/drivers/mfd/rpisense-core.c @@ -0,0 +1,163 @@ +/* + * Raspberry Pi Sense HAT core driver + * http://raspberrypi.org + * + * Copyright (C) 2015 Raspberry Pi + * + * Author: Serge Schneider + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This driver is based on wm8350 implementation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +static struct rpisense *rpisense; + +static void rpisense_client_dev_register(struct rpisense *rpisense, + const char *name, + struct platform_device **pdev) +{ + int ret; + + *pdev = platform_device_alloc(name, -1); + if (*pdev == NULL) { + dev_err(rpisense->dev, "Failed to allocate %s\n", name); + return; + } + + (*pdev)->dev.parent = rpisense->dev; + platform_set_drvdata(*pdev, rpisense); + ret = platform_device_add(*pdev); + if (ret != 0) { + dev_err(rpisense->dev, "Failed to register %s: %d\n", + name, ret); + platform_device_put(*pdev); + *pdev = NULL; + } +} + +static int rpisense_probe(struct i2c_client *i2c) +{ + int ret; + struct rpisense_js *rpisense_js; + + rpisense = devm_kzalloc(&i2c->dev, sizeof(struct rpisense), GFP_KERNEL); + if (rpisense == NULL) + return -ENOMEM; + + i2c_set_clientdata(i2c, rpisense); + rpisense->dev = &i2c->dev; + rpisense->i2c_client = i2c; + + ret = rpisense_reg_read(rpisense, RPISENSE_WAI); + if (ret > 0) { + if (ret != 's') + return -EINVAL; + } else { + return ret; + } + ret = rpisense_reg_read(rpisense, RPISENSE_VER); + if (ret < 0) + return ret; + + dev_info(rpisense->dev, + "Raspberry Pi Sense HAT firmware version %i\n", ret); + + rpisense_js = &rpisense->joystick; + rpisense_js->keys_desc = devm_gpiod_get(&i2c->dev, + "keys-int", GPIOD_IN); + if (IS_ERR(rpisense_js->keys_desc)) { + dev_warn(&i2c->dev, "Failed to get keys-int descriptor.\n"); + rpisense_js->keys_desc = gpio_to_desc(23); + if (rpisense_js->keys_desc == NULL) { + dev_err(&i2c->dev, "GPIO23 fallback failed.\n"); + return PTR_ERR(rpisense_js->keys_desc); + } + } + rpisense_client_dev_register(rpisense, "rpi-sense-js", + &(rpisense->joystick.pdev)); + rpisense_client_dev_register(rpisense, "rpi-sense-fb", + &(rpisense->framebuffer.pdev)); + + return 0; +} + +static void rpisense_remove(struct i2c_client *i2c) +{ + struct rpisense *rpisense = i2c_get_clientdata(i2c); + + platform_device_unregister(rpisense->joystick.pdev); +} + +struct rpisense *rpisense_get_dev(void) +{ + return rpisense; +} +EXPORT_SYMBOL_GPL(rpisense_get_dev); + +s32 rpisense_reg_read(struct rpisense *rpisense, int reg) +{ + int ret = i2c_smbus_read_byte_data(rpisense->i2c_client, reg); + + if (ret < 0) + dev_err(rpisense->dev, "Read from reg %d failed\n", reg); + /* Due to the BCM270x I2C clock stretching bug, some values + * may have MSB set. Clear it to avoid incorrect values. + * */ + return ret & 0x7F; +} +EXPORT_SYMBOL_GPL(rpisense_reg_read); + +int rpisense_block_write(struct rpisense *rpisense, const char *buf, int count) +{ + int ret = i2c_master_send(rpisense->i2c_client, buf, count); + + if (ret < 0) + dev_err(rpisense->dev, "Block write failed\n"); + return ret; +} +EXPORT_SYMBOL_GPL(rpisense_block_write); + +static const struct i2c_device_id rpisense_i2c_id[] = { + { "rpi-sense", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, rpisense_i2c_id); + +#ifdef CONFIG_OF +static const struct of_device_id rpisense_core_id[] = { + { .compatible = "rpi,rpi-sense" }, + { }, +}; +MODULE_DEVICE_TABLE(of, rpisense_core_id); +#endif + + +static struct i2c_driver rpisense_driver = { + .driver = { + .name = "rpi-sense", + .owner = THIS_MODULE, + }, + .probe = rpisense_probe, + .remove = rpisense_remove, + .id_table = rpisense_i2c_id, +}; + +module_i2c_driver(rpisense_driver); + +MODULE_DESCRIPTION("Raspberry Pi Sense HAT core driver"); +MODULE_AUTHOR("Serge Schneider "); +MODULE_LICENSE("GPL"); + diff --git a/drivers/video/fbdev/Kconfig b/drivers/video/fbdev/Kconfig index cf2bd49365fed7..8b5c3ca8f4c944 100644 --- a/drivers/video/fbdev/Kconfig +++ b/drivers/video/fbdev/Kconfig @@ -1967,8 +1967,8 @@ config FB_SM712 config FB_RPISENSE tristate "Raspberry Pi Sense HAT framebuffer" - depends on FB && I2C - select MFD_SIMPLE_MFD_I2C + depends on FB + select MFD_RPISENSE_CORE select FB_SYS_FOPS select FB_SYS_FILLRECT select FB_SYS_COPYAREA diff --git a/drivers/video/fbdev/rpisense-fb.c b/drivers/video/fbdev/rpisense-fb.c index 6db8195b886072..22db39bf0f079b 100644 --- a/drivers/video/fbdev/rpisense-fb.c +++ b/drivers/video/fbdev/rpisense-fb.c @@ -23,14 +23,16 @@ #include #include #include -#include #include +#include static bool lowlight; module_param(lowlight, bool, 0); MODULE_PARM_DESC(lowlight, "Reduce LED matrix brightness to one third"); +static struct rpisense *rpisense; + struct rpisense_fb_param { char __iomem *vmem; u8 *vmem_work; @@ -114,26 +116,26 @@ static void rpisense_fb_imageblit(struct fb_info *info, } static void rpisense_fb_deferred_io(struct fb_info *info, - struct list_head *pagelist) + struct list_head *pagelist) { int i; int j; u8 *vmem_work = rpisense_fb_param.vmem_work; u16 *mem = (u16 *)rpisense_fb_param.vmem; u8 *gamma = rpisense_fb_param.gamma; - struct rpisense_fb *rpisense_fb = info->par; + vmem_work[0] = 0; for (j = 0; j < 8; j++) { for (i = 0; i < 8; i++) { - vmem_work[(j * 24) + i] = + vmem_work[(j * 24) + i + 1] = gamma[(mem[(j * 8) + i] >> 11) & 0x1F]; - vmem_work[(j * 24) + (i + 8)] = + vmem_work[(j * 24) + (i + 8) + 1] = gamma[(mem[(j * 8) + i] >> 6) & 0x1F]; - vmem_work[(j * 24) + (i + 16)] = + vmem_work[(j * 24) + (i + 16) + 1] = gamma[(mem[(j * 8) + i]) & 0x1F]; } } - regmap_bulk_write(rpisense_fb->regmap, 0, vmem_work, 192); + rpisense_block_write(rpisense, vmem_work, 193); } static struct fb_deferred_io rpisense_fb_defio = { @@ -198,22 +200,8 @@ static int rpisense_fb_probe(struct platform_device *pdev) int ret = -ENOMEM; struct rpisense_fb *rpisense_fb; - info = framebuffer_alloc(sizeof(*rpisense_fb), &pdev->dev); - if (!info) { - dev_err(&pdev->dev, "Could not allocate framebuffer.\n"); - goto err_malloc; - } - - rpisense_fb = info->par; - platform_set_drvdata(pdev, rpisense_fb); - - rpisense_fb->pdev = pdev; - rpisense_fb->regmap = dev_get_regmap(pdev->dev.parent, NULL); - if (!rpisense_fb->regmap) { - dev_err(&pdev->dev, - "unable to get sensehat regmap"); - return -ENODEV; - } + rpisense = rpisense_get_dev(); + rpisense_fb = &rpisense->framebuffer; rpisense_fb_param.vmem = vzalloc(rpisense_fb_param.vmemsize); if (!rpisense_fb_param.vmem) @@ -223,6 +211,12 @@ static int rpisense_fb_probe(struct platform_device *pdev) if (!rpisense_fb_param.vmem_work) goto err_malloc; + info = framebuffer_alloc(0, &pdev->dev); + if (!info) { + dev_err(&pdev->dev, "Could not allocate framebuffer.\n"); + goto err_malloc; + } + rpisense_fb->info = info; rpisense_fb_fix.smem_start = (unsigned long)rpisense_fb_param.vmem; rpisense_fb_fix.smem_len = rpisense_fb_param.vmemsize; @@ -259,7 +253,7 @@ static int rpisense_fb_probe(struct platform_device *pdev) static int rpisense_fb_remove(struct platform_device *pdev) { - struct rpisense_fb *rpisense_fb = platform_get_drvdata(pdev); + struct rpisense_fb *rpisense_fb = &rpisense->framebuffer; struct fb_info *info = rpisense_fb->info; if (info) { @@ -272,11 +266,19 @@ static int rpisense_fb_remove(struct platform_device *pdev) return 0; } +#ifdef CONFIG_OF static const struct of_device_id rpisense_fb_id[] = { - { .compatible = "raspberrypi,rpi-sense-fb" }, + { .compatible = "rpi,rpi-sense-fb" }, { }, }; MODULE_DEVICE_TABLE(of, rpisense_fb_id); +#endif + +static struct platform_device_id rpisense_fb_device_id[] = { + { .name = "rpi-sense-fb" }, + { }, +}; +MODULE_DEVICE_TABLE(platform, rpisense_fb_device_id); static struct platform_driver rpisense_fb_driver = { .probe = rpisense_fb_probe, @@ -284,7 +286,6 @@ static struct platform_driver rpisense_fb_driver = { .driver = { .name = "rpi-sense-fb", .owner = THIS_MODULE, - .of_match_table = rpisense_fb_id, }, }; diff --git a/include/linux/mfd/rpisense/core.h b/include/linux/mfd/rpisense/core.h new file mode 100644 index 00000000000000..4856aa3c8b0661 --- /dev/null +++ b/include/linux/mfd/rpisense/core.h @@ -0,0 +1,47 @@ +/* + * Raspberry Pi Sense HAT core driver + * http://raspberrypi.org + * + * Copyright (C) 2015 Raspberry Pi + * + * Author: Serge Schneider + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + */ + +#ifndef __LINUX_MFD_RPISENSE_CORE_H_ +#define __LINUX_MFD_RPISENSE_CORE_H_ + +#include +#include + +/* + * Register values. + */ +#define RPISENSE_FB 0x00 +#define RPISENSE_WAI 0xF0 +#define RPISENSE_VER 0xF1 +#define RPISENSE_KEYS 0xF2 +#define RPISENSE_EE_WP 0xF3 + +#define RPISENSE_ID 's' + +struct rpisense { + struct device *dev; + struct i2c_client *i2c_client; + + /* Client devices */ + struct rpisense_js joystick; + struct rpisense_fb framebuffer; +}; + +struct rpisense *rpisense_get_dev(void); +s32 rpisense_reg_read(struct rpisense *rpisense, int reg); +int rpisense_reg_write(struct rpisense *rpisense, int reg, u16 val); +int rpisense_block_write(struct rpisense *rpisense, const char *buf, int count); + +#endif diff --git a/include/linux/mfd/rpisense/framebuffer.h b/include/linux/mfd/rpisense/framebuffer.h index 621f24386bb0b0..2ba95d7eebaf9c 100644 --- a/include/linux/mfd/rpisense/framebuffer.h +++ b/include/linux/mfd/rpisense/framebuffer.h @@ -16,8 +16,6 @@ #ifndef __LINUX_RPISENSE_FB_H_ #define __LINUX_RPISENSE_FB_H_ -#include - #define SENSEFB_FBIO_IOC_MAGIC 0xF1 #define SENSEFB_FBIOGET_GAMMA _IO(SENSEFB_FBIO_IOC_MAGIC, 0) @@ -27,9 +25,8 @@ struct rpisense; struct rpisense_fb { - struct fb_info *info; struct platform_device *pdev; - struct regmap *regmap; + struct fb_info *info; }; #endif From 676b859d04ca34687a0e3e5bc3153e50362b715a Mon Sep 17 00:00:00 2001 From: Dom Cobley Date: Tue, 1 Oct 2024 13:17:21 +0100 Subject: [PATCH 5/5] Revert "dtoverlays: Convert SenseHAT overlays to use MFD and upstream drivers" This reverts commit a958e15fee3a7b5137e797599858a6d150183a28. --- .../boot/dts/overlays/rpi-sense-overlay.dts | 28 ++----------------- .../dts/overlays/rpi-sense-v2-overlay.dts | 28 ++----------------- 2 files changed, 6 insertions(+), 50 deletions(-) diff --git a/arch/arm/boot/dts/overlays/rpi-sense-overlay.dts b/arch/arm/boot/dts/overlays/rpi-sense-overlay.dts index 32e99b7effc897..89d8d2ea6b2e76 100644 --- a/arch/arm/boot/dts/overlays/rpi-sense-overlay.dts +++ b/arch/arm/boot/dts/overlays/rpi-sense-overlay.dts @@ -12,23 +12,11 @@ #size-cells = <0>; status = "okay"; - sensehat@46 { - compatible = "raspberrypi,sensehat"; + rpi-sense@46 { + compatible = "rpi,rpi-sense"; reg = <0x46>; - interrupt-parent = <&gpio>; + keys-int-gpios = <&gpio 23 1>; status = "okay"; - - display { - compatible = "raspberrypi,rpi-sense-fb"; - status = "okay"; - }; - joystick { - compatible = "raspberrypi,sensehat-joystick"; - interrupts = <23 1>; - pinctrl-names = "default"; - pinctrl-0 = <&sensehat_pins>; - status = "okay"; - }; }; lsm9ds1-magn@1c { @@ -56,14 +44,4 @@ }; }; }; - - fragment@1 { - target = <&gpio>; - __overlay__ { - sensehat_pins: sensehat_pins { - brcm,pins = <23>; - brcm,function = <0>; - }; - }; - }; }; diff --git a/arch/arm/boot/dts/overlays/rpi-sense-v2-overlay.dts b/arch/arm/boot/dts/overlays/rpi-sense-v2-overlay.dts index c4fe97db52fbc7..1b86c032259b0a 100644 --- a/arch/arm/boot/dts/overlays/rpi-sense-v2-overlay.dts +++ b/arch/arm/boot/dts/overlays/rpi-sense-v2-overlay.dts @@ -12,23 +12,11 @@ #size-cells = <0>; status = "okay"; - sensehat@46 { - compatible = "raspberrypi,sensehat"; + rpi-sense@46 { + compatible = "rpi,rpi-sense"; reg = <0x46>; - interrupt-parent = <&gpio>; + keys-int-gpios = <&gpio 23 1>; status = "okay"; - - display { - compatible = "raspberrypi,rpi-sense-fb"; - status = "okay"; - }; - joystick { - compatible = "raspberrypi,sensehat-joystick"; - interrupts = <23 1>; - pinctrl-names = "default"; - pinctrl-0 = <&sensehat_pins>; - status = "okay"; - }; }; lsm9ds1-magn@1c { @@ -56,14 +44,4 @@ }; }; }; - - fragment@1 { - target = <&gpio>; - __overlay__ { - sensehat_pins: sensehat_pins { - brcm,pins = <23>; - brcm,function = <0>; - }; - }; - }; };