Lines Matching +full:revision +full:- +full:id1
1 // SPDX-License-Identifier: GPL-2.0
27 /* ------------------------------------------------------------------------ */
30 #define KS8995_REG_ID1 0x01 /* Chip ID1 */
180 /* create_spi_cmd - create a chip specific SPI command header
197 result <<= ks->chip->addr_width + ks->chip->addr_shift; in create_spi_cmd()
199 result |= address << ks->chip->addr_shift; in create_spi_cmd()
203 /* ------------------------------------------------------------------------ */
225 mutex_lock(&ks->lock); in ks8995_read()
226 err = spi_sync(ks->spi, &m); in ks8995_read()
227 mutex_unlock(&ks->lock); in ks8995_read()
253 mutex_lock(&ks->lock); in ks8995_write()
254 err = spi_sync(ks->spi, &m); in ks8995_write()
255 mutex_unlock(&ks->lock); in ks8995_write()
272 /* ------------------------------------------------------------------------ */
321 /* ks8995_get_revision - get chip revision
324 * Verify chip family and id and get chip revision.
329 u8 id0, id1, ksz8864_id; in ks8995_get_revision() local
334 err = -EIO; in ks8995_get_revision()
339 if (id0 != ks->chip->family_id) { in ks8995_get_revision()
340 dev_err(&ks->spi->dev, "chip family id mismatch: expected 0x%02x but 0x%02x read\n", in ks8995_get_revision()
341 ks->chip->family_id, id0); in ks8995_get_revision()
342 err = -ENODEV; in ks8995_get_revision()
346 switch (ks->chip->family_id) { in ks8995_get_revision()
348 /* try reading chip id at CHIP ID1 */ in ks8995_get_revision()
349 err = ks8995_read_reg(ks, KS8995_REG_ID1, &id1); in ks8995_get_revision()
351 err = -EIO; in ks8995_get_revision()
356 if ((get_chip_id(id1) == CHIPID_M) && in ks8995_get_revision()
357 (get_chip_id(id1) == ks->chip->chip_id)) { in ks8995_get_revision()
359 ks->revision_id = get_chip_rev(id1); in ks8995_get_revision()
360 } else if (get_chip_id(id1) != CHIPID_M) { in ks8995_get_revision()
364 err = -EIO; in ks8995_get_revision()
369 (ks->chip->chip_id == KSZ8864_CHIP_ID)) { in ks8995_get_revision()
370 ks->revision_id = get_chip_rev(id1); in ks8995_get_revision()
374 dev_err(&ks->spi->dev, "unsupported chip id for KS8995 family: 0x%02x\n", in ks8995_get_revision()
375 id1); in ks8995_get_revision()
376 err = -ENODEV; in ks8995_get_revision()
380 /* try reading chip id at CHIP ID1 */ in ks8995_get_revision()
381 err = ks8995_read_reg(ks, KS8995_REG_ID1, &id1); in ks8995_get_revision()
383 err = -EIO; in ks8995_get_revision()
387 if (get_chip_id(id1) == ks->chip->chip_id) { in ks8995_get_revision()
388 ks->revision_id = get_chip_rev(id1); in ks8995_get_revision()
390 dev_err(&ks->spi->dev, "unsupported chip id for KSZ8795 family: 0x%02x\n", in ks8995_get_revision()
391 id1); in ks8995_get_revision()
392 err = -ENODEV; in ks8995_get_revision()
396 dev_err(&ks->spi->dev, "unsupported family id: 0x%02x\n", id0); in ks8995_get_revision()
397 err = -ENODEV; in ks8995_get_revision()
404 /* ks8995_parse_dt - setup platform data from devicetree
412 struct device_node *np = ks->spi->dev.of_node; in ks8995_parse_dt()
413 struct ks8995_pdata *pdata = ks->pdata; in ks8995_parse_dt()
418 pdata->reset_gpio = of_get_named_gpio_flags(np, "reset-gpios", 0, in ks8995_parse_dt()
419 &pdata->reset_gpio_flags); in ks8995_parse_dt()
432 /* ------------------------------------------------------------------------ */
437 int variant = spi_get_device_id(spi)->driver_data; in ks8995_probe()
440 dev_err(&spi->dev, "bad chip variant %d\n", variant); in ks8995_probe()
441 return -ENODEV; in ks8995_probe()
444 ks = devm_kzalloc(&spi->dev, sizeof(*ks), GFP_KERNEL); in ks8995_probe()
446 return -ENOMEM; in ks8995_probe()
448 mutex_init(&ks->lock); in ks8995_probe()
449 ks->spi = spi; in ks8995_probe()
450 ks->chip = &ks8995_chip[variant]; in ks8995_probe()
452 if (ks->spi->dev.of_node) { in ks8995_probe()
453 ks->pdata = devm_kzalloc(&spi->dev, sizeof(*ks->pdata), in ks8995_probe()
455 if (!ks->pdata) in ks8995_probe()
456 return -ENOMEM; in ks8995_probe()
458 ks->pdata->reset_gpio = -1; in ks8995_probe()
463 if (!ks->pdata) in ks8995_probe()
464 ks->pdata = spi->dev.platform_data; in ks8995_probe()
466 /* de-assert switch reset */ in ks8995_probe()
467 if (ks->pdata && gpio_is_valid(ks->pdata->reset_gpio)) { in ks8995_probe()
470 flags = (ks->pdata->reset_gpio_flags == OF_GPIO_ACTIVE_LOW ? in ks8995_probe()
473 err = devm_gpio_request_one(&spi->dev, in ks8995_probe()
474 ks->pdata->reset_gpio, in ks8995_probe()
475 flags, "switch-reset"); in ks8995_probe()
477 dev_err(&spi->dev, in ks8995_probe()
478 "failed to get reset-gpios: %d\n", err); in ks8995_probe()
479 return -EIO; in ks8995_probe()
482 gpiod_set_value(gpio_to_desc(ks->pdata->reset_gpio), 0); in ks8995_probe()
487 spi->mode = SPI_MODE_0; in ks8995_probe()
488 spi->bits_per_word = 8; in ks8995_probe()
491 dev_err(&spi->dev, "spi_setup failed, err=%d\n", err); in ks8995_probe()
499 memcpy(&ks->regs_attr, &ks8995_registers_attr, sizeof(ks->regs_attr)); in ks8995_probe()
500 ks->regs_attr.size = ks->chip->regs_size; in ks8995_probe()
506 sysfs_attr_init(&ks->regs_attr.attr); in ks8995_probe()
507 err = sysfs_create_bin_file(&spi->dev.kobj, &ks->regs_attr); in ks8995_probe()
509 dev_err(&spi->dev, "unable to create sysfs file, err=%d\n", in ks8995_probe()
514 dev_info(&spi->dev, "%s device found, Chip ID:%x, Revision:%x\n", in ks8995_probe()
515 ks->chip->name, ks->chip->chip_id, ks->revision_id); in ks8995_probe()
524 sysfs_remove_bin_file(&spi->dev.kobj, &ks->regs_attr); in ks8995_remove()
527 if (ks->pdata && gpio_is_valid(ks->pdata->reset_gpio)) in ks8995_remove()
528 gpiod_set_value(gpio_to_desc(ks->pdata->reset_gpio), 1); in ks8995_remove()
533 /* ------------------------------------------------------------------------ */
536 .name = "spi-ks8995",