#include <linux/platform_device.h>
#include <linux/mtd/platnand.h>
#include <linux/mtd/mtd.h>
-#include <linux/gpio.h>
#include <linux/gpio/machine.h>
#include <linux/gpio/property.h>
#include <linux/gpio_keys.h>
.num_resources = ARRAY_SIZE(cf_slot0_res),
};
-/* Resources and device for NAND */
-static int rb532_dev_ready(struct nand_chip *chip)
-{
- return gpio_get_value(GPIO_RDY);
-}
-
static void rb532_cmd_ctrl(struct nand_chip *chip, int cmd, unsigned int ctrl)
{
unsigned char orbits, nandbits;
};
static struct platform_nand_data rb532_nand_data = {
- .ctrl.dev_ready = rb532_dev_ready,
.ctrl.cmd_ctrl = rb532_cmd_ctrl,
};
-static struct platform_device nand_slot0 = {
- .name = "gen_nand",
- .id = -1,
- .resource = nand_slot0_res,
- .num_resources = ARRAY_SIZE(nand_slot0_res),
- .dev.platform_data = &rb532_nand_data,
+static const struct property_entry nand0_properties[] = {
+ PROPERTY_ENTRY_GPIO("ready-gpios", &rb532_gpio0_node,
+ GPIO_RDY, GPIO_ACTIVE_HIGH),
+ { }
+};
+
+static const struct platform_device_info nand0_info __initconst = {
+ .name = "gen_nand",
+ .id = PLATFORM_DEVID_NONE,
+ .res = nand_slot0_res,
+ .num_res = ARRAY_SIZE(nand_slot0_res),
+ .data = &rb532_nand_data,
+ .size_data = sizeof(struct platform_nand_data),
+ .properties = nand0_properties,
};
static struct mtd_partition rb532_partition_info[] = {
static struct platform_device *rb532_devs[] = {
&korina_dev0,
- &nand_slot0,
&cf_slot0,
&rb532_led,
&rb532_uart,
*/
software_node_register(&rb532_gpio0_node);
+ pd = platform_device_register_full(&nand0_info);
+ ret = PTR_ERR_OR_ZERO(pd);
+ if (ret) {
+ pr_err("failed to create NAND slot0 device: %d\n", ret);
+ return ret;
+ }
+
pd = platform_device_register_full(&rb532_button_info);
ret = PTR_ERR_OR_ZERO(pd);
if (ret) {
*/
#include <linux/err.h>
+#include <linux/gpio/consumer.h>
#include <linux/io.h>
#include <linux/module.h>
#include <linux/platform_device.h>
struct nand_controller controller;
struct nand_chip chip;
void __iomem *io_base;
+ struct gpio_desc *ready_gpio;
};
static int plat_nand_attach_chip(struct nand_chip *chip)
.attach_chip = plat_nand_attach_chip,
};
+/* Resources and device for NAND */
+static int plat_nand_gpio_dev_ready(struct nand_chip *chip)
+{
+ struct plat_nand_data *data = nand_get_controller_data(chip);
+
+ return gpiod_get_value(data->ready_gpio);
+}
+
/*
* Probe for the NAND device.
*/
struct plat_nand_data *data;
struct mtd_info *mtd;
const char **part_types;
+ struct nand_chip *chip;
int err = 0;
if (!pdata) {
if (!data)
return -ENOMEM;
+ data->ready_gpio = devm_gpiod_get_optional(&pdev->dev, "ready",
+ GPIOD_IN);
+ if (IS_ERR(data->ready_gpio))
+ return dev_err_probe(&pdev->dev, PTR_ERR(data->ready_gpio),
+ "could not get READY GPIO\n");
+
data->controller.ops = &plat_nand_ops;
nand_controller_init(&data->controller);
data->chip.controller = &data->controller;
+ chip = &data->chip;
+ nand_set_controller_data(chip, data);
data->io_base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(data->io_base))
data->chip.legacy.IO_ADDR_R = data->io_base;
data->chip.legacy.IO_ADDR_W = data->io_base;
data->chip.legacy.cmd_ctrl = pdata->ctrl.cmd_ctrl;
- data->chip.legacy.dev_ready = pdata->ctrl.dev_ready;
+ if (data->ready_gpio)
+ data->chip.legacy.dev_ready = plat_nand_gpio_dev_ready;
+ else
+ data->chip.legacy.dev_ready = pdata->ctrl.dev_ready;
data->chip.legacy.select_chip = pdata->ctrl.select_chip;
data->chip.legacy.write_buf = pdata->ctrl.write_buf;
data->chip.legacy.read_buf = pdata->ctrl.read_buf;