root/drivers/net/dsa/microchip/ksz9477_i2c.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ksz9477_i2c_probe
  2. ksz9477_i2c_remove
  3. ksz9477_i2c_shutdown

   1 // SPDX-License-Identifier: GPL-2.0
   2 /*
   3  * Microchip KSZ9477 series register access through I2C
   4  *
   5  * Copyright (C) 2018-2019 Microchip Technology Inc.
   6  */
   7 
   8 #include <linux/i2c.h>
   9 #include <linux/kernel.h>
  10 #include <linux/module.h>
  11 #include <linux/regmap.h>
  12 
  13 #include "ksz_common.h"
  14 
  15 KSZ_REGMAP_TABLE(ksz9477, not_used, 16, 0, 0);
  16 
  17 static int ksz9477_i2c_probe(struct i2c_client *i2c,
  18                              const struct i2c_device_id *i2c_id)
  19 {
  20         struct regmap_config rc;
  21         struct ksz_device *dev;
  22         int i, ret;
  23 
  24         dev = ksz_switch_alloc(&i2c->dev, i2c);
  25         if (!dev)
  26                 return -ENOMEM;
  27 
  28         for (i = 0; i < ARRAY_SIZE(ksz9477_regmap_config); i++) {
  29                 rc = ksz9477_regmap_config[i];
  30                 rc.lock_arg = &dev->regmap_mutex;
  31                 dev->regmap[i] = devm_regmap_init_i2c(i2c, &rc);
  32                 if (IS_ERR(dev->regmap[i])) {
  33                         ret = PTR_ERR(dev->regmap[i]);
  34                         dev_err(&i2c->dev,
  35                                 "Failed to initialize regmap%i: %d\n",
  36                                 ksz9477_regmap_config[i].val_bits, ret);
  37                         return ret;
  38                 }
  39         }
  40 
  41         if (i2c->dev.platform_data)
  42                 dev->pdata = i2c->dev.platform_data;
  43 
  44         ret = ksz9477_switch_register(dev);
  45 
  46         /* Main DSA driver may not be started yet. */
  47         if (ret)
  48                 return ret;
  49 
  50         i2c_set_clientdata(i2c, dev);
  51 
  52         return 0;
  53 }
  54 
  55 static int ksz9477_i2c_remove(struct i2c_client *i2c)
  56 {
  57         struct ksz_device *dev = i2c_get_clientdata(i2c);
  58 
  59         ksz_switch_remove(dev);
  60 
  61         return 0;
  62 }
  63 
  64 static void ksz9477_i2c_shutdown(struct i2c_client *i2c)
  65 {
  66         struct ksz_device *dev = i2c_get_clientdata(i2c);
  67 
  68         if (dev && dev->dev_ops->shutdown)
  69                 dev->dev_ops->shutdown(dev);
  70 }
  71 
  72 static const struct i2c_device_id ksz9477_i2c_id[] = {
  73         { "ksz9477-switch", 0 },
  74         {},
  75 };
  76 
  77 MODULE_DEVICE_TABLE(i2c, ksz9477_i2c_id);
  78 
  79 static const struct of_device_id ksz9477_dt_ids[] = {
  80         { .compatible = "microchip,ksz9477" },
  81         { .compatible = "microchip,ksz9897" },
  82         { .compatible = "microchip,ksz9567" },
  83         {},
  84 };
  85 MODULE_DEVICE_TABLE(of, ksz9477_dt_ids);
  86 
  87 static struct i2c_driver ksz9477_i2c_driver = {
  88         .driver = {
  89                 .name   = "ksz9477-switch",
  90                 .owner  = THIS_MODULE,
  91                 .of_match_table = of_match_ptr(ksz9477_dt_ids),
  92         },
  93         .probe  = ksz9477_i2c_probe,
  94         .remove = ksz9477_i2c_remove,
  95         .shutdown = ksz9477_i2c_shutdown,
  96         .id_table = ksz9477_i2c_id,
  97 };
  98 
  99 module_i2c_driver(ksz9477_i2c_driver);
 100 
 101 MODULE_AUTHOR("Tristram Ha <Tristram.Ha@microchip.com>");
 102 MODULE_DESCRIPTION("Microchip KSZ9477 Series Switch I2C access Driver");
 103 MODULE_LICENSE("GPL v2");

/* [<][>][^][v][top][bottom][index][help] */